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

Subversion Repositories rf6809

[/] [rf6809/] [trunk/] [software/] [boot/] [boot_rom.lst] - Blame information for rev 21

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 21 robfinch
3 error(s), 894 warning(s) unlisted in pass 1
2 4 robfinch
                              ; ============================================================================
3
                              ;        __
4 13 robfinch
                              ;   \\__/ o\    (C) 2013-2022  Robert Finch, Waterloo
5 4 robfinch
                              ;    \  __ /    All rights reserved.
6
                              ;     \/_//     robfinch@opencores.org
7
                              ;       ||
8
                              ;
9
                              ;
10 13 robfinch
                              ; BSD 3-Clause License
11
                              ; Redistribution and use in source and binary forms, with or without
12
                              ; modification, are permitted provided that the following conditions are met:
13
                              ;
14
                              ; 1. Redistributions of source code must retain the above copyright notice, this
15
                              ;    list of conditions and the following disclaimer.
16
                              ;
17
                              ; 2. Redistributions in binary form must reproduce the above copyright notice,
18
                              ;    this list of conditions and the following disclaimer in the documentation
19
                              ;    and/or other materials provided with the distribution.
20
                              ;
21
                              ; 3. Neither the name of the copyright holder nor the names of its
22
                              ;    contributors may be used to endorse or promote products derived from
23
                              ;    this software without specific prior written permission.
24
                              ;
25
                              ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26
                              ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27
                              ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28
                              ; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
29
                              ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30
                              ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31
                              ; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32
                              ; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33
                              ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
                              ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 4 robfinch
                              ;
36
                              ; ============================================================================
37
                              ;
38 15 robfinch
                              ; ============================================================================
39
                              ;        __
40
                              ;   \\__/ o\    (C) 2013-2022  Robert Finch, Waterloo
41
                              ;    \  __ /    All rights reserved.
42
                              ;     \/_//     robfinch@opencores.org
43
                              ;       ||
44
                              ;
45
                              ;
46
                              ; BSD 3-Clause License
47
                              ; Redistribution and use in source and binary forms, with or without
48
                              ; modification, are permitted provided that the following conditions are met:
49
                              ;
50
                              ; 1. Redistributions of source code must retain the above copyright notice, this
51
                              ;    list of conditions and the following disclaimer.
52
                              ;
53
                              ; 2. Redistributions in binary form must reproduce the above copyright notice,
54
                              ;    this list of conditions and the following disclaimer in the documentation
55
                              ;    and/or other materials provided with the distribution.
56
                              ;
57
                              ; 3. Neither the name of the copyright holder nor the names of its
58
                              ;    contributors may be used to endorse or promote products derived from
59
                              ;    this software without specific prior written permission.
60
                              ;
61
                              ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
62
                              ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
63
                              ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
64
                              ; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
65
                              ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
66
                              ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
67
                              ; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
68
                              ; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
69
                              ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
70
                              ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
71
                              ;
72
                              ; ============================================================================
73
                              ;
74 21 robfinch
                              ; ASCII control characters.
75
                              SOH             equ 1
76
                              EOT             equ 4
77
                              ACK             equ 6
78
                              BS              equ 8
79
                              NAK             equ 21
80
                              ETB             equ     $17
81
                              CAN             equ 24
82
                              DEL             equ 127
83
 
84 4 robfinch
                              CR      EQU     $0D             ;ASCII equates
85
                              LF      EQU     $0A
86
                              TAB     EQU     $09
87
                              CTRLC   EQU     $03
88
                              CTRLH   EQU     $08
89
                              CTRLI   EQU     $09
90
                              CTRLJ   EQU     $0A
91
                              CTRLK   EQU     $0B
92
                              CTRLM   EQU $0D
93
                              CTRLS   EQU     $13
94 13 robfinch
                              CTRLT EQU $14
95 4 robfinch
                              CTRLX   EQU     $18
96 16 robfinch
                              CTRLZ   EQU     $1A
97 4 robfinch
                              XON             EQU     $11
98
                              XOFF    EQU     $13
99
 
100
                              FIRST_CORE      EQU     1
101
                              MAX_TASKNO      EQU 63
102
                              DRAM_BASE       EQU $10000000
103
 
104 15 robfinch
                              ; ROM monitor functions
105
                              ;
106
                              MF_Monitor      EQU             0
107
                              MF_INCH                 EQU             1
108
                              MF_OUTCH                EQU     2
109
                              MF_CRLF                 EQU             3
110
                              MF_DisplayString        EQU             4
111
                              MF_DisplayByteAsHex             EQU     5
112
                              MF_DisplayWordAsHex             EQU     6
113
                              MF_ShowSprites  EQU             7
114
                              MF_Srand                EQU             8
115
                              MF_Random               EQU             9
116
                              MF_OSCALL               EQU             10
117 16 robfinch
                              MF_GetRange     EQU             11      ; gets a pair of numbers last>first
118
                              MF_GetNumber    EQU     12
119 21 robfinch
                              MF_SerialPutchar        EQU     13
120 15 robfinch
 
121
                              mon_numwka      EQU             $910
122
                              mon_r1          EQU             $920
123
                              mon_r2          EQU             $924
124
                              ; ============================================================================
125
                              ;        __
126
                              ;   \\__/ o\    (C) S2022  Robert Finch, Waterloo
127
                              ;    \  __ /    All rights reserved.
128
                              ;     \/_//     robfinch@opencores.org
129
                              ;       ||
130
                              ;
131
                              ;
132
                              ; BSD 3-Clause License
133
                              ; Redistribution and use in source and binary forms, with or without
134
                              ; modification, are permitted provided that the following conditions are met:
135
                              ;
136
                              ; 1. Redistributions of source code must retain the above copyright notice, this
137
                              ;    list of conditions and the following disclaimer.
138
                              ;
139
                              ; 2. Redistributions in binary form must reproduce the above copyright notice,
140
                              ;    this list of conditions and the following disclaimer in the documentation
141
                              ;    and/or other materials provided with the distribution.
142
                              ;
143
                              ; 3. Neither the name of the copyright holder nor the names of its
144
                              ;    contributors may be used to endorse or promote products derived from
145
                              ;    this software without specific prior written permission.
146
                              ;
147
                              ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
148
                              ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
149
                              ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
150
                              ; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
151
                              ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
152
                              ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
153
                              ; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
154
                              ; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
155
                              ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
156
                              ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
157
                              ;
158
                              ; ============================================================================
159
 
160
                              COREID  EQU             $FFFFFFFE0
161
                              MSCOUNT EQU             $FFFFFFFE4
162
                              LEDS            EQU             $FFFE60001
163
                              VIA                     EQU             $FFFE60000
164
                              VIA_PA          EQU             1
165
                              VIA_DDRA        EQU             3
166
                              VIA_ACR                 EQU             11
167
                              VIA_IFR                 EQU             13
168
                              VIA_IER                 EQU             14
169
                              VIA_T3LL                EQU             18
170
                              VIA_T3LH                EQU             19
171
                              VIA_T3CMPL      EQU             20
172
                              VIA_T3CMPH      EQU             21
173
                              TEXTSCR         EQU             $FFFE00000
174
                              TEXTREG         EQU             $FFFE07F00
175
                              TEXT_COLS       EQU             0
176
                              TEXT_ROWS       EQU             1
177
                              TEXT_CURPOS     EQU             34
178
                              COLS            EQU             64
179
                              ROWS            EQU             32
180
                              ACIA            EQU             $FFFE30100
181
                              ACIA_TX         EQU             0
182
                              ACIA_RX         EQU             0
183
                              ACIA_STAT       EQU             1
184
                              ACIA_CMD        EQU             2
185
                              ACIA_CTRL       EQU             3
186 21 robfinch
                              ACIA_IRQS       EQU             4
187 15 robfinch
                              ACIA_CTRL2      EQU             11
188
                              RTC                             EQU             $FFFE30500      ; I2C
189
                              RTCBuf          EQU             $7FC0
190
                              PRNG            EQU             $FFFE30600
191
                              KEYBD           EQU             $FFFE30400
192
                              KEYBDCLR        EQU             $FFFE30402
193
                              PIC                     EQU             $FFFE3F000
194
                              SPRITE_CTRL             EQU             $FFFE10000
195
                              SPRITE_EN                       EQU             $3C0
196
 
197
                              OUTSEMA EQU     $EF0000
198
                              SEMAABS EQU     $1000
199
                              OSSEMA  EQU     $EF0010
200
 
201 16 robfinch
                              OPC_SWI                         EQU             $03F
202 4 robfinch
                              ScreenLocation          EQU             $10
203
                              ColorCodeLocation       EQU             $14
204
                              ScreenLocation2         EQU             $18
205
                              BlkcpySrc                       EQU             $1C
206
                              BlkcpyDst                       EQU             $20
207
                              Strptr                          EQU             $24
208
                              PICptr                          EQU             $28
209
                              ; Forth Area
210
                              ; 0x30-0x60
211
 
212
                              ; Task control blocks, room for 256 tasks
213
                              TCB_NxtRdy              EQU             $00     ; next task on ready / timeout list
214
                              TCB_PrvRdy              EQU             $04     ; previous task on ready / timeout list
215
                              TCB_NxtTCB              EQU             $08
216
                              TCB_Timeout             EQU             $0C
217
                              TCB_Priority    EQU             $10
218
                              TCB_MSGPTR_D1   EQU             $14
219
                              TCB_MSGPTR_D2   EQU             $18
220
                              TCB_hJCB                        EQU             $1C
221
                              TCB_Status              EQU             $1E
222
                              TCB_CursorRow   EQU             $20
223
                              TCB_CursorCol   EQU             $21
224
                              TCB_hWaitMbx    EQU             $22     ; handle of mailbox task is waiting at
225
                              TCB_mbq_next    EQU             $24     ; mailbox queue next
226
                              TCB_mbq_prev    EQU             $28     ; mailbox queue previous
227
                              TCB_iof_next    EQU             $2C
228
                              TCB_iof_prev    EQU             $30
229
                              TCB_SPSave              EQU             $34     ; TCB_SPSave area
230
                              TCB_mmu_map             EQU             $38
231
 
232
                              KeybdHead               EQU             $FFFFFC800
233
                              KeybdTail               EQU             $FFFFFC900
234
                              KeybdEcho               EQU             $FFFFFCA00
235
                              KeybdBad                EQU             $FFFFFCB00
236
                              KeybdAck                EQU             $FFFFFCC00
237
                              KeybdLocks              EQU             $FFFFFCD00
238
                              KeybdBuffer             EQU             $FFFFFC000      ; buffer is 16 chars
239
 
240
                              BIOS_SCREENS    EQU     $17000000       ; $17000000 to $171FFFFF
241
 
242
                              ; EhBASIC vars:
243
                              ;
244 15 robfinch
                              NmiBase         EQU             $FFC013
245
                              IrqBase         EQU             $FFC014
246 4 robfinch
 
247
                              IOFocusNdx      EQU             $100
248
 
249 13 robfinch
                              ; These variables in global OS storage area
250
 
251 15 robfinch
                              IOFocusList     EQU             $FFC000 ; to $FF000F
252
                              IOFocusID               EQU             $FFC010
253
                              IrqSource               EQU             $FFC011
254
                              IRQFlag                 EQU             $FFC012
255
                              RunningID               EQU             $FFC013
256 21 robfinch
                              milliseconds    EQU             $FFC014
257
 
258
                              ; One copy of serial buffer management
259
                              ; 1 serial buffer for system.
260
                              SerHeadRcv      EQU     $FFC015
261
                              SerTailRcv      EQU     $FFC016
262
                              SerHeadXmit     EQU     $FFC017
263
                              SerTailXmit     EQU     $FFC018
264
                              SerRcvXon               EQU     $FFC019
265
                              SerRcvXoff      EQU     $FFC01A
266
                              SerRcvBuf               EQU     $FFB000 ; 4kB serial recieve buffer
267
 
268 16 robfinch
                              ; Top of boot stack is at $FFC0FF
269 13 robfinch
 
270 4 robfinch
                              ; These variables use direct page access
271
                              CursorRow       EQU             $110
272
                              CursorCol       EQU             $111
273
                              CharColor       EQU             $112
274
                              ScreenColor     EQU             $113
275
                              CursorFlash     EQU             $114
276
                              KeyState1       EQU     $120
277
                              KeyState2       EQU     $121
278
                              KeyLED          EQU     $122
279
                              KeybdID         EQU     $124
280 13 robfinch
                              KeybdBlock      EQU     $126
281
                              kbdHeadRcv      EQU     $127
282
                              kbdTailRcv      EQU     $128
283
                              kbdFifo                 EQU     $40                             ; in local RAM
284
                              kbdFifoAlias    EQU     $C00040 ; to $C0007F    ; alias for $40 to $7F
285
                              SerhZero                EQU     $130
286
                              SertZero                EQU     $132
287 4 robfinch
 
288 21 robfinch
 
289 14 robfinch
                              farflag EQU             $15F
290 13 robfinch
                              asmbuf  EQU             $160    ; to $17F
291
 
292 4 robfinch
                              QNdx0           EQU             $780
293
                              QNdx1           EQU             QNdx0+2
294
                              QNdx2           EQU             QNdx1+2
295
                              QNdx3           EQU             QNdx2+2
296
                              QNdx4           EQU             QNdx3+2
297
                              FreeTCB         EQU             QNdx4+2
298
                              TimeoutList     EQU             FreeTCB+2
299
                              FreeMbx         EQU             RunningTCB + 2
300
                              nMailbox        EQU             FreeMbx + 2
301
                              FreeMsg         EQU             nMailbox + 2
302
                              nMsgBlk         EQU             FreeMsg + 2
303
 
304
 
305
                              CharOutVec      EQU             $800
306
                              CharInVec       EQU             $804
307 13 robfinch
                              CmdPromptJI     EQU     $808
308 14 robfinch
                              MonErrVec       EQU             $80C
309 15 robfinch
                              BreakpointFlag  EQU             $810
310 21 robfinch
                              NumSetBreakpoints       EQU     $811    ; to 812
311 15 robfinch
                              Breakpoints                     EQU             $820    ; to $82F
312
                              BreakpointBytes EQU             $830    ; to $83F
313
                              mon_vectb                               EQU             $880
314 4 robfinch
 
315
                              ; Register save area for monitor
316
                              mon_DSAVE       EQU             $900
317
                              mon_XSAVE       EQU             $902
318
                              mon_YSAVE       EQU             $904
319
                              mon_USAVE       EQU             $906
320
                              mon_SSAVE       EQU             $908
321
                              mon_PCSAVE      EQU             $90A
322
                              mon_DPRSAVE     EQU             $90E
323
                              mon_CCRSAVE     EQU             $90F
324
 
325
                              mon_numwka      EQU             $910
326
                              mon_r1          EQU             $920
327 13 robfinch
                              mon_r2          EQU             $924
328 15 robfinch
                              jmpvec          EQU             $928
329 16 robfinch
                              mon_init        EQU             $92C
330
                              mon_retflag     EQU     $930
331 4 robfinch
 
332
                              ; The ORG directive must set an address a multiple of 4 in order for the Verilog
333
                              ; output to work correctly.
334
 
335
                                      org             $FFD0AC
336
 00FFD0AC 012                             nop
337
 00FFD0AD 012                             nop
338
 00FFD0AE 012                             nop
339
                              XBLANK
340
 00FFD0AF 0C6020                          ldb             #' '
341 21 robfinch
 00FFD0B1 017002115                       lbsr    OUTCH
342 4 robfinch
 00FFD0B4 039                             rts
343
 
344
                                      org             $FFD0D0
345
 00FFD0D0 012                             nop
346
 00FFD0D1 012                             nop
347
                              CRLF
348
                              CRLF1:
349
 00FFD0D2 0C600D                          ldb             #CR
350 21 robfinch
 00FFD0D4 0170020F2                       lbsr    OUTCH
351 4 robfinch
 00FFD0D7 0C600A                          ldb             #LF
352 21 robfinch
 00FFD0D9 0170020ED                       lbsr    OUTCH
353 4 robfinch
 00FFD0DC 039                             rts
354
 
355
                                      org             $FFD0F0
356
 00FFD0F0 012                             nop
357
 00FFD0F1 020FDF                          bra             CRLF1
358
 
359
                                      org             $FFD1DC
360
                              ONEKEY
361
 00FFD1DC 06E90F000804                    jmp             [CharInVec]
362
 
363
                                      org             $FFD2C0
364
 00FFD2C0 012                             nop
365
                              LETTER
366 21 robfinch
 00FFD2C1 017001F05                       lbsr    OUTCH
367 4 robfinch
 00FFD2C4 039                             rts
368
 
369
                                      org             $FFD2CC
370
 00FFD2CC 012                             nop
371
 00FFD2CD 012                             nop
372
                              HEX2
373 21 robfinch
 00FFD2CE 017001169                       lbsr    DispByteAsHex
374 4 robfinch
 00FFD2D1 039                             rts
375
                              HEX4
376 21 robfinch
 00FFD2D2 01700115C                       lbsr    DispWordAsHex
377 4 robfinch
 00FFD2D5 039                             rts
378
 
379
                                      org             $FFD300
380
                              ClearScreenJmp
381 21 robfinch
 00FFD300 016000F39                       lbra    ClearScreen
382 4 robfinch
                                      org             $FFD308
383
                              HomeCursorJmp
384 21 robfinch
 00FFD308 016000FA8                       lbra    HomeCursor
385 4 robfinch
 
386 13 robfinch
                                      org             $FFD400
387 4 robfinch
 
388
                              ; Local RAM test routine
389
                              ; Checkerboard testing.
390
                              ; There is 70kB of local RAM
391
                              ; Does not use any RAM including no stack
392
 
393
                              ramtest:
394 13 robfinch
 00FFD400 18E000000                       ldy             #0
395
 00FFD403 086001                          lda             #1
396
 00FFD405 0150B7FFFE60001                 sta             LEDS
397
 00FFD40A 0CCAAA555                       ldd             #$AAA555
398 4 robfinch
                              ramtest1:
399 13 robfinch
 00FFD40D 0EDA01                          std             ,y++
400
 00FFD40F 18C008000                       cmpy    #$8000
401
 00FFD412 025FF9                          blo             ramtest1
402 4 robfinch
                                      ; now readback values and compare
403 13 robfinch
 00FFD414 18E000000                       ldy             #0
404 4 robfinch
                              ramtest3:
405 13 robfinch
 00FFD417 0ECA01                          ldd             ,y++
406
 00FFD419 183AAA555                       cmpd    #$AAA555
407
 00FFD41C 02600E                          bne             ramerr
408
 00FFD41E 18C008000                       cmpy    #$8000
409
 00FFD421 025FF4                          blo             ramtest3
410
 00FFD423 086002                          lda             #2
411
 00FFD425 0150B7FFFE60001                 sta             LEDS
412
 00FFD42A 06EC04                          jmp             ,u
413 4 robfinch
                              ramerr:
414 13 robfinch
 00FFD42C 086080                          lda             #$80
415
 00FFD42E 0150B7FFFE60001                 sta             LEDS
416 16 robfinch
 00FFD433 0150F6FFFFFFFE0                 ldb             COREID
417
 00FFD438 0C1020                          cmpb    #$20
418
 00FFD43A 027009                          beq             ramerr1
419
 00FFD43C 08EE00000                       ldx             #TEXTSCR
420
 00FFD43F 03A                             abx
421
 00FFD440 086046                          lda             #'F'
422
 00FFD442 0A7804                          sta             ,x
423
 00FFD444 013                             sync
424
                              ramerr1:
425
 00FFD445 06EC04                          jmp             ,u
426 4 robfinch
 
427 15 robfinch
 
428 13 robfinch
                                      org             $FFE000
429 21 robfinch
 00FFE000 FFF35C                          FDB Monitor
430 13 robfinch
 00FFE002 FFE022                          FDB DumRts      ;       NEXTCMD
431 21 robfinch
 00FFE004 FFF191                          FDB INCH
432
 00FFE006 FFF1AF                          FDB INCHE
433
 00FFE008 FFF1B3                          FDB INCHEK
434
 00FFE00A FFF1C9                          FDB OUTCH
435
 00FFE00C FFE41E                          FDB PDATA
436
 00FFE00E FFE411                          FDB PCRLF
437
 00FFE010 FFE40D                          FDB PSTRNG
438 13 robfinch
 00FFE012 FFE022                          FDB DumRts                      ; LRA
439
 00FFE014 FFE022                          FDB DumRts
440
 00FFE016 FFE022                          FDB DumRts
441
 00FFE018 FFE022                          FDB DumRts
442
 00FFE01A FFE022                          FDB DumRts                      ; VINIZ
443 21 robfinch
 00FFE01C FFE31C                          FDB DisplayChar ;       VOUTCH
444 13 robfinch
 00FFE01E FFE022                          FDB DumRts                      ; ACINIZ
445
 00FFE020 FFE022                          FDB DumRts                      ; AOUTCH
446 4 robfinch
 
447
                              DumRts:
448 13 robfinch
 00FFE022 039                             rts
449 4 robfinch
 
450
                              ;------------------------------------------------------------------------------
451
                              ;------------------------------------------------------------------------------
452
 
453
                              start:
454 13 robfinch
 00FFE023 086FFF                          lda             #$FFF                   ; all cores can do this
455
 00FFE025 0150B7FFFE60003                 sta             VIA+VIA_DDRA
456
 00FFE02A 086055                          lda             #$55                    ; see if we can at least set LEDs
457
 00FFE02C 0150B7FFFE60001                 sta             LEDS
458
 00FFE031 086001                          lda             #1                              ; prime OS semaphore
459
 00FFE033 0B7EF1010                       sta             OSSEMA+$1000
460 15 robfinch
 00FFE036 0B7EF1000                       sta             OUTSEMA+$1000
461 16 robfinch
 00FFE039 0CEFFE03C                       ldu             #st6                    ; U = return address
462
                              ;       jmp             ramtest         ; JMP dont JSR
463 4 robfinch
                              st6:
464 16 robfinch
 00FFE03C 1CE006FFF                       lds             #$6FFF          ; boot up stack area
465
 00FFE03F 0150B6FFFFFFFE0                 lda             COREID
466
 00FFE044 081001                          cmpa    #FIRST_CORE
467 4 robfinch
                              ;       beq             st8
468
                              ;       sync                                            ; halt cores other than 2
469
                              st8:
470
                              ;       bne             skip_init
471
                              ;       bsr             romToRam
472
                              ;       ldd             #st7 & $FFFF
473
                              ;       tfr             d,x
474
                              ;       jmp             ,x                              ; jump to the BIOS now in local RAM
475
                              st7:
476 21 robfinch
 00FFE046 08D170                          bsr             Delay3s         ; give some time for devices to reset
477 16 robfinch
 00FFE048 07F000810                       clr             BreakpointFlag
478
 00FFE04B 07F000811                       clr             NumSetBreakpoints
479
 00FFE04E 0860AA                          lda             #$AA
480
 00FFE050 0150B7FFFE60001                 sta             LEDS
481
 00FFE055 0150B6FFFFFFFE0                 lda             COREID
482
 00FFE05A 081020                          cmpa    #$20
483
 00FFE05C 027002                          beq             st11
484
 00FFE05E 086001                          lda             #FIRST_CORE
485
                              st11:
486
 00FFE060 0B7FFC010                       sta             IOFocusID       ; core #2 has focus
487
 00FFE063 0B7FFC013                       sta             RunningID
488 14 robfinch
                                      ; Clear IO focus list
489 16 robfinch
 00FFE066 08E000000                       ldx             #0
490 14 robfinch
                              st9:
491 16 robfinch
 00FFE069 06F80A000FFC000                 clr             IOFocusList,x
492
 00FFE06E 030001                          inx
493
 00FFE070 08C000010                       cmpx    #16
494
 00FFE073 025FF4                          blo             st9
495
 00FFE075 086018                          lda             #24
496
 00FFE077 0B7FFC001                       sta             IOFocusList+FIRST_CORE
497 14 robfinch
 
498 16 robfinch
 00FFE07A 0860CE                          lda             #$0CE
499
 00FFE07C 097113                          sta             ScreenColor
500
 00FFE07E 097112                          sta             CharColor
501 21 robfinch
 00FFE080 08D1BA                          bsr             ClearScreen
502
 00FFE082 0CCFFE31C                       ldd             #DisplayChar
503 16 robfinch
 00FFE085 0FD000800                       std             CharOutVec
504 21 robfinch
 00FFE088 0CCFFEC73                       ldd             #SerialPeekCharDirect
505 16 robfinch
 00FFE08B 0FD000804                       std             CharInVec
506 15 robfinch
                              ;       swi
507
                              ;       fcb             MF_OSCALL
508
                              ;       fcb             24                                      ; request IO focus
509 16 robfinch
 00FFE08E 0150F6FFFFFFFE0                 ldb             COREID
510
 00FFE093 0C1001                          cmpb    #FIRST_CORE
511
 00FFE095 027011                          beq             init
512
 00FFE097 0C1020                          cmpb    #$20                            ; CmodA709 core?
513 21 robfinch
 00FFE099 027060                          beq             init2
514
 00FFE09B 020070                          bra             skip_init
515
 00FFE09D 0200B7                          bra             multi_sieve
516 4 robfinch
                              st3:
517 16 robfinch
 00FFE09F 0860FF                          lda             #$FF
518
 00FFE0A1 0150B7FFFE60001                 sta             LEDS
519
 00FFE0A6 020FF7                          bra             st3
520 4 robfinch
 
521
                                      ; initialize interrupt controller
522
                                      ; first, zero out all the vectors
523
                              init:
524 21 robfinch
 00FFE0A8 017000479                       lbsr    rtc_read        ; get clock values
525 16 robfinch
 00FFE0AB 08E000127                       ldx             #kbdHeadRcv
526
 00FFE0AE 0C6020                          ldb             #32                             ; number of bytes to zero out
527 13 robfinch
                              init1:
528 16 robfinch
 00FFE0B0 06F800                          clr             ,x+
529
 00FFE0B2 05A                             decb
530
 00FFE0B3 026FFB                          bne             init1
531 21 robfinch
 00FFE0B5 08E000080                       ldx             #128                    ; register to start at
532 4 robfinch
                              st1:
533 21 robfinch
 00FFE0B8 06F809E3F000                    clr             PIC,x                   ; cause code
534
 00FFE0BC 0A7809E3F001                    sta             PIC+1,x
535
 00FFE0C0 0E7809E3F002                    stb             PIC+2,x
536
 00FFE0C4 030004                          leax    4,x
537
 00FFE0C6 08C000100                       cmpx    #256                    ; max reg
538
 00FFE0C9 025FED                          blo             st1
539
 00FFE0CB 0860C1                          lda             #$C1                    ; make irq edge sensitive (bit 7), enable interupt (bit 6), irq (bit 0)
540
 00FFE0CD 0150B7FFFE3F0FD                 sta             PIC+$FD
541
 00FFE0D2 086041                          lda             #$41                    ; level sensitive, enabled, irq
542
 00FFE0D4 0150B7FFFE3F0D1                 sta             PIC+$D1         ; serial irq is #20
543
 00FFE0D9 086040                          lda             #COLS
544
 00FFE0DB 0150B7FFFE07F00                 sta             TEXTREG+TEXT_COLS
545
 00FFE0E0 086020                          lda             #ROWS
546
 00FFE0E2 0150B7FFFE07F01                 sta             TEXTREG+TEXT_ROWS
547
 00FFE0E7 08D153                          bsr             ClearScreen
548
 00FFE0E9 08D1C8                          bsr             HomeCursor
549
 00FFE0EB 08E000000                       ldx             #0
550
 00FFE0EE 0CC000000                       ldd             #0
551
 00FFE0F1 0170010DF                       lbsr    ShowSprites
552
 00FFE0F4 0170008C9                       lbsr    KeybdInit
553
 00FFE0F7 0DC124                          ldd             KeybdID
554
 00FFE0F9 08D336                          bsr             DispWordAsHex
555 16 robfinch
                              init2:
556 21 robfinch
 00FFE0FB 01700036A                       lbsr    TimerInit
557
 00FFE0FE 017000AEE                       lbsr    InitSerial
558
 00FFE101 08E000080                       ldx             #128
559
 00FFE104 086001                          lda             #1                      ; set irq(bit0), clear firq (bit1), disable int (bit 6), clear edge sense(bit 7)
560
 00FFE106 0C6001                          ldb             #FIRST_CORE                     ; serving core id
561 4 robfinch
                              ;       lda             #4                              ; make the timer interrupt edge sensitive
562
                              ;       sta             PIC+4                   ; reg #4 is the edge sensitivity setting
563
                              ;       sta             PIC                             ; reg #0 is interrupt enable
564 21 robfinch
 00FFE108 0C6001                          ldb             #1
565
 00FFE10A 0F7EF1000                       stb             OUTSEMA+SEMAABS ; set semaphore to 1 available slot
566 4 robfinch
                              skip_init:
567 21 robfinch
 00FFE10D 01C0EF                          andcc   #$EF                    ; unmask irq
568
 00FFE10F 086005                          lda             #5
569
 00FFE111 0150B7FFFE60001                 sta             LEDS
570
 00FFE116 0CCFFE11F                       ldd             #msgStartup
571
 00FFE119 08D2C2                          bsr             DisplayString
572 16 robfinch
                              st10:
573 21 robfinch
 00FFE11B 03F                             swi
574
 00FFE11C 000                             fcb             MF_Monitor
575
 00FFE11D 020FFC                          bra             st10
576 4 robfinch
 
577
                              msgStartup
578 21 robfinch
 00FFE11F 072066036038030039020           fcb             "rf6809 12-bit System Starting.",CR,LF,0
579
 00FFE126 03103202D062069074020
580
 00FFE12D 05307907307406506D020
581
 00FFE134 05307406107207406906E
582
 00FFE13B 06702E00D00A000
583 4 robfinch
 
584
                              ;------------------------------------------------------------------------------
585
                              ; The checkpoint register must be cleared within 1 second or a NMI interrupt
586
                              ; will occur. checkpoint should be called with a JSR so that the global ROM
587
                              ; routine is called.
588
                              ;
589
                              ; Modifies:
590
                              ;               none
591
                              ;------------------------------------------------------------------------------
592
 
593
                              checkpoint:
594 21 robfinch
 00FFE140 01507FFFFFFFFE1                 clr             $FFFFFFFE1      ; writing any value will do
595
 00FFE145 039                             rts
596 4 robfinch
 
597
                              ;------------------------------------------------------------------------------
598
                              ; Copy the system ROM to local RAM
599
                              ; Running the code from local RAM is probably an order of magnitude faster
600
                              ; then running from the global ROM. It also reduces the network traffic to
601
                              ; run from local RAM.
602
                              ;
603
                              ; Modifies:
604
                              ;               d,x,y
605
                              ;------------------------------------------------------------------------------
606
 
607
                              romToRam:
608 21 robfinch
 00FFE146 08EFFC000                       ldx             #$FFC000
609
 00FFE149 18E00C000                       ldy             #$00C000
610 4 robfinch
                              romToRam1:
611 21 robfinch
 00FFE14C 0EC801                          ldd             ,x++
612
 00FFE14E 0EDA01                          std             ,y++
613
 00FFE150 08C000000                       cmpx    #0
614
 00FFE153 026FF7                          bne             romToRam1
615
 00FFE155 039                             rts
616 4 robfinch
 
617
                              ;------------------------------------------------------------------------------
618
                              ; Multi-core sieve program.
619
                              ;------------------------------------------------------------------------------
620
 
621
                              ; First fill screen chars with 'P' indicating prime positions
622
                              ; Each core is responsible for the Nth position where N is the
623
                              ; core number minus two.
624
                              ;
625
                              multi_sieve:
626 21 robfinch
 00FFE156 086050                          lda             #'P'                                    ; indicate prime
627
 00FFE158 0150F6FFFFFFFE0                 ldb             COREID                          ; find out which core we are
628
 00FFE15D 0C0001                          subb    #FIRST_CORE
629
 00FFE15F 08E000000                       ldx             #0                                              ; start at first char of screen
630
 00FFE162 03A                             abx
631 4 robfinch
                              multi_sieve3:
632 21 robfinch
 00FFE163 0A7809E00000                    sta             TEXTSCR,x                       ; store 'P'
633
 00FFE167 030008                          leax    8,x                                             ; advance to next position
634
 00FFE169 08C000FFF                       cmpx    #4095
635
 00FFE16C 025FF5                          blo             multi_sieve3
636
 00FFE16E 0BDFFE140                       jsr             checkpoint
637 4 robfinch
*** warning 1: Long branch within short branch range could be optimized
638 21 robfinch
 00FFE171 0CB002                          addb    #2                                              ; start sieve at 2 (core id)
639
 00FFE173 08604E                          lda             #'N'                                    ; flag position value of 'N' for non-prime
640 4 robfinch
                              multi_sieve2:
641 21 robfinch
 00FFE175 08E000000                       ldx             #0
642
 00FFE178 03A                             abx                                                                     ; skip the first position - might be prime
643 4 robfinch
                              multi_sieve1:
644 21 robfinch
 00FFE179 03A                             abx                                                                     ; increment
645
 00FFE17A 0A7809E00000                    sta             TEXTSCR,x
646
 00FFE17E 08C000FFF                       cmpx    #4095
647
 00FFE181 025FF6                          blo             multi_sieve1
648
 00FFE183 0BDFFE140                       jsr             checkpoint
649 4 robfinch
*** warning 1: Long branch within short branch range could be optimized
650 21 robfinch
 00FFE186 0CB008                          addb    #8                                              ; number of cores working on it
651
 00FFE188 0C1FF0                          cmpb    #4080
652
 00FFE18A 025FE9                          blo             multi_sieve2
653 4 robfinch
                              multi_sieve4:                                   ; hang machine
654 21 robfinch
 00FFE18C 013                             sync
655
 00FFE18D 0160011CC                       lbra    Monitor
656 4 robfinch
 
657 13 robfinch
                              ;------------------------------------------------------------------------------
658
                              ; Single core sieve.
659
                              ;------------------------------------------------------------------------------
660
 
661 4 robfinch
                              sieve:
662 21 robfinch
 00FFE190 086050                          lda             #'P'                                    ; indicate prime
663
 00FFE192 08E000000                       ldx             #0                                              ; start at first char of screen
664 4 robfinch
                              sieve3:
665 21 robfinch
 00FFE195 0A7809E00000                    sta             TEXTSCR,x                       ; store 'P'
666
 00FFE199 030001                          inx                                                                     ; advance to next position
667
 00FFE19B 08C000FFF                       cmpx    #4095
668
 00FFE19E 025FF5                          blo             sieve3
669
 00FFE1A0 0C6002                          ldb             #2                                              ; start sieve at 2
670
 00FFE1A2 08604E                          lda             #'N'                                    ; flag position value of 'N' for non-prime
671 4 robfinch
                              sieve2:
672 21 robfinch
 00FFE1A4 08E000000                       ldx             #0
673
 00FFE1A7 03A                             abx                                                                     ; skip the first position - might be prime
674 4 robfinch
                              sieve1:
675 21 robfinch
 00FFE1A8 03A                             abx                                                                     ; increment
676
 00FFE1A9 0A7809E00000                    sta             TEXTSCR,x
677
 00FFE1AD 08C000FFF                       cmpx    #4095
678
 00FFE1B0 025FC7                          blo             multi_sieve1
679
 00FFE1B2 05C                             incb                                                            ; number of cores working on it
680
 00FFE1B3 0C1FF0                          cmpb    #4080
681
 00FFE1B5 025FED                          blo             sieve2
682 4 robfinch
                              sieve4:                                                         ; hang machine
683 21 robfinch
 00FFE1B7 039                             rts
684 4 robfinch
 
685
                              ;------------------------------------------------------------------------------
686
                              ; Three second delay for user convenience and to allow some devices time to
687
                              ; reset.
688
                              ;------------------------------------------------------------------------------
689
 
690
                              Delay3s:
691 21 robfinch
 00FFE1B8 0CC895440                       ldd             #9000000
692 4 robfinch
                              dly3s1:
693 21 robfinch
 00FFE1BB 0C10FF                          cmpb    #$FF
694
 00FFE1BD 026000                          bne             dly3s2
695 4 robfinch
                              dly3s2:
696 21 robfinch
 00FFE1BF 0150B7FFFE60001                 sta             LEDS
697
 00FFE1C4 083000001                       subd    #1
698
 00FFE1C7 026FF2                          bne             dly3s1
699
 00FFE1C9 039                             rts
700 4 robfinch
 
701
                              ;------------------------------------------------------------------------------
702
                              ;------------------------------------------------------------------------------
703
                              ShiftLeft5:
704 21 robfinch
 00FFE1CA 058                             aslb
705
 00FFE1CB 049                             rola
706
 00FFE1CC 058                             aslb
707
 00FFE1CD 049                             rola
708
 00FFE1CE 058                             aslb
709
 00FFE1CF 049                             rola
710
 00FFE1D0 058                             aslb
711
 00FFE1D1 049                             rola
712
 00FFE1D2 058                             aslb
713
 00FFE1D3 049                             rola
714
 00FFE1D4 039                             rts
715 4 robfinch
 
716
                              ;------------------------------------------------------------------------------
717 13 robfinch
                              ; Parameters:
718
                              ;               b = core id of core to copy
719 4 robfinch
                              ;------------------------------------------------------------------------------
720
                              ;
721
                              CopyVirtualScreenToScreen:
722 21 robfinch
 00FFE1D5 034076                          pshs    d,x,y,u
723 13 robfinch
                                      ; Compute virtual screen location for core passed in accb.
724 21 robfinch
 00FFE1D7 01F098                          tfr             b,a
725 16 robfinch
 00FFE1D9 048                             asla
726 21 robfinch
 00FFE1DA 048                             asla
727
 00FFE1DB 048                             asla
728
 00FFE1DC 048                             asla
729
 00FFE1DD 08AC00                          ora             #$C00
730
 00FFE1DF 05F                             clrb
731
 00FFE1E0 01F001                          tfr             d,x
732
 00FFE1E2 034006                          pshs    d
733
 00FFE1E4 18EE00000                       ldy             #TEXTSCR
734
 00FFE1E7 0CE000400                       ldu             #COLS*ROWS/2
735 4 robfinch
                              cv2s1:
736 21 robfinch
 00FFE1EA 0EC801                          ldd             ,x++
737
 00FFE1EC 0EDA01                          std             ,y++
738
 00FFE1EE 0335FF                          leau    -1,u
739
 00FFE1F0 283000000                       cmpu    #0
740
 00FFE1F3 026FF5                          bne             cv2s1
741 4 robfinch
                                      ; reset the cursor position in the text controller
742 21 robfinch
 00FFE1F5 035010                          puls    x
743
 00FFE1F7 0E6808110                       ldb             CursorRow,x
744
 00FFE1FA 086040                          lda             #COLS
745
 00FFE1FC 03D                             mul
746
 00FFE1FD 01F002                          tfr             d,y
747
 00FFE1FF 0E6808111                       ldb             CursorCol,x
748
 00FFE202 01F021                          tfr             y,x
749
 00FFE204 03A                             abx
750
 00FFE205 0150BFFFFE07F22                 stx             TEXTREG+TEXT_CURPOS
751
 00FFE20A 0350F6                          puls    d,x,y,u,pc
752 4 robfinch
 
753
                              ;------------------------------------------------------------------------------
754
                              ;------------------------------------------------------------------------------
755
                              ;
756
                              CopyScreenToVirtualScreen:
757 21 robfinch
 00FFE20C 034076                          pshs    d,x,y,u
758
 00FFE20E 08D08D                          bsr             GetScreenLocation
759
 00FFE210 01F002                          tfr             d,y
760
 00FFE212 08EE00000                       ldx             #TEXTSCR
761
 00FFE215 0CE000400                       ldu             #COLS*ROWS/2
762 4 robfinch
                              cs2v1:
763 21 robfinch
 00FFE218 0EC801                          ldd             ,x++
764
 00FFE21A 0EDA01                          std             ,y++
765
 00FFE21C 0335FF                          leau    -1,u
766
 00FFE21E 283000000                       cmpu    #0
767
 00FFE221 026FF5                          bne             cs2v1
768
 00FFE223 0350F6                          puls    d,x,y,u,pc
769 4 robfinch
 
770
                              ;------------------------------------------------------------------------------
771
                              ;------------------------------------------------------------------------------
772 21 robfinch
 00FFE225 054045058054053043052           fcb             "TEXTSCR "
773
 00FFE22C 020
774
 00FFE22D FFE237                          fcw             TextOpen
775
 00FFE22F FFE238                          fcw             TextClose
776
 00FFE231 FFE239                          fcw             TextRead
777
 00FFE233 FFE23A                          fcw             TextWrite
778
 00FFE235 FFE23B                          fcw             TextSeek
779 4 robfinch
 
780
                              TextOpen:
781 21 robfinch
 00FFE237 039                             rts
782 4 robfinch
                              TextClose:
783 21 robfinch
 00FFE238 039                             rts
784 4 robfinch
                              TextRead:
785 21 robfinch
 00FFE239 039                             rts
786 4 robfinch
                              TextWrite:
787 21 robfinch
 00FFE23A 039                             rts
788 4 robfinch
                              TextSeek:
789 21 robfinch
 00FFE23B 039                             rts
790 4 robfinch
 
791
                              ;------------------------------------------------------------------------------
792
                              ; Clear the screen and the screen color memory
793
                              ; We clear the screen to give a visual indication that the system
794
                              ; is working at all.
795
                              ;
796
                              ; Modifies:
797
                              ;               none
798
                              ;------------------------------------------------------------------------------
799
 
800
                              ClearScreen:
801 21 robfinch
 00FFE23C 034076                          pshs    d,x,y,u
802
 00FFE23E 08E000800                       ldx             #COLS*ROWS
803
 00FFE241 01F013                          tfr             x,u
804
 00FFE243 08D058                          bsr             GetScreenLocation
805
 00FFE245 01F002                          tfr             d,y
806
 00FFE247 0C6020                          ldb             #' '                            ; space char
807 4 robfinch
                              cs1:
808 21 robfinch
 00FFE249 0E7A00                          stb             ,y+                                     ; set text to space
809
 00FFE24B 0301FF                          leax    -1,x                            ; decrement x
810
 00FFE24D 026FFA                          bne             cs1
811
 00FFE24F 0150F6FFFFFFFE0                 ldb             COREID                  ; update colors only if we have focus
812
 00FFE254 0F1FFC010                       cmpb    IOFocusID
813
 00FFE257 02000D                          bra             cs3
814
 00FFE259 18EE02000                       ldy             #TEXTSCR+$2000
815 4 robfinch
                              ;       lda             CharColor
816 21 robfinch
 00FFE25C 0860CE                          lda             #$0CE
817
 00FFE25E 01F031                          tfr             u,x                                     ; get back count
818 4 robfinch
                              cs2:
819 21 robfinch
 00FFE260 0A7A00                          sta             ,y+
820
 00FFE262 0301FF                          dex                                                             ; decrement x
821
 00FFE264 026FFA                          bne             cs2
822 4 robfinch
                              cs3:
823 21 robfinch
 00FFE266 0350F6                          puls    d,x,y,u,pc
824 4 robfinch
 
825
                              ;------------------------------------------------------------------------------
826
                              ; Scroll text on the screen upwards
827
                              ;
828
                              ; Modifies:
829
                              ;               none
830
                              ;------------------------------------------------------------------------------
831
 
832
                              ScrollUp:
833 21 robfinch
 00FFE268 034076                          pshs    d,x,y,u
834
 00FFE26A 18E0003FF                       ldy             #(COLS*ROWS-1)/2        ; y = num chars/2 to move
835
 00FFE26D 08D02E                          bsr             GetScreenLocation
836
 00FFE26F 01F001                          tfr             d,x
837
 00FFE271 01F003                          tfr             d,u
838
 00FFE273 030040                          leax    COLS,x          ; x = index to source row
839 4 robfinch
                              scrup1:
840 21 robfinch
 00FFE275 0EC801                          ldd             ,x++                    ; move 2 characters
841
 00FFE277 0EDC01                          std             ,u++
842
 00FFE279 0313FF                          dey
843
 00FFE27B 026FF8                          bne             scrup1
844
 00FFE27D 08601F                          lda             #ROWS-1
845
 00FFE27F 08D002                          bsr             BlankLine
846
 00FFE281 0350F6                          puls    d,x,y,u,pc
847 4 robfinch
 
848
                              ;------------------------------------------------------------------------------
849
                              ; Blank out a line on the display
850
                              ;
851
                              ; Modifies:
852
                              ;               none
853
                              ; Parameters:
854
                              ;       acca = line number to blank
855
                              ;------------------------------------------------------------------------------
856
 
857
                              BlankLine:
858 21 robfinch
 00FFE283 034016                          pshs    d,x
859
 00FFE285 034002                          pshs    a
860
 00FFE287 08D014                          bsr             GetScreenLocation
861
 00FFE289 01F001                          tfr             d,x
862
 00FFE28B 035002                          puls    a
863
 00FFE28D 0C6040                          ldb             #COLS   ; b = # chars to blank out from video controller
864
 00FFE28F 03D                             mul                                     ; d = screen index (row# * #cols)
865
 00FFE290 03080B                          leax    d,x
866
 00FFE292 086020                          lda             #' '
867
 00FFE294 0C6040                          ldb             #COLS   ; b = # chars to blank out from video controller
868 4 robfinch
                              blnkln1:
869 21 robfinch
 00FFE296 0A7800                          sta             ,x+
870
 00FFE298 05A                             decb
871
 00FFE299 026FFB                          bne             blnkln1
872
 00FFE29B 035096                          puls    d,x,pc
873 4 robfinch
 
874
                              ;------------------------------------------------------------------------------
875
                              ; Get the location of the screen memory. The location
876
                              ; depends on whether or not the task has the output focus.
877
                              ;
878
                              ; Modifies:
879
                              ;               d
880
                              ; Retuns:
881
                              ;               d = screen location
882
                              ;------------------------------------------------------------------------------
883
 
884
                              GetScreenLocation:
885 21 robfinch
 00FFE29D 0150B6FFFFFFFE0                 lda             COREID                  ; which core are we?
886
 00FFE2A2 0B1FFC010                       cmpa    IOFocusID               ; do we have the IO focus
887
 00FFE2A5 026008                          bne             gsl1                            ; no, go pick virtual screen address
888
 00FFE2A7 081020                          cmpa    #$20                            ; CmodA709?
889
 00FFE2A9 027004                          beq             gsl1
890
 00FFE2AB 0CCE00000                       ldd             #TEXTSCR                ; yes, we update the real screen
891
 00FFE2AE 039                             rts
892 4 robfinch
                              gsl1:
893 21 robfinch
 00FFE2AF 0CC007800                       ldd             #$7800
894
 00FFE2B2 039                             rts
895 4 robfinch
 
896
                              ;------------------------------------------------------------------------------
897
                              ; HomeCursor
898
                              ; Set the cursor location to the top left of the screen.
899
                              ;
900
                              ; Modifies:
901
                              ;               none
902
                              ;------------------------------------------------------------------------------
903
 
904
                              HomeCursor:
905 21 robfinch
 00FFE2B3 034016                          pshs    d,x
906
 00FFE2B5 00F110                          clr             CursorRow
907
 00FFE2B7 00F111                          clr             CursorCol
908
 00FFE2B9 0150F6FFFFFFFE0                 ldb             COREID
909
 00FFE2BE 0F1FFC010                       cmpb    IOFocusID
910
 00FFE2C1 02600A                          bne             hc1
911
 00FFE2C3 0C1020                          cmpb    #$20
912
 00FFE2C5 027006                          beq             hc1
913
 00FFE2C7 04F                             clra
914
 00FFE2C8 0150B7FFFE07F22                 sta             TEXTREG+TEXT_CURPOS
915 4 robfinch
                              hc1:
916 21 robfinch
 00FFE2CD 035096                          puls    d,x,pc
917 4 robfinch
 
918
                              ;------------------------------------------------------------------------------
919
                              ; Update the cursor position in the text controller based on the
920
                              ;  CursorRow,CursorCol.
921
                              ;
922
                              ; Modifies:
923
                              ;               none
924
                              ;------------------------------------------------------------------------------
925
                              ;
926
                              UpdateCursorPos:
927 21 robfinch
 00FFE2CF 034016                          pshs    d,x
928
 00FFE2D1 0150F6FFFFFFFE0                 ldb             COREID                          ; update cursor position in text controller
929
 00FFE2D6 0F1FFC010                       cmpb    IOFocusID                       ; only for the task with the output focus
930
 00FFE2D9 026018                          bne             ucp1
931
 00FFE2DB 0C1020                          cmpb    #$20                                    ; and not for CmodA709
932
 00FFE2DD 027014                          beq             ucp1
933
 00FFE2DF 096110                          lda             CursorRow
934
 00FFE2E1 08403F                          anda    #$3F                                    ; limit of 63 rows
935
 00FFE2E3 0150F6FFFE07F00                 ldb             TEXTREG+TEXT_COLS
936
 00FFE2E8 03D                             mul
937
 00FFE2E9 01F001                          tfr             d,x
938
 00FFE2EB 0D6111                          ldb             CursorCol
939
 00FFE2ED 03A                             abx
940
 00FFE2EE 0150BFFFFE07F22                 stx             TEXTREG+TEXT_CURPOS
941 4 robfinch
                              ucp1:
942 21 robfinch
 00FFE2F3 035096                          puls    d,x,pc
943 4 robfinch
 
944
                              ;------------------------------------------------------------------------------
945
                              ; Calculate screen memory location from CursorRow,CursorCol.
946
                              ; Also refreshes the cursor location.
947
                              ;
948
                              ; Modifies:
949
                              ;               d
950
                              ; Returns:
951
                              ;       d = screen location
952
                              ;------------------------------------------------------------------------------
953
                              ;
954
                              CalcScreenLoc:
955 21 robfinch
 00FFE2F5 034010                          pshs    x
956
 00FFE2F7 096110                          lda             CursorRow
957
 00FFE2F9 0C6040                          ldb             #COLS
958
 00FFE2FB 03D                             mul
959
 00FFE2FC 01F001                          tfr             d,x
960
 00FFE2FE 0D6111                          ldb             CursorCol
961
 00FFE300 03A                             abx
962
 00FFE301 0150F6FFFFFFFE0                 ldb             COREID                          ; update cursor position in text controller
963
 00FFE306 0F1FFC010                       cmpb    IOFocusID                       ; only for the task with the output focus
964
 00FFE309 026009                          bne             csl1
965
 00FFE30B 0C1020                          cmpb    #$20
966
 00FFE30D 027005                          beq             csl1
967
 00FFE30F 0150BFFFFE07F22                 stx             TEXTREG+TEXT_CURPOS
968 4 robfinch
                              csl1:
969 21 robfinch
 00FFE314 08DF87                          bsr             GetScreenLocation
970
 00FFE316 03080B                          leax    d,x
971
 00FFE318 01F010                          tfr             x,d
972
 00FFE31A 035090                          puls    x,pc
973 4 robfinch
 
974
                              ;------------------------------------------------------------------------------
975
                              ; Display a character on the screen.
976
                              ; If the task doesn't have the I/O focus then the character is written to
977
                              ; the virtual screen.
978
                              ;
979
                              ; Modifies:
980
                              ;               none
981
                              ; Parameters:
982
                              ;       accb = char to display
983
                              ;------------------------------------------------------------------------------
984
                              ;
985
                              DisplayChar:
986 21 robfinch
 00FFE31C 01700097B                       lbsr    SerialPutChar
987
                              ScreenDisplayChar:
988
 00FFE31F 034016                          pshs    d,x
989
 00FFE321 0C100D                          cmpb    #CR                                     ; carriage return ?
990
 00FFE323 026007                          bne             dccr
991
 00FFE325 00F111                          clr             CursorCol               ; just set cursor column to zero on a CR
992
 00FFE327 08DFA6                          bsr             UpdateCursorPos
993 4 robfinch
                              dcx14:
994 21 robfinch
 00FFE329 01600008C                       lbra            dcx4
995 4 robfinch
                              dccr:
996 21 robfinch
 00FFE32C 0C1091                          cmpb    #$91                            ; cursor right ?
997
 00FFE32E 02600D                          bne             dcx6
998
 00FFE330 096111                          lda             CursorCol
999
 00FFE332 081040                          cmpa    #COLS
1000
 00FFE334 024003                          bhs             dcx7
1001
 00FFE336 04C                             inca
1002
 00FFE337 097111                          sta             CursorCol
1003 4 robfinch
                              dcx7:
1004 21 robfinch
 00FFE339 08DF94                          bsr             UpdateCursorPos
1005
 00FFE33B 035096                          puls    d,x,pc
1006 4 robfinch
                              dcx6:
1007 21 robfinch
 00FFE33D 0C1090                          cmpb    #$90                            ; cursor up ?
1008
 00FFE33F 026009                          bne             dcx8
1009
 00FFE341 096110                          lda             CursorRow
1010
 00FFE343 027FF4                          beq             dcx7
1011
 00FFE345 04A                             deca
1012
 00FFE346 097110                          sta             CursorRow
1013
 00FFE348 020FEF                          bra             dcx7
1014 4 robfinch
                              dcx8:
1015 21 robfinch
 00FFE34A 0C1093                          cmpb    #$93                            ; cursor left ?
1016
 00FFE34C 026009                          bne             dcx9
1017
 00FFE34E 096111                          lda             CursorCol
1018
 00FFE350 027FE7                          beq             dcx7
1019
 00FFE352 04A                             deca
1020
 00FFE353 097111                          sta             CursorCol
1021
 00FFE355 020FE2                          bra             dcx7
1022 4 robfinch
                              dcx9:
1023 21 robfinch
 00FFE357 0C1092                          cmpb    #$92                            ; cursor down ?
1024
 00FFE359 02600B                          bne             dcx10
1025
 00FFE35B 096110                          lda             CursorRow
1026
 00FFE35D 081020                          cmpa    #ROWS
1027
 00FFE35F 027FD8                          beq             dcx7
1028
 00FFE361 04C                             inca
1029
 00FFE362 097110                          sta             CursorRow
1030
 00FFE364 020FD3                          bra             dcx7
1031 4 robfinch
                              dcx10:
1032 21 robfinch
 00FFE366 0C1094                          cmpb    #$94                            ; cursor home ?
1033
 00FFE368 02600C                          bne             dcx11
1034
 00FFE36A 096111                          lda             CursorCol
1035
 00FFE36C 027004                          beq             dcx12
1036
 00FFE36E 00F111                          clr             CursorCol
1037
 00FFE370 020FC7                          bra             dcx7
1038 4 robfinch
                              dcx12:
1039 21 robfinch
 00FFE372 00F110                          clr             CursorRow
1040
 00FFE374 020FC3                          bra             dcx7
1041 4 robfinch
                              dcx11:
1042 21 robfinch
 00FFE376 0C1099                          cmpb    #$99                            ; delete ?
1043
 00FFE378 026008                          bne             dcx13
1044
 00FFE37A 08DF79                          bsr             CalcScreenLoc
1045
 00FFE37C 01F001                          tfr             d,x
1046
 00FFE37E 096111                          lda             CursorCol               ; acc = cursor column
1047
 00FFE380 020011                          bra             dcx5
1048 4 robfinch
                              dcx13
1049 21 robfinch
 00FFE382 0C1008                          cmpb    #CTRLH                  ; backspace ?
1050
 00FFE384 02601E                          bne             dcx3
1051
 00FFE386 096111                          lda             CursorCol
1052
 00FFE388 02702E                          beq             dcx4
1053
 00FFE38A 04A                             deca
1054
 00FFE38B 097111                          sta             CursorCol
1055
 00FFE38D 08DF66                          bsr             CalcScreenLoc
1056
 00FFE38F 01F001                          tfr             d,x
1057
 00FFE391 096111                          lda             CursorCol
1058 4 robfinch
                              dcx5:
1059 21 robfinch
 00FFE393 0E6001                          ldb             1,x
1060
 00FFE395 0E7801                          stb             ,x++
1061
 00FFE397 04C                             inca
1062
 00FFE398 081040                          cmpa    #COLS
1063
 00FFE39A 025FF7                          blo             dcx5
1064
 00FFE39C 0C6020                          ldb             #' '
1065
 00FFE39E 0301FF                          dex
1066
 00FFE3A0 0E7804                          stb             ,x
1067
 00FFE3A2 020014                          bra             dcx4
1068 4 robfinch
                              dcx3:
1069 21 robfinch
 00FFE3A4 0C100A                          cmpb    #LF                             ; linefeed ?
1070
 00FFE3A6 02700E                          beq             dclf
1071
 00FFE3A8 034004                          pshs    b
1072
 00FFE3AA 08DF49                          bsr     CalcScreenLoc
1073
 00FFE3AC 01F001                          tfr             d,x
1074
 00FFE3AE 035004                          puls    b
1075
 00FFE3B0 0E7804                          stb             ,x
1076 4 robfinch
                                      ; ToDo character color
1077
                              ;       lda             CharColor
1078
                              ;       sta             $2000,x
1079 21 robfinch
 00FFE3B2 08D006                          bsr             IncCursorPos
1080
 00FFE3B4 020002                          bra             dcx4
1081 4 robfinch
                              dclf:
1082 21 robfinch
 00FFE3B6 08D011                          bsr             IncCursorRow
1083 4 robfinch
                              dcx4:
1084 21 robfinch
 00FFE3B8 035096                          puls    d,x,pc
1085 4 robfinch
 
1086
                              ;------------------------------------------------------------------------------
1087
                              ; Increment the cursor position, scroll the screen if needed.
1088
                              ;
1089
                              ; Modifies:
1090
                              ;               none
1091
                              ;------------------------------------------------------------------------------
1092
 
1093
                              IncCursorPos:
1094 21 robfinch
 00FFE3BA 034016                          pshs    d,x
1095
 00FFE3BC 096111                          lda             CursorCol
1096
 00FFE3BE 04C                             inca
1097
 00FFE3BF 097111                          sta             CursorCol
1098
 00FFE3C1 081040                          cmpa    #COLS
1099
 00FFE3C3 025014                          blo             icc1
1100
 00FFE3C5 00F111                          clr             CursorCol               ; column = 0
1101
 00FFE3C7 020002                          bra             icr1
1102 4 robfinch
                              IncCursorRow:
1103 21 robfinch
 00FFE3C9 034016                          pshs    d,x
1104 4 robfinch
                              icr1:
1105 21 robfinch
 00FFE3CB 096110                          lda             CursorRow
1106
 00FFE3CD 04C                             inca
1107
 00FFE3CE 097110                          sta             CursorRow
1108
 00FFE3D0 081020                          cmpa    #ROWS
1109
 00FFE3D2 025005                          blo             icc1
1110
 00FFE3D4 04A                             deca                                                    ; backup the cursor row, we are scrolling up
1111
 00FFE3D5 097110                          sta             CursorRow
1112
 00FFE3D7 08DE8F                          bsr             ScrollUp
1113 4 robfinch
                              icc1:
1114 21 robfinch
 00FFE3D9 08DEF4                          bsr             UpdateCursorPos
1115 4 robfinch
                              icc2:
1116 21 robfinch
 00FFE3DB 035096                          puls    d,x,pc
1117 4 robfinch
 
1118
                              ;------------------------------------------------------------------------------
1119
                              ; Display a string on the screen.
1120
                              ;
1121
                              ; Modifies:
1122
                              ;               none
1123
                              ; Parameters:
1124
                              ;               d = pointer to string
1125
                              ;------------------------------------------------------------------------------
1126
                              ;
1127
                              DisplayString:
1128 21 robfinch
 00FFE3DD 034016                          pshs    d,x
1129
 00FFE3DF 01F001                          tfr             d,x
1130
 00FFE3E1 0150B6FFFFFFFE0                 lda             COREID
1131
 00FFE3E6 081020                          cmpa    #$20
1132
 00FFE3E8 027005                          beq             dspj1B
1133 13 robfinch
                              dspj2:                                          ; lock semaphore for access
1134 21 robfinch
 00FFE3EA 0B6EF0001                       lda             OUTSEMA+1
1135
 00FFE3ED 027FFB                          beq             dspj2
1136 4 robfinch
                              dspj1B:
1137 21 robfinch
 00FFE3EF 0E6800                          ldb             ,x+                             ; move string char into acc
1138
 00FFE3F1 027005                          beq             dsretB          ; is it end of string ?
1139
 00FFE3F3 017000DD3                       lbsr    OUTCH                   ; display character
1140
 00FFE3F6 020FF7                          bra             dspj1B
1141 4 robfinch
                              dsretB:
1142 21 robfinch
 00FFE3F8 07FEF0001                       clr             OUTSEMA+1       ; unlock semaphore
1143
 00FFE3FB 035096                          puls    d,x,pc
1144 4 robfinch
 
1145
                              DisplayStringCRLF:
1146 21 robfinch
 00FFE3FD 034006                          pshs    d
1147
 00FFE3FF 08DFDC                          bsr             DisplayString
1148
 00FFE401 0C600D                          ldb             #CR
1149
 00FFE403 017000DC3                       lbsr    OUTCH
1150
 00FFE406 0C600A                          ldb             #LF
1151
 00FFE408 017000DBE                       lbsr    OUTCH
1152
 00FFE40B 035086                          puls    d,pc
1153 4 robfinch
 
1154
                              ;
1155
                              ; PRINT CR, LF, STRING
1156
                              ;
1157
                              PSTRNG
1158 21 robfinch
 00FFE40D 08D002                          BSR             PCRLF
1159
 00FFE40F 02000D                          BRA             PDATA
1160 4 robfinch
                              PCRLF
1161 21 robfinch
 00FFE411 034010                          PSHS    X
1162
 00FFE413 08EFFE425                       LDX             #CRLFST
1163
 00FFE416 08D006                          BSR             PDATA
1164
 00FFE418 035010                          PULS    X
1165
 00FFE41A 039                             RTS
1166 4 robfinch
 
1167
                              PRINT
1168 21 robfinch
 00FFE41B 0BDFFF1C9                       JSR             OUTCH
1169 4 robfinch
                              PDATA
1170 21 robfinch
 00FFE41E 0E6800                          LDB             ,X+
1171
 00FFE420 0C1004                          CMPB    #$04
1172
 00FFE422 026FF7                          BNE             PRINT
1173
 00FFE424 039                             RTS
1174 4 robfinch
 
1175
                              CRLFST
1176 21 robfinch
 00FFE425 00D00A004                       fcb     CR,LF,4
1177 4 robfinch
 
1178
                              DispDWordAsHex:
1179 21 robfinch
 00FFE428 08D007                          bsr             DispWordAsHex
1180
 00FFE42A 01E001                          exg             d,x
1181
 00FFE42C 08D003                          bsr             DispWordAsHex
1182
 00FFE42E 01E001                          exg             d,x
1183
 00FFE430 039                             rts
1184 4 robfinch
 
1185
                              DispWordAsHex:
1186 21 robfinch
 00FFE431 01E089                          exg             a,b
1187
 00FFE433 08D005                          bsr             DispByteAsHex
1188
 00FFE435 01E089                          exg             a,b
1189
 00FFE437 08D001                          bsr             DispByteAsHex
1190
 00FFE439 039                             rts
1191 4 robfinch
 
1192
                              DispByteAsHex:
1193 21 robfinch
 00FFE43A 034004                    pshs  b
1194 16 robfinch
 00FFE43C 054                             lsrb
1195
 00FFE43D 054                             lsrb
1196
 00FFE43E 054                             lsrb
1197
 00FFE43F 054                             lsrb
1198
 00FFE440 054                             lsrb
1199 21 robfinch
 00FFE441 054                             lsrb
1200
 00FFE442 054                             lsrb
1201
 00FFE443 054                             lsrb
1202
 00FFE444 08D00C                          bsr             DispNyb
1203
 00FFE446 035004                          puls    b
1204
 00FFE448 034004                          pshs    b
1205 16 robfinch
 00FFE44A 054                             lsrb
1206 21 robfinch
 00FFE44B 054                             lsrb
1207
 00FFE44C 054                             lsrb
1208
 00FFE44D 054                             lsrb
1209
 00FFE44E 08D002                          bsr             DispNyb
1210
 00FFE450 035004                          puls    b
1211 4 robfinch
 
1212
                              DispNyb
1213 21 robfinch
 00FFE452 034004                          pshs    b
1214
 00FFE454 0C400F                          andb    #$0F
1215
 00FFE456 0C100A                          cmpb    #10
1216
 00FFE458 025007                          blo             DispNyb1
1217
 00FFE45A 0CB037                          addb    #'A'-10
1218
 00FFE45C 017000D6A                       lbsr    OUTCH
1219
 00FFE45F 035084                          puls    b,pc
1220 4 robfinch
                              DispNyb1
1221 21 robfinch
 00FFE461 0CB030                          addb    #'0'
1222
 00FFE463 017000D63                       lbsr    OUTCH
1223
 00FFE466 035084                          puls    b,pc
1224 4 robfinch
 
1225
                              ;==============================================================================
1226 13 robfinch
                              ; Timer
1227
                              ;==============================================================================
1228
 
1229
                              ; ============================================================================
1230
                              ;        __
1231
                              ;   \\__/ o\    (C) 2022  Robert Finch, Waterloo
1232
                              ;    \  __ /    All rights reserved.
1233
                              ;     \/_//     robfinch@opencores.org
1234
                              ;       ||
1235
                              ;
1236
                              ;
1237
                              ; Timer routines for a WDC6522 compatible circuit.
1238
                              ;
1239
                              ; This source file is free software: you can redistribute it and/or modify
1240
                              ; it under the terms of the GNU Lesser General Public License as published
1241
                              ; by the Free Software Foundation, either version 3 of the License, or
1242
                              ; (at your option) any later version.
1243
                              ;
1244
                              ; This source file is distributed in the hope that it will be useful,
1245
                              ; but WITHOUT ANY WARRANTY; without even the implied warranty of
1246
                              ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1247
                              ; GNU General Public License for more details.
1248
                              ;
1249
                              ; You should have received a copy of the GNU General Public License
1250
                              ; along with this program.  If not, see .
1251
                              ;
1252
                              ; ============================================================================
1253
                              ;
1254
                              TimerInit:
1255 21 robfinch
 00FFE468 0CC061A80                       ldd             #$61A80                                 ; compare to 400000 (100 Hz assuming 40MHz clock)
1256
 00FFE46B 0150F7FFFE60014                 stb             VIA+VIA_T3CMPL
1257
 00FFE470 0150B7FFFE60015                 sta             VIA+VIA_T3CMPH
1258
 00FFE475 01507FFFFE60012                 clr             VIA+VIA_T3LL
1259
 00FFE47A 01507FFFFE60013                 clr             VIA+VIA_T3LH
1260
 00FFE47F 0150B6FFFE6000B                 lda             VIA+VIA_ACR                     ; set continuous mode for timer
1261
 00FFE484 08A100                          ora             #$100
1262
 00FFE486 0150B7FFFE6000B                 sta             VIA+VIA_ACR
1263
 00FFE48B 086880                          lda             #$880                                           ; enable timer #3 interrupts
1264
 00FFE48D 0150B7FFFE6000E                 sta             VIA+VIA_IER
1265
 00FFE492 039                             rts
1266 13 robfinch
 
1267
                              TimerIRQ:
1268
                                      ; Reset the edge sense circuit in the PIC
1269 21 robfinch
 00FFE493 08601F                          lda             #31                                                     ; Timer is IRQ #31
1270 16 robfinch
 00FFE495 0150B7FFFE3F010                 sta             PIC+16                                  ; register 16 is edge sense reset reg
1271 21 robfinch
 00FFE49A 0150B6FFFE3F0FF                 lda             PIC+$FF                                 ; Timer active interrupt flag
1272
 00FFE49F 027041                          beq             notTimerIRQ
1273
 00FFE4A1 01507FFFFE3F0FF                 clr             PIC+$FF                                 ; clear the flag
1274
 00FFE4A6 08601F                          lda             #31                                                     ; Timer is IRQ #31
1275
 00FFE4A8 0B7FFC011                       sta             IrqSource               ; stuff a byte indicating the IRQ source for PEEK()
1276
 00FFE4AB 01507FFFFE60012                 clr             VIA+VIA_T3LL            ; should clear the interrupt
1277
 00FFE4B0 01507FFFFE60013                 clr             VIA+VIA_T3LH
1278
 00FFE4B5 08601F                          lda             #31                                                     ; Timer is IRQ #31
1279
 00FFE4B7 0150B7FFFE3F010                 sta             PIC+16                                  ; register 16 is edge sense reset reg
1280
 00FFE4BC 01507FFFFE3F0FF                 clr             PIC+$FF                                 ; clear the flag
1281
 00FFE4C1 07CE0003F                       inc             $E0003F                                 ; update timer IRQ screen flag
1282
 00FFE4C4 0FCFFC016                       ldd             milliseconds+2
1283
 00FFE4C7 0C300000A                       addd    #10
1284
 00FFE4CA 0FDFFC016                       std             milliseconds+2
1285
 00FFE4CD 0FCFFC014                       ldd             milliseconds
1286
 00FFE4D0 0C9000                          adcb    #0
1287
 00FFE4D2 0F7FFC015                       stb             milliseconds+1
1288
 00FFE4D5 089000                          adca    #0
1289
 00FFE4D7 0B7FFC014                       sta             milliseconds
1290
 
1291
                                      ; Update XModem timer, we just always do it rather than testing if XModem
1292
                                      ; is active. The increment is set to give approximately 3s before the MSB
1293
                                      ; gets set.
1294
 00FFE4DA 0F6FFC020                       ldb             xm_timer
1295
 00FFE4DD 0CB004                          addb    #4
1296
 00FFE4DF 0F7FFC020                       stb             xm_timer
1297 13 robfinch
                              notTimerIRQ:
1298 21 robfinch
 00FFE4E2 039                             rts
1299 13 robfinch
 
1300
                              ; ============================================================================
1301
                              ;        __
1302
                              ;   \\__/ o\    (C) 2013-2022  Robert Finch, Waterloo
1303
                              ;    \  __ /    All rights reserved.
1304
                              ;     \/_//     robfinch@opencores.org
1305
                              ;       ||
1306
                              ;
1307
                              ;
1308
                              ; BSD 3-Clause License
1309
                              ; Redistribution and use in source and binary forms, with or without
1310
                              ; modification, are permitted provided that the following conditions are met:
1311
                              ;
1312
                              ; 1. Redistributions of source code must retain the above copyright notice, this
1313
                              ;    list of conditions and the following disclaimer.
1314
                              ;
1315
                              ; 2. Redistributions in binary form must reproduce the above copyright notice,
1316
                              ;    this list of conditions and the following disclaimer in the documentation
1317
                              ;    and/or other materials provided with the distribution.
1318
                              ;
1319
                              ; 3. Neither the name of the copyright holder nor the names of its
1320
                              ;    contributors may be used to endorse or promote products derived from
1321
                              ;    this software without specific prior written permission.
1322
                              ;
1323
                              ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1324
                              ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1325
                              ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1326
                              ; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
1327
                              ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1328
                              ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
1329
                              ; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
1330
                              ; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
1331
                              ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1332
                              ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1333
                              ;
1334
                              ; ============================================================================
1335
                              ;
1336
                              ;===============================================================================
1337
                              ; Generic I2C routines
1338
                              ;
1339
                              ; It is assumed there may be more than one I2C controller in the system, so
1340
                              ; the address of the controller is passed in the X register.
1341
                              ;===============================================================================
1342
 
1343
                              I2C_PREL        EQU             $0
1344
                              I2C_PREH        EQU             $1
1345
                              I2C_CTRL        EQU             $2
1346
                              I2C_RXR         EQU             $3
1347
                              I2C_TXR         EQU             $3
1348
                              I2C_CMD         EQU             $4
1349
                              I2C_STAT        EQU             $4
1350
 
1351
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1352
                              ; i2c initialization, sets the clock prescaler
1353
                              ;
1354
                              ; Parameters:
1355
                              ;               x = I2C controller address
1356
                              ; Returns: none
1357
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1358
 
1359 15 robfinch
                              i2c_init:
1360 21 robfinch
 00FFE4E3 034004                          pshs    b
1361
 00FFE4E5 0C6004                          ldb             #4                                                                      ; setup prescale for 400kHz clock
1362
 00FFE4E7 0E7804                          stb             I2C_PREL,x
1363
 00FFE4E9 06F001                          clr             I2C_PREH,x
1364
 00FFE4EB 035084                          puls    b,pc
1365 13 robfinch
 
1366
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1367
                              ; Wait for I2C transfer to complete
1368
                              ;
1369
                              ; Parameters
1370
                              ;       x - I2C controller base address
1371
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1372
 
1373
                              i2c_wait_tip:
1374 21 robfinch
 00FFE4ED 034004                          pshs            b
1375 13 robfinch
                              i2cw1:
1376 21 robfinch
 00FFE4EF 0E6004                          ldb                     I2C_STAT,x              ; would use lvb, but lb is okay since its the I/O area
1377
 00FFE4F1 0C5001                          bitb            #1                                              ; wait for tip to clear
1378
 00FFE4F3 026FFA                          bne                     i2cw1
1379
 00FFE4F5 035084                          puls            b,pc
1380 13 robfinch
 
1381
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1382
                              ; Write command to i2c
1383
                              ;
1384
                              ; Parameters
1385
                              ;               accb - data to transmit
1386
                              ;               acca - command value
1387
                              ;               x       - I2C controller base address
1388
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1389
 
1390
                              i2c_wr_cmd:
1391 21 robfinch
 00FFE4F7 0E7003                          stb             I2C_TXR,x
1392
 00FFE4F9 0A7004                          sta             I2C_CMD,x
1393
 00FFE4FB 08DFF0                          bsr             i2c_wait_tip
1394
 00FFE4FD 0E6004                          ldb             I2C_STAT,x
1395
 00FFE4FF 039                             rts
1396 13 robfinch
 
1397
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1398
                              ; Parameters
1399
                              ;               x - I2C controller base address
1400
                              ;               accb - data to send
1401
                              ; Returns: none
1402
                              ; Stack space: 2 words
1403
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1404
 
1405 15 robfinch
                              i2c_xmit1:
1406 21 robfinch
 00FFE500 034006                          pshs    d                                                               ; save data value
1407
 00FFE502 034006                          pshs    d                                                               ; and save it again
1408
 00FFE504 0C6001                          ldb             #1
1409
 00FFE506 0E7002                          stb             I2C_CTRL,x                      ; enable the core
1410
 00FFE508 0C6076                          ldb             #$76                                            ; set slave address = %0111011
1411
 00FFE50A 086090                          lda             #$90                                            ; set STA, WR
1412
 00FFE50C 08DFE9                          bsr             i2c_wr_cmd
1413
 00FFE50E 08D00A                          bsr             i2c_wait_rx_nack
1414
 00FFE510 035006                          puls    d                                                               ; get back data value
1415
 00FFE512 086050                          lda             #$50                                            ; set STO, WR
1416
 00FFE514 08DFE1                          bsr             i2c_wr_cmd
1417
 00FFE516 08D002                          bsr             i2c_wait_rx_nack
1418
 00FFE518 035086                          puls    d,pc
1419 13 robfinch
 
1420
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1421
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1422
 
1423
                              i2c_wait_rx_nack:
1424 21 robfinch
 00FFE51A 034004                          pshs    b                                                               ; save off accb
1425 13 robfinch
                              i2cwr1:
1426 21 robfinch
 00FFE51C 0E6004                          ldb             I2C_STAT,x                      ; wait for RXack = 0
1427
 00FFE51E 0C5080                          bitb    #$80                                            ; test for nack
1428
 00FFE520 026FFA                          bne             i2cwr1
1429
 00FFE522 035084                          puls    b,pc
1430 13 robfinch
 
1431
                              ; ============================================================================
1432
                              ;        __
1433
                              ;   \\__/ o\    (C) 2022  Robert Finch, Waterloo
1434
                              ;    \  __ /    All rights reserved.
1435
                              ;     \/_//     robfinch@opencores.org
1436
                              ;       ||
1437
                              ;
1438
                              ;
1439
                              ; BSD 3-Clause License
1440
                              ; Redistribution and use in source and binary forms, with or without
1441
                              ; modification, are permitted provided that the following conditions are met:
1442
                              ;
1443
                              ; 1. Redistributions of source code must retain the above copyright notice, this
1444
                              ;    list of conditions and the following disclaimer.
1445
                              ;
1446
                              ; 2. Redistributions in binary form must reproduce the above copyright notice,
1447
                              ;    this list of conditions and the following disclaimer in the documentation
1448
                              ;    and/or other materials provided with the distribution.
1449
                              ;
1450
                              ; 3. Neither the name of the copyright holder nor the names of its
1451
                              ;    contributors may be used to endorse or promote products derived from
1452
                              ;    this software without specific prior written permission.
1453
                              ;
1454
                              ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1455
                              ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1456
                              ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1457
                              ; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
1458
                              ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1459
                              ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
1460
                              ; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
1461
                              ; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
1462
                              ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1463
                              ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1464
                              ;
1465
                              ; ============================================================================
1466
 
1467
                              ;===============================================================================
1468
                              ; Realtime clock routines
1469
                              ;===============================================================================
1470
 
1471
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1472
                              ; Read the real-time-clock chip.
1473
                              ;
1474
                              ; The entire contents of the clock registers and sram are read into a buffer
1475
                              ; in one-shot rather than reading the registers individually.
1476
                              ;
1477
                              ; Parameters: none
1478
                              ; Returns: d = 0 on success, otherwise non-zero
1479
                              ; Modifies: d and RTCBuf
1480
                              ; Stack space: 6 words
1481
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1482
 
1483
                              rtc_read:
1484 21 robfinch
 00FFE524 08EE30500                       ldx                     #RTC
1485
 00FFE527 18E007FC0                       ldy                     #RTCBuf
1486
 00FFE52A 0C6080                          ldb                     #$80
1487
 00FFE52C 0E7002                          stb                     I2C_CTRL,x              ; enable I2C
1488
 00FFE52E 0CC0900DE                       ldd                     #$900DE                         ; read address, write op, STA + wr bit
1489
 00FFE531 08DFC4                          bsr                     i2c_wr_cmd
1490
 00FFE533 0C5080                          bitb            #$80
1491
 00FFE535 02603C                          bne                     rtc_rxerr
1492
 00FFE537 0CC010000                       ldd                     #$10000                         ; address zero, wr bit
1493
 00FFE53A 08DFBB                          bsr                     i2c_wr_cmd
1494
 00FFE53C 0C5080                          bitb            #$80
1495
 00FFE53E 026033                          bne                     rtc_rxerr
1496
 00FFE540 0CC0900DF                       ldd                     #$900DF                         ; read address, read op, STA + wr bit
1497
 00FFE543 08DFB2                          bsr                     i2c_wr_cmd
1498
 00FFE545 0C5080                          bitb            #$80
1499
 00FFE547 02602A                          bne                     rtc_rxerr
1500 13 robfinch
 
1501 21 robfinch
 00FFE549 05F                             clrb
1502 13 robfinch
                              rtcr0001:
1503 21 robfinch
 00FFE54A 086020                          lda                     #$20
1504
 00FFE54C 0A7004                          sta                     I2C_CMD,x                       ; rd bit
1505
 00FFE54E 08DF9D                          bsr                     i2c_wait_tip
1506
 00FFE550 08DFC8                          bsr                     i2c_wait_rx_nack
1507
 00FFE552 0A6004                          lda                     I2C_STAT,x
1508
 00FFE554 085080                          bita            #$80
1509
 00FFE556 02601B                          bne                     rtc_rxerr
1510
 00FFE558 0A6003                          lda                     I2C_RXR,x
1511
 00FFE55A 0A7A07                          sta                     b,y
1512
 00FFE55C 05C                             incb
1513
 00FFE55D 0C105F                          cmpb            #$5F
1514
 00FFE55F 025FE9                          blo                     rtcr0001
1515
 00FFE561 086068                          lda                     #$68
1516
 00FFE563 0A7004                          sta                     I2C_CMD,x                       ; STO, rd bit + nack
1517
 00FFE565 08DF86                          bsr                     i2c_wait_tip
1518
 00FFE567 0A6004                          lda                     I2C_STAT,x
1519
 00FFE569 085080                          bita            #$80
1520
 00FFE56B 026006                          bne                     rtc_rxerr
1521
 00FFE56D 0A6003                          lda                     I2C_RXR,x
1522
 00FFE56F 0A7A07                          sta                     b,y
1523
 00FFE571 04F05F                          clrd                                                                    ; return 0
1524 13 robfinch
                              rtc_rxerr:
1525 21 robfinch
 00FFE573 06F002                          clr                     I2C_CTRL,x      ; disable I2C and return status
1526
 00FFE575 04F                             clra
1527
 00FFE576 039                             rts
1528 13 robfinch
 
1529
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1530
                              ; Write the real-time-clock chip.
1531
                              ;
1532
                              ; The entire contents of the clock registers and sram are written from a
1533
                              ; buffer (RTCBuf) in one-shot rather than writing the registers individually.
1534
                              ;
1535
                              ; Parameters: none
1536
                              ; Returns: r1 = 0 on success, otherwise non-zero
1537
                              ; Modifies: r1 and RTCBuf
1538
                              ; Stack space: 6 words
1539
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1540
 
1541
                              rtc_write:
1542 21 robfinch
 00FFE577 08EE30500                       ldx             #RTC
1543
 00FFE57A 18E007FC0                       ldy             #RTCBuf
1544 13 robfinch
 
1545 21 robfinch
 00FFE57D 0C6080                          ldb             #$80
1546
 00FFE57F 0E7002                          stb             I2C_CTRL,x              ; enable I2C
1547
 00FFE581 0CC0900DE                       ldd             #$900DE                         ; read address, write op, STA + wr bit
1548
 00FFE584 08DF71                          bsr             i2c_wr_cmd
1549
 00FFE586 0C5080                          bitb    #$80
1550
 00FFE588 026FE9                          bne             rtc_rxerr
1551
 00FFE58A 0CC010000                       ldd             #$10000                         ; address zero, wr bit
1552
 00FFE58D 08DF68                          bsr             i2c_wr_cmd
1553
 00FFE58F 0C5080                          bitb    #$80
1554
 00FFE591 026FE0                          bne             rtc_rxerr
1555 13 robfinch
 
1556 21 robfinch
 00FFE593 0C6000                          ldb             #0
1557 13 robfinch
                              rtcw0001:
1558 21 robfinch
 00FFE595 034004                          pshs    b
1559
 00FFE597 0E6A05                          ldb             b,y
1560
 00FFE599 086010                          lda             #$10
1561
 00FFE59B 08DF5A                          bsr             i2c_wr_cmd
1562
 00FFE59D 0C5080                          bitb    #$80
1563
 00FFE59F 035004                          puls    b
1564
 00FFE5A1 026FD0                          bne             rtc_rxerr
1565
 00FFE5A3 05C                             incb
1566
 00FFE5A4 0C105F                          cmpb    #$5F
1567
 00FFE5A6 025FED                          blo             rtcw0001
1568
 00FFE5A8 0E6A05                          ldb             b,y
1569
 00FFE5AA 086050                          lda             #$50                                    ; STO, wr bit
1570
 00FFE5AC 08DF49                          bsr             i2c_wr_cmd
1571
 00FFE5AE 0C5080                          bitb    #$80
1572
 00FFE5B0 026FC1                          bne             rtc_rxerr
1573
 00FFE5B2 04F05F                          clrd                                                            ; return 0
1574
 00FFE5B4 06F002                          clr             I2C_CTRL,x              ; disable I2C and return status
1575
 00FFE5B6 039                             rts
1576 13 robfinch
 
1577
                              ;==============================================================================
1578 4 robfinch
                              ; Keyboard I/O
1579
                              ;==============================================================================
1580
 
1581
                                      ;--------------------------------------------------------------------------
1582
                                      ; PS2 scan codes to ascii conversion tables.
1583
                                      ;--------------------------------------------------------------------------
1584
                                      ;
1585
                                      org     (* + 127) & $FFFFFF80
1586
 
1587
                              unshiftedScanCodes:
1588 16 robfinch
 00FFE600 02E0A902E0A50A30A10A2           fcb     $2e,$a9,$2e,$a5,$a3,$a1,$a2,$ac
1589
 00FFE607 0AC
1590
 00FFE608 02E0AA0A80A60A4009060           fcb     $2e,$aa,$a8,$a6,$a4,$09,$60,$2e
1591 13 robfinch
 00FFE60F 02E
1592 16 robfinch
 00FFE610 02E02E02E02E02E071031           fcb     $2e,$2e,$2e,$2e,$2e,$71,$31,$2e
1593 13 robfinch
 00FFE617 02E
1594 16 robfinch
 00FFE618 02E02E07A073061077032           fcb     $2e,$2e,$7a,$73,$61,$77,$32,$2e
1595 13 robfinch
 00FFE61F 02E
1596 16 robfinch
 00FFE620 02E063078064065034033           fcb     $2e,$63,$78,$64,$65,$34,$33,$2e
1597 13 robfinch
 00FFE627 02E
1598 16 robfinch
 00FFE628 02E020076066074072035           fcb     $2e,$20,$76,$66,$74,$72,$35,$2e
1599 13 robfinch
 00FFE62F 02E
1600 16 robfinch
 00FFE630 02E06E062068067079036           fcb     $2e,$6e,$62,$68,$67,$79,$36,$2e
1601 13 robfinch
 00FFE637 02E
1602 16 robfinch
 00FFE638 02E02E06D06A075037038           fcb     $2e,$2e,$6d,$6a,$75,$37,$38,$2e
1603 13 robfinch
 00FFE63F 02E
1604 16 robfinch
 00FFE640 02E02C06B06906F030039           fcb     $2e,$2c,$6b,$69,$6f,$30,$39,$2e
1605 13 robfinch
 00FFE647 02E
1606 16 robfinch
 00FFE648 02E02E02F06C03B07002D           fcb     $2e,$2e,$2f,$6c,$3b,$70,$2d,$2e
1607 13 robfinch
 00FFE64F 02E
1608 16 robfinch
 00FFE650 02E02E02702E05B03D02E           fcb     $2e,$2e,$27,$2e,$5b,$3d,$2e,$2e
1609 13 robfinch
 00FFE657 02E
1610 16 robfinch
 00FFE658 0AD02E00D05D02E05C02E           fcb     $ad,$2e,$0d,$5d,$2e,$5c,$2e,$2e
1611 13 robfinch
 00FFE65F 02E
1612 16 robfinch
 00FFE660 02E02E02E02E02E02E008           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$08,$2e
1613 13 robfinch
 00FFE667 02E
1614 16 robfinch
 00FFE668 02E09502E09309402E02E           fcb     $2e,$95,$2e,$93,$94,$2e,$2e,$2e
1615 13 robfinch
 00FFE66F 02E
1616 16 robfinch
 00FFE670 09807F09202E09109001B           fcb     $98,$7f,$92,$2e,$91,$90,$1b,$af
1617
 00FFE677 0AF
1618
 00FFE678 0AB02E09702E02E0960AE           fcb     $ab,$2e,$97,$2e,$2e,$96,$ae,$2e
1619 13 robfinch
 00FFE67F 02E
1620 4 robfinch
 
1621 16 robfinch
 00FFE680 02E02E02E0A702E02E02E           fcb     $2e,$2e,$2e,$a7,$2e,$2e,$2e,$2e
1622 13 robfinch
 00FFE687 02E
1623 16 robfinch
 00FFE688 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1624 13 robfinch
 00FFE68F 02E
1625 16 robfinch
 00FFE690 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1626 13 robfinch
 00FFE697 02E
1627 16 robfinch
 00FFE698 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1628 13 robfinch
 00FFE69F 02E
1629 16 robfinch
 00FFE6A0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1630 13 robfinch
 00FFE6A7 02E
1631 16 robfinch
 00FFE6A8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1632 13 robfinch
 00FFE6AF 02E
1633 16 robfinch
 00FFE6B0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1634 13 robfinch
 00FFE6B7 02E
1635 16 robfinch
 00FFE6B8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1636 13 robfinch
 00FFE6BF 02E
1637 16 robfinch
 00FFE6C0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1638 13 robfinch
 00FFE6C7 02E
1639 16 robfinch
 00FFE6C8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1640 13 robfinch
 00FFE6CF 02E
1641 16 robfinch
 00FFE6D0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1642 13 robfinch
 00FFE6D7 02E
1643 16 robfinch
 00FFE6D8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1644 13 robfinch
 00FFE6DF 02E
1645 16 robfinch
 00FFE6E0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1646 13 robfinch
 00FFE6E7 02E
1647
 00FFE6E8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1648
 00FFE6EF 02E
1649 16 robfinch
 00FFE6F0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1650 13 robfinch
 00FFE6F7 02E
1651 16 robfinch
 00FFE6F8 02E02E0FA02E02E02E02E           fcb     $2e,$2e,$fa,$2e,$2e,$2e,$2e,$2e
1652 13 robfinch
 00FFE6FF 02E
1653 4 robfinch
 
1654 16 robfinch
                              shiftedScanCodes:
1655 13 robfinch
 00FFE700 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1656
 00FFE707 02E
1657 16 robfinch
 00FFE708 02E02E02E02E02E00907E           fcb     $2e,$2e,$2e,$2e,$2e,$09,$7e,$2e
1658 13 robfinch
 00FFE70F 02E
1659 16 robfinch
 00FFE710 02E02E02E02E02E051021           fcb     $2e,$2e,$2e,$2e,$2e,$51,$21,$2e
1660 13 robfinch
 00FFE717 02E
1661 16 robfinch
 00FFE718 02E02E05A053041057040           fcb     $2e,$2e,$5a,$53,$41,$57,$40,$2e
1662 13 robfinch
 00FFE71F 02E
1663 16 robfinch
 00FFE720 02E043058044045024023           fcb     $2e,$43,$58,$44,$45,$24,$23,$2e
1664 13 robfinch
 00FFE727 02E
1665 16 robfinch
 00FFE728 02E020056046054052025           fcb     $2e,$20,$56,$46,$54,$52,$25,$2e
1666 13 robfinch
 00FFE72F 02E
1667 16 robfinch
 00FFE730 02E04E04204804705905E           fcb     $2e,$4e,$42,$48,$47,$59,$5e,$2e
1668 13 robfinch
 00FFE737 02E
1669 16 robfinch
 00FFE738 02E02E04D04A05502602A           fcb     $2e,$2e,$4d,$4a,$55,$26,$2a,$2e
1670 13 robfinch
 00FFE73F 02E
1671 16 robfinch
 00FFE740 02E03C04B04904F029028           fcb     $2e,$3c,$4b,$49,$4f,$29,$28,$2e
1672 13 robfinch
 00FFE747 02E
1673 16 robfinch
 00FFE748 02E03E03F04C03A05005F           fcb     $2e,$3e,$3f,$4c,$3a,$50,$5f,$2e
1674 13 robfinch
 00FFE74F 02E
1675 16 robfinch
 00FFE750 02E02E02202E07B02B02E           fcb     $2e,$2e,$22,$2e,$7b,$2b,$2e,$2e
1676 13 robfinch
 00FFE757 02E
1677 16 robfinch
 00FFE758 02E02E00D07D02E07C02E           fcb     $2e,$2e,$0d,$7d,$2e,$7c,$2e,$2e
1678 13 robfinch
 00FFE75F 02E
1679 16 robfinch
 00FFE760 02E02E02E02E02E02E008           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$08,$2e
1680 13 robfinch
 00FFE767 02E
1681
 00FFE768 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1682
 00FFE76F 02E
1683 16 robfinch
 00FFE770 02E07F02E02E02E02E01B           fcb     $2e,$7f,$2e,$2e,$2e,$2e,$1b,$2e
1684 13 robfinch
 00FFE777 02E
1685
 00FFE778 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1686
 00FFE77F 02E
1687 4 robfinch
 
1688 13 robfinch
 00FFE780 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1689
 00FFE787 02E
1690 16 robfinch
 00FFE788 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1691 13 robfinch
 00FFE78F 02E
1692 16 robfinch
 00FFE790 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1693 13 robfinch
 00FFE797 02E
1694 16 robfinch
 00FFE798 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1695 13 robfinch
 00FFE79F 02E
1696 16 robfinch
 00FFE7A0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1697 13 robfinch
 00FFE7A7 02E
1698 16 robfinch
 00FFE7A8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1699 13 robfinch
 00FFE7AF 02E
1700 16 robfinch
 00FFE7B0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1701 13 robfinch
 00FFE7B7 02E
1702 16 robfinch
 00FFE7B8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1703 13 robfinch
 00FFE7BF 02E
1704 16 robfinch
 00FFE7C0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1705 13 robfinch
 00FFE7C7 02E
1706 16 robfinch
 00FFE7C8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1707 13 robfinch
 00FFE7CF 02E
1708 16 robfinch
 00FFE7D0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1709 13 robfinch
 00FFE7D7 02E
1710 16 robfinch
 00FFE7D8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1711 13 robfinch
 00FFE7DF 02E
1712 16 robfinch
 00FFE7E0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1713 13 robfinch
 00FFE7E7 02E
1714
 00FFE7E8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1715
 00FFE7EF 02E
1716 16 robfinch
 00FFE7F0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1717 13 robfinch
 00FFE7F7 02E
1718
 00FFE7F8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1719
 00FFE7FF 02E
1720 4 robfinch
 
1721 16 robfinch
                              ; control
1722
                              keybdControlCodes:
1723
 00FFE800 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1724 13 robfinch
 00FFE807 02E
1725 16 robfinch
 00FFE808 02E02E02E02E02E00907E           fcb     $2e,$2e,$2e,$2e,$2e,$09,$7e,$2e
1726 13 robfinch
 00FFE80F 02E
1727 16 robfinch
 00FFE810 02E02E02E02E02E011021           fcb     $2e,$2e,$2e,$2e,$2e,$11,$21,$2e
1728 13 robfinch
 00FFE817 02E
1729 16 robfinch
 00FFE818 02E02E01A013001017040           fcb     $2e,$2e,$1a,$13,$01,$17,$40,$2e
1730 13 robfinch
 00FFE81F 02E
1731 16 robfinch
 00FFE820 02E003018004005024023           fcb     $2e,$03,$18,$04,$05,$24,$23,$2e
1732 13 robfinch
 00FFE827 02E
1733 16 robfinch
 00FFE828 02E020016006014012025           fcb     $2e,$20,$16,$06,$14,$12,$25,$2e
1734 13 robfinch
 00FFE82F 02E
1735 16 robfinch
 00FFE830 02E00E00200800701905E           fcb     $2e,$0e,$02,$08,$07,$19,$5e,$2e
1736 13 robfinch
 00FFE837 02E
1737 16 robfinch
 00FFE838 02E02E00D00A01502602A           fcb     $2e,$2e,$0d,$0a,$15,$26,$2a,$2e
1738 13 robfinch
 00FFE83F 02E
1739 16 robfinch
 00FFE840 02E03C00B00900F029028           fcb     $2e,$3c,$0b,$09,$0f,$29,$28,$2e
1740 13 robfinch
 00FFE847 02E
1741 16 robfinch
 00FFE848 02E03E03F00C03A01005F           fcb     $2e,$3e,$3f,$0c,$3a,$10,$5f,$2e
1742 13 robfinch
 00FFE84F 02E
1743 16 robfinch
 00FFE850 02E02E02202E07B02B02E           fcb     $2e,$2e,$22,$2e,$7b,$2b,$2e,$2e
1744 13 robfinch
 00FFE857 02E
1745 16 robfinch
 00FFE858 02E02E00D07D02E07C02E           fcb     $2e,$2e,$0d,$7d,$2e,$7c,$2e,$2e
1746 13 robfinch
 00FFE85F 02E
1747 16 robfinch
 00FFE860 02E02E02E02E02E02E008           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$08,$2e
1748 13 robfinch
 00FFE867 02E
1749 16 robfinch
 00FFE868 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1750 13 robfinch
 00FFE86F 02E
1751 16 robfinch
 00FFE870 02E07F02E02E02E02E01B           fcb     $2e,$7f,$2e,$2e,$2e,$2e,$1b,$2e
1752 13 robfinch
 00FFE877 02E
1753 16 robfinch
 00FFE878 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1754 13 robfinch
 00FFE87F 02E
1755 4 robfinch
 
1756 16 robfinch
                              keybdExtendedCodes:
1757
 00FFE880 02E02E02E02E0A30A10A2           fcb     $2e,$2e,$2e,$2e,$a3,$a1,$a2,$2e
1758
 00FFE887 02E
1759
 00FFE888 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1760
 00FFE88F 02E
1761
 00FFE890 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1762
 00FFE897 02E
1763
 00FFE898 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1764
 00FFE89F 02E
1765
 00FFE8A0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1766
 00FFE8A7 02E
1767
 00FFE8A8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1768
 00FFE8AF 02E
1769
 00FFE8B0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1770
 00FFE8B7 02E
1771
 00FFE8B8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1772
 00FFE8BF 02E
1773
 00FFE8C0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1774
 00FFE8C7 02E
1775
 00FFE8C8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1776
 00FFE8CF 02E
1777
 00FFE8D0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1778
 00FFE8D7 02E
1779
 00FFE8D8 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1780
 00FFE8DF 02E
1781
 00FFE8E0 02E02E02E02E02E02E02E           fcb     $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
1782
 00FFE8E7 02E
1783
 00FFE8E8 02E09502E09309402E02E           fcb     $2e,$95,$2e,$93,$94,$2e,$2e,$2e
1784
 00FFE8EF 02E
1785
 00FFE8F0 09809909202E09109002E           fcb     $98,$99,$92,$2e,$91,$90,$2e,$2e
1786
 00FFE8F7 02E
1787
 00FFE8F8 02E02E09702E02E09602E           fcb     $2e,$2e,$97,$2e,$2e,$96,$2e,$2e
1788
 00FFE8FF 02E
1789
 
1790 4 robfinch
                              ; ============================================================================
1791
                              ;        __
1792
                              ;   \\__/ o\    (C) 2013-2022  Robert Finch, Waterloo
1793
                              ;    \  __ /    All rights reserved.
1794
                              ;     \/_//     robfinch@opencores.org
1795
                              ;       ||
1796
                              ;
1797
                              ;
1798
                              ;       Keyboard driver routines to interface to a PS2 style keyboard
1799
                              ; Converts the scancode to ascii
1800
                              ;
1801
                              ; This source file is free software: you can redistribute it and/or modify
1802
                              ; it under the terms of the GNU Lesser General Public License as published
1803
                              ; by the Free Software Foundation, either version 3 of the License, or
1804
                              ; (at your option) any later version.
1805
                              ;
1806
                              ; This source file is distributed in the hope that it will be useful,
1807
                              ; but WITHOUT ANY WARRANTY; without even the implied warranty of
1808
                              ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1809
                              ; GNU General Public License for more details.
1810
                              ;
1811
                              ; You should have received a copy of the GNU General Public License
1812
                              ; along with this program.  If not, see .
1813
                              ;
1814
                              ; ============================================================================
1815
                              ;
1816
                              SC_F12  EQU     $07
1817
                              SC_C    EQU             $21
1818
                              SC_T    EQU         $2C
1819
                              SC_Z            EQU     $1A
1820
                              SC_DEL  EQU                     $71     ; extend
1821
                              SC_KEYUP        EQU             $F0     ; should be $f0
1822
                              SC_EXTEND EQU     $E0
1823
                              SC_CTRL EQU                     $14
1824
                              SC_RSHIFT               EQU     $59
1825
                              SC_NUMLOCK      EQU     $77
1826
                              SC_SCROLLLOCK           EQU     $7E
1827
                              SC_CAPSLOCK             EQU             $58
1828
                              SC_ALT  EQU                     $11
1829
 
1830
                              ;#define SC_LSHIFT      EQU             $12
1831
                              ;SC_DEL         EQU             $71             ; extend
1832
                              ;SC_LCTRL       EQU             $58
1833
 
1834
                              SC_TAB  EQU     $0D
1835
 
1836
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1837
                              ; Recieve a byte from the keyboard, used after a command is sent to the
1838
                              ; keyboard in order to wait for a response.
1839
                              ;
1840
                              ; Parameters: none
1841
                              ; Returns: accd = recieved byte ($00 to $FF), -1 on timeout
1842
                              ; Modifies: acc
1843
                              ; Stack Space: 2 words
1844
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1845
 
1846
                              KeybdRecvByte:
1847 16 robfinch
 00FFE900 034010                          pshs    x
1848
 00FFE902 08E000064                       ldx             #100                                            ; wait up to 1s
1849 4 robfinch
                              krb3:
1850 16 robfinch
 00FFE905 08D05A                          bsr             KeybdGetStatus  ; wait for response from keyboard
1851
 00FFE907 05D                             tstb
1852
 00FFE908 02B00B                          bmi             krb4                                            ; is input buffer full ? yes, branch
1853
 00FFE90A 08D02D                          bsr             Wait10ms                                ; wait a bit
1854
 00FFE90C 0301FF                          dex
1855
 00FFE90E 026FF5                          bne             krb3                                            ; go back and try again
1856
 00FFE910 0CCFFFFFF                       ldd             #-1                                                     ; return -1
1857
 00FFE913 035090                          puls    x,pc
1858 4 robfinch
                              krb4:
1859 16 robfinch
 00FFE915 08D066                          bsr             KeybdGetScancode
1860
 00FFE917 035090                          puls    x,pc
1861 4 robfinch
 
1862
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1863
                              ; Send a byte to the keyboard.
1864
                              ;
1865
                              ; Parameters: accb byte to send
1866
                              ; Returns: none
1867
                              ; Modifies: none
1868
                              ; Stack Space: 0 words
1869
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1870
 
1871
                              KeybdSendByte:
1872 16 robfinch
 00FFE919 0150F7FFFE30400                 stb             KEYBD
1873
 00FFE91E 039                             rts
1874 4 robfinch
 
1875
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1876
                              ; Wait until the keyboard transmit is complete
1877
                              ;
1878
                              ; Parameters: none
1879
                              ; Returns: r1 = 0 if successful, r1 = -1 timeout
1880
                              ; Modifies: r1
1881
                              ; Stack Space: 3 words
1882
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1883
 
1884
                              KeybdWaitTx:
1885 16 robfinch
 00FFE91F 034010                          pshs    x
1886
 00FFE921 08E000064                       ldx             #100                            ; wait a max of 1s
1887 4 robfinch
                              kwt1:
1888 16 robfinch
 00FFE924 08D03B                          bsr             KeybdGetStatus
1889
 00FFE926 0C4040                          andb    #$40                            ; check for transmit complete bit; branch if bit set
1890
 00FFE928 02600B                          bne             kwt2
1891
 00FFE92A 08D00D                          bsr             Wait10ms                ; delay a little bit
1892
 00FFE92C 0301FF                          dex
1893
 00FFE92E 026FF4                          bne             kwt1                            ; go back and try again
1894
 00FFE930 0CCFFFFFF                       ldd             #-1                                     ; timed out, return -1
1895
 00FFE933 035090                          puls    x,pc
1896 4 robfinch
                              kwt2:
1897 16 robfinch
 00FFE935 04F                             clra                                                    ; wait complete, return 0
1898
 00FFE936 05F                             clrb
1899
 00FFE937 035090                          puls    x,pc
1900 4 robfinch
 
1901
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1902
                              ; Wait for 10 ms
1903
                              ;
1904
                              ; Parameters: none
1905
                              ; Returns: none
1906
                              ; Modifies: none
1907
                              ; Stack Space: 2 words
1908
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1909
 
1910
                              Wait10ms:
1911 16 robfinch
 00FFE939 034006                          pshs    d
1912
 00FFE93B 0150B6FFFFFFFE7                 lda             MSCOUNT+3
1913 4 robfinch
                              W10_0001:
1914 16 robfinch
 00FFE940 01F089                          tfr             a,b
1915
 00FFE942 0150F0FFFFFFFE7                 subb    MSCOUNT+3
1916
 00FFE947 0C1FFA                          cmpb    #$FFA
1917
 00FFE949 022FF5                          bhi             W10_0001
1918
 00FFE94B 035086                          puls    d,pc
1919 4 robfinch
 
1920
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1921
                              ; Wait for 300 ms (256 ms)
1922
                              ;
1923
                              ; Parameters: none
1924
                              ; Returns: none
1925
                              ; Modifies: none
1926
                              ; Stack Space: 2 words
1927
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1928
 
1929
                              Wait300ms:
1930 16 robfinch
 00FFE94D 034006                          pshs    d
1931
 00FFE94F 0150B6FFFFFFFE7                 lda             MSCOUNT+3
1932 4 robfinch
                              W300_0001:
1933 16 robfinch
 00FFE954 01F089                          tfr             a,b
1934
 00FFE956 0150F0FFFFFFFE7                 subb    MSCOUNT+3
1935
 00FFE95B 0C1F00                          cmpb    #$F00
1936
 00FFE95D 022FF5                          bhi     W300_0001
1937
 00FFE95F 035086                          puls    d,pc
1938 4 robfinch
 
1939
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1940
                              ; Get the keyboard status
1941
                              ;
1942
                              ; Parameters: none
1943
                              ; Returns: d = status
1944
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1945
 
1946
                              KeybdGetStatus:
1947
                              kbgs3:
1948 16 robfinch
 00FFE961 0150F6FFFE30401                 ldb             KEYBD+1
1949
 00FFE966 0C5080                          bitb    #$80
1950
 00FFE968 02600E                          bne             kbgs1
1951
 00FFE96A 0C5001                          bitb    #$01            ; check parity error flag
1952
 00FFE96C 026002                          bne             kbgs2
1953
 00FFE96E 04F                             clra
1954
 00FFE96F 039                             rts
1955 4 robfinch
                              kbgs2:
1956 16 robfinch
 00FFE970 0C60FE                          ldb             #$FE            ; request resend
1957
 00FFE972 08DFA5                          bsr             KeybdSendByte
1958
 00FFE974 08DFA9                          bsr             KeybdWaitTx
1959
 00FFE976 020FE9                          bra             kbgs3
1960 4 robfinch
                              kbgs1:                                  ; return negative status
1961 16 robfinch
 00FFE978 0CAF00                          orb             #$F00
1962
 00FFE97A 086FFF                          lda             #-1
1963
 00FFE97C 039                             rts
1964 4 robfinch
 
1965
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1966
                              ; Get the scancode from the keyboard port
1967
                              ;
1968
                              ; Parameters: none
1969
                              ; Returns: acca = scancode
1970
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1971
 
1972
                              KeybdGetScancode:
1973 16 robfinch
 00FFE97D 04F                             clra
1974
 00FFE97E 0150F6FFFE30400                 ldb             KEYBD                           ; get the scan code
1975
 00FFE983 01507FFFFE30401                 clr             KEYBD+1                 ; clear receive register (write $00 to status reg)
1976
 00FFE988 039                             rts
1977 4 robfinch
 
1978
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1979
                              ; Set the LEDs on the keyboard.
1980
                              ;
1981
                              ; Parameters: d LED status to set
1982
                              ; Returns: none
1983
                              ; Modifies: none
1984
                              ; Stack Space: 2 words
1985
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1986
 
1987
                              KeybdSetLED:
1988 16 robfinch
 00FFE989 034004                          pshs    b
1989
 00FFE98B 0C60ED                          ldb             #$ED                                            ; set LEDs command
1990
 00FFE98D 08DF8A                          bsr             KeybdSendByte
1991
 00FFE98F 08DF8E                          bsr             KeybdWaitTx
1992
 00FFE991 08DF6D                          bsr             KeybdRecvByte   ; should be an ack
1993
 00FFE993 035004                          puls    b
1994
 00FFE995 08DF82                          bsr             KeybdSendByte
1995
 00FFE997 08DF86                          bsr             KeybdWaitTx
1996
 00FFE999 08DF65                          bsr             KeybdRecvByte   ; should be an ack
1997
 00FFE99B 039                             rts
1998 4 robfinch
 
1999
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2000
                              ; Get ID - get the keyboards identifier code.
2001
                              ;
2002
                              ; Parameters: none
2003
                              ; Returns: d = $AB83, $00 on fail
2004
                              ; Modifies: d, KeybdID updated
2005
                              ; Stack Space: 2 words
2006
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2007
 
2008
                              KeybdGetID:
2009 16 robfinch
 00FFE99C 0C60F2                          ldb             #$F2
2010
 00FFE99E 08DF79                          bsr             KeybdSendByte
2011
 00FFE9A0 08DF7D                          bsr             KeybdWaitTx
2012
 00FFE9A2 08DF5C                          bsr             KeybdRecvByte
2013
 00FFE9A4 0C5080                          bitb    #$80
2014
 00FFE9A6 026014                          bne             kgnotKbd
2015
 00FFE9A8 0C10AB                          cmpb    #$AB
2016
 00FFE9AA 026010                          bne             kgnotKbd
2017
 00FFE9AC 08DF52                          bsr             KeybdRecvByte
2018
 00FFE9AE 0C5080                          bitb    #$80
2019
 00FFE9B0 02600A                          bne             kgnotKbd
2020
 00FFE9B2 0C1083                          cmpb    #$83
2021
 00FFE9B4 026006                          bne             kgnotKbd
2022
 00FFE9B6 0CC00AB83                       ldd             #$AB83
2023 4 robfinch
                              kgid1:
2024 16 robfinch
 00FFE9B9 0DD124                          std             KeybdID
2025
 00FFE9BB 039                             rts
2026 4 robfinch
                              kgnotKbd:
2027 16 robfinch
 00FFE9BC 04F                             clra
2028
 00FFE9BD 05F                             clrb
2029
 00FFE9BE 020FF9                          bra             kgid1
2030 4 robfinch
 
2031
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2032
                              ; Initialize the keyboard.
2033
                              ;
2034
                              ; Parameters:
2035
                              ;               none
2036
                              ;       Modifies:
2037
                              ;               none
2038
                              ; Returns:
2039
                              ;               none
2040
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2041
 
2042
                              KeybdInit:
2043 16 robfinch
 00FFE9C0 034026                          pshs    d,y
2044
 00FFE9C2 18E000005                       ldy             #5
2045
 00FFE9C5 00F120                          clr             KeyState1               ; records key up/down state
2046
 00FFE9C7 00F121                          clr             KeyState2               ; records shift,ctrl,alt state
2047 4 robfinch
                              kbdi0002:
2048 16 robfinch
 00FFE9C9 08DF6E                          bsr             Wait10ms
2049
 00FFE9CB 01507FFFFE30401                 clr             KEYBD+1                 ; clear receive register (write $00 to status reg)
2050
 00FFE9D0 0C6FFF                          ldb             #-1                                     ; send reset code to keyboard
2051
 00FFE9D2 0150F7FFFE30401                 stb             KEYBD+1                 ; write $FF to status reg to clear TX state
2052
 00FFE9D7 08DF40                          bsr             KeybdSendByte   ; now write to transmit register
2053
 00FFE9D9 08DF44                          bsr             KeybdWaitTx             ; wait until no longer busy
2054
 00FFE9DB 08DF23                          bsr             KeybdRecvByte   ; look for an ACK ($FA)
2055
 00FFE9DD 0C10FA                          cmpb    #$FA
2056
 00FFE9DF 026021                          bne             kbdiTryAgain
2057
 00FFE9E1 08DF1D                          bsr             KeybdRecvByte   ; look for BAT completion code ($AA)
2058
 00FFE9E3 0C10FC                          cmpb    #$FC                            ; reset error ?
2059
 00FFE9E5 02701B                          beq             kbdiTryAgain
2060
 00FFE9E7 0C10AA                          cmpb    #$AA                            ; reset complete okay ?
2061
 00FFE9E9 026017                          bne             kbdiTryAgain
2062 4 robfinch
 
2063
                                      ; After a reset, scan code set #2 should be active
2064
                              .config:
2065 16 robfinch
 00FFE9EB 0C60F0                          ldb             #$F0                    ; send scan code select
2066
 00FFE9ED 0150F7FFFE60001                 stb             LEDS
2067
 00FFE9F2 08DF25                          bsr             KeybdSendByte
2068
 00FFE9F4 08DF29                          bsr             KeybdWaitTx
2069
 00FFE9F6 05D                             tstb
2070
 00FFE9F7 02B009                          bmi             kbdiTryAgain
2071
 00FFE9F9 08DF05                          bsr             KeybdRecvByte   ; wait for response from keyboard
2072
 00FFE9FB 04D                             tsta
2073
 00FFE9FC 02B004                          bmi             kbdiTryAgain
2074
 00FFE9FE 0C10FA                          cmpb    #$FA                                    ; ACK
2075
 00FFEA00 02700C                          beq             kbdi0004
2076 4 robfinch
                              kbdiTryAgain:
2077 16 robfinch
 00FFEA02 0313FF                          dey
2078
 00FFEA04 026FC3                          bne       kbdi0002
2079 4 robfinch
                              .keybdErr:
2080 16 robfinch
 00FFEA06 0CCFFEA2E                       ldd             #msgBadKeybd
2081 21 robfinch
 00FFEA09 017FFF9F1                       lbsr    DisplayStringCRLF
2082 4 robfinch
*** warning 1: Long branch within short branch range could be optimized
2083 16 robfinch
 00FFEA0C 020014                          bra             ledxit
2084 4 robfinch
                              kbdi0004:
2085 16 robfinch
 00FFEA0E 0C6002                          ldb             #2                      ; select scan code set #2
2086
 00FFEA10 08DF07                          bsr             KeybdSendByte
2087
 00FFEA12 08DF0B                          bsr             KeybdWaitTx
2088
 00FFEA14 05D                             tstb
2089
 00FFEA15 02BFEB                          bmi             kbdiTryAgain
2090
 00FFEA17 08DEE7                          bsr             KeybdRecvByte   ; wait for response from keyboard
2091
 00FFEA19 04D                             tsta
2092
 00FFEA1A 02BFE6                          bmi             kbdiTryAgain
2093
 00FFEA1C 0C10FA                          cmpb    #$FA
2094
 00FFEA1E 026FE2                          bne             kbdiTryAgain
2095
 00FFEA20 08DF7A                          bsr             KeybdGetID
2096 4 robfinch
                              ledxit:
2097 16 robfinch
 00FFEA22 0C6007                          ldb             #$07
2098
 00FFEA24 08DF63                          bsr             KeybdSetLED
2099
 00FFEA26 08DF25                          bsr             Wait300ms
2100
 00FFEA28 0C6000                          ldb             #$00
2101
 00FFEA2A 08DF5D                          bsr             KeybdSetLED
2102
 00FFEA2C 0350A6                          puls    d,y,pc
2103 4 robfinch
 
2104
                              msgBadKeybd:
2105 16 robfinch
 00FFEA2E 04B06507906206F061072           fcb             "Keyboard error",0
2106
 00FFEA35 06402006507207206F072
2107
 00FFEA3C 000
2108 4 robfinch
 
2109 13 robfinch
                              ;------------------------------------------------------------------------------
2110
                              ; Calculate number of character in input buffer
2111
                              ;
2112
                              ; Parameters:
2113
                              ;               y = $Cn00000 where n is core id
2114
                              ; Returns:
2115
                              ;               d = number of bytes in buffer.
2116
                              ;------------------------------------------------------------------------------
2117
 
2118
                              kbdRcvCount:
2119 16 robfinch
 00FFEA3D 04F                             clra
2120
 00FFEA3E 0E6A08128                       ldb             kbdTailRcv,y
2121
 00FFEA41 0E0A08127                       subb    kbdHeadRcv,y
2122
 00FFEA44 02C008                          bge             krcXit
2123
 00FFEA46 0C6040                          ldb             #$40
2124
 00FFEA48 0E0A08127                       subb    kbdHeadRcv,y
2125
 00FFEA4B 0EBA08128                       addb    kbdTailRcv,y
2126 13 robfinch
                              krcXit:
2127 16 robfinch
 00FFEA4E 039                             rts
2128 13 robfinch
 
2129
 
2130 4 robfinch
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2131
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2132
 
2133 13 robfinch
                              KeybdIRQ:
2134 16 robfinch
 00FFEA4F 0150B6FFFE30401                 lda             KEYBD+1                                         ; check status
2135
 00FFEA54 085080                          bita    #$80                                                    ; was key pressed?
2136
 00FFEA56 027034                          beq             notKbdIRQ                                       ; if not, exit
2137
 00FFEA58 0150F6FFFE30400                 ldb             KEYBD                                                   ; get the scan code
2138
 00FFEA5D 01507FFFFE30401                 clr             KEYBD+1                                         ; clear receive register (write $00 to status reg)
2139
 00FFEA62 034004                          pshs    b                                                                       ; save it off
2140
 00FFEA64 0B6FFC010                       lda             IOFocusID                                       ; compute core memory address $Cn0000
2141
 00FFEA67 05F                             clrb
2142
 00FFEA68 048                             asla
2143
 00FFEA69 048                             asla
2144
 00FFEA6A 048                             asla
2145
 00FFEA6B 048                             asla
2146
 00FFEA6C 08AC00                          ora             #$C00                                                   ; address $Cn0000
2147
 00FFEA6E 01F002                          tfr             d,y                                                             ; y =
2148
 00FFEA70 08DFCB                          bsr             kbdRcvCount                             ; get count of scan codes in buffer
2149
 00FFEA72 0C1040                          cmpb    #64                                                             ; check if buffer full?
2150
 00FFEA74 024017                          bhs             kbdBufFull                              ; if buffer full, ignore new keystroke
2151
 00FFEA76 01F021                          tfr             y,x                                                             ; compute fifo address
2152
 00FFEA78 0E6A08128                       ldb             kbdTailRcv,y                    ; b = buffer index
2153
 00FFEA7B 035002                          puls    a                                                                       ; get back scancode
2154
 00FFEA7D 030040                          leax    kbdFifo,x                                       ; x = base address for fifo
2155
 00FFEA7F 0A7845                          sta             b,x                                                             ; store in buffer
2156
 00FFEA81 05C                             incb                                                                            ; increment buffer index
2157
 00FFEA82 0C403F                          andb    #$3f                                                    ; wrap around at 64 chars
2158
 00FFEA84 0E7A08128                       stb             kbdTailRcv,y                    ; update it
2159
 00FFEA87 08601C                          lda             #28                                                             ; Keyboard is IRQ #28
2160
 00FFEA89 0B7FFC011                       sta             IrqSource                                       ; stuff a byte indicating the IRQ source for PEEK()
2161 13 robfinch
                              notKbdIRQ:
2162 16 robfinch
 00FFEA8C 039                             rts
2163 13 robfinch
                              kbdBufFull:
2164 16 robfinch
 00FFEA8D 032601                          leas    1,s                                                             ; get rid of saved scancode
2165
 00FFEA8F 039                             rts
2166 13 robfinch
 
2167
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2168
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2169
 
2170 4 robfinch
                              DBGCheckForKey:
2171 16 robfinch
 00FFEA90 020ECF                          bra             KeybdGetStatus
2172 4 robfinch
 
2173
 
2174
                              ; KeyState2 variable bit meanings
2175
                              ;1176543210
2176
                              ; ||||||||+ = shift
2177
                              ; |||||||+- = alt
2178
                              ; ||||||+-- = control
2179
                              ; |||||+--- = numlock
2180
                              ; ||||+---- = capslock
2181
                              ; |||+----- = scrolllock
2182
                              ; ||+------ = 
2183
                              ; |+------- =    "
2184
                              ; |         =    "
2185
                              ; |         =    "
2186
                              ; |         =    "
2187
                              ; +-------- = extended
2188
 
2189
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2190 13 robfinch
                              ; Keyboard get routine.
2191 4 robfinch
                              ;
2192 13 robfinch
                              ; The routine may get characters directly from the scancode input or less
2193
                              ; directly from the scancode buffer, if things are interrupt driven.
2194
                              ;
2195 4 robfinch
                              ; Parameters:
2196 13 robfinch
                              ;               b:  bit 11 = blocking status 1=blocking, 0=non blocking
2197
                              ;               b:      bit 1  = scancode source 1=scancode buffer, 0=direct
2198 4 robfinch
                              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2199
 
2200 13 robfinch
                              GetKey:
2201 16 robfinch
 00FFEA92 034030                          pshs    x,y
2202
 00FFEA94 0D7126                          stb             KeybdBlock                              ; save off blocking status
2203 4 robfinch
                              dbgk2:
2204 16 robfinch
 00FFEA96 0D6126                          ldb             KeybdBlock
2205
 00FFEA98 034004                          pshs    b
2206
 00FFEA9A 0C5001                          bitb    #1                                                              ; what is the scancode source
2207
 00FFEA9C 02701A                          beq             dbgk20                                          ; branch if direct read
2208
 00FFEA9E 0150B6FFFFFFFE0                 lda             COREID                                          ; compute core memory address
2209
 00FFEAA3 05F                             clrb
2210
 00FFEAA4 048                             asla
2211
 00FFEAA5 048                             asla
2212
 00FFEAA6 048                             asla
2213
 00FFEAA7 048                             asla
2214
 00FFEAA8 08AC00                          ora             #$C00
2215
 00FFEAAA 01F002                          tfr             d,y                                                             ; y = $Cn0000
2216
 00FFEAAC 08DF8F                          bsr             kbdRcvCount
2217
 00FFEAAE 05D                             tstb                                                                            ; anything in buffer?
2218
 00FFEAAF 035004                          puls    b
2219
 00FFEAB1 026018                          bne             dbgk1                                                   ; branch if something in buffer
2220
 00FFEAB3 05D                             tstb
2221
 00FFEAB4 02BFE0                          bmi             dbgk2                                                   ; if no key and blocking - loop
2222
 00FFEAB6 02000E                          bra             dbgk24
2223 13 robfinch
                              dbgk20:
2224 16 robfinch
 00FFEAB8 18E000000                       ldy             #0
2225
 00FFEABB 08DEA4                          bsr             KeybdGetStatus
2226
 00FFEABD 0C4080                          andb    #$80                                                    ; is key available?
2227
 00FFEABF 035004                          puls    b
2228
 00FFEAC1 026008                          bne             dbgk1                                                   ; branch if key
2229
 00FFEAC3 05D                             tstb                                                                            ; block?
2230
 00FFEAC4 02BFD0                          bmi             dbgk2                                                   ; If no key and blocking - loop
2231 13 robfinch
                              dbgk24:
2232 16 robfinch
 00FFEAC6 0CCFFFFFF                       ldd             #-1                                                             ; return -1 if no block and no key
2233
 00FFEAC9 0350B0                          puls    x,y,pc
2234 4 robfinch
                              dbgk1:
2235 16 robfinch
 00FFEACB 18C000000                       cmpy    #0
2236
 00FFEACE 026004                          bne             dbgk22
2237
 00FFEAD0 08DEAB                          bsr             KeybdGetScancode        ; get scancode directly
2238
 00FFEAD2 020011                          bra             dbgk23
2239 13 robfinch
                              dbgk22:
2240
                                      ; Retrieve value from scancode buffer
2241 16 robfinch
 00FFEAD4 01F021                          tfr             y,x
2242
 00FFEAD6 030040                          leax    kbdFifo,x                                       ; x = fifo address
2243
 00FFEAD8 0E6A08127                       ldb             kbdHeadRcv,y                    ; b = buffer index
2244
 00FFEADB 0A6A0D                          lda             b,x                                                             ; get the scancode
2245
 00FFEADD 05C                             incb                                                                            ; increment fifo index
2246
 00FFEADE 0C403F                          andb    #$3f                                                    ; and wrap around
2247
 00FFEAE0 0E7A08127                       stb             kbdHeadRcv,y                    ; save it back
2248
 00FFEAE3 01F089                          tfr             a,b                                                             ; the scancode is needed in accb
2249 13 robfinch
                              dbgk23:
2250 4 robfinch
                              ;       lbsr    DispByteAsHex
2251
                                      ; Make sure there is a small delay between scancode reads
2252 16 robfinch
 00FFEAE5 08E000014                       ldx             #20
2253 4 robfinch
                              dbgk3:
2254 16 robfinch
 00FFEAE8 0301FF                          dex
2255
 00FFEAEA 026FFC                          bne             dbgk3
2256 4 robfinch
                                      ; switch on scan code
2257 16 robfinch
 00FFEAEC 0C10F0                          cmpb    #SC_KEYUP
2258
 00FFEAEE 026004                          bne             dbgk4
2259
 00FFEAF0 0D7120                          stb             KeyState1                                       ; make KeyState1 <> 0
2260
 00FFEAF2 020FA2                          bra             dbgk2                                                   ; loop back
2261 4 robfinch
                              dbgk4:
2262 16 robfinch
 00FFEAF4 0C10E0                          cmpb    #SC_EXTEND
2263
 00FFEAF6 026008                          bne             dbgk5
2264
 00FFEAF8 096121                          lda             KeyState2
2265
 00FFEAFA 08A800                          ora             #$800
2266
 00FFEAFC 097121                          sta             KeyState2
2267
 00FFEAFE 020F96                          bra             dbgk2
2268 4 robfinch
                              dbgk5:
2269 16 robfinch
 00FFEB00 0C1014                          cmpb    #SC_CTRL
2270
 00FFEB02 026016                          bne             dbgkNotCtrl
2271
 00FFEB04 00D120                          tst             KeyState1
2272
 00FFEB06 026008                          bne             dbgk7
2273
 00FFEB08 096121                          lda             KeyState2
2274
 00FFEB0A 08A004                          ora             #4
2275
 00FFEB0C 097121                          sta             KeyState2
2276
 00FFEB0E 020006                          bra             dbgk8
2277 4 robfinch
                              dbgk7:
2278 16 robfinch
 00FFEB10 096121                          lda             KeyState2
2279
 00FFEB12 084FFB                          anda    #~4
2280
 00FFEB14 097121                          sta             KeyState2
2281 4 robfinch
                              dbgk8:
2282 16 robfinch
 00FFEB16 00F120                          clr             KeyState1
2283
 00FFEB18 020F7C                          bra             dbgk2
2284 4 robfinch
                              dbgkNotCtrl:
2285 16 robfinch
 00FFEB1A 0C1059                          cmpb    #SC_RSHIFT
2286
 00FFEB1C 026016                          bne             dbgkNotRshift
2287
 00FFEB1E 00D120                          tst             KeyState1
2288
 00FFEB20 026008                          bne             dbgk9
2289
 00FFEB22 096121                          lda             KeyState2
2290
 00FFEB24 08A001                          ora             #1
2291
 00FFEB26 097121                          sta             KeyState2
2292
 00FFEB28 020006                          bra             dbgk10
2293 4 robfinch
                              dbgk9:
2294 16 robfinch
 00FFEB2A 096121                          lda             KeyState2
2295
 00FFEB2C 084FFE                          anda    #~1
2296
 00FFEB2E 097121                          sta             KeyState2
2297 4 robfinch
                              dbgk10:
2298 16 robfinch
 00FFEB30 00F120                          clr             KeyState1
2299
 00FFEB32 020F62                          bra             dbgk2
2300 4 robfinch
                              dbgkNotRshift:
2301 16 robfinch
 00FFEB34 0C1077                          cmpb    #SC_NUMLOCK
2302
 00FFEB36 026013                          bne             dbgkNotNumlock
2303
 00FFEB38 096121                          lda             KeyState2
2304
 00FFEB3A 088010                          eora    #16
2305
 00FFEB3C 097121                          sta             KeyState2
2306
 00FFEB3E 096122                          lda             KeyLED
2307
 00FFEB40 088002                          eora    #2
2308
 00FFEB42 097122                          sta             KeyLED
2309
 00FFEB44 01F089                          tfr             a,b
2310
 00FFEB46 04F                             clra
2311
 00FFEB47 08DE40                          bsr             KeybdSetLED
2312
 00FFEB49 020F4B                          bra             dbgk2
2313 4 robfinch
                              dbgkNotNumlock:
2314 16 robfinch
 00FFEB4B 0C1058                          cmpb    #SC_CAPSLOCK
2315
 00FFEB4D 026013                          bne             dbgkNotCapslock
2316
 00FFEB4F 096121                          lda             KeyState2
2317
 00FFEB51 088020                          eora    #32
2318
 00FFEB53 097121                          sta             KeyState2
2319
 00FFEB55 096122                          lda             KeyLED
2320
 00FFEB57 088004                          eora    #4
2321
 00FFEB59 097122                          sta             KeyLED
2322
 00FFEB5B 01F089                          tfr             a,b
2323
 00FFEB5D 04F                             clra
2324
 00FFEB5E 08DE29                          bsr             KeybdSetLED
2325
 00FFEB60 020F34                          bra             dbgk2
2326 4 robfinch
                              dbgkNotCapslock:
2327 16 robfinch
 00FFEB62 0C107E                          cmpb    #SC_SCROLLLOCK
2328
 00FFEB64 026013                          bne             dbgkNotScrolllock
2329
 00FFEB66 096121                          lda             KeyState2
2330
 00FFEB68 088040                          eora    #64
2331
 00FFEB6A 097121                          sta             KeyState2
2332
 00FFEB6C 096122                          lda             KeyLED
2333
 00FFEB6E 088001                          eora    #1
2334
 00FFEB70 097122                          sta             KeyLED
2335
 00FFEB72 01F089                          tfr             a,b
2336
 00FFEB74 04F                             clra
2337
 00FFEB75 08DE12                          bsr             KeybdSetLED
2338
 00FFEB77 020F1D                          bra             dbgk2
2339 4 robfinch
                              dbgkNotScrolllock:
2340 16 robfinch
 00FFEB79 0C1011                          cmpb    #SC_ALT
2341
 00FFEB7B 026016                          bne             dbgkNotAlt
2342
 00FFEB7D 00D120                          tst             KeyState1
2343
 00FFEB7F 026008                          bne             dbgk11
2344
 00FFEB81 096121                          lda             KeyState2
2345
 00FFEB83 08A002                          ora             #2
2346
 00FFEB85 097121                          sta             KeyState2
2347
 00FFEB87 020006                          bra             dbgk12
2348 4 robfinch
                              dbgk11:
2349 16 robfinch
 00FFEB89 096121                          lda             KeyState2
2350
 00FFEB8B 084FFD                          anda    #~2
2351
 00FFEB8D 097121                          sta             KeyState2
2352 4 robfinch
                              dbgk12:
2353 16 robfinch
 00FFEB8F 00F120                          clr             KeyState1
2354
 00FFEB91 020F03                          bra             dbgk2
2355 4 robfinch
                              dbgkNotAlt:
2356 16 robfinch
 00FFEB93 00D120                          tst             KeyState1
2357
 00FFEB95 027004                          beq             dbgk13
2358
 00FFEB97 00F120                          clr             KeyState1
2359
 00FFEB99 020EFB                          bra             dbgk2
2360 4 robfinch
                              dbgk13:
2361 16 robfinch
 00FFEB9B 096121                          lda             KeyState2               ; Check for CTRL-ALT-DEL
2362
 00FFEB9D 084006                          anda    #6
2363
 00FFEB9F 081006                          cmpa    #6
2364
 00FFEBA1 026008                          bne             dbgk14
2365
 00FFEBA3 0C1071                          cmpb    #SC_DEL
2366
 00FFEBA5 026004                          bne             dbgk14
2367
 00FFEBA7 06E90FFFFFFC                    jmp             [$FFFFFC]               ; jump to NMI vector
2368 4 robfinch
                              dbgk14:
2369 16 robfinch
 00FFEBAB 00D121                          tst             KeyState2               ; extended code?
2370
 00FFEBAD 02A00B                          bpl             dbgk15
2371
 00FFEBAF 096121                          lda             KeyState2
2372
 00FFEBB1 0847FF                          anda    #$7FF
2373
 00FFEBB3 097121                          sta             KeyState2
2374
 00FFEBB5 08EFFE880                       ldx             #keybdExtendedCodes
2375
 00FFEBB8 020017                          bra             dbgk18
2376 4 robfinch
                              dbgk15:
2377 16 robfinch
 00FFEBBA 096121                          lda             KeyState2               ; Is CTRL down?
2378
 00FFEBBC 085004                          bita    #4
2379
 00FFEBBE 027005                          beq             dbgk16
2380
 00FFEBC0 08EFFE800                       ldx             #keybdControlCodes
2381
 00FFEBC3 02000C                          bra             dbgk18
2382 4 robfinch
                              dbgk16:
2383 16 robfinch
 00FFEBC5 085001                          bita    #1                                      ; Is shift down?
2384
 00FFEBC7 027005                          beq             dbgk17
2385
 00FFEBC9 08EFFE700                       ldx             #shiftedScanCodes
2386
 00FFEBCC 020003                          bra             dbgk18
2387 4 robfinch
                              dbgk17:
2388 16 robfinch
 00FFEBCE 08EFFE600                       ldx             #unshiftedScanCodes
2389 4 robfinch
                              dbgk18:
2390 16 robfinch
 00FFEBD1 0E690FFFE600                    ldb             b,x                                     ; load accb with ascii from table
2391
 00FFEBD5 04F                             clra
2392
 00FFEBD6 0350B0                          puls    x,y,pc                  ; and return
2393 4 robfinch
 
2394
 
2395 16 robfinch
 00FFEBD8 04B04505904204F041052           fcb             "KEYBOARD"
2396
 00FFEBDF 044
2397
 00FFEBE0 FFEBEA                          fcw             KeybdOpen
2398
 00FFEBE2 FFEBEB                          fcw             KeybdClose
2399
 00FFEBE4 FFEBEC                          fcw             KeybdRead
2400
 00FFEBE6 FFEBED                          fcw             KeybdWrite
2401
 00FFEBE8 FFEBEE                          fcw             KeybdSeek
2402 4 robfinch
 
2403
                              ; Keyboard Open:
2404
                              ; Initialize the keyboard buffer head and tail indexes
2405
                              ;
2406
                              KeybdOpen:
2407 16 robfinch
 00FFEBEA 039                             rts
2408 4 robfinch
 
2409
                              ; Keyboard Close:
2410
                              ; Nothing to do except maybe clear the keyboard buffer
2411
                              ;
2412
                              KeybdClose:
2413 16 robfinch
 00FFEBEB 039                             rts
2414 4 robfinch
                              ;
2415
                              KeybdRead:
2416 16 robfinch
 00FFEBEC 039                             rts
2417 4 robfinch
                              ;
2418
                              KeybdWrite:
2419 16 robfinch
 00FFEBED 039                             rts
2420 4 robfinch
 
2421
                              KeybdSeek:
2422 16 robfinch
 00FFEBEE 039                             rts
2423 4 robfinch
 
2424 13 robfinch
                              ;==============================================================================
2425
                              ; Serial I/O
2426
                              ;==============================================================================
2427
 
2428
                              ; ============================================================================
2429
                              ;        __
2430
                              ;   \\__/ o\    (C) 2022  Robert Finch, Waterloo
2431
                              ;    \  __ /    All rights reserved.
2432
                              ;     \/_//     robfinch@opencores.org
2433
                              ;       ||
2434
                              ;
2435
                              ;
2436
                              ; Serial port routines for a WDC6551 compatible circuit.
2437
                              ;
2438
                              ; This source file is free software: you can redistribute it and/or modify
2439
                              ; it under the terms of the GNU Lesser General Public License as published
2440
                              ; by the Free Software Foundation, either version 3 of the License, or
2441
                              ; (at your option) any later version.
2442
                              ;
2443
                              ; This source file is distributed in the hope that it will be useful,
2444
                              ; but WITHOUT ANY WARRANTY; without even the implied warranty of
2445
                              ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2446
                              ; GNU General Public License for more details.
2447
                              ;
2448
                              ; You should have received a copy of the GNU General Public License
2449
                              ; along with this program.  If not, see .
2450
                              ;
2451
                              ; ============================================================================
2452
                              ;
2453 4 robfinch
                              ;------------------------------------------------------------------------------
2454 13 robfinch
                              ; Initialize serial port.
2455
                              ;
2456
                              ; Clear buffer indexes. Two bytes are used for the buffer index even though
2457
                              ; only a single byte is needed. This is for convenience in calculating the
2458
                              ; number of characters in the buffer, done later. The upper byte remains at
2459
                              ; zero.
2460
                              ; The port is initialized for 9600 baud, 1 stop bit and 8 bits data sent.
2461
                              ; The internal baud rate generator is used.
2462
                              ;
2463
                              ; Parameters:
2464
                              ;               none
2465
                              ; Modifies:
2466
                              ;               d
2467
                              ; Returns:
2468
                              ;               none
2469
                              ;------------------------------------------------------------------------------
2470
 
2471 21 robfinch
                                      setdp   $FFC
2472
 
2473 13 robfinch
                              InitSerial:
2474
                              SerialInit:
2475 21 robfinch
 00FFEBEF 034008                          pshs    dpr
2476
 00FFEBF1 086FFC                          lda             #$FFC
2477
 00FFEBF3 01F08B                          tfr             a,dpr
2478
 00FFEBF5 04F                             clra
2479
 00FFEBF6 05F                             clrb
2480
 00FFEBF7 00F015                          clr             SerHeadRcv
2481
 00FFEBF9 00F016                          clr             SerTailRcv
2482
 00FFEBFB 00F017                          clr             SerHeadXmit
2483
 00FFEBFD 00F018                          clr             SerTailXmit
2484
 00FFEBFF 00F019                          clr             SerRcvXon
2485
 00FFEC01 00F01A                          clr             SerRcvXoff
2486
 00FFEC03 0150B6FFFFFFFE0                 lda             COREID
2487 13 robfinch
                              sini1:
2488 21 robfinch
 00FFEC08 091010                          cmpa    IOFocusID
2489
 00FFEC0A 026FFC                          bne             sini1
2490
 00FFEC0C 0C600B                          ldb             #$0B                                            ; dtr,rts active, rxint enabled (bit 1=0), no parity
2491
 00FFEC0E 0150F7FFFE30102                 stb             ACIA+ACIA_CMD
2492
 00FFEC13 0C601E                          ldb             #$1E                                            ; baud 9600, 1 stop bit, 8 bit, internal baud gen
2493
 00FFEC15 0150F7FFFE30103                 stb             ACIA+ACIA_CTRL
2494
 00FFEC1A 0C60AC                          ldb             #$0AC                                           ; disable fifos (bit zero, one), reset fifos
2495
 00FFEC1C 0150F7FFFE3010B                 stb             ACIA+ACIA_CTRL2
2496
 00FFEC21 035088                          puls    dpr,pc
2497 13 robfinch
 
2498
                              ;------------------------------------------------------------------------------
2499
                              ; SerialGetChar
2500
                              ;
2501
                              ; Check the serial port buffer to see if there's a char available. If there's
2502
                              ; a char available then return it. If the buffer is almost empty then send an
2503
                              ; XON.
2504
                              ;
2505
                              ; Stack Space:
2506 21 robfinch
                              ;               3 words
2507 13 robfinch
                              ; Parameters:
2508
                              ;               none
2509
                              ; Modifies:
2510
                              ;               none
2511
                              ; Returns:
2512
                              ;               d = character or -1
2513
                              ;------------------------------------------------------------------------------
2514
 
2515
                              SerialGetChar:
2516 21 robfinch
 00FFEC23 034039                          pshs    ccr,x,y,dpr
2517
 00FFEC25 086FFC                          lda             #$FFC
2518
 00FFEC27 01F08B                          tfr             a,dpr
2519
 00FFEC29 01A010                          sei                                                                             ; disable interrupts
2520
 00FFEC2B 08D090                          bsr             SerialRcvCount                  ; check number of chars in receive buffer
2521
 00FFEC2D 0C1008                          cmpb    #8                                                      ; less than 8?
2522
 00FFEC2F 02200C                          bhi             sgc2
2523
 00FFEC31 0D6019                          ldb             SerRcvXon                               ; skip sending XON if already sent
2524
 00FFEC33 026008                          bne       sgc2            ; XON already sent?
2525
 00FFEC35 0C6011                          ldb             #XON                                            ; if <8 send an XON
2526
 00FFEC37 00F01A                          clr             SerRcvXoff                      ; clear XOFF status
2527
 00FFEC39 0D7019                          stb             SerRcvXon                               ; flag so we don't send it multiple times
2528
 00FFEC3B 08D05D                          bsr             SerialPutChar
2529 13 robfinch
                              sgc2:
2530 21 robfinch
 00FFEC3D 0D6015                          ldb             SerHeadRcv                      ; check if anything is in buffer
2531
 00FFEC3F 0D1016                          cmpb    SerTailRcv
2532
 00FFEC41 02700D                          beq             sgcNoChars                      ; no?
2533
 00FFEC43 03080FFFB000                    leax    SerRcvBuf                               ; x = buffer address
2534
 00FFEC47 04F                             clra
2535
 00FFEC48 0E680FFFB000                    ldb             b,x                                                     ; get byte from buffer
2536
 00FFEC4C 00C015                          inc             SerHeadRcv                      ; 4k wrap around
2537
 00FFEC4E 020003                          bra             sgcXit
2538 13 robfinch
                              sgcNoChars:
2539 21 robfinch
 00FFEC50 0CCFFFFFF                       ldd             #-1
2540 13 robfinch
                              sgcXit:
2541 21 robfinch
 00FFEC53 0350B9                          puls    ccr,x,y,dpr,pc
2542 13 robfinch
 
2543
                              ;------------------------------------------------------------------------------
2544
                              ; SerialPeekChar
2545
                              ;
2546
                              ; Check the serial port buffer to see if there's a char available. If there's
2547
                              ; a char available then return it. But don't update the buffer indexes. No need
2548
                              ; to send an XON here.
2549
                              ;
2550
                              ; Stack Space:
2551 21 robfinch
                              ;               2 words
2552 13 robfinch
                              ; Parameters:
2553
                              ;               none
2554
                              ; Modifies:
2555
                              ;               none
2556
                              ; Returns:
2557
                              ;               d = character or -1
2558
                              ;------------------------------------------------------------------------------
2559
 
2560
                              SerialPeekChar:
2561 21 robfinch
 00FFEC55 034019                          pshs    x,ccr,dpr
2562
 00FFEC57 086FFC                          lda             #$FFC
2563
 00FFEC59 01F08B                          tfr             a,dpr
2564
 00FFEC5B 01A010                          sei
2565
 00FFEC5D 0D6015                          ldb             SerHeadRcv                              ; check if anything is in buffer
2566
 00FFEC5F 0D1016                          cmpb    SerTailRcv
2567
 00FFEC61 02700B                          beq             spcNoChars                              ; no?
2568
 00FFEC63 03080FFFB000                    leax    SerRcvBuf
2569
 00FFEC67 04F                             clra
2570
 00FFEC68 0E680FFFB000                    ldb             b,x                                                             ; get byte from buffer
2571
 00FFEC6C 020003                          bra             spcXit
2572 13 robfinch
                              spcNoChars:
2573 21 robfinch
 00FFEC6E 0CCFFFFFF                       ldd             #-1
2574 13 robfinch
                              spcXit:
2575 21 robfinch
 00FFEC71 035099                          puls    x,ccr,dpr,pc
2576 13 robfinch
 
2577
                              ;------------------------------------------------------------------------------
2578
                              ; SerialPeekChar
2579
                              ;               Get a character directly from the I/O port. This bypasses the input
2580
                              ; buffer.
2581
                              ;
2582
                              ; Stack Space:
2583
                              ;               0 words
2584
                              ; Parameters:
2585
                              ;               none
2586
                              ; Modifies:
2587
                              ;               d
2588
                              ; Returns:
2589
                              ;               d = character or -1
2590
                              ;------------------------------------------------------------------------------
2591
 
2592
                              SerialPeekCharDirect:
2593 21 robfinch
 00FFEC73 034009                          pshs    ccr,dpr
2594
 00FFEC75 086FFC                          lda             #$FFC
2595
 00FFEC77 01F08B                          tfr             a,dpr
2596
 00FFEC79 0150B6FFFFFFFE0                 lda             COREID                                                  ; Ensure we have the IO Focus
2597
 00FFEC7E 091010                          cmpa    IOFocusID
2598
 00FFEC80 026013                          bne             spcd0001
2599 13 robfinch
                                      ; Disallow interrupts between status read and rx read.
2600 21 robfinch
 00FFEC82 01A010                          sei
2601
 00FFEC84 0150F6FFFE30101                 ldb             ACIA+ACIA_STAT
2602
 00FFEC89 0C5008                          bitb    #8                                                                      ; look for Rx not empty
2603
 00FFEC8B 027008                          beq             spcd0001
2604
 00FFEC8D 04F                             clra
2605
 00FFEC8E 0150F6FFFE30100                 ldb             ACIA+ACIA_RX
2606
 00FFEC93 035089                          puls    ccr,dpr,pc
2607 13 robfinch
                              spcd0001:
2608 21 robfinch
 00FFEC95 0CCFFFFFF                       ldd             #-1
2609
 00FFEC98 035089                          puls    ccr,dpr,pc
2610 13 robfinch
 
2611
                              ;------------------------------------------------------------------------------
2612
                              ; SerialPutChar
2613
                              ;    Put a character to the serial transmitter. This routine blocks until the
2614
                              ; transmitter is empty.
2615
                              ;
2616
                              ; Stack Space
2617
                              ;               0 words
2618
                              ; Parameters:
2619
                              ;               b = character to put
2620
                              ; Modifies:
2621
                              ;               none
2622
                              ;------------------------------------------------------------------------------
2623
 
2624
                              SerialPutChar:
2625 21 robfinch
 00FFEC9A 03400B                          pshs    a,ccr,dpr
2626
 00FFEC9C 086FFC                          lda             #$FFC
2627
 00FFEC9E 01F08B                          tfr             a,dpr
2628 13 robfinch
                              spc0001:
2629 21 robfinch
 00FFECA0 0150B6FFFFFFFE0                 lda             COREID                                  ; Ensure we have the IO Focus
2630
 00FFECA5 091010                          cmpa    IOFocusID
2631
 00FFECA7 026FF7                          bne             spc0001
2632
 00FFECA9 01C0EF                          cli                                                                             ; provide a window for an interrupt to occur
2633
 00FFECAB 01A010                          sei
2634 13 robfinch
                                      ; Between the status read and the transmit do not allow an
2635
                                      ; intervening interrupt.
2636 21 robfinch
 00FFECAD 0150B6FFFE30101                 lda             ACIA+ACIA_STAT  ; wait until the uart indicates tx empty
2637
 00FFECB2 085010                          bita    #16                                                     ; bit #4 of the status reg
2638
 00FFECB4 027FEA                          beq             spc0001                     ; branch if transmitter is not empty
2639
 00FFECB6 0150F7FFFE30100                 stb             ACIA+ACIA_TX            ; send the byte
2640
 00FFECBB 03508B                          puls    a,ccr,dpr,pc
2641 13 robfinch
 
2642
                              ;------------------------------------------------------------------------------
2643 21 robfinch
                              ; Calculate number of character in input buffer. Direct page must be set
2644
                              ; already.
2645 13 robfinch
                              ;
2646
                              ; Parameters:
2647 21 robfinch
                              ;               none
2648 13 robfinch
                              ; Returns:
2649
                              ;               d = number of bytes in buffer.
2650
                              ;------------------------------------------------------------------------------
2651
 
2652
                              SerialRcvCount:
2653 21 robfinch
 00FFECBD 04F                             clra
2654
 00FFECBE 0D6016                          ldb             SerTailRcv
2655
 00FFECC0 0D0015                          subb    SerHeadRcv
2656
 00FFECC2 02C007                          bge             srcXit
2657
 00FFECC4 0CC001000                       ldd             #$1000
2658
 00FFECC7 093015                          subd    SerHeadRcv
2659
 00FFECC9 0D3016                          addd    SerTailRcv
2660 13 robfinch
                              srcXit:
2661 21 robfinch
 00FFECCB 039                             rts
2662 13 robfinch
 
2663
                              ;------------------------------------------------------------------------------
2664
                              ; Serial IRQ routine
2665
                              ;
2666
                              ; Keeps looping as long as it finds characters in the ACIA recieve buffer/fifo.
2667
                              ; Received characters are buffered. If the buffer becomes full, new characters
2668
                              ; will be lost.
2669
                              ;
2670
                              ; Parameters:
2671
                              ;               none
2672
                              ; Modifies:
2673
                              ;               d,x
2674
                              ; Returns:
2675
                              ;               none
2676
                              ;------------------------------------------------------------------------------
2677
 
2678
                              SerialIRQ:
2679 21 robfinch
 00FFECCC 034008                          pshs    dpr                                                     ; set direct page register to boot variables
2680
 00FFECCE 086FFC                          lda             #$FFC
2681
 00FFECD0 01F08B                          tfr             a,dpr
2682
 00FFECD2 0150B6FFFE3F0D3                 lda             PIC+$D3                                 ; Serial active interrupt flag
2683
 00FFECD7 027042                          beq             notSerInt
2684 13 robfinch
                              sirqNxtByte:
2685 21 robfinch
 00FFECD9 0150F6FFFE30104                 ldb             ACIA+ACIA_IRQS  ; look for IRQs
2686
 00FFECDE 02A03B                          bpl             notSerInt                               ; quick test for any irqs
2687
 00FFECE0 0150F6FFFE30101                 ldb             ACIA+ACIA_STAT  ; check the status
2688
 00FFECE5 0C5008                          bitb    #$08                                            ; bit 3 = rx full (not empty)
2689
 00FFECE7 027030                          beq             notRxInt1
2690
 00FFECE9 0150F6FFFE30100                 ldb             ACIA+ACIA_RX            ; get data from Rx buffer to clear interrupt
2691
 00FFECEE 096016                          lda             SerTailRcv                      ; check if recieve buffer full
2692
 00FFECF0 04C                             inca
2693
 00FFECF1 091015                          cmpa    SerHeadRcv
2694
 00FFECF3 027026                          beq             sirqRxFull
2695
 00FFECF5 097016                          sta             SerTailRcv                      ; update tail pointer
2696
 00FFECF7 04A                             deca                                                                    ; backup
2697
 00FFECF8 01E089                          exg             a,b
2698
 00FFECFA 03080FFFB000                    leax    SerRcvBuf                               ; x = buffer address
2699
 00FFECFE 0A780FFFB000                    sta             b,x                                                     ; store recieved byte in buffer
2700
 00FFED02 00D01A                          tst             SerRcvXoff                      ; check if xoff already sent
2701
 00FFED04 026FD3                          bne             sirqNxtByte
2702
 00FFED06 08DFB5                          bsr             SerialRcvCount  ; if more than 4070 chars in buffer
2703
 00FFED08 0C1FE6                          cmpb    #4070
2704
 00FFED0A 025FCD                          blo             sirqNxtByte
2705
 00FFED0C 0C6013                          ldb             #XOFF                                           ; send an XOFF
2706
 00FFED0E 00F019                          clr             SerRcvXon                               ; clear XON status
2707
 00FFED10 0D701A                          stb             SerRcvXoff                      ; set XOFF status
2708
 00FFED12 0150F7FFFE30100                 stb             ACIA+ACIA_TX
2709
 00FFED17 020FC0                          bra             sirqNxtByte     ; check the status for another byte
2710
                                      ; Process other serial IRQs
2711
                              notRxInt1:
2712
 00FFED19 035088                          puls    dpr,pc
2713 13 robfinch
                              sirqRxFull:
2714
                              notRxInt:
2715 21 robfinch
                              notSerInt:
2716
 00FFED1B 035088                          puls    dpr,pc
2717 13 robfinch
 
2718
                              nmeSerial:
2719 21 robfinch
 00FFED1D 05306507206906106C000           fcb             "Serial",0
2720 13 robfinch
 
2721
                              ;------------------------------------------------------------------------------
2722
                              ; Put a string to the serial port.
2723
                              ;
2724
                              ; Parameters:
2725
                              ;               d = pointer to string
2726
                              ; Modifies:
2727
                              ;               none
2728
                              ; Returns:
2729
                              ;               none
2730
                              ;------------------------------------------------------------------------------
2731
 
2732
                              SerialPutString:
2733 21 robfinch
 00FFED24 034016                          pshs    d,x
2734
 00FFED26 01F001                          tfr             d,x
2735 13 robfinch
                              sps2:
2736 21 robfinch
 00FFED28 0E6804                          ldb             ,x
2737
 00FFED2A 027006                          beq             spsXit
2738
 00FFED2C 030001                          inx
2739
 00FFED2E 08DF6A                          bsr             SerialPutChar
2740
 00FFED30 020FF6                          bra             sps2
2741 13 robfinch
                              spsXit:
2742 21 robfinch
 00FFED32 035096                          puls    d,x,pc
2743 13 robfinch
 
2744
                              ;------------------------------------------------------------------------------
2745
                              ; A little routine to test serial output.
2746
                              ;
2747
                              ; Parameters:
2748
                              ;               none
2749
                              ; Modifies:
2750
                              ;               none
2751
                              ; Returns:
2752
                              ;               none
2753
                              ;------------------------------------------------------------------------------
2754
 
2755
                              SerialOutputTest:
2756 21 robfinch
 00FFED34 034006                          pshs    d
2757
 00FFED36 0CCFFED54                       ldd             #msgSerialTest
2758
 00FFED39 017FFF6A1                       lbsr    DisplayString
2759 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
2760 21 robfinch
 00FFED3C 08DEB1                          bsr             SerialInit
2761 13 robfinch
                              sotst1:
2762 21 robfinch
 00FFED3E 0C6011                          ldb             #XON
2763
 00FFED40 08DF58                          bsr             SerialPutChar
2764
 00FFED42 08DF56                          bsr             SerialPutChar
2765
 00FFED44 08DF54                          bsr             SerialPutChar
2766
 00FFED46 0CCFFED54                       ldd             #msgSerialTest
2767
 00FFED49 08DFD9                          bsr             SerialPutString
2768
 00FFED4B 017000443                       lbsr    INCH
2769
 00FFED4E 0C1003                          cmpb    #CTRLC
2770
 00FFED50 026FEC                          bne             sotst1
2771
 00FFED52 035086                          puls    d,pc
2772 13 robfinch
 
2773
                              msgSerialTest:
2774 21 robfinch
 00FFED54 05306507206906106C020           fcb     "Serial port test",CR,LF,0
2775
 00FFED5B 07006F072074020074065
2776
 00FFED62 07307400D00A000
2777 13 robfinch
 
2778 21 robfinch
                                      setdp   $000
2779 16 robfinch
                              ; ============================================================================
2780
                              ;        __
2781
                              ;   \\__/ o\    (C) 2022  Robert Finch, Waterloo
2782
                              ;    \  __ /    All rights reserved.
2783
                              ;     \/_//     robfinch@opencores.org
2784
                              ;       ||
2785
                              ;
2786
                              ;
2787
                              ; BSD 3-Clause License
2788
                              ; Redistribution and use in source and binary forms, with or without
2789
                              ; modification, are permitted provided that the following conditions are met:
2790
                              ;
2791
                              ; 1. Redistributions of source code must retain the above copyright notice, this
2792
                              ;    list of conditions and the following disclaimer.
2793
                              ;
2794
                              ; 2. Redistributions in binary form must reproduce the above copyright notice,
2795
                              ;    this list of conditions and the following disclaimer in the documentation
2796
                              ;    and/or other materials provided with the distribution.
2797
                              ;
2798
                              ; 3. Neither the name of the copyright holder nor the names of its
2799
                              ;    contributors may be used to endorse or promote products derived from
2800
                              ;    this software without specific prior written permission.
2801
                              ;
2802
                              ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2803
                              ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2804
                              ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2805
                              ; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
2806
                              ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2807
                              ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2808
                              ; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
2809
                              ; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2810
                              ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2811
                              ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2812
                              ;
2813
                              ; ============================================================================
2814
                              ;
2815 21 robfinch
                              ; S19 variables
2816
                              ;
2817 16 robfinch
                              s19Address                      EQU             $940    ; to $943
2818
                              s19StartAddress EQU             $944    ; to $947
2819
                              s19Rectype                      EQU             $948
2820
                              s19Reclen                               EQU             $949
2821
                              s19Abort                                EQU             $94A
2822 21 robfinch
                              s19Checksum                     EQU             $94B
2823
                              s19SummaryChecksum      EQU             $94C
2824
                              s19Source                               EQU             $94E
2825
                              s19XferAddress  EQU     $950    ; to $951
2826 13 robfinch
 
2827 16 robfinch
                              ; ------------------------------------------------------------------------------
2828 21 robfinch
                              ; Input a character either from a file in memory or from the serial port.
2829
                              ;
2830
                              ; Parameters:
2831
                              ;               none
2832
                              ;       Returns:
2833
                              ;               accb = character input
2834
                              ; ------------------------------------------------------------------------------
2835
 
2836
                              s19InputChar:
2837
 00FFED67 07D00094E                       tst             s19Source
2838
 00FFED6A 02700D                          beq             s19ic1
2839
 00FFED6C 0E690F000950                    ldb             [s19XferAddress]
2840
 00FFED70 07C000951                       inc             s19XferAddress+1        ; increment low byte of address pointer
2841
 00FFED73 026003                          bne             s19ic2
2842
 00FFED75 07C000950                       inc             s19XferAddress          ; increment high byte of address pointer
2843
                              s19ic2:
2844
 00FFED78 039                             rts
2845
                              s19ic1:
2846
 00FFED79 0CCFFFFFF                       ldd             #-1                                                     ; block until input is available
2847
 00FFED7C 03F                             swi
2848
 00FFED7D 001                             fcb             MF_INCH                                 ; monitor input rout
2849
 00FFED7E 039                             rts
2850
 
2851
                              ; ------------------------------------------------------------------------------
2852 16 robfinch
                              ; Skip over input to the next record.
2853
                              ; ------------------------------------------------------------------------------
2854
 
2855
                              s19NextRecord:
2856 21 robfinch
 00FFED7F 08DFE6                          bsr             s19InputChar
2857
 00FFED81 0C100A                          cmpb    #LF                                                     ; line feed marks end of record
2858
 00FFED83 027013                          beq             s19nr1
2859
 00FFED85 0C1003                          cmpb    #CTRLC                                  ; should not get this in a file transfer
2860
 00FFED87 026003                          bne             s19nr2
2861
 00FFED89 0F700094A                       stb             s19Abort
2862 16 robfinch
                              s19nr2:
2863 21 robfinch
 00FFED8C 0C101A                          cmpb    #CTRLZ                                  ; end of file marker?
2864
 00FFED8E 026003                          bne             s19nr3
2865
 00FFED90 0F700094A                       stb             s19Abort
2866 16 robfinch
                              s19nr3:
2867 21 robfinch
 00FFED93 07D00094A                       tst             s19Abort
2868
 00FFED96 027FE7                          beq             s19NextRecord
2869 16 robfinch
                              s19nr1:
2870 21 robfinch
 00FFED98 039                             rts
2871 16 robfinch
 
2872
                              ; ------------------------------------------------------------------------------
2873 21 robfinch
                              ; Update the checksum.
2874
                              ; ------------------------------------------------------------------------------
2875
 
2876
                              s19AddCheck:
2877
 00FFED99 034004                          pshs    b
2878
 00FFED9B 0FB00094B                       addb    s19Checksum
2879
 00FFED9E 0F700094B                       stb             s19Checksum
2880
 00FFEDA1 035084                          puls    b,pc
2881
 
2882
                              ; ------------------------------------------------------------------------------
2883 16 robfinch
                              ; Input a byte. There are three characters per byte since things are 12-bit.
2884
                              ;
2885
                              ;       Parameters:
2886
                              ;               none
2887
                              ; Returns:
2888
                              ;               accb = byte value converted from text
2889
                              ; ------------------------------------------------------------------------------
2890
 
2891
                              s19GetByte:
2892 21 robfinch
 00FFEDA3 08DFC2                          bsr             s19InputChar                    ; get the first character
2893
 00FFEDA5 0170007F7                       lbsr    AsciiToHexNybble        ; convert to nybble
2894
 00FFEDA8 07D00094A                       tst             s19Abort                                        ; check for abort
2895
 00FFEDAB 027002                          beq             s19gb1
2896
 00FFEDAD 04F                             clra
2897
 00FFEDAE 039                             rts
2898 16 robfinch
                              s19gb1:                                                                         ; shift the value four bits
2899 21 robfinch
 00FFEDAF 058                             aslb
2900
 00FFEDB0 058                             aslb
2901
 00FFEDB1 058                             aslb
2902
 00FFEDB2 058                             aslb
2903
 00FFEDB3 034004                          pshs    b                                                                       ; save off value
2904
 00FFEDB5 08DFB0                          bsr             s19InputChar                    ; get the second character
2905
 00FFEDB7 0170007E5                       lbsr    AsciiToHexNybble        ; convert to nybble
2906
 00FFEDBA 07D00094A                       tst             s19Abort                                        ; check for abort
2907
 00FFEDBD 026011                          bne             s19gb2
2908
 00FFEDBF 0EAE00                          orb             ,s+                                                             ; merge new nybble into value
2909
 00FFEDC1 058                             aslb                                                                            ; shift the value four more bits
2910
 00FFEDC2 058                             aslb
2911
 00FFEDC3 058                             aslb
2912
 00FFEDC4 058                             aslb
2913
 00FFEDC5 034004                          pshs    b                                                                       ; save off value
2914
 00FFEDC7 08DF9E                          bsr             s19InputChar                    ; get the third character
2915
 00FFEDC9 0170007D3                       lbsr    AsciiToHexNybble        ; convert to nybble
2916
 00FFEDCC 0EAE00                          orb             ,s+                                                             ; merge in value
2917
 00FFEDCE 04F                             clra                                                                            ; make byte 000 to FFF in D
2918
 00FFEDCF 039                             rts
2919 16 robfinch
                              s19gb2:
2920 21 robfinch
 00FFEDD0 032601                          leas    1,s                                                             ; discard saved byte
2921
 00FFEDD2 04F                             clra
2922
 00FFEDD3 039                             rts
2923 16 robfinch
 
2924
                              ; ------------------------------------------------------------------------------
2925
                              ; Zero out address
2926
                              ; ------------------------------------------------------------------------------
2927
 
2928
                              s19ClearAddress:
2929 21 robfinch
 00FFEDD4 07F000940                       clr             s19Address
2930
 00FFEDD7 07F000941                       clr             s19Address+1
2931
 00FFEDDA 07F000942                       clr             s19Address+2
2932
 00FFEDDD 07F000943                       clr             s19Address+3
2933
 00FFEDE0 039                             rts
2934 16 robfinch
 
2935
                              ; ------------------------------------------------------------------------------
2936
                              ; Get an address composed of two bytes (24 bit)
2937
                              ;
2938
                              ; Side Effects:
2939
                              ;               updates s19Address variable
2940
                              ; Returns:
2941
                              ;       none
2942
                              ; ------------------------------------------------------------------------------
2943
 
2944
                              s19GetAddress2:
2945 21 robfinch
 00FFEDE1 08DFF1                          bsr             s19ClearAddress
2946
 00FFEDE3 08DFBE                          bsr             s19GetByte
2947
 00FFEDE5 08DFB2                          bsr             s19AddCheck
2948
 00FFEDE7 0F7000942                       stb             s19Address+2
2949
 00FFEDEA 07D00094A                       tst             s19Abort
2950
 00FFEDED 026007                          bne             s19ga1
2951
 00FFEDEF 08DFB2                          bsr             s19GetByte
2952
 00FFEDF1 08DFA6                          bsr             s19AddCheck
2953
 00FFEDF3 0F7000943                       stb             s19Address+3
2954 16 robfinch
                              s19ga1:
2955 21 robfinch
 00FFEDF6 039                             rts
2956 16 robfinch
 
2957
                              ; ------------------------------------------------------------------------------
2958
                              ; Get an address composed of three bytes (36 bit)
2959
                              ;
2960
                              ; Side Effects:
2961
                              ;               updates s19Address variable
2962
                              ; Returns:
2963
                              ;       none
2964
                              ; ------------------------------------------------------------------------------
2965
 
2966
                              s19GetAddress3:
2967 21 robfinch
 00FFEDF7 08DFDB                          bsr             s19ClearAddress
2968
 00FFEDF9 08DFA8                          bsr             s19GetByte
2969
 00FFEDFB 08DF9C                          bsr             s19AddCheck
2970
 00FFEDFD 0F7000941                       stb             s19Address+1
2971
 00FFEE00 07D00094A                       tst             s19Abort
2972
 00FFEE03 026013                          bne             s19ga2
2973
 00FFEE05 08DF9C                          bsr             s19GetByte
2974
 00FFEE07 08DF90                          bsr             s19AddCheck
2975
 00FFEE09 0F7000942                       stb             s19Address+2
2976
 00FFEE0C 07D00094A                       tst             s19Abort
2977
 00FFEE0F 026007                          bne             s19ga2
2978
 00FFEE11 08DF90                          bsr             s19GetByte
2979
 00FFEE13 08DF84                          bsr             s19AddCheck
2980
 00FFEE15 0F7000943                       stb             s19Address+3
2981 16 robfinch
                              s19ga2:
2982 21 robfinch
 00FFEE18 039                             rts
2983 16 robfinch
 
2984
                              ; ------------------------------------------------------------------------------
2985
                              ; Put a byte to memory.
2986
                              ; ------------------------------------------------------------------------------
2987
 
2988
                              s19PutMem:
2989 21 robfinch
 00FFEE19 05F                             clrb                                                            ; accb = current byte count
2990 16 robfinch
                              s19pm3:
2991 21 robfinch
 00FFEE1A 034004                          pshs    b                                                       ; save byte count
2992
 00FFEE1C 08DF85                          bsr             s19GetByte
2993
 00FFEE1E 08DF79                          bsr             s19AddCheck
2994
 00FFEE20 07D00094A                       tst             s19Abort
2995
 00FFEE23 02601E                          bne             s19pm1
2996
 00FFEE25 0150E790F000941                 stb             far [s19Address+1]      ; store the byte using far addressing
2997
 00FFEE2A 07C000943                       inc             s19Address+3
2998
 00FFEE2D 026008                          bne             s19pm2
2999
 00FFEE2F 07C000942                       inc             s19Address+2
3000
 00FFEE32 026003                          bne             s19pm2
3001
 00FFEE34 07C000941                       inc             s19Address+1
3002 16 robfinch
                              s19pm2:
3003 21 robfinch
 00FFEE37 035004                          puls    b                                                       ; get back byte count
3004
 00FFEE39 05C                             incb                                                            ; increment and
3005
 00FFEE3A 0F1000949                       cmpb    s19Reclen                       ; compare to record length
3006
 00FFEE3D 025FDB                          blo             s19pm3
3007
 00FFEE3F 08DF62                          bsr             s19GetByte              ; get the checksum byte
3008
 00FFEE41 020F56                          bra             s19AddCheck
3009 16 robfinch
                              s19pm1:
3010 21 robfinch
 00FFEE43 032601                          leas    1,s                                             ; faster than actual pull
3011
 00FFEE45 08DF5C                          bsr             s19GetByte              ; get the checksum byte
3012
 00FFEE47 020F50                          bra             s19AddCheck
3013 16 robfinch
 
3014
                              ; ------------------------------------------------------------------------------
3015
                              ; Processing for S1 record type.
3016
                              ; ------------------------------------------------------------------------------
3017
 
3018
                              s19ProcessS1:
3019 21 robfinch
 00FFEE49 08DF96                          bsr             s19GetAddress2
3020
 00FFEE4B 08DFCC                          bsr             s19PutMem
3021
 00FFEE4D 07D00094B                       tst             s19Checksum
3022
 00FFEE50 027008                          beq             s19p11
3023
 00FFEE52 07C00094C                       inc             s19SummaryChecksum
3024
 00FFEE55 0CCFFEF19                       ldd             #msgChecksumErr
3025
 00FFEE58 03F                             swi
3026
 00FFEE59 004                             fcb             MF_DisplayString
3027
                              s19p11:
3028
 00FFEE5A 020099                          bra             s19lnr
3029 16 robfinch
 
3030
                              ; ------------------------------------------------------------------------------
3031
                              ; Processing for S2 record type.
3032
                              ; ------------------------------------------------------------------------------
3033
 
3034
                              s19ProcessS2:
3035 21 robfinch
 00FFEE5C 08DF99                          bsr             s19GetAddress3
3036
 00FFEE5E 08DFB9                          bsr             s19PutMem
3037
 00FFEE60 07D00094B                       tst             s19Checksum
3038
 00FFEE63 027008                          beq             s19p21
3039
 00FFEE65 07C00094C                       inc             s19SummaryChecksum
3040
 00FFEE68 0CCFFEF19                       ldd             #msgChecksumErr
3041
 00FFEE6B 03F                             swi
3042
 00FFEE6C 004                             fcb             MF_DisplayString
3043
                              s19p21:
3044
 00FFEE6D 020086                          bra             s19lnr
3045 16 robfinch
 
3046
                              ; S3,4,5,6 not processed
3047
 
3048
                              ; ------------------------------------------------------------------------------
3049
                              ; Processing for S7 record type. Gets a two byte (24 bit) start address.
3050
                              ; ------------------------------------------------------------------------------
3051
 
3052
                              s19ProcessS9:
3053 21 robfinch
 00FFEE6F 08DF70                          bsr             s19GetAddress2
3054
 00FFEE71 0FC000942                       ldd             s19Address+2
3055
 00FFEE74 0FD000946                       std             s19StartAddress+2
3056
 00FFEE77 0FC000940                       ldd             s19Address+0
3057
 00FFEE7A 0FD000944                       std             s19StartAddress+0
3058
 00FFEE7D 020083                          bra             s19l2
3059 16 robfinch
 
3060
                              ; ------------------------------------------------------------------------------
3061
                              ; Processing for S8 record type. Gets a three byte (36 bit) start address.
3062
                              ; ------------------------------------------------------------------------------
3063
 
3064
                              s19ProcessS8:
3065 21 robfinch
 00FFEE7F 08DF76                          bsr             s19GetAddress3
3066
 00FFEE81 0FC000942                       ldd             s19Address+2
3067
 00FFEE84 0FD000946                       std             s19StartAddress+2
3068
 00FFEE87 0FC000940                       ldd             s19Address+0
3069
 00FFEE8A 0FD000944                       std             s19StartAddress+0
3070
 00FFEE8D 020073                          bra             s19l2
3071 16 robfinch
 
3072
                              ; ------------------------------------------------------------------------------
3073
                              ; S19 Loader
3074
                              ;
3075
                              ; Not all record types are processed. Some are skipped over.
3076
                              ; ------------------------------------------------------------------------------
3077
 
3078
                              S19Loader:
3079 21 robfinch
 00FFEE8F 07F00094E                       clr             s19Source
3080
 00FFEE92 0170006FC                       lbsr    GetNumber                               ; check for a file storage address
3081
 00FFEE95 05D                             tstb
3082
 00FFEE96 027009                          beq             s19l4                                           ; if not a memory file
3083
 00FFEE98 07C00094E                       inc             s19Source                               ; set flag indicating a memory file
3084
 00FFEE9B 0FC000912                       ldd             mon_numwka+2            ; set transfer address variable
3085
 00FFEE9E 0FD000950                       std             s19XferAddress
3086
                              s19l4:
3087
 00FFEEA1 07F00094A                       clr             s19Abort                                ; clear the abort flag
3088
 00FFEEA4 0CCFFEF05                       ldd             #msgS19Loader           ; signon banner
3089
 00FFEEA7 03F                             swi
3090
 00FFEEA8 004                             fcb             MF_DisplayString
3091
 00FFEEA9 07F00094C                       clr             s19SummaryChecksum
3092 16 robfinch
                              s19l3:
3093 21 robfinch
 00FFEEAC 08DEB9                          bsr             s19InputChar            ; get a character from input
3094
 00FFEEAE 0C101A                          cmpb    #CTRLZ                                  ; is it CTRL-Z?
3095
 00FFEEB0 027050                          beq             s19l2
3096
 00FFEEB2 07F00094B                       clr             s19Checksum
3097
 00FFEEB5 0C1043                          cmpb    #'C'                                            ; records must start with the letter C
3098
 00FFEEB7 02603C                          bne             s19lnr
3099
 00FFEEB9 08DEAC                          bsr             s19InputChar            ; get the next character
3100
 00FFEEBB 0C1030                          cmpb    #'0'                                            ; must be a numeric digit
3101
 00FFEEBD 025036                          blo             s19lnr
3102
 00FFEEBF 0C1039                          cmpb    #'9'
3103
 00FFEEC1 022032                          bhi             s19lnr
3104
 00FFEEC3 0F7000948                       stb             s19Rectype                      ; save off in record type
3105
 00FFEEC6 08DEDB                          bsr             s19GetByte                      ; get a byte indicating record length
3106
 00FFEEC8 08DECF                          bsr             s19AddCheck
3107
 00FFEECA 0F7000949                       stb             s19Reclen
3108
 00FFEECD 07D00094A                       tst             s19Abort                                ; check for abort
3109
 00FFEED0 026030                          bne             s19l2
3110
 00FFEED2 0F6000948                       ldb             s19Rectype                      ; process according to record type
3111
 00FFEED5 0C1030                          cmpb    #'0'
3112
 00FFEED7 02701C                          beq             s19lnr
3113
 00FFEED9 0C1031                          cmpb    #'1'
3114
 00FFEEDB 027F6C                          beq             s19ProcessS1            ; data record with a two byte address
3115
 00FFEEDD 0C1032                          cmpb    #'2'
3116
 00FFEEDF 027F7B                          beq             s19ProcessS2            ; data record with a three byte address
3117
 00FFEEE1 0C1033                          cmpb    #'3'
3118
 00FFEEE3 027010                          beq             s19lnr
3119
 00FFEEE5 0C1035                          cmpb    #'5'                                            ; record count? ignore
3120
 00FFEEE7 02700C                          beq             s19lnr
3121
 00FFEEE9 0C1037                          cmpb    #'7'                                            ; ignore record with 48 bit address
3122
 00FFEEEB 027015                          beq             s19l2
3123
 00FFEEED 0C1038                          cmpb    #'8'
3124
 00FFEEEF 027F8E                          beq             s19ProcessS8            ; two byte start address
3125
 00FFEEF1 0C1039                          cmpb    #'9'
3126
 00FFEEF3 027F7A                          beq             s19ProcessS9            ; three byte start address
3127 16 robfinch
                              s19lnr:
3128 21 robfinch
 00FFEEF5 0C602E                          ldb             #'.'                                            ; output a progress indicator
3129
 00FFEEF7 03F                             swi
3130
 00FFEEF8 002                             fcb             MF_OUTCH
3131
 00FFEEF9 08DE84                          bsr             s19NextRecord           ; skip to the next record
3132
 00FFEEFB 07D00094A                       tst             S19Abort                                ; check for abort
3133
 00FFEEFE 026002                          bne             s19l2
3134
 00FFEF00 020FAA                          bra             s19l3                                           ; loop back to process more records
3135 16 robfinch
                              s19l2:
3136 21 robfinch
 00FFEF02 016000457                       lbra    Monitor
3137 16 robfinch
 
3138
                              msgS19Loader:
3139 21 robfinch
 00FFEF05 05303103902004C06F061           fcb     "S19 Loader Active",CR,LF,0
3140
 00FFEF0C 064065072020041063074
3141
 00FFEF13 06907606500D00A000
3142
                              msgChecksumErr:
3143
 00FFEF19 053031039020043068065           fcb     "S19 Checksum Err",CR,LF,0
3144
 00FFEF20 06306B07307506D020045
3145
 00FFEF27 07207200D00A000
3146 16 robfinch
 
3147
 
3148 21 robfinch
                              ; ============================================================================
3149
                              ;        __
3150
                              ;   \\__/ o\    (C) 2022  Robert Finch, Waterloo
3151
                              ;    \  __ /    All rights reserved.
3152
                              ;     \/_//     robfinch@opencores.org
3153
                              ;       ||
3154
                              ;
3155
                              ;
3156
                              ; BSD 3-Clause License
3157
                              ; Redistribution and use in source and binary forms, with or without
3158
                              ; modification, are permitted provided that the following conditions are met:
3159
                              ;
3160
                              ; 1. Redistributions of source code must retain the above copyright notice, this
3161
                              ;    list of conditions and the following disclaimer.
3162
                              ;
3163
                              ; 2. Redistributions in binary form must reproduce the above copyright notice,
3164
                              ;    this list of conditions and the following disclaimer in the documentation
3165
                              ;    and/or other materials provided with the distribution.
3166
                              ;
3167
                              ; 3. Neither the name of the copyright holder nor the names of its
3168
                              ;    contributors may be used to endorse or promote products derived from
3169
                              ;    this software without specific prior written permission.
3170
                              ;
3171
                              ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
3172
                              ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
3173
                              ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
3174
                              ; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
3175
                              ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3176
                              ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
3177
                              ; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
3178
                              ; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
3179
                              ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3180
                              ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3181
                              ;
3182
                              ; ============================================================================
3183
                              ;
3184
                              ; Xmodem variables
3185
                              ;
3186
                              xm_timer                                EQU             $FFC020
3187
                              xm_protocol                     EQU             $9F5
3188
                              xm_flag                                 EQU             $9F6
3189
                              xm_checksum                     EQU             $9F7
3190
                              xm_tmp2                                 EQU             $9F8
3191
                              xm_packetnum            EQU             $9FA
3192
                              xm_tmp                                  EQU             $9FC
3193
                              xm_crc                                  EQU             $9FE
3194
                              xm_ibuf                                 EQU             $A00    ; to $A7F
3195
                              xm_obuf                                 EQU             $A80    ; to $AFF
3196 16 robfinch
 
3197 21 robfinch
                              ; ------------------------------------------------------------------------------
3198
                              ; Send data using XModem.
3199
                              ; ------------------------------------------------------------------------------
3200
 
3201
                              xm_SendStart:
3202
 00FFEF2C 0170005A3                       lbsr    GetRange
3203
 00FFEF2F 0BE000922                       ldx             mon_r1+2                                ; x = buffer address
3204
 00FFEF32 01F013                          tfr             x,u
3205
 00FFEF34 0C6001                          ldb             #1                                                      ; packet numbers start at one
3206
 00FFEF36 0F70009FB                       stb             xm_packetnum+1
3207
                                      ; Wait for receiver to send a NAK
3208
                              xm_send:
3209
 00FFEF39 0CCFFFFFF                       ldd             #-1                                                     ; select blocking input
3210
 00FFEF3C 03F                             swi
3211
 00FFEF3D 001                             fcb             MF_INCH
3212
 00FFEF3E 0C1015                          cmpb    #NAK                                            ; should have got a NAK
3213
 00FFEF40 027004                          beq             xm_send5
3214
 00FFEF42 0C1043                          cmpb    #'C'                                            ; or a 'C'
3215
 00FFEF44 026FF3                          bne             xm_send
3216
                              xm_send5:
3217
 00FFEF46 0F70009F5                       stb             xm_protocol
3218
                              xm_send4:
3219
 00FFEF49 0C6001                          ldb             #SOH                                            ; send start
3220
 00FFEF4B 03F                             swi
3221
 00FFEF4C 1C9                             fcb             OUTCH
3222
 00FFEF4D 0F60009FB                       ldb             xm_packetnum+1  ; send packet number
3223
 00FFEF50 03F                             swi
3224
 00FFEF51 002                             fcb             MF_OUTCH
3225
 00FFEF52 053                             comb                                                                    ; one's complement
3226
 00FFEF53 03F                             swi
3227
 00FFEF54 002                             fcb             MF_OUTCH                                ; send packet number complement
3228
 00FFEF55 04F                             clra                                                                    ; acca = byte count
3229
 00FFEF56 01F013                          tfr             x,u                                                     ; u = buffer address
3230
                              xm_send1:
3231
 00FFEF58 0E6C00                          ldb             ,u+                                                     ; grab a byte from the buffer
3232
 00FFEF5A 03F                             swi
3233
 00FFEF5B 002                             fcb             MF_OUTCH                                ; send it out
3234
 00FFEF5C 04C                             inca
3235
 00FFEF5D 081080                          cmpa    #128                                            ; number of bytes in payload
3236
 00FFEF5F 025FF7                          blo             xm_send1
3237
 00FFEF61 0F60009F5                       ldb             xm_protocol
3238
 00FFEF64 0C1043                          cmpb    #'C'                                            ; CRC protocol?
3239
 00FFEF66 02601E                          bne             xm_send2
3240
 00FFEF68 08D17F                          bsr             xm_calc_crc                     ; compute CRC
3241
 00FFEF6A 0FC0009FE                       ldd             xm_crc                                  ; get crc
3242
 00FFEF6D 044                             lsra                                                                    ; transfer high eight bits first, so
3243
 00FFEF6E 056                             rorb                                                                    ; right shift D by eight
3244
 00FFEF6F 044                             lsra
3245
 00FFEF70 056                             rorb
3246
 00FFEF71 044                             lsra
3247
 00FFEF72 056                             rorb
3248
 00FFEF73 044                             lsra
3249
 00FFEF74 056                             rorb
3250
 00FFEF75 044                             lsra
3251
 00FFEF76 056                             rorb
3252
 00FFEF77 044                             lsra
3253
 00FFEF78 056                             rorb
3254
 00FFEF79 044                             lsra
3255
 00FFEF7A 056                             rorb
3256
 00FFEF7B 044                             lsra
3257
 00FFEF7C 056                             rorb
3258
 00FFEF7D 03F                             swi
3259
 00FFEF7E 002                             fcb             MF_OUTCH                                ; send out the byte
3260
 00FFEF7F 0FC0009FE                       ldd             xm_crc                                  ; get back CRC
3261
 00FFEF82 03F                             swi
3262
 00FFEF83 002                             fcb             MF_OUTCH                                ; and send out low byte
3263
 00FFEF84 020007                          bra             xm_send3
3264
                              xm_send2:
3265
 00FFEF86 08D14F                          bsr             xm_calc_checksum
3266
 00FFEF88 0F60009F7                       ldb             xm_checksum
3267
 00FFEF8B 03F                             swi
3268
 00FFEF8C 002                             fcb             MF_OUTCH
3269
                              xm_send3:
3270
 00FFEF8D 03F                             swi
3271
 00FFEF8E 0CCFFFFFF                       ldd             #-1                                                     ; block until input is present
3272
 00FFEF91 001                             fcb             MF_INCH
3273
 00FFEF92 0C1006                          cmpb    #ACK
3274
 00FFEF94 026FB3                          bne             xm_send4                                ; not an ACK then resend the record
3275
 00FFEF96 07C0009FA                       inc             xm_packetnum            ; increment packet number
3276
 00FFEF99 030080                          leax    128,x                                           ; advance buffer pointer
3277
 00FFEF9B 0BC000926                       cmpx    mon_r2+2
3278
 00FFEF9E 025FA9                          blo             xm_send4                                ; go send next record
3279
 00FFEFA0 0C6004                          ldb             #EOT                                            ; send end of transmission
3280
 00FFEFA2 03F                             swi
3281
 00FFEFA3 002                             fcb             MF_OUTCH
3282
 00FFEFA4 03F                             swi
3283
 00FFEFA5 002                             fcb             MF_OUTCH
3284
 00FFEFA6 03F                             swi
3285
 00FFEFA7 002                             fcb             MF_OUTCH
3286
 00FFEFA8 039                             rts
3287
 
3288
                              ; ------------------------------------------------------------------------------
3289
                              ; Get a byte, checking for a receive timeout.
3290
                              ;
3291
                              ; Returns:
3292
                              ;               accb = byte (0 to 255) or -1 if timed out
3293
                              ; ------------------------------------------------------------------------------
3294
 
3295
                              xm_getbyte:
3296
                              xm_gb1:
3297
 00FFEFA9 07DFFC020                       tst             xm_timer                ; check the timeout - 2048 ticks (3 seconds approx.)
3298
 00FFEFAC 02B009                          bmi             xm_gb2
3299
 00FFEFAE 04F                             clra                                                    ; non-blocking
3300
 00FFEFAF 05F                             clrb
3301
 00FFEFB0 03F                             swi
3302
 00FFEFB1 001                             fcb             MF_INCH                 ; try and get a character
3303
 00FFEFB2 02BFF5                          bmi             xm_gb1                  ; if no character, try again
3304
 00FFEFB4 08D1BA                          bsr             xm_outbyteAsHex
3305
 00FFEFB6 039                             rts
3306
                              xm_gb2:
3307
 00FFEFB7 0C6FFF                          ldb             #-1
3308
 00FFEFB9 039                             rts
3309
 
3310
                              ; ------------------------------------------------------------------------------
3311
                              ; XModem Receive
3312
                              ;
3313
                              ; Parameters:
3314
                              ;               none
3315
                              ; Modifies:
3316
                              ;               All
3317
                              ;       Returns:
3318
                              ;               none
3319
                              ; ------------------------------------------------------------------------------
3320
 
3321
                              xm_ReceiveStart:
3322
 00FFEFBA 017FFF1FB                       lbsr    Delay3s                         ; give a little bit of time for sender
3323
*** warning 1: Long branch within short branch range could be optimized
3324
 00FFEFBD 017FFF1F8                       lbsr    Delay3s
3325
*** warning 1: Long branch within short branch range could be optimized
3326
 00FFEFC0 017FFF1F5                       lbsr    Delay3s
3327
*** warning 1: Long branch within short branch range could be optimized
3328
 00FFEFC3 0170005CB                       lbsr    GetNumber                       ; Get the transfer address
3329
 00FFEFC6 05D                             tstb                                                            ; Make sure we got a value
3330
 00FFEFC7 127000392                       lbeq    Monitor
3331
 00FFEFCA 0BE000912                       ldx             mon_numwka+2    ; X = transfer address
3332
 00FFEFCD 07F0009FA                       clr             xm_packetnum    ; initialize
3333
 00FFEFD0 086043                          lda             #'C'                                    ; try for CRC first
3334
 00FFEFD2 0B70009F5                       sta             xm_protocol
3335
                              xm_receive:
3336
 00FFEFD5 086002                          lda             #2                                              ; number of times to retry -1
3337
                              xm_rcv5:
3338
 00FFEFD7 0F60009F5                       ldb             xm_protocol             ; indicate we want a transfer (send protocol byte)
3339
 00FFEFDA 03F                             swi
3340
 00FFEFDB 00D                             fcb             MF_SerialPutchar
3341
                              xm_rcv4:
3342
 00FFEFDC 07FFFC020                       clr             xm_timer                ; clear the timeout
3343
                              xm_rcv1:
3344
 00FFEFDF 08DFC8                          bsr             xm_getbyte
3345
 00FFEFE1 05D                             tstb
3346
 00FFEFE2 02B0A1                          bmi             xm_retry1               ; timeout on protocol id?
3347
 00FFEFE4 0C1001                          cmpb    #SOH                            ; it should be start of a transfer
3348
 00FFEFE6 027012                          beq             xm_SOH
3349
 00FFEFE8 0C1004                          cmpb    #EOT
3350
 00FFEFEA 027092                          beq             xm_EOT                  ; or end of transfer (EOT)
3351
 00FFEFEC 0C1018                          cmpb    #CAN
3352
 00FFEFEE 027FE5                          beq             xm_receive      ; might be a cancel
3353
 00FFEFF0 0C1017                          cmpb    #ETB
3354
 00FFEFF2 02708A                          beq             xm_EOT
3355
                              xm_rcv_nak:                                     ; wasn't a valid start so
3356
 00FFEFF4 0C6015                          ldb             #NAK                            ; send a NAK
3357
 00FFEFF6 03F                             swi
3358
 00FFEFF7 00D                             fcb             MF_SerialPutchar        ; and try again
3359
 00FFEFF8 020FE2                          bra             xm_rcv4
3360
                              xm_SOH:
3361
 00FFEFFA 08DFAD                          bsr             xm_getbyte      ; get packet number
3362
 00FFEFFC 02B078                          bmi             xm_rcv_to1
3363
 00FFEFFE 0F70009FB                       stb             xm_packetnum+1
3364
 00FFF001 034004                          pshs    b                                               ; save it
3365
 00FFF003 08DFA4                          bsr             xm_getbyte      ; get complement of packet number
3366
 00FFF005 02B06D                          bmi             xm_rcv_to2
3367
 00FFF007 0EBE04                          addb    ,s                                      ; add the two values
3368
 00FFF009 0C40FF                          andb    #$FF                            ; the sum should be $FF
3369
 00FFF00B 0C00FF                          subb    #$FF
3370
 00FFF00D 0F70009F6                       stb             xm_flag                 ; should be storing a zero if there is no error
3371
 00FFF010 18E000000                       ldy             #0                                      ; y = payload byte counter
3372
 00FFF013 01F013                          tfr             x,u
3373
                              xm_rcv2:
3374
 00FFF015 08DF92                          bsr             xm_getbyte
3375
 00FFF017 02B05D                          bmi             xm_rcv_to1
3376
 00FFF019 0E7C00                          stb             ,u+                                     ; store the byte to memory
3377
 00FFF01B 031201                          iny
3378
 00FFF01D 18C000080                       cmpy    #128                            ; 128 bytes per payload
3379
 00FFF020 025FF3                          blo             xm_rcv2
3380
 00FFF022 08DF85                          bsr             xm_getbyte      ; get checksum or CRC byte
3381
 00FFF024 02B050                          bmi             xm_rcv_to1
3382
 00FFF026 0F70009FC                       stb             xm_tmp                  ; stuff checksum/CRC byte
3383
 00FFF029 0F60009F5                       ldb             xm_protocol
3384
 00FFF02C 0C1043                          cmpb    #'C'
3385
 00FFF02E 026022                          bne             xm_rcv_chksum
3386
 00FFF030 08DF77                          bsr             xm_getbyte      ; get low order CRC byte
3387
 00FFF032 02B042                          bmi             xm_rcv_to1
3388
 00FFF034 0B60009FC                       lda             xm_tmp                  ; get the high byte
3389
 00FFF037 058                             aslb                                                    ; prepare to combine high and low order
3390
 00FFF038 058                             aslb
3391
 00FFF039 058                             aslb
3392
 00FFF03A 058                             aslb
3393
 00FFF03B 044                             lsra                                                    ; shift low nybble of acca into accb
3394
 00FFF03C 056                             rorb
3395
 00FFF03D 044                             lsra
3396
 00FFF03E 056                             rorb
3397
 00FFF03F 044                             lsra
3398
 00FFF040 056                             rorb
3399
 00FFF041 044                             lsra
3400
 00FFF042 056                             rorb
3401
 00FFF043 08400F                          anda    #$00F                                   ; mask off any extra bits
3402
 00FFF045 0FD0009F8                       std     xm_tmp2
3403
 00FFF048 08D09F                          bsr             xm_calc_crc             ; compute the CRC-16 for the received data
3404
 00FFF04A 0FC0009FE                       ldd             xm_crc                          ; and compare to received value
3405
 00FFF04D 1B30009F8                       cmpd    xm_tmp2
3406
 00FFF050 020008                          bra             xm_rcv3
3407
                              xm_rcv_chksum:
3408
 00FFF052 08D083                          bsr             xm_calc_checksum
3409
 00FFF054 0F60009F7                       ldb             xm_checksum
3410
 00FFF057 0F10009FC                       cmpb    xm_tmp                          ; where we stuffed the byte
3411
                              xm_rcv3:
3412
 00FFF05A 026F98                          bne             xm_rcv_nak              ; if not the same, NAK
3413
 00FFF05C 07D0009F6                       tst             xm_flag
3414
 00FFF05F 026F93                          bne             xm_rcv_nak              ; bad packet number?
3415
 00FFF061 0C6006                          ldb             #ACK                                    ; packet recieved okay, send back an ACK
3416
 00FFF063 03F                             swi
3417
 00FFF064 00D                             fcb             MF_SerialPutchar
3418
 00FFF065 0F60009FB                       ldb             xm_packetnum+1  ; did we receive the same packet
3419
 00FFF068 0F10009FA                       cmpb    xm_packetnum
3420
 00FFF06B 027F6F                          beq             xm_rcv4                         ; same packet received, dont update buffer pointer
3421
 00FFF06D 0F70009FA                       stb             xm_packetnum    ; update last seen packet number
3422
 00FFF070 030080                          leax    128,x                                   ; increment buffer pointer
3423
 00FFF072 020F68                          bra             xm_rcv4                         ; and go back for next packet
3424
                              xm_rcv_to2:
3425
 00FFF074 032601                          leas    1,s                                             ; get rid of stacked byte
3426
                              xm_rcv_to1:
3427
 00FFF076 0CCFFF09E                       ldd             #msgXmTimeout
3428
 00FFF079 03F                             swi
3429
 00FFF07A 004                             fcb             MF_DisplayString
3430
 00FFF07B 0160002DE                       lbra    Monitor
3431
                              xm_EOT:                                                         ; end of transmission received, return
3432
 00FFF07E 0C6006                          ldb             #ACK                                    ; ACK the EOT
3433
 00FFF080 03F                             swi
3434
 00FFF081 00D                             fcb             MF_SerialPutchar
3435
 00FFF082 0160002D7                       lbra    Monitor
3436
                              xm_retry1:
3437
 00FFF085 04A                             deca
3438
 00FFF086 02AF4F                          bpl             xm_rcv5
3439
 00FFF088 0B60009F5                       lda             xm_protocol
3440
 00FFF08B 081015                          cmpa    #NAK                                    ; are we already lowered down to checksum protocol?
3441
 00FFF08D 027007                          beq             xm_noTransmitter        ; did we try both checksum and CRC?
3442
 00FFF08F 086015                          lda             #NAK
3443
 00FFF091 0B70009F5                       sta             xm_protocol
3444
 00FFF094 020F3F                          bra             xm_receive
3445
                              xm_noTransmitter:
3446
 00FFF096 0CCFFF0B2                       ldd             #msgXmNoTransmitter
3447
 00FFF099 03F                             swi
3448
 00FFF09A 004                             fcb             MF_DisplayString
3449
 00FFF09B 0160002BE                       lbra    Monitor
3450
 
3451
                              msgXmTimeout:
3452
 00FFF09E 05806D06F06406506D03A           fcb             "Xmodem: timed out",CR,LF,0
3453
 00FFF0A5 02007406906D065064020
3454
 00FFF0AC 06F07507400D00A000
3455
                              msgXmNoTransmitter:
3456
 00FFF0B2 05804D06F06406506D03A           fcb             "XModem: transmitter not responding",CR,LF,0
3457
 00FFF0B9 02007407206106E07306D
3458
 00FFF0C0 06907407406507202006E
3459
 00FFF0C7 06F074020072065073070
3460
 00FFF0CE 06F06E06406906E06700D
3461
 00FFF0D5 00A000
3462
 
3463
                              ; ------------------------------------------------------------------------------
3464
                              ; Calculate checksum value. The checksum is simply the low order eight bits of
3465
                              ; the sum of all the bytes in the payload area.
3466
                              ;
3467
                              ; Stack space:
3468
                              ;               two words
3469
                              ;       Modifies:
3470
                              ;               xm_checksum             contains the checksum value for the record
3471
                              ; Parameters:
3472
                              ;               X = buffer address
3473
                              ;       Returns:
3474
                              ;               none
3475
                              ; ------------------------------------------------------------------------------
3476
 
3477
                              xm_calc_checksum:
3478
 00FFF0D7 034016                          pshs    d,x
3479
 00FFF0D9 04F                             clra
3480
 00FFF0DA 05F                             clrb
3481
                              xm_cs1:
3482
 00FFF0DB 0EB800                          addb    ,x+
3483
 00FFF0DD 04C                             inca
3484
 00FFF0DE 081080                          cmpa    #128
3485
 00FFF0E0 025FF9                          blo             xm_cs1
3486
 00FFF0E2 0C40FF                          andb    #$FF
3487
 00FFF0E4 0F70009F7                       stb             xm_checksum
3488
 00FFF0E7 035096                          puls    d,x,pc
3489
 
3490
                              ; ------------------------------------------------------------------------------
3491
                              ; Compute CRC-16 of buffer.
3492
                              ;
3493
                              ;int calcrc(char *ptr, int count)
3494
                              ;{
3495
                              ;    int  crc;
3496
                              ;    char i;
3497
                              ;    crc = 0;
3498
                              ;    while (--count >= 0)
3499
                              ;    {
3500
                              ;        crc = crc ^ (int) (*ptr++ << 8);
3501
                              ;        i = 8;
3502
                              ;        do
3503
                              ;        {
3504
                              ;            if (crc & 0x8000)
3505
                              ;                crc = crc << 1 ^ 0x1021;
3506
                              ;            else
3507
                              ;                crc = crc << 1;
3508
                              ;        } while(--i);
3509
                              ;    }
3510
                              ;    return (crc);
3511
                              ;}
3512
                              ;
3513
                              ; Modifies:
3514
                              ;               xm_crc variable
3515
                              ; Parameters:
3516
                              ;               u = buffer address
3517
                              ; Returns:
3518
                              ;               none
3519
                              ; ------------------------------------------------------------------------------
3520
 
3521
                              xm_calc_crc:
3522
 00FFF0E9 034076                          pshs    d,x,y,u
3523
 00FFF0EB 07F0009FE                       clr             xm_crc
3524
 00FFF0EE 07F0009FF                       clr             xm_crc+1
3525
 00FFF0F1 0CE000000                       ldu             #0                                      ; u = byte count
3526
                              xm_crc1:
3527
 00FFF0F4 0E6800                          ldb             ,x+                                     ; get byte
3528
 00FFF0F6 07F0009FC                       clr             xm_tmp                  ; save in temp
3529
 00FFF0F9 0F70009FD                       stb             xm_tmp+1
3530
 00FFF0FC 0780009FD                       asl             xm_tmp+1                ; shift temp eight bits to left
3531
 00FFF0FF 0790009FC                       rol             xm_tmp
3532
 00FFF102 0780009FD                       asl             xm_tmp+1
3533
 00FFF105 0790009FC                       rol             xm_tmp
3534
 00FFF108 0780009FD                       asl             xm_tmp+1
3535
 00FFF10B 0790009FC                       rol             xm_tmp
3536
 00FFF10E 0780009FD                       asl             xm_tmp+1
3537
 00FFF111 0790009FC                       rol             xm_tmp
3538
 00FFF114 0780009FD                       asl             xm_tmp+1
3539
 00FFF117 0790009FC                       rol             xm_tmp
3540
 00FFF11A 0780009FD                       asl             xm_tmp+1
3541
 00FFF11D 0790009FC                       rol             xm_tmp
3542
 00FFF120 0780009FD                       asl             xm_tmp+1
3543
 00FFF123 0790009FC                       rol             xm_tmp
3544
 00FFF126 0780009FD                       asl             xm_tmp+1
3545
 00FFF129 0790009FC                       rol             xm_tmp
3546
 00FFF12C 0FC0009FE                       ldd             xm_crc          ; crc = crc ^ tmp
3547
 00FFF12F 0B80009FC                       eora    xm_tmp
3548
 00FFF132 0F80009FD                       eorb    xm_tmp+1
3549
 00FFF135 0FD0009FE                       std             xm_crc
3550
 00FFF138 18E000000                       ldy             #0
3551
                              xm_crc4:
3552
 00FFF13B 0F60009FE                       ldb             xm_crc          ; get high byte
3553
 00FFF13E 0C5008                          bitb    #$8                             ; check for $8000
3554
 00FFF140 02700E                          beq             xm_crc2         ; no? then just go shift
3555
 00FFF142 0FC0009FE                       ldd             xm_crc          ; load
3556
 00FFF145 058                             aslb                                            ; shift
3557
 00FFF146 049                             rola
3558
 00FFF147 0C8021                          eorb    #$021                   ; and xor
3559
 00FFF149 088001                          eora    #$001
3560
 00FFF14B 0FD0009FE                       std             xm_crc          ; store it back
3561
 00FFF14E 020008                          bra             xm_crc3
3562
                              xm_crc2:
3563
 00FFF150 0FC0009FE                       ldd             xm_crc          ; load
3564
 00FFF153 058                             aslb                                            ; shift
3565
 00FFF154 049                             rola
3566
 00FFF155 0FD0009FE                       std             xm_crc          ; and store
3567
                              xm_crc3:
3568
 00FFF158 031201                          iny
3569
 00FFF15A 18C000008                       cmpy    #8                              ; repeat eight times
3570
 00FFF15D 025FDC                          blo             xm_crc4
3571
 00FFF15F 033401                          leau    1,u                             ; increment byte count
3572
 00FFF161 283000080                       cmpu    #128
3573
 00FFF164 0FC0009FE                       ldd             xm_crc          ; we want only a 16-bit CRC
3574
 00FFF167 08400F                          anda    #$0F
3575
 00FFF169 0FD0009FE                       std             xm_crc
3576
 00FFF16C 025F86                          blo             xm_crc1
3577
 00FFF16E 0350F6                          puls    d,x,y,u,pc
3578
 
3579
                              xm_outbyteAsHex:
3580
 00FFF170 034006                          pshs    d
3581
 00FFF172 0FC000800                       ldd             CharOutVec                                              ; get current char out vector
3582
 00FFF175 034006                          pshs    d                                                                                       ; save it
3583
 00FFF177 0CCFFE31F                       ldd             #ScreenDisplayChar              ; set output vector to screen display
3584
 00FFF17A 0FD000800                       std             CharOUtVec
3585
 00FFF17D 0EC602                          ldd             2,s                                                                             ; get passed data
3586
 00FFF17F 017FFF2B8                       lbsr    DispByteAsHex                                   ; and display on-screen
3587
*** warning 1: Long branch within short branch range could be optimized
3588
 00FFF182 0C6020                          ldb             #' '
3589
 00FFF184 017FFF198                       lbsr    ScreenDisplayChar
3590
*** warning 1: Long branch within short branch range could be optimized
3591
 00FFF187 035006                          puls    d                                                                                       ; get back old char out vector
3592
 00FFF189 0FD000800                       std             CharOutVec                                              ; and restore it
3593
 00FFF18C 035006                          puls    d                                                                                       ; restore input arguments
3594
 00FFF18E 039                             rts
3595
 
3596
 
3597
 
3598 13 robfinch
                              ;------------------------------------------------------------------------------
3599 4 robfinch
                              ; Check if there is a keyboard character available. If so return true (<0)
3600
                              ; otherwise return false (0) in accb.
3601
                              ;------------------------------------------------------------------------------
3602
                              ;
3603
                              KeybdCheckForKeyDirect:
3604 21 robfinch
 00FFF18F 0208FF                          bra             DBGCheckForKey
3605 4 robfinch
 
3606
                              ;------------------------------------------------------------------------------
3607
                              ;------------------------------------------------------------------------------
3608
                              INCH:
3609 21 robfinch
 00FFF191 034004                          pshs    b
3610 13 robfinch
                              INCH2:
3611 21 robfinch
 00FFF193 0150F6FFFFFFFE0                 ldb             COREID
3612
 00FFF198 0F1FFC010                       cmpb    IOFocusID       ; if we do not have focus, block
3613
 00FFF19B 026FF6                          bne             INCH2
3614 13 robfinch
                              ;       ldb             #$800                   ; block if no key available, get scancode directly
3615
                              ;       bra             GetKey
3616
                              ;       jsr             [CharInVec]     ; vector is being overwritten somehow
3617 21 robfinch
 00FFF19D 017FFFAD3                       lbsr    SerialPeekCharDirect
3618 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3619 21 robfinch
                              ;       lbsr    SerialGetChar
3620
 00FFF1A0 04D                             tsta
3621
 00FFF1A1 02B003                          bmi             INCH1                   ; block if no key available
3622
 00FFF1A3 032601                          leas    1,s                             ; get rid of blocking status
3623
 00FFF1A5 039                             rts                                                     ; return character
3624 13 robfinch
                              INCH1:
3625 21 robfinch
 00FFF1A6 035004                          puls    b                                       ; check blocking status
3626
 00FFF1A8 05D                             tstb
3627
 00FFF1A9 02BFE6                          bmi     INCH                    ; if blocking, loop
3628
 00FFF1AB 0CCFFFFFF                       ldd             #-1                             ; return -1 if no char available
3629
 00FFF1AE 039                             rts
3630 4 robfinch
 
3631
                              INCHE:
3632 21 robfinch
 00FFF1AF 08DFE0                          bsr             INCH
3633
 00FFF1B1 020009                          bra             INCHEK3
3634 4 robfinch
 
3635
                              INCHEK:
3636 21 robfinch
 00FFF1B3 08DFDC                          bsr             INCH
3637
 00FFF1B5 01507DFFFFFCA00                 tst             KeybdEcho
3638
 00FFF1BA 02700C                          beq             INCHEK1
3639 4 robfinch
                              INCHEK3:
3640 21 robfinch
 00FFF1BC 08100D                          cmpa    #CR
3641
 00FFF1BE 026005                          bne             INCHEK2
3642
 00FFF1C0 017FFDF0F                       lbsr            CRLF
3643 4 robfinch
*** warning 1: Long branch within short branch range could be optimized
3644 21 robfinch
 00FFF1C3 020003                          bra             INCHEK1
3645 4 robfinch
                              INCHEK2:
3646 21 robfinch
 00FFF1C5 017FFF154                       lbsr    DisplayChar
3647 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3648 4 robfinch
                              INCHEK1:
3649 21 robfinch
 00FFF1C8 039                             rts
3650 4 robfinch
 
3651
                              OUTCH:
3652 21 robfinch
 00FFF1C9 06E90F000800                    jmp             [CharOutVec]
3653 4 robfinch
 
3654
                              ;------------------------------------------------------------------------------
3655
                              ; r1 0=echo off, non-zero = echo on
3656
                              ;------------------------------------------------------------------------------
3657
                              ;
3658
                              SetKeyboardEcho:
3659 21 robfinch
 00FFF1CD 0150F7FFFFFCA00                 stb             KeybdEcho
3660
 00FFF1D2 039                             rts
3661 4 robfinch
 
3662
 
3663
                              ;------------------------------------------------------------------------------
3664
                              ; Parameters:
3665
                              ;               x,d     bitmap of sprites to enable
3666
                              ;------------------------------------------------------------------------------
3667
 
3668
                              ShowSprites:
3669 21 robfinch
 00FFF1D3 0150BFFFFE103C0                 stx             SPRITE_CTRL+SPRITE_EN
3670
 00FFF1D8 0150FDFFFE103C2                 std             SPRITE_CTRL+SPRITE_EN+2
3671
 00FFF1DD 039                             rts
3672 4 robfinch
 
3673
                              ;==============================================================================
3674 13 robfinch
                              ; Femtiki Operating System.
3675
                              ;==============================================================================
3676
 
3677
                              OSCallTbl:
3678 21 robfinch
 00FFF1DE 000000                          fcw             0
3679
 00FFF1E0 000000                          fcw             0
3680
 00FFF1E2 000000                          fcw             0
3681
 00FFF1E4 000000                          fcw             0
3682
 00FFF1E6 000000                          fcw             0
3683
 00FFF1E8 000000                          fcw             0
3684
 00FFF1EA 000000                          fcw             0
3685
 00FFF1EC 000000                          fcw             0
3686
 00FFF1EE 000000                          fcw             0
3687
 00FFF1F0 000000                          fcw             0
3688
 00FFF1F2 000000                          fcw             0
3689
 00FFF1F4 000000                          fcw             0
3690
 00FFF1F6 000000                          fcw             0
3691
 00FFF1F8 000000                          fcw             0
3692
 00FFF1FA 000000                          fcw             0
3693
 00FFF1FC 000000                          fcw             0
3694
 00FFF1FE 000000                          fcw             0
3695
 00FFF200 000000                          fcw             0
3696
 00FFF202 000000                          fcw             0
3697
 00FFF204 000000                          fcw             0
3698
 00FFF206 000000                          fcw             0
3699
 00FFF208 000000                          fcw             0
3700
 00FFF20A FFF227                          fcw             ReleaseIOFocus
3701
 00FFF20C 000000                          fcw             0
3702
 00FFF20E FFF210                          fcw             RequestIOFocus
3703 13 robfinch
 
3704 15 robfinch
                              NumOSFuncs      EQU     (*-OSCallTbl)/2
3705 13 robfinch
 
3706
                              RequestIOFocus:
3707 21 robfinch
 00FFF210 0150F6FFFFFFFE0                 ldb             COREID
3708
 00FFF215 08EFFC000                       ldx             #IOFocusList
3709
 00FFF218 03A                             abx
3710
 00FFF219 0A7804                          sta             ,x
3711
 00FFF21B 07DFFC010                       tst             IOFocusID
3712
 00FFF21E 1260008DC                       lbne    oscx
3713
 00FFF221 0F7FFC010                       stb             IOFocusID
3714
 00FFF224 0160008D6                       lbra    oscx
3715 13 robfinch
 
3716
                              ReleaseIOFocus:
3717 21 robfinch
 00FFF227 0150F6FFFFFFFE0                 ldb             COREID
3718
 00FFF22C 08EFFC000                       ldx             #IOFocusList
3719
 00FFF22F 03A                             abx
3720
 00FFF230 06F804                          clr             ,x                                              ; clear the request indicator
3721
 00FFF232 017FFEFD7                       lbsr    CopyScreenToVirtualScreen
3722 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3723 21 robfinch
 00FFF235 0F1FFC010                       cmpb    IOFocusID                       ; are we the one with the focus?
3724
 00FFF238 1260008C2                       lbne    oscx
3725 13 robfinch
                                      ; We had the focus, so now a new core needs the focus.
3726
                                      ; Search the focus list for a requestor. If no requester
3727
                                      ; is found, give focus to core #1.
3728 21 robfinch
 00FFF23B 08600F                          lda             #15
3729 13 robfinch
                              riof2:
3730 21 robfinch
 00FFF23D 05C                             incb
3731
 00FFF23E 0C400F                          andb    #15
3732
 00FFF240 03A                             abx
3733
 00FFF241 06D804                          tst             ,x
3734
 00FFF243 026009                          bne             riof1
3735
 00FFF245 04A                             deca
3736
 00FFF246 026FF5                          bne             riof2
3737 13 robfinch
                                      ; If no focus is requested by anyone, give to core #1
3738 21 robfinch
 00FFF248 0C6001                          ldb             #1
3739
 00FFF24A 086018                          lda             #24
3740
 00FFF24C 0A7804                          sta             ,x
3741 13 robfinch
                              riof1:
3742 21 robfinch
 00FFF24E 0F7FFC010                       stb             IOFocusID
3743
 00FFF251 017FFEF81                       lbsr    CopyVirtualScreenToScreen
3744 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3745 21 robfinch
 00FFF254 0160008A6                       lbra    oscx
3746 13 robfinch
 
3747
 
3748
                              ;==============================================================================
3749
                              ;==============================================================================
3750
 
3751 15 robfinch
                              ;------------------------------------------------------------------------------
3752
                              ; Seed the random number generator. All channels are seeded with the same
3753
                              ; value.
3754 13 robfinch
                              ;
3755 15 robfinch
                              ; Parameters:
3756
                              ;               d = 'z' part of seed
3757
                              ;               x = 'w' part of seed
3758
                              ; Returns:
3759
                              ;               none
3760
                              ;------------------------------------------------------------------------------
3761 13 robfinch
 
3762 15 robfinch
                              mon_srand:
3763 21 robfinch
 00FFF257 18E000000                       ldy     #0
3764 15 robfinch
                              mon_srand1:
3765 21 robfinch
 00FFF25A 0151BFFFFE30604                 sty     PRNG+4                          ; select channel
3766
 00FFF25F 01507FFFFE30608                 clr     PRNG+8
3767
 00FFF264 01507FFFFE30609                 clr PRNG+9
3768
 00FFF269 0150FDFFFE3060A                 std     PRNG+10                         ; update low half of value
3769
 00FFF26E 01507FFFFE3060C                 clr PRNG+12
3770
 00FFF273 01507FFFFE3060D                 clr PRNG+13
3771
 00FFF278 0150BFFFFE3060E                 stx     PRNG+14                         ; update low half of value
3772
 00FFF27D 031201                          iny
3773
 00FFF27F 18C000400                       cmpy    #$400                           ; 1k channels
3774
 00FFF282 025FD6                          blo             mon_srand1
3775
 00FFF284 039                             rts
3776 13 robfinch
 
3777 15 robfinch
                              ;------------------------------------------------------------------------------
3778
                              ; Get a random number and generate the next one.
3779
                              ;
3780
                              ; Parameters:
3781
                              ;               d = channel to use
3782
                              ; Returns:
3783
                              ;               x,d = 36 bit random value
3784
                              ;------------------------------------------------------------------------------
3785 13 robfinch
 
3786 15 robfinch
                              mon_rand:
3787 21 robfinch
 00FFF285 0150FDFFFE30604                 std     PRNG+4                          ; select channel
3788
 00FFF28A 0150BEFFFE30600                 ldx     PRNG+0
3789
 00FFF28F 0150FCFFFE30602                 ldd     PRNG+2
3790
 00FFF294 0150F7FFFE30603                 stb     PRNG+3                          ; trigger calc of next number
3791
 00FFF299 039                             rts
3792 13 robfinch
 
3793 15 robfinch
                              ;==============================================================================
3794
                              ; System Monitor
3795
                              ;==============================================================================
3796 13 robfinch
 
3797 16 robfinch
                              ; Command Tables
3798 13 robfinch
 
3799 15 robfinch
                              cmdTable1:
3800 21 robfinch
 00FFF29A 03C83E                          fcb             '<','>'+$800
3801
 00FFF29C 04282B                          fcb             'B','+'+$800
3802
 00FFF29E 04282D                          fcb             'B','-'+$800
3803
 00FFF2A0 044852                          fcb             'D','R'+$800
3804
 00FFF2A2 844                             fcb             'D'+$800
3805
 00FFF2A3 83A                             fcb             ':'+$800
3806
 00FFF2A4 046049847                       fcb             "FI",'G'+$800
3807
 00FFF2A7 04604984C                       fcb             "FI",'L'+$800
3808
 00FFF2AA 04684C                          fcb             'F','L'+$800
3809
 00FFF2AC 84A                             fcb             'J'+$800
3810
 00FFF2AD 05204104D054045053854           fcb             "RAMTES",'T'+$800
3811
 00FFF2B4 053050844                       fcb             "SP",'D'+$800
3812
 00FFF2B7 054049852                       fcb             "TI",'R'+$800
3813
 00FFF2BA 855                             fcb             'U'+$800
3814
 00FFF2BB 065078069874                    fcb             "exi",'t'+$800
3815
 00FFF2BF 83F                             fcb             '?'+$800
3816
 00FFF2C0 04304C853                       fcb             "CL",'S'+$800
3817
 00FFF2C3 053031839                       fcb             "S1",'9'+$800
3818
 00FFF2C6 04A044834                       fcb             "JD",'4'+$800
3819
 00FFF2C9 05804D852                       fcb             "XM",'R'+$800
3820
 00FFF2CC 05804D853                       fcb             "XM",'S'+$800
3821
 00FFF2CF 052841                          fcb             'R','A'+$800
3822
 00FFF2D1 052842                          fcb             'R','B'+$800
3823
 00FFF2D3 052044050852                    fcb             "RDP",'R'+$800
3824
 00FFF2D7 052844                          fcb             'R','D'+$800
3825
 00FFF2D9 052858                          fcb             'R','X'+$800
3826
 00FFF2DB 052859                          fcb             'R','Y'+$800
3827
 00FFF2DD 052855                          fcb             'R','U'+$800
3828
 00FFF2DF 052853                          fcb             'R','S'+$800
3829
 00FFF2E1 052043043852                    fcb             "RCC",'R'+$800
3830
 00FFF2E5 052050843                       fcb             "RP",'C'+$800
3831
 00FFF2E8 04C842                          fcb             'L','B'+$800
3832
 00FFF2EA 000000                          fcw             0
3833 13 robfinch
 
3834 15 robfinch
                              cmdTable2:
3835 21 robfinch
 00FFF2EC FFF427                          fcw             Redirect
3836
 00FFF2EE FFF469                          fcw             MonArmBreakpoint
3837
 00FFF2F0 FFF474                          fcw             MonDisarmBreakpoint
3838
 00FFF2F2 FFF899                          fcw             DumpRegs
3839
 00FFF2F4 FFF7D0                          fcw             DumpMemory
3840
 00FFF2F6 FFF82C                          fcw             EditMemory
3841
 00FFF2F8 FE0000                          fcw             $FE0000                                 ; FIG forth
3842
 00FFF2FA FFF86F                          fcw             FillMemory
3843
 00FFF2FC FFF9F5                          fcw             DumpIOFocusList
3844
 00FFF2FE FFF980                          fcw             jump_to_code
3845
 00FFF300 FFD400                          fcw             $FFD400
3846
 00FFF302 FF8000                          fcw             $FF8000                                 ; sprite demo
3847
 00FFF304 FFE524                          fcw             rtc_read
3848
 00FFF306 FF8003                          fcw             $FF8003                                 ; unassembler
3849
 00FFF308 FFFAE6                          fcw             xitMonitor
3850
 00FFF30A FFF44D                          fcw             PromptHelp
3851
 00FFF30C FFF455                          fcw             PromptClearscreen
3852
 00FFF30E FFEE8F                          fcw             S19Loader
3853
 00FFF310 FFD400                          fcw             $FFD400
3854
 00FFF312 FFEFBA                          fcw             xm_ReceiveStart
3855
 00FFF314 FFEF2C                          fcw             xm_SendStart
3856
 00FFF316 FFF8E4                          fcw             SetRegA
3857
 00FFF318 FFF8F3                          fcw             SetRegB
3858
 00FFF31A FFF94D                          fcw             SetRegDPR
3859
 00FFF31C FFF902                          fcw             SetRegD
3860
 00FFF31E FFF911                          fcw             SetRegX
3861
 00FFF320 FFF920                          fcw             SetRegY
3862
 00FFF322 FFF92F                          fcw             SetRegU
3863
 00FFF324 FFF93E                          fcw             SetRegS
3864
 00FFF326 FFF95C                          fcw             SetRegCCR
3865
 00FFF328 FFF96B                          fcw             SetRegPC
3866
 00FFF32A FFFBD2                          fcw             ListBreakpoints
3867 13 robfinch
 
3868
                              CmdPrompt:
3869 21 robfinch
 00FFF32C 017FFDDA3                       lbsr    CRLF
3870 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3871 21 robfinch
 00FFF32F 0C6024                          ldb             #'$'
3872
 00FFF331 017FFFE95                       lbsr    OUTCH
3873 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3874 21 robfinch
 00FFF334 016FFFE92                       lbra    OUTCH
3875 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3876
 
3877
                              msgF09Starting:
3878 21 robfinch
 00FFF337 04606506D07406906B069           fcb             "Femtiki F09 Multi-core OS Starting",CR,LF,0
3879
 00FFF33E 02004603003902004D075
3880
 00FFF345 06C07406902D06306F072
3881
 00FFF34C 06502004F053020053074
3882
 00FFF353 06107207406906E06700D
3883
 00FFF35A 00A000
3884 13 robfinch
 
3885 16 robfinch
                              Monitor:
3886 21 robfinch
 00FFF35C 01C0EF                          andcc   #$EF                                    ; SWI disables interrupts, re-enable them
3887
 00FFF35E 08601F                          lda             #31                                             ; Timer is IRQ #31
3888
 00FFF360 0150B7FFFE3F010                 sta             PIC+16                          ; register 16 is edge sense reset reg
3889
 00FFF365 0FC00092C                       ldd             mon_init                        ; check special code to see if monitor has been initialized
3890
 00FFF368 18312D687                       cmpd    #1234567
3891
 00FFF36B 02704D                          beq             mon1
3892
 00FFF36D 07F000810                       clr             BreakpointFlag
3893
 00FFF370 07F000811                       clr             NumSetBreakpoints
3894
 00FFF373 0CC00007B                       ldd             #123
3895
 00FFF376 08E00028E                       ldx             #654
3896
 00FFF379 017FFFEDB                       lbsr    mon_srand
3897 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3898 21 robfinch
 00FFF37C 0CCFFF337                       ldd             #msgF09Starting
3899
 00FFF37F 017FFF05B                       lbsr    DisplayString
3900 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3901 21 robfinch
 00FFF382 0CCFFF5FE                       ldd             #HelpMsg
3902
 00FFF385 017FFF055                       lbsr    DisplayString
3903 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
3904 21 robfinch
 00FFF388 0CCFFF32C                       ldd             #CmdPrompt
3905
 00FFF38B 0FD000808                       std             CmdPromptJI
3906
 00FFF38E 0CCFFF5E5                       ldd             #DisplayErr
3907
 00FFF391 0FD00080C                       std             MonErrVec
3908
 00FFF394 0CC0063FF                       ldd             #$63FF                  ; default app stack
3909
 00FFF397 0FD000908                       std             mon_SSAVE
3910
 00FFF39A 07F00090E                       clr             mon_DPRSAVE     ;
3911
 00FFF39D 01F0A8                          tfr             ccr,a
3912
 00FFF39F 0B700090F                       sta             mon_CCRSAVE
3913
 00FFF3A2 07F00090A                       clr             mon_PCSAVE
3914
 00FFF3A5 0CCFFF35C                       ldd             #Monitor
3915
 00FFF3A8 0FD00090B                       std             mon_PCSAVE+1
3916
 00FFF3AB 07F000902                       clr             mon_XSAVE
3917
 00FFF3AE 07F000904                       clr             mon_YSAVE
3918
 00FFF3B1 07F000906                       clr             mon_USAVE
3919
 00FFF3B4 0CC12D687                       ldd             #1234567
3920
 00FFF3B7 0FD00092C                       std             mon_init
3921 16 robfinch
                              mon1:
3922 21 robfinch
 00FFF3BA 03280F006FFF                    leas    $6FFF                           ; reset stack pointer
3923
 00FFF3BE 05F                             clrb                                                    ; turn off keyboard echo
3924
 00FFF3BF 017FFFE0B                       lbsr    SetKeyboardEcho
3925 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3926
                                      ; Reset IO vectors
3927 21 robfinch
 00FFF3C2 0CCFFEC73                       ldd             #SerialPeekCharDirect
3928
 00FFF3C5 0FD000804                       std             CharInVec
3929
 00FFF3C8 0CCFFE31C                       ldd             #DisplayChar
3930
 00FFF3CB 0FD000800                       std             CharOutVec
3931
 00FFF3CE 0CCFFF32C                       ldd             #CmdPrompt
3932
 00FFF3D1 0FD000808                       std             CmdPromptJI
3933 4 robfinch
                              ;       jsr             RequestIOFocus
3934
                              PromptLn:
3935 21 robfinch
 00FFF3D4 0AD90F000808                    jsr             [CmdPromptJI]
3936 4 robfinch
 
3937
                              ; Get characters until a CR is keyed
3938
 
3939
                              Prompt3:
3940 21 robfinch
 00FFF3D8 0CCFFFFFF                       ldd             #-1                                     ; block until key present
3941
 00FFF3DB 017FFFDB3                       lbsr    INCH
3942 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3943 21 robfinch
 00FFF3DE 04D                             tsta                                                    ; should not get this with blocking
3944
 00FFF3DF 02BFF7                          bmi             Prompt3
3945
 00FFF3E1 0C100D                          cmpb    #CR                                     ; carriage return?
3946
 00FFF3E3 027005                          beq             Prompt1
3947
 00FFF3E5 017FFFDE1                       lbsr    OUTCH                           ; spit out the character
3948 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3949 21 robfinch
 00FFF3E8 020FEE                          bra             Prompt3                 ; and keep going
3950 4 robfinch
 
3951
                              ; Process the screen line that the CR was keyed on
3952
                              ;
3953
                              Prompt1:
3954 21 robfinch
 00FFF3EA 0CC005050                       ldd             #$5050
3955
 00FFF3ED 0150FDFFFE60001                 std             LEDS
3956 13 robfinch
                              ;       ldb             RunningID
3957
                              ;       cmpb    #61
3958
                              ;       bhi             Prompt3
3959 21 robfinch
 00FFF3F2 00F111                          clr             CursorCol                       ; go back to the start of the line
3960
 00FFF3F4 017FFEEFE                       lbsr    CalcScreenLoc   ; calc screen memory location
3961 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
3962 21 robfinch
 00FFF3F7 01F002                          tfr             d,y
3963 13 robfinch
                              skipDollar:
3964 21 robfinch
 00FFF3F9 08D067                          bsr             MonGetNonSpace
3965
 00FFF3FB 0C1024                          cmpb    #'$'
3966
 00FFF3FD 027FFA                          beq             skipDollar              ; skip over '$' prompt character
3967 4 robfinch
 
3968 15 robfinch
                              ; Dispatch based on command
3969 4 robfinch
                              ;
3970 21 robfinch
 00FFF3FF 0313FF                          dey
3971
 00FFF401 01F023                          tfr             y,u                                                     ; save off input position
3972
 00FFF403 05F                             clrb
3973
 00FFF404 08EFFF29A                       ldx             #cmdTable1
3974 15 robfinch
                              parseCmd1:
3975 21 robfinch
 00FFF407 0A6A00                          lda             ,y+                                                     ; get input character
3976
 00FFF409 06D804                          tst             ,x                                                      ; test for end of command
3977
 00FFF40B 02B00F                          bmi             endOfWord                               ;
3978
 00FFF40D 0A1800                          cmpa    ,x+                                                     ; does input match command?
3979
 00FFF40F 027FF6                          beq             parseCmd1
3980 15 robfinch
                              scanNextWord:
3981 21 robfinch
 00FFF411 06D800                          tst             ,x+
3982
 00FFF413 027F47                          beq             Monitor                                 ; if end of table reached, not a command
3983
 00FFF415 02AFFA                          bpl             scanNextWord
3984
 00FFF417 05C                             incb
3985
 00FFF418 01F032                          tfr             u,y                                                     ; reset input pointer
3986
 00FFF41A 020FEB                          bra             parseCmd1                               ; try again
3987 15 robfinch
                              endOfWord:
3988 21 robfinch
 00FFF41C 0A8804                          eora    ,x
3989
 00FFF41E 048                             asla
3990
 00FFF41F 026FF0                          bne             scanNextWord
3991 15 robfinch
                                      ; we found the command in the table
3992 21 robfinch
 00FFF421 058                             aslb                                                                    ; b = word index
3993
 00FFF422 08EFFF2EC                       ldx             #cmdTable2
3994
 00FFF425 06E905                          jmp             [b,x]                                           ; execute command
3995 15 robfinch
 
3996
                              Redirect:
3997 21 robfinch
 00FFF427 08D034                          bsr             MonGetch
3998
 00FFF429 0C1073                          cmpb    #'s'
3999
 00FFF42B 02600E                          bne             Prompt2a
4000
 00FFF42D 0CCFFEC73                       ldd             #SerialPeekCharDirect
4001
 00FFF430 0FD000804                       std             CharInVec
4002
 00FFF433 0CCFFEC9A                       ldd             #SerialPutChar
4003
 00FFF436 0FD000800                       std             CharOutVec
4004
 00FFF439 020F21                          bra             Monitor
4005 13 robfinch
                              Prompt2a:
4006 21 robfinch
 00FFF43B 0C1063                          cmpb    #'c'
4007
 00FFF43D 026F1D                          bne             Monitor
4008
 00FFF43F 0CCFFEA92                       ldd             #GetKey
4009
 00FFF442 0FD000804                       std             CharInVec
4010
 00FFF445 0CCFFE31C                       ldd             #DisplayChar
4011
 00FFF448 0FD000800                       std             CharOutVec
4012
 00FFF44B 020F0F                          bra             Monitor
4013 15 robfinch
 
4014 13 robfinch
                              PromptHelp:
4015 21 robfinch
 00FFF44D 0CCFFF5FE                       ldd             #HelpMsg
4016
 00FFF450 017FFEF8A                       lbsr    DisplayString
4017 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4018 21 robfinch
 00FFF453 020F07                          bra             Monitor
4019 15 robfinch
 
4020
                              PromptClearscreen:
4021 21 robfinch
 00FFF455 017FFEDE4                       lbsr    ClearScreen
4022 4 robfinch
*** warning 1: Long branch within short branch range could be optimized
4023 21 robfinch
 00FFF458 017FFEE58                       lbsr    HomeCursor
4024 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4025 21 robfinch
 00FFF45B 020EFF                          bra             Monitor
4026 4 robfinch
 
4027
                              MonGetch:
4028 21 robfinch
 00FFF45D 0E6A04                          ldb             ,y
4029
 00FFF45F 031201                          iny
4030
 00FFF461 039                             rts
4031 4 robfinch
 
4032
                              MonGetNonSpace:
4033 21 robfinch
 00FFF462 08DFF9                          bsr             MonGetCh
4034
 00FFF464 0C1020                          cmpb    #' '
4035
 00FFF466 027FFA                          beq             MonGetNonSpace
4036
 00FFF468 039                             rts
4037 4 robfinch
 
4038 16 robfinch
                              MonArmBreakpoint:
4039 21 robfinch
 00FFF469 0170006D5                       lbsr    ArmBreakpoint
4040
 00FFF46C 0C6FFF                          ldb             #$FFF
4041
 00FFF46E 0F7000810                       stb             BreakpointFlag
4042
 00FFF471 016FFFEE8                       lbra    Monitor
4043 16 robfinch
*** warning 1: Long branch within short branch range could be optimized
4044
                              MonDisarmBreakpoint:
4045 21 robfinch
 00FFF474 017000700                       lbsr    DisarmBreakpoint
4046
 00FFF477 016FFFEE2                       lbra    Monitor
4047 16 robfinch
*** warning 1: Long branch within short branch range could be optimized
4048
 
4049 4 robfinch
                              ;------------------------------------------------------------------------------
4050
                              ; Ignore blanks in the input
4051
                              ; Y = text pointer
4052
                              ; D destroyed
4053
                              ;------------------------------------------------------------------------------
4054
                              ;
4055
                              ignBlanks:
4056
                              ignBlanks1:
4057 21 robfinch
 00FFF47A 08DFE1                          bsr             MonGetch
4058
 00FFF47C 0C1020                          cmpb    #' '
4059
 00FFF47E 027FFA                          beq             ignBlanks1
4060
 00FFF480 0313FF                          dey
4061
 00FFF482 039                             rts
4062 4 robfinch
 
4063
                              ;------------------------------------------------------------------------------
4064 15 robfinch
                              ; Multiply number in work area by 10.
4065 4 robfinch
                              ;------------------------------------------------------------------------------
4066 15 robfinch
                              Times10:
4067 21 robfinch
 00FFF483 034006                          pshs    d
4068
 00FFF485 0FC000910                       ldd             mon_numwka              ; make a copy of the number
4069
 00FFF488 0FD000918                       std             mon_numwka+8
4070
 00FFF48B 0FC000912                       ldd             mon_numwka+2
4071
 00FFF48E 0FD00091A                       std             mon_numwka+10
4072
 00FFF491 08D05B                          bsr             shl_numwka              ; shift left = *2
4073
 00FFF493 08D059                          bsr             shl_numwka              ; shift left = *4
4074
 00FFF495 0FC000912                       ldd             mon_numwka+2    ; add in original value
4075
 00FFF498 0F300091A                       addd    mon_numwka+10   ; = *5
4076
 00FFF49B 0F6000911                       ldb             mon_numwka+1
4077
 00FFF49E 0F9000919                       adcb    mon_numwka+9
4078
 00FFF4A1 0F7000911                       stb             mon_numwka+1
4079
 00FFF4A4 0B6000910                       lda             mon_numwka+0
4080
 00FFF4A7 0B9000918                       adca    mon_numwka+8
4081
 00FFF4AA 0B7000910                       sta             mon_numwka+0
4082
 00FFF4AD 08D03F                          bsr             shl_numwka              ; shift left = * 10
4083
 00FFF4AF 035086                          puls    d,pc
4084 15 robfinch
 
4085
                              ;------------------------------------------------------------------------------
4086
                              ;------------------------------------------------------------------------------
4087 4 robfinch
                              GetTwoParams:
4088 21 robfinch
 00FFF4B1 08DFC7                          bsr             ignBlanks
4089
 00FFF4B3 08D0DC                          bsr             GetNumber                       ; get start address of dump
4090
 00FFF4B5 0FC000910                       ldd             mon_numwka
4091
 00FFF4B8 0FD000920                       std             mon_r1
4092
 00FFF4BB 0FC000912                       ldd             mon_numwka+2
4093
 00FFF4BE 0FD000922                       std             mon_r1+2
4094
 00FFF4C1 08DFB7                          bsr             ignBlanks
4095
 00FFF4C3 08D0CC                          bsr             GetNumber                       ; get end address of dump
4096
 00FFF4C5 0FC000910                       ldd             mon_numwka
4097
 00FFF4C8 0FD000924                       std             mon_r2
4098
 00FFF4CB 0FC000912                       ldd             mon_numwka+2
4099
 00FFF4CE 0FD000926                       std             mon_r2+2
4100
 00FFF4D1 039                             rts
4101 4 robfinch
 
4102
                              ;------------------------------------------------------------------------------
4103
                              ; Get a range, the end must be greater or equal to the start.
4104
                              ;------------------------------------------------------------------------------
4105
                              GetRange:
4106 21 robfinch
 00FFF4D2 08DFDD                          bsr             GetTwoParams
4107
 00FFF4D4 0FC000926                       ldd             mon_r2+2
4108
 00FFF4D7 0B3000922                       subd    mon_r1+2
4109
 00FFF4DA 0FC000924                       ldd             mon_r2
4110
 00FFF4DD 0F2000921                       sbcb    mon_r1+1
4111
 00FFF4E0 0B2000920                       sbca    mon_r1
4112
 00FFF4E3 124000007                       lbcc    grng1
4113
 00FFF4E6 0AD90F00080C                    jsr             [MonErrVec]
4114
 00FFF4EA 016FFFE6F                       lbra    Monitor
4115 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4116
                              grng1:
4117 21 robfinch
 00FFF4ED 039                             rts
4118 4 robfinch
 
4119
                              shl_numwka:
4120 21 robfinch
 00FFF4EE 078000913                       asl             mon_numwka+3
4121
 00FFF4F1 079000912                       rol             mon_numwka+2
4122
 00FFF4F4 079000911                       rol             mon_numwka+1
4123
 00FFF4F7 079000910                       rol             mon_numwka
4124
 00FFF4FA 039                             rts
4125 4 robfinch
 
4126
                              ;------------------------------------------------------------------------------
4127 13 robfinch
                              ; Get a hexidecimal number. Maximum of twelve digits.
4128
                              ;
4129
                              ; Modifies:
4130
                              ;       Y = text pointer (updated)
4131
                              ;       D = number of digits
4132
                              ;       mon_numwka contains number
4133 4 robfinch
                              ;------------------------------------------------------------------------------
4134
                              ;
4135
                              GetHexNumber:
4136 21 robfinch
 00FFF4FB 04F05F                          clrd
4137
 00FFF4FD 0FD000910                       std             mon_numwka      ; zero out work area
4138
 00FFF500 0FD000912                       std             mon_numwka+2
4139
 00FFF503 034010                          pshs    x
4140
 00FFF505 08E000000                       ldx             #0                                      ; max 12 eight digits
4141 4 robfinch
                              gthxn2:
4142 21 robfinch
 00FFF508 08DF53                          bsr             MonGetch
4143
 00FFF50A 08D093                          bsr             AsciiToHexNybble
4144
 00FFF50C 0C1FFF                          cmpb    #-1
4145
 00FFF50E 027017                          beq             gthxn1
4146
 00FFF510 08DFDC                          bsr             shl_numwka
4147
 00FFF512 08DFDA                          bsr             shl_numwka
4148
 00FFF514 08DFD8                          bsr             shl_numwka
4149
 00FFF516 08DFD6                          bsr             shl_numwka
4150
 00FFF518 0C400F                          andb    #$0f
4151
 00FFF51A 0FA000913                       orb             mon_numwka+3
4152
 00FFF51D 0F7000913                       stb             mon_numwka+3
4153
 00FFF520 030001                          inx
4154
 00FFF522 08C00000C                       cmpx    #12
4155
 00FFF525 025FE1                          blo             gthxn2
4156 4 robfinch
                              gthxn1:
4157 21 robfinch
 00FFF527 01F010                          tfr             x,d
4158
 00FFF529 035090                          puls    x,pc
4159 4 robfinch
 
4160 16 robfinch
                              GetBinNumber:
4161 21 robfinch
 00FFF52B 04F05F                          clrd
4162
 00FFF52D 0FD000910                       std             mon_numwka
4163
 00FFF530 0FD000912                       std             mon_numwka+2
4164
 00FFF533 034010                          pshs    x
4165
 00FFF535 08E000000                       ldx             #0
4166 16 robfinch
                              gtbin2:
4167 21 robfinch
 00FFF538 08DF23                          bsr             MonGetch
4168
 00FFF53A 08D099                          bsr             AsciiToBinDigit
4169
 00FFF53C 05D                             tstb
4170
 00FFF53D 02B00F                          bmi             gtbin1
4171
 00FFF53F 08DFAD                          bsr             shl_numwka
4172
 00FFF541 0FA000913                       orb             mon_numwka+3
4173
 00FFF544 0F7000913                       stb             mon_numwka+3
4174
 00FFF547 030001                          inx
4175
 00FFF549 08C000030                       cpx             #48
4176
 00FFF54C 025FEA                          blo             gtbin2
4177 16 robfinch
                              gtbin1:
4178 21 robfinch
 00FFF54E 01F010                          tfr             x,d
4179
 00FFF550 035090                          puls    x,pc
4180 16 robfinch
 
4181
                              GetDecNumber:
4182 21 robfinch
 00FFF552 04F05F                          clrd
4183
 00FFF554 0FD000910                       std             mon_numwka
4184
 00FFF557 0FD000912                       std             mon_numwka+2
4185
 00FFF55A 034010                          pshs    x
4186
 00FFF55C 08E000000                       ldx             #0
4187 16 robfinch
                              gtdec2:
4188 21 robfinch
 00FFF55F 08DEFC                          bsr             MonGetch
4189
 00FFF561 08D064                          bsr             AsciiToDecDigit
4190
 00FFF563 05D                             tstb
4191
 00FFF564 02B027                          bmi             gtdec1
4192
 00FFF566 08DF1B                          bsr             Times10
4193
 00FFF568 0FB000913                       addb    mon_numwka+3
4194
 00FFF56B 0F7000913                       stb             mon_numwka+3
4195
 00FFF56E 0F6000912                       ldb             mon_numwka+2
4196
 00FFF571 0C9000                          adcb    #0
4197
 00FFF573 0F7000912                       stb             mon_numwka+2
4198
 00FFF576 0F6000911                       ldb             mon_numwka+1
4199
 00FFF579 0C9000                          adcb    #0
4200
 00FFF57B 0F7000911                       stb             mon_numwka+1
4201
 00FFF57E 0F6000910                       ldb             mon_numwka+0
4202
 00FFF581 0C9000                          adcb    #0
4203
 00FFF583 0F7000910                       stb             mon_numwka+0
4204
 00FFF586 030001                          inx
4205
 00FFF588 08C00000F                       cpx             #15
4206
 00FFF58B 025FD2                          blo             gtdec2
4207 16 robfinch
                              gtdec1:
4208 21 robfinch
 00FFF58D 01F010                          tfr             x,d
4209
 00FFF58F 035090                          puls    x,pc
4210 16 robfinch
 
4211
                              GetNumber:
4212 21 robfinch
 00FFF591 08DECA                          bsr             MonGetch
4213
 00FFF593 0C102B                          cmpb    #'+'
4214
 00FFF595 027FBB                          beq             GetDecNumber
4215
 00FFF597 0C1025                          cmpb    #'%'
4216
 00FFF599 027F90                          beq             GetBinNumber
4217
 00FFF59B 0313FF                          dey
4218
 00FFF59D 020F5C                          bra             GetHexNumber
4219 16 robfinch
 
4220 4 robfinch
                              ;       phx
4221
                              ;       push    r4
4222
                              ;       push    r5
4223
                              ;       ldx             #0
4224
                              ;       ld              r4,#10
4225
                              ;       ld              r5,#10
4226
                              ;gtdcn2:
4227
                              ;       jsr             MonGetch
4228
                              ;       jsr             AsciiToDecNybble
4229
                              ;       cmp             #-1
4230
                              ;       beq             gtdcn1
4231
                              ;       mul             r2,r2,r5
4232
                              ;       add             r2,r1
4233
                              ;       dec             r4
4234
                              ;       bne             gtdcn2
4235
                              ;gtdcn1:
4236
                              ;       txa
4237
                              ;       pop             r5
4238
                              ;       pop             r4
4239
                              ;       plx
4240
                              ;       rts
4241
 
4242
                              ;------------------------------------------------------------------------------
4243
                              ; Convert ASCII character in the range '0' to '9', 'a' to 'f' or 'A' to 'F'
4244
                              ; to a hex nybble.
4245
                              ;------------------------------------------------------------------------------
4246
                              ;
4247
                              AsciiToHexNybble:
4248 21 robfinch
 00FFF59F 0C1030                          cmpb    #'0'
4249
 00FFF5A1 025021                          blo             gthx3
4250
 00FFF5A3 0C1039                          cmpb    #'9'
4251
 00FFF5A5 022003                          bhi             gthx5
4252
 00FFF5A7 0C0030                          subb    #'0'
4253
 00FFF5A9 039                             rts
4254 4 robfinch
                              gthx5:
4255 21 robfinch
 00FFF5AA 0C1041                          cmpb    #'A'
4256
 00FFF5AC 025016                          blo             gthx3
4257
 00FFF5AE 0C1046                          cmpb    #'F'
4258
 00FFF5B0 022005                          bhi             gthx6
4259
 00FFF5B2 0C0041                          subb    #'A'
4260
 00FFF5B4 0CB00A                          addb    #10
4261
 00FFF5B6 039                             rts
4262 4 robfinch
                              gthx6:
4263 21 robfinch
 00FFF5B7 0C1061                          cmpb    #'a'
4264
 00FFF5B9 025009                          blo             gthx3
4265
 00FFF5BB 0C107A                          cmpb    #'z'
4266
 00FFF5BD 022005                          bhi             gthx3
4267
 00FFF5BF 0C0061                          subb    #'a'
4268
 00FFF5C1 0CB00A                          addb    #10
4269
 00FFF5C3 039                             rts
4270 4 robfinch
                              gthx3:
4271 21 robfinch
 00FFF5C4 0C6FFF                          ldb             #-1             ; not a hex number
4272
 00FFF5C6 039                             rts
4273 4 robfinch
 
4274 16 robfinch
                              AsciiToDecDigit:
4275 21 robfinch
 00FFF5C7 0C1030                          cmpb    #'0'
4276
 00FFF5C9 025007                          blo             gtdc3
4277
 00FFF5CB 0C1039                          cmpb    #'9'
4278
 00FFF5CD 022003                          bhi             gtdc3
4279
 00FFF5CF 0C0030                          subb    #'0'
4280
 00FFF5D1 039                             rts
4281 4 robfinch
                              gtdc3:
4282 21 robfinch
 00FFF5D2 0C6FFF                          ldb             #-1
4283
 00FFF5D4 039                             rts
4284 4 robfinch
 
4285 16 robfinch
                              AsciiToBinDigit:
4286 21 robfinch
 00FFF5D5 0C1030                          cmpb    #'0'
4287
 00FFF5D7 026002                          bne             abd1
4288
 00FFF5D9 05F                             clrb
4289
 00FFF5DA 039                             rts
4290 16 robfinch
                              abd1:
4291 21 robfinch
 00FFF5DB 0C1031                          cmpb    #'1'
4292
 00FFF5DD 026003                          bne             abd2
4293
 00FFF5DF 0C6001                          ldb             #1
4294
 00FFF5E1 039                             rts
4295 16 robfinch
                              abd2:
4296 21 robfinch
 00FFF5E2 0C6FFF                          ldb             #-1
4297
 00FFF5E4 039                             rts
4298 16 robfinch
 
4299 4 robfinch
                              DisplayErr:
4300 21 robfinch
 00FFF5E5 0CCFFF5F6                       ldd             #msgErr
4301
 00FFF5E8 017FFEDF2                       lbsr    DisplayString
4302 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4303 21 robfinch
 00FFF5EB 07EFFF35C                       jmp             Monitor
4304 4 robfinch
 
4305
                              DisplayStringDX
4306 21 robfinch
 00FFF5EE 0DD024                          std             Strptr
4307
 00FFF5F0 09F026                          stx             Strptr+2
4308
 00FFF5F2 0BDFFE3DD                       jsr             DisplayString
4309
 00FFF5F5 039                             rts
4310 4 robfinch
 
4311
                              msgErr:
4312 21 robfinch
 00FFF5F6 02A02A04507207200D00A           fcb     "**Err",CR,LF,0
4313
 00FFF5FD 000
4314 4 robfinch
 
4315
                              HelpMsg:
4316 21 robfinch
 00FFF5FE 03F02003D020044069073           fcb             "? = Display help",CR,LF
4317
 00FFF605 07006C061079020068065
4318
 00FFF60C 06C07000D00A
4319
 00FFF610 04304C05302003D020063           fcb     "CLS = clear screen",CR,LF
4320
 00FFF617 06C065061072020073063
4321
 00FFF61E 07206506506E00D00A
4322
 00FFF624 06202B02003D020073065           fcb     "b+ = set breakpoint",CR,LF
4323
 00FFF62B 07402006207206506106B
4324
 00FFF632 07006F06906E07400D00A
4325
 00FFF639 06202D02003D02006306C           fcb     "b- = clear breakpoint",CR,LF
4326
 00FFF640 065061072020062072065
4327
 00FFF647 06106B07006F06906E074
4328
 00FFF64E 00D00A
4329 4 robfinch
                              ;       db      "S = Boot from SD Card",CR,LF
4330 21 robfinch
 00FFF650 03A02003D020045064069           fcb     ": = Edit memory bytes",CR,LF
4331
 00FFF657 07402006D06506D06F072
4332
 00FFF65E 079020062079074065073
4333
 00FFF665 00D00A
4334 4 robfinch
                              ;       db      "L = Load sector",CR,LF
4335
                              ;       db      "W = Write sector",CR,LF
4336 21 robfinch
 00FFF667 04405202003D020044075           fcb "DR = Dump registers",CR,LF
4337
 00FFF66E 06D070020072065067069
4338
 00FFF675 07307406507207300D00A
4339
 00FFF67C 04402003D02004407506D           fcb     "D = Dump memory",CR,LF
4340
 00FFF683 07002006D06506D06F072
4341
 00FFF68A 07900D00A
4342
 00FFF68D 04602003D02004606906C           fcb     "F = Fill memory",CR,LF
4343
 00FFF694 06C02006D06506D06F072
4344
 00FFF69B 07900D00A
4345
 00FFF69E 04604C02003D020044075           fcb "FL = Dump I/O Focus List",CR,LF
4346
 00FFF6A5 06D07002004902F04F020
4347
 00FFF6AC 04606F06307507302004C
4348
 00FFF6B3 06907307400D00A
4349 16 robfinch
                              ;       fcb "FIG = start FIG Forth",CR,LF
4350 4 robfinch
                              ;       db      "KILL n = kill task #n",CR,LF
4351
                              ;       db      "B = start tiny basic",CR,LF
4352
                              ;       db      "b = start EhBasic 6502",CR,LF
4353 21 robfinch
 00FFF6B8 04A02003D02004A07506D           fcb     "J = Jump to code",CR,LF
4354
 00FFF6BF 07002007406F02006306F
4355
 00FFF6C6 06406500D00A
4356
 00FFF6CA 04A04403402003D02004A           fcb     "JD4 = Jump to $FFD400",CR,LF
4357
 00FFF6D1 07506D07002007406F020
4358
 00FFF6D8 024046046044034030030
4359
 00FFF6DF 00D00A
4360
 00FFF6E1 05205B06E05D02003D020           fcb     "R[n] = Set register value",CR,LF
4361
 00FFF6E8 053065074020072065067
4362
 00FFF6EF 069073074065072020076
4363
 00FFF6F6 06106C07506500D00A
4364 4 robfinch
                              ;       db      "r = random lines - test bitmap",CR,LF
4365
                              ;       db      "e = ethernet test",CR,LF
4366 21 robfinch
 00FFF6FC 07302003D020073065072           fcb     "s = serial output test",CR,LF
4367
 00FFF703 06906106C02006F075074
4368
 00FFF70A 070075074020074065073
4369
 00FFF711 07400D00A
4370
 00FFF714 05303103902003D020072           fcb     "S19 = run S19 loader",CR,LF
4371
 00FFF71B 07506E020053031039020
4372
 00FFF722 06C06F06106406507200D
4373
 00FFF729 00A
4374
 00FFF72A 05305002003D020073070           fcb     "SP = sprite demo",CR,LF
4375
 00FFF731 072069074065020064065
4376
 00FFF738 06D06F00D00A
4377 4 robfinch
                              ;       db      "T = Dump task list",CR,LF
4378
                              ;       db      "TO = Dump timeout list",CR,LF
4379 21 robfinch
 00FFF73C 05404902003D020064069           fcb     "TI = display date/time",CR,LF
4380
 00FFF743 07307006C061079020064
4381
 00FFF74A 06107406502F07406906D
4382
 00FFF751 06500D00A
4383 4 robfinch
                              ;       db      "TEMP = display temperature",CR,LF
4384 21 robfinch
 00FFF754 05502003D02007506E061           fcb     "U = unassemble",CR,LF
4385
 00FFF75B 07307306506D06206C065
4386
 00FFF762 00D00A
4387 15 robfinch
                              ;       db      "P = Piano",CR,LF
4388 21 robfinch
 00FFF764 05804D02003D02007806D           fcb     "XM = xmodem transfer",CR,LF
4389
 00FFF76B 06F06406506D020074072
4390
 00FFF772 06106E07306606507200D
4391
 00FFF779 00A
4392
 00FFF77A 07802003D020065078069           fcb     "x = exit monitor",CR,LF
4393
 00FFF781 07402006D06F06E069074
4394
 00FFF788 06F07200D00A
4395
 00FFF78C 000                             fcb             0
4396 4 robfinch
 
4397
                              msgRegHeadings
4398 21 robfinch
 00FFF78D 00D00A02002004402F041           fcb     CR,LF,"  D/AB     X      Y      U      S       PC    DP  CCR",CR,LF,0
4399
 00FFF794 042020020020020020058
4400
 00FFF79B 020020020020020020059
4401
 00FFF7A2 020020020020020020055
4402
 00FFF7A9 020020020020020020053
4403
 00FFF7B0 020020020020020020020
4404
 00FFF7B7 050043020020020020044
4405
 00FFF7BE 05002002004304305200D
4406
 00FFF7C5 00A000
4407 4 robfinch
 
4408
                              nHEX4:
4409 21 robfinch
 00FFF7C7 0BDFFD2D2                       jsr             HEX4
4410
 00FFF7CA 039                             rts
4411 4 robfinch
 
4412
                              nXBLANK:
4413 21 robfinch
 00FFF7CB 0C6020                          ldb             #' '
4414
 00FFF7CD 016FFF9F9                       lbra    OUTCH
4415 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4416 4 robfinch
 
4417 13 robfinch
                              ;------------------------------------------------------------------------------
4418
                              ; Dump Memory
4419
                              ;
4420
                              ; Usage:
4421 14 robfinch
                              ;       $D FFFC12 FFFC20
4422 13 robfinch
                              ;
4423
                              ; Dump formatted to look like:
4424
                              ;               :FFFC12 012 012 012 012 555 666 777 888
4425
                              ;
4426
                              ;------------------------------------------------------------------------------
4427 4 robfinch
 
4428 13 robfinch
                              DumpMemory:
4429 21 robfinch
 00FFF7D0 08DD00                          bsr             GetRange
4430
 00FFF7D2 18E000000                       ldy             #0
4431
 00FFF7D5 1BE000922                       ldy             mon_r1+2
4432 13 robfinch
                              dmpm2:
4433 21 robfinch
 00FFF7D8 017FFD8F7                       lbsr    CRLF
4434 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4435 21 robfinch
 00FFF7DB 0C603A                          ldb             #':'
4436
 00FFF7DD 017FFF9E9                       lbsr    OUTCH
4437 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4438 21 robfinch
 00FFF7E0 01F020                          tfr             y,d
4439 13 robfinch
                                      ;addd   mon_r1+2                                        ; output the address
4440 21 robfinch
 00FFF7E2 017FFEC4C                       lbsr    DispWordAsHex
4441 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4442 21 robfinch
 00FFF7E5 0C6020                          ldb             #' '
4443
 00FFF7E7 017FFF9DF                       lbsr    OUTCH
4444 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4445 21 robfinch
 00FFF7EA 08E000008                       ldx             #8                                                              ; number of bytes to display
4446 13 robfinch
                              dmpm1:
4447
                              ;       ldb             far [mon_r1+1],y
4448
                                      ;ldb            [mon_r1+2],y
4449 21 robfinch
 00FFF7ED 0E6A04                          ldb             ,y
4450
 00FFF7EF 031201                          iny
4451
 00FFF7F1 017FFEC46                       lbsr    DispByteAsHex                   ; display byte
4452 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4453 21 robfinch
 00FFF7F4 0C6020                          ldb             #' '                                                    ; followed by a space
4454
 00FFF7F6 017FFF9D0                       lbsr    OUTCH
4455 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4456 21 robfinch
 00FFF7F9 05F                             clrb
4457
 00FFF7FA 04F                             clra
4458
 00FFF7FB 017FFF993                       lbsr    INCH
4459 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4460 21 robfinch
 00FFF7FE 0C1003                          cmpb    #CTRLC
4461
 00FFF800 027024                          beq             dmpm3
4462
 00FFF802 0301FF                          dex
4463
 00FFF804 026FE7                          bne             dmpm1
4464 13 robfinch
                                      ; Now output ascii
4465 21 robfinch
 00FFF806 0C6020                          ldb             #' '
4466
 00FFF808 017FFF9BE                       lbsr    OUTCH
4467 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4468 21 robfinch
 00FFF80B 08E000008                       ldx             #8                                                              ; 8 chars to output
4469
 00FFF80E 0313F8                          leay    -8,y                                                    ; backup pointer
4470 13 robfinch
                              dmpm5:
4471
                              ;       ldb             far [mon_r1+1],y        ; get the char
4472
                              ;       ldb             [mon_r1+2],y                    ; get the char
4473 21 robfinch
 00FFF810 0E6A04                          ldb             ,y
4474
 00FFF812 0C1020                          cmpb    #$20                                                    ; is it a control char?
4475
 00FFF814 024002                          bhs             dmpm4
4476
 00FFF816 0C602E                          ldb             #'.'
4477 13 robfinch
                              dmpm4:
4478 21 robfinch
 00FFF818 017FFF9AE                       lbsr    OUTCH
4479 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4480 21 robfinch
 00FFF81B 031201                          iny
4481
 00FFF81D 0301FF                          dex
4482
 00FFF81F 026FEF                          bne             dmpm5
4483
 00FFF821 1BC000926                       cmpy    mon_r2+2
4484
 00FFF824 025FB2                          blo             dmpm2
4485 13 robfinch
                              dmpm3:
4486 21 robfinch
 00FFF826 017FFD8A9                       lbsr    CRLF
4487 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4488 21 robfinch
 00FFF829 016FFFB30                       lbra    Monitor
4489 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4490
 
4491
                              ;------------------------------------------------------------------------------
4492 14 robfinch
                              ; Edit Memory
4493
                              ;
4494
                              ; Usage:
4495
                              ;       $$:FFFC12 8 "Hello World!" 0
4496
                              ;
4497
                              ; Dump formatted to look like:
4498
                              ;               :FFFC12 012 012 012 012 555 666 777 888
4499
                              ;
4500
                              ;------------------------------------------------------------------------------
4501
 
4502
                              EditMemory:
4503 21 robfinch
 00FFF82C 0CE000008                       ldu             #8                                              ; set max byte count
4504
 00FFF82F 017FFFC48                       lbsr    ignBlanks
4505 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4506 21 robfinch
 00FFF832 017FFFCC6                       lbsr    GetHexNumber    ; get the start address
4507
*** warning 1: Long branch within short branch range could be optimized
4508
 00FFF835 0BE000912                       ldx             mon_numwka+2
4509 14 robfinch
                              EditMem2:
4510 21 robfinch
 00FFF838 017FFFC3F                       lbsr    ignBlanks                       ; skip over blanks
4511 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4512 21 robfinch
 00FFF83B 017FFFCBD                       lbsr    GetHexNumber    ; get the byte value
4513 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4514 21 robfinch
 00FFF83E 05D                             tstb                                                            ; check for valid value
4515
 00FFF83F 02700C                          beq             EditMem1                        ; if invalid, quit
4516
 00FFF841 0F6000913                       ldb             mon_numwka+3    ; get value
4517
 00FFF844 0E7800                          stb             ,x+                                             ; update memory at address
4518
 00FFF846 0335FF                          leau    -1,u                                    ; decremeent byte count
4519
 00FFF848 283000000                       cmpu    #0
4520
 00FFF84B 026FEB                          bne             EditMem2                        ; go back for annother byte
4521 14 robfinch
                              EditMem1:
4522 21 robfinch
 00FFF84D 017FFFC0D                       lbsr    MonGetch                        ; see if a string is being entered
4523 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4524 21 robfinch
 00FFF850 0C1022                          cmpb    #'"'
4525
 00FFF852 026018                          bne             EditMem3                        ; no string, we're done
4526
 00FFF854 0CE000028                       ldu             #40                                             ; string must be less than 40 chars
4527 14 robfinch
                              EditMem4:
4528 21 robfinch
 00FFF857 017FFFC03                       lbsr    MonGetch                        ; look for close quote
4529 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4530 21 robfinch
 00FFF85A 0C1022                          cmpb    #'"'
4531
 00FFF85C 026005                          bne             EditMem6                        ; end of string?
4532
 00FFF85E 0CE000008                       ldu             #8                                              ; reset the byte count
4533
 00FFF861 020FD5                          bra             EditMem2
4534 14 robfinch
                              EditMem6:
4535 21 robfinch
 00FFF863 0E7800                          stb             ,x+                                             ; store the character in memory
4536
 00FFF865 0335FF                          leau    -1,u                                    ; decrement byte count
4537
 00FFF867 283000000                       cmpu    #0
4538
 00FFF86A 022FEB                          bhi             EditMem4                        ; max 40 chars
4539 14 robfinch
                              EditMem3:
4540 21 robfinch
 00FFF86C 016FFFAED                       lbra    Monitor
4541 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4542
 
4543
 
4544
                              ;------------------------------------------------------------------------------
4545 15 robfinch
                              ; Fill Memory
4546
                              ;
4547
                              ; Usage:
4548
                              ;       $$F FFFC12 FFFC30 89F
4549
                              ;
4550
                              ;------------------------------------------------------------------------------
4551
 
4552
                              FillMemory:
4553 21 robfinch
 00FFF86F 017FFFC60                       lbsr    GetRange                        ; get address range to fill
4554 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
4555 21 robfinch
 00FFF872 017FFFC05                       lbsr    ignBlanks
4556 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
4557 21 robfinch
 00FFF875 017FFFC83                       lbsr    GetHexNumber    ; get target byte to write
4558 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
4559 21 robfinch
 00FFF878 0F6000913                       ldb             mon_numwka+3
4560
 00FFF87B 0BE000922                       ldx             mon_r1+2
4561
 00FFF87E 04F                             clra
4562 15 robfinch
                              fillm1:                                                         ; Check for a CTRL-C every page of memory
4563 21 robfinch
 00FFF87F 04D                             tsta
4564
 00FFF880 02600D                          bne             fillm2
4565
 00FFF882 05F                             clrb                                                            ; we want a non-blocking check
4566
 00FFF883 04F                             clra
4567
 00FFF884 017FFF90A                       lbsr    INCH
4568 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
4569 21 robfinch
 00FFF887 0C1003                          cmpb    #CTRLC
4570
 00FFF889 127FFFAD0                       lbeq    Monitor
4571 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
4572 21 robfinch
 00FFF88C 0F6000913                       ldb             mon_numwka+3    ; reset target byte
4573 15 robfinch
                              fillm2:
4574 21 robfinch
 00FFF88F 0E7800                          stb             ,x+
4575
 00FFF891 0BC000926                       cmpx    mon_r2+2
4576
 00FFF894 023FE9                          bls             fillm1
4577 15 robfinch
                              fillm3:
4578 21 robfinch
 00FFF896 016FFFAC3                       lbra    Monitor
4579 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
4580
 
4581
                              ;------------------------------------------------------------------------------
4582 13 robfinch
                              ; Dump Registers
4583
                              ;
4584
                              ;       Usage:
4585
                              ;               $DR
4586
                              ;------------------------------------------------------------------------------
4587
 
4588
                              DumpRegs:
4589 21 robfinch
 00FFF899 0CCFFF78D                       ldd             #msgRegHeadings
4590
 00FFF89C 017FFEB3E                       lbsr    DisplayString
4591 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4592 21 robfinch
 00FFF89F 08DF2A                          bsr             nXBLANK
4593
 00FFF8A1 0FC000900                       ldd             mon_DSAVE
4594
 00FFF8A4 08DF21                          bsr             nHEX4
4595
 00FFF8A6 08DF23                          bsr             nXBLANK
4596
 00FFF8A8 0FC000902                       ldd             mon_XSAVE
4597
 00FFF8AB 08DF1A                          bsr             nHEX4
4598
 00FFF8AD 08DF1C                          bsr             nXBLANK
4599
 00FFF8AF 0FC000904                       ldd             mon_YSAVE
4600
 00FFF8B2 08DF13                          bsr             nHEX4
4601
 00FFF8B4 08DF15                          bsr             nXBLANK
4602
 00FFF8B6 0FC000906                       ldd             mon_USAVE
4603
 00FFF8B9 08DF0C                          bsr             nHEX4
4604
 00FFF8BB 08DF0E                          bsr             nXBLANK
4605
 00FFF8BD 0FC000908                       ldd             mon_SSAVE
4606
 00FFF8C0 08DF05                          bsr             nHEX4
4607
 00FFF8C2 08DF07                          bsr             nXBLANK
4608
 00FFF8C4 0F600090B                       ldb             mon_PCSAVE+1
4609
 00FFF8C7 017FFEB70                       lbsr    DispByteAsHex
4610 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4611 21 robfinch
 00FFF8CA 0FC00090C                       ldd             mon_PCSAVE+2
4612
 00FFF8CD 08DEF8                          bsr             nHEX4
4613
 00FFF8CF 08DEFA                          bsr             nXBLANK
4614
 00FFF8D1 0FC00090E                       ldd             mon_DPRSAVE
4615
 00FFF8D4 0BDFFD2CE                       jsr             HEX2
4616
 00FFF8D7 08DEF2                          bsr             nXBLANK
4617
 00FFF8D9 0B600090F                       lda             mon_CCRSAVE
4618
 00FFF8DC 017FFD9EF                       lbsr    HEX2
4619 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4620 21 robfinch
 00FFF8DF 08DEEA                          bsr             nXBLANK
4621
 00FFF8E1 016FFFA78                       lbra    Monitor
4622 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4623
 
4624
                              ;------------------------------------------------------------------------------
4625 21 robfinch
                              ; SetRegXXX
4626
                              ;
4627
                              ; Set the value to be loaded into a register.
4628
                              ;------------------------------------------------------------------------------
4629
 
4630
                              SetRegA:
4631
 00FFF8E4 017FFFB93                       lbsr    ignBlanks
4632
*** warning 1: Long branch within short branch range could be optimized
4633
 00FFF8E7 017FFFCA7                       lbsr    GetNumber
4634
*** warning 1: Long branch within short branch range could be optimized
4635
 00FFF8EA 0B6000913                       lda             mon_numwka+3
4636
 00FFF8ED 0B7000900                       sta             mon_DSAVE
4637
 00FFF8F0 016FFFA69                       lbra    Monitor
4638
*** warning 1: Long branch within short branch range could be optimized
4639
                              SetRegB:
4640
 00FFF8F3 017FFFB84                       lbsr    ignBlanks
4641
*** warning 1: Long branch within short branch range could be optimized
4642
 00FFF8F6 017FFFC98                       lbsr    GetNumber
4643
*** warning 1: Long branch within short branch range could be optimized
4644
 00FFF8F9 0B6000913                       lda             mon_numwka+3
4645
 00FFF8FC 0B7000901                       sta             mon_DSAVE+1
4646
 00FFF8FF 016FFFA5A                       lbra    Monitor
4647
*** warning 1: Long branch within short branch range could be optimized
4648
                              SetRegD:
4649
 00FFF902 017FFFB75                       lbsr    ignBlanks
4650
*** warning 1: Long branch within short branch range could be optimized
4651
 00FFF905 017FFFC89                       lbsr    GetNumber
4652
*** warning 1: Long branch within short branch range could be optimized
4653
 00FFF908 0FC000912                       ldd             mon_numwka+2
4654
 00FFF90B 0FD000900                       std             mon_DSAVE
4655
 00FFF90E 016FFFA4B                       lbra    Monitor
4656
*** warning 1: Long branch within short branch range could be optimized
4657
                              SetRegX:
4658
 00FFF911 017FFFB66                       lbsr    ignBlanks
4659
*** warning 1: Long branch within short branch range could be optimized
4660
 00FFF914 017FFFC7A                       lbsr    GetNumber
4661
*** warning 1: Long branch within short branch range could be optimized
4662
 00FFF917 0FC000912                       ldd             mon_numwka+2
4663
 00FFF91A 0FD000902                       std             mon_XSAVE
4664
 00FFF91D 016FFFA3C                       lbra    Monitor
4665
*** warning 1: Long branch within short branch range could be optimized
4666
                              SetRegY:
4667
 00FFF920 017FFFB57                       lbsr    ignBlanks
4668
*** warning 1: Long branch within short branch range could be optimized
4669
 00FFF923 017FFFC6B                       lbsr    GetNumber
4670
*** warning 1: Long branch within short branch range could be optimized
4671
 00FFF926 0FC000912                       ldd             mon_numwka+2
4672
 00FFF929 0FD000904                       std             mon_YSAVE
4673
 00FFF92C 016FFFA2D                       lbra    Monitor
4674
*** warning 1: Long branch within short branch range could be optimized
4675
                              SetRegU:
4676
 00FFF92F 017FFFB48                       lbsr    ignBlanks
4677
*** warning 1: Long branch within short branch range could be optimized
4678
 00FFF932 017FFFC5C                       lbsr    GetNumber
4679
*** warning 1: Long branch within short branch range could be optimized
4680
 00FFF935 0FC000912                       ldd             mon_numwka+2
4681
 00FFF938 0FD000906                       std             mon_USAVE
4682
 00FFF93B 016FFFA1E                       lbra    Monitor
4683
*** warning 1: Long branch within short branch range could be optimized
4684
                              SetRegS:
4685
 00FFF93E 017FFFB39                       lbsr    ignBlanks
4686
*** warning 1: Long branch within short branch range could be optimized
4687
 00FFF941 017FFFC4D                       lbsr    GetNumber
4688
*** warning 1: Long branch within short branch range could be optimized
4689
 00FFF944 0FC000912                       ldd             mon_numwka+2
4690
 00FFF947 0FD000908                       std             mon_SSAVE
4691
 00FFF94A 016FFFA0F                       lbra    Monitor
4692
*** warning 1: Long branch within short branch range could be optimized
4693
                              SetRegDPR:
4694
 00FFF94D 017FFFB2A                       lbsr    ignBlanks
4695
*** warning 1: Long branch within short branch range could be optimized
4696
 00FFF950 017FFFC3E                       lbsr    GetNumber
4697
*** warning 1: Long branch within short branch range could be optimized
4698
 00FFF953 0B6000913                       lda             mon_numwka+3
4699
 00FFF956 0B700090E                       sta             mon_DPRSAVE
4700
 00FFF959 016FFFA00                       lbra    Monitor
4701
*** warning 1: Long branch within short branch range could be optimized
4702
                              SetRegCCR:
4703
 00FFF95C 017FFFB1B                       lbsr    ignBlanks
4704
*** warning 1: Long branch within short branch range could be optimized
4705
 00FFF95F 017FFFC2F                       lbsr    GetNumber
4706
*** warning 1: Long branch within short branch range could be optimized
4707
 00FFF962 0B6000913                       lda             mon_numwka+3
4708
 00FFF965 0B700090F                       sta             mon_CCRSAVE
4709
 00FFF968 016FFF9F1                       lbra    Monitor
4710
*** warning 1: Long branch within short branch range could be optimized
4711
                              SetRegPC:
4712
 00FFF96B 017FFFB0C                       lbsr    ignBlanks
4713
*** warning 1: Long branch within short branch range could be optimized
4714
 00FFF96E 017FFFC20                       lbsr    GetNumber
4715
*** warning 1: Long branch within short branch range could be optimized
4716
 00FFF971 0FC000912                       ldd             mon_numwka+2
4717
 00FFF974 0FD00090C                       std             mon_PCSAVE+2
4718
 00FFF977 0F6000911                       ldb             mon_numwka+1
4719
 00FFF97A 0F700090B                       stb             mon_PCSAVE+1
4720
 00FFF97D 016FFF9DC                       lbra    Monitor
4721
*** warning 1: Long branch within short branch range could be optimized
4722
 
4723
                              ;------------------------------------------------------------------------------
4724 4 robfinch
                              ; Jump to code
4725 13 robfinch
                              ;
4726
                              ; Registers are loaded with values from the monitor register save area before
4727
                              ; the code is jumped to.
4728
                              ;
4729
                              ; J 
4730
                              ;------------------------------------------------------------------------------
4731
 
4732 4 robfinch
                              jump_to_code:
4733 21 robfinch
 00FFF980 017FFFAF7                       lbsr    ignBlanks
4734
*** warning 1: Long branch within short branch range could be optimized
4735
 00FFF983 017FFFC0B                       lbsr    GetNumber
4736
*** warning 1: Long branch within short branch range could be optimized
4737
 00FFF986 01A010                          sei
4738
 00FFF988 1FE000908                       lds             mon_SSAVE
4739
 00FFF98B 0CCFFF9BA                       ldd             #jtc_exit                       ; setup stack for RTS back to monitor
4740
 00FFF98E 034006                          pshs    d
4741
 00FFF990 0C6000                          ldb             #0
4742
 00FFF992 034004                          pshs    b
4743
 00FFF994 0FC000906                       ldd             mon_USAVE
4744
 00FFF997 034006                          pshs    d
4745
 00FFF999 0FC000904                       ldd             mon_YSAVE
4746
 00FFF99C 034006                          pshs    d
4747
 00FFF99E 0FC000902                       ldd             mon_XSAVE
4748
 00FFF9A1 034006                          pshs    d
4749
 00FFF9A3 0B600090E                       lda             mon_DPRSAVE
4750
 00FFF9A6 034002                          pshs    a
4751
 00FFF9A8 0FC000900                       ldd             mon_DSAVE
4752
 00FFF9AB 034006                          pshs    d
4753
 00FFF9AD 0B600090F                       lda             mon_CCRSAVE
4754
 00FFF9B0 034002                          pshs    a
4755
 00FFF9B2 01503507F                       puls    far ccr,d,dpr,x,y,u
4756
 00FFF9B5 01506E90F000911                 jmp             far [mon_numwka+1]
4757 4 robfinch
                              jtc_exit:
4758 21 robfinch
 00FFF9BA 1FF000908                       sts             >mon_SSAVE              ; need to use extended addressing, no direct page setting
4759
 00FFF9BD 03280F006FFF                    leas    $6FFF                                   ; reset stack to system area, dont modify flags register!
4760
 00FFF9C1 034001                          pshs    ccr                                             ; now the stack can be used
4761
 00FFF9C3 034002                          pshs    a                                                       ; save acca register so we can use it
4762
 00FFF9C5 01F0B8                          tfr             dpr,a                                   ; a = outgoing dpr value
4763
 00FFF9C7 0B700090E                       sta             >mon_DPRSAVE    ; force extended addressing mode usage here dpr is not set
4764
 00FFF9CA 04F                             clra                                                            ; dpg register must be set to zero before values are
4765
 00FFF9CB 01F08B                          tfr             a,dpr                                   ; saved in the monitor register save area.
4766
 00FFF9CD 035002                          puls    a                                                       ; get back acca
4767
 00FFF9CF 0FD000900                       std             mon_DSAVE                       ; save regsters, can use direct addressing now
4768
 00FFF9D2 0BF000902                       stx             mon_XSAVE
4769
 00FFF9D5 1BF000904                       sty             mon_YSAVE
4770
 00FFF9D8 0FF000906                       stu             mon_USAVE
4771
 00FFF9DB 035002                          puls    a                                                       ; get back ccr
4772
 00FFF9DD 0B700090F                       sta             mon_CCRSAVE             ; and save it too
4773 13 robfinch
                                      ; Reset vectors in case they got toasted.
4774 21 robfinch
 00FFF9E0 0CCFFEC73                       ldd             #SerialPeekCharDirect
4775
 00FFF9E3 0FD000804                       std             CharInVec
4776
 00FFF9E6 0CCFFE31C                       ldd             #DisplayChar
4777
 00FFF9E9 0FD000800                       std             CharOutVec
4778
 00FFF9EC 0FCFFF5E5                       ldd             DisplayErr
4779
 00FFF9EF 0FD00080C                       std             MonErrVec
4780 4 robfinch
                                      ; todo set according to coreid
4781 21 robfinch
 00FFF9F2 016FFFEA4                       lbra    DumpRegs                        ; now go do a register dump
4782 13 robfinch
*** warning 1: Long branch within short branch range could be optimized
4783 4 robfinch
 
4784
                              ;------------------------------------------------------------------------------
4785
                              ;------------------------------------------------------------------------------
4786 14 robfinch
 
4787
                              DumpIOFocusList:
4788 21 robfinch
 00FFF9F5 08E000000                       ldx             #0
4789 14 robfinch
                              dfl2:
4790 21 robfinch
 00FFF9F8 0E680A000FFC000                 ldb             IOFocusList,x
4791
 00FFF9FD 0C1018                          cmpb    #24
4792
 00FFF9FF 02600A                          bne             dfl1
4793
 00FFFA01 01F010                          tfr             x,d
4794
 00FFFA03 017FFEA34                       lbsr    DispByteAsHex
4795 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4796 21 robfinch
 00FFFA06 0C6020                          ldb             #' '
4797
 00FFFA08 017FFF7BE                       lbsr    OUTCH
4798 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4799
                              dfl1:
4800 21 robfinch
 00FFFA0B 030001                          inx
4801
 00FFFA0D 08C000010                       cmpx    #16
4802
 00FFFA10 025FE6                          blo             dfl2
4803
 00FFFA12 017FFD6BD                       lbsr    CRLF
4804 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4805 21 robfinch
 00FFFA15 016FFF944                       lbra    Monitor
4806 14 robfinch
*** warning 1: Long branch within short branch range could be optimized
4807
 
4808 15 robfinch
                              bootpg:
4809 21 robfinch
 00FFFA18 000                             fcb             $000
4810 15 robfinch
                              boot_stack:
4811 21 robfinch
 00FFFA19 FFC0FF                          fcw             $FFC0FF
4812 15 robfinch
                              numBreakpoints:
4813 21 robfinch
 00FFFA1B 000008                          fcw             8
4814 15 robfinch
                              mon_rom_vectab:
4815 21 robfinch
 00FFFA1D FFFA1F                          fcw             mon_rom_vecs
4816 15 robfinch
                              mon_rom_vecs:
4817 21 robfinch
 00FFFA1F FFF35C                          fcw             Monitor                                         ; enter monitor program
4818
 00FFFA21 FFF191                          fcw             INCH                                                    ; input a character
4819
 00FFFA23 FFF1C9                          fcw             OUTCH                                                   ; output a character
4820
 00FFFA25 FFD0D2                          fcw             CRLF                                                    ; output carriage-return, line feed
4821
 00FFFA27 FFE3DD                          fcw             DisplayString
4822
 00FFFA29 FFE43A                          fcw             DispByteAsHex
4823
 00FFFA2B FFE431                          fcw             DispWordAsHex
4824
 00FFFA2D FFF1D3                          fcw             ShowSprites
4825
 00FFFA2F FFF257                          fcw             mon_srand
4826
 00FFFA31 FFF285                          fcw             mon_rand
4827
 00FFFA33 000000                          fcw             0                                                                       ; operating system call
4828
 00FFFA35 FFF4D2                          fcw             GetRange
4829
 00FFFA37 FFF591                          fcw             GetNumber
4830
 00FFFA39 FFEC9A                          fcw             SerialPutChar
4831 14 robfinch
 
4832 15 robfinch
                              NumFuncs        EQU     (*-mon_rom_vectab)/2
4833
 
4834 16 robfinch
                              ; The following table indicates which routines need to return values in the
4835
                              ; D and possibly X registers.
4836
 
4837
                              mon_rettab:
4838 21 robfinch
 00FFFA3B 000                             fcb             0                       ; monitor
4839
 00FFFA3C 800                             fcb             $800    ; INCH
4840
 00FFFA3D 000                             fcb             0                       ; OUTCH
4841
 00FFFA3E 000                             fcb             0                       ; CRLF
4842
 00FFFA3F 000                             fcb             0                       ; DisplayString
4843
 00FFFA40 000                             fcb             0                       ; DisplayByte
4844
 00FFFA41 000                             fcb             0                       ; DisplayWord
4845
 00FFFA42 000                             fcb             0                       ; show sprites
4846
 00FFFA43 000                             fcb             0                       ; srand
4847
 00FFFA44 C00                             fcb             $C00    ; rand
4848
 00FFFA45 C00                             fcb             $C00    ; OS call
4849
 00FFFA46 000                             fcb             0                       ; GetRange
4850
 00FFFA47 800                             fcb             $800    ; GetNumber
4851
 00FFFA48 000                             fcb             0                       ; SerialPutChar
4852 16 robfinch
 
4853 14 robfinch
                              ;------------------------------------------------------------------------------
4854 15 robfinch
                              ; SWI routine.
4855
                              ;
4856
                              ; SWI is used to call ROM monitor routines and process breakpoints.
4857
                              ;
4858
                              ;       swi
4859
                              ;       fcb 
4860 14 robfinch
                              ;------------------------------------------------------------------------------
4861 15 robfinch
 
4862
                              swi_rout:
4863 21 robfinch
 00FFFA49 0E680CFCC                       ldb             bootpg,pcr                      ; reset direct page
4864
 00FFFA4C 01F09B                          tfr             b,dp
4865 15 robfinch
                              swi_rout1:
4866 21 robfinch
 00FFFA4E 0EE60B                          ldu             11,s                                            ; get program counter (low order 2 bytes)
4867
 00FFFA50 0335FF                          leau    -1,u                                            ; backup a byte
4868
 00FFFA52 07D000810                       tst             BreakpointFlag  ; are we in breakpoint mode?
4869
 00FFFA55 02700F                          beq             swiNotBkpt
4870
 00FFFA57 18E000820                       ldy             #Breakpoints
4871
 00FFFA5A 0F6000811                       ldb             NumSetBreakpoints
4872
 00FFFA5D 027007                          beq             swiNotBkpt
4873 15 robfinch
                              swi_rout2:
4874 21 robfinch
 00FFFA5F 2A3A01                          cmpu    ,y++
4875
 00FFFA61 02704B                          beq             processBreakpoint
4876
 00FFFA63 05A                             decb
4877
 00FFFA64 026FF9                          bne             swi_rout2
4878 15 robfinch
                              swiNotBkpt:
4879 21 robfinch
 00FFFA66 07F000810                       clr             BreakpointFlag
4880
 00FFFA69 037006                          pulu    d                                                               ; get function #, increment PC
4881
 00FFFA6B 0C100F                          cmpb    #NumFuncs
4882
 00FFFA6D 122FFFB75                       lbhi    DisplayErr
4883 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
4884 21 robfinch
 00FFFA70 0EF60B                          stu             11,s                                            ; save updated PC on stack
4885
 00FFFA72 0C100A                          cmpb    #MF_OSCALL
4886
 00FFFA74 027072                          beq             swiCallOS
4887
 00FFFA76 058                             aslb                                                                    ; 2 bytes per vector
4888
 00FFFA77 0AE80CFA3                       ldx             mon_rom_vectab,pcr
4889
 00FFFA7A 03A                             abx
4890
 00FFFA7B 0AE804                          ldx             ,x
4891
 00FFFA7D 0BF000928                       stx             jmpvec
4892
 00FFFA80 054                             lsrb
4893
 00FFFA81 08EFFFA3B                       ldx             #mon_rettab
4894
 00FFFA84 03A                             abx
4895
 00FFFA85 0E6804                          ldb             ,x
4896
 00FFFA87 0F7000930                       stb             mon_retflag
4897
 00FFFA8A 1FF000908                       sts             mon_SSAVE                               ; save the stack pointer
4898
 00FFFA8D 0EC601                          ldd             1,s                                                     ; get back D
4899
 00FFFA8F 0AE604                          ldx             4,s                                                     ; get back X
4900
 00FFFA91 1AE606                          ldy             6,s                                                     ; get back Y
4901
 00FFFA93 0EE608                          ldu             8,s                                                     ; get back U
4902
 00FFFA95 1EE80CF81                       lds             boot_stack,pcr  ; and use our own stack
4903
 00FFFA98 0AD90F000928                    jsr             [jmpvec]                                ; call the routine
4904 15 robfinch
                              swi_rout3:
4905 21 robfinch
 00FFFA9C 1FE000908                       lds             mon_SSAVE                               ; restore stack
4906
 00FFFA9F 07D000930                       tst             mon_retflag
4907
 00FFFAA2 02A009                          bpl             swi_rout4
4908
 00FFFAA4 0ED601                          std             1,s                                                     ; return value in D
4909
 00FFFAA6 078000930                       asl             mon_retflag
4910
 00FFFAA9 02A002                          bpl             swi_rout4
4911
 00FFFAAB 0AF604                          stx             4,s                                                     ; return value in X
4912 16 robfinch
                              swi_rout4:
4913 21 robfinch
 00FFFAAD 03B                             rti
4914 15 robfinch
 
4915 21 robfinch
                              ;------------------------------------------------------------------------------
4916
                              ; A breakpoint was struck during program execution, process accordingly.
4917
                              ;------------------------------------------------------------------------------
4918
 
4919 15 robfinch
                              processBreakpoint:
4920 21 robfinch
 00FFFAAE 0A6E04                          lda             ,s
4921
 00FFFAB0 0B700090F                       sta             mon_CCRSAVE
4922
 00FFFAB3 0EC601                          ldd             1,s
4923
 00FFFAB5 0FD000900                       std             mon_DSAVE
4924
 00FFFAB8 0E6603                          ldb             3,s
4925
 00FFFABA 0F700090E                       stb             mon_DPRSAVE
4926
 00FFFABD 0EC604                          ldd             4,s
4927
 00FFFABF 0FD000902                       std             mon_XSAVE
4928
 00FFFAC2 0EC606                          ldd             6,s
4929
 00FFFAC4 0FD000904                       std             mon_YSAVE
4930
 00FFFAC7 0EC608                          ldd             8,s
4931
 00FFFAC9 0FD000906                       std             mon_USAVE
4932
 00FFFACC 1FF000908                       sts             mon_SSAVE
4933
 00FFFACF 0E660A                          ldb             10,s
4934
 00FFFAD1 0F700090A                       stb             mon_PCSAVE
4935
 00FFFAD4 0EC60B                          ldd             11,s
4936
 00FFFAD6 0FD00090B                       std             mon_PCSAVE+1
4937
 00FFFAD9 1EE80CF3D                       lds             boot_stack,pcr
4938
 00FFFADC 0CCFFFA9C                       ldd             #swi_rout3                      ; setup so monitor can return
4939
 00FFFADF 034006                          pshs    d
4940
 00FFFAE1 08D01F                          bsr             DisarmAllBreakpoints
4941
 00FFFAE3 016FFFDB3                       lbra    DumpRegs
4942 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
4943
 
4944
                              xitMonitor:
4945 21 robfinch
 00FFFAE6 020039                          bra             ArmAllBreakpoints
4946 15 robfinch
 
4947 21 robfinch
                              ;------------------------------------------------------------------------------
4948
                              ;------------------------------------------------------------------------------
4949
 
4950 15 robfinch
                              swiCallOS:
4951 21 robfinch
 00FFFAE8 033401                          leau    1,u                                                     ; next byte is func number
4952
 00FFFAEA 0E6C00                          ldb             ,u+
4953
 00FFFAEC 0C1019                          cmpb    #NumOSFuncs                     ; check for valid range
4954
 00FFFAEE 122FFFAF4                       lbhi    DisplayErr
4955 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
4956 21 robfinch
 00FFFAF1 0EF60B                          stu             11,s                                            ; save updateed PC on stack
4957
 00FFFAF3 058                             aslb                                                                    ; compute vector address
4958
 00FFFAF4 08EFFF1DE                       ldx             #OSCallTbl
4959
 00FFFAF7 06DE0F                          tst             b,x                                                     ; check for non-zero vector
4960
 00FFFAF9 027FA1                          beq             swi_rout3
4961 15 robfinch
                              osc1:
4962
                              ;       tst             OSSEMA+1                                ; wait for availability
4963
                              ;       beq             osc1
4964 21 robfinch
 00FFFAFB 0ADF0F                          jsr             [b,x]                                           ; call the OS routine
4965 15 robfinch
                              oscx:
4966 21 robfinch
 00FFFAFD 07FEF0011                       clr             OSSEMA+1
4967
 00FFFB00 020F9A                          bra             swi_rout3
4968 15 robfinch
 
4969 21 robfinch
                              ;------------------------------------------------------------------------------
4970
                              ; DisarmAllBreakpoints, used when entering the monitor.
4971
                              ;------------------------------------------------------------------------------
4972
 
4973 15 robfinch
                              DisarmAllBreakpoints:
4974 21 robfinch
 00FFFB02 034036                          pshs    d,x,y
4975
 00FFFB04 18E000000                       ldy             #0
4976
 00FFFB07 05F                             clrb
4977
 00FFFB08 08E000830                       ldx             #BreakpointBytes        ; x = breakpoint byte table address
4978 15 robfinch
                              disarm2:
4979 21 robfinch
 00FFFB0B 0C1A1B                          cmpb    #numBreakpoints         ; safety check
4980
 00FFFB0D 024010                          bhs             disarm1
4981
 00FFFB0F 0F1000811                       cmpb    NumSetBreakpoints
4982
 00FFFB12 02400B                          bhs             disarm1
4983
 00FFFB14 0A6837                          lda             b,x                                                             ; get memory byte
4984
 00FFFB16 0A7B09000820                    sta             [Breakpoints,y]         ; and store it back to memory
4985
 00FFFB1A 031202                          leay    2,y                                                             ; increment for next address
4986
 00FFFB1C 05C                             incb                                                                            ; increment to next byte
4987
 00FFFB1D 020FEC                          bra             disarm2                                         ; loop back
4988 15 robfinch
                              disarm1:
4989 21 robfinch
 00FFFB1F 0350B6                          puls    d,x,y,pc
4990 15 robfinch
 
4991 21 robfinch
                              ;------------------------------------------------------------------------------
4992
                              ;------------------------------------------------------------------------------
4993
 
4994 15 robfinch
                              ArmAllBreakpoints:
4995 21 robfinch
 00FFFB21 034036                          pshs    d,x,y
4996
 00FFFB23 18E000000                       ldy             #0
4997
 00FFFB26 05F                             clrb
4998
 00FFFB27 08E000830                       ldx             #BreakpointBytes        ; x = breakpoint byte table address
4999 15 robfinch
                              arm2:
5000 21 robfinch
 00FFFB2A 0F1FFFA1B                       cmpb    numBreakpoints          ; safety check
5001
 00FFFB2D 024010                          bhs             arm1
5002
 00FFFB2F 0F1000811                       cmpb    NumSetBreakpoints
5003
 00FFFB32 02400B                          bhs             arm1
5004
 00FFFB34 0A6B09000820                    lda             [Breakpoints,y]         ; load byte at memory address
5005
 00FFFB38 0A7B0D                          sta             b,x                                                             ; save in table
5006
 00FFFB3A 031202                          leay    2,y                                                             ; increment for next address
5007
 00FFFB3C 05C                             incb                                                                            ; increment to next byte
5008
 00FFFB3D 020FEB                          bra             arm2                                                    ; loop back
5009 15 robfinch
                              arm1:
5010 21 robfinch
 00FFFB3F 0350B6                          puls    d,x,y,pc
5011 15 robfinch
 
5012 21 robfinch
                              ;------------------------------------------------------------------------------
5013
                              ;------------------------------------------------------------------------------
5014
 
5015 15 robfinch
                              ArmBreakpoint:
5016 21 robfinch
 00FFFB41 034036                          pshs    d,x,y
5017
 00FFFB43 0B6000811                       lda             NumSetBreakpoints               ; check if too many breakpoints set
5018
 00FFFB46 0B1FFFA1B                       cmpa    numBreakpoints
5019
 00FFFB49 124FFFA99                       lbhs    DisplayErr
5020 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
5021 21 robfinch
 00FFFB4C 017FFF92B                       lbsr    ignBlanks
5022 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
5023 21 robfinch
 00FFFB4F 017FFF9A9                       lbsr    GetHexNumber                            ; get address parameter
5024
*** warning 1: Long branch within short branch range could be optimized
5025
 00FFFB52 05D                             tstb
5026
 00FFFB53 12BFFFA8F                       lbmi    DisplayErr
5027
*** warning 1: Long branch within short branch range could be optimized
5028
 00FFFB56 0F6000811                       ldb             NumSetBreakpoints               ; bv= number of set breakpoints
5029
 00FFFB59 1BE000912                       ldy             mon_numwka+2                            ; get address
5030
 00FFFB5C 0A6A04                          lda             ,y                                                                      ; get byte at address
5031
 00FFFB5E 08E000830                       ldx             #BreakpointBytes                ; and store byte in a table
5032
 00FFFB61 0A7A05                          sta             b,x                                                                     ; record
5033
 00FFFB63 08603F                          lda             #OPC_SWI                                                ; put a SWI instruction in place
5034
 00FFFB65 0A7A04                          sta             ,y
5035
 00FFFB67 08E000820                       ldx             #Breakpoints                            ; also store the address in a table
5036
 00FFFB6A 058                             aslb                                                                                    ; index for 2 byte values
5037
 00FFFB6B 1AFA05                          sty             b,x
5038
 00FFFB6D 054                             lsrb                                                                                    ; size back to single byte
5039
 00FFFB6E 05C                             incb
5040
 00FFFB6F 0F7000811                       stb             NumSetBreakpoints
5041
 00FFFB72 035036                          puls    d,x,y
5042
 00FFFB74 016FFF7E5                       lbra    Monitor
5043
*** warning 1: Long branch within short branch range could be optimized
5044 15 robfinch
 
5045 21 robfinch
                              ;------------------------------------------------------------------------------
5046
                              ;------------------------------------------------------------------------------
5047
 
5048 15 robfinch
                              DisarmBreakpoint:
5049 21 robfinch
 00FFFB77 034076                          pshs    d,x,y,u
5050
 00FFFB79 017FFF8FE                       lbsr    ignBlanks
5051 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
5052 21 robfinch
 00FFFB7C 017FFF97C                       lbsr    GetHexNumber
5053
*** warning 1: Long branch within short branch range could be optimized
5054
 00FFFB7F 05D                             tstb
5055
 00FFFB80 12BFFF7D9                       lbmi    Monitor
5056
*** warning 1: Long branch within short branch range could be optimized
5057
 00FFFB83 05F                             clrb
5058
 00FFFB84 05F                             clrb
5059
 00FFFB85 01F001                          tfr             d,x                                                                     ; x = zero too
5060 15 robfinch
                              disarm6:
5061 21 robfinch
 00FFFB87 0F1FFFA1B                       cmpb    numBreakpoints                  ; no more than this many may be set
5062
 00FFFB8A 024041                          bhs             disarm4
5063
 00FFFB8C 0F1000811                       cmpb    NumSetBreakpoints               ; number actually set
5064
 00FFFB8F 02403C                          bhs             disarm4
5065
 00FFFB91 1AE809000820                    ldy             Breakpoints,x                           ; y = breakpoint address
5066
 00FFFB95 1BC000912                       cmpy    mon_numwka+2                            ; is it the one we want?
5067
 00FFFB98 02602E                          bne             disarm3                                                 ; if not, go increment to next
5068
 00FFFB9A 0BE000912                       ldx             mon_numwka+2                            ; x = memory address
5069
 00FFFB9D 18E000830                       ldy             #BreakpointBytes
5070
 00FFFBA0 0A6A0D                          lda             b,y                                                                     ; get saved byte from table
5071
 00FFFBA2 0A7804                          sta             ,x                                                                      ; set the byte at the memory address
5072 15 robfinch
                                      ; compress breakpoint table by removing breakpoint
5073 21 robfinch
 00FFFBA4 07A000811                       dec             NumSetBreakpoints               ; set the new number of set breakpoints
5074
 00FFFBA7 034004                          pshs    b                                                                               ; save the position we're removing from
5075 15 robfinch
                              disarm7:
5076 21 robfinch
 00FFFBA9 05C                             incb                                                                                    ; set index for next byte
5077
 00FFFBAA 0A6A05                          lda             b,y                                                                     ; get byte
5078
 00FFFBAC 05A                             decb                                                                                    ; and store it back
5079
 00FFFBAD 0A7A05                          sta             b,y
5080
 00FFFBAF 05C                             incb                                                                                    ; move to next position
5081
 00FFFBB0 0F1FFFA1B                       cmpb    numBreakpoints                  ; hit end of table?
5082
 00FFFBB3 025FF4                          blo             disarm7
5083
 00FFFBB5 035004                          puls    b                                                                               ; get back position
5084
 00FFFBB7 058                             aslb                                                                                    ; times two for word index
5085
 00FFFBB8 04F                             clra
5086
 00FFFBB9 01F002                          tfr             d,y
5087
 00FFFBBB 054                             lsrb                                                                                    ; back to byte index value
5088 15 robfinch
                              disarm8:
5089 21 robfinch
 00FFFBBC 0EE202                          ldu             2,y                                                                     ; get next breakpoint address
5090
 00FFFBBE 0EFA01                          stu             ,y++                                                            ; store in current pos, increment
5091
 00FFFBC0 05C                             incb                                                                                    ; increment count
5092
 00FFFBC1 0F1FFFA1B                       cmpb    numBreakpoints                  ; hit end of table?
5093
 00FFFBC4 025FF6                          blo             disarm8
5094
 00FFFBC6 0350F6                          puls    d,x,y,u,pc
5095 15 robfinch
                              disarm3:
5096 21 robfinch
 00FFFBC8 030002                          leax    2,x
5097
 00FFFBCA 05C                             incb
5098
 00FFFBCB 020FBA                          bra             disarm6
5099 15 robfinch
                              disarm4:
5100 21 robfinch
 00FFFBCD 035076                          puls    d,x,y,u
5101
 00FFFBCF 016FFF78A                       lbra    Monitor
5102
*** warning 1: Long branch within short branch range could be optimized
5103 15 robfinch
 
5104
                              ;------------------------------------------------------------------------------
5105
                              ;------------------------------------------------------------------------------
5106 21 robfinch
 
5107
                              ListBreakpoints:
5108
 00FFFBD2 034016                          pshs    d,x
5109
 00FFFBD4 03F                             swi
5110
 00FFFBD5 003                             fcb             MF_CRLF
5111
 00FFFBD6 08E000000                       ldx             #0
5112
 00FFFBD9 0C6000                          ldb             #0
5113
                              lbrk1:
5114
 00FFFBDB 0F1FFFA1B                       cmpb    numBreakpoints
5115
 00FFFBDE 024016                          bhs             lbrk2
5116
 00FFFBE0 0F1000811                       cmpb    NumSetBreakpoints
5117
 00FFFBE3 024011                          bhs             lbrk2
5118
 00FFFBE5 0EC809000820                    ldd             Breakpoints,x
5119
 00FFFBE9 030002                          leax    2,x
5120
 00FFFBEB 05C                             incb
5121
 00FFFBEC 034004                          pshs    b
5122
 00FFFBEE 03F                             swi
5123
 00FFFBEF 006                             fcb             MF_DisplayWordAsHex
5124
 00FFFBF0 03F                             swi
5125
 00FFFBF1 003                             fcb             MF_CRLF
5126
 00FFFBF2 035004                          puls    b
5127
 00FFFBF4 020FE5                          bra             lbrk1
5128
                              lbrk2:
5129
 00FFFBF6 035016                          puls    d,x
5130
 00FFFBF8 016FFF761                       lbra    Monitor
5131
*** warning 1: Long branch within short branch range could be optimized
5132
 
5133
                              ;------------------------------------------------------------------------------
5134
                              ;------------------------------------------------------------------------------
5135 4 robfinch
                              swi3_rout:
5136 21 robfinch
 00FFFBFB 01A010                          sei
5137
 00FFFBFD 0A6E04                          lda             ,s
5138
 00FFFBFF 0B700090F                       sta             mon_CCRSAVE
5139
 00FFFC02 0EC601                          ldd             1,s
5140
 00FFFC04 0FD000900                       std             mon_DSAVE
5141
 00FFFC07 0E6603                          ldb             3,s
5142
 00FFFC09 0F700090E                       stb             mon_DPRSAVE
5143
 00FFFC0C 0EC604                          ldd             4,s
5144
 00FFFC0E 0FD000902                       std             mon_XSAVE
5145
 00FFFC11 0EC606                          ldd             6,s
5146
 00FFFC13 0FD000904                       std             mon_YSAVE
5147
 00FFFC16 0EC608                          ldd             8,s
5148
 00FFFC18 0FD000906                       std             mon_USAVE
5149
 00FFFC1B 1FF000908                       sts             mon_SSAVE
5150
 00FFFC1E 0EC60B                          ldd             11,s
5151
 00FFFC20 0FD00090A                       std             mon_PCSAVE
5152
 00FFFC23 1FF000908                       sts             mon_SSAVE
5153
 00FFFC26 1CE003FFF                       lds             #$3FFF
5154
 00FFFC29 0CCFFFC33                       ldd             #swi3_exit
5155
 00FFFC2C 034006                          pshs    d
5156
 00FFFC2E 01C0EF                          cli
5157
 00FFFC30 07EFFF899                       jmp             DumpRegs
5158 4 robfinch
                              swi3_exit:
5159 21 robfinch
 00FFFC33 1FE000908                       lds             mon_SSAVE
5160
 00FFFC36 03B                             rti
5161 4 robfinch
 
5162
                              ;------------------------------------------------------------------------------
5163
                              ;------------------------------------------------------------------------------
5164 13 robfinch
                              firq_rout:
5165 21 robfinch
 00FFFC37 03B                             rti
5166 13 robfinch
 
5167 4 robfinch
                              irq_rout:
5168 21 robfinch
 00FFFC38 04F                             clra
5169
 00FFFC39 01F08B                          tfr             a,dpr
5170
                                      setdp   $000
5171 13 robfinch
                              ;       lbsr    SerialIRQ       ; check for recieved character
5172 21 robfinch
 00FFFC3B 017FFE855                       lbsr    TimerIRQ
5173 15 robfinch
*** warning 1: Long branch within short branch range could be optimized
5174 13 robfinch
 
5175 21 robfinch
 00FFFC3E 0B6FFC014                       lda             IrqBase                 ; get the IRQ flag byte
5176
 00FFFC41 044                             lsra
5177
 00FFFC42 0BAFFC014                       ora             IrqBase
5178
 00FFFC45 084FE0                          anda    #$FE0
5179
 00FFFC47 0B7FFC014                       sta             IrqBase
5180 4 robfinch
 
5181 13 robfinch
                              ;       inc             TEXTSCR+54              ; update IRQ live indicator on screen
5182 21 robfinch
                              ;       inc             TEXTSCR+$2000+54
5183 4 robfinch
 
5184
                                      ; flash the cursor
5185
                                      ; only bother to flash the cursor for the task with the IO focus.
5186 21 robfinch
 00FFFC4A 0150B6FFFFFFFE0                 lda             COREID
5187
 00FFFC4F 0B1FFC010                       cmpa    IOFocusID
5188
 00FFFC52 02600D                          bne             tr1a
5189
 00FFFC54 096114                          lda             CursorFlash             ; test if we want a flashing cursor
5190
 00FFFC56 027009                          beq             tr1a
5191
 00FFFC58 017FFE69A                       lbsr    CalcScreenLoc   ; compute cursor location in memory
5192
*** warning 1: Long branch within short branch range could be optimized
5193
 00FFFC5B 01F002                          tfr             d,y
5194
 00FFFC5D 06CA09002000                    inc             $2000,y                 ; get color code $2000 higher in memory
5195 13 robfinch
                              tr1a:
5196 21 robfinch
 00FFFC61 03B                             rti
5197 4 robfinch
 
5198
                              ;------------------------------------------------------------------------------
5199
                              ;------------------------------------------------------------------------------
5200
                              nmi_rout:
5201 21 robfinch
 00FFFC62 0150F6FFFFFFFE0                 ldb             COREID
5202
 00FFFC67 086049                          lda             #'I'
5203
 00FFFC69 08EE00028                       ldx             #TEXTSCR+40
5204
 00FFFC6C 0A7A0D                          sta             b,x
5205 13 robfinch
                              rti_insn:
5206 21 robfinch
 00FFFC6E 03B                             rti
5207 4 robfinch
 
5208 13 robfinch
                              ; Special Register Area
5209
                                      org             $FFFFE0
5210
 
5211
                              ; Interrupt vector table
5212
 
5213 4 robfinch
                                      org             $FFFFF0
5214 21 robfinch
 00FFFFF0 FFFC6E                          fcw             rti_insn                ; reserved
5215
 00FFFFF2 FFFBFB                          fcw             swi3_rout               ; SWI3
5216
 00FFFFF4 FFFC6E                          fcw             rti_insn                ; SWI2
5217
 00FFFFF6 FFFC37                          fcw             firq_rout               ; FIRQ
5218
 00FFFFF8 FFFC38                          fcw             irq_rout                ; IRQ
5219
 00FFFFFA FFFA49                          fcw             swi_rout                ; SWI
5220
 00FFFFFC FFFC62                          fcw             nmi_rout                ; NMI
5221 13 robfinch
 00FFFFFE FFE023                          fcw             start                           ; RST
5222 4 robfinch
 
5223 21 robfinch
112 warning(s) in pass 2.
5224 4 robfinch
 
5225
SYMBOL TABLE
5226 21 robfinch
      ABD1 02 00FFF5DB      ABD2 02 00FFF5E2      ACIA 00 FFE30100  ACIA_CMD 00 00000002
5227
 ACIA_CTRL 00 00000003 ACIA_CTRL2 00 0000000B ACIA_IRQS 00 00000004   ACIA_RX 00 00000000
5228
 ACIA_STAT 00 00000001   ACIA_TX 00 00000000       ACK 00 00000006      ARM1 02 00FFFB3F
5229
      ARM2 02 00FFFB2A ARMALLBREAKPOINTS 02 00FFFB21 ARMBREAKPOINT 02 00FFFB41 ASCIITOBINDIGIT 02 00FFF5D5
5230
 ASCIITODECDIGIT 02 00FFF5C7 ASCIITOHEXNYBBLE 02 00FFF59F    ASMBUF 00 00000160 BIOS_SCREENS 00 17000000
5231
 BLANKLINE 02 00FFE283 BLKCPYDST 00 00000020 BLKCPYSRC 00 0000001C   BLNKLN1 02 00FFE296
5232
    BOOTPG 02 00FFFA18 BOOT_STACK 02 00FFFA19 BREAKPOINTBYTES 00 00000830 BREAKPOINTFLAG 00 00000810
5233
 BREAKPOINTS 00 00000820        BS 00 00000008 CALCSCREENLOC 02 00FFE2F5       CAN 00 00000018
5234
 CHARCOLOR 00 00000112 CHARINVEC 00 00000804 CHAROUTVEC 00 00000800 CHECKPOINT 02 00FFE140
5235
 CLEARSCREEN 02 00FFE23C CLEARSCREENJMP 02 00FFD300 CMDPROMPT 02 00FFF32C CMDPROMPTJI 00 00000808
5236
 CMDTABLE1 02 00FFF29A CMDTABLE2 02 00FFF2EC COLORCODELOCATION 00 00000014      COLS 00 00000040
5237
 COPYSCREENTOVIRTUALSCREEN 02 00FFE20C COPYVIRTUALSCREENTOSCREEN 02 00FFE1D5    COREID 00 FFFFFFE0        CR 00 0000000D
5238
      CRLF 02 00FFD0D2     CRLF1 02 00FFD0D2    CRLFST 02 00FFE425       CS1 02 00FFE249
5239
       CS2 02 00FFE260     CS2V1 02 00FFE218       CS3 02 00FFE266      CSL1 02 00FFE314
5240 16 robfinch
     CTRLC 00 00000003     CTRLH 00 00000008     CTRLI 00 00000009     CTRLJ 00 0000000A
5241
     CTRLK 00 0000000B     CTRLM 00 0000000D     CTRLS 00 00000013     CTRLT 00 00000014
5242
     CTRLX 00 00000018     CTRLZ 00 0000001A CURSORCOL 00 00000111 CURSORFLASH 00 00000114
5243 21 robfinch
 CURSORROW 00 00000110     CV2S1 02 00FFE1EA DBGCHECKFORKEY 02 00FFEA90     DBGK1 02 00FFEACB
5244 16 robfinch
    DBGK10 02 00FFEB30    DBGK11 02 00FFEB89    DBGK12 02 00FFEB8F    DBGK13 02 00FFEB9B
5245
    DBGK14 02 00FFEBAB    DBGK15 02 00FFEBBA    DBGK16 02 00FFEBC5    DBGK17 02 00FFEBCE
5246
    DBGK18 02 00FFEBD1     DBGK2 02 00FFEA96    DBGK20 02 00FFEAB8    DBGK22 02 00FFEAD4
5247
    DBGK23 02 00FFEAE5    DBGK24 02 00FFEAC6     DBGK3 02 00FFEAE8     DBGK4 02 00FFEAF4
5248
     DBGK5 02 00FFEB00     DBGK7 02 00FFEB10     DBGK8 02 00FFEB16     DBGK9 02 00FFEB2A
5249
 DBGKNOTALT 02 00FFEB93 DBGKNOTCAPSLOCK 02 00FFEB62 DBGKNOTCTRL 02 00FFEB1A DBGKNOTNUMLOCK 02 00FFEB4B
5250 21 robfinch
 DBGKNOTRSHIFT 02 00FFEB34 DBGKNOTSCROLLLOCK 02 00FFEB79      DCCR 02 00FFE32C      DCLF 02 00FFE3B6
5251
     DCX10 02 00FFE366     DCX11 02 00FFE376     DCX12 02 00FFE372     DCX13 02 00FFE382
5252
     DCX14 02 00FFE329      DCX3 02 00FFE3A4      DCX4 02 00FFE3B8      DCX5 02 00FFE393
5253
      DCX6 02 00FFE33D      DCX7 02 00FFE339      DCX8 02 00FFE34A      DCX9 02 00FFE357
5254
       DEL 00 0000007F   DELAY3S 02 00FFE1B8      DFL1 02 00FFFA0B      DFL2 02 00FFF9F8
5255
   DISARM1 02 00FFFB1F   DISARM2 02 00FFFB0B   DISARM3 02 00FFFBC8   DISARM4 02 00FFFBCD
5256
   DISARM6 02 00FFFB87   DISARM7 02 00FFFBA9   DISARM8 02 00FFFBBC DISARMALLBREAKPOINTS 02 00FFFB02
5257
 DISARMBREAKPOINT 02 00FFFB77 DISPBYTEASHEX 02 00FFE43A DISPDWORDASHEX 02 00FFE428 DISPLAYCHAR 02 00FFE31C
5258
 DISPLAYERR 02 00FFF5E5 DISPLAYSTRING 02 00FFE3DD DISPLAYSTRINGCRLF 02 00FFE3FD DISPLAYSTRINGDX 02 00FFF5EE
5259
   DISPNYB 02 00FFE452  DISPNYB1 02 00FFE461 DISPWORDASHEX 02 00FFE431    DLY3S1 02 00FFE1BB
5260
    DLY3S2 02 00FFE1BF     DMPM1 02 00FFF7ED     DMPM2 02 00FFF7D8     DMPM3 02 00FFF826
5261
     DMPM4 02 00FFF818     DMPM5 02 00FFF810 DRAM_BASE 00 10000000    DSPJ1B 02 00FFE3EF
5262
     DSPJ2 02 00FFE3EA    DSRETB 02 00FFE3F8 DUMPIOFOCUSLIST 02 00FFF9F5 DUMPMEMORY 02 00FFF7D0
5263
  DUMPREGS 02 00FFF899    DUMRTS 02 00FFE022  EDITMEM1 02 00FFF84D  EDITMEM2 02 00FFF838
5264
  EDITMEM3 02 00FFF86C  EDITMEM4 02 00FFF857  EDITMEM6 02 00FFF863 EDITMEMORY 02 00FFF82C
5265
 ENDOFWORD 02 00FFF41C       EOT 00 00000004       ETB 00 00000017   FARFLAG 00 0000015F
5266
    FILLM1 02 00FFF87F    FILLM2 02 00FFF88F    FILLM3 02 00FFF896 FILLMEMORY 02 00FFF86F
5267
 FIRQ_ROUT 02 00FFFC37 FIRST_CORE 00 00000001   FREEMBX 02 00000002   FREEMSG 02 00000006
5268
   FREETCB 00 0000078A GETBINNUMBER 02 00FFF52B GETDECNUMBER 02 00FFF552 GETHEXNUMBER 02 00FFF4FB
5269
    GETKEY 02 00FFEA92 GETNUMBER 02 00FFF591  GETRANGE 02 00FFF4D2 GETSCREENLOCATION 02 00FFE29D
5270
 GETTWOPARAMS 02 00FFF4B1     GRNG1 02 00FFF4ED      GSL1 02 00FFE2AF    GTBIN1 02 00FFF54E
5271
    GTBIN2 02 00FFF538     GTDC3 02 00FFF5D2    GTDEC1 02 00FFF58D    GTDEC2 02 00FFF55F
5272
     GTHX3 02 00FFF5C4     GTHX5 02 00FFF5AA     GTHX6 02 00FFF5B7    GTHXN1 02 00FFF527
5273
    GTHXN2 02 00FFF508       HC1 02 00FFE2CD   HELPMSG 02 00FFF5FE      HEX2 02 00FFD2CE
5274
      HEX4 02 00FFD2D2 HOMECURSOR 02 00FFE2B3 HOMECURSORJMP 02 00FFD308     I2CW1 02 00FFE4EF
5275
    I2CWR1 02 00FFE51C   I2C_CMD 00 00000004  I2C_CTRL 00 00000002  I2C_INIT 02 00FFE4E3
5276
  I2C_PREH 00 00000001  I2C_PREL 00 00000000   I2C_RXR 00 00000003  I2C_STAT 00 00000004
5277
   I2C_TXR 00 00000003 I2C_WAIT_RX_NACK 02 00FFE51A I2C_WAIT_TIP 02 00FFE4ED I2C_WR_CMD 02 00FFE4F7
5278
 I2C_XMIT1 02 00FFE500      ICC1 02 00FFE3D9      ICC2 02 00FFE3DB      ICR1 02 00FFE3CB
5279
 IGNBLANKS 02 00FFF47A IGNBLANKS1 02 00FFF47A INCCURSORPOS 02 00FFE3BA INCCURSORROW 02 00FFE3C9
5280
      INCH 02 00FFF191     INCH1 02 00FFF1A6     INCH2 02 00FFF193     INCHE 02 00FFF1AF
5281
    INCHEK 02 00FFF1B3   INCHEK1 02 00FFF1C8   INCHEK2 02 00FFF1C5   INCHEK3 02 00FFF1BC
5282
      INIT 02 00FFE0A8     INIT1 02 00FFE0B0     INIT2 02 00FFE0FB INITSERIAL 02 00FFEBEF
5283
 IOFOCUSID 00 00FFC010 IOFOCUSLIST 00 00FFC000 IOFOCUSNDX 00 00000100   IRQBASE 00 00FFC014
5284
   IRQFLAG 00 00FFC012 IRQSOURCE 00 00FFC011  IRQ_ROUT 02 00FFFC38    JMPVEC 00 00000928
5285
  JTC_EXIT 02 00FFF9BA JUMP_TO_CODE 02 00FFF980 KBDBUFFULL 02 00FFEA8D   KBDFIFO 00 00000040
5286
 KBDFIFOALIAS 00 00C00040 KBDHEADRCV 00 00000127  KBDI0002 02 00FFE9C9  KBDI0004 02 00FFEA0E
5287
 KBDITRYAGAIN 02 00FFEA02 KBDRCVCOUNT 02 00FFEA3D KBDTAILRCV 00 00000128     KBGS1 02 00FFE978
5288
     KBGS2 02 00FFE970     KBGS3 02 00FFE961     KEYBD 00 FFE30400  KEYBDACK 00 FFFFCC00
5289
  KEYBDBAD 00 FFFFCB00 KEYBDBLOCK 00 00000126 KEYBDBUFFER 00 FFFFC000 KEYBDCHECKFORKEYDIRECT 02 00FFF18F
5290
 KEYBDCLOSE 02 00FFEBEB  KEYBDCLR 00 FFE30402 KEYBDCONTROLCODES 02 00FFE800 KEYBDECHO 00 FFFFCA00
5291
 KEYBDEXTENDEDCODES 02 00FFE880 KEYBDGETID 02 00FFE99C KEYBDGETSCANCODE 02 00FFE97D KEYBDGETSTATUS 02 00FFE961
5292
 KEYBDHEAD 00 FFFFC800   KEYBDID 00 00000124 KEYBDINIT 02 00FFE9C0  KEYBDIRQ 02 00FFEA4F
5293
 KEYBDLOCKS 00 FFFFCD00 KEYBDOPEN 02 00FFEBEA KEYBDREAD 02 00FFEBEC KEYBDRECVBYTE 02 00FFE900
5294
 KEYBDSEEK 02 00FFEBEE KEYBDSENDBYTE 02 00FFE919 KEYBDSETLED 02 00FFE989 KEYBDTAIL 00 FFFFC900
5295
 KEYBDWAITTX 02 00FFE91F KEYBDWRITE 02 00FFEBED    KEYLED 00 00000122 KEYSTATE1 00 00000120
5296
 KEYSTATE2 00 00000121     KGID1 02 00FFE9B9  KGNOTKBD 02 00FFE9BC      KRB3 02 00FFE905
5297
      KRB4 02 00FFE915    KRCXIT 02 00FFEA4E      KWT1 02 00FFE924      KWT2 02 00FFE935
5298
     LBRK1 02 00FFFBDB     LBRK2 02 00FFFBF6      LEDS 00 FFE60001    LEDXIT 02 00FFEA22
5299
    LETTER 02 00FFD2C1        LF 00 0000000A LISTBREAKPOINTS 02 00FFFBD2 MAX_TASKNO 00 0000003F
5300
   MF_CRLF 00 00000003 MF_DISPLAYBYTEASHEX 00 00000005 MF_DISPLAYSTRING 00 00000004 MF_DISPLAYWORDASHEX 00 00000006
5301
 MF_GETNUMBER 00 0000000C MF_GETRANGE 00 0000000B   MF_INCH 00 00000001 MF_MONITOR 00 00000000
5302
 MF_OSCALL 00 0000000A  MF_OUTCH 00 00000002 MF_RANDOM 00 00000009 MF_SERIALPUTCHAR 00 0000000D
5303
 MF_SHOWSPRITES 00 00000007  MF_SRAND 00 00000008 MILLISECONDS 00 00FFC014      MON1 02 00FFF3BA
5304
 MONARMBREAKPOINT 02 00FFF469 MONDISARMBREAKPOINT 02 00FFF474 MONERRVEC 00 0000080C  MONGETCH 02 00FFF45D
5305
 MONGETNONSPACE 02 00FFF462   MONITOR 02 00FFF35C MON_CCRSAVE 00 0000090F MON_DPRSAVE 00 0000090E
5306 16 robfinch
 MON_DSAVE 00 00000900  MON_INIT 00 0000092C MON_NUMWKA 00 00000910 MON_PCSAVE 00 0000090A
5307 21 robfinch
    MON_R1 00 00000920    MON_R2 00 00000924  MON_RAND 02 00FFF285 MON_RETFLAG 00 00000930
5308
 MON_RETTAB 02 00FFFA3B MON_ROM_VECS 02 00FFFA1F MON_ROM_VECTAB 02 00FFFA1D MON_SRAND 02 00FFF257
5309
 MON_SRAND1 02 00FFF25A MON_SSAVE 00 00000908 MON_USAVE 00 00000906 MON_VECTB 00 00000880
5310 16 robfinch
 MON_XSAVE 00 00000902 MON_YSAVE 00 00000904   MSCOUNT 00 FFFFFFE4 MSGBADKEYBD 02 00FFEA2E
5311 21 robfinch
 MSGCHECKSUMERR 02 00FFEF19    MSGERR 02 00FFF5F6 MSGF09STARTING 02 00FFF337 MSGREGHEADINGS 02 00FFF78D
5312
 MSGS19LOADER 02 00FFEF05 MSGSERIALTEST 02 00FFED54 MSGSTARTUP 02 00FFE11F MSGXMNOTRANSMITTER 02 00FFF0B2
5313
 MSGXMTIMEOUT 02 00FFF09E MULTI_SIEVE 02 00FFE156 MULTI_SIEVE1 02 00FFE179 MULTI_SIEVE2 02 00FFE175
5314
 MULTI_SIEVE3 02 00FFE163 MULTI_SIEVE4 02 00FFE18C       NAK 00 00000015     NHEX4 02 00FFF7C7
5315
  NMAILBOX 02 00000004 NMESERIAL 02 00FFED1D   NMIBASE 00 00FFC013  NMI_ROUT 02 00FFFC62
5316
   NMSGBLK 02 00000008 NOTKBDIRQ 02 00FFEA8C  NOTRXINT 02 00FFED1B NOTRXINT1 02 00FFED19
5317
 NOTSERINT 02 00FFED1B NOTTIMERIRQ 02 00FFE4E2 NUMBREAKPOINTS 02 00FFFA1B  NUMFUNCS 00 0000000F
5318
 NUMOSFUNCS 00 00000019 NUMSETBREAKPOINTS 00 00000811   NXBLANK 02 00FFF7CB    ONEKEY 02 00FFD1DC
5319
   OPC_SWI 00 0000003F      OSC1 02 00FFFAFB OSCALLTBL 02 00FFF1DE      OSCX 02 00FFFAFD
5320
    OSSEMA 00 00EF0010     OUTCH 02 00FFF1C9   OUTSEMA 00 00EF0000 PARSECMD1 02 00FFF407
5321
     PCRLF 02 00FFE411     PDATA 02 00FFE41E       PIC 00 FFE3F000    PICPTR 00 00000028
5322
     PRINT 02 00FFE41B      PRNG 00 FFE30600 PROCESSBREAKPOINT 02 00FFFAAE   PROMPT1 02 00FFF3EA
5323
  PROMPT2A 02 00FFF43B   PROMPT3 02 00FFF3D8 PROMPTCLEARSCREEN 02 00FFF455 PROMPTHELP 02 00FFF44D
5324
  PROMPTLN 02 00FFF3D4    PSTRNG 02 00FFE40D     QNDX0 00 00000780     QNDX1 00 00000782
5325
     QNDX2 00 00000784     QNDX3 00 00000786     QNDX4 00 00000788    RAMERR 02 00FFD42C
5326
   RAMERR1 02 00FFD445   RAMTEST 02 00FFD400  RAMTEST1 02 00FFD40D  RAMTEST3 02 00FFD417
5327
  REDIRECT 02 00FFF427 RELEASEIOFOCUS 02 00FFF227 REQUESTIOFOCUS 02 00FFF210     RIOF1 02 00FFF24E
5328
     RIOF2 02 00FFF23D  ROMTORAM 02 00FFE146 ROMTORAM1 02 00FFE14C      ROWS 00 00000020
5329
       RTC 00 FFE30500    RTCBUF 00 00007FC0  RTCR0001 02 00FFE54A  RTCW0001 02 00FFE595
5330
  RTC_READ 02 00FFE524 RTC_RXERR 02 00FFE573 RTC_WRITE 02 00FFE577  RTI_INSN 02 00FFFC6E
5331
 RUNNINGID 00 00FFC013 RUNNINGTCB 06 00000000  S19ABORT 00 0000094A S19ADDCHECK 02 00FFED99
5332
 S19ADDRESS 00 00000940 S19CHECKSUM 00 0000094B S19CLEARADDRESS 02 00FFEDD4    S19GA1 02 00FFEDF6
5333
    S19GA2 02 00FFEE18    S19GB1 02 00FFEDAF    S19GB2 02 00FFEDD0 S19GETADDRESS2 02 00FFEDE1
5334
 S19GETADDRESS3 02 00FFEDF7 S19GETBYTE 02 00FFEDA3    S19IC1 02 00FFED79    S19IC2 02 00FFED78
5335
 S19INPUTCHAR 02 00FFED67     S19L2 02 00FFEF02     S19L3 02 00FFEEAC     S19L4 02 00FFEEA1
5336
    S19LNR 02 00FFEEF5 S19LOADER 02 00FFEE8F S19NEXTRECORD 02 00FFED7F    S19NR1 02 00FFED98
5337
    S19NR2 02 00FFED8C    S19NR3 02 00FFED93    S19P11 02 00FFEE5A    S19P21 02 00FFEE6D
5338
    S19PM1 02 00FFEE43    S19PM2 02 00FFEE37    S19PM3 02 00FFEE1A S19PROCESSS1 02 00FFEE49
5339
 S19PROCESSS2 02 00FFEE5C S19PROCESSS8 02 00FFEE7F S19PROCESSS9 02 00FFEE6F S19PUTMEM 02 00FFEE19
5340
 S19RECLEN 00 00000949 S19RECTYPE 00 00000948 S19SOURCE 00 0000094E S19STARTADDRESS 00 00000944
5341
 S19SUMMARYCHECKSUM 00 0000094C S19XFERADDRESS 00 00000950 SCANNEXTWORD 02 00FFF411 SCREENCOLOR 00 00000113
5342
 SCREENDISPLAYCHAR 02 00FFE31F SCREENLOCATION 00 00000010 SCREENLOCATION2 00 00000018  SCROLLUP 02 00FFE268
5343
    SCRUP1 02 00FFE275    SC_ALT 00 00000011      SC_C 00 00000021 SC_CAPSLOCK 00 00000058
5344
   SC_CTRL 00 00000014    SC_DEL 00 00000071 SC_EXTEND 00 000000E0    SC_F12 00 00000007
5345
  SC_KEYUP 00 000000F0 SC_NUMLOCK 00 00000077 SC_RSHIFT 00 00000059 SC_SCROLLLOCK 00 0000007E
5346
      SC_T 00 0000002C    SC_TAB 00 0000000D      SC_Z 00 0000001A   SEMAABS 00 00001000
5347
 SERHEADRCV 00 00FFC015 SERHEADXMIT 00 00FFC017  SERHZERO 00 00000130 SERIALGETCHAR 02 00FFEC23
5348
 SERIALINIT 02 00FFEBEF SERIALIRQ 02 00FFECCC SERIALOUTPUTTEST 02 00FFED34 SERIALPEEKCHAR 02 00FFEC55
5349
 SERIALPEEKCHARDIRECT 02 00FFEC73 SERIALPUTCHAR 02 00FFEC9A SERIALPUTSTRING 02 00FFED24 SERIALRCVCOUNT 02 00FFECBD
5350
 SERRCVBUF 00 00FFB000 SERRCVXOFF 00 00FFC01A SERRCVXON 00 00FFC019 SERTAILRCV 00 00FFC016
5351
 SERTAILXMIT 00 00FFC018  SERTZERO 00 00000132 SETKEYBOARDECHO 02 00FFF1CD   SETREGA 02 00FFF8E4
5352
   SETREGB 02 00FFF8F3 SETREGCCR 02 00FFF95C   SETREGD 02 00FFF902 SETREGDPR 02 00FFF94D
5353
  SETREGPC 02 00FFF96B   SETREGS 02 00FFF93E   SETREGU 02 00FFF92F   SETREGX 02 00FFF911
5354
   SETREGY 02 00FFF920      SGC2 02 00FFEC3D SGCNOCHARS 02 00FFEC50    SGCXIT 02 00FFEC53
5355
 SHIFTEDSCANCODES 02 00FFE700 SHIFTLEFT5 02 00FFE1CA SHL_NUMWKA 02 00FFF4EE SHOWSPRITES 02 00FFF1D3
5356
     SIEVE 02 00FFE190    SIEVE1 02 00FFE1A8    SIEVE2 02 00FFE1A4    SIEVE3 02 00FFE195
5357
    SIEVE4 02 00FFE1B7     SINI1 02 00FFEC08 SIRQNXTBYTE 02 00FFECD9 SIRQRXFULL 02 00FFED1B
5358
 SKIPDOLLAR 02 00FFF3F9 SKIP_INIT 02 00FFE10D       SOH 00 00000001    SOTST1 02 00FFED3E
5359
   SPC0001 02 00FFECA0  SPCD0001 02 00FFEC95 SPCNOCHARS 02 00FFEC6E    SPCXIT 02 00FFEC71
5360
 SPRITE_CTRL 00 FFE10000 SPRITE_EN 00 000003C0      SPS2 02 00FFED28    SPSXIT 02 00FFED32
5361
    SRCXIT 02 00FFECCB       ST1 02 00FFE0B8      ST10 02 00FFE11B      ST11 02 00FFE060
5362 16 robfinch
       ST3 02 00FFE09F       ST6 02 00FFE03C       ST7 02 00FFE046       ST8 02 00FFE046
5363 21 robfinch
       ST9 02 00FFE069     START 02 00FFE023    STRPTR 00 00000024 SWI3_EXIT 02 00FFFC33
5364
 SWI3_ROUT 02 00FFFBFB SWICALLOS 02 00FFFAE8 SWINOTBKPT 02 00FFFA66  SWI_ROUT 02 00FFFA49
5365
 SWI_ROUT1 02 00FFFA4E SWI_ROUT2 02 00FFFA5F SWI_ROUT3 02 00FFFA9C SWI_ROUT4 02 00FFFAAD
5366 16 robfinch
       TAB 00 00000009 TCB_CURSORCOL 00 00000021 TCB_CURSORROW 00 00000020  TCB_HJCB 00 0000001C
5367
 TCB_HWAITMBX 00 00000022 TCB_IOF_NEXT 00 0000002C TCB_IOF_PREV 00 00000030 TCB_MBQ_NEXT 00 00000024
5368
 TCB_MBQ_PREV 00 00000028 TCB_MMU_MAP 00 00000038 TCB_MSGPTR_D1 00 00000014 TCB_MSGPTR_D2 00 00000018
5369
 TCB_NXTRDY 00 00000000 TCB_NXTTCB 00 00000008 TCB_PRIORITY 00 00000010 TCB_PRVRDY 00 00000004
5370 21 robfinch
 TCB_SPSAVE 00 00000034 TCB_STATUS 00 0000001E TCB_TIMEOUT 00 0000000C TEXTCLOSE 02 00FFE238
5371
  TEXTOPEN 02 00FFE237  TEXTREAD 02 00FFE239   TEXTREG 00 FFE07F00   TEXTSCR 00 FFE00000
5372
  TEXTSEEK 02 00FFE23B TEXTWRITE 02 00FFE23A TEXT_COLS 00 00000000 TEXT_CURPOS 00 00000022
5373
 TEXT_ROWS 00 00000001 TIMEOUTLIST 00 0000078C TIMERINIT 02 00FFE468  TIMERIRQ 02 00FFE493
5374
   TIMES10 02 00FFF483      TR1A 02 00FFFC61      UCP1 02 00FFE2F3 UNSHIFTEDSCANCODES 02 00FFE600
5375
 UPDATECURSORPOS 02 00FFE2CF       VIA 00 FFE60000   VIA_ACR 00 0000000B  VIA_DDRA 00 00000003
5376 16 robfinch
   VIA_IER 00 0000000E   VIA_IFR 00 0000000D    VIA_PA 00 00000001 VIA_T3CMPH 00 00000015
5377
 VIA_T3CMPL 00 00000014  VIA_T3LH 00 00000013  VIA_T3LL 00 00000012  W10_0001 02 00FFE940
5378
 W300_0001 02 00FFE954  WAIT10MS 02 00FFE939 WAIT300MS 02 00FFE94D    XBLANK 02 00FFD0AF
5379 21 robfinch
 XITMONITOR 02 00FFFAE6 XM_CALC_CHECKSUM 02 00FFF0D7 XM_CALC_CRC 02 00FFF0E9 XM_CHECKSUM 00 000009F7
5380
    XM_CRC 00 000009FE   XM_CRC1 02 00FFF0F4   XM_CRC2 02 00FFF150   XM_CRC3 02 00FFF158
5381
   XM_CRC4 02 00FFF13B    XM_CS1 02 00FFF0DB    XM_EOT 02 00FFF07E   XM_FLAG 00 000009F6
5382
    XM_GB1 02 00FFEFA9    XM_GB2 02 00FFEFB7 XM_GETBYTE 02 00FFEFA9   XM_IBUF 00 00000A00
5383
 XM_NOTRANSMITTER 02 00FFF096   XM_OBUF 00 00000A80 XM_OUTBYTEASHEX 02 00FFF170 XM_PACKETNUM 00 000009FA
5384
 XM_PROTOCOL 00 000009F5   XM_RCV1 02 00FFEFDF   XM_RCV2 02 00FFF015   XM_RCV3 02 00FFF05A
5385
   XM_RCV4 02 00FFEFDC   XM_RCV5 02 00FFEFD7 XM_RCV_CHKSUM 02 00FFF052 XM_RCV_NAK 02 00FFEFF4
5386
 XM_RCV_TO1 02 00FFF076 XM_RCV_TO2 02 00FFF074 XM_RECEIVE 02 00FFEFD5 XM_RECEIVESTART 02 00FFEFBA
5387
 XM_RETRY1 02 00FFF085   XM_SEND 02 00FFEF39  XM_SEND1 02 00FFEF58  XM_SEND2 02 00FFEF86
5388
  XM_SEND3 02 00FFEF8D  XM_SEND4 02 00FFEF49  XM_SEND5 02 00FFEF46 XM_SENDSTART 02 00FFEF2C
5389
    XM_SOH 02 00FFEFFA  XM_TIMER 00 00FFC020    XM_TMP 00 000009FC   XM_TMP2 00 000009F8
5390
      XOFF 00 00000013       XON 00 00000011
5391
658 SYMBOLS
5392 4 robfinch
 
5393 21 robfinch
3 error(s), 1006 warning(s)

powered by: WebSVN 2.1.0

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