OpenCores
URL https://opencores.org/ocsvn/rf6809/rf6809/trunk

Subversion Repositories rf6809

[/] [rf6809/] [trunk/] [software/] [boot/] [boot_rom.asm] - Blame information for rev 14

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 robfinch
; ============================================================================
2
;        __
3 13 robfinch
;   \\__/ o\    (C) 2013-2022  Robert Finch, Waterloo
4 4 robfinch
;    \  __ /    All rights reserved.
5
;     \/_//     robfinch@opencores.org
6
;       ||
7
;
8
;
9 13 robfinch
; BSD 3-Clause License
10
; Redistribution and use in source and binary forms, with or without
11
; modification, are permitted provided that the following conditions are met:
12
;
13
; 1. Redistributions of source code must retain the above copyright notice, this
14
;    list of conditions and the following disclaimer.
15
;
16
; 2. Redistributions in binary form must reproduce the above copyright notice,
17
;    this list of conditions and the following disclaimer in the documentation
18
;    and/or other materials provided with the distribution.
19
;
20
; 3. Neither the name of the copyright holder nor the names of its
21
;    contributors may be used to endorse or promote products derived from
22
;    this software without specific prior written permission.
23
;
24
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27
; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28
; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30
; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32
; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33
; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 4 robfinch
;
35
; ============================================================================
36
;
37
CR      EQU     $0D             ;ASCII equates
38
LF      EQU     $0A
39
TAB     EQU     $09
40
CTRLC   EQU     $03
41
CTRLH   EQU     $08
42
CTRLI   EQU     $09
43
CTRLJ   EQU     $0A
44
CTRLK   EQU     $0B
45
CTRLM   EQU $0D
46
CTRLS   EQU     $13
47 13 robfinch
CTRLT EQU $14
48 4 robfinch
CTRLX   EQU     $18
49
XON             EQU     $11
50
XOFF    EQU     $13
51
 
52
FIRST_CORE      EQU     1
53
MAX_TASKNO      EQU 63
54
DRAM_BASE       EQU $10000000
55
 
56
ScreenLocation          EQU             $10
57
ColorCodeLocation       EQU             $14
58
ScreenLocation2         EQU             $18
59
BlkcpySrc                       EQU             $1C
60
BlkcpyDst                       EQU             $20
61
Strptr                          EQU             $24
62
PICptr                          EQU             $28
63
; Forth Area
64
; 0x30-0x60
65
 
66
RunningID                       EQU             $800000
67
 
68
; Task control blocks, room for 256 tasks
69
TCB_NxtRdy              EQU             $00     ; next task on ready / timeout list
70
TCB_PrvRdy              EQU             $04     ; previous task on ready / timeout list
71
TCB_NxtTCB              EQU             $08
72
TCB_Timeout             EQU             $0C
73
TCB_Priority    EQU             $10
74
TCB_MSGPTR_D1   EQU             $14
75
TCB_MSGPTR_D2   EQU             $18
76
TCB_hJCB                        EQU             $1C
77
TCB_Status              EQU             $1E
78
TCB_CursorRow   EQU             $20
79
TCB_CursorCol   EQU             $21
80
TCB_hWaitMbx    EQU             $22     ; handle of mailbox task is waiting at
81
TCB_mbq_next    EQU             $24     ; mailbox queue next
82
TCB_mbq_prev    EQU             $28     ; mailbox queue previous
83
TCB_iof_next    EQU             $2C
84
TCB_iof_prev    EQU             $30
85
TCB_SPSave              EQU             $34     ; TCB_SPSave area
86
TCB_mmu_map             EQU             $38
87
 
88
KeybdHead               EQU             $FFFFFC800
89
KeybdTail               EQU             $FFFFFC900
90
KeybdEcho               EQU             $FFFFFCA00
91
KeybdBad                EQU             $FFFFFCB00
92
KeybdAck                EQU             $FFFFFCC00
93
KeybdLocks              EQU             $FFFFFCD00
94
KeybdBuffer             EQU             $FFFFFC000      ; buffer is 16 chars
95
 
96
COREID  EQU             $FFFFFFFE0
97
MSCOUNT EQU             $FFFFFFFE4
98 13 robfinch
LEDS            EQU             $FFFE60001
99
VIA                     EQU             $FFFE60000
100
VIA_PA          EQU             1
101
VIA_DDRA        EQU             3
102
VIA_ACR                 EQU             11
103
VIA_IFR                 EQU             13
104
VIA_IER                 EQU             14
105
VIA_T3LL                EQU             18
106
VIA_T3LH                EQU             19
107
VIA_T3CMPL      EQU             20
108
VIA_T3CMPH      EQU             21
109 4 robfinch
TEXTSCR         EQU             $FFFE00000
110
TEXTREG         EQU             $FFFE0DF00
111
TEXT_COLS       EQU             0
112
TEXT_ROWS       EQU             1
113
TEXT_CURPOS     EQU             34
114 13 robfinch
ACIA            EQU             $FFFE30100
115
ACIA_TX         EQU             0
116
ACIA_RX         EQU             0
117
ACIA_STAT       EQU             1
118
ACIA_CMD        EQU             2
119
ACIA_CTRL       EQU             3
120
ACIA_CTRL2      EQU             11
121
RTC                             EQU             $FFFE30500      ; I2C
122
RTCBuf          EQU             $7FC0
123
 
124 4 robfinch
KEYBD           EQU             $FFFE30400
125
KEYBDCLR        EQU             $FFFE30402
126
PIC                     EQU             $FFFE3F000
127
SPRITE_CTRL             EQU             $FFFE10000
128
SPRITE_EN                       EQU             $3C0
129
 
130 13 robfinch
OUTSEMA EQU     $EF0000
131
SEMAABS EQU     $1000
132
OSSEMA  EQU     $EF0010
133
 
134 4 robfinch
BIOS_SCREENS    EQU     $17000000       ; $17000000 to $171FFFFF
135
 
136
; EhBASIC vars:
137
;
138 13 robfinch
NmiBase         EQU             $FF0013
139
IrqBase         EQU             $FF0014
140 4 robfinch
 
141
IOFocusNdx      EQU             $100
142
 
143 13 robfinch
; These variables in global OS storage area
144
 
145
IOFocusList     EQU             $FF0000 ; to $FF000F
146
IOFocusID               EQU             $FF0010
147
IrqSource               EQU             $FF0011
148
IRQFlag                 EQU             $FF0012
149
 
150 4 robfinch
; These variables use direct page access
151
CursorRow       EQU             $110
152
CursorCol       EQU             $111
153
CharColor       EQU             $112
154
ScreenColor     EQU             $113
155
CursorFlash     EQU             $114
156
KeyState1       EQU     $120
157
KeyState2       EQU     $121
158
KeyLED          EQU     $122
159
KeybdID         EQU     $124
160 13 robfinch
KeybdBlock      EQU     $126
161
kbdHeadRcv      EQU     $127
162
kbdTailRcv      EQU     $128
163
kbdFifo                 EQU     $40                             ; in local RAM
164
kbdFifoAlias    EQU     $C00040 ; to $C0007F    ; alias for $40 to $7F
165
SerhZero                EQU     $130
166
SerHeadRcv      EQU     $131
167
SertZero                EQU     $132
168
SerTailRcv      EQU     $133
169
SerHeadXmit     EQU     $136
170
SerTailXmit     EQU     $138
171
SerRcvXon               EQU     $139
172
SerRcvXoff      EQU     $140
173
SerRcvBuf               EQU     $BFF000 ; 4kB serial recieve buffer
174 4 robfinch
 
175 14 robfinch
farflag EQU             $15F
176 13 robfinch
asmbuf  EQU             $160    ; to $17F
177
 
178 4 robfinch
QNdx0           EQU             $780
179
QNdx1           EQU             QNdx0+2
180
QNdx2           EQU             QNdx1+2
181
QNdx3           EQU             QNdx2+2
182
QNdx4           EQU             QNdx3+2
183
FreeTCB         EQU             QNdx4+2
184
TimeoutList     EQU             FreeTCB+2
185
FreeMbx         EQU             RunningTCB + 2
186
nMailbox        EQU             FreeMbx + 2
187
FreeMsg         EQU             nMailbox + 2
188
nMsgBlk         EQU             FreeMsg + 2
189
 
190
 
191
CharOutVec      EQU             $800
192
CharInVec       EQU             $804
193 13 robfinch
CmdPromptJI     EQU     $808
194 14 robfinch
MonErrVec       EQU             $80C
195 4 robfinch
 
196
; Register save area for monitor
197
mon_DSAVE       EQU             $900
198
mon_XSAVE       EQU             $902
199
mon_YSAVE       EQU             $904
200
mon_USAVE       EQU             $906
201
mon_SSAVE       EQU             $908
202
mon_PCSAVE      EQU             $90A
203
mon_DPRSAVE     EQU             $90E
204
mon_CCRSAVE     EQU             $90F
205
 
206
mon_numwka      EQU             $910
207
mon_r1          EQU             $920
208 13 robfinch
mon_r2          EQU             $924
209 4 robfinch
 
210
; The ORG directive must set an address a multiple of 4 in order for the Verilog
211
; output to work correctly.
212
 
213
        org             $FFD0AC
214
        nop
215
        nop
216
        nop
217
XBLANK
218
        ldb             #' '
219
        lbsr    OUTCH
220
        rts
221
 
222
        org             $FFD0D0
223
        nop
224
        nop
225
CRLF
226
CRLF1:
227
        ldb             #CR
228
        lbsr    OUTCH
229
        ldb             #LF
230
        lbsr    OUTCH
231
        rts
232
 
233
        org             $FFD0F0
234
        nop
235
        bra             CRLF1
236
 
237
        org             $FFD1DC
238
ONEKEY
239
        jmp             [CharInVec]
240
 
241
        org             $FFD2C0
242
        nop
243
LETTER
244
        lbsr    OUTCH
245
        rts
246
 
247
        org             $FFD2CC
248
        nop
249
        nop
250
HEX2
251
        lbsr    DispByteAsHex
252
        rts
253
HEX4
254
        lbsr    DispWordAsHex
255
        rts
256
 
257
        org             $FFD300
258
ClearScreenJmp
259
        lbra    ClearScreen
260
        org             $FFD308
261
HomeCursorJmp
262
        lbra    HomeCursor
263
 
264 13 robfinch
        org             $FFD400
265 4 robfinch
 
266
; Local RAM test routine
267
; Checkerboard testing.
268
; There is 70kB of local RAM
269
; Does not use any RAM including no stack
270
 
271
ramtest:
272
        ldy             #0
273
        lda             #1
274
        sta             LEDS
275
        ldd             #$AAA555
276
ramtest1:
277
        std             ,y++
278 13 robfinch
        cmpy    #$8000
279 4 robfinch
        blo             ramtest1
280
        ; now readback values and compare
281
        ldy             #0
282
ramtest3:
283
        ldd             ,y++
284
        cmpd    #$AAA555
285
        bne             ramerr
286 13 robfinch
        cmpy    #$8000
287 4 robfinch
        blo             ramtest3
288
        lda             #2
289
        sta             LEDS
290
        jmp             ,u
291
ramerr:
292
        lda             #$80
293
        sta             LEDS
294
        ldx             #TEXTSCR
295
        ldb             COREID
296
        abx
297
        lda             #'F'
298
        sta             ,x
299
        sync
300
        jmp             ,u
301
 
302 13 robfinch
        org             $FFE000
303 4 robfinch
        FDB Monitor
304
        FDB DumRts      ;       NEXTCMD
305
        FDB INCH
306
        FDB INCHE
307
        FDB INCHEK
308
        FDB OUTCH
309
        FDB PDATA
310
        FDB PCRLF
311
        FDB PSTRNG
312
        FDB DumRts                      ; LRA
313
        FDB DumRts
314
        FDB DumRts
315
        FDB DumRts
316
        FDB DumRts                      ; VINIZ
317
        FDB DisplayChar ;       VOUTCH
318
        FDB DumRts                      ; ACINIZ
319
        FDB DumRts                      ; AOUTCH
320
 
321
DumRts:
322
        rts
323
 
324
;------------------------------------------------------------------------------
325
;------------------------------------------------------------------------------
326
 
327
start:
328 13 robfinch
        lda             #$FFF                   ; all cores can do this
329
        sta             VIA+VIA_DDRA
330 4 robfinch
        lda             #$55                    ; see if we can at least set LEDs
331
        sta             LEDS
332 13 robfinch
        lda             #1                              ; prime OS semaphore
333
        sta             OSSEMA+$1000
334 4 robfinch
        ldu             #st6                    ; U = return address
335
        jmp             ramtest         ; JMP dont JSR
336
st6:
337 13 robfinch
        lds             #$6FFF          ; boot up stack area
338 4 robfinch
        lda             COREID
339
        cmpa    #FIRST_CORE
340
;       beq             st8
341
;       sync                                            ; halt cores other than 2
342
st8:
343
;       bne             skip_init
344
;       bsr             romToRam
345
;       ldd             #st7 & $FFFF
346
;       tfr             d,x
347
;       jmp             ,x                              ; jump to the BIOS now in local RAM
348
st7:
349
        bsr             Delay3s         ; give some time for devices to reset
350
        lda             #$AA
351
        sta             LEDS
352 13 robfinch
        lda             #FIRST_CORE
353 4 robfinch
        sta             IOFocusID       ; core #2 has focus
354
        sta             RunningID
355 14 robfinch
        ; Clear IO focus list
356
        ldx             #0
357
st9:
358
        clr             IOFocusList,x
359
        inx
360
        cmpx    #16
361
        blo             st9
362
        lda             #24
363
        sta             IOFocusList+FIRST_CORE
364
 
365 4 robfinch
        lda             #$0CE
366
        sta             ScreenColor
367
        sta             CharColor
368
        bsr             ClearScreen
369
        ldd             #DisplayChar
370
        std             CharOutVec
371 13 robfinch
        ldd             #SerialPeekCharDirect
372 4 robfinch
        std             CharInVec
373 13 robfinch
        ldb             #24                             ; request IO focus
374
        lbsr    OSCall
375 4 robfinch
        ldb             COREID
376
        cmpb    #FIRST_CORE
377
        beq             init
378
        bra             skip_init
379
        bra             multi_sieve
380
st3:
381
        lda             #$FF
382
        sta             LEDS
383
        bra             st3
384
 
385
        ; initialize interrupt controller
386
        ; first, zero out all the vectors
387
init:
388 13 robfinch
        lbsr    rtc_read        ; get clock values
389
        ldx             #kbdHeadRcv
390
        ldb             #32                             ; number of bytes to zero out
391
init1:
392
        clr             ,x+
393
        decb
394
        bne             init1
395
        lbsr    TimerInit
396
        lbsr    InitSerial
397 4 robfinch
        ldx             #128
398
        lda             #1                      ; set irq(bit0), clear firq (bit1), disable int (bit 6), clear edge sense(bit 7)
399
        ldb             #FIRST_CORE                     ; serving core id
400
st1:
401 13 robfinch
        clr             PIC,x                   ; cause code
402 4 robfinch
        sta             PIC+1,x
403
        stb             PIC+2,x
404
        leax    4,x
405
        cmpx    #256
406
        blo             st1
407
;       lda             #4                              ; make the timer interrupt edge sensitive
408
;       sta             PIC+4                   ; reg #4 is the edge sensitivity setting
409
;       sta             PIC                             ; reg #0 is interrupt enable
410 13 robfinch
        lda             #$81                    ; make irq edge sensitive
411
        sta             PIC+$FD
412
        lda             #31                             ; enable timer interrupt
413
;       sta             PIC+9
414
        ldb             #1
415
        stb             OUTSEMA+SEMAABS ; set semaphore to 1 available slot
416 4 robfinch
skip_init:
417
        andcc   #$EF                    ; unmask irq
418
        lda             #56
419
        sta             TEXTREG+TEXT_COLS
420
        lda             #29
421
        sta             TEXTREG+TEXT_ROWS
422
        bsr             ClearScreen
423
        bsr             HomeCursor
424
        lda             #5
425
        sta             LEDS
426
        ldd             #msgStartup
427
        bsr             DisplayString
428
        ldx             #0
429
        ldd             #0
430
        lbsr    ShowSprites
431
        lbsr    KeybdInit
432
        ldd             KeybdID
433
        bsr             DispWordAsHex
434
        jmp             MonitorStart
435
 
436
msgStartup
437
        fcb             "rf6809 12-bit System Starting.",CR,LF,0
438
 
439
;------------------------------------------------------------------------------
440
; The checkpoint register must be cleared within 1 second or a NMI interrupt
441
; will occur. checkpoint should be called with a JSR so that the global ROM
442
; routine is called.
443
;
444
; Modifies:
445
;               none
446
;------------------------------------------------------------------------------
447
 
448
checkpoint:
449
        clr             $FFFFFFFE1      ; writing any value will do
450
        rts
451
 
452
;------------------------------------------------------------------------------
453
; Copy the system ROM to local RAM
454
; Running the code from local RAM is probably an order of magnitude faster
455
; then running from the global ROM. It also reduces the network traffic to
456
; run from local RAM.
457
;
458
; Modifies:
459
;               d,x,y
460
;------------------------------------------------------------------------------
461
 
462
romToRam:
463
        ldx             #$FFC000
464
        ldy             #$00C000
465
romToRam1:
466
        ldd             ,x++
467
        std             ,y++
468
        cmpx    #0
469
        bne             romToRam1
470
        rts
471
 
472
;------------------------------------------------------------------------------
473
; Multi-core sieve program.
474
;------------------------------------------------------------------------------
475
 
476
; First fill screen chars with 'P' indicating prime positions
477
; Each core is responsible for the Nth position where N is the
478
; core number minus two.
479
;
480
multi_sieve:
481
        lda             #'P'                                    ; indicate prime
482
        ldb             COREID                          ; find out which core we are
483
        subb    #FIRST_CORE
484
        ldx             #0                                              ; start at first char of screen
485
        abx
486
multi_sieve3:
487
        sta             TEXTSCR,x                       ; store 'P'
488
        leax    8,x                                             ; advance to next position
489
        cmpx    #4095
490
        blo             multi_sieve3
491
        jsr             checkpoint
492
        addb    #2                                              ; start sieve at 2 (core id)
493
        lda             #'N'                                    ; flag position value of 'N' for non-prime
494
multi_sieve2:
495
        ldx             #0
496
        abx                                                                     ; skip the first position - might be prime
497
multi_sieve1:
498
        abx                                                                     ; increment
499
        sta             TEXTSCR,x
500
        cmpx    #4095
501
        blo             multi_sieve1
502
        jsr             checkpoint
503
        addb    #8                                              ; number of cores working on it
504
        cmpb    #4080
505
        blo             multi_sieve2
506
multi_sieve4:                                   ; hang machine
507
        sync
508
        lbra    Monitor
509
 
510 13 robfinch
;------------------------------------------------------------------------------
511
; Single core sieve.
512
;------------------------------------------------------------------------------
513
 
514 4 robfinch
sieve:
515
        lda             #'P'                                    ; indicate prime
516
        ldx             #0                                              ; start at first char of screen
517
sieve3:
518
        sta             TEXTSCR,x                       ; store 'P'
519
        inx                                                                     ; advance to next position
520
        cmpx    #4095
521
        blo             sieve3
522
        ldb             #2                                              ; start sieve at 2
523
        lda             #'N'                                    ; flag position value of 'N' for non-prime
524
sieve2:
525
        ldx             #0
526
        abx                                                                     ; skip the first position - might be prime
527
sieve1:
528
        abx                                                                     ; increment
529
        sta             TEXTSCR,x
530
        cmpx    #4095
531
        blo             multi_sieve1
532
        incb                                                            ; number of cores working on it
533
        cmpb    #4080
534
        blo             sieve2
535
sieve4:                                                         ; hang machine
536 13 robfinch
        rts
537 4 robfinch
 
538
;------------------------------------------------------------------------------
539
; Three second delay for user convenience and to allow some devices time to
540
; reset.
541
;------------------------------------------------------------------------------
542
 
543
Delay3s:
544
        ldd             #9000000
545
dly3s1:
546
        cmpb    #$FF
547
        bne             dly3s2
548
dly3s2:
549
        sta             LEDS
550
        subd    #1
551
        bne             dly3s1
552
        rts
553
 
554
;------------------------------------------------------------------------------
555
;------------------------------------------------------------------------------
556
ShiftLeft5:
557
        aslb
558
        rola
559
        aslb
560
        rola
561
        aslb
562
        rola
563
        aslb
564
        rola
565
        aslb
566
        rola
567
        rts
568
 
569
;------------------------------------------------------------------------------
570 13 robfinch
; Parameters:
571
;               b = core id of core to copy
572 4 robfinch
;------------------------------------------------------------------------------
573
;
574
CopyVirtualScreenToScreen:
575
        pshs    d,x,y,u
576 13 robfinch
        ; Compute virtual screen location for core passed in accb.
577
        tfr             b,a
578
        asla
579
        asla
580
        asla
581
        asla
582
        ora             #$C00
583
        clrb
584 4 robfinch
        tfr             d,x
585 13 robfinch
        pshs    d
586 4 robfinch
        ldy             #TEXTSCR
587
        ldu             #56*29/2
588
cv2s1:
589
        ldd             ,x++
590
        std             ,y++
591
        leau    -1,u
592
        cmpu    #0
593
        bne             cv2s1
594
        ; reset the cursor position in the text controller
595 13 robfinch
        puls    x
596
        ldb             CursorRow,x
597 4 robfinch
        lda             #56
598
        mul
599 13 robfinch
        tfr             d,y
600
        ldb             CursorCol,x
601
        tfr             y,x
602 4 robfinch
        abx
603
        stx             TEXTREG+TEXT_CURPOS
604
        puls    d,x,y,u,pc
605
 
606
;------------------------------------------------------------------------------
607
;------------------------------------------------------------------------------
608
;
609
CopyScreenToVirtualScreen:
610
        pshs    d,x,y,u
611
        bsr             GetScreenLocation
612
        tfr             d,y
613
        ldx             #TEXTSCR
614
        ldu             #56*29/2
615
cs2v1:
616
        ldd             ,x++
617
        std             ,y++
618
        leau    -1,u
619
        cmpu    #0
620
        bne             cs2v1
621
        puls    d,x,y,u,pc
622
 
623
;------------------------------------------------------------------------------
624
;------------------------------------------------------------------------------
625
        fcb             "TEXTSCR "
626
        fcw             TextOpen
627
        fcw             TextClose
628
        fcw             TextRead
629
        fcw             TextWrite
630
        fcw             TextSeek
631
 
632
TextOpen:
633
        rts
634
TextClose:
635
        rts
636
TextRead:
637
        rts
638
TextWrite:
639
        rts
640
TextSeek:
641
        rts
642
 
643
;------------------------------------------------------------------------------
644
; Clear the screen and the screen color memory
645
; We clear the screen to give a visual indication that the system
646
; is working at all.
647
;
648
; Modifies:
649
;               none
650
;------------------------------------------------------------------------------
651
 
652
ClearScreen:
653
        pshs    d,x,y,u
654
        ldx             #56*29
655
        tfr             x,u
656
        bsr             GetScreenLocation
657
        tfr             d,y
658
        ldb             #' '                            ; space char
659
cs1:
660
        stb             ,y+                                     ; set text to space
661
        leax    -1,x                            ; decrement x
662
        bne             cs1
663
        ldb             COREID                  ; update colors only if we have focus
664
        cmpb    IOFocusID
665
        bra             cs3
666
        ldy             #TEXTSCR+$2000
667
;       lda             CharColor
668
        lda             #$0CE
669
        tfr             u,x                                     ; get back count
670
cs2:
671
        sta             ,y+
672 13 robfinch
        dex                                                             ; decrement x
673 4 robfinch
        bne             cs2
674
cs3:
675
        puls    d,x,y,u,pc
676
 
677
;------------------------------------------------------------------------------
678
; Scroll text on the screen upwards
679
;
680
; Modifies:
681
;               none
682
;------------------------------------------------------------------------------
683
 
684
ScrollUp:
685
        pshs    d,x,y,u
686
        ldy             #(56*29-1)/2    ; y = num chars/2 to move
687
        bsr             GetScreenLocation
688
        tfr             d,x
689
        tfr             d,u
690
        leax    56,x                    ; x = index to source row
691
scrup1:
692
        ldd             ,x++                    ; move 2 characters
693
        std             ,u++
694 13 robfinch
        dey
695 4 robfinch
        bne             scrup1
696 13 robfinch
        lda             #29
697 4 robfinch
        bsr             BlankLine
698
        puls    d,x,y,u,pc
699
 
700
;------------------------------------------------------------------------------
701
; Blank out a line on the display
702
;
703
; Modifies:
704
;               none
705
; Parameters:
706
;       acca = line number to blank
707
;------------------------------------------------------------------------------
708
 
709
BlankLine:
710
        pshs    d,x
711
        pshs    a
712
        bsr             GetScreenLocation
713
        tfr             d,x
714
        puls    a
715
        ldb             #56             ; b = # chars to blank out from video controller
716
        mul                                     ; d = screen index (row# * #cols)
717
        leax    d,x
718
        lda             #' '
719
        ldb             #56             ; b = # chars to blank out from video controller
720
blnkln1:
721
        sta             ,x+
722
        decb
723
        bne             blnkln1
724
        puls    d,x,pc
725
 
726
;------------------------------------------------------------------------------
727
; Get the location of the screen memory. The location
728
; depends on whether or not the task has the output focus.
729
;
730
; Modifies:
731
;               d
732
; Retuns:
733
;               d = screen location
734
;------------------------------------------------------------------------------
735
 
736
GetScreenLocation:
737
        lda             COREID                  ; which core are we?
738
        cmpa    IOFocusID               ; do we have the IO focus
739
        bne             gsl1                            ; no, go pick virtual screen address
740
        ldd             #TEXTSCR                ; yes, we update the real screen
741
        rts
742
gsl1:
743
        ldd             #$7800
744
        rts
745
 
746
;------------------------------------------------------------------------------
747
; HomeCursor
748
; Set the cursor location to the top left of the screen.
749
;
750
; Modifies:
751
;               none
752
;------------------------------------------------------------------------------
753
 
754
HomeCursor:
755
        pshs    d,x
756
        clr             CursorRow
757
        clr             CursorCol
758
        ldb             COREID
759
        cmpb    IOFocusID
760
        bne             hc1
761
        clra
762
        sta             TEXTREG+TEXT_CURPOS
763
hc1:
764
        puls    d,x,pc
765
 
766
;------------------------------------------------------------------------------
767
; Update the cursor position in the text controller based on the
768
;  CursorRow,CursorCol.
769
;
770
; Modifies:
771
;               none
772
;------------------------------------------------------------------------------
773
;
774
UpdateCursorPos:
775
        pshs    d,x
776
        ldb             COREID                          ; update cursor position in text controller
777
        cmpb    IOFocusID                       ; only for the task with the output focus
778
        bne             ucp1
779
        lda             CursorRow
780
        anda    #$3F                                    ; limit of 63 rows
781
        ldb             TEXTREG+TEXT_COLS
782
        mul
783
        tfr             d,x
784
        ldb             CursorCol
785
        abx
786
        stx             TEXTREG+TEXT_CURPOS
787
ucp1:
788
        puls    d,x,pc
789
 
790
;------------------------------------------------------------------------------
791
; Calculate screen memory location from CursorRow,CursorCol.
792
; Also refreshes the cursor location.
793
;
794
; Modifies:
795
;               d
796
; Returns:
797
;       d = screen location
798
;------------------------------------------------------------------------------
799
;
800
CalcScreenLoc:
801
        pshs    x
802
        lda             CursorRow
803
        ldb             #56
804
        mul
805
        tfr             d,x
806
        ldb             CursorCol
807
        abx
808
        ldb             COREID                          ; update cursor position in text controller
809
        cmpb    IOFocusID                       ; only for the task with the output focus
810
        bne             csl1
811
        stx             TEXTREG+TEXT_CURPOS
812
csl1:
813
        bsr             GetScreenLocation
814
        leax    d,x
815
        tfr             x,d
816
        puls    x,pc
817
 
818
;------------------------------------------------------------------------------
819
; Display a character on the screen.
820
; If the task doesn't have the I/O focus then the character is written to
821
; the virtual screen.
822
;
823
; Modifies:
824
;               none
825
; Parameters:
826
;       accb = char to display
827
;------------------------------------------------------------------------------
828
;
829
DisplayChar:
830 13 robfinch
        lbsr    SerialPutChar
831 4 robfinch
        pshs    d,x
832
        cmpb    #CR                                     ; carriage return ?
833
        bne             dccr
834
        clr             CursorCol               ; just set cursor column to zero on a CR
835
        bsr             UpdateCursorPos
836
dcx14:
837 13 robfinch
        lbra            dcx4
838 4 robfinch
dccr:
839
        cmpb    #$91                            ; cursor right ?
840
        bne             dcx6
841
        lda             CursorCol
842
        cmpa    #56
843
        bhs             dcx7
844
        inca
845
        sta             CursorCol
846
dcx7:
847
        bsr             UpdateCursorPos
848
        puls    d,x,pc
849
dcx6:
850
        cmpb    #$90                            ; cursor up ?
851
        bne             dcx8
852
        lda             CursorRow
853
        beq             dcx7
854
        deca
855
        sta             CursorRow
856
        bra             dcx7
857
dcx8:
858
        cmpb    #$93                            ; cursor left ?
859
        bne             dcx9
860
        lda             CursorCol
861
        beq             dcx7
862
        deca
863
        sta             CursorCol
864
        bra             dcx7
865
dcx9:
866
        cmpb    #$92                            ; cursor down ?
867
        bne             dcx10
868
        lda             CursorRow
869
        cmpa    #29
870
        beq             dcx7
871
        inca
872
        sta             CursorRow
873
        bra             dcx7
874
dcx10:
875
        cmpb    #$94                            ; cursor home ?
876
        bne             dcx11
877
        lda             CursorCol
878
        beq             dcx12
879
        clr             CursorCol
880
        bra             dcx7
881
dcx12:
882
        clr             CursorRow
883
        bra             dcx7
884
dcx11:
885
        cmpb    #$99                            ; delete ?
886
        bne             dcx13
887
        bsr             CalcScreenLoc
888
        tfr             d,x
889
        lda             CursorCol               ; acc = cursor column
890
        bra             dcx5
891
dcx13
892
        cmpb    #CTRLH                  ; backspace ?
893
        bne             dcx3
894
        lda             CursorCol
895
        beq             dcx4
896
        deca
897
        sta             CursorCol
898
        bsr             CalcScreenLoc
899 13 robfinch
        tfr             d,x
900
        lda             CursorCol
901 4 robfinch
dcx5:
902
        ldb             1,x
903
        stb             ,x++
904
        inca
905
        cmpa    #56
906
        blo             dcx5
907
        ldb             #' '
908 13 robfinch
        dex
909 4 robfinch
        stb             ,x
910 13 robfinch
        bra             dcx4
911 4 robfinch
dcx3:
912
        cmpb    #LF                             ; linefeed ?
913
        beq             dclf
914
        pshs    b
915
        bsr     CalcScreenLoc
916
        tfr             d,x
917
        puls    b
918
        stb             ,x
919
        ; ToDo character color
920
;       lda             CharColor
921
;       sta             $2000,x
922
        bsr             IncCursorPos
923 13 robfinch
        bra             dcx4
924 4 robfinch
dclf:
925
        bsr             IncCursorRow
926
dcx4:
927
        puls    d,x,pc
928
 
929
;------------------------------------------------------------------------------
930
; Increment the cursor position, scroll the screen if needed.
931
;
932
; Modifies:
933
;               none
934
;------------------------------------------------------------------------------
935
 
936
IncCursorPos:
937
        pshs    d,x
938
        lda             CursorCol
939
        inca
940
        sta             CursorCol
941
        cmpa    #56
942
        blo             icc1
943
        clr             CursorCol               ; column = 0
944
        bra             icr1
945
IncCursorRow:
946
        pshs    d,x
947
icr1:
948
        lda             CursorRow
949
        inca
950
        sta             CursorRow
951
        cmpa    #29
952
        blo             icc1
953
        deca                                                    ; backup the cursor row, we are scrolling up
954
        sta             CursorRow
955
        bsr             ScrollUp
956
icc1:
957
        bsr             UpdateCursorPos
958
icc2:
959
        puls    d,x,pc
960
 
961
;------------------------------------------------------------------------------
962
; Display a string on the screen.
963
;
964
; Modifies:
965
;               none
966
; Parameters:
967
;               d = pointer to string
968
;------------------------------------------------------------------------------
969
;
970
DisplayString:
971
        pshs    d,x
972
        tfr             d,x
973 13 robfinch
dspj2:                                          ; lock semaphore for access
974
        lda             OUTSEMA+1
975
        beq             dspj2
976 4 robfinch
dspj1B:
977
        ldb             ,x+                             ; move string char into acc
978
        beq             dsretB          ; is it end of string ?
979 13 robfinch
        lbsr    OUTCH                   ; display character
980 4 robfinch
        bra             dspj1B
981
dsretB:
982 13 robfinch
        clr             OUTSEMA+1       ; unlock semaphore
983 4 robfinch
        puls    d,x,pc
984
 
985
DisplayStringCRLF:
986
        pshs    d
987
        bsr             DisplayString
988
        ldb             #CR
989 13 robfinch
        lbsr    OUTCH
990 4 robfinch
        ldb             #LF
991 13 robfinch
        lbsr    OUTCH
992 4 robfinch
        puls    d,pc
993
 
994
;
995
; PRINT CR, LF, STRING
996
;
997
PSTRNG
998
        BSR             PCRLF
999
        BRA             PDATA
1000
PCRLF
1001
        PSHS    X
1002
        LDX             #CRLFST
1003
        BSR             PDATA
1004
        PULS    X
1005
        RTS
1006
 
1007
PRINT
1008
        JSR             OUTCH
1009
PDATA
1010
        LDB             ,X+
1011
        CMPB    #$04
1012
        BNE             PRINT
1013
        RTS
1014
 
1015
CRLFST
1016
        fcb     CR,LF,4
1017
 
1018
DispDWordAsHex:
1019
        bsr             DispWordAsHex
1020
        exg             d,x
1021
        bsr             DispWordAsHex
1022
        exg             d,x
1023
        rts
1024
 
1025
DispWordAsHex:
1026
        exg             a,b
1027
        bsr             DispByteAsHex
1028
        exg             a,b
1029
        bsr             DispByteAsHex
1030
        rts
1031
 
1032
DispByteAsHex:
1033
  pshs  b
1034
        lsrb
1035
        lsrb
1036
        lsrb
1037
        lsrb
1038
        lsrb
1039
        lsrb
1040
        lsrb
1041
        lsrb
1042
        bsr             DispNyb
1043
        puls    b
1044
        pshs    b
1045
        lsrb
1046
        lsrb
1047
        lsrb
1048
        lsrb
1049
        bsr             DispNyb
1050
        puls    b
1051
 
1052
DispNyb
1053
        pshs    b
1054
        andb    #$0F
1055
        cmpb    #10
1056
        blo             DispNyb1
1057
        addb    #'A'-10
1058 13 robfinch
        lbsr    OUTCH
1059 4 robfinch
        puls    b,pc
1060
DispNyb1
1061
        addb    #'0'
1062 13 robfinch
        lbsr    OUTCH
1063 4 robfinch
        puls    b,pc
1064
 
1065
;==============================================================================
1066 13 robfinch
; Timer
1067
;==============================================================================
1068
 
1069
OPT INCLUDE "d:\cores2022\rf6809\software\boot\timer.asm"
1070
OPT INCLUDE "d:\cores2022\rf6809\software\boot\i2c.asm"
1071
OPT INCLUDE "d:\cores2022\rf6809\software\boot\rtc_driver.asm"
1072
 
1073
;==============================================================================
1074 4 robfinch
; Keyboard I/O
1075
;==============================================================================
1076
 
1077
OPT INCLUDE "d:\cores2022\rf6809\software\boot\scancodes.asm"
1078
OPT INCLUDE "d:\cores2022\rf6809\software\boot\keyboard.asm"
1079
 
1080
        fcb             "KEYBOARD"
1081
        fcw             KeybdOpen
1082
        fcw             KeybdClose
1083
        fcw             KeybdRead
1084
        fcw             KeybdWrite
1085
        fcw             KeybdSeek
1086
 
1087
; Keyboard Open:
1088
; Initialize the keyboard buffer head and tail indexes
1089
;
1090
KeybdOpen:
1091
        rts
1092
 
1093
; Keyboard Close:
1094
; Nothing to do except maybe clear the keyboard buffer
1095
;
1096
KeybdClose:
1097
        rts
1098
;
1099
KeybdRead:
1100
        rts
1101
;
1102
KeybdWrite:
1103
        rts
1104
 
1105
KeybdSeek:
1106
        rts
1107
 
1108 13 robfinch
;==============================================================================
1109
; Serial I/O
1110
;==============================================================================
1111
 
1112
OPT INCLUDE "d:\cores2022\rf6809\software\boot\serial.asm"
1113
 
1114 4 robfinch
;------------------------------------------------------------------------------
1115
; Check if there is a keyboard character available. If so return true (<0)
1116
; otherwise return false (0) in accb.
1117
;------------------------------------------------------------------------------
1118
;
1119
KeybdCheckForKeyDirect:
1120
        bra             DBGCheckForKey
1121
 
1122
;------------------------------------------------------------------------------
1123
;------------------------------------------------------------------------------
1124
INCH:
1125 13 robfinch
        pshs    b
1126
INCH2:
1127
        ldb             COREID
1128
        cmpb    IOFocusID       ; if we do not have focus, block
1129
        bne             INCH2
1130
;       ldb             #$800                   ; block if no key available, get scancode directly
1131
;       bra             GetKey
1132
;       jsr             [CharInVec]     ; vector is being overwritten somehow
1133
        lbsr    SerialPeekCharDirect
1134
        tsta
1135
        bmi             INCH1                   ; block if no key available
1136
        leas    1,s                             ; get rid of blocking status
1137
        rts
1138
INCH1:
1139
        puls    b                                       ; check blocking status
1140
        tstb
1141
        bmi     INCH                    ; if blocking, loop
1142
        ldd             #-1                             ; return -1 if no char available
1143
        rts
1144 4 robfinch
 
1145
INCHE:
1146
        bsr             INCH
1147
        bra             INCHEK3
1148
 
1149
INCHEK:
1150
        bsr             INCH
1151
        tst             KeybdEcho
1152
        beq             INCHEK1
1153
INCHEK3:
1154
        cmpa    #CR
1155
        bne             INCHEK2
1156
        lbsr            CRLF
1157
        bra             INCHEK1
1158
INCHEK2:
1159 13 robfinch
        lbsr    DisplayChar
1160 4 robfinch
INCHEK1:
1161
        rts
1162
 
1163
OUTCH:
1164
        jmp             [CharOutVec]
1165
 
1166
;------------------------------------------------------------------------------
1167
; r1 0=echo off, non-zero = echo on
1168
;------------------------------------------------------------------------------
1169
;
1170
SetKeyboardEcho:
1171
        stb             KeybdEcho
1172
        rts
1173
 
1174
 
1175
;------------------------------------------------------------------------------
1176
; Parameters:
1177
;               x,d     bitmap of sprites to enable
1178
;------------------------------------------------------------------------------
1179
 
1180
ShowSprites:
1181
        stx             SPRITE_CTRL+SPRITE_EN
1182
        std             SPRITE_CTRL+SPRITE_EN+2
1183
        rts
1184
 
1185
;==============================================================================
1186 13 robfinch
; Femtiki Operating System.
1187
;==============================================================================
1188
 
1189
OSCallTbl:
1190
        fcw             0
1191
        fcw             0
1192
        fcw             0
1193
        fcw             0
1194
        fcw             0
1195
        fcw             0
1196
        fcw             0
1197
        fcw             0
1198
        fcw             0
1199
        fcw             0
1200
        fcw             0
1201
        fcw             0
1202
        fcw             0
1203
        fcw             0
1204
        fcw             0
1205
        fcw             0
1206
        fcw             0
1207
        fcw             0
1208
        fcw             0
1209
        fcw             0
1210
        fcw             0
1211
        fcw             0
1212
        fcw             ReleaseIOFocus
1213
        fcw             0
1214
        fcw             RequestIOFocus
1215
 
1216
OSCall:
1217
        ; wait for availability
1218
osc1:
1219
        tst             OSSEMA+1
1220
        beq             osc1
1221
        aslb
1222
        ldx             #OSCallTbl
1223
        abx
1224
        tst             ,x
1225
        beq             oscx
1226
        jmp             [,x]
1227
oscx:
1228
        clr             OSSEMA+1
1229
        rts
1230
 
1231
RequestIOFocus:
1232
        ldb             COREID
1233
        ldx             #IOFocusList
1234
        abx
1235
        sta             ,x
1236
        tst             IOFocusID
1237
        lbne    oscx
1238
        stb             IOFocusID
1239
        lbra    oscx
1240
 
1241
ReleaseIOFocus:
1242
        ldb             COREID
1243
        ldx             #IOFocusList
1244
        abx
1245
        clr             ,x                                              ; clear the request indicator
1246
        lbsr    CopyScreenToVirtualScreen
1247
        cmpb    IOFocusID                       ; are we the one with the focus?
1248
        lbne    oscx
1249
        ; We had the focus, so now a new core needs the focus.
1250
        ; Search the focus list for a requestor. If no requester
1251
        ; is found, give focus to core #1.
1252
        lda             #15
1253
riof2:
1254
        incb
1255
        andb    #15
1256
        abx
1257
        tst             ,x
1258
        bne             riof1
1259
        deca
1260
        bne             riof2
1261
        ; If no focus is requested by anyone, give to core #1
1262
        ldb             #1
1263
        lda             #24
1264
        sta             ,x
1265
riof1:
1266
        stb             IOFocusID
1267
        lbsr    CopyVirtualScreenToScreen
1268
        lbra    oscx
1269
 
1270
 
1271
;==============================================================================
1272
; Disassembler
1273
;==============================================================================
1274
 
1275
OPT     include "d:\cores2022\rf6809\software\boot\disassem.asm"
1276
 
1277
;==============================================================================
1278 4 robfinch
; System Monitor
1279
;==============================================================================
1280 13 robfinch
 
1281
CmdPrompt:
1282
        lbsr    CRLF
1283
        ldb             #'$'
1284
        lbsr    OUTCH
1285
        lbra    OUTCH
1286
 
1287
msgF09Starting:
1288
        fcb             "Femtiki F09 Multi-core OS Starting",CR,LF,0
1289
 
1290 4 robfinch
MonitorStart:
1291 13 robfinch
        ldd             #msgF09Starting
1292
        lbsr    DisplayString
1293 4 robfinch
        ldd             #HelpMsg
1294 13 robfinch
        lbsr    DisplayString
1295
        ldd             #CmdPrompt
1296
        std             CmdPromptJI
1297 14 robfinch
        ldd             #DisplayErr
1298
        std             MonErrVec
1299
        ldd             #$63FF                  ; default app stack
1300
        std             mon_SSAVE
1301 4 robfinch
Monitor:
1302 13 robfinch
        leas    $6FFF                           ; reset stack pointer
1303 4 robfinch
        clrb                                                    ; turn off keyboard echo
1304 13 robfinch
        lbsr    SetKeyboardEcho
1305
        ; Reset IO vectors
1306
        ldd             #SerialPeekCharDirect
1307
        std             CharInVec
1308
        ldd             #DisplayChar
1309
        std             CharOutVec
1310
        ldd             #CmdPrompt
1311
        std             CmdPromptJI
1312 4 robfinch
;       jsr             RequestIOFocus
1313
PromptLn:
1314 13 robfinch
        jsr             [CmdPromptJI]
1315 4 robfinch
 
1316
; Get characters until a CR is keyed
1317
 
1318
Prompt3:
1319
        ldd             #-1                                     ; block until key present
1320 13 robfinch
        lbsr    INCH
1321 4 robfinch
        cmpb    #CR
1322
        beq             Prompt1
1323 13 robfinch
        lbsr    OUTCH
1324 4 robfinch
        bra             Prompt3
1325
 
1326
; Process the screen line that the CR was keyed on
1327
;
1328
Prompt1:
1329
        ldd             #$5050
1330
        std             LEDS
1331 13 robfinch
;       ldb             RunningID
1332
;       cmpb    #61
1333
;       bhi             Prompt3
1334 4 robfinch
        ldd             #$5151
1335
        std             LEDS
1336
        clr             CursorCol                       ; go back to the start of the line
1337 13 robfinch
        lbsr    CalcScreenLoc   ; calc screen memory location
1338 4 robfinch
        tfr             d,y
1339
        ldd             #$5252
1340
        std             LEDS
1341 13 robfinch
skipDollar:
1342 4 robfinch
        bsr             MonGetNonSpace
1343
        cmpb    #'$'
1344 13 robfinch
        beq             skipDollar              ; skip over '$' prompt character
1345 4 robfinch
        lda             #$5353
1346
        std             LEDS
1347
 
1348
; Dispatch based on command character
1349
;
1350
Prompt2:
1351 13 robfinch
        cmpb    #'<'
1352
        bne             PromptHelp
1353
        bsr             MonGetch
1354
        cmpb    #'>'
1355
        bne             Monitor
1356
        bsr             MonGetch
1357
        cmpb    #'s'
1358
        bne             Prompt2a
1359
        ldd             #SerialPeekCharDirect
1360
        std             CharInVec
1361
        ldd             #SerialPutChar
1362
        std             CharOutVec
1363
        bra             Monitor
1364
Prompt2a:
1365
        cmpb    #'c'
1366
        bne             Monitor
1367
        ldd             #GetKey
1368
        std             CharInVec
1369
        ldd             #DisplayChar
1370
        std             CharOutVec
1371
        bra             Monitor
1372
PromptHelp:
1373 4 robfinch
        cmpb    #'?'                    ; $? - display help
1374
        bne             PromptC
1375
        ldd             #HelpMsg
1376 13 robfinch
        lbsr    DisplayString
1377 4 robfinch
        bra             Monitor
1378
PromptC:
1379
        cmpb    #'C'
1380
        bne             PromptD
1381 13 robfinch
        lbsr    ClearScreen
1382
        lbsr    HomeCursor
1383 4 robfinch
        bra             Monitor
1384
PromptD:
1385
        cmpb    #'D'
1386 14 robfinch
        bne             PromptColon
1387 4 robfinch
        bsr             MonGetch
1388
        cmpb    #'R'
1389 13 robfinch
        bne             DumpMemory
1390 4 robfinch
        bra             DumpRegs
1391 14 robfinch
PromptColon:
1392
        cmpb    #':'
1393
        bne             PromptF
1394
        lbra    EditMemory
1395 4 robfinch
PromptF:
1396
        cmpb    #'F'
1397
        bne             PromptJ
1398
        bsr             MonGetch
1399
        cmpb    #'I'
1400 14 robfinch
        bne             PromptFL
1401 4 robfinch
        bsr             MonGetch
1402
        cmpb    #'G'
1403
        bne             Monitor
1404
        jmp             $FE0000
1405 14 robfinch
PromptFL:
1406
        cmpb    #'L'
1407
        bne             Monitor
1408
        lbra    DumpIOFocusList
1409 4 robfinch
PromptJ:
1410
        cmpb    #'J'
1411
        lbeq    jump_to_code
1412
PromptR:
1413
        cmpb    #'R'
1414 13 robfinch
        bne             Prompt_s
1415
        ldu             #Monitor
1416
        lbra    ramtest
1417
Prompt_s:
1418
        cmpb    #'s'
1419
        bne             PromptT
1420
        lbsr    SerialOutputTest
1421
        bra             Monitor
1422
PromptT:
1423
        cmpb    #'T'
1424
        bne             PromptU
1425
        bsr             MonGetch
1426
        cmpb    #'I'
1427 4 robfinch
        bne             Monitor
1428 13 robfinch
        bsr             MonGetch
1429
        cmpb    #'R'
1430
        bne             Monitor
1431
        lbsr    rtc_read
1432 4 robfinch
        bra             Monitor
1433 13 robfinch
PromptU:
1434
        cmpb    #'U'
1435
        bne             Monitor
1436
        lbra    disassem
1437 4 robfinch
 
1438
MonGetch:
1439
        ldb             ,y
1440 13 robfinch
        iny
1441 4 robfinch
        rts
1442
 
1443
MonGetNonSpace:
1444
        bsr             MonGetCh
1445
        cmpb    #' '
1446
        beq             MonGetNonSpace
1447
        rts
1448
 
1449
;------------------------------------------------------------------------------
1450
; Ignore blanks in the input
1451
; Y = text pointer
1452
; D destroyed
1453
;------------------------------------------------------------------------------
1454
;
1455
ignBlanks:
1456
ignBlanks1:
1457
        bsr             MonGetch
1458
        cmpb    #' '
1459
        beq             ignBlanks1
1460 13 robfinch
        dey
1461 4 robfinch
        rts
1462
 
1463
;------------------------------------------------------------------------------
1464
;------------------------------------------------------------------------------
1465
GetTwoParams:
1466
        bsr             ignBlanks
1467
        bsr             GetHexNumber    ; get start address of dump
1468
        ldd             mon_numwka
1469
        std             mon_r1
1470
        ldd             mon_numwka+2
1471
        std             mon_r1+2
1472
        bsr             ignBlanks
1473
        bsr             GetHexNumber    ; get end address of dump
1474
        ldd             mon_numwka
1475
        std             mon_r2
1476
        ldd             mon_numwka+2
1477
        std             mon_r2+2
1478
        rts
1479
 
1480
;------------------------------------------------------------------------------
1481
; Get a range, the end must be greater or equal to the start.
1482
;------------------------------------------------------------------------------
1483
GetRange:
1484
        bsr             GetTwoParams
1485
        ldd             mon_r2+2
1486
        subd    mon_r1+2
1487
        ldd             mon_r2
1488
        sbcb    mon_r1+1
1489
        sbca    mon_r1
1490 14 robfinch
        lbcc    grng1
1491
        jsr             [MonErrVec]
1492
        lbra    Monitor
1493
grng1:
1494 4 robfinch
        rts
1495
 
1496
shl_numwka:
1497
        asl             mon_numwka+3
1498
        rol             mon_numwka+2
1499
        rol             mon_numwka+1
1500
        rol             mon_numwka
1501
        rts
1502
 
1503
;------------------------------------------------------------------------------
1504 13 robfinch
; Get a hexidecimal number. Maximum of twelve digits.
1505
;
1506
; Modifies:
1507
;       Y = text pointer (updated)
1508
;       D = number of digits
1509
;       mon_numwka contains number
1510 4 robfinch
;------------------------------------------------------------------------------
1511
;
1512
GetHexNumber:
1513
        clrd
1514 13 robfinch
        std             mon_numwka      ; zero out work area
1515 4 robfinch
        std             mon_numwka+2
1516
        pshs    x
1517 13 robfinch
        ldx             #0                                      ; max 12 eight digits
1518 4 robfinch
gthxn2:
1519
        bsr             MonGetch
1520
        bsr             AsciiToHexNybble
1521
        cmpb    #-1
1522
        beq             gthxn1
1523
        bsr             shl_numwka
1524
        bsr             shl_numwka
1525
        bsr             shl_numwka
1526
        bsr             shl_numwka
1527
        andb    #$0f
1528
        orb             mon_numwka+3
1529
        stb             mon_numwka+3
1530
        inx
1531 13 robfinch
        cmpx    #12
1532 4 robfinch
        blo             gthxn2
1533
gthxn1:
1534
        tfr             x,d
1535
        puls    x,pc
1536
 
1537
;GetDecNumber:
1538
;       phx
1539
;       push    r4
1540
;       push    r5
1541
;       ldx             #0
1542
;       ld              r4,#10
1543
;       ld              r5,#10
1544
;gtdcn2:
1545
;       jsr             MonGetch
1546
;       jsr             AsciiToDecNybble
1547
;       cmp             #-1
1548
;       beq             gtdcn1
1549
;       mul             r2,r2,r5
1550
;       add             r2,r1
1551
;       dec             r4
1552
;       bne             gtdcn2
1553
;gtdcn1:
1554
;       txa
1555
;       pop             r5
1556
;       pop             r4
1557
;       plx
1558
;       rts
1559
 
1560
;------------------------------------------------------------------------------
1561
; Convert ASCII character in the range '0' to '9', 'a' to 'f' or 'A' to 'F'
1562
; to a hex nybble.
1563
;------------------------------------------------------------------------------
1564
;
1565
AsciiToHexNybble:
1566
        cmpb    #'0'
1567 13 robfinch
        blo             gthx3
1568
        cmpb    #'9'
1569
        bhi             gthx5
1570 4 robfinch
        subb    #'0'
1571
        rts
1572
gthx5:
1573
        cmpb    #'A'
1574 13 robfinch
        blo             gthx3
1575
        cmpb    #'F'
1576
        bhi             gthx6
1577 4 robfinch
        subb    #'A'
1578
        addb    #10
1579
        rts
1580
gthx6:
1581
        cmpb    #'a'
1582 13 robfinch
        blo             gthx3
1583
        cmpb    #'z'
1584
        bhi             gthx3
1585 4 robfinch
        subb    #'a'
1586
        addb    #10
1587
        rts
1588
gthx3:
1589
        ldb             #-1             ; not a hex number
1590
        rts
1591
 
1592
AsciiToDecNybble:
1593
        cmpb    #'0'
1594
        bcc             gtdc3
1595
        cmpb    #'9'+1
1596
        bcs             gtdc3
1597
        subb    #'0'
1598
        rts
1599
gtdc3:
1600
        ldb             #-1
1601
        rts
1602
 
1603
DisplayErr:
1604 14 robfinch
        ldd             #msgErr
1605
        lbsr    DisplayString
1606 4 robfinch
        jmp             Monitor
1607
 
1608
DisplayStringDX
1609
        std             Strptr
1610
        stx             Strptr+2
1611
        jsr             DisplayString
1612
        rts
1613
 
1614
msgErr:
1615
        fcb     "**Err",CR,LF,0
1616
 
1617
HelpMsg:
1618
        fcb             "? = Display help",CR,LF
1619
        fcb     "CLS = clear screen",CR,LF
1620
;       db      "S = Boot from SD Card",CR,LF
1621 14 robfinch
        fcb     ": = Edit memory bytes",CR,LF
1622 4 robfinch
;       db      "L = Load sector",CR,LF
1623
;       db      "W = Write sector",CR,LF
1624
        fcb "DR = Dump registers",CR,LF
1625 13 robfinch
        fcb     "D = Dump memory",CR,LF
1626 4 robfinch
;       db      "F = Fill memory",CR,LF
1627 14 robfinch
        fcb "FL = Dump I/O Focus List",CR,LF
1628 4 robfinch
        fcb "FIG = start FIG Forth",CR,LF
1629
;       db      "KILL n = kill task #n",CR,LF
1630
;       db      "B = start tiny basic",CR,LF
1631
;       db      "b = start EhBasic 6502",CR,LF
1632
        fcb     "J = Jump to code",CR,LF
1633
        fcb "RAM = test RAM",CR,LF
1634
;       db      "R[n] = Set register value",CR,LF
1635
;       db      "r = random lines - test bitmap",CR,LF
1636
;       db      "e = ethernet test",CR,LF
1637 13 robfinch
        fcb     "s = serial output test",CR,LF
1638 4 robfinch
;       db      "T = Dump task list",CR,LF
1639
;       db      "TO = Dump timeout list",CR,LF
1640 13 robfinch
        fcb     "TI = display date/time",CR,LF
1641 4 robfinch
;       db      "TEMP = display temperature",CR,LF
1642 14 robfinch
        fcb     "U = unassemble",CR,LF
1643 4 robfinch
;       db      "P = Piano",CR,LF,0
1644
        fcb             0
1645
 
1646
msgRegHeadings
1647 13 robfinch
        fcb     CR,LF,"  D/AB     X      Y      U      S       PC    DP  CCR",CR,LF,0
1648 4 robfinch
 
1649
nHEX4:
1650
        jsr             HEX4
1651
        rts
1652
 
1653
nXBLANK:
1654
        ldb             #' '
1655 13 robfinch
        lbra    OUTCH
1656 4 robfinch
 
1657 13 robfinch
;------------------------------------------------------------------------------
1658
; Dump Memory
1659
;
1660
; Usage:
1661 14 robfinch
;       $D FFFC12 FFFC20
1662 13 robfinch
;
1663
; Dump formatted to look like:
1664
;               :FFFC12 012 012 012 012 555 666 777 888
1665
;
1666
;------------------------------------------------------------------------------
1667
 
1668
DumpMemory:
1669 14 robfinch
        bsr             GetRange
1670 13 robfinch
        ldy             #0
1671
        ldy             mon_r1+2
1672
dmpm2:
1673
        lbsr    CRLF
1674
        ldb             #':'
1675
        lbsr    OUTCH
1676
        tfr             y,d
1677
        ;addd   mon_r1+2                                        ; output the address
1678
        lbsr    DispWordAsHex
1679
        ldb             #' '
1680
        lbsr    OUTCH
1681
        ldx             #8                                                              ; number of bytes to display
1682
dmpm1:
1683
;       ldb             far [mon_r1+1],y
1684
        ;ldb            [mon_r1+2],y
1685
        ldb             ,y
1686
        iny
1687
        lbsr    DispByteAsHex                   ; display byte
1688
        ldb             #' '                                                    ; followed by a space
1689
        lbsr    OUTCH
1690
        clrb
1691
        clra
1692
        lbsr    INCH
1693
        cmpb    #CTRLC
1694
        beq             dmpm3
1695
        dex
1696
        bne             dmpm1
1697
        ; Now output ascii
1698
        ldb             #' '
1699
        lbsr    OUTCH
1700
        ldx             #8                                                              ; 8 chars to output
1701
        leay    -8,y                                                    ; backup pointer
1702
dmpm5:
1703
;       ldb             far [mon_r1+1],y        ; get the char
1704
;       ldb             [mon_r1+2],y                    ; get the char
1705
        ldb             ,y
1706
        cmpb    #$20                                                    ; is it a control char?
1707
        bhs             dmpm4
1708
        ldb             #'.'
1709
dmpm4:
1710
        lbsr    OUTCH
1711
        iny
1712
        dex
1713
        bne             dmpm5
1714
        cmpy    mon_r2+2
1715
        blo             dmpm2
1716
dmpm3:
1717
        lbsr    CRLF
1718
        lbra    Monitor
1719
 
1720
;------------------------------------------------------------------------------
1721 14 robfinch
; Edit Memory
1722
;
1723
; Usage:
1724
;       $$:FFFC12 8 "Hello World!" 0
1725
;
1726
; Dump formatted to look like:
1727
;               :FFFC12 012 012 012 012 555 666 777 888
1728
;
1729
;------------------------------------------------------------------------------
1730
 
1731
EditMemory:
1732
        ldu             #8                                              ; set max byte count
1733
        lbsr    GetHexNumber    ; get the start address
1734
        ldx             mon_numwka+2
1735
EditMem2:
1736
        lbsr    ignBlanks                       ; skip over blanks
1737
        lbsr    GetHexNumber    ; get the byte value
1738
        tstb                                                            ; check for valid value
1739
        bmi             EditMem1                        ; if invalid, quit
1740
        ldb             mon_numwka+3    ; get value
1741
        stb             ,x+                                             ; update memory at address
1742
        leau    -1,u                                    ; decremeent byte count
1743
        cmpu    #0
1744
        bne             EditMem2                        ; go back for annother byte
1745
EditMem1:
1746
        lbsr    MonGetch                        ; see if a string is being entered
1747
        cmpb    #'"'
1748
        bne             EditMem3                        ; no string, we're done
1749
        ldu             #40                                             ; string must be less than 40 chars
1750
EditMem4:
1751
        lbsr    MonGetch                        ; look for close quote
1752
        cmpb    #'"'
1753
        bne             EditMem6                        ; end of string?
1754
        ldu             #8                                              ; reset the byte count
1755
        bra             EditMem2
1756
EditMem6:
1757
        stb             ,x+                                             ; store the character in memory
1758
        leau    -1,u                                    ; decrement byte count
1759
        cmpu    #0
1760
        bhi             EditMem4                        ; max 40 chars
1761
EditMem3:
1762
        lbra    Monitor
1763
 
1764
 
1765
;------------------------------------------------------------------------------
1766 13 robfinch
; Dump Registers
1767
;
1768
;       Usage:
1769
;               $DR
1770
;------------------------------------------------------------------------------
1771
 
1772
DumpRegs:
1773
        ldd             #msgRegHeadings
1774
        lbsr    DisplayString
1775 4 robfinch
        bsr             nXBLANK
1776
        ldd             mon_DSAVE
1777
        bsr             nHEX4
1778
        bsr             nXBLANK
1779
        ldd             mon_XSAVE
1780
        bsr             nHEX4
1781
        bsr             nXBLANK
1782
        ldd             mon_YSAVE
1783
        bsr             nHEX4
1784
        bsr             nXBLANK
1785
        ldd             mon_USAVE
1786
        bsr             nHEX4
1787
        bsr             nXBLANK
1788
        ldd             mon_SSAVE
1789
        bsr             nHEX4
1790
        bsr             nXBLANK
1791 13 robfinch
        ldb             mon_PCSAVE+1
1792
        lbsr    DispByteAsHex
1793 4 robfinch
        ldd             mon_PCSAVE+2
1794
        bsr             nHEX4
1795
        bsr             nXBLANK
1796
        ldd             mon_DPRSAVE
1797
        jsr             HEX2
1798
        bsr             nXBLANK
1799
        lda             mon_CCRSAVE
1800 13 robfinch
        lbsr    HEX2
1801 4 robfinch
        bsr             nXBLANK
1802 13 robfinch
        lbra    Monitor
1803 4 robfinch
 
1804 13 robfinch
;------------------------------------------------------------------------------
1805 4 robfinch
; Jump to code
1806 13 robfinch
;
1807
; Registers are loaded with values from the monitor register save area before
1808
; the code is jumped to.
1809
;
1810
; J 
1811
;------------------------------------------------------------------------------
1812
 
1813 4 robfinch
jump_to_code:
1814
        bsr             GetHexNumber
1815
        sei
1816
        lds             mon_SSAVE
1817 14 robfinch
        ldd             #
1818 4 robfinch
        pshs    d
1819 13 robfinch
        ldb             #>jtc_exit
1820 4 robfinch
        pshs    b
1821 14 robfinch
        ldd             mon_numwka+2    ; get the address parameter
1822 4 robfinch
        pshs    d
1823 13 robfinch
        ldb             mon_numwka+1
1824
        pshs    b
1825 4 robfinch
        ldd             mon_USAVE
1826
        pshs    d
1827
        ldd             mon_YSAVE
1828
        pshs    d
1829
        ldd             mon_XSAVE
1830
        pshs    d
1831
        lda             mon_DPRSave
1832
        pshs    a
1833
        ldd             mon_DSAVE
1834
        pshs    d
1835
        lda             mon_CCRSAVE
1836
        pshs    a
1837
        puls    far ccr,d,dpr,x,y,u,pc
1838
jtc_exit:
1839 13 robfinch
        sts             >mon_SSAVE              ; need to use extended addressing, no direct page setting
1840
        leas    $6FFF                                   ; reset stack to system area, dont modify flags register!
1841
        pshs    ccr                                             ; now the stack can be used
1842
        pshs    a                                                       ; save acca register so we can use it
1843
        tfr             dpr,a                                   ; a = outgoing dpr value
1844
        sta             >mon_DPRSAVE    ; force extended addressing mode usage here dpr is not set
1845
        clra                                                            ; dpg register must be set to zero before values are
1846
        tfr             a,dpr                                   ; saved in the monitor register save area.
1847
        puls    a                                                       ; get back acca
1848
        std             mon_DSAVE                       ; save regsters, can use direct addressing now
1849 4 robfinch
        stx             mon_XSAVE
1850
        sty             mon_YSAVE
1851
        stu             mon_USAVE
1852 13 robfinch
        puls    a                                                       ; get back ccr
1853
        sta             mon_CCRSAVE             ; and save it too
1854
        ; Reset vectors in case they got toasted.
1855
        ldd             #SerialPeekCharDirect
1856
        std             CharInVec
1857
        ldd             #DisplayChar
1858
        std             CharOutVec
1859 14 robfinch
        ldd             DisplayErr
1860
        std             MonErrVec
1861 4 robfinch
        ; todo set according to coreid
1862 13 robfinch
        lbra    DumpRegs                        ; now go do a register dump
1863 4 robfinch
 
1864
;------------------------------------------------------------------------------
1865
;------------------------------------------------------------------------------
1866 14 robfinch
 
1867
DumpIOFocusList:
1868
        ldx             #0
1869
dfl2:
1870
        ldb             IOFocusList,x
1871
        cmpb    #24
1872
        bne             dfl1
1873
        tfr             x,d
1874
        lbsr    DispByteAsHex
1875
        ldb             #' '
1876
        lbsr    OUTCH
1877
dfl1:
1878
        inx
1879
        cmpx    #16
1880
        blo             dfl2
1881
        lbsr    CRLF
1882
        lbra    Monitor
1883
 
1884
 
1885
;------------------------------------------------------------------------------
1886
;------------------------------------------------------------------------------
1887 4 robfinch
swi3_rout:
1888
        sei
1889
        puls    a
1890
        sta             mon_CCRSAVE
1891
        puls    D,DPR,X,Y,U
1892
        std             mon_DSAVE
1893
        stx             mon_XSAVE
1894
        sty             mon_YSAVE
1895
        stu             mon_USAVE
1896
        tfr             dpr,a
1897
        sta             mon_DPRSAVE
1898 13 robfinch
        puls    a
1899
        sta             mon_PCSAVE
1900 4 robfinch
        puls    D
1901 13 robfinch
        std             mon_PCSAVE+1
1902 4 robfinch
        sts             mon_SSAVE
1903
        lds             #$3FFF
1904
        cli
1905
        jmp             DumpRegs
1906
swi3_exit:
1907
        sei
1908
        lds             mon_SSAVE
1909 13 robfinch
        ldd             mon_PCSAVE+1
1910 4 robfinch
        pshs    d
1911 13 robfinch
        lda             mon_PCSAVE
1912
        pshs    a
1913 4 robfinch
        ldu             mon_USAVE
1914
        ldy             mon_YSAVE
1915
        ldx             mon_XSAVE
1916
        pshs    x,y,u
1917
        lda             mon_DPRSAVE
1918
        pshs    a
1919
        ldd             mon_DSAVE
1920
        pshs    d
1921
        lda             mon_CCRSAVE
1922
        pshs    a
1923
        tfr             a,ccr
1924
        cli
1925
        rti
1926
 
1927
;------------------------------------------------------------------------------
1928
;------------------------------------------------------------------------------
1929 13 robfinch
firq_rout:
1930
        rti
1931
 
1932 4 robfinch
irq_rout:
1933 13 robfinch
;       lbsr    SerialIRQ       ; check for recieved character
1934
;       lbsr    TimerIRQ
1935
 
1936 4 robfinch
        ; Reset the edge sense circuit in the PIC
1937 13 robfinch
        lda             #31                                                     ; Timer is IRQ #31
1938
        sta             IrqSource               ; stuff a byte indicating the IRQ source for PEEK()
1939
        sta             PIC+16                                  ; register 16 is edge sense reset reg
1940
        lda             VIA+VIA_IFR
1941
        bpl             notTimerIRQ2
1942
        bita    #$800
1943
        beq             notTimerIRQ2
1944
        clr             VIA+VIA_T3LL
1945
        clr             VIA+VIA_T3LH
1946
        inc             $E00037                                 ; update timer IRQ screen flag
1947
notTimerIRQ2:
1948 4 robfinch
 
1949
        lda             IrqBase                 ; get the IRQ flag byte
1950
        lsra
1951
        ora             IrqBase
1952
        anda    #$E0
1953
        sta             IrqBase
1954
 
1955 13 robfinch
;       inc             TEXTSCR+54              ; update IRQ live indicator on screen
1956 4 robfinch
 
1957
        ; flash the cursor
1958
        ; only bother to flash the cursor for the task with the IO focus.
1959 13 robfinch
;       lda             COREID
1960
;       cmpa    IOFocusID
1961
;       bne             tr1a
1962
;       lda             CursorFlash             ; test if we want a flashing cursor
1963
;       beq             tr1a
1964
;       lbsr    CalcScreenLoc   ; compute cursor location in memory
1965
;       tfr             d,y
1966
;       lda             $2000,y                 ; get color code $2000 higher in memory
1967
;       ldb             IRQFlag                 ; get counter
1968
;       lsrb
1969
;       lsra
1970
;       lsra
1971
;       lsra
1972
;       lsra
1973
;       lsrb
1974
;       rola
1975
;       lsrb
1976
;       rola
1977
;       lsrb
1978
;       rola
1979
;       lsrb
1980
;       rola
1981
;       sta             $E00000,y               ; store the color code back to memory
1982
tr1a:
1983 4 robfinch
        rti
1984
 
1985
;------------------------------------------------------------------------------
1986
;------------------------------------------------------------------------------
1987
nmi_rout:
1988
        ldb             COREID
1989
        lda             #'I'
1990
        ldx             #TEXTSCR+40
1991 13 robfinch
        sta             b,x
1992
rti_insn:
1993 4 robfinch
        rti
1994
 
1995 13 robfinch
; Special Register Area
1996
        org             $FFFFE0
1997
 
1998
; Interrupt vector table
1999
 
2000 4 robfinch
        org             $FFFFF0
2001 13 robfinch
        fcw             rti_insn                ; reserved
2002
        fcw             swi3_rout               ; SWI3
2003
        fcw             rti_insn                ; SWI2
2004
        fcw             firq_rout               ; FIRQ
2005
        fcw             irq_rout                ; IRQ
2006 4 robfinch
        fcw             start                           ; SWI
2007
        fcw             nmi_rout                ; NMI
2008
        fcw             start                           ; RST

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.