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

Subversion Repositories raptor64

[/] [raptor64/] [trunk/] [software/] [sample code/] [bootrom.lst] - Blame information for rev 43

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

Line No. Rev Author Line
1 27 robfinch
                                                ; ============================================================================
2 43 robfinch
                                                 ; (C) 2012,2013 Robert Finch, Stratford
3 27 robfinch
                                                 ; All Rights Reserved.
4
                                                 ; robfinch@opencores.org
5
                                                 ;
6
                                                 ; This source file is free software: you can redistribute it and/or modify
7
                                                 ; it under the terms of the GNU Lesser General Public License as published
8
                                                 ; by the Free Software Foundation, either version 3 of the License, or
9
                                                 ; (at your option) any later version.
10
                                                 ;
11
                                                 ; This source file is distributed in the hope that it will be useful,
12
                                                 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
13
                                                 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
                                                 ; GNU General Public License for more details.
15
                                                 ;
16
                                                 ; You should have received a copy of the GNU General Public License
17
                                                 ; along with this program.  If not, see .
18
                                                 ;
19
                                                 ; ============================================================================
20
                                                 ;
21
                                                 CR     EQU     0x0D            ;ASCII equates
22
                                                 LF     EQU     0x0A
23
                                                 TAB    EQU     0x09
24
                                                 CTRLC  EQU     0x03
25
                                                 CTRLH  EQU     0x08
26
                                                 CTRLS  EQU     0x13
27
                                                 CTRLX  EQU     0x18
28 43 robfinch
                                                 XON            EQU     0x11
29
                                                 XOFF   EQU     0x13
30 27 robfinch
 
31 43 robfinch
                                                 DATA_PRESENT   EQU     0x01            ; there is data preset at the serial port bc_uart3
32
                                                 XMIT_NOT_FULL  EQU     0x20
33
 
34
                                                 BUFLEN EQU     80      ;       length of keyboard input buffer
35
 
36
                                                 ; Initial stack tops for contexts
37
                                                 ; Each context gets 1k from the special 16k startup stack memory
38
                                                 ;
39
                                                 STACKTOP0      EQU             0xFFFF_FFFF_FFFE_FFF8
40
                                                 STACKTOP1      EQU             0xFFFF_FFFF_FFFE_FBF8
41
                                                 STACKTOP2      EQU             0xFFFF_FFFF_FFFE_F7F8
42
                                                 STACKTOP3      EQU             0xFFFF_FFFF_FFFE_F3F8
43
                                                 STACKTOP4      EQU             0xFFFF_FFFF_FFFE_EFF8
44
                                                 STACKTOP5      EQU             0xFFFF_FFFF_FFFE_EBF8
45
                                                 STACKTOP6      EQU             0xFFFF_FFFF_FFFE_E7F8
46
                                                 STACKTOP7      EQU             0xFFFF_FFFF_FFFE_E3F8
47
                                                 STACKTOP8      EQU             0xFFFF_FFFF_FFFE_DFF8
48
                                                 STACKTOP9      EQU             0xFFFF_FFFF_FFFE_DBF8
49
                                                 STACKTOP10     EQU             0xFFFF_FFFF_FFFE_D7F8
50
                                                 STACKTOP11     EQU             0xFFFF_FFFF_FFFE_D3F8
51
                                                 STACKTOP12     EQU             0xFFFF_FFFF_FFFE_CFF8
52
                                                 STACKTOP13     EQU             0xFFFF_FFFF_FFFE_CBF8
53
                                                 STACKTOP14     EQU             0xFFFF_FFFF_FFFE_C7F8
54
                                                 STACKTOP15     EQU             0xFFFF_FFFF_FFFE_C3F8
55
 
56
 
57
                                                 ; BOOT ROM routines
58
 
59
                                                 TCBSize                EQU             0x200                   ; 512 bytes per TCB
60
                                                 TCBBase                EQU             0x00000001_00000000                     ; TCB pages
61
                                                 TCBr1          EQU             0x00
62
                                                 TCBr2          EQU             0x08
63
                                                 TCBr3          EQU             0x10
64
                                                 TCBr4          EQU             0x18
65
                                                 TCBr5          EQU             0x20
66
                                                 TCBr6          EQU             0x28
67
                                                 TCBr7          EQU             0x30
68
                                                 TCBr8          EQU             0x38
69
                                                 TCBr9          EQU             0x40
70
                                                 TCBr10         EQU             0x48
71
                                                 TCBr11         EQU             0x50
72
                                                 TCBr12         EQU             0x58
73
                                                 TCBr13         EQU             0x60
74
                                                 TCBr14         EQU             0x68
75
                                                 TCBr15         EQU             0x70
76
                                                 TCBr16         EQU             0x78
77
                                                 TCBr17         EQU             0x80
78
                                                 TCBr18         EQU             0x88
79
                                                 TCBr19         EQU             0x90
80
                                                 TCBr20         EQU             0x98
81
                                                 TCBr21         EQU             0xA0
82
                                                 TCBr22         EQU             0xA8
83
                                                 TCBr23         EQU             0xB0
84
                                                 TCBr24         EQU             0xB8
85
                                                 TCBr25         EQU             0xC0
86
                                                 TCBr26         EQU             0xC8
87
                                                 TCBr27         EQU             0xD0
88
                                                 TCBr28         EQU             0xD8
89
                                                 TCBr29         EQU             0xE0
90
                                                 TCBr30         EQU             0xE8
91
                                                 TCBr31         EQU             0xF0
92
 
93
                                                 warmStart   EQU     0x1020
94
                                                 usrJmp      EQU     0x1028
95
                                                 TickIRQAddr            EQU             0x1030
96
                                                 TaskBlock              EQU             0x1038
97
                                                 tencount               EQU             0x13F8
98
                                                 Milliseconds   EQU             0x1400
99
                                                 Lastloc                        EQU             0x1408
100
                                                 ScreenColor    EQU             0x1414
101
                                                 CursorRow      EQU             0x1416
102
                                                 CursorCol      EQU             0x1418
103
                                                 CursorFlash    EQU             0x141A
104
                                                 KeybdEcho      EQU             0x141C
105
                                                 KeybdBuffer    EQU             0x1440
106
                                                 KeybdHead      EQU             0x1450
107
                                                 KeybdTail      EQU             0x1451
108
                                                 Score          EQU             0x1500
109
                                                 Manpos         EQU             0x1508
110
                                                 MissileActive  EQU             0x1510
111
                                                 MissileX       EQU             0x1512
112
                                                 MissileY       EQU             0x1514
113
                                                 InvadersRow1   EQU             0x1520
114
                                                 InvadersRow2   EQU             0x1530
115
                                                 InvadersRow3   EQU             0x1540
116
                                                 InvadersRow4   EQU             0x1550
117
                                                 InvadersRow5   EQU             0x1560
118
                                                 InvadersColpos EQU             0x1570
119
                                                 InvadersRowpos EQU             0x1571
120
                                                 Uart_rxfifo            EQU             0x1600
121
                                                 Uart_rxhead            EQU             0x1800
122
                                                 Uart_rxtail            EQU             0x1802
123
                                                 Uart_ms                        EQU             0x1808
124
                                                 Uart_rxrts             EQU             0x1809
125
                                                 Uart_rxdtr             EQU             0x180A
126
                                                 Uart_rxxon             EQU             0x180B
127
                                                 Uart_rxflow            EQU             0x180C
128
                                                 Uart_fon               EQU             0x180E
129
                                                 Uart_foff              EQU             0x1810
130
                                                 Uart_txrts             EQU             0x1812
131
                                                 Uart_txdtr             EQU             0x1813
132
                                                 Uart_txxon             EQU             0x1814
133
                                                 Uart_txxonoff  EQU             0x1815
134
                                                 TaskList               EQU             0x2000
135
                                                 ReadyList1             EQU             0x2000
136
                                                 ReadyList2             EQU             0x2020
137
                                                 ReadyList3             EQU             0x2040
138
                                                 ReadyList4             EQU             0x2060
139
                                                 ReadyList5             EQU             0x2080
140
                                                 ReadyNdx1              EQU             0x20A0
141
                                                 ReadyNdx2              EQU             0x20A1
142
                                                 ReadyNdx3              EQU             0x20A2
143
                                                 ReadyNdx4              EQU             0x20A3
144
                                                 ReadyNdx5              EQU             0x20A4
145
                                                 RunningTCB             EQU             0x20A6
146
                                                 NextToRunTCB   EQU             0x20A8
147
                                                 r1save                 EQU             0x20B0
148
                                                 r2save                 EQU             0x20B8
149
                                                 AXCstart               EQU             0x20C0
150
 
151
                                                 p100IRQvec             EQU             0x3000
152
                                                 keybdIRQvec            EQU             0x3008
153
                                                 serialIRQvec   EQU             0x3010
154
                                                 rasterIRQvec   EQU             0x3018
155
 
156
                                                 TEXTSCR                EQU             0xD0_0000
157
                                                 COLORSCR       EQU             0xD1_0000
158
                                                 TEXTREG                EQU             0xDA_0000
159 27 robfinch
                                                 TEXT_COLS      EQU             0x0
160
                                                 TEXT_ROWS      EQU             0x2
161
                                                 TEXT_CURPOS    EQU             0x16
162 43 robfinch
                                                 KEYBD          EQU             0xDC_0000
163
                                                 KEYBDCLR       EQU             0xDC_0002
164
 
165
                                                 UART           EQU             0xDC_0A00
166
                                                 UART_LS                EQU             0xDC_0A01
167
                                                 UART_MS                EQU             0xDC_0A02
168
                                                 UART_IS                EQU             0xDC_0A03
169
                                                 UART_IE                EQU             0xDC_0A04
170
                                                 UART_MC                EQU             0xDC_0A06
171
                                                 DATETIME       EQU             0xDC_0400
172
                                                 PIC                    EQU             0xDC_0FF0
173
                                                 PIC_IE         EQU             0xDC_0FF2
174
 
175
                                                 PSG                    EQU             0xD5_0000
176
                                                 PSGFREQ0       EQU             0xD5_0000
177
                                                 PSGPW0         EQU             0xD5_0002
178
                                                 PSGCTRL0       EQU             0xD5_0004
179
                                                 PSGADSR0       EQU             0xD5_0006
180
 
181
                                                 SPRRAM         EQU             0xD8_0000
182
                                                 AC97           EQU             0xDC_1000
183
                                                 LED                    EQU             0xDC_0600
184
                                                 GACCEL         EQU             0xDA_E000
185
                                                 RASTERIRQ      EQU             0xDA_0100
186 27 robfinch
                                                 BOOT_STACK     EQU             0xFFFF_FFFF_FFFE_FFF8
187 43 robfinch
                                                 SPRITEREGS     EQU             0xDA_D000
188 27 robfinch
                                                 BITMAPSCR      EQU             0x00000001_00200000
189
 
190
                                                 txempty        EQU             0x40
191
                                                 rxfull EQU             0x01
192
 
193 43 robfinch
                                                 ;
194
                                                 ; Internal variables follow:
195
                                                 ;
196
0000000100600000                                                bss
197
0000000000001038                                                org             0x1038
198
0000000000000000                                 pos            dh              0                ; text screen position
199
0000000000001040                                                org             0x1040
200
 
201
1040 0000000000000000    lineLinkTbl            fill.b  25,0    ; screen line link table
202
1048 0000000000000000
203
1050 0000000000000000
204
1058 0000000000000000
205
0000000000001068                                                align 8
206
 
207
0000000000001080                                                org             0x1080
208
0000000000001088                                         align   8
209
0000000000001088 0000000000000001        OSSP   dw      1       ; OS value of sp
210
0000000000001090 0000000000000001        CURRNT dw      1       ;       Current line pointer
211
0000000000001098 0000000000000001        STKGOS dw      1       ;       Saves stack pointer in 'GOSUB'
212
00000000000010A0 0000000000000001        STKINP dw      1       ;       Saves stack pointer during 'INPUT'
213
00000000000010A8 0000000000000001        LOPVAR dw      1       ;       'FOR' loop save area
214
00000000000010B0 0000000000000001        LOPINC dw      1       ;       increment
215
00000000000010B8 0000000000000001        LOPLMT dw      1       ;       limit
216
00000000000010C0 0000000000000001        LOPLN  dw      1       ;       line number
217
00000000000010C8 0000000000000001        LOPPT  dw      1       ;       text pointer
218
00000000000010D0 0000000000000001        TXTUNF dw      1       ;       points to unfilled text area
219
00000000000010D8 0000000000000001        VARBGN dw      1       ;       points to variable area
220
00000000000010E0 0000000000000001        IVARBGN dw  1   ;   points to integer variable area
221
00000000000010E8 0000000000000001        SVARBGN dw  1   ;   points to string variable area
222
00000000000010F0 0000000000000001        FVARBGN dw  1   ;   points to float variable area
223
00000000000010F8 0000000000000001        STKBOT dw      1       ;       holds lower limit for stack growth
224
1100 0000000000000000    NUMWKA fill.b  24,0                    ; numeric work area
225
1108 0000000000000000
226
1110 0000000000000000
227
1118 0000000000000000    BUFFER fill.b  BUFLEN,0x00             ;               Keyboard input buffer
228
1120 0000000000000000
229
1128 0000000000000000
230
1130 0000000000000000
231
1138 0000000000000000
232
1140 0000000000000000
233
1148 0000000000000000
234
1150 0000000000000000
235
1158 0000000000000000
236
1160 0000000000000000
237
 
238
000000000000116E                                         bss
239
0000000100600000                                         org     0x1_00600000
240
                                                 TXT            equ             0x1_00600000    ; Beginning of program area
241
 
242 27 robfinch
                                                 ;      org 0x070
243
                                                 ;      iret
244
                                                 ;      nop
245
                                                 ;      nop
246
                                                 ;      nop
247
                                                 ;      nop
248
                                                 ;      nop
249
                                                 ;      nop
250
                                                 ;      nop
251
                                                 ;
252 43 robfinch
0000000000000000                                        code
253
FFFFFFFFFFFFB000                                        org 0xFFFF_FFFF_FFFF_B000
254 27 robfinch
 
255
                                                 ; jump table
256
                                                 ;
257 43 robfinch
FFFFFFFFFFFFB000        33FFED54                        jmp             SerialGetChar
258
FFFFFFFFFFFFB004        33FFED0C                        jmp             SerialPutChar
259
FFFFFFFFFFFFB008        33FFEE06                        jmp             SetKeyboardEcho
260
FFFFFFFFFFFFB00C        33FFEE1D                        jmp             KeybdCheckForKey
261
FFFFFFFFFFFFB010        33FFEE08                        jmp             KeybdGetChar
262
FFFFFFFFFFFFB014        33FFEF47                        jmp             DisplayChar
263
FFFFFFFFFFFFB018        33FFEFE7                        jmp             DisplayString
264 27 robfinch
 
265 43 robfinch
FFFFFFFFFFFFB01C                                 start:
266 27 robfinch
                                                 ;      lea             MSGRAM,a1
267
                                                 ;      jsr             DisplayString
268
 
269 43 robfinch
FFFFFFFFFFFFB01C                                 ColdStart:
270
FFFFFFFFFFFFB01C        0000000A                        icache_on                               ; turn on the ICache
271
FFFFFFFFFFFFB020        0000000D                        dcache_off                              ; turn on the DCache
272 27 robfinch
 
273 43 robfinch
                                                 ; Initialize the context schedule with all contexts treated equally
274
                                                 ; There are only 16 contexts, but 256 schedule slots. Each context is
275
                                                 ; given 16 slots distributed evenly throughout the execution pattern
276
                                                 ; table.
277 27 robfinch
                                                 ;
278 43 robfinch
FFFFFFFFFFFFB024        0410840A                        xor             r1,r1,r1        ; r1 = 0
279
FFFFFFFFFFFFB028                                 ict1:
280
FFFFFFFFFFFFB028        0410803A                        mtep    r1,r1           ; only the low order four bits of r1 will move to the pattern table
281
FFFFFFFFFFFFB02C        0A108001                        addui   r1,r1,#1
282
FFFFFFFFFFFFB030        101100FF                        cmpi    r2,r1,#255
283
FFFFFFFFFFFFB034        BE207FA9                        bne             r2,r0,ict1
284 27 robfinch
 
285 43 robfinch
                                                 ; Point the interrupt return address register of the context to the
286
                                                 ; context startup code. The context will start up when an interrupt return
287
                                                 ; occurs.
288
                                                 ;
289
                                                 ; We cannot use a loop for this. Fortunately there's only 16 contexts.
290
                                                 ;
291
FFFFFFFFFFFFB038        E6BFB214                ; SETLO
292
FFFFFFFFFFFFB03C        6A0D642D                        lea             r25,ctxstart
293
FFFFFFFFFFFFB040        E6BEFFF8                ; SETLO
294
FFFFFFFFFFFFB044        6A0D782D                        lea             r30,STACKTOP0
295
FFFFFFFFFFFFB048        0000000F                        iepp
296
FFFFFFFFFFFFB04C        DE000000                        nop
297
FFFFFFFFFFFFB050        DE000000                        nop
298
FFFFFFFFFFFFB054        E6BFB214                ; SETLO
299
FFFFFFFFFFFFB058        6A0D642D                        lea             r25,ctxstart
300
FFFFFFFFFFFFB05C        E6BEFBF8                ; SETLO
301
FFFFFFFFFFFFB060        6A0D782D                        lea             r30,STACKTOP1
302
FFFFFFFFFFFFB064        0000000F                        iepp
303
FFFFFFFFFFFFB068        DE000000                        nop
304
FFFFFFFFFFFFB06C        DE000000                        nop
305
FFFFFFFFFFFFB070        E6BFB214                ; SETLO
306
FFFFFFFFFFFFB074        6A0D642D                        lea             r25,ctxstart
307
FFFFFFFFFFFFB078        E6BEF7F8                ; SETLO
308
FFFFFFFFFFFFB07C        6A0D782D                        lea             r30,STACKTOP2
309
FFFFFFFFFFFFB080        0000000F                        iepp
310
FFFFFFFFFFFFB084        DE000000                        nop
311
FFFFFFFFFFFFB088        DE000000                        nop
312
FFFFFFFFFFFFB08C        E6BFB214                ; SETLO
313
FFFFFFFFFFFFB090        6A0D642D                        lea             r25,ctxstart
314
FFFFFFFFFFFFB094        E6BEF3F8                ; SETLO
315
FFFFFFFFFFFFB098        6A0D782D                        lea             r30,STACKTOP3
316
FFFFFFFFFFFFB09C        0000000F                        iepp
317
FFFFFFFFFFFFB0A0        DE000000                        nop
318
FFFFFFFFFFFFB0A4        DE000000                        nop
319
 
320
FFFFFFFFFFFFB0A8        E6BFB214                ; SETLO
321
FFFFFFFFFFFFB0AC        6A0D642D                        lea             r25,ctxstart
322
FFFFFFFFFFFFB0B0        E6BEEFF8                ; SETLO
323
FFFFFFFFFFFFB0B4        6A0D782D                        lea             r30,STACKTOP4
324
FFFFFFFFFFFFB0B8        0000000F                        iepp
325
FFFFFFFFFFFFB0BC        DE000000                        nop
326
FFFFFFFFFFFFB0C0        DE000000                        nop
327
FFFFFFFFFFFFB0C4        E6BFB214                ; SETLO
328
FFFFFFFFFFFFB0C8        6A0D642D                        lea             r25,ctxstart
329
FFFFFFFFFFFFB0CC        E6BEEBF8                ; SETLO
330
FFFFFFFFFFFFB0D0        6A0D782D                        lea             r30,STACKTOP5
331
FFFFFFFFFFFFB0D4        0000000F                        iepp
332
FFFFFFFFFFFFB0D8        DE000000                        nop
333
FFFFFFFFFFFFB0DC        DE000000                        nop
334
FFFFFFFFFFFFB0E0        E6BFB214                ; SETLO
335
FFFFFFFFFFFFB0E4        6A0D642D                        lea             r25,ctxstart
336
FFFFFFFFFFFFB0E8        E6BEE7F8                ; SETLO
337
FFFFFFFFFFFFB0EC        6A0D782D                        lea             r30,STACKTOP6
338
FFFFFFFFFFFFB0F0        0000000F                        iepp
339
FFFFFFFFFFFFB0F4        DE000000                        nop
340
FFFFFFFFFFFFB0F8        DE000000                        nop
341
FFFFFFFFFFFFB0FC        E6BFB214                ; SETLO
342
FFFFFFFFFFFFB100        6A0D642D                        lea             r25,ctxstart
343
FFFFFFFFFFFFB104        E6BEE3F8                ; SETLO
344
FFFFFFFFFFFFB108        6A0D782D                        lea             r30,STACKTOP7
345
FFFFFFFFFFFFB10C        0000000F                        iepp
346
FFFFFFFFFFFFB110        DE000000                        nop
347
FFFFFFFFFFFFB114        DE000000                        nop
348
 
349
FFFFFFFFFFFFB118        E6BFB214                ; SETLO
350
FFFFFFFFFFFFB11C        6A0D642D                        lea             r25,ctxstart
351
FFFFFFFFFFFFB120        E6BEDFF8                ; SETLO
352
FFFFFFFFFFFFB124        6A0D782D                        lea             r30,STACKTOP8
353
FFFFFFFFFFFFB128        0000000F                        iepp
354
FFFFFFFFFFFFB12C        DE000000                        nop
355
FFFFFFFFFFFFB130        DE000000                        nop
356
FFFFFFFFFFFFB134        E6BFB214                ; SETLO
357
FFFFFFFFFFFFB138        6A0D642D                        lea             r25,ctxstart
358
FFFFFFFFFFFFB13C        E6BEDBF8                ; SETLO
359
FFFFFFFFFFFFB140        6A0D782D                        lea             r30,STACKTOP9
360
FFFFFFFFFFFFB144        0000000F                        iepp
361
FFFFFFFFFFFFB148        DE000000                        nop
362
FFFFFFFFFFFFB14C        DE000000                        nop
363
FFFFFFFFFFFFB150        E6BFB214                ; SETLO
364
FFFFFFFFFFFFB154        6A0D642D                        lea             r25,ctxstart
365
FFFFFFFFFFFFB158        E6BED7F8                ; SETLO
366
FFFFFFFFFFFFB15C        6A0D782D                        lea             r30,STACKTOP10
367
FFFFFFFFFFFFB160        0000000F                        iepp
368
FFFFFFFFFFFFB164        DE000000                        nop
369
FFFFFFFFFFFFB168        DE000000                        nop
370
FFFFFFFFFFFFB16C        E6BFB214                ; SETLO
371
FFFFFFFFFFFFB170        6A0D642D                        lea             r25,ctxstart
372
FFFFFFFFFFFFB174        E6BED3F8                ; SETLO
373
FFFFFFFFFFFFB178        6A0D782D                        lea             r30,STACKTOP11
374
FFFFFFFFFFFFB17C        0000000F                        iepp
375
FFFFFFFFFFFFB180        DE000000                        nop
376
FFFFFFFFFFFFB184        DE000000                        nop
377
 
378
FFFFFFFFFFFFB188        E6BFB214                ; SETLO
379
FFFFFFFFFFFFB18C        6A0D642D                        lea             r25,ctxstart
380
FFFFFFFFFFFFB190        E6BECFF8                ; SETLO
381
FFFFFFFFFFFFB194        6A0D782D                        lea             r30,STACKTOP12
382
FFFFFFFFFFFFB198        0000000F                        iepp
383
FFFFFFFFFFFFB19C        DE000000                        nop
384
FFFFFFFFFFFFB1A0        DE000000                        nop
385
FFFFFFFFFFFFB1A4        E6BFB214                ; SETLO
386
FFFFFFFFFFFFB1A8        6A0D642D                        lea             r25,ctxstart
387
FFFFFFFFFFFFB1AC        E6BECBF8                ; SETLO
388
FFFFFFFFFFFFB1B0        6A0D782D                        lea             r30,STACKTOP13
389
FFFFFFFFFFFFB1B4        0000000F                        iepp
390
FFFFFFFFFFFFB1B8        DE000000                        nop
391
FFFFFFFFFFFFB1BC        DE000000                        nop
392
FFFFFFFFFFFFB1C0        E6BFB214                ; SETLO
393
FFFFFFFFFFFFB1C4        6A0D642D                        lea             r25,ctxstart
394
FFFFFFFFFFFFB1C8        E6BEC7F8                ; SETLO
395
FFFFFFFFFFFFB1CC        6A0D782D                        lea             r30,STACKTOP14
396
FFFFFFFFFFFFB1D0        0000000F                        iepp
397
FFFFFFFFFFFFB1D4        DE000000                        nop
398
FFFFFFFFFFFFB1D8        DE000000                        nop
399
FFFFFFFFFFFFB1DC        E6BFB214                ; SETLO
400
FFFFFFFFFFFFB1E0        6A0D642D                        lea             r25,ctxstart
401
FFFFFFFFFFFFB1E4        E6BEC3F8                ; SETLO
402
FFFFFFFFFFFFB1E8        6A0D782D                        lea             r30,STACKTOP15
403
FFFFFFFFFFFFB1EC        0000000F                        iepp
404
FFFFFFFFFFFFB1F0        DE000000                        nop
405
FFFFFFFFFFFFB1F4        DE000000                        nop
406
 
407
                                                 ; Ensure that context zero is the active context
408
                                                 ;
409
FFFFFFFFFFFFB1F8                                 ctxstart3:
410
FFFFFFFFFFFFB1F8        02008568                        mfspr   r1,AXC
411
FFFFFFFFFFFFB1FC        BE1000A8                        beq             r1,r0,ctxstart2
412
FFFFFFFFFFFFB200        0000000F                        iepp
413
FFFFFFFFFFFFB204        DE000000                        nop
414
FFFFFFFFFFFFB208        DE000000                        nop
415
FFFFFFFFFFFFB20C        BE007F6A                        bra             ctxstart3
416
FFFFFFFFFFFFB210                                 ctxstart2:
417
FFFFFFFFFFFFB210        6000A0C0                        sb              r1,AXCstart             ; save off the startup context which should be context zero
418
 
419
                                                 ; Entry point for context startup
420
                                                 ;
421
                                                 ; Avoid repeating all the system initialization when a context starts up by testing whether
422
                                                 ; or not the context is the starting context.
423
                                                 ;
424
FFFFFFFFFFFFB214                                 ctxstart:
425
FFFFFFFFFFFFB214        02008568                        mfspr   r1,AXC
426
FFFFFFFFFFFFB218        4A0120C0                        lbu             r2,AXCstart
427
FFFFFFFFFFFFB21C        BE1107E9                        bne             r1,r2,ctxstart1
428
 
429
                                                 ;
430
                                                 ; set system vectors
431
                                                 ; TBA defaults to zero on reset
432
                                                 ;
433
FFFFFFFFFFFFB220        E0C00000                        setlo   r3,#0
434
FFFFFFFFFFFFB224        E08001FF                        setlo   r2,#511
435
FFFFFFFFFFFFB228        9A00EA20                        lea             r1,nmirout
436
FFFFFFFFFFFFB22C                                 csj5:
437
FFFFFFFFFFFFB22C        66308000                        sw              r1,[r3]
438
FFFFFFFFFFFFB230        0A318008                        addui   r3,r3,#8
439
FFFFFFFFFFFFB234        BE017FCF                        loop    r2,csj5
440
FFFFFFFFFFFFB238        E6BFB768                ; SETLO
441
FFFFFFFFFFFFB23C        6A0D042D                        lea             r1,KeybdSC              ; keyboard BIOS vector
442
FFFFFFFFFFFFB240        66008D08                        sw              r1,0xD08
443
FFFFFFFFFFFFB244        9A00E950                        lea             r1,irqrout
444
FFFFFFFFFFFFB248        66008E08                        sw              r1,0xE08                ; set IRQ vector
445
FFFFFFFFFFFFB24C        9A00E8BC                        lea             r1,dberr_rout
446
FFFFFFFFFFFFB250        66008FE0                        sw              r1,0xFE0                ; set Bus error vector
447
FFFFFFFFFFFFB254        9A00E8A4                        lea             r1,iberr_rout
448
FFFFFFFFFFFFB258        66008FE8                        sw              r1,0xFE8                ; set Bus error vector
449
FFFFFFFFFFFFB25C        9A00EA20                        lea             r1,nmirout
450
FFFFFFFFFFFFB260        66008FF0                        sw              r1,0xFF0                ; set NMI vector
451
 
452
FFFFFFFFFFFFB264        E6BFB7C4                ; SETLO
453
FFFFFFFFFFFFB268        6A0D042D                        lea             r1,KeybdIRQ
454
FFFFFFFFFFFFB26C        6600B008                        sw              r1,keybdIRQvec
455
FFFFFFFFFFFFB270        E6BFB8EC                ; SETLO
456
FFFFFFFFFFFFB274        6A0D042D                        lea             r1,Pulse100
457
FFFFFFFFFFFFB278        6600B000                        sw              r1,p100IRQvec
458
FFFFFFFFFFFFB27C        E6BFB628                ; SETLO
459
FFFFFFFFFFFFB280        6A0D042D                        lea             r1,SerialIRQ
460
FFFFFFFFFFFFB284        6600B010                        sw              r1,serialIRQvec
461
FFFFFFFFFFFFB288        9A00CAC4                        lea             r1,RasterIRQfn
462
FFFFFFFFFFFFB28C        6600B018                        sw              r1,rasterIRQvec
463
 
464
                                                        ;-------------------------------
465
                                                        ; Initialize I/O devices
466
                                                        ;-------------------------------
467
FFFFFFFFFFFFB290        31FFECEC                        call    SerialInit
468
FFFFFFFFFFFFB294        31FFEDEC                        call    KeybdInit
469
FFFFFFFFFFFFB298        31FFECE4                        call    PICInit
470
FFFFFFFFFFFFB29C        31FFF299                        call    SetupRasterIRQ
471
FFFFFFFFFFFFB2A0        00000040                        cli                                             ; enable interrupts
472
                                                 ;      call    HelloWorld
473
FFFFFFFFFFFFB2A4        E0C000CE                        setlo   r3,#0xCE                ; blue on blue
474
FFFFFFFFFFFFB2A8        62019414                        sc              r3,ScreenColor
475
FFFFFFFFFFFFB2AC        42019414                        lc              r3,0x1414
476
FFFFFFFFFFFFB2B0        E0C00020                        setlo   r3,#32
477
FFFFFFFFFFFFB2B4        62019416                        sc              r3,0x1416               ; we do a store, then a load through the dcache
478
FFFFFFFFFFFFB2B8        42011416                        lc              r2,0x1416               ;
479
FFFFFFFFFFFFB2BC        BE218048                        beq             r2,r3,dcokay
480
FFFFFFFFFFFFB2C0        0000000D                        dcache_off                              ; data cache failed
481
FFFFFFFFFFFFB2C4                                 dcokay:
482
FFFFFFFFFFFFB2C4        620020A8                        sc              r0,NextToRunTCB
483
FFFFFFFFFFFFB2C8        620020A6                        sc              r0,RunningTCB
484
FFFFFFFFFFFFB2CC        31FFEED9                        call    ClearScreen
485
FFFFFFFFFFFFB2D0        31FFEEC4                        call    ClearBmpScreen
486
FFFFFFFFFFFFB2D4        31FFF1ED                        call    RandomizeSprram
487
FFFFFFFFFFFFB2D8        62001416                        sc              r0,CursorRow
488
FFFFFFFFFFFFB2DC        62001418                        sc              r0,CursorCol
489
FFFFFFFFFFFFB2E0        E0400001                        setlo   r1,#1
490
FFFFFFFFFFFFB2E4        6000941A                        sb              r1,CursorFlash
491
FFFFFFFFFFFFB2E8        E6BFB36D                ; SETLO
492
FFFFFFFFFFFFB2EC        6A0D042D                        lea             r1,MSGSTART
493
FFFFFFFFFFFFB2F0        31FFEFF5                        call    DisplayStringCRLF
494
FFFFFFFFFFFFB2F4        33FFF096                        jmp             Monitor
495
FFFFFFFFFFFFB2F8        31FFF1F7                        call    SetupAC97               ; and Beep
496
FFFFFFFFFFFFB2FC        E0C00004                        setlo   r3,#4
497
FFFFFFFFFFFFB300        E69C0600                ; SETLO
498
FFFFFFFFFFFFB304        EE800003                ; SETMID
499
FFFFFFFFFFFFB308        6A0D0C28                        outb    r3,LED
500
FFFFFFFFFFFFB30C        31FFF221                        call    Beep
501
 
502
FFFFFFFFFFFFB310                                 j4:
503
FFFFFFFFFFFFB310        33FFF096                        jmp             Monitor
504
FFFFFFFFFFFFB314        BE007FEA                        bra             j4
505
 
506
                                                 ; for now hang the contexts
507
                                                 ;
508
FFFFFFFFFFFFB318                                 ctxstart1:
509
FFFFFFFFFFFFB318        BE00000A                        bra             ctxstart1
510
 
511 27 robfinch
                                                 ;      call    ramtest
512
 
513
                                                 ;-----------------------------------------
514
                                                 ; Hello World!
515
                                                 ;-----------------------------------------
516 43 robfinch
FFFFFFFFFFFFB31C                                 HelloWorld:
517
FFFFFFFFFFFFB31C        0FEF0018                        subui   r30,r30,#24
518
FFFFFFFFFFFFB320        67E08000                        sw              r1,[sp]
519
FFFFFFFFFFFFB324        67E10008                        sw              r2,8[sp]
520
FFFFFFFFFFFFB328        67EF8010                        sw              lr,16[sp]
521
FFFFFFFFFFFFB32C        E6BFB360                ; SETLO
522
FFFFFFFFFFFFB330        6A0D082D                        lea             r2,MSG
523
FFFFFFFFFFFFB334                                 j3:
524
FFFFFFFFFFFFB334        40208000                        lb              r1,[r2]
525
FFFFFFFFFFFFB338        BE100088                        beq             r1,r0,j2
526
FFFFFFFFFFFFB33C        31FFED0C                        call    SerialPutChar
527
FFFFFFFFFFFFB340        0A210001                        addui   r2,r2,#1
528
FFFFFFFFFFFFB344        BE007F8A                        bra             j3
529
FFFFFFFFFFFFB348                                 j2:
530
FFFFFFFFFFFFB348        67EF8010                        sw              lr,16[sp]
531
FFFFFFFFFFFFB34C        67E10008                        sw              r2,8[sp]
532
FFFFFFFFFFFFB350        67E08000                        sw              r1,[sp]
533
FFFFFFFFFFFFB354        37EF8018                        ret             #24
534 27 robfinch
 
535
 
536 43 robfinch
FFFFFFFFFFFFB358 0000000000000000               align   16
537
FFFFFFFFFFFFB360                                        align   16
538
FFFFFFFFFFFFB360                                 MSG:
539
FFFFFFFFFFFFB360 6F57206F6C6C6548               db      "Hello World!",0
540
FFFFFFFFFFFFB36D                                 MSGSTART:
541
FFFFFFFFFFFFB368 7061520021646C72               db      "Raptor64 system starting....",0
542
FFFFFFFFFFFFB370 7973203436726F74
543
FFFFFFFFFFFFB378 617473206D657473
544
FFFFFFFFFFFFB380 2E2E2E676E697472
545 27 robfinch
 
546 43 robfinch
FFFFFFFFFFFFB388 000000000000002E               align 16
547
FFFFFFFFFFFFB390                                        align 16
548 27 robfinch
 
549
                                                 ;----------------------------------------------------------
550
                                                 ; Initialize programmable interrupt controller (PIC)
551
                                                 ;  0 = nmi
552
                                                 ;  1 = keyboard reset
553 43 robfinch
                                                 ;  2 = 1000Hz pulse (context switcher)
554
                                                 ;  3 = 100Hz pulse (cursor flash)
555
                                                 ;  8 = uart
556
                                                 ; 13 = raster interrupt
557 27 robfinch
                                                 ; 15 = keyboard char
558
                                                 ;----------------------------------------------------------
559 43 robfinch
FFFFFFFFFFFFB390                                 PICInit:
560
FFFFFFFFFFFFB390        E6BFB3AC                ; SETLO
561
FFFFFFFFFFFFB394        6A0D042D                        lea             r1,PICret
562
FFFFFFFFFFFFB398        66009030                        sw              r1,TickIRQAddr
563
                                                        ; enable: raster irq,
564
FFFFFFFFFFFFB39C        E07FA00F                        setlo   r1,#0xA00F      ; enable nmi,kbd_rst,and kbd_irq
565
                                                        ; A10F enable serial IRQ
566
FFFFFFFFFFFFB3A0        E69C0FF2                ; SETLO
567
FFFFFFFFFFFFB3A4        EE800003                ; SETMID
568
FFFFFFFFFFFFB3A8        6A0D0429                        outc    r1,PIC_IE
569
FFFFFFFFFFFFB3AC                                 PICret:
570
FFFFFFFFFFFFB3AC        37EF8000                        ret
571 27 robfinch
 
572 43 robfinch
                                                 ;==============================================================================
573
                                                 ; Serial port
574
                                                 ;==============================================================================
575 27 robfinch
                                                 ;-----------------------------------------
576 43 robfinch
                                                 ; Initialize the serial port
577 27 robfinch
                                                 ;-----------------------------------------
578 43 robfinch
                                                 ;
579
FFFFFFFFFFFFB3B0                                 SerialInit:
580
FFFFFFFFFFFFB3B0        62001800                        sc              r0,Uart_rxhead          ; reset buffer indexes
581
FFFFFFFFFFFFB3B4        62001802                        sc              r0,Uart_rxtail
582
FFFFFFFFFFFFB3B8        E04001F0                        setlo   r1,#0x1f0
583
FFFFFFFFFFFFB3BC        62009810                        sc              r1,Uart_foff            ; set threshold for XOFF
584
FFFFFFFFFFFFB3C0        E0400010                        setlo   r1,#0x010
585
FFFFFFFFFFFFB3C4        6200980E                        sc              r1,Uart_fon                     ; set threshold for XON
586
FFFFFFFFFFFFB3C8        E0400001                        setlo   r1,#1
587
FFFFFFFFFFFFB3CC        E69C0A04                ; SETLO
588
FFFFFFFFFFFFB3D0        EE800003                ; SETMID
589
FFFFFFFFFFFFB3D4        6A0D0428                        outb    r1,UART_IE                      ; enable receive interrupt only
590
FFFFFFFFFFFFB3D8        60001809                        sb              r0,Uart_rxrts           ; no RTS/CTS signals available
591
FFFFFFFFFFFFB3DC        60001812                        sb              r0,Uart_txrts           ; no RTS/CTS signals available
592
FFFFFFFFFFFFB3E0        60001813                        sb              r0,Uart_txdtr           ; no DTR signals available
593
FFFFFFFFFFFFB3E4        6000180A                        sb              r0,Uart_rxdtr           ; no DTR signals available
594
FFFFFFFFFFFFB3E8        E0400001                        setlo   r1,#1
595
FFFFFFFFFFFFB3EC        60009814                        sb              r1,Uart_txxon           ; for now
596
FFFFFFFFFFFFB3F0        37EF8000                        ret
597 27 robfinch
 
598 43 robfinch
                                                 ;---------------------------------------------------------------------------------
599
                                                 ; Get character directly from serial port. Blocks until a character is available.
600
                                                 ;---------------------------------------------------------------------------------
601
                                                 ;
602
FFFFFFFFFFFFB3F4                                 SerialGetCharDirect:
603
FFFFFFFFFFFFB3F4                                 sgc1:
604
FFFFFFFFFFFFB3F4        E69C0A01                ; SETLO
605
FFFFFFFFFFFFB3F8        EE800003                ; SETMID
606
FFFFFFFFFFFFB3FC        6A0D0420                        inb             r1,UART_LS              ; uart status
607
FFFFFFFFFFFFB400        14108001                        andi    r1,r1,#rxfull   ; is there a char available ?
608
FFFFFFFFFFFFB404        BE107F88                        beq             r1,r0,sgc1
609
FFFFFFFFFFFFB408        E69C0A00                ; SETLO
610
FFFFFFFFFFFFB40C        EE800003                ; SETMID
611
FFFFFFFFFFFFB410        6A0D0420                        inb             r1,UART
612
FFFFFFFFFFFFB414        37EF8000                        ret
613
 
614
                                                 ;------------------------------------------------
615
                                                 ; Check for a character at the serial port
616
                                                 ; returns r1 = 1 if char available, 0 otherwise
617
                                                 ;------------------------------------------------
618
                                                 ;
619
FFFFFFFFFFFFB418                                 SerialCheckForCharDirect:
620
FFFFFFFFFFFFB418        E69C0A01                ; SETLO
621
FFFFFFFFFFFFB41C        EE800003                ; SETMID
622
FFFFFFFFFFFFB420        6A0D0420                        inb             r1,UART_LS              ; uart status
623
FFFFFFFFFFFFB424        14108001                        andi    r1,r1,#rxfull   ; is there a char available ?
624
FFFFFFFFFFFFB428        04100439                        sne             r1,r1,r0
625
FFFFFFFFFFFFB42C        37EF8000                        ret
626
 
627 27 robfinch
                                                 ;-----------------------------------------
628
                                                 ; Put character to serial port
629 43 robfinch
                                                 ; r1 = char to put
630 27 robfinch
                                                 ;-----------------------------------------
631 43 robfinch
                                                 ;
632
FFFFFFFFFFFFB430                                 SerialPutChar:
633
FFFFFFFFFFFFB430        0FEF0020                        subui   sp,sp,#32
634
FFFFFFFFFFFFB434        67E10000                        sw              r2,[sp]
635
FFFFFFFFFFFFB438        67E18008                        sw              r3,8[sp]
636
FFFFFFFFFFFFB43C        67E20010                        sw              r4,16[sp]
637
FFFFFFFFFFFFB440        67E28018                        sw              r5,24[sp]
638
FFFFFFFFFFFFB444        E69C0A06                ; SETLO
639
FFFFFFFFFFFFB448        EE800003                ; SETMID
640
FFFFFFFFFFFFB44C        6A0D0820                        inb             r2,UART_MC
641
FFFFFFFFFFFFB450        16210003                        ori             r2,r2,#3                ; assert DTR / RTS
642
FFFFFFFFFFFFB454        E69C0A06                ; SETLO
643
FFFFFFFFFFFFB458        EE800003                ; SETMID
644
FFFFFFFFFFFFB45C        6A0D0828                        outb    r2,UART_MC
645
FFFFFFFFFFFFB460        40011812                        lb              r2,Uart_txrts
646
FFFFFFFFFFFFB464        BE200168                        beq             r2,r0,spcb1
647
FFFFFFFFFFFFB468        46021400                        lw              r4,Milliseconds
648
FFFFFFFFFFFFB46C        E0C00064                        setlo   r3,#100                 ; delay count (1 s)
649
FFFFFFFFFFFFB470                                 spcb3:
650
FFFFFFFFFFFFB470        80011808                        inb             r2,UART_MS
651
FFFFFFFFFFFFB474        1421000A                        andi    r2,r2,#10               ; is CTS asserted ?
652
FFFFFFFFFFFFB478        BE2000C9                        bne             r2,r0,spcb1
653
FFFFFFFFFFFFB47C        46029400                        lw              r5,Milliseconds
654
FFFFFFFFFFFFB480        BE42FF88                        beq             r4,r5,spcb3
655
FFFFFFFFFFFFB484        02520009                        mov             r4,r5
656
FFFFFFFFFFFFB488        BE01FF4F                        loop    r3,spcb3
657
FFFFFFFFFFFFB48C        BE00046A                        bra             spcabort
658
FFFFFFFFFFFFB490                                 spcb1:
659
FFFFFFFFFFFFB490        40011813                        lb              r2,Uart_txdtr
660
FFFFFFFFFFFFB494        BE200168                        beq             r2,r0,spcb2
661
FFFFFFFFFFFFB498        46021400                        lw              r4,Milliseconds
662
FFFFFFFFFFFFB49C        E0C00064                        setlo   r3,#100                 ; delay count
663
FFFFFFFFFFFFB4A0                                 spcb4:
664
FFFFFFFFFFFFB4A0        80011808                        inb             r2,UART_MS
665
FFFFFFFFFFFFB4A4        14210014                        andi    r2,r2,#20               ; is DSR asserted ?
666
FFFFFFFFFFFFB4A8        BE2000C9                        bne             r2,r0,spcb2
667
FFFFFFFFFFFFB4AC        46029400                        lw              r5,Milliseconds
668
FFFFFFFFFFFFB4B0        BE42FF88                        beq             r4,r5,spcb4
669
FFFFFFFFFFFFB4B4        02520009                        mov             r4,r5
670
FFFFFFFFFFFFB4B8        BE01FF4F                        loop    r3,spcb4
671
FFFFFFFFFFFFB4BC        BE0002EA                        bra             spcabort
672
FFFFFFFFFFFFB4C0                                 spcb2:
673
FFFFFFFFFFFFB4C0        40011814                        lb              r2,Uart_txxon
674
FFFFFFFFFFFFB4C4        BE2000C8                        beq             r2,r0,spcb5
675
FFFFFFFFFFFFB4C8                                 spcb6:
676
FFFFFFFFFFFFB4C8        40011815                        lb              r2,Uart_txxonoff
677
FFFFFFFFFFFFB4CC        BE200088                        beq             r2,r0,spcb5
678
FFFFFFFFFFFFB4D0        80021808                        inb             r4,UART_MS
679
FFFFFFFFFFFFB4D4        14420080                        andi    r4,r4,#0x80                     ; DCD ?
680
FFFFFFFFFFFFB4D8        BE407F89                        bne             r4,r0,spcb6
681
FFFFFFFFFFFFB4DC                                 spcb5:
682
FFFFFFFFFFFFB4DC        46021400                        lw              r4,Milliseconds
683
FFFFFFFFFFFFB4E0        E0C00064                        setlo   r3,#100                         ; wait up to 1s
684
FFFFFFFFFFFFB4E4                                 spcb8:
685
FFFFFFFFFFFFB4E4        E69C0A01                ; SETLO
686
FFFFFFFFFFFFB4E8        EE800003                ; SETMID
687
FFFFFFFFFFFFB4EC        6A0D0820                        inb             r2,UART_LS
688
FFFFFFFFFFFFB4F0        14210020                        andi    r2,r2,#0x20                     ; tx not full ?
689
FFFFFFFFFFFFB4F4        BE2000C9                        bne             r2,r0,spcb7
690
FFFFFFFFFFFFB4F8        46029400                        lw              r5,Milliseconds
691
FFFFFFFFFFFFB4FC        BE42FF48                        beq             r4,r5,spcb8
692
FFFFFFFFFFFFB500        02520009                        mov             r4,r5
693
FFFFFFFFFFFFB504        BE01FF0F                        loop    r3,spcb8
694
FFFFFFFFFFFFB508        BE00008A                        bra             spcabort
695
FFFFFFFFFFFFB50C                                 spcb7:
696
FFFFFFFFFFFFB50C        E69C0A00                ; SETLO
697
FFFFFFFFFFFFB510        EE800003                ; SETMID
698
FFFFFFFFFFFFB514        6A0D0428                        outb    r1,UART
699
FFFFFFFFFFFFB518                                 spcabort:
700
FFFFFFFFFFFFB518        47E10000                        lw              r2,[sp]
701
FFFFFFFFFFFFB51C        47E18008                        lw              r3,8[sp]
702
FFFFFFFFFFFFB520        47E20010                        lw              r4,16[sp]
703
FFFFFFFFFFFFB524        47E28018                        lw              r5,24[sp]
704
FFFFFFFFFFFFB528        37EF8020                        ret             #32
705 27 robfinch
 
706 43 robfinch
                                                 ;-------------------------------------------------
707
                                                 ; Compute number of characters in recieve buffer.
708
                                                 ; r4 = number of chars
709
                                                 ;-------------------------------------------------
710
FFFFFFFFFFFFB52C                                 CharsInRxBuf:
711
FFFFFFFFFFFFB52C        42021800                        lc              r4,Uart_rxhead
712
FFFFFFFFFFFFB530        42011802                        lc              r2,Uart_rxtail
713
FFFFFFFFFFFFB534        04411005                        subu    r4,r4,r2
714
FFFFFFFFFFFFB538        BE4000A3                        bgt             r4,r0,cirxb1
715
FFFFFFFFFFFFB53C        E1000200                        setlo   r4,#0x200
716
FFFFFFFFFFFFB540        04411003                        addu    r4,r4,r2
717
FFFFFFFFFFFFB544        42011800                        lc              r2,Uart_rxhead
718
FFFFFFFFFFFFB548        04411005                        subu    r4,r4,r2
719
FFFFFFFFFFFFB54C                                 cirxb1:
720
FFFFFFFFFFFFB54C        37EF8000                        ret
721
 
722
                                                 ;----------------------------------------------
723
                                                 ; Get character from rx fifo
724
                                                 ; If the fifo is empty enough then send an XON
725
                                                 ;----------------------------------------------
726
                                                 ;
727
FFFFFFFFFFFFB550                                 SerialGetChar:
728
FFFFFFFFFFFFB550        0FEF0020                        subui   sp,sp,#32
729
FFFFFFFFFFFFB554        67E10000                        sw              r2,[sp]
730
FFFFFFFFFFFFB558        67E18008                        sw              r3,8[sp]
731
FFFFFFFFFFFFB55C        67E20010                        sw              r4,16[sp]
732
FFFFFFFFFFFFB560        67EF8018                        sw              lr,24[sp]
733
FFFFFFFFFFFFB564        42019800                        lc              r3,Uart_rxhead
734
FFFFFFFFFFFFB568        42011802                        lc              r2,Uart_rxtail
735
FFFFFFFFFFFFB56C        BE218528                        beq             r2,r3,sgcfifo1  ; is there a char available ?
736
FFFFFFFFFFFFB570        9A019600                        lea             r3,Uart_rxfifo
737
FFFFFFFFFFFFB574        6A218400                        lb              r1,[r2+r3]              ; get the char from the fifo into r1
738
FFFFFFFFFFFFB578        0A210001                        addui   r2,r2,#1                ; increment the fifo pointer
739
FFFFFFFFFFFFB57C        142101FF                        andi    r2,r2,#0x1ff
740
FFFFFFFFFFFFB580        62011802                        sc              r2,Uart_rxtail
741
FFFFFFFFFFFFB584        4001180C                        lb              r2,Uart_rxflow  ; using flow control ?
742
FFFFFFFFFFFFB588        BE2003A8                        beq             r2,r0,sgcfifo2
743
FFFFFFFFFFFFB58C        4201980E                        lc              r3,Uart_fon             ; enough space in Rx buffer ?
744
FFFFFFFFFFFFB590        31FFED4B                        call    CharsInRxBuf
745
FFFFFFFFFFFFB594        BE418343                        bgt             r4,r3,sgcfifo2
746
FFFFFFFFFFFFB598        6000180C                        sb              r0,Uart_rxflow  ; flow off
747
FFFFFFFFFFFFB59C        40021809                        lb              r4,Uart_rxrts
748
FFFFFFFFFFFFB5A0        BE400108                        beq             r4,r0,sgcfifo3
749
FFFFFFFFFFFFB5A4        E69C0A06                ; SETLO
750
FFFFFFFFFFFFB5A8        EE800003                ; SETMID
751
FFFFFFFFFFFFB5AC        6A0D1020                        inb             r4,UART_MC              ; set rts bit in MC
752
FFFFFFFFFFFFB5B0        16420002                        ori             r4,r4,#2
753
FFFFFFFFFFFFB5B4        E69C0A06                ; SETLO
754
FFFFFFFFFFFFB5B8        EE800003                ; SETMID
755
FFFFFFFFFFFFB5BC        6A0D1028                        outb    r4,UART_MC
756
FFFFFFFFFFFFB5C0                                 sgcfifo3:
757
FFFFFFFFFFFFB5C0        4002180A                        lb              r4,Uart_rxdtr
758
FFFFFFFFFFFFB5C4        BE400108                        beq             r4,r0,sgcfifo4
759
FFFFFFFFFFFFB5C8        E69C0A06                ; SETLO
760
FFFFFFFFFFFFB5CC        EE800003                ; SETMID
761
FFFFFFFFFFFFB5D0        6A0D1020                        inb             r4,UART_MC              ; set DTR
762
FFFFFFFFFFFFB5D4        16420001                        ori             r4,r4,#1
763
FFFFFFFFFFFFB5D8        E69C0A06                ; SETLO
764
FFFFFFFFFFFFB5DC        EE800003                ; SETMID
765
FFFFFFFFFFFFB5E0        6A0D1028                        outb    r4,UART_MC
766
FFFFFFFFFFFFB5E4                                 sgcfifo4:
767
FFFFFFFFFFFFB5E4        4002180B                        lb              r4,Uart_rxxon
768
FFFFFFFFFFFFB5E8        BE4000A8                        beq             r4,r0,sgcfifo5
769
FFFFFFFFFFFFB5EC        E1000011                        setlo   r4,#XON
770
FFFFFFFFFFFFB5F0        E69C0A00                ; SETLO
771
FFFFFFFFFFFFB5F4        EE800003                ; SETMID
772
FFFFFFFFFFFFB5F8        6A0D1028                        outb    r4,UART
773
FFFFFFFFFFFFB5FC                                 sgcfifo5:
774
FFFFFFFFFFFFB5FC                                 sgcfifo2:                                      ; return with char in r1
775
FFFFFFFFFFFFB5FC        47E10000                        lw              r2,[sp]
776
FFFFFFFFFFFFB600        47E18008                        lw              r3,8[sp]
777
FFFFFFFFFFFFB604        47E20010                        lw              r4,16[sp]
778
FFFFFFFFFFFFB608        47EF8018                        lw              lr,24[sp]
779
FFFFFFFFFFFFB60C        37EF8020                        ret             #32
780
FFFFFFFFFFFFB610                                 sgcfifo1:
781
FFFFFFFFFFFFB610        E07FFFFF                        setlo   r1,#-1                  ; no char available
782
FFFFFFFFFFFFB614        47E10000                        lw              r2,[sp]
783
FFFFFFFFFFFFB618        47E18008                        lw              r3,8[sp]
784
FFFFFFFFFFFFB61C        47E20010                        lw              r4,16[sp]
785
FFFFFFFFFFFFB620        47EF8018                        lw              lr,24[sp]
786
FFFFFFFFFFFFB624        37EF8020                        ret             #32
787
 
788
                                                 ;-----------------------------------------
789
                                                 ; Serial port IRQ
790
                                                 ;-----------------------------------------
791
                                                 ;
792
FFFFFFFFFFFFB628                                 SerialIRQ:
793
FFFFFFFFFFFFB628        0FEF0028                        subui   sp,sp,#40
794
FFFFFFFFFFFFB62C        67E08000                        sw              r1,[sp]
795
FFFFFFFFFFFFB630        67E10008                        sw              r2,8[sp]
796
FFFFFFFFFFFFB634        67E18010                        sw              r3,16[sp]
797
FFFFFFFFFFFFB638        67E20018                        sw              r4,24[sp]
798
FFFFFFFFFFFFB63C        67EF8020                        sw              lr,32[sp]
799
FFFFFFFFFFFFB640        E69C0A03                ; SETLO
800
FFFFFFFFFFFFB644        EE800003                ; SETMID
801
FFFFFFFFFFFFB648        6A0D0420                        inb             r1,UART_IS              ; get interrupt status
802
FFFFFFFFFFFFB64C        BE1000A1                        bge             r1,r0,sirq1
803
FFFFFFFFFFFFB650        1410807F                        andi    r1,r1,#0x7f             ; switch on interrupt type
804
FFFFFFFFFFFFB654        B0100D04                        beqi    r1,#4,srxirq
805
FFFFFFFFFFFFB658        B0100B0C                        beqi    r1,#0xC,stxirq
806
FFFFFFFFFFFFB65C        B0100710                        beqi    r1,#0x10,smsirq
807
FFFFFFFFFFFFB660                                 sirq1:
808
FFFFFFFFFFFFB660        47E08000                        lw              r1,[sp]
809
FFFFFFFFFFFFB664        47E10008                        lw              r2,8[sp]
810
FFFFFFFFFFFFB668        47E18010                        lw              r3,16[sp]
811
FFFFFFFFFFFFB66C        47E20018                        lw              r4,24[sp]
812
FFFFFFFFFFFFB670        47EF8020                        lw              lr,32[sp]
813
FFFFFFFFFFFFB674        37EF8028                        ret             #40
814
 
815
                                                 ; Get the modem status and record it
816
FFFFFFFFFFFFB678                                 smsirq:
817
FFFFFFFFFFFFB678        80009808                        inb             r1,UART_MS
818
FFFFFFFFFFFFB67C        60009808                        sb              r1,Uart_ms
819
FFFFFFFFFFFFB680        BE007F0A                        bra             sirq1
820
 
821
FFFFFFFFFFFFB684                                 stxirq:
822
FFFFFFFFFFFFB684        BE007EEA                        bra             sirq1
823
 
824
                                                 ; Get a character from the uart and store it in the rx fifo
825
FFFFFFFFFFFFB688                                 srxirq:
826
FFFFFFFFFFFFB688                                 srxirq1:
827
FFFFFFFFFFFFB688        E69C0A00                ; SETLO
828
FFFFFFFFFFFFB68C        EE800003                ; SETMID
829
FFFFFFFFFFFFB690        6A0D0420                        inb             r1,UART                         ; get the char (clears interrupt)
830
FFFFFFFFFFFFB694        40011814                        lb              r2,Uart_txxon
831
FFFFFFFFFFFFB698        BE200108                        beq             r2,r0,srxirq3
832
FFFFFFFFFFFFB69C        B2100413                        bnei    r1,#XOFF,srxirq2
833
FFFFFFFFFFFFB6A0        E0400001                        setlo   r1,#1
834
FFFFFFFFFFFFB6A4        60009815                        sb              r1,Uart_txxonoff
835
FFFFFFFFFFFFB6A8        BE00016A                        bra             srxirq5
836
FFFFFFFFFFFFB6AC                                 srxirq2:
837
FFFFFFFFFFFFB6AC        B2100311                        bnei    r1,#XON,srxirq3
838
FFFFFFFFFFFFB6B0        60001815                        sb              r0,Uart_txxonoff
839
FFFFFFFFFFFFB6B4        BE00010A                        bra             srxirq5
840
FFFFFFFFFFFFB6B8                                 srxirq3:
841
FFFFFFFFFFFFB6B8        60001815                        sb              r0,Uart_txxonoff
842
FFFFFFFFFFFFB6BC        42011800                        lc              r2,Uart_rxhead
843
FFFFFFFFFFFFB6C0        9A019600                        lea             r3,Uart_rxfifo
844
FFFFFFFFFFFFB6C4        6A310410                        sb              r1,[r3+r2]                      ; store in buffer
845
FFFFFFFFFFFFB6C8        0A210001                        addui   r2,r2,#1
846
FFFFFFFFFFFFB6CC        142101FF                        andi    r2,r2,#0x1ff
847
FFFFFFFFFFFFB6D0        62011800                        sc              r2,Uart_rxhead
848
FFFFFFFFFFFFB6D4                                 srxirq5:
849
FFFFFFFFFFFFB6D4        E69C0A01                ; SETLO
850
FFFFFFFFFFFFB6D8        EE800003                ; SETMID
851
FFFFFFFFFFFFB6DC        6A0D0420                        inb             r1,UART_LS                      ; check for another ready character
852
FFFFFFFFFFFFB6E0        14108001                        andi    r1,r1,#rxfull
853
FFFFFFFFFFFFB6E4        BE107D29                        bne             r1,r0,srxirq1
854
FFFFFFFFFFFFB6E8        4000980C                        lb              r1,Uart_rxflow          ; are we using flow controls?
855
FFFFFFFFFFFFB6EC        BE1003C9                        bne             r1,r0,srxirq8
856
FFFFFFFFFFFFB6F0        31FFED4B                        call    CharsInRxBuf
857
FFFFFFFFFFFFB6F4        42009810                        lc              r1,Uart_foff
858
FFFFFFFFFFFFB6F8        BE408360                        blt             r4,r1,srxirq8
859
FFFFFFFFFFFFB6FC        E0400001                        setlo   r1,#1
860
FFFFFFFFFFFFB700        6000980C                        sb              r1,Uart_rxflow
861
FFFFFFFFFFFFB704        40009809                        lb              r1,Uart_rxrts
862
FFFFFFFFFFFFB708        BE100108                        beq             r1,r0,srxirq6
863
FFFFFFFFFFFFB70C        E69C0A06                ; SETLO
864
FFFFFFFFFFFFB710        EE800003                ; SETMID
865
FFFFFFFFFFFFB714        6A0D0420                        inb             r1,UART_MC
866
FFFFFFFFFFFFB718        141080FD                        andi    r1,r1,#0xFD             ; turn off RTS
867
FFFFFFFFFFFFB71C        E69C0A06                ; SETLO
868
FFFFFFFFFFFFB720        EE800003                ; SETMID
869
FFFFFFFFFFFFB724        6A0D0428                        outb    r1,UART_MC
870
FFFFFFFFFFFFB728                                 srxirq6:
871
FFFFFFFFFFFFB728        4000980A                        lb              r1,Uart_rxdtr
872
FFFFFFFFFFFFB72C        BE100108                        beq             r1,r0,srxirq7
873
FFFFFFFFFFFFB730        E69C0A06                ; SETLO
874
FFFFFFFFFFFFB734        EE800003                ; SETMID
875
FFFFFFFFFFFFB738        6A0D0420                        inb             r1,UART_MC
876
FFFFFFFFFFFFB73C        141080FE                        andi    r1,r1,#0xFE             ; turn off DTR
877
FFFFFFFFFFFFB740        E69C0A06                ; SETLO
878
FFFFFFFFFFFFB744        EE800003                ; SETMID
879
FFFFFFFFFFFFB748        6A0D0428                        outb    r1,UART_MC
880
FFFFFFFFFFFFB74C                                 srxirq7:
881
FFFFFFFFFFFFB74C        4000980B                        lb              r1,Uart_rxxon
882
FFFFFFFFFFFFB750        BE1000A8                        beq             r1,r0,srxirq8
883
FFFFFFFFFFFFB754        E0400013                        setlo   r1,#XOFF
884
FFFFFFFFFFFFB758        E69C0A00                ; SETLO
885
FFFFFFFFFFFFB75C        EE800003                ; SETMID
886
FFFFFFFFFFFFB760        6A0D0428                        outb    r1,UART
887
FFFFFFFFFFFFB764                                 srxirq8:
888
FFFFFFFFFFFFB764        BE0077EA                        bra             sirq1
889
 
890 27 robfinch
                                                 ;==============================================================================
891 43 robfinch
                                                 ; Keyboard BIOS
892
                                                 ; BIOS interrupt #417
893
                                                 ;
894
                                                 ; Function in R1
895
                                                 ; 0 = initialize keyboard
896
                                                 ; 1 = set keyboard echo
897
                                                 ; 2 = get keyboard character
898
                                                 ; 3 = check for key available
899 27 robfinch
                                                 ;==============================================================================
900 43 robfinch
                                                 ;
901
FFFFFFFFFFFFB768                                 KeybdSC:
902
FFFFFFFFFFFFB768        0FEF0008                        subui   sp,sp,#8
903
FFFFFFFFFFFFB76C        67EF8000                        sw              lr,[sp]
904
FFFFFFFFFFFFB770        B2100300                        bnei    r1,#0,kbdsc1
905
FFFFFFFFFFFFB774        31FFEDEC                        call    KeybdInit
906
FFFFFFFFFFFFB778        BE00016A                        bra             kbdscRet
907
FFFFFFFFFFFFB77C                                 kbdsc1:
908
FFFFFFFFFFFFB77C        B2100401                        bnei    r1,#1,kbdsc2
909
FFFFFFFFFFFFB780        02208009                        mov             r1,r2
910
FFFFFFFFFFFFB784        31FFEE06                        call    SetKeyboardEcho
911
FFFFFFFFFFFFB788        BE0000EA                        bra             kbdscRet
912
FFFFFFFFFFFFB78C                                 kbdsc2:
913
FFFFFFFFFFFFB78C        B2100302                        bnei    r1,#2,kbdsc3
914
FFFFFFFFFFFFB790        31FFEE08                        call    KeybdGetChar
915
FFFFFFFFFFFFB794        BE00008A                        bra             kbdscRet
916
FFFFFFFFFFFFB798                                 kbdsc3:
917
FFFFFFFFFFFFB798        B2100303                        bnei    r1,#3,kbdsc4
918
FFFFFFFFFFFFB79C        31FFEE1D                        call    KeybdCheckForKey
919
FFFFFFFFFFFFB7A0        BE00002A                        bra             kbdscRet
920
FFFFFFFFFFFFB7A4                                 kbdsc4:
921
FFFFFFFFFFFFB7A4                                 kbdscRet:
922
FFFFFFFFFFFFB7A4        47EF8000                        lw              lr,[sp]
923
FFFFFFFFFFFFB7A8        0BEF0008                        addui   sp,sp,#8
924
FFFFFFFFFFFFB7AC        01800021                        eret
925
 
926 27 robfinch
                                                 ;------------------------------------------------------------------------------
927
                                                 ; Initialize keyboard
928
                                                 ;------------------------------------------------------------------------------
929 43 robfinch
FFFFFFFFFFFFB7B0                                 KeybdInit:
930
FFFFFFFFFFFFB7B0        60001450                        sb              r0,KeybdHead
931
FFFFFFFFFFFFB7B4        60001451                        sb              r0,KeybdTail
932
FFFFFFFFFFFFB7B8        E0400001                        setlo   r1,#1                   ; turn on keyboard echo
933
FFFFFFFFFFFFB7BC        6000941C                        sb              r1,KeybdEcho
934
FFFFFFFFFFFFB7C0        37EF8000                        ret
935 27 robfinch
 
936
                                                 ;------------------------------------------------------------------------------
937
                                                 ; Normal keyboard interrupt, the lowest priority interrupt in the system.
938
                                                 ; Grab the character from the keyboard device and store it in a buffer.
939
                                                 ;------------------------------------------------------------------------------
940
                                                 ;
941 43 robfinch
FFFFFFFFFFFFB7C4                                 KeybdIRQ:
942
FFFFFFFFFFFFB7C4        0FEF0008                        subui   sp,sp,#8
943
FFFFFFFFFFFFB7C8        67E10000                        sw              r2,[sp]
944
FFFFFFFFFFFFB7CC        4A009450                        lbu             r1,KeybdHead
945
FFFFFFFFFFFFB7D0        1410800F                        andi    r1,r1,#0x0f                             ; r1 = index into buffer
946
FFFFFFFFFFFFB7D4                                 KeybdIRQa:
947
FFFFFFFFFFFFB7D4        E69C0000                ; SETLO
948
FFFFFFFFFFFFB7D8        EE800003                ; SETMID
949
FFFFFFFFFFFFB7DC        6A0D0821                        inch    r2,KEYBD                                ; get keyboard character
950
FFFFFFFFFFFFB7E0        E69C0002                ; SETLO
951
FFFFFFFFFFFFB7E4        EE800003                ; SETMID
952
FFFFFFFFFFFFB7E8        6A0D0029                        outc    r0,KEYBD+2                              ; clear keyboard strobe (turns off the IRQ)
953
FFFFFFFFFFFFB7EC        60111440                        sb              r2,KeybdBuffer[r1]              ; store character in buffer
954
FFFFFFFFFFFFB7F0        0A108001                        addui   r1,r1,#1                                ; increment head index
955
FFFFFFFFFFFFB7F4        1410800F                        andi    r1,r1,#0x0f
956
FFFFFFFFFFFFB7F8        60009450                        sb              r1,KeybdHead
957
FFFFFFFFFFFFB7FC                                 KeybdIRQb:
958
FFFFFFFFFFFFB7FC        4A011451                        lbu             r2,KeybdTail                    ; check to see if we've collided
959
FFFFFFFFFFFFB800        BE110089                        bne             r1,r2,KeybdIRQc                 ; with the tail
960
FFFFFFFFFFFFB804        0A210001                        addui   r2,r2,#1                                ; if so, increment the tail index
961
FFFFFFFFFFFFB808        1421000F                        andi    r2,r2,#0x0f                             ; the oldest character will be lost
962
FFFFFFFFFFFFB80C        60011451                        sb              r2,KeybdTail
963
FFFFFFFFFFFFB810                                 KeybdIRQc:
964
FFFFFFFFFFFFB810        47E10000                        lw              r2,[sp]
965
FFFFFFFFFFFFB814        37EF8008                        ret             #8
966 27 robfinch
 
967
                                                 ;------------------------------------------------------------------------------
968
                                                 ; r1 0=echo off, non-zero = echo on
969
                                                 ;------------------------------------------------------------------------------
970 43 robfinch
FFFFFFFFFFFFB818                                 SetKeyboardEcho:
971
FFFFFFFFFFFFB818        6000941C                        sb              r1,KeybdEcho
972
FFFFFFFFFFFFB81C        37EF8000                        ret
973 27 robfinch
 
974
                                                 ;-----------------------------------------
975
                                                 ; Get character from keyboard buffer
976
                                                 ;-----------------------------------------
977 43 robfinch
FFFFFFFFFFFFB820                                 KeybdGetChar:
978
FFFFFFFFFFFFB820        0FEF0010                        subui   sp,sp,#16
979
FFFFFFFFFFFFB824        67E10000                        sw              r2,[sp]
980
FFFFFFFFFFFFB828        67EF8008                        sw              lr,8[sp]
981
FFFFFFFFFFFFB82C        4A011451                        lbu             r2,KeybdTail
982
FFFFFFFFFFFFB830        4A009450                        lbu             r1,KeybdHead
983
FFFFFFFFFFFFB834        BE110188                        beq             r1,r2,nochar
984
FFFFFFFFFFFFB838        4A209440                        lbu             r1,KeybdBuffer[r2]
985
FFFFFFFFFFFFB83C        0A210001                        addui   r2,r2,#1
986
FFFFFFFFFFFFB840        1421000F                        andi    r2,r2,#0x0f
987
FFFFFFFFFFFFB844        60011451                        sb              r2,KeybdTail
988
FFFFFFFFFFFFB848        4001141C                        lb              r2,KeybdEcho
989
FFFFFFFFFFFFB84C        BE2000E8                        beq             r2,r0,kgc3
990
FFFFFFFFFFFFB850        B210030D                        bnei    r1,#CR,kgc2
991
FFFFFFFFFFFFB854        31FFF93F                        call    CRLF                    ; convert CR keystroke into CRLF
992
FFFFFFFFFFFFB858        BE00008A                        bra             kgc3
993
FFFFFFFFFFFFB85C                                 kgc2:
994
FFFFFFFFFFFFB85C        31FFEF47                        call    DisplayChar
995
FFFFFFFFFFFFB860        BE00004A                        bra             kgc3
996
FFFFFFFFFFFFB864                                 nochar:
997
FFFFFFFFFFFFB864        E07FFFFF                        setlo   r1,#-1
998
FFFFFFFFFFFFB868                                 kgc3:
999
FFFFFFFFFFFFB868        47EF8008                        lw              lr,8[sp]
1000
FFFFFFFFFFFFB86C        47E10000                        lw              r2,[sp]
1001
FFFFFFFFFFFFB870        37EF8010                        ret             #16
1002 27 robfinch
 
1003
                                                 ;------------------------------------------------------------------------------
1004
                                                 ; Check if there is a keyboard character available in the keyboard buffer.
1005
                                                 ;------------------------------------------------------------------------------
1006
                                                 ;
1007 43 robfinch
FFFFFFFFFFFFB874                                 KeybdCheckForKey:
1008
FFFFFFFFFFFFB874        4A009451                        lbu             r1,KeybdTail
1009
FFFFFFFFFFFFB878        4A011450                        lbu             r2,KeybdHead
1010
FFFFFFFFFFFFB87C        04110439                        sne             r1,r1,r2
1011
FFFFFFFFFFFFB880        37EF8000                        ret
1012 27 robfinch
 
1013
                                                 ;------------------------------------------------------------------------------
1014
                                                 ; Check if there is a keyboard character available. If so return true (1)
1015
                                                 ; otherwise return false (0) in r1.
1016
                                                 ;------------------------------------------------------------------------------
1017
                                                 ;
1018 43 robfinch
FFFFFFFFFFFFB884                                 KeybdCheckForKeyDirect:
1019
FFFFFFFFFFFFB884        E69C0000                ; SETLO
1020
FFFFFFFFFFFFB888        EE800003                ; SETMID
1021
FFFFFFFFFFFFB88C        6A0D0421                        inch    r1,KEYBD
1022
FFFFFFFFFFFFB890        04100430                        slt             r1,r1,r0
1023
FFFFFFFFFFFFB894        37EF8000                        ret
1024 27 robfinch
 
1025
                                                 ;------------------------------------------------------------------------------
1026
                                                 ; Get character directly from keyboard. This routine blocks until a key is
1027
                                                 ; available.
1028
                                                 ;------------------------------------------------------------------------------
1029
                                                 ;
1030 43 robfinch
FFFFFFFFFFFFB898                                 KeybdGetCharDirect:
1031
FFFFFFFFFFFFB898        0FEF0010                        subui   sp,sp,#16
1032
FFFFFFFFFFFFB89C        67E10000                        sw              r2,[sp]
1033
FFFFFFFFFFFFB8A0        67EF8008                        sw              lr,8[sp]
1034
FFFFFFFFFFFFB8A4        E09C0000                        setlo   r2,KEYBD
1035
FFFFFFFFFFFFB8A8                                 kgc1:
1036
FFFFFFFFFFFFB8A8        E69C0000                ; SETLO
1037
FFFFFFFFFFFFB8AC        EE800003                ; SETMID
1038
FFFFFFFFFFFFB8B0        6A0D0421                        inch    r1,KEYBD
1039
FFFFFFFFFFFFB8B4        BE107FA1                        bge             r1,r0,kgc1
1040
FFFFFFFFFFFFB8B8        E69C0002                ; SETLO
1041
FFFFFFFFFFFFB8BC        EE800003                ; SETMID
1042
FFFFFFFFFFFFB8C0        6A0D0029                        outc    r0,KEYBD+2              ; clear keyboard strobe
1043
FFFFFFFFFFFFB8C4        141080FF                        andi    r1,r1,#0xff             ; remove strobe bit
1044
FFFFFFFFFFFFB8C8        4001141C                        lb              r2,KeybdEcho    ; is keyboard echo on ?
1045
FFFFFFFFFFFFB8CC        BE2000A8                        beq             r2,r0,gk1
1046
FFFFFFFFFFFFB8D0        B210030D                        bnei    r1,#'\r',gk2    ; convert CR keystroke into CRLF
1047
FFFFFFFFFFFFB8D4        31FFF93F                        call    CRLF
1048
FFFFFFFFFFFFB8D8        BE00004A                        bra             gk1
1049
FFFFFFFFFFFFB8DC                                 gk2:
1050
FFFFFFFFFFFFB8DC        31FFEF47                        call    DisplayChar
1051
FFFFFFFFFFFFB8E0                                 gk1:
1052
FFFFFFFFFFFFB8E0        47E10000                        lw              r2,[sp]
1053
FFFFFFFFFFFFB8E4        47EF8008                        lw              lr,8[sp]
1054
FFFFFFFFFFFFB8E8        37EF8010                        ret             #16
1055 27 robfinch
 
1056
                                                 ;==============================================================================
1057
                                                 ;==============================================================================
1058
                                                 ;------------------------------------------------------------------------------
1059 43 robfinch
                                                 ; 100 Hz interrupt
1060 27 robfinch
                                                 ; - takes care of "flashing" the cursor
1061
                                                 ;------------------------------------------------------------------------------
1062
                                                 ;
1063 43 robfinch
FFFFFFFFFFFFB8EC                                 Pulse100:
1064
FFFFFFFFFFFFB8EC        0FEF0008                        subui   sp,sp,#8
1065
FFFFFFFFFFFFB8F0        67EF8000                        sw              lr,[sp]
1066
FFFFFFFFFFFFB8F4        E6900000                ; SETLO
1067
FFFFFFFFFFFFB8F8        EE800003                ; SETMID
1068
FFFFFFFFFFFFB8FC        6A0D082D                        lea             r2,TEXTSCR
1069
FFFFFFFFFFFFB900        8220814E                        inch    r1,334[r2]
1070
FFFFFFFFFFFFB904        0A108001                        addui   r1,r1,#1
1071
FFFFFFFFFFFFB908        9220814E                        outc    r1,334[r2]
1072
FFFFFFFFFFFFB90C        31FFF2D8                        call    DisplayDatetime
1073
FFFFFFFFFFFFB910        31FFEE4A                        call    SelectNextToRunTCB
1074
FFFFFFFFFFFFB914        31FFEE4C                        call    SwitchTask
1075
FFFFFFFFFFFFB918        E6BF0010                ; SETLO
1076
FFFFFFFFFFFFB91C        6A0D0010                        sb              r0,0xFFFF_FFFF_FFFF_0010        ; clear interrupt
1077
                                                 ;      lw              r1,TickIRQAddr
1078
                                                 ;      jal             r31,[r1]
1079
                                                 ;      lw              r1,Milliseconds
1080
                                                 ;      andi    r1,r1,#0x0f
1081
                                                 ;      bnei    r1,#5,p1001
1082
                                                 ;      call    FlashCursor
1083
FFFFFFFFFFFFB920                                 p1001:
1084
FFFFFFFFFFFFB920        47EF8000                        lw              lr,[sp]
1085
FFFFFFFFFFFFB924        37EF8008                        ret             #8
1086 27 robfinch
 
1087
                                                 ;------------------------------------------------------------------------------
1088 43 robfinch
                                                 ;------------------------------------------------------------------------------
1089
FFFFFFFFFFFFB928                                 SelectNextToRunTCB:
1090
FFFFFFFFFFFFB928        620020A8                        sc              r0,NextToRunTCB
1091
FFFFFFFFFFFFB92C        37EF8000                        ret
1092
 
1093
                                                 ;------------------------------------------------------------------------------
1094
                                                 ; Switch from the RunningTCB to the NextToRunTCB
1095
                                                 ;------------------------------------------------------------------------------
1096
FFFFFFFFFFFFB930                                 SwitchTask:
1097
FFFFFFFFFFFFB930        6600A0B0                        sw              r1,r1save
1098
FFFFFFFFFFFFB934        660120B8                        sw              r2,r2save
1099
FFFFFFFFFFFFB938        4C00A0A8                        lcu             r1,NextToRunTCB
1100
FFFFFFFFFFFFB93C        4C0120A6                        lcu             r2,RunningTCB
1101
FFFFFFFFFFFFB940        BE110089                        bne             r1,r2,swtsk1            ; are we already running this TCB ?
1102
FFFFFFFFFFFFB944        4600A0B0                        lw              r1,r1save
1103
FFFFFFFFFFFFB948        460120B8                        lw              r2,r2save
1104
FFFFFFFFFFFFB94C        37EF8000                        ret
1105
FFFFFFFFFFFFB950                                 swtsk1:
1106
FFFFFFFFFFFFB950        142101FF                        andi    r2,r2,#0x1ff            ; max 512 TCB's
1107
FFFFFFFFFFFFB954        1A210200                        mului   r2,r2,#TCBSize
1108
FFFFFFFFFFFFB958        E6800000                ; SETLO
1109
FFFFFFFFFFFFB95C        EE800400                ; SETMID
1110
FFFFFFFFFFFFB960        042D0803                        addui   r2,r2,#TCBBase
1111
FFFFFFFFFFFFB964        4600A0B0                        lw              r1,r1save                       ; get back r1
1112
FFFFFFFFFFFFB968        66208000                        sw              r1,TCBr1[r2]
1113
FFFFFFFFFFFFB96C        4600A0B8                        lw              r1,r2save                       ; get back r2
1114
FFFFFFFFFFFFB970        66208008                        sw              r1,TCBr2[r2]
1115
FFFFFFFFFFFFB974        66218010                        sw              r3,TCBr3[r2]
1116
FFFFFFFFFFFFB978        66220018                        sw              r4,TCBr4[r2]
1117
FFFFFFFFFFFFB97C        66228020                        sw              r5,TCBr5[r2]
1118
FFFFFFFFFFFFB980        66230028                        sw              r6,TCBr6[r2]
1119
FFFFFFFFFFFFB984        66238030                        sw              r7,TCBr7[r2]
1120
FFFFFFFFFFFFB988        66240038                        sw              r8,TCBr8[r2]
1121
FFFFFFFFFFFFB98C        66248040                        sw              r9,TCBr9[r2]
1122
FFFFFFFFFFFFB990        66250048                        sw              r10,TCBr10[r2]
1123
FFFFFFFFFFFFB994        66258050                        sw              r11,TCBr11[r2]
1124
FFFFFFFFFFFFB998        66260058                        sw              r12,TCBr12[r2]
1125
FFFFFFFFFFFFB99C        66268060                        sw              r13,TCBr13[r2]
1126
FFFFFFFFFFFFB9A0        66270068                        sw              r14,TCBr14[r2]
1127
FFFFFFFFFFFFB9A4        66278070                        sw              r15,TCBr15[r2]
1128
FFFFFFFFFFFFB9A8        66280078                        sw              r16,TCBr16[r2]
1129
FFFFFFFFFFFFB9AC        66288080                        sw              r17,TCBr17[r2]
1130
FFFFFFFFFFFFB9B0        66290088                        sw              r18,TCBr18[r2]
1131
FFFFFFFFFFFFB9B4        66298090                        sw              r19,TCBr19[r2]
1132
FFFFFFFFFFFFB9B8        662A0098                        sw              r20,TCBr20[r2]
1133
FFFFFFFFFFFFB9BC        662A80A0                        sw              r21,TCBr21[r2]
1134
FFFFFFFFFFFFB9C0        662B00A8                        sw              r22,TCBr22[r2]
1135
FFFFFFFFFFFFB9C4        662B80B0                        sw              r23,TCBr23[r2]
1136
FFFFFFFFFFFFB9C8        662C00B8                        sw              r24,TCBr24[r2]
1137
FFFFFFFFFFFFB9CC        662C80C0                        sw              r25,TCBr25[r2]
1138
FFFFFFFFFFFFB9D0        662D00C8                        sw              r26,TCBr26[r2]
1139
FFFFFFFFFFFFB9D4        662D80D0                        sw              r27,TCBr27[r2]
1140
FFFFFFFFFFFFB9D8        662E00D8                        sw              r28,TCBr28[r2]
1141
FFFFFFFFFFFFB9DC        662E80E0                        sw              r29,TCBr29[r2]
1142
FFFFFFFFFFFFB9E0        662F00E8                        sw              r30,TCBr30[r2]
1143
FFFFFFFFFFFFB9E4        662F80F0                        sw              r31,TCBr31[r2]
1144
 
1145
FFFFFFFFFFFFB9E8        4C0120A8                        lcu             r2,NextToRunTCB
1146
FFFFFFFFFFFFB9EC        620120A6                        sc              r2,RunningTCB
1147
FFFFFFFFFFFFB9F0        1A210200                        mului   r2,r2,#TCBSize
1148
FFFFFFFFFFFFB9F4        E6800000                ; SETLO
1149
FFFFFFFFFFFFB9F8        EE800400                ; SETMID
1150
FFFFFFFFFFFFB9FC        042D0803                        addui   r2,r2,#TCBBase
1151
 
1152
FFFFFFFFFFFFBA00        46208000                        lw              r1,TCBr1[r2]
1153
FFFFFFFFFFFFBA04        46218010                        lw              r3,TCBr3[r2]
1154
FFFFFFFFFFFFBA08        46220018                        lw              r4,TCBr4[r2]
1155
FFFFFFFFFFFFBA0C        46228020                        lw              r5,TCBr5[r2]
1156
FFFFFFFFFFFFBA10        46230028                        lw              r6,TCBr6[r2]
1157
FFFFFFFFFFFFBA14        46238030                        lw              r7,TCBr7[r2]
1158
FFFFFFFFFFFFBA18        46240038                        lw              r8,TCBr8[r2]
1159
FFFFFFFFFFFFBA1C        46248040                        lw              r9,TCBr9[r2]
1160
FFFFFFFFFFFFBA20        46250048                        lw              r10,TCBr10[r2]
1161
FFFFFFFFFFFFBA24        46258050                        lw              r11,TCBr11[r2]
1162
FFFFFFFFFFFFBA28        46260058                        lw              r12,TCBr12[r2]
1163
FFFFFFFFFFFFBA2C        46268060                        lw              r13,TCBr13[r2]
1164
FFFFFFFFFFFFBA30        46270068                        lw              r14,TCBr14[r2]
1165
FFFFFFFFFFFFBA34        46278070                        lw              r15,TCBr15[r2]
1166
FFFFFFFFFFFFBA38        46280078                        lw              r16,TCBr16[r2]
1167
FFFFFFFFFFFFBA3C        46288080                        lw              r17,TCBr17[r2]
1168
FFFFFFFFFFFFBA40        46290088                        lw              r18,TCBr18[r2]
1169
FFFFFFFFFFFFBA44        46298090                        lw              r19,TCBr19[r2]
1170
FFFFFFFFFFFFBA48        462A0098                        lw              r20,TCBr20[r2]
1171
FFFFFFFFFFFFBA4C        462A80A0                        lw              r21,TCBr21[r2]
1172
FFFFFFFFFFFFBA50        462B00A8                        lw              r22,TCBr22[r2]
1173
FFFFFFFFFFFFBA54        462B80B0                        lw              r23,TCBr23[r2]
1174
FFFFFFFFFFFFBA58        462C00B8                        lw              r24,TCBr24[r2]
1175
FFFFFFFFFFFFBA5C        462C80C0                        lw              r25,TCBr25[r2]
1176
FFFFFFFFFFFFBA60        462D00C8                        lw              r26,TCBr26[r2]
1177
FFFFFFFFFFFFBA64        462D80D0                        lw              r27,TCBr27[r2]
1178
FFFFFFFFFFFFBA68        462E00D8                        lw              r28,TCBr28[r2]
1179
FFFFFFFFFFFFBA6C        462E80E0                        lw              r29,TCBr29[r2]
1180
FFFFFFFFFFFFBA70        462F00E8                        lw              r30,TCBr30[r2]
1181
FFFFFFFFFFFFBA74        462F80F0                        lw              r31,TCBr31[r2]
1182
FFFFFFFFFFFFBA78        46210008                        lw              r2,TCBr2[r2]
1183
FFFFFFFFFFFFBA7C        37EF8000                        ret
1184
 
1185
                                                 ;------------------------------------------------------------------------------
1186 27 robfinch
                                                 ; Flash Cursor
1187
                                                 ;------------------------------------------------------------------------------
1188
                                                 ;
1189 43 robfinch
FFFFFFFFFFFFBA80                                 FlashCursor:
1190
FFFFFFFFFFFFBA80        0FEF0020                        subui   sp,sp,#32
1191
FFFFFFFFFFFFBA84        67E08000                        sw              r1,[sp]
1192
FFFFFFFFFFFFBA88        67E10008                        sw              r2,8[sp]
1193
FFFFFFFFFFFFBA8C        67E18010                        sw              r3,16[sp]
1194
FFFFFFFFFFFFBA90        67EF8018                        sw              lr,24[sp]
1195
FFFFFFFFFFFFBA94        31FFEF37                        call    CalcScreenLoc
1196
FFFFFFFFFFFFBA98        E6810000                ; SETLO
1197
FFFFFFFFFFFFBA9C        041D0403                        addui   r1,r1,#0x10000
1198
FFFFFFFFFFFFBAA0        4001141A                        lb              r2,CursorFlash
1199
FFFFFFFFFFFFBAA4        BE2001C8                        beq             r2,r0,flshcrsr2
1200 27 robfinch
                                                        ; causes screen colors to flip around
1201 43 robfinch
FFFFFFFFFFFFBAA8        82110000                        inch    r2,[r1]
1202
FFFFFFFFFFFFBAAC        0A210001                        addui   r2,r2,#1
1203
FFFFFFFFFFFFBAB0        92110000                        outc    r2,[r1]
1204
FFFFFFFFFFFFBAB4                                 flshcrsr3:
1205
FFFFFFFFFFFFBAB4        46011408                        lw              r2,Lastloc
1206
FFFFFFFFFFFFBAB8        BE110088                        beq             r1,r2,flshcrsr1
1207 27 robfinch
                                                        ; restore the screen colors of the previous cursor location
1208 43 robfinch
FFFFFFFFFFFFBABC        42019414                        lc              r3,ScreenColor
1209
FFFFFFFFFFFFBAC0        92218000                        outc    r3,[r2]
1210
FFFFFFFFFFFFBAC4        66009408                        sw              r1,Lastloc
1211
FFFFFFFFFFFFBAC8                                 flshcrsr1:
1212
FFFFFFFFFFFFBAC8        47E08000                        lw              r1,[sp]
1213
FFFFFFFFFFFFBACC        47E10008                        lw              r2,8[sp]
1214
FFFFFFFFFFFFBAD0        47E18010                        lw              r3,16[sp]
1215
FFFFFFFFFFFFBAD4        47EF8018                        lw              lr,24[sp]
1216
FFFFFFFFFFFFBAD8        37EF8020                        ret             #32
1217
FFFFFFFFFFFFBADC                                 flshcrsr2:
1218
FFFFFFFFFFFFBADC        42019414                        lc              r3,ScreenColor
1219
FFFFFFFFFFFFBAE0        92118000                        outc    r3,[r1]
1220
FFFFFFFFFFFFBAE4        BE007E8A                        bra             flshcrsr3
1221 27 robfinch
 
1222 43 robfinch
FFFFFFFFFFFFBAE8                                 CursorOff:
1223
FFFFFFFFFFFFBAE8        160080A0                        lw              r1,#0xA0
1224
FFFFFFFFFFFFBAEC        E69A0010                ; SETLO
1225
FFFFFFFFFFFFBAF0        EE800003                ; SETMID
1226
FFFFFFFFFFFFBAF4        6A0D0429                        outc    r1,TEXTREG+16           ; turn off cursor
1227
FFFFFFFFFFFFBAF8        37EF8000                        ret
1228
FFFFFFFFFFFFBAFC                                 CursorOn:
1229
FFFFFFFFFFFFBAFC        160080E0                        lw              r1,#0xE0
1230
FFFFFFFFFFFFBB00        E69A0010                ; SETLO
1231
FFFFFFFFFFFFBB04        EE800003                ; SETMID
1232
FFFFFFFFFFFFBB08        6A0D0429                        outc    r1,TEXTREG+16           ; turn on cursor
1233
FFFFFFFFFFFFBB0C        37EF8000                        ret
1234
 
1235 27 robfinch
                                                 ;------------------------------------------------------------------------------
1236
                                                 ;------------------------------------------------------------------------------
1237 43 robfinch
FFFFFFFFFFFFBB10                                 ClearBmpScreen:
1238
FFFFFFFFFFFFBB10        0FEF0018                        subui   sp,sp,#24
1239
FFFFFFFFFFFFBB14        67E08000                        sw              r1,[sp]
1240
FFFFFFFFFFFFBB18        67E10008                        sw              r2,8[sp]
1241
FFFFFFFFFFFFBB1C        67E18010                        sw              r3,16[sp]
1242
FFFFFFFFFFFFBB20        E68FFC00                ; SETLO
1243
FFFFFFFFFFFFBB24        040D0809                        lw              r2,#1364*768
1244
FFFFFFFFFFFFBB28        06210601                        shrui   r2,r2,#3                        ; r2 = # words to clear
1245
FFFFFFFFFFFFBB2C        E6A92929                ; SETLO
1246
FFFFFFFFFFFFBB30        EEA4A4A4                ; SETMID
1247
FFFFFFFFFFFFBB34        F6829292                ; SETHI
1248
FFFFFFFFFFFFBB38        6A0D042D                        lea             r1,0x2929292929292929   ; r1 = color for eight pixels
1249
FFFFFFFFFFFFBB3C        E6A00000                ; SETLO
1250
FFFFFFFFFFFFBB40        EE800400                ; SETMID
1251
FFFFFFFFFFFFBB44        6A0D0C2D                        lea             r3,BITMAPSCR            ; r3 = screen address
1252
FFFFFFFFFFFFBB48                                 csj4:
1253
FFFFFFFFFFFFBB48        66308000                        sw              r1,[r3]                         ; store pixel data
1254
FFFFFFFFFFFFBB4C        0A318008                        addui   r3,r3,#8                        ; advance screen address by eight
1255
FFFFFFFFFFFFBB50        BE017FCF                        loop    r2,csj4                         ; decrement pixel count and loop back
1256
FFFFFFFFFFFFBB54        47E08000                        lw              r1,[sp]
1257
FFFFFFFFFFFFBB58        47E10008                        lw              r2,8[sp]
1258
FFFFFFFFFFFFBB5C        47E18010                        lw              r3,16[sp]
1259
FFFFFFFFFFFFBB60        37EF8018                        ret             #24
1260 27 robfinch
 
1261
                                                 ;------------------------------------------------------------------------------
1262
                                                 ; Clear the screen and the screen color memory
1263
                                                 ; We clear the screen to give a visual indication that the system
1264
                                                 ; is working at all.
1265
                                                 ;------------------------------------------------------------------------------
1266
                                                 ;
1267 43 robfinch
FFFFFFFFFFFFBB64                                 ClearScreen:
1268
FFFFFFFFFFFFBB64        0FEF0028                        subui   sp,sp,#40
1269
FFFFFFFFFFFFBB68        67E08000                        sw              r1,[sp]
1270
FFFFFFFFFFFFBB6C        67E10008                        sw              r2,8[sp]
1271
FFFFFFFFFFFFBB70        67E18010                        sw              r3,16[sp]
1272
FFFFFFFFFFFFBB74        67E20018                        sw              r4,24[sp]
1273
FFFFFFFFFFFFBB78        67EF8020                        sw              lr,32[sp]
1274
FFFFFFFFFFFFBB7C        E69A0000                ; SETLO
1275
FFFFFFFFFFFFBB80        EE800003                ; SETMID
1276
FFFFFFFFFFFFBB84        6A0D0C2D                        lea             r3,TEXTREG
1277
FFFFFFFFFFFFBB88        82308000                        inch    r1,TEXT_COLS[r3]        ; calc number to clear
1278
FFFFFFFFFFFFBB8C        82310002                        inch    r2,TEXT_ROWS[r3]
1279
FFFFFFFFFFFFBB90        04110818                        mulu    r2,r1,r2                        ; r2 = # chars to clear
1280
FFFFFFFFFFFFBB94        E0400020                        setlo   r1,#32                  ; space char
1281
FFFFFFFFFFFFBB98        42021414                        lc              r4,ScreenColor
1282
FFFFFFFFFFFFBB9C        31FFEF2B                        call    AsciiToScreen
1283
FFFFFFFFFFFFBBA0        E6900000                ; SETLO
1284
FFFFFFFFFFFFBBA4        EE800003                ; SETMID
1285
FFFFFFFFFFFFBBA8        6A0D0C2D                        lea             r3,TEXTSCR              ; text screen address
1286
FFFFFFFFFFFFBBAC                                 csj4:
1287
FFFFFFFFFFFFBBAC        92308000                        outc    r1,[r3]
1288
FFFFFFFFFFFFBBB0        E6810000                ; SETLO
1289
FFFFFFFFFFFFBBB4        6A3D1029                        outc    r4,0x10000[r3]  ; color screen is 0x10000 higher
1290
FFFFFFFFFFFFBBB8        0A318002                        addui   r3,r3,#2
1291
FFFFFFFFFFFFBBBC        BE017F8F                        loop    r2,csj4
1292
FFFFFFFFFFFFBBC0        47EF8020                        lw              lr,32[sp]
1293
FFFFFFFFFFFFBBC4        47E20018                        lw              r4,24[sp]
1294
FFFFFFFFFFFFBBC8        47E18010                        lw              r3,16[sp]
1295
FFFFFFFFFFFFBBCC        47E10008                        lw              r2,8[sp]
1296
FFFFFFFFFFFFBBD0        47E08000                        lw              r1,[sp]
1297
FFFFFFFFFFFFBBD4        37EF8028                        ret             #40
1298 27 robfinch
 
1299
                                                 ;------------------------------------------------------------------------------
1300
                                                 ; Scroll text on the screen upwards
1301
                                                 ;------------------------------------------------------------------------------
1302
                                                 ;
1303 43 robfinch
FFFFFFFFFFFFBBD8                                 ScrollUp:
1304
FFFFFFFFFFFFBBD8        0FEF0028                        subui   sp,sp,#40
1305
FFFFFFFFFFFFBBDC        67E08000                        sw              r1,[sp]
1306
FFFFFFFFFFFFBBE0        67E10008                        sw              r2,8[sp]
1307
FFFFFFFFFFFFBBE4        67E18010                        sw              r3,16[sp]
1308
FFFFFFFFFFFFBBE8        67E20018                        sw              r4,24[sp]
1309
FFFFFFFFFFFFBBEC        67EF8020                        sw              lr,32[sp]
1310
FFFFFFFFFFFFBBF0        E69A0000                ; SETLO
1311
FFFFFFFFFFFFBBF4        EE800003                ; SETMID
1312
FFFFFFFFFFFFBBF8        6A0D0C2D                        lea             r3,TEXTREG
1313
FFFFFFFFFFFFBBFC        82308000                        inch    r1,TEXT_COLS[r3]        ; r1 = # text columns
1314
FFFFFFFFFFFFBC00        82310002                        inch    r2,TEXT_ROWS[r3]
1315
FFFFFFFFFFFFBC04        04110818                        mulu    r2,r1,r2                        ; calc number of chars to scroll
1316
FFFFFFFFFFFFBC08        04208805                        subu    r2,r2,r1                        ; one less row
1317
FFFFFFFFFFFFBC0C        E6900000                ; SETLO
1318
FFFFFFFFFFFFBC10        EE800003                ; SETMID
1319
FFFFFFFFFFFFBC14        6A0D0C2D                        lea             r3,TEXTSCR
1320
FFFFFFFFFFFFBC18                                 scrup1:
1321
FFFFFFFFFFFFBC18        6A309021                        inch    r4,[r3+r1]                      ; indexed addressing example
1322
FFFFFFFFFFFFBC1C        92320000                        outc    r4,[r3]
1323
FFFFFFFFFFFFBC20        0A318002                        addui   r3,r3,#2
1324
FFFFFFFFFFFFBC24        BE017FAF                        loop    r2,scrup1
1325 27 robfinch
 
1326 43 robfinch
FFFFFFFFFFFFBC28        E69A0000                ; SETLO
1327
FFFFFFFFFFFFBC2C        EE800003                ; SETMID
1328
FFFFFFFFFFFFBC30        6A0D0C2D                        lea             r3,TEXTREG
1329
FFFFFFFFFFFFBC34        82308002                        inch    r1,TEXT_ROWS[r3]
1330
FFFFFFFFFFFFBC38        0E108001                        subui   r1,r1,#1
1331
FFFFFFFFFFFFBC3C        31FFEF16                        call    BlankLine
1332
FFFFFFFFFFFFBC40        47E08000                        lw              r1,[sp]
1333
FFFFFFFFFFFFBC44        47E10008                        lw              r2,8[sp]
1334
FFFFFFFFFFFFBC48        47E18010                        lw              r3,16[sp]
1335
FFFFFFFFFFFFBC4C        47E20018                        lw              r4,24[sp]
1336
FFFFFFFFFFFFBC50        47EF8020                        lw              lr,32[sp]
1337
FFFFFFFFFFFFBC54        37EF8028                        ret             #40
1338 27 robfinch
 
1339
                                                 ;------------------------------------------------------------------------------
1340
                                                 ; Blank out a line on the display
1341
                                                 ; line number to blank is in r1
1342
                                                 ;------------------------------------------------------------------------------
1343
                                                 ;
1344 43 robfinch
FFFFFFFFFFFFBC58                                 BlankLine:
1345
FFFFFFFFFFFFBC58        0FEF0018                        subui   sp,sp,#24
1346
FFFFFFFFFFFFBC5C        67E08000                        sw              r1,[sp]
1347
FFFFFFFFFFFFBC60        67E10008                        sw              r2,8[sp]
1348
FFFFFFFFFFFFBC64        67E18010                        sw              r3,16[sp]
1349
FFFFFFFFFFFFBC68        E69A0000                ; SETLO
1350
FFFFFFFFFFFFBC6C        EE800003                ; SETMID
1351
FFFFFFFFFFFFBC70        6A0D0C2D                        lea             r3,TEXTREG                      ; r3 = text register address
1352
FFFFFFFFFFFFBC74        82310000                        inch    r2,TEXT_COLS[r3]        ; r2 = # chars to blank out
1353
FFFFFFFFFFFFBC78        04208C18                        mulu    r3,r2,r1
1354
FFFFFFFFFFFFBC7C        06318200                        shli    r3,r3,#1
1355
FFFFFFFFFFFFBC80        E6900000                ; SETLO
1356
FFFFFFFFFFFFBC84        EE800003                ; SETMID
1357
FFFFFFFFFFFFBC88        043D0C03                        addui   r3,r3,#TEXTSCR          ; r3 = screen address
1358
FFFFFFFFFFFFBC8C        E0400020                        setlo   r1,#' '
1359
FFFFFFFFFFFFBC90                                 blnkln1:
1360
FFFFFFFFFFFFBC90        92308000                        outc    r1,[r3]
1361
FFFFFFFFFFFFBC94        0A318002                        addui   r3,r3,#2
1362
FFFFFFFFFFFFBC98        BE017FCF                        loop    r2,blnkln1
1363
FFFFFFFFFFFFBC9C        47E08000                        lw              r1,[sp]
1364
FFFFFFFFFFFFBCA0        47E10008                        lw              r2,8[sp]
1365
FFFFFFFFFFFFBCA4        47E18010                        lw              r3,16[sp]
1366
FFFFFFFFFFFFBCA8        37EF8018                        ret             #24
1367 27 robfinch
 
1368
                                                 ;------------------------------------------------------------------------------
1369
                                                 ; Convert ASCII character to screen display character.
1370
                                                 ;------------------------------------------------------------------------------
1371
                                                 ;
1372 43 robfinch
FFFFFFFFFFFFBCAC                                 AsciiToScreen:
1373
FFFFFFFFFFFFBCAC        141080FF                        andi    r1,r1,#0x00ff
1374
FFFFFFFFFFFFBCB0        A8100541                        bltui   r1,#'A',atoscr1
1375
FFFFFFFFFFFFBCB4        AC10045A                        bleui   r1,#'Z',atoscr1
1376
FFFFFFFFFFFFBCB8        AE10037A                        bgtui   r1,#'z',atoscr1
1377
FFFFFFFFFFFFBCBC        A8100261                        bltui   r1,#'a',atoscr1
1378
FFFFFFFFFFFFBCC0        0C108060                        subi    r1,r1,#0x60
1379
FFFFFFFFFFFFBCC4                                 atoscr1:
1380
FFFFFFFFFFFFBCC4        16108100                        ori             r1,r1,#0x100
1381
FFFFFFFFFFFFBCC8        37EF8000                        ret
1382 27 robfinch
 
1383
                                                 ;------------------------------------------------------------------------------
1384
                                                 ; Convert screen character to ascii character
1385
                                                 ;------------------------------------------------------------------------------
1386
                                                 ;
1387 43 robfinch
FFFFFFFFFFFFBCCC                                 ScreenToAscii:
1388
FFFFFFFFFFFFBCCC        141080FF                        andi    r1,r1,#0xff
1389
FFFFFFFFFFFFBCD0        AE10021A                        bgtui   r1,#26,stasc1
1390
FFFFFFFFFFFFBCD4        0A10803C                        addui   r1,r1,#60
1391
FFFFFFFFFFFFBCD8                                 stasc1:
1392
FFFFFFFFFFFFBCD8        37EF8000                        ret
1393 27 robfinch
 
1394
                                                 ;------------------------------------------------------------------------------
1395
                                                 ; Calculate screen memory location from CursorRow,CursorCol.
1396
                                                 ; Also refreshes the cursor location.
1397
                                                 ; Destroys r1,r2,r3
1398
                                                 ; r1 = screen location
1399
                                                 ;------------------------------------------------------------------------------
1400
                                                 ;
1401 43 robfinch
FFFFFFFFFFFFBCDC                                 CalcScreenLoc:
1402
FFFFFFFFFFFFBCDC        42009416                        lc              r1,CursorRow
1403
FFFFFFFFFFFFBCE0        1410807F                        andi    r1,r1,#0x7f
1404
FFFFFFFFFFFFBCE4        E69A0000                ; SETLO
1405
FFFFFFFFFFFFBCE8        EE800003                ; SETMID
1406
FFFFFFFFFFFFBCEC        6A0D0C2D                        lea             r3,TEXTREG
1407
FFFFFFFFFFFFBCF0        82310000                        inch    r2,TEXT_COLS[r3]
1408
FFFFFFFFFFFFBCF4        04208818                        mulu    r2,r2,r1
1409
FFFFFFFFFFFFBCF8        42009418                        lc              r1,CursorCol
1410
FFFFFFFFFFFFBCFC        1410807F                        andi    r1,r1,#0x7f
1411
FFFFFFFFFFFFBD00        04208803                        addu    r2,r2,r1
1412
FFFFFFFFFFFFBD04        92310016                        outc    r2,TEXT_CURPOS[r3]
1413
FFFFFFFFFFFFBD08        06210200                        shli    r2,r2,#1
1414
FFFFFFFFFFFFBD0C        E6900000                ; SETLO
1415
FFFFFFFFFFFFBD10        EE800003                ; SETMID
1416
FFFFFFFFFFFFBD14        042D0403                        addui   r1,r2,#TEXTSCR                  ; r1 = screen location
1417
FFFFFFFFFFFFBD18        37EF8000                        ret
1418 27 robfinch
 
1419
                                                 ;------------------------------------------------------------------------------
1420
                                                 ; Display a character on the screen
1421
                                                 ; d1.b = char to display
1422
                                                 ;------------------------------------------------------------------------------
1423
                                                 ;
1424 43 robfinch
FFFFFFFFFFFFBD1C                                 DisplayChar:
1425
FFFFFFFFFFFFBD1C        B210080D                        bnei    r1,#'\r',dccr           ; carriage return ?
1426
FFFFFFFFFFFFBD20        0FEF0020                        subui   sp,sp,#32
1427
FFFFFFFFFFFFBD24        67E08000                        sw              r1,[sp]
1428
FFFFFFFFFFFFBD28        67E10008                        sw              r2,8[sp]
1429
FFFFFFFFFFFFBD2C        67E18010                        sw              r3,16[sp]
1430
FFFFFFFFFFFFBD30        67EF8018                        sw              lr,24[sp]
1431
FFFFFFFFFFFFBD34        62001418                        sc              r0,CursorCol            ; just set cursor column to zero on a CR
1432
FFFFFFFFFFFFBD38        BE00018A                        bra             dcx7
1433
FFFFFFFFFFFFBD3C                                 dccr:
1434
FFFFFFFFFFFFBD3C        E6800091                ; SETLO
1435
FFFFFFFFFFFFBD40        BE1D0209                        bnei    r1,#0x91,dcx6           ; cursor right ?
1436
FFFFFFFFFFFFBD44        0FEF0020                        subui   sp,sp,#32
1437
FFFFFFFFFFFFBD48        67E08000                        sw              r1,[sp]
1438
FFFFFFFFFFFFBD4C        67E10008                        sw              r2,8[sp]
1439
FFFFFFFFFFFFBD50        67E18010                        sw              r3,16[sp]
1440
FFFFFFFFFFFFBD54        67EF8018                        sw              lr,24[sp]
1441
FFFFFFFFFFFFBD58        42011418                        lc              r2,CursorCol
1442
FFFFFFFFFFFFBD5C        B0200338                        beqi    r2,#56,dcx7
1443
FFFFFFFFFFFFBD60        0A210001                        addui   r2,r2,#1
1444
FFFFFFFFFFFFBD64        62011418                        sc              r2,CursorCol
1445
FFFFFFFFFFFFBD68                                 dcx7:
1446
FFFFFFFFFFFFBD68        31FFEF37                        call    CalcScreenLoc
1447
FFFFFFFFFFFFBD6C        47EF8018                        lw              lr,24[sp]
1448
FFFFFFFFFFFFBD70        47E18010                        lw              r3,16[sp]
1449
FFFFFFFFFFFFBD74        47E10008                        lw              r2,8[sp]
1450
FFFFFFFFFFFFBD78        47E08000                        lw              r1,[sp]
1451
FFFFFFFFFFFFBD7C        37EF8020                        ret             #32
1452
FFFFFFFFFFFFBD80                                 dcx6:
1453
FFFFFFFFFFFFBD80        E6800090                ; SETLO
1454
FFFFFFFFFFFFBD84        BE1D0169                        bnei    r1,#0x90,dcx8           ; cursor up ?
1455
FFFFFFFFFFFFBD88        0FEF0020                        subui   sp,sp,#32
1456
FFFFFFFFFFFFBD8C        67E08000                        sw              r1,[sp]
1457
FFFFFFFFFFFFBD90        67E10008                        sw              r2,8[sp]
1458
FFFFFFFFFFFFBD94        67E18010                        sw              r3,16[sp]
1459
FFFFFFFFFFFFBD98        67EF8018                        sw              lr,24[sp]
1460
FFFFFFFFFFFFBD9C        42011416                        lc              r2,CursorRow
1461
FFFFFFFFFFFFBDA0        B02FF200                        beqi    r2,#0,dcx7
1462
FFFFFFFFFFFFBDA4        0E210001                        subui   r2,r2,#1
1463
FFFFFFFFFFFFBDA8        62011416                        sc              r2,CursorRow
1464
FFFFFFFFFFFFBDAC        BE007DEA                        bra             dcx7
1465
FFFFFFFFFFFFBDB0                                 dcx8:
1466
FFFFFFFFFFFFBDB0        E6800093                ; SETLO
1467
FFFFFFFFFFFFBDB4        BE1D0169                        bnei    r1,#0x93,dcx9           ; cursor left ?
1468
FFFFFFFFFFFFBDB8        0FEF0020                        subui   sp,sp,#32
1469
FFFFFFFFFFFFBDBC        67E08000                        sw              r1,[sp]
1470
FFFFFFFFFFFFBDC0        67E10008                        sw              r2,8[sp]
1471
FFFFFFFFFFFFBDC4        67E18010                        sw              r3,16[sp]
1472
FFFFFFFFFFFFBDC8        67EF8018                        sw              lr,24[sp]
1473
FFFFFFFFFFFFBDCC        42011418                        lc              r2,CursorCol
1474
FFFFFFFFFFFFBDD0        B02FE600                        beqi    r2,#0,dcx7
1475
FFFFFFFFFFFFBDD4        0E210001                        subui   r2,r2,#1
1476
FFFFFFFFFFFFBDD8        62011418                        sc              r2,CursorCol
1477
FFFFFFFFFFFFBDDC        BE007C6A                        bra             dcx7
1478
FFFFFFFFFFFFBDE0                                 dcx9:
1479
FFFFFFFFFFFFBDE0        E6800092                ; SETLO
1480
FFFFFFFFFFFFBDE4        BE1D0169                        bnei    r1,#0x92,dcx10          ; cursor down ?
1481
FFFFFFFFFFFFBDE8        0FEF0020                        subui   sp,sp,#32
1482
FFFFFFFFFFFFBDEC        67E08000                        sw              r1,[sp]
1483
FFFFFFFFFFFFBDF0        67E10008                        sw              r2,8[sp]
1484
FFFFFFFFFFFFBDF4        67E18010                        sw              r3,16[sp]
1485
FFFFFFFFFFFFBDF8        67EF8018                        sw              lr,24[sp]
1486
FFFFFFFFFFFFBDFC        42011416                        lc              r2,CursorRow
1487
FFFFFFFFFFFFBE00        B02FDA1E                        beqi    r2,#30,dcx7
1488
FFFFFFFFFFFFBE04        0A210001                        addui   r2,r2,#1
1489
FFFFFFFFFFFFBE08        62011416                        sc              r2,CursorRow
1490
FFFFFFFFFFFFBE0C        BE007AEA                        bra             dcx7
1491
FFFFFFFFFFFFBE10                                 dcx10:
1492
FFFFFFFFFFFFBE10        E6800094                ; SETLO
1493
FFFFFFFFFFFFBE14        BE1D0189                        bnei    r1,#0x94,dcx11                  ; cursor home ?
1494
FFFFFFFFFFFFBE18        0FEF0020                        subui   sp,sp,#32
1495
FFFFFFFFFFFFBE1C        67E08000                        sw              r1,[sp]
1496
FFFFFFFFFFFFBE20        67E10008                        sw              r2,8[sp]
1497
FFFFFFFFFFFFBE24        67E18010                        sw              r3,16[sp]
1498
FFFFFFFFFFFFBE28        67EF8018                        sw              lr,24[sp]
1499
FFFFFFFFFFFFBE2C        42011418                        lc              r2,CursorCol
1500
FFFFFFFFFFFFBE30        BE200068                        beq             r2,r0,dcx12
1501
FFFFFFFFFFFFBE34        62001418                        sc              r0,CursorCol
1502
FFFFFFFFFFFFBE38        BE00798A                        bra             dcx7
1503
FFFFFFFFFFFFBE3C                                 dcx12:
1504
FFFFFFFFFFFFBE3C        62001416                        sc              r0,CursorRow
1505
FFFFFFFFFFFFBE40        BE00794A                        bra             dcx7
1506
FFFFFFFFFFFFBE44                                 dcx11:
1507
FFFFFFFFFFFFBE44        0FEF0030                        subui   sp,sp,#48
1508
FFFFFFFFFFFFBE48        67E08000                        sw              r1,[sp]
1509
FFFFFFFFFFFFBE4C        67E10008                        sw              r2,8[sp]
1510
FFFFFFFFFFFFBE50        67E18010                        sw              r3,16[sp]
1511
FFFFFFFFFFFFBE54        67E20018                        sw              r4,24[sp]
1512
FFFFFFFFFFFFBE58        67E28020                        sw              r5,32[sp]
1513
FFFFFFFFFFFFBE5C        67EF8028                        sw              lr,40[sp]
1514
FFFFFFFFFFFFBE60        E6800099                ; SETLO
1515
FFFFFFFFFFFFBE64        BE1D00A9                        bnei    r1,#0x99,dcx13          ; delete ?
1516
FFFFFFFFFFFFBE68        31FFEF37                        call    CalcScreenLoc
1517
FFFFFFFFFFFFBE6C        04008C09                        or              r3,r0,r1                        ; r3 = screen location
1518
FFFFFFFFFFFFBE70        42009418                        lc              r1,CursorCol            ; r1 = cursor column
1519
FFFFFFFFFFFFBE74        BE00012A                        bra             dcx5
1520
FFFFFFFFFFFFBE78                                 dcx13:
1521
FFFFFFFFFFFFBE78        B2101508                        bnei    r1,#CTRLH,dcx3          ; backspace ?
1522
FFFFFFFFFFFFBE7C        42011418                        lc              r2,CursorCol
1523
FFFFFFFFFFFFBE80        BE2003A8                        beq             r2,r0,dcx4
1524
FFFFFFFFFFFFBE84        0E210001                        subui   r2,r2,#1
1525
FFFFFFFFFFFFBE88        62011418                        sc              r2,CursorCol
1526
FFFFFFFFFFFFBE8C        31FFEF37                        call    CalcScreenLoc           ; a0 = screen location
1527
FFFFFFFFFFFFBE90        04008C09                        or              r3,r0,r1                        ; r3 = screen location
1528
FFFFFFFFFFFFBE94        42009418                        lc              r1,CursorCol
1529
FFFFFFFFFFFFBE98                                 dcx5:
1530
FFFFFFFFFFFFBE98        82310002                        inch    r2,2[r3]
1531
FFFFFFFFFFFFBE9C        92310000                        outc    r2,[r3]
1532
FFFFFFFFFFFFBEA0        0A318002                        addui   r3,r3,#2
1533
FFFFFFFFFFFFBEA4        0A108001                        addui   r1,r1,#1
1534
FFFFFFFFFFFFBEA8        E69A0000                ; SETLO
1535
FFFFFFFFFFFFBEAC        EE800003                ; SETMID
1536
FFFFFFFFFFFFBEB0        6A0D102D                        lea             r4,TEXTREG
1537
FFFFFFFFFFFFBEB4        82428000                        inch    r5,TEXT_COLS[r4]
1538
FFFFFFFFFFFFBEB8        BE12FF04                        bltu    r1,r5,dcx5
1539
FFFFFFFFFFFFBEBC        E0400020                        setlo   r1,#' '
1540
FFFFFFFFFFFFBEC0        31FFEF2B                        call    AsciiToScreen
1541
FFFFFFFFFFFFBEC4        9230FFFE                        outc    r1,-2[r3]
1542
FFFFFFFFFFFFBEC8        BE00016A                        bra             dcx4
1543
FFFFFFFFFFFFBECC                                 dcx3:
1544
FFFFFFFFFFFFBECC        B010090A                        beqi    r1,#'\n',dclf   ; linefeed ?
1545
FFFFFFFFFFFFBED0        04009009                        or              r4,r0,r1                ; save r1 in r4
1546
FFFFFFFFFFFFBED4        31FFEF37                        call    CalcScreenLoc   ; r1 = screen location
1547
FFFFFFFFFFFFBED8        04008C09                        or              r3,r0,r1                ; r3 = screen location
1548
FFFFFFFFFFFFBEDC        04020409                        or              r1,r0,r4                ; restore r1
1549
FFFFFFFFFFFFBEE0        31FFEF2B                        call    AsciiToScreen   ; convert ascii char to screen char
1550
FFFFFFFFFFFFBEE4        92308000                        outc    r1,[r3]
1551
FFFFFFFFFFFFBEE8        31FFEFC4                        call    IncCursorPos
1552
FFFFFFFFFFFFBEEC        BE00004A                        bra             dcx4
1553
FFFFFFFFFFFFBEF0                                 dclf:
1554
FFFFFFFFFFFFBEF0        31FFEFD2                        call    IncCursorRow
1555
FFFFFFFFFFFFBEF4                                 dcx4:
1556
FFFFFFFFFFFFBEF4        47EF8028                        lw              lr,40[sp]
1557
FFFFFFFFFFFFBEF8        47E28020                        lw              r5,32[sp]
1558
FFFFFFFFFFFFBEFC        47E20018                        lw              r4,24[sp]
1559
FFFFFFFFFFFFBF00        47E18010                        lw              r3,16[sp]
1560
FFFFFFFFFFFFBF04        47E10008                        lw              r2,8[sp]
1561
FFFFFFFFFFFFBF08        47E08000                        lw              r1,[sp]
1562
FFFFFFFFFFFFBF0C        37EF8030                        ret             #48
1563 27 robfinch
 
1564
 
1565
                                                 ;------------------------------------------------------------------------------
1566
                                                 ; Increment the cursor position, scroll the screen if needed.
1567
                                                 ;------------------------------------------------------------------------------
1568
                                                 ;
1569 43 robfinch
FFFFFFFFFFFFBF10                                 IncCursorPos:
1570
FFFFFFFFFFFFBF10        0FEF0020                        subui   sp,sp,#32
1571
FFFFFFFFFFFFBF14        67E08000                        sw              r1,[sp]
1572
FFFFFFFFFFFFBF18        67E10008                        sw              r2,8[sp]
1573
FFFFFFFFFFFFBF1C        67E18010                        sw              r3,16[sp]
1574
FFFFFFFFFFFFBF20        67EF8018                        sw              lr,24[sp]
1575
FFFFFFFFFFFFBF24        42009418                        lc              r1,CursorCol
1576
FFFFFFFFFFFFBF28        0A108001                        addui   r1,r1,#1
1577
FFFFFFFFFFFFBF2C        62009418                        sc              r1,CursorCol
1578
FFFFFFFFFFFFBF30        E69A0000                ; SETLO
1579
FFFFFFFFFFFFBF34        EE800003                ; SETMID
1580
FFFFFFFFFFFFBF38        6A0D0821                        inch    r2,TEXTREG+TEXT_COLS
1581
FFFFFFFFFFFFBF3C        BE110246                        bleu    r1,r2,icc1
1582
FFFFFFFFFFFFBF40        62001418                        sc              r0,CursorCol            ; column = 0
1583
FFFFFFFFFFFFBF44        BE0000CA                        bra             icr1
1584
FFFFFFFFFFFFBF48                                 IncCursorRow:
1585
FFFFFFFFFFFFBF48        0FEF0020                        subui   sp,sp,#32
1586
FFFFFFFFFFFFBF4C        67E08000                        sw              r1,[sp]
1587
FFFFFFFFFFFFBF50        67E10008                        sw              r2,8[sp]
1588
FFFFFFFFFFFFBF54        67E18010                        sw              r3,16[sp]
1589
FFFFFFFFFFFFBF58        67EF8018                        sw              lr,24[sp]
1590
FFFFFFFFFFFFBF5C                                 icr1:
1591
FFFFFFFFFFFFBF5C        42009416                        lc              r1,CursorRow
1592
FFFFFFFFFFFFBF60        0A108001                        addui   r1,r1,#1
1593
FFFFFFFFFFFFBF64        62009416                        sc              r1,CursorRow
1594
FFFFFFFFFFFFBF68        E69A0002                ; SETLO
1595
FFFFFFFFFFFFBF6C        EE800003                ; SETMID
1596
FFFFFFFFFFFFBF70        6A0D0821                        inch    r2,TEXTREG+TEXT_ROWS
1597
FFFFFFFFFFFFBF74        BE110086                        bleu    r1,r2,icc1
1598
FFFFFFFFFFFFBF78        0E210001                        subui   r2,r2,#1                        ; backup the cursor row, we are scrolling up
1599
FFFFFFFFFFFFBF7C        62011416                        sc              r2,CursorRow
1600
FFFFFFFFFFFFBF80        31FFEEF6                        call    ScrollUp
1601
FFFFFFFFFFFFBF84                                 icc1:
1602
FFFFFFFFFFFFBF84        31FFEF37                        call    CalcScreenLoc
1603
FFFFFFFFFFFFBF88        47EF8018                        lw              lr,24[sp]
1604
FFFFFFFFFFFFBF8C        47E18010                        lw              r3,16[sp]
1605
FFFFFFFFFFFFBF90        47E10008                        lw              r2,8[sp]
1606
FFFFFFFFFFFFBF94        47E08000                        lw              r1,[sp]
1607
FFFFFFFFFFFFBF98        37EF8020                        ret             #32
1608 27 robfinch
 
1609
                                                 ;------------------------------------------------------------------------------
1610
                                                 ; Display a string on the screen.
1611
                                                 ;------------------------------------------------------------------------------
1612
                                                 ;
1613 43 robfinch
FFFFFFFFFFFFBF9C                                 DisplayString:
1614
FFFFFFFFFFFFBF9C        0DEF0018                        subi    sp,sp,#24
1615
FFFFFFFFFFFFBFA0        67E08000                        sw              r1,[sp]
1616
FFFFFFFFFFFFBFA4        67E10008                        sw              r2,8[sp]
1617
FFFFFFFFFFFFBFA8        67EF8010                        sw              lr,16[sp]
1618
FFFFFFFFFFFFBFAC        02110009                        mov             r2,r1                   ; r2 = pointer to string
1619
FFFFFFFFFFFFBFB0                                 dspj1:
1620
FFFFFFFFFFFFBFB0        4A208000                        lbu             r1,[r2]                 ; move string char into r1
1621
FFFFFFFFFFFFBFB4        0A210001                        addui   r2,r2,#1                ; increment pointer
1622
FFFFFFFFFFFFBFB8        BE100068                        beq             r1,r0,dsret             ; is it end of string ?
1623
FFFFFFFFFFFFBFBC        31FFEF47                        call    DisplayChar             ; display character
1624
FFFFFFFFFFFFBFC0        BE007F8A                        bra             dspj1                   ; go back for next character
1625
FFFFFFFFFFFFBFC4                                 dsret:
1626
FFFFFFFFFFFFBFC4        47EF8010                        lw              lr,16[sp]
1627
FFFFFFFFFFFFBFC8        47E10008                        lw              r2,8[sp]
1628
FFFFFFFFFFFFBFCC        47E08000                        lw              r1,[sp]
1629
FFFFFFFFFFFFBFD0        37EF8018                        ret             #24
1630 27 robfinch
 
1631 43 robfinch
FFFFFFFFFFFFBFD4                                 DisplayStringCRLF:
1632
FFFFFFFFFFFFBFD4        0FEF0008                        subui   r30,r30,#8
1633
FFFFFFFFFFFFBFD8        67EF8000                        sw              r31,[r30]
1634
FFFFFFFFFFFFBFDC        31FFEFE7                        call    DisplayString
1635
FFFFFFFFFFFFBFE0        47EF8000                        lw              r31,[r30]
1636
FFFFFFFFFFFFBFE4        0BEF0008                        addui   r30,r30,#8
1637 27 robfinch
 
1638 43 robfinch
FFFFFFFFFFFFBFE8                                 CRLF:
1639
FFFFFFFFFFFFBFE8        0FEF0010                        subui   r30,r30,#16
1640
FFFFFFFFFFFFBFEC        67E08000                        sw              r1,[sp]
1641
FFFFFFFFFFFFBFF0        67EF8008                        sw              lr,8[sp]
1642
FFFFFFFFFFFFBFF4        E040000D                        setlo   r1,#'\r'
1643
FFFFFFFFFFFFBFF8        31FFEF47                        call    DisplayChar
1644
FFFFFFFFFFFFBFFC        E040000A                        setlo   r1,#'\n'
1645
FFFFFFFFFFFFC000        31FFEF47                        call    DisplayChar
1646
FFFFFFFFFFFFC004        47EF8008                        lw              lr,8[sp]
1647
FFFFFFFFFFFFC008        47E08000                        lw              r1,[sp]
1648
FFFFFFFFFFFFC00C        37EF8010                        ret             #16
1649 27 robfinch
 
1650
                                                 ;------------------------------------------------------------------------------
1651
                                                 ; Display nybble in r1
1652
                                                 ;------------------------------------------------------------------------------
1653
                                                 ;
1654 43 robfinch
FFFFFFFFFFFFC010                                 DisplayNybble:
1655
FFFFFFFFFFFFC010        0FEF0010                        subui   sp,sp,#16
1656
FFFFFFFFFFFFC014        67E08000                        sw              r1,[sp]
1657
FFFFFFFFFFFFC018        67EF8008                        sw              lr,8[sp]
1658
FFFFFFFFFFFFC01C        1410800F                        andi    r1,r1,#0x0F
1659
FFFFFFFFFFFFC020        0A108030                        addui   r1,r1,#'0'
1660
FFFFFFFFFFFFC024        AC100239                        bleui   r1,#'9',dispnyb1
1661
FFFFFFFFFFFFC028        0A108007                        addui   r1,r1,#7
1662
FFFFFFFFFFFFC02C                                 dispnyb1:
1663
FFFFFFFFFFFFC02C        31FFEF47                        call    DisplayChar
1664
FFFFFFFFFFFFC030        47EF8008                        lw              lr,8[sp]
1665
FFFFFFFFFFFFC034        47E08000                        lw              r1,[sp]
1666
FFFFFFFFFFFFC038        37EF8010                        ret             #16
1667 27 robfinch
 
1668
                                                 ;------------------------------------------------------------------------------
1669
                                                 ; Display the byte in r1
1670
                                                 ;------------------------------------------------------------------------------
1671
                                                 ;
1672 43 robfinch
FFFFFFFFFFFFC03C                                 DisplayByte:
1673
FFFFFFFFFFFFC03C        0FEF0010                        subui   sp,sp,#16
1674
FFFFFFFFFFFFC040        67E08000                        sw              r1,[sp]
1675
FFFFFFFFFFFFC044        67EF8008                        sw              lr,8[sp]
1676
FFFFFFFFFFFFC048        06108804                        rori    r1,r1,#4
1677
FFFFFFFFFFFFC04C        31FFF004                        call    DisplayNybble
1678
FFFFFFFFFFFFC050        06108802                        roli    r1,r1,#4
1679
FFFFFFFFFFFFC054        31FFF004                        call    DisplayNybble
1680
FFFFFFFFFFFFC058        47EF8008                        lw              lr,8[sp]
1681
FFFFFFFFFFFFC05C        47E08000                        lw              r1,[sp]
1682
FFFFFFFFFFFFC060        37EF8010                        ret             #16
1683 27 robfinch
 
1684
                                                 ;------------------------------------------------------------------------------
1685
                                                 ; Display the 64 bit word in r1
1686
                                                 ;------------------------------------------------------------------------------
1687
                                                 ;
1688 43 robfinch
FFFFFFFFFFFFC064                                 DisplayWord:
1689
FFFFFFFFFFFFC064        0FEF0018                        subui   sp,sp,#24
1690
FFFFFFFFFFFFC068        67E08000                        sw              r1,[sp]
1691
FFFFFFFFFFFFC06C        67E18008                        sw              r3,8[sp]
1692
FFFFFFFFFFFFC070        67EF8010                        sw              lr,16[sp]
1693
FFFFFFFFFFFFC074        E0C00007                        setlo   r3,#7
1694
FFFFFFFFFFFFC078                                 dspwd1:
1695
FFFFFFFFFFFFC078        06109002                        roli    r1,r1,#8
1696
FFFFFFFFFFFFC07C        31FFF00F                        call    DisplayByte
1697
FFFFFFFFFFFFC080        BE01FFCF                        loop    r3,dspwd1
1698
FFFFFFFFFFFFC084        47EF8010                        lw              lr,16[sp]
1699
FFFFFFFFFFFFC088        47E18008                        lw              r3,8[sp]
1700
FFFFFFFFFFFFC08C        47E08000                        lw              r1,[sp]
1701
FFFFFFFFFFFFC090        37EF8018                        ret             #24
1702 27 robfinch
 
1703
                                                 ;------------------------------------------------------------------------------
1704
                                                 ; Display memory pointed to by r2.
1705
                                                 ; destroys r1,r3
1706
                                                 ;------------------------------------------------------------------------------
1707
                                                 ;
1708 43 robfinch
FFFFFFFFFFFFC094                                 DisplayMem:
1709
FFFFFFFFFFFFC094        0FEF0018                        subui   sp,sp,#24
1710
FFFFFFFFFFFFC098        67E08000                        sw              r1,[sp]
1711
FFFFFFFFFFFFC09C        67E18008                        sw              r3,8[sp]
1712
FFFFFFFFFFFFC0A0        67EF8010                        sw              lr,16[sp]
1713
FFFFFFFFFFFFC0A4        E040003A                        setlo   r1,#':'
1714
FFFFFFFFFFFFC0A8        31FFEF47                        call    DisplayChar
1715
FFFFFFFFFFFFC0AC        02208009                        mov             r1,r2
1716
FFFFFFFFFFFFC0B0        31FFF019                        call    DisplayWord
1717
FFFFFFFFFFFFC0B4        E0C00007                        setlo   r3,#7
1718
FFFFFFFFFFFFC0B8                                 dspmem1:
1719
FFFFFFFFFFFFC0B8        E0400020                        setlo   r1,#' '
1720
FFFFFFFFFFFFC0BC        31FFEF47                        call    DisplayChar
1721
FFFFFFFFFFFFC0C0        40208000                        lb              r1,[r2]
1722
FFFFFFFFFFFFC0C4        31FFF00F                        call    DisplayByte
1723
FFFFFFFFFFFFC0C8        0A210001                        addui   r2,r2,#1
1724
FFFFFFFFFFFFC0CC        BE01FF6F                        loop    r3,dspmem1
1725
FFFFFFFFFFFFC0D0        31FFEFFA                        call    CRLF
1726
FFFFFFFFFFFFC0D4        47EF8010                        lw              lr,16[sp]
1727
FFFFFFFFFFFFC0D8        47E18008                        lw              r3,8[sp]
1728
FFFFFFFFFFFFC0DC        47E08000                        lw              r1,[sp]
1729
FFFFFFFFFFFFC0E0        37EF8018                        ret             #24
1730 27 robfinch
 
1731
                                                 ;------------------------------------------------------------------------------
1732
                                                 ; Converts binary number in r1 into BCD number in r2 and r1.
1733
                                                 ;------------------------------------------------------------------------------
1734
                                                 ;
1735 43 robfinch
FFFFFFFFFFFFC0E4                                 BinToBCD:
1736
FFFFFFFFFFFFC0E4        0FEF0030                        subui   sp,sp,#48
1737
FFFFFFFFFFFFC0E8        67E18000                        sw              r3,[sp]
1738
FFFFFFFFFFFFC0EC        67E20008                        sw              r4,8[sp]
1739
FFFFFFFFFFFFC0F0        67E28010                        sw              r5,16[sp]
1740
FFFFFFFFFFFFC0F4        67E30018                        sw              r6,24[sp]
1741
FFFFFFFFFFFFC0F8        67E38020                        sw              r7,32[sp]
1742
FFFFFFFFFFFFC0FC        67E40028                        sw              r8,40[sp]
1743
FFFFFFFFFFFFC100        E080000A                        setlo   r2,#10
1744
FFFFFFFFFFFFC104        E2000013                        setlo   r8,#19          ; number of digits to produce - 1
1745
FFFFFFFFFFFFC108                                 bta1:
1746
FFFFFFFFFFFFC108        04110C1C                        mod             r3,r1,r2
1747
FFFFFFFFFFFFC10C        0631F800                        shli    r3,r3,#60       ; shift result to uppermost bits
1748
FFFFFFFFFFFFC110        0653F800                        shli    r7,r5,#60       ; copy low order nybble of r5 to r4 topmost nybble
1749
FFFFFFFFFFFFC114        06420801                        shrui   r4,r4,#4
1750
FFFFFFFFFFFFC118        04439009                        or              r4,r4,r7
1751
FFFFFFFFFFFFC11C        06528801                        shrui   r5,r5,#4
1752
FFFFFFFFFFFFC120        04519409                        or              r5,r5,r3        ; copy new bcd digit into uppermost bits of r5
1753
FFFFFFFFFFFFC124        1C108000                        divui   r1,r1,r2        ; r1=r1/10
1754
FFFFFFFFFFFFC128        BE047F0F                        loop    r8,bta1
1755
FFFFFFFFFFFFC12C        06426001                        shrui   r4,r4,#48       ; right align number in register
1756
FFFFFFFFFFFFC130        06532000                        shli    r6,r5,#16
1757
FFFFFFFFFFFFC134        04431009                        or              r4,r4,r6        ; copy bits into r4
1758
FFFFFFFFFFFFC138        0652E001                        shrui   r5,r5,#48
1759
FFFFFFFFFFFFC13C        02408009                        mov             r1,r4
1760
FFFFFFFFFFFFC140        02510009                        mov             r2,r5
1761
FFFFFFFFFFFFC144        47E18000                        lw              r3,[sp]
1762
FFFFFFFFFFFFC148        47E20008                        lw              r4,8[sp]
1763
FFFFFFFFFFFFC14C        47E28010                        lw              r5,16[sp]
1764
FFFFFFFFFFFFC150        47E30018                        lw              r6,24[sp]
1765
FFFFFFFFFFFFC154        47E38020                        lw              r7,32[sp]
1766
FFFFFFFFFFFFC158        47E40028                        lw              r8,40[sp]
1767
FFFFFFFFFFFFC15C        37EF8030                        ret             #48
1768 27 robfinch
 
1769
                                                 ;------------------------------------------------------------------------------
1770
                                                 ; Converts BCD number in r1 into Ascii number in r2 and r1.
1771
                                                 ;------------------------------------------------------------------------------
1772
                                                 ;
1773 43 robfinch
FFFFFFFFFFFFC160                                 BCDToAscii:
1774
FFFFFFFFFFFFC160        0FEF0020                        subui   sp,sp,#32
1775
FFFFFFFFFFFFC164        67E18000                        sw              r3,[sp]
1776
FFFFFFFFFFFFC168        67E20008                        sw              r4,8[sp]
1777
FFFFFFFFFFFFC16C        67E28010                        sw              r5,16[sp]
1778
FFFFFFFFFFFFC170        67E40018                        sw              r8,24[sp]
1779
FFFFFFFFFFFFC174        E200000F                        setlo   r8,#15
1780
FFFFFFFFFFFFC178                                 bta2:
1781
FFFFFFFFFFFFC178        1411000F                        andi    r2,r1,#0x0F
1782
FFFFFFFFFFFFC17C        16210030                        ori             r2,r2,#0x30
1783
FFFFFFFFFFFFC180        06217000                        shli    r2,r2,#56
1784
FFFFFFFFFFFFC184        06421001                        shrui   r4,r4,#8
1785
FFFFFFFFFFFFC188        0632F000                        shli    r5,r3,#56
1786
FFFFFFFFFFFFC18C        04429009                        or              r4,r4,r5
1787
FFFFFFFFFFFFC190        06319001                        shrui   r3,r3,#8
1788
FFFFFFFFFFFFC194        04310C09                        or              r3,r3,r2
1789
FFFFFFFFFFFFC198        06108801                        shrui   r1,r1,#4
1790
FFFFFFFFFFFFC19C        BE047EEF                        loop    r8,bta2
1791
FFFFFFFFFFFFC1A0        02408009                        mov             r1,r4
1792
FFFFFFFFFFFFC1A4        02310009                        mov             r2,r3
1793
FFFFFFFFFFFFC1A8        47E18000                        lw              r3,[sp]
1794
FFFFFFFFFFFFC1AC        47E20008                        lw              r4,8[sp]
1795
FFFFFFFFFFFFC1B0        47E28010                        lw              r5,16[sp]
1796
FFFFFFFFFFFFC1B4        47E40018                        lw              r8,24[sp]
1797
FFFFFFFFFFFFC1B8        37EF8020                        ret             #32
1798 27 robfinch
 
1799
                                                 ;------------------------------------------------------------------------------
1800
                                                 ; Convert a binary number into a 20 character ascii string.
1801
                                                 ; r1 = number to convert
1802
                                                 ; r2 = address of string buffer
1803
                                                 ;------------------------------------------------------------------------------
1804
                                                 ;
1805 43 robfinch
FFFFFFFFFFFFC1BC                                 BinToStr:
1806
FFFFFFFFFFFFC1BC        0FEF0038                        subui   sp,sp,#56
1807
FFFFFFFFFFFFC1C0        67E18000                        sw              r3,[sp]
1808
FFFFFFFFFFFFC1C4        67E38008                        sw              r7,8[sp]
1809
FFFFFFFFFFFFC1C8        67E40010                        sw              r8,16[sp]
1810
FFFFFFFFFFFFC1CC        67E48018                        sw              r9,24[sp]
1811
FFFFFFFFFFFFC1D0        67E50020                        sw              r10,32[sp]
1812
FFFFFFFFFFFFC1D4        67E58028                        sw              r11,40[sp]
1813
FFFFFFFFFFFFC1D8        67EF8030                        sw              lr,48[sp]
1814
FFFFFFFFFFFFC1DC        02258009                        mov             r11,r2
1815
FFFFFFFFFFFFC1E0        31FFF039                        call    BinToBCD
1816
FFFFFFFFFFFFC1E4        02250009                        mov             r10,r2  ; save off r2
1817
FFFFFFFFFFFFC1E8        31FFF058                        call    BCDToAscii
1818
FFFFFFFFFFFFC1EC        E2400001                        setlo   r9,#1
1819
FFFFFFFFFFFFC1F0                                 btos3:
1820
FFFFFFFFFFFFC1F0        E2000007                        setlo   r8,#7
1821
FFFFFFFFFFFFC1F4                                 btos1:
1822
FFFFFFFFFFFFC1F4        06938600                        shli    r7,r9,#3
1823
FFFFFFFFFFFFC1F8        0A738000                        addui   r7,r7,r8
1824
FFFFFFFFFFFFC1FC        0A738004                        addui   r7,r7,#4
1825
FFFFFFFFFFFFC200        141180FF                        andi    r3,r1,#0xff
1826
FFFFFFFFFFFFC204        6A758C10                        sb              r3,[r7+r11]
1827
FFFFFFFFFFFFC208        06109001                        shrui   r1,r1,#8
1828
FFFFFFFFFFFFC20C        BE047F4F                        loop    r8,btos1
1829
FFFFFFFFFFFFC210        02208009                        mov             r1,r2
1830
FFFFFFFFFFFFC214        BE04FEEF                        loop    r9,btos3
1831 27 robfinch
                                                 ; the last four digits
1832 43 robfinch
FFFFFFFFFFFFC218        02A08009                        mov             r1,r10  ; get back r2
1833
FFFFFFFFFFFFC21C        31FFF058                        call    BCDToAscii
1834
FFFFFFFFFFFFC220        E2000003                        setlo   r8,#3
1835
FFFFFFFFFFFFC224                                 btos2:
1836
FFFFFFFFFFFFC224        141180FF                        andi    r3,r1,#0xff
1837
FFFFFFFFFFFFC228        6A858C10                        sb              r3,[r8+r11]
1838
FFFFFFFFFFFFC22C        06109001                        shrui   r1,r1,#8
1839
FFFFFFFFFFFFC230        BE047FAF                        loop    r8,btos2
1840
FFFFFFFFFFFFC234        60B00014                        sb              r0,20[r11]      ; null terminate
1841
FFFFFFFFFFFFC238        47E18000                        lw              r3,[sp]
1842
FFFFFFFFFFFFC23C        47E38008                        lw              r7,8[sp]
1843
FFFFFFFFFFFFC240        47E40010                        lw              r8,16[sp]
1844
FFFFFFFFFFFFC244        47E48018                        lw              r9,24[sp]
1845
FFFFFFFFFFFFC248        47E50020                        lw              r10,32[sp]
1846
FFFFFFFFFFFFC24C        47E58028                        lw              r11,40[sp]
1847
FFFFFFFFFFFFC250        47EF8030                        lw              lr,48[sp]
1848
FFFFFFFFFFFFC254        37EF8038                        ret             #56
1849 27 robfinch
 
1850
 
1851
                                                 ;==============================================================================
1852
                                                 ;==============================================================================
1853 43 robfinch
FFFFFFFFFFFFC258                                 Monitor:
1854
FFFFFFFFFFFFC258        E6BEFFF8                ; SETLO
1855
FFFFFFFFFFFFC25C        6A0D782D                        lea             sp,STACKTOP0    ; top of stack; reset the stack pointer
1856
FFFFFFFFFFFFC260        6000141C                        sb              r0,KeybdEcho    ; turn off keyboard echo
1857
FFFFFFFFFFFFC264                                 PromptLn:
1858
FFFFFFFFFFFFC264        31FFEFFA                        call    CRLF
1859
FFFFFFFFFFFFC268        E0400024                        setlo   r1,#'$'
1860
FFFFFFFFFFFFC26C        31FFEF47                        call    DisplayChar
1861 27 robfinch
 
1862
                                                 ; Get characters until a CR is keyed
1863
                                                 ;
1864 43 robfinch
FFFFFFFFFFFFC270                                 Prompt3:
1865
FFFFFFFFFFFFC270        31FFEE08                        call    KeybdGetChar
1866
FFFFFFFFFFFFC274        B01FFFFF                        beqi    r1,#-1,Prompt3  ; wait for a character
1867
FFFFFFFFFFFFC278        B010030D                        beqi    r1,#CR,Prompt1
1868
FFFFFFFFFFFFC27C        31FFEF47                        call    DisplayChar
1869
FFFFFFFFFFFFC280        BE007F8A                        bra             Prompt3
1870 27 robfinch
 
1871
                                                 ; Process the screen line that the CR was keyed on
1872
                                                 ;
1873 43 robfinch
FFFFFFFFFFFFC284                                 Prompt1:
1874
FFFFFFFFFFFFC284        62001418                        sc              r0,CursorCol    ; go back to the start of the line
1875
FFFFFFFFFFFFC288        31FFEF37                        call    CalcScreenLoc   ; r1 = screen memory location
1876
FFFFFFFFFFFFC28C        04100C09                        or              r3,r1,r0
1877
FFFFFFFFFFFFC290        82308000                        inch    r1,[r3]
1878
FFFFFFFFFFFFC294        0A318002                        addui   r3,r3,#2
1879
FFFFFFFFFFFFC298        31FFEF33                        call    ScreenToAscii
1880
FFFFFFFFFFFFC29C        B2100424                        bnei    r1,#'$',Prompt2 ; skip over '$' prompt character
1881
FFFFFFFFFFFFC2A0        82308000                        inch    r1,[r3]
1882
FFFFFFFFFFFFC2A4        0A318002                        addui   r3,r3,#2
1883
FFFFFFFFFFFFC2A8        31FFEF33                        call    ScreenToAscii
1884 27 robfinch
 
1885
                                                 ; Dispatch based on command character
1886
                                                 ;
1887 43 robfinch
FFFFFFFFFFFFC2AC                                 Prompt2:
1888
FFFFFFFFFFFFC2AC        B010563A                        beqi    r1,#':',Editmem         ; $: - edit memory
1889
FFFFFFFFFFFFC2B0        B0106344                        beqi    r1,#'D',Dumpmem         ; $D - dump memory
1890
FFFFFFFFFFFFC2B4        B012EF42                        beqi    r1,#'B',CSTART          ; $B - start tiny basic
1891
FFFFFFFFFFFFC2B8        B0105D4A                        beqi    r1,#'J',ExecuteCode     ; $J - execute code
1892
FFFFFFFFFFFFC2BC        B010914C                        beqi    r1,#'L',LoadS19         ; $L - load S19 file
1893
FFFFFFFFFFFFC2C0        B010153F                        beqi    r1,#'?',DisplayHelp     ; $? - display help
1894
FFFFFFFFFFFFC2C4        B0100743                        beqi    r1,#'C',TestCLS         ; $C - clear screen
1895
FFFFFFFFFFFFC2C8        B0100452                        beqi    r1,#'R',RandomLinesCall
1896
FFFFFFFFFFFFC2CC        B012B849                        beqi    r1,#'I',Invaders
1897
FFFFFFFFFFFFC2D0        B011A350                        beqi    r1,#'P',Piano
1898
FFFFFFFFFFFFC2D4        BE007C2A                        bra             Monitor
1899 27 robfinch
 
1900 43 robfinch
FFFFFFFFFFFFC2D8                                 RandomLinesCall:
1901
FFFFFFFFFFFFC2D8        31FFF1BC                        call    RandomLines
1902
FFFFFFFFFFFFC2DC        BE007BEA                        bra             Monitor
1903
 
1904
FFFFFFFFFFFFC2E0                                 TestCLS:
1905
FFFFFFFFFFFFC2E0        82308000                        inch    r1,[r3]
1906
FFFFFFFFFFFFC2E4        0A318002                        addui   r3,r3,#2
1907
FFFFFFFFFFFFC2E8        31FFEF33                        call    ScreenToAscii
1908
FFFFFFFFFFFFC2EC        B21FDB4C                        bnei    r1,#'L',Monitor
1909
FFFFFFFFFFFFC2F0        82308000                        inch    r1,[r3]
1910
FFFFFFFFFFFFC2F4        0A318002                        addui   r3,r3,#2
1911
FFFFFFFFFFFFC2F8        31FFEF33                        call    ScreenToAscii
1912
FFFFFFFFFFFFC2FC        B21FD753                        bnei    r1,#'S',Monitor
1913
FFFFFFFFFFFFC300        31FFEED9                        call    ClearScreen
1914
FFFFFFFFFFFFC304        60001418                        sb              r0,CursorCol
1915
FFFFFFFFFFFFC308        60001416                        sb              r0,CursorRow
1916
FFFFFFFFFFFFC30C        31FFEF37                        call    CalcScreenLoc
1917
FFFFFFFFFFFFC310        BE007A4A                        bra             Monitor
1918 10 robfinch
 
1919 43 robfinch
FFFFFFFFFFFFC314                                 DisplayHelp:
1920
FFFFFFFFFFFFC314        E07FC320                        setlo   r1,HelpMsg
1921
FFFFFFFFFFFFC318        31FFEFE7                        call    DisplayString
1922
FFFFFFFFFFFFC31C        BE0079EA                        bra             Monitor
1923 10 robfinch
 
1924 43 robfinch
FFFFFFFFFFFFC320                                        align   16
1925
FFFFFFFFFFFFC320                                 HelpMsg:
1926
FFFFFFFFFFFFC320 70736944203D203F               db      "? = Display help",CR,LF
1927
FFFFFFFFFFFFC328 706C65682079616C
1928
FFFFFFFFFFFFC330 203D20534C430A0D               db      "CLS = clear screen",CR,LF
1929
FFFFFFFFFFFFC338 6373207261656C63
1930
FFFFFFFFFFFFC340 203A0A0D6E656572               db      ": = Edit memory bytes",CR,LF
1931
FFFFFFFFFFFFC348 6D2074696445203D
1932
FFFFFFFFFFFFC350 79622079726F6D65
1933
FFFFFFFFFFFFC358 3D204C0A0D736574               db      "L = Load S19 file",CR,LF
1934
FFFFFFFFFFFFC360 31532064616F4C20
1935
FFFFFFFFFFFFC368 0A0D656C69662039
1936
FFFFFFFFFFFFC370 706D7544203D2044               db      "D = Dump memory",CR,LF
1937
FFFFFFFFFFFFC378 0D79726F6D656D20
1938
FFFFFFFFFFFFC380 617473203D20420A               db      "B = start tiny basic",CR,LF
1939
FFFFFFFFFFFFC388 20796E6974207472
1940
FFFFFFFFFFFFC390 4A0A0D6369736162               db      "J = Jump to code",CR,LF
1941
FFFFFFFFFFFFC398 20706D754A203D20
1942
FFFFFFFFFFFFC3A0 0D65646F63206F74
1943
FFFFFFFFFFFFC3A8 766E49203D20490A               db      "I = Invaders",CR,LF
1944
FFFFFFFFFFFFC3B0 520A0D7372656461               db      "R = Random lines",CR,LF
1945
FFFFFFFFFFFFC3B8 6F646E6152203D20
1946
FFFFFFFFFFFFC3C0 0D73656E696C206D
1947
FFFFFFFFFFFFC3C8 616950203D20500A               db      "P = Piano",CR,LF,0
1948
FFFFFFFFFFFFC3D0 000000000A0D6F6E               align   16
1949
FFFFFFFFFFFFC3D8 0000000000000000
1950
FFFFFFFFFFFFC3E0                                        align   16
1951 27 robfinch
 
1952
                                                 ;------------------------------------------------------------------------------
1953
                                                 ; Ignore blanks in the input
1954
                                                 ; r3 = text pointer
1955
                                                 ; r1 destroyed
1956
                                                 ;------------------------------------------------------------------------------
1957
                                                 ;
1958 43 robfinch
FFFFFFFFFFFFC3E0                                 ignBlanks:
1959
FFFFFFFFFFFFC3E0        0FEF0008                        subui   sp,sp,#8
1960
FFFFFFFFFFFFC3E4        67EF8000                        sw              r31,[sp]
1961
FFFFFFFFFFFFC3E8                                 ignBlanks1:
1962
FFFFFFFFFFFFC3E8        82308000                        inch    r1,[r3]
1963
FFFFFFFFFFFFC3EC        0A318002                        addui   r3,r3,#2
1964
FFFFFFFFFFFFC3F0        31FFEF33                        call    ScreenToAscii
1965
FFFFFFFFFFFFC3F4        B01FFD20                        beqi    r1,#' ',ignBlanks1
1966
FFFFFFFFFFFFC3F8        0E318002                        subui   r3,r3,#2
1967
FFFFFFFFFFFFC3FC        47EF8000                        lw              r31,[sp]
1968
FFFFFFFFFFFFC400        37EF8008                        ret             #8
1969 27 robfinch
 
1970
                                                 ;------------------------------------------------------------------------------
1971
                                                 ; Edit memory byte(s).
1972
                                                 ;------------------------------------------------------------------------------
1973
                                                 ;
1974 43 robfinch
FFFFFFFFFFFFC404                                 EditMem:
1975
FFFFFFFFFFFFC404        31FFF0F8                        call    ignBlanks
1976
FFFFFFFFFFFFC408        31FFF11C                        call    GetHexNumber
1977
FFFFFFFFFFFFC40C        04101409                        or              r5,r1,r0
1978
FFFFFFFFFFFFC410        E1000007                        setlo   r4,#7
1979
FFFFFFFFFFFFC414                                 edtmem1:
1980
FFFFFFFFFFFFC414        31FFF0F8                        call    ignBlanks
1981
FFFFFFFFFFFFC418        31FFF11C                        call    GetHexNumber
1982
FFFFFFFFFFFFC41C        60508000                        sb              r1,[r5]
1983
FFFFFFFFFFFFC420        0A528001                        addui   r5,r5,#1
1984
FFFFFFFFFFFFC424        BE027F8F                        loop    r4,edtmem1
1985
FFFFFFFFFFFFC428        BE00718A                        bra             Monitor
1986 27 robfinch
 
1987
                                                 ;------------------------------------------------------------------------------
1988
                                                 ; Execute code at the specified address.
1989
                                                 ;------------------------------------------------------------------------------
1990
                                                 ;
1991 43 robfinch
FFFFFFFFFFFFC42C                                 ExecuteCode:
1992
FFFFFFFFFFFFC42C        31FFF0F8                        call    ignBlanks
1993
FFFFFFFFFFFFC430        31FFF11C                        call    GetHexNumber
1994
FFFFFFFFFFFFC434        341F8000                        jal             r31,[r1]
1995
FFFFFFFFFFFFC438        BE00710A                        bra     Monitor
1996 27 robfinch
 
1997
                                                 ;------------------------------------------------------------------------------
1998
                                                 ; Do a memory dump of the requested location.
1999
                                                 ;------------------------------------------------------------------------------
2000
                                                 ;
2001 43 robfinch
FFFFFFFFFFFFC43C                                 DumpMem:
2002
FFFFFFFFFFFFC43C        31FFF0F8                        call    ignBlanks
2003
FFFFFFFFFFFFC440        31FFF11C                        call    GetHexNumber
2004
FFFFFFFFFFFFC444        02110009                        mov             r2,r1
2005
FFFFFFFFFFFFC448        31FFEFFA                        call    CRLF
2006
FFFFFFFFFFFFC44C        31FFF025                        call    DisplayMem
2007
FFFFFFFFFFFFC450        31FFF025                        call    DisplayMem
2008
FFFFFFFFFFFFC454        31FFF025                        call    DisplayMem
2009
FFFFFFFFFFFFC458        31FFF025                        call    DisplayMem
2010
FFFFFFFFFFFFC45C        31FFF025                        call    DisplayMem
2011
FFFFFFFFFFFFC460        31FFF025                        call    DisplayMem
2012
FFFFFFFFFFFFC464        31FFF025                        call    DisplayMem
2013
FFFFFFFFFFFFC468        31FFF025                        call    DisplayMem
2014
FFFFFFFFFFFFC46C        BE006F6A                        bra             Monitor
2015 27 robfinch
 
2016
                                                 ;------------------------------------------------------------------------------
2017
                                                 ; Get a hexidecimal number. Maximum of sixteen digits.
2018
                                                 ; R3 = text pointer (updated)
2019 43 robfinch
                                                 ; R1 = hex number
2020 27 robfinch
                                                 ;------------------------------------------------------------------------------
2021
                                                 ;
2022 43 robfinch
FFFFFFFFFFFFC470                                 GetHexNumber:
2023
FFFFFFFFFFFFC470        0FEF0018                        subui   sp,sp,#24
2024
FFFFFFFFFFFFC474        67E10000                        sw              r2,[sp]
2025
FFFFFFFFFFFFC478        67E20008                        sw              r4,8[sp]
2026
FFFFFFFFFFFFC47C        67EF8010                        sw              lr,16[sp]
2027
FFFFFFFFFFFFC480        E0800000                        setlo   r2,#0
2028
FFFFFFFFFFFFC484        E100000F                        setlo   r4,#15
2029
FFFFFFFFFFFFC488                                 gthxn2:
2030
FFFFFFFFFFFFC488        82308000                        inch    r1,[r3]
2031
FFFFFFFFFFFFC48C        0A318002                        addui   r3,r3,#2
2032
FFFFFFFFFFFFC490        31FFEF33                        call    ScreenToAscii
2033
FFFFFFFFFFFFC494        31FFF130                        call    AsciiToHexNybble
2034
FFFFFFFFFFFFC498        B01005FF                        beqi    r1,#-1,gthxn1
2035
FFFFFFFFFFFFC49C        06210800                        shli    r2,r2,#4
2036
FFFFFFFFFFFFC4A0        1410800F                        andi    r1,r1,#0x0f
2037
FFFFFFFFFFFFC4A4        04208809                        or              r2,r2,r1
2038
FFFFFFFFFFFFC4A8        BE027F0F                        loop    r4,gthxn2
2039
FFFFFFFFFFFFC4AC                                 gthxn1:
2040
FFFFFFFFFFFFC4AC        02208009                        mov             r1,r2
2041
FFFFFFFFFFFFC4B0        47EF8010                        lw              lr,16[sp]
2042
FFFFFFFFFFFFC4B4        47E20008                        lw              r4,8[sp]
2043
FFFFFFFFFFFFC4B8        47E10000                        lw              r2,[sp]
2044
FFFFFFFFFFFFC4BC        37EF8018                        ret             #24
2045 27 robfinch
 
2046
                                                 ;------------------------------------------------------------------------------
2047
                                                 ; Convert ASCII character in the range '0' to '9', 'a' to 'f' or 'A' to 'F'
2048
                                                 ; to a hex nybble.
2049
                                                 ;------------------------------------------------------------------------------
2050
                                                 ;
2051 43 robfinch
FFFFFFFFFFFFC4C0                                 AsciiToHexNybble:
2052
FFFFFFFFFFFFC4C0        A8100E30                        bltui   r1,#'0',gthx3
2053
FFFFFFFFFFFFC4C4        AE100339                        bgtui   r1,#'9',gthx5
2054
FFFFFFFFFFFFC4C8        0E108030                        subui   r1,r1,#'0'
2055
FFFFFFFFFFFFC4CC        37EF8000                        ret
2056
FFFFFFFFFFFFC4D0                                 gthx5:
2057
FFFFFFFFFFFFC4D0        A8100A41                        bltui   r1,#'A',gthx3
2058
FFFFFFFFFFFFC4D4        AE100446                        bgtui   r1,#'F',gthx6
2059
FFFFFFFFFFFFC4D8        0E108041                        subui   r1,r1,#'A'
2060
FFFFFFFFFFFFC4DC        0A10800A                        addui   r1,r1,#10
2061
FFFFFFFFFFFFC4E0        37EF8000                        ret
2062
FFFFFFFFFFFFC4E4                                 gthx6:
2063
FFFFFFFFFFFFC4E4        A8100561                        bltui   r1,#'a',gthx3
2064
FFFFFFFFFFFFC4E8        AE100466                        bgtui   r1,#'f',gthx3
2065
FFFFFFFFFFFFC4EC        0E108061                        subui   r1,r1,#'a'
2066
FFFFFFFFFFFFC4F0        0A10800A                        addui   r1,r1,#10
2067
FFFFFFFFFFFFC4F4        37EF8000                        ret
2068
FFFFFFFFFFFFC4F8                                 gthx3:
2069
FFFFFFFFFFFFC4F8        E07FFFFF                        setlo   r1,#-1          ; not a hex number
2070
FFFFFFFFFFFFC4FC        37EF8000                        ret
2071 27 robfinch
 
2072 10 robfinch
                                                 ;==============================================================================
2073 27 robfinch
                                                 ; Load an S19 format file
2074
                                                 ;==============================================================================
2075
                                                 ;
2076 43 robfinch
FFFFFFFFFFFFC500                                 LoadS19:
2077
FFFFFFFFFFFFC500        BE00006A                        bra             ProcessRec
2078
FFFFFFFFFFFFC504                                 NextRec:
2079
FFFFFFFFFFFFC504        31FFF1B2                        call    sGetChar
2080
FFFFFFFFFFFFC508        B21FFF0A                        bne             r1,#LF,NextRec
2081
FFFFFFFFFFFFC50C                                 ProcessRec:
2082
FFFFFFFFFFFFC50C        31FFF1B2                        call    sGetChar
2083
FFFFFFFFFFFFC510        B01F521A                        beqi    r1,#26,Monitor  ; CTRL-Z ?
2084
FFFFFFFFFFFFC514        B21FFC53                        bnei    r1,#'S',NextRec
2085
FFFFFFFFFFFFC518        31FFF1B2                        call    sGetChar
2086
FFFFFFFFFFFFC51C        A01FFA30                        blt             r1,#'0',NextRec
2087
FFFFFFFFFFFFC520        A61FF939                        bgt             r1,#'9',NextRec
2088
FFFFFFFFFFFFC524        04101009                        or              r4,r1,r0                ; r4 = record type
2089
FFFFFFFFFFFFC528        31FFF1B2                        call    sGetChar
2090
FFFFFFFFFFFFC52C        31FFF130                        call    AsciiToHexNybble
2091
FFFFFFFFFFFFC530        04100809                        or              r2,r1,r0
2092
FFFFFFFFFFFFC534        31FFF1B2                        call    sGetChar
2093
FFFFFFFFFFFFC538        31FFF130                        call    AsciiToHexNybble
2094
FFFFFFFFFFFFC53C        06210800                        shli    r2,r2,#4
2095
FFFFFFFFFFFFC540        04208809                        or              r2,r2,r1                ; r2 = byte count
2096
FFFFFFFFFFFFC544        04208C09                        or              r3,r2,r1                ; r3 = byte count
2097
FFFFFFFFFFFFC548        B04FEF30                        beqi    r4,#'0',NextRec ; manufacturer ID record, ignore
2098
FFFFFFFFFFFFC54C        B0401E31                        beqi    r4,#'1',ProcessS1
2099
FFFFFFFFFFFFC550        B0401F32                        beqi    r4,#'2',ProcessS2
2100
FFFFFFFFFFFFC554        B0402033                        beqi    r4,#'3',ProcessS3
2101
FFFFFFFFFFFFC558        B04FEB35                        beqi    r4,#'5',NextRec ; record count record, ignore
2102
FFFFFFFFFFFFC55C        B0402037                        beqi    r4,#'7',ProcessS7
2103
FFFFFFFFFFFFC560        B0402238                        beqi    r4,#'8',ProcessS8
2104
FFFFFFFFFFFFC564        B0402439                        beqi    r4,#'9',ProcessS9
2105
FFFFFFFFFFFFC568        BE007CEA                        bra             NextRec
2106 27 robfinch
 
2107 43 robfinch
FFFFFFFFFFFFC56C                                 pcssxa:
2108
FFFFFFFFFFFFC56C        143180FF                        andi    r3,r3,#0xff
2109
FFFFFFFFFFFFC570        0E318001                        subui   r3,r3,#1                ; one less for loop
2110
FFFFFFFFFFFFC574                                 pcss1a:
2111
FFFFFFFFFFFFC574        31FFF1B2                        call    sGetChar
2112
FFFFFFFFFFFFC578        31FFF130                        call    AsciiToHexNybble
2113
FFFFFFFFFFFFC57C        06210800                        shli    r2,r2,#4
2114
FFFFFFFFFFFFC580        04208809                        or              r2,r2,r1
2115
FFFFFFFFFFFFC584        31FFF1B2                        call    sGetChar
2116
FFFFFFFFFFFFC588        31FFF130                        call    AsciiToHexNybble
2117
FFFFFFFFFFFFC58C        06210800                        shli    r2,r2,#4
2118
FFFFFFFFFFFFC590        04208809                        or              r2,r2,r1
2119
FFFFFFFFFFFFC594        60510000                        sb              r2,[r5]
2120
FFFFFFFFFFFFC598        0A528001                        addui   r5,r5,#1
2121
FFFFFFFFFFFFC59C        BE01FECF                        loop    r3,pcss1a
2122 27 robfinch
                                                 ; Get the checksum byte
2123 43 robfinch
FFFFFFFFFFFFC5A0        31FFF1B2                        call    sGetChar
2124
FFFFFFFFFFFFC5A4        31FFF130                        call    AsciiToHexNybble
2125
FFFFFFFFFFFFC5A8        06210800                        shli    r2,r2,#4
2126
FFFFFFFFFFFFC5AC        04208809                        or              r2,r2,r1
2127
FFFFFFFFFFFFC5B0        31FFF1B2                        call    sGetChar
2128
FFFFFFFFFFFFC5B4        31FFF130                        call    AsciiToHexNybble
2129
FFFFFFFFFFFFC5B8        06210800                        shli    r2,r2,#4
2130
FFFFFFFFFFFFC5BC        04208809                        or              r2,r2,r1
2131
FFFFFFFFFFFFC5C0        BE007A2A                        bra             NextRec
2132 27 robfinch
 
2133 43 robfinch
FFFFFFFFFFFFC5C4                                 ProcessS1:
2134
FFFFFFFFFFFFC5C4        31FFF180                        call    S19Get16BitAddress
2135
FFFFFFFFFFFFC5C8        BE007D2A                        bra             pcssxa
2136
FFFFFFFFFFFFC5CC                                 ProcessS2:
2137
FFFFFFFFFFFFC5CC        31FFF186                        call    S19Get24BitAddress
2138
FFFFFFFFFFFFC5D0        BE007CEA                        bra             pcssxa
2139
FFFFFFFFFFFFC5D4                                 ProcessS3:
2140
FFFFFFFFFFFFC5D4        31FFF18C                        call    S19Get32BitAddress
2141
FFFFFFFFFFFFC5D8        BE007CAA                        bra             pcssxa
2142
FFFFFFFFFFFFC5DC                                 ProcessS7:
2143
FFFFFFFFFFFFC5DC        31FFF18C                        call    S19Get32BitAddress
2144
FFFFFFFFFFFFC5E0        66028000                        sw              r5,S19StartAddress
2145
FFFFFFFFFFFFC5E4        BE0063AA                        bra             Monitor
2146
FFFFFFFFFFFFC5E8                                 ProcessS8:
2147
FFFFFFFFFFFFC5E8        31FFF186                        call    S19Get24BitAddress
2148
FFFFFFFFFFFFC5EC        66028000                        sw              r5,S19StartAddress
2149
FFFFFFFFFFFFC5F0        BE00634A                        bra             Monitor
2150
FFFFFFFFFFFFC5F4                                 ProcessS9:
2151
FFFFFFFFFFFFC5F4        31FFF180                        call    S19Get16BitAddress
2152
FFFFFFFFFFFFC5F8        66028000                        sw              r5,S19StartAddress
2153
FFFFFFFFFFFFC5FC        BE0062EA                        bra             Monitor
2154 27 robfinch
 
2155 43 robfinch
FFFFFFFFFFFFC600                                 S19Get16BitAddress:
2156
FFFFFFFFFFFFC600        0FEF0008                        subui   sp,sp,#8
2157
FFFFFFFFFFFFC604        67EF8000                        sw              r31,[sp]
2158
FFFFFFFFFFFFC608        31FFF1B2                        call    sGetChar
2159
FFFFFFFFFFFFC60C        31FFF130                        call    AsciiToHexNybble
2160
FFFFFFFFFFFFC610        04100809                        or              r2,r1,r0
2161
FFFFFFFFFFFFC614        BE00038A                        bra             S1932b
2162 27 robfinch
 
2163 43 robfinch
FFFFFFFFFFFFC618                                 S19Get24BitAddress:
2164
FFFFFFFFFFFFC618        0FEF0008                        subui   sp,sp,#8
2165
FFFFFFFFFFFFC61C        67EF8000                        sw              r31,[sp]
2166
FFFFFFFFFFFFC620        31FFF1B2                        call    sGetChar
2167
FFFFFFFFFFFFC624        31FFF130                        call    AsciiToHexNybble
2168
FFFFFFFFFFFFC628        04100809                        or              r2,r1,r0
2169
FFFFFFFFFFFFC62C        BE0001CA                        bra             S1932a
2170 27 robfinch
 
2171 43 robfinch
FFFFFFFFFFFFC630                                 S19Get32BitAddress:
2172
FFFFFFFFFFFFC630        0FEF0008                        subui   sp,sp,#8
2173
FFFFFFFFFFFFC634        67EF8000                        sw              r31,[sp]
2174
FFFFFFFFFFFFC638        31FFF1B2                        call    sGetChar
2175
FFFFFFFFFFFFC63C        31FFF130                        call    AsciiToHexNybble
2176
FFFFFFFFFFFFC640        04100809                        or              r2,r1,r0
2177
FFFFFFFFFFFFC644        31FFF1B2                        call    sGetChar
2178
FFFFFFFFFFFFC648        31FFF130                        call    AsciiToHexNybble
2179
FFFFFFFFFFFFC64C        06210800                        shli    r2,r2,#4
2180
FFFFFFFFFFFFC650        04110809                        or              r2,r1,r2
2181
FFFFFFFFFFFFC654        31FFF1B2                        call    sGetChar
2182
FFFFFFFFFFFFC658        31FFF130                        call    AsciiToHexNybble
2183
FFFFFFFFFFFFC65C        06210800                        shli    r2,r2,#4
2184
FFFFFFFFFFFFC660        04208809                        or              r2,r2,r1
2185
FFFFFFFFFFFFC664                                 S1932a:
2186
FFFFFFFFFFFFC664        31FFF1B2                        call    sGetChar
2187
FFFFFFFFFFFFC668        31FFF130                        call    AsciiToHexNybble
2188
FFFFFFFFFFFFC66C        06210800                        shli    r2,r2,#4
2189
FFFFFFFFFFFFC670        04208809                        or              r2,r2,r1
2190
FFFFFFFFFFFFC674        31FFF1B2                        call    sGetChar
2191
FFFFFFFFFFFFC678        31FFF130                        call    AsciiToHexNybble
2192
FFFFFFFFFFFFC67C        06210800                        shli    r2,r2,#4
2193
FFFFFFFFFFFFC680        04208809                        or              r2,r2,r1
2194
FFFFFFFFFFFFC684                                 S1932b:
2195
FFFFFFFFFFFFC684        31FFF1B2                        call    sGetChar
2196
FFFFFFFFFFFFC688        31FFF130                        call    AsciiToHexNybble
2197
FFFFFFFFFFFFC68C        06210800                        shli    r2,r2,#4
2198
FFFFFFFFFFFFC690        04208809                        or              r2,r2,r1
2199
FFFFFFFFFFFFC694        31FFF1B2                        call    sGetChar
2200
FFFFFFFFFFFFC698        31FFF130                        call    AsciiToHexNybble
2201
FFFFFFFFFFFFC69C        06210800                        shli    r2,r2,#4
2202
FFFFFFFFFFFFC6A0        04208809                        or              r2,r2,r1
2203
FFFFFFFFFFFFC6A4        31FFF1B2                        call    sGetChar
2204
FFFFFFFFFFFFC6A8        31FFF130                        call    AsciiToHexNybble
2205
FFFFFFFFFFFFC6AC        06210800                        shli    r2,r2,#4
2206
FFFFFFFFFFFFC6B0        04208809                        or              r2,r2,r1
2207
FFFFFFFFFFFFC6B4        0442100A                        xor             r4,r4,r4
2208
FFFFFFFFFFFFC6B8        04201409                        or              r5,r2,r0
2209
FFFFFFFFFFFFC6BC        47EF8000                        lw              r31,[sp]
2210
FFFFFFFFFFFFC6C0        0BEF0008                        addui   sp,sp,#8
2211
FFFFFFFFFFFFC6C4        37EF8000                        ret
2212 27 robfinch
 
2213
                                                 ;------------------------------------------------------------------------------
2214
                                                 ; Get a character from auxillary input, checking the keyboard status for a
2215
                                                 ; CTRL-C
2216
                                                 ;------------------------------------------------------------------------------
2217
                                                 ;
2218 43 robfinch
FFFFFFFFFFFFC6C8                                 sGetChar:
2219
FFFFFFFFFFFFC6C8        0FEF0008                        subui   sp,sp,#8
2220
FFFFFFFFFFFFC6CC        67EF8000                        sw              r31,[sp]
2221
FFFFFFFFFFFFC6D0                                 sgc2:
2222
FFFFFFFFFFFFC6D0        31FFEE1D                        call    KeybdCheckForKey
2223
FFFFFFFFFFFFC6D4        BE106908                        beq             r1,r0,sgc1
2224
FFFFFFFFFFFFC6D8        31FFEE08                        call    KeybdGetchar
2225
FFFFFFFFFFFFC6DC        B01EDF00                        beqi    r1,#CRTLC,Monitor
2226
FFFFFFFFFFFFC6E0                                 sgc1:
2227
FFFFFFFFFFFFC6E0        31FFF95C                        call    AUXIN
2228
FFFFFFFFFFFFC6E4        BE107F62                        ble             r1,r0,sgc2
2229
FFFFFFFFFFFFC6E8        47EF8000                        lw              r31,[sp]
2230
FFFFFFFFFFFFC6EC        37EF8008                        ret             #8
2231 27 robfinch
 
2232
                                                 ;--------------------------------------------------------------------------
2233 43 robfinch
                                                 ; Draw random lines on the bitmap screen.
2234
                                                 ;--------------------------------------------------------------------------
2235
FFFFFFFFFFFFC6F0                                 RandomLines:
2236
FFFFFFFFFFFFC6F0        0FEF0018                        subui   sp,sp,#24
2237
FFFFFFFFFFFFC6F4        67E08000                        sw              r1,[sp]
2238
FFFFFFFFFFFFC6F8        67E18008                        sw              r3,8[sp]
2239
FFFFFFFFFFFFC6FC        67EF8010                        sw              lr,16[sp]
2240
FFFFFFFFFFFFC700                                 rl5:
2241
FFFFFFFFFFFFC700        00000050                        gran
2242
FFFFFFFFFFFFC704        020088A8                        mfspr   r1,rand                 ; select a random color
2243
FFFFFFFFFFFFC708        E69AE000                ; SETLO
2244
FFFFFFFFFFFFC70C        EE800003                ; SETMID
2245
FFFFFFFFFFFFC710        6A0D042A                        outh    r1,GACCEL
2246
FFFFFFFFFFFFC714                                 rl1:                                           ; random X0
2247
FFFFFFFFFFFFC714        00000050                        gran
2248
FFFFFFFFFFFFC718        020088A8                        mfspr   r1,rand
2249
FFFFFFFFFFFFC71C        16018554                        lw              r3,#1364
2250
FFFFFFFFFFFFC720        0411841C                        mod             r1,r1,r3
2251
FFFFFFFFFFFFC724        E69AE008                ; SETLO
2252
FFFFFFFFFFFFC728        EE800003                ; SETMID
2253
FFFFFFFFFFFFC72C        6A0D042A                        outh    r1,GACCEL+8
2254
FFFFFFFFFFFFC730                                 rl2:                                           ; random X1
2255
FFFFFFFFFFFFC730        00000050                        gran
2256
FFFFFFFFFFFFC734        020088A8                        mfspr   r1,rand
2257
FFFFFFFFFFFFC738        16018554                        lw              r3,#1364
2258
FFFFFFFFFFFFC73C        0411841C                        mod             r1,r1,r3
2259
FFFFFFFFFFFFC740        E69AE010                ; SETLO
2260
FFFFFFFFFFFFC744        EE800003                ; SETMID
2261
FFFFFFFFFFFFC748        6A0D042A                        outh    r1,GACCEL+16
2262
FFFFFFFFFFFFC74C                                 rl3:                                           ; random Y0
2263
FFFFFFFFFFFFC74C        00000050                        gran
2264
FFFFFFFFFFFFC750        020088A8                        mfspr   r1,rand
2265
FFFFFFFFFFFFC754        16018300                        lw              r3,#768
2266
FFFFFFFFFFFFC758        0411841C                        mod             r1,r1,r3
2267
FFFFFFFFFFFFC75C        E69AE00C                ; SETLO
2268
FFFFFFFFFFFFC760        EE800003                ; SETMID
2269
FFFFFFFFFFFFC764        6A0D042A                        outh    r1,GACCEL+12
2270
FFFFFFFFFFFFC768                                 rl4:                                           ; random Y1
2271
FFFFFFFFFFFFC768        00000050                        gran
2272
FFFFFFFFFFFFC76C        020088A8                        mfspr   r1,rand
2273
FFFFFFFFFFFFC770        16018300                        lw              r3,#768
2274
FFFFFFFFFFFFC774        0411841C                        mod             r1,r1,r3
2275
FFFFFFFFFFFFC778        E69AE014                ; SETLO
2276
FFFFFFFFFFFFC77C        EE800003                ; SETMID
2277
FFFFFFFFFFFFC780        6A0D042A                        outh    r1,GACCEL+20
2278
FFFFFFFFFFFFC784        E0400002                        setlo   r1,#2                   ; draw line command
2279
FFFFFFFFFFFFC788        E69AE03C                ; SETLO
2280
FFFFFFFFFFFFC78C        EE800003                ; SETMID
2281
FFFFFFFFFFFFC790        6A0D042A                        outh    r1,GACCEL+60
2282
FFFFFFFFFFFFC794                                 rl8:
2283
FFFFFFFFFFFFC794        31FFEE08                        call    KeybdGetChar
2284
FFFFFFFFFFFFC798        B0100303                        beqi    r1,#CTRLC,rl7
2285
FFFFFFFFFFFFC79C        B01FD972                        beqi    r1,#'r',rl5
2286
FFFFFFFFFFFFC7A0        BE007FAA                        bra             rl8
2287
FFFFFFFFFFFFC7A4                                 rl7:
2288
FFFFFFFFFFFFC7A4        47EF8010                        lw              lr,16[sp]
2289
FFFFFFFFFFFFC7A8        47E18008                        lw              r3,8[sp]
2290
FFFFFFFFFFFFC7AC        47E08000                        lw              r1,[sp]
2291
FFFFFFFFFFFFC7B0        37EF8018                        ret             #24
2292
 
2293
                                                 ;--------------------------------------------------------------------------
2294
                                                 ; Initialize sprite image caches with random data.
2295
                                                 ;--------------------------------------------------------------------------
2296
FFFFFFFFFFFFC7B4                                 RandomizeSprram:
2297
FFFFFFFFFFFFC7B4        E6980000                ; SETLO
2298
FFFFFFFFFFFFC7B8        EE800003                ; SETMID
2299
FFFFFFFFFFFFC7BC        6A0D082D                        lea             r2,SPRRAM
2300
FFFFFFFFFFFFC7C0        E10037FF                        setlo   r4,#14335               ; number of chars to initialize
2301
FFFFFFFFFFFFC7C4                                 rsr1:
2302
FFFFFFFFFFFFC7C4        00000050                        gran
2303
FFFFFFFFFFFFC7C8        020088A8                        mfspr   r1,rand
2304
FFFFFFFFFFFFC7CC        92208000                        outc    r1,[r2]
2305
FFFFFFFFFFFFC7D0        0A210002                        addui   r2,r2,#2
2306
FFFFFFFFFFFFC7D4        BE027F8F                        loop    r4,rsr1
2307
FFFFFFFFFFFFC7D8        37EF8000                        ret
2308
 
2309
                                                 ;--------------------------------------------------------------------------
2310
                                                 ; Setup the AC97/LM4550 audio controller. Check keyboard for a CTRL-C
2311
                                                 ; interrupt which may be necessary if the audio controller isn't
2312
                                                 ; responding.
2313
                                                 ;--------------------------------------------------------------------------
2314
                                                 ;
2315
FFFFFFFFFFFFC7DC                                 SetupAC97:
2316
FFFFFFFFFFFFC7DC        0FEF0010                        subui   sp,sp,#16
2317
FFFFFFFFFFFFC7E0        67E08000                        sw              r1,[sp]
2318
FFFFFFFFFFFFC7E4        67EF8008                        sw              lr,8[sp]
2319
FFFFFFFFFFFFC7E8                                 sac974:
2320
FFFFFFFFFFFFC7E8        E69C1026                ; SETLO
2321
FFFFFFFFFFFFC7EC        EE800003                ; SETMID
2322
FFFFFFFFFFFFC7F0        6A0D0029                        outc    r0,AC97+0x26    ; trigger a read of register 26 (status reg)
2323
FFFFFFFFFFFFC7F4                                 sac971:                                                ; wait for status to register 0xF (all ready)
2324
FFFFFFFFFFFFC7F4        31FFEE08                        call    KeybdGetChar    ; see if we needed to CTRL-C
2325
FFFFFFFFFFFFC7F8        B0100A03                        beqi    r1,#CTRLC,sac973
2326
FFFFFFFFFFFFC7FC        E69C1068                ; SETLO
2327
FFFFFFFFFFFFC800        EE800003                ; SETMID
2328
FFFFFFFFFFFFC804        6A0D0429                        outc    r1,AC97+0x68    ; wait for dirty bit to clear
2329
FFFFFFFFFFFFC808        BE107F69                        bne             r1,r0,sac971
2330
FFFFFFFFFFFFC80C        E69C1026                ; SETLO
2331
FFFFFFFFFFFFC810        EE800003                ; SETMID
2332
FFFFFFFFFFFFC814        6A0D0429                        outc    r1,AC97+0x26    ; check status at reg h26, wait for
2333
FFFFFFFFFFFFC818        1410800F                        andi    r1,r1,#0x0F             ; analogue to be ready
2334
FFFFFFFFFFFFC81C        B21FF30F                        bnei    r1,#0x0F,sac974
2335
FFFFFFFFFFFFC820                                 sac973:
2336
FFFFFFFFFFFFC820        E69C1002                ; SETLO
2337
FFFFFFFFFFFFC824        EE800003                ; SETMID
2338
FFFFFFFFFFFFC828        6A0D0029                        outc    r0,AC97+2               ; master volume, 0db attenuation, mute off
2339
FFFFFFFFFFFFC82C        E69C1004                ; SETLO
2340
FFFFFFFFFFFFC830        EE800003                ; SETMID
2341
FFFFFFFFFFFFC834        6A0D0029                        outc    r0,AC97+4               ; headphone volume, 0db attenuation, mute off
2342
FFFFFFFFFFFFC838        E69C1018                ; SETLO
2343
FFFFFFFFFFFFC83C        EE800003                ; SETMID
2344
FFFFFFFFFFFFC840        6A0D0029                        outc    r0,AC97+0x18    ; PCM gain (mixer) mute off, no attenuation
2345
FFFFFFFFFFFFC844        E69C100A                ; SETLO
2346
FFFFFFFFFFFFC848        EE800003                ; SETMID
2347
FFFFFFFFFFFFC84C        6A0D0029                        outc    r0,AC97+0x0A    ; mute PC beep
2348
FFFFFFFFFFFFC850        E07F8000                        setlo   r1,#0x8000              ; bypass 3D sound
2349
FFFFFFFFFFFFC854        E69C1020                ; SETLO
2350
FFFFFFFFFFFFC858        EE800003                ; SETMID
2351
FFFFFFFFFFFFC85C        6A0D0429                        outc    r1,AC97+0x20
2352
FFFFFFFFFFFFC860                                 sac972:
2353
FFFFFFFFFFFFC860        31FFEE08                        call    KeybdGetChar
2354
FFFFFFFFFFFFC864        B0100503                        beqi    r1,#CTRLC,sac975
2355
FFFFFFFFFFFFC868        E69C1068                ; SETLO
2356
FFFFFFFFFFFFC86C        EE800003                ; SETMID
2357
FFFFFFFFFFFFC870        6A0D0429                        outc    r1,AC97+0x68    ; wait for dirty bits to clear
2358
FFFFFFFFFFFFC874        BE107F69                        bne             r1,r0,sac972    ; wait a while for the settings to take effect
2359
FFFFFFFFFFFFC878                                 sac975:
2360
FFFFFFFFFFFFC878        47EF8008                        lw              lr,8[sp]
2361
FFFFFFFFFFFFC87C        47E08000                        lw              r1,[sp]
2362
FFFFFFFFFFFFC880        37EF8010                        ret             #16
2363
 
2364
                                                 ;--------------------------------------------------------------------------
2365 27 robfinch
                                                 ; Sound a 800 Hz beep
2366
                                                 ;--------------------------------------------------------------------------
2367
                                                 ;
2368 43 robfinch
FFFFFFFFFFFFC884                                 Beep:
2369
FFFFFFFFFFFFC884        0FEF0010                        subui   sp,sp,#16
2370
FFFFFFFFFFFFC888        67E08000                        sw              r1,[sp]
2371
FFFFFFFFFFFFC88C        67EF8008                        sw              lr,8[sp]
2372
FFFFFFFFFFFFC890        E0400008                        setlo   r1,#8
2373
FFFFFFFFFFFFC894        E69C0600                ; SETLO
2374
FFFFFFFFFFFFC898        EE800003                ; SETMID
2375
FFFFFFFFFFFFC89C        6A0D0428                        outb    r1,LED
2376
FFFFFFFFFFFFC8A0        1600800F                        ori             r1,r0,#15               ; master volume to max
2377
FFFFFFFFFFFFC8A4        E6950080                ; SETLO
2378
FFFFFFFFFFFFC8A8        EE800003                ; SETMID
2379
FFFFFFFFFFFFC8AC        6A0D0429                        outc    r1,PSG+128
2380
FFFFFFFFFFFFC8B0        1600B46E                        ori             r1,r0,#13422    ; 800Hz
2381
FFFFFFFFFFFFC8B4        E6950000                ; SETLO
2382
FFFFFFFFFFFFC8B8        EE800003                ; SETMID
2383
FFFFFFFFFFFFC8BC        6A0D0429                        outc    r1,PSGFREQ0
2384
FFFFFFFFFFFFC8C0        E0400009                        setlo   r1,#9
2385
FFFFFFFFFFFFC8C4        E69C0600                ; SETLO
2386
FFFFFFFFFFFFC8C8        EE800003                ; SETMID
2387
FFFFFFFFFFFFC8CC        6A0D0428                        outb    r1,LED
2388
                                                        ; decay  (16.384 ms)2
2389
                                                        ; attack (8.192 ms)1
2390
                                                        ; release (1.024 s)A
2391
                                                        ; sustain level C
2392
FFFFFFFFFFFFC8D0        E07FCA12                        setlo   r1,#0xCA12
2393
FFFFFFFFFFFFC8D4        E6950006                ; SETLO
2394
FFFFFFFFFFFFC8D8        EE800003                ; SETMID
2395
FFFFFFFFFFFFC8DC        6A0D0429                        outc    r1,PSGADSR0
2396
FFFFFFFFFFFFC8E0        16009104                        ori             r1,r0,#0x1104   ; gate, output enable, triangle waveform
2397
FFFFFFFFFFFFC8E4        E6950004                ; SETLO
2398
FFFFFFFFFFFFC8E8        EE800003                ; SETMID
2399
FFFFFFFFFFFFC8EC        6A0D0429                        outc    r1,PSGCTRL0
2400
FFFFFFFFFFFFC8F0        E6BD7840                ; SETLO
2401
FFFFFFFFFFFFC8F4        EE800005                ; SETMID
2402
FFFFFFFFFFFFC8F8        040D0409                        ori             r1,r0,#25000000 ; delay about 1s
2403
FFFFFFFFFFFFC8FC                                 beep1:
2404
FFFFFFFFFFFFC8FC        BE00800F                        loop    r1,beep1
2405
FFFFFFFFFFFFC900        E040000D                        setlo   r1,#13
2406
FFFFFFFFFFFFC904        E69C0600                ; SETLO
2407
FFFFFFFFFFFFC908        EE800003                ; SETMID
2408
FFFFFFFFFFFFC90C        6A0D0428                        outb    r1,LED
2409
FFFFFFFFFFFFC910        16008104                        ori             r1,r0,#0x0104   ; gate off, output enable, triangle waveform
2410
FFFFFFFFFFFFC914        E6950004                ; SETLO
2411
FFFFFFFFFFFFC918        EE800003                ; SETMID
2412
FFFFFFFFFFFFC91C        6A0D0429                        outc    r1,PSGCTRL0
2413
FFFFFFFFFFFFC920        E6BD7840                ; SETLO
2414
FFFFFFFFFFFFC924        EE800005                ; SETMID
2415
FFFFFFFFFFFFC928        040D0409                        ori             r1,r0,#25000000 ; delay about 1s
2416
FFFFFFFFFFFFC92C                                 beep2:
2417
FFFFFFFFFFFFC92C        BE00800F                        loop    r1,beep2
2418
FFFFFFFFFFFFC930        E0400010                        setlo   r1,#16
2419
FFFFFFFFFFFFC934        E69C0600                ; SETLO
2420
FFFFFFFFFFFFC938        EE800003                ; SETMID
2421
FFFFFFFFFFFFC93C        6A0D0428                        outb    r1,LED
2422
FFFFFFFFFFFFC940        16008000                        ori             r1,r0,#0x0000   ; gate off, output enable off, no waveform
2423
FFFFFFFFFFFFC944        E6950004                ; SETLO
2424
FFFFFFFFFFFFC948        EE800003                ; SETMID
2425
FFFFFFFFFFFFC94C        6A0D0429                        outc    r1,PSGCTRL0
2426
FFFFFFFFFFFFC950        47EF8008                        lw              lr,8[sp]
2427
FFFFFFFFFFFFC954        47E08000                        lw              r1,[sp]
2428
FFFFFFFFFFFFC958        37EF8010                        ret             #16
2429 27 robfinch
 
2430 43 robfinch
                                                 ;--------------------------------------------------------------------------
2431
                                                 ;--------------------------------------------------------------------------
2432
                                                 ;
2433
FFFFFFFFFFFFC95C                                 Piano:
2434
FFFFFFFFFFFFC95C        1600800F                        ori             r1,r0,#15               ; master volume to max
2435
FFFFFFFFFFFFC960        E6950080                ; SETLO
2436
FFFFFFFFFFFFC964        EE800003                ; SETMID
2437
FFFFFFFFFFFFC968        6A0D0429                        outc    r1,PSG+128
2438
FFFFFFFFFFFFC96C                                 playnt:
2439
FFFFFFFFFFFFC96C        31FFEE08                        call    KeybdGetChar
2440
FFFFFFFFFFFFC970        B01E3A03                        beqi    r1,#CTRLC,Monitor
2441
FFFFFFFFFFFFC974        B0100861                        beqi    r1,#'a',playnt1a
2442
FFFFFFFFFFFFC978        B0100A62                        beqi    r1,#'b',playnt1b
2443
FFFFFFFFFFFFC97C        B0100C63                        beqi    r1,#'c',playnt1c
2444
FFFFFFFFFFFFC980        B0100E64                        beqi    r1,#'d',playnt1d
2445
FFFFFFFFFFFFC984        B0101065                        beqi    r1,#'e',playnt1e
2446
FFFFFFFFFFFFC988        B0101266                        beqi    r1,#'f',playnt1f
2447
FFFFFFFFFFFFC98C        B0101467                        beqi    r1,#'g',playnt1g
2448
FFFFFFFFFFFFC990        BE007EEA                        bra             playnt
2449 27 robfinch
 
2450 43 robfinch
FFFFFFFFFFFFC994                                 playnt1a:
2451
FFFFFFFFFFFFC994        E0401C31                        setlo   r1,#7217
2452
FFFFFFFFFFFFC998        31FFF27A                        call    Tone
2453
FFFFFFFFFFFFC99C        BE007E8A                        bra             playnt
2454
FFFFFFFFFFFFC9A0                                 playnt1b:
2455
FFFFFFFFFFFFC9A0        E0401FA5                        setlo   r1,#8101
2456
FFFFFFFFFFFFC9A4        31FFF27A                        call    Tone
2457
FFFFFFFFFFFFC9A8        BE007E2A                        bra             playnt
2458
FFFFFFFFFFFFC9AC                                 playnt1c:
2459
FFFFFFFFFFFFC9AC        E04010C3                        setlo   r1,#4291
2460
FFFFFFFFFFFFC9B0        31FFF27A                        call    Tone
2461
FFFFFFFFFFFFC9B4        BE007DCA                        bra             playnt
2462
FFFFFFFFFFFFC9B8                                 playnt1d:
2463
FFFFFFFFFFFFC9B8        E04012D1                        setlo   r1,#4817
2464
FFFFFFFFFFFFC9BC        31FFF27A                        call    Tone
2465
FFFFFFFFFFFFC9C0        BE007D6A                        bra             playnt
2466
FFFFFFFFFFFFC9C4                                 playnt1e:
2467
FFFFFFFFFFFFC9C4        E040151F                        setlo   r1,#5407
2468
FFFFFFFFFFFFC9C8        31FFF27A                        call    Tone
2469
FFFFFFFFFFFFC9CC        BE007D0A                        bra             playnt
2470
FFFFFFFFFFFFC9D0                                 playnt1f:
2471
FFFFFFFFFFFFC9D0        E0401660                        setlo   r1,#5728
2472
FFFFFFFFFFFFC9D4        31FFF27A                        call    Tone
2473
FFFFFFFFFFFFC9D8        BE007CAA                        bra             playnt
2474
FFFFFFFFFFFFC9DC                                 playnt1g:
2475
FFFFFFFFFFFFC9DC        E040191E                        setlo   r1,#6430
2476
FFFFFFFFFFFFC9E0        31FFF27A                        call    Tone
2477
FFFFFFFFFFFFC9E4        BE007C4A                        bra             playnt
2478
 
2479
FFFFFFFFFFFFC9E8                                 Tone:
2480
FFFFFFFFFFFFC9E8        0FEF0010                        subui   sp,sp,#16
2481
FFFFFFFFFFFFC9EC        67E08000                        sw              r1,[sp]
2482
FFFFFFFFFFFFC9F0        67EF8008                        sw              lr,8[sp]
2483
FFFFFFFFFFFFC9F4        E6950000                ; SETLO
2484
FFFFFFFFFFFFC9F8        EE800003                ; SETMID
2485
FFFFFFFFFFFFC9FC        6A0D0429                        outc    r1,PSGFREQ0
2486
                                                        ; decay  (16.384 ms)2
2487
                                                        ; attack (8.192 ms)1
2488
                                                        ; release (1.024 s)A
2489
                                                        ; sustain level C
2490
FFFFFFFFFFFFCA00        E07FCA12                        setlo   r1,#0xCA12
2491
FFFFFFFFFFFFCA04        E6950006                ; SETLO
2492
FFFFFFFFFFFFCA08        EE800003                ; SETMID
2493
FFFFFFFFFFFFCA0C        6A0D0429                        outc    r1,PSGADSR0
2494
FFFFFFFFFFFFCA10        16009104                        ori             r1,r0,#0x1104   ; gate, output enable, triangle waveform
2495
FFFFFFFFFFFFCA14        E6950004                ; SETLO
2496
FFFFFFFFFFFFCA18        EE800003                ; SETMID
2497
FFFFFFFFFFFFCA1C        6A0D0429                        outc    r1,PSGCTRL0
2498
FFFFFFFFFFFFCA20        E683D090                ; SETLO
2499
FFFFFFFFFFFFCA24        040D0409                        ori             r1,r0,#250000   ; delay about 10ms
2500
FFFFFFFFFFFFCA28                                 tone1:
2501
FFFFFFFFFFFFCA28        BE00800F                        loop    r1,tone1
2502
FFFFFFFFFFFFCA2C        16008104                        ori             r1,r0,#0x0104   ; gate off, output enable, triangle waveform
2503
FFFFFFFFFFFFCA30        E6950004                ; SETLO
2504
FFFFFFFFFFFFCA34        EE800003                ; SETMID
2505
FFFFFFFFFFFFCA38        6A0D0429                        outc    r1,PSGCTRL0
2506
FFFFFFFFFFFFCA3C        E683D090                ; SETLO
2507
FFFFFFFFFFFFCA40        040D0409                        ori             r1,r0,#250000   ; delay about 10ms
2508
FFFFFFFFFFFFCA44                                 tone2:
2509
FFFFFFFFFFFFCA44        BE00800F                        loop    r1,tone2
2510
FFFFFFFFFFFFCA48        16008000                        ori             r1,r0,#0x0000   ; gate off, output enable off, no waveform
2511
FFFFFFFFFFFFCA4C        E6950004                ; SETLO
2512
FFFFFFFFFFFFCA50        EE800003                ; SETMID
2513
FFFFFFFFFFFFCA54        6A0D0429                        outc    r1,PSGCTRL0
2514
FFFFFFFFFFFFCA58        47EF8008                        lw              lr,8[sp]
2515
FFFFFFFFFFFFCA5C        47E08000                        lw              r1,[sp]
2516
FFFFFFFFFFFFCA60        37EF8010                        ret             #16
2517
 
2518
                                                 ;==============================================================================
2519
                                                 ;==============================================================================
2520
FFFFFFFFFFFFCA64                                 SetupRasterIRQ:
2521
FFFFFFFFFFFFCA64        0FEF0008                        subui   sp,sp,#8
2522
FFFFFFFFFFFFCA68        67E08000                        sw              r1,[sp]
2523
FFFFFFFFFFFFCA6C        E04000C8                        setlo   r1,#200
2524
FFFFFFFFFFFFCA70        E69A0100                ; SETLO
2525
FFFFFFFFFFFFCA74        EE800003                ; SETMID
2526
FFFFFFFFFFFFCA78        6A0D0429                        outc    r1,RASTERIRQ
2527
FFFFFFFFFFFFCA7C        E04000F0                        setlo   r1,#240
2528
FFFFFFFFFFFFCA80        E69A0102                ; SETLO
2529
FFFFFFFFFFFFCA84        EE800003                ; SETMID
2530
FFFFFFFFFFFFCA88        6A0D0429                        outc    r1,RASTERIRQ+2
2531
FFFFFFFFFFFFCA8C        E0400118                        setlo   r1,#280
2532
FFFFFFFFFFFFCA90        E69A0104                ; SETLO
2533
FFFFFFFFFFFFCA94        EE800003                ; SETMID
2534
FFFFFFFFFFFFCA98        6A0D0429                        outc    r1,RASTERIRQ+4
2535
FFFFFFFFFFFFCA9C        E0400140                        setlo   r1,#320
2536
FFFFFFFFFFFFCAA0        E69A0106                ; SETLO
2537
FFFFFFFFFFFFCAA4        EE800003                ; SETMID
2538
FFFFFFFFFFFFCAA8        6A0D0429                        outc    r1,RASTERIRQ+6
2539
FFFFFFFFFFFFCAAC        E0400168                        setlo   r1,#360
2540
FFFFFFFFFFFFCAB0        E69A0108                ; SETLO
2541
FFFFFFFFFFFFCAB4        EE800003                ; SETMID
2542
FFFFFFFFFFFFCAB8        6A0D0429                        outc    r1,RASTERIRQ+8
2543
FFFFFFFFFFFFCABC        47E08000                        lw              r1,[sp]
2544
FFFFFFFFFFFFCAC0        37EF8008                        ret             #8
2545
 
2546
FFFFFFFFFFFFCAC4                                 RasterIRQfn:
2547
FFFFFFFFFFFFCAC4        E69A011E                ; SETLO
2548
FFFFFFFFFFFFCAC8        EE800003                ; SETMID
2549
FFFFFFFFFFFFCACC        6A0D0421                        inch    r1,RASTERIRQ+30         ; get the raster compare register # (clears IRQ)
2550
FFFFFFFFFFFFCAD0        B0100901                        beqi    r1,#1,rirq1
2551
FFFFFFFFFFFFCAD4        B0100802                        beqi    r1,#2,rirq2
2552
FFFFFFFFFFFFCAD8        B0100703                        beqi    r1,#3,rirq3
2553
FFFFFFFFFFFFCADC        B0100604                        beqi    r1,#4,rirq4
2554
FFFFFFFFFFFFCAE0        B0100505                        beqi    r1,#5,rirq5
2555
FFFFFFFFFFFFCAE4        B0100406                        beqi    r1,#6,rirq6
2556
FFFFFFFFFFFFCAE8        B0100307                        beqi    r1,#7,rirq7
2557
FFFFFFFFFFFFCAEC        B0100208                        beqi    r1,#8,rirq8
2558
FFFFFFFFFFFFCAF0        37EF8000                        ret
2559
FFFFFFFFFFFFCAF4                                 rirq1:
2560
FFFFFFFFFFFFCAF4                                 rirq2:
2561
FFFFFFFFFFFFCAF4                                 rirq3:
2562
FFFFFFFFFFFFCAF4                                 rirq4:
2563
FFFFFFFFFFFFCAF4                                 rirq5:
2564
FFFFFFFFFFFFCAF4                                 rirq6:
2565
FFFFFFFFFFFFCAF4                                 rirq7:
2566
FFFFFFFFFFFFCAF4                                 rirq8:
2567
FFFFFFFFFFFFCAF4        1A108028                        mului   r1,r1,#40
2568
FFFFFFFFFFFFCAF8        0A1080CC                        addui   r1,r1,#204
2569
FFFFFFFFFFFFCAFC        E69AD002                ; SETLO
2570
FFFFFFFFFFFFCB00        EE800003                ; SETMID
2571
FFFFFFFFFFFFCB04        6A0D0429                        outc    r1,SPRITEREGS+2
2572
FFFFFFFFFFFFCB08        E69AD012                ; SETLO
2573
FFFFFFFFFFFFCB0C        EE800003                ; SETMID
2574
FFFFFFFFFFFFCB10        6A0D0429                        outc    r1,SPRITEREGS+18
2575
FFFFFFFFFFFFCB14        E69AD022                ; SETLO
2576
FFFFFFFFFFFFCB18        EE800003                ; SETMID
2577
FFFFFFFFFFFFCB1C        6A0D0429                        outc    r1,SPRITEREGS+34
2578
FFFFFFFFFFFFCB20        E69AD032                ; SETLO
2579
FFFFFFFFFFFFCB24        EE800003                ; SETMID
2580
FFFFFFFFFFFFCB28        6A0D0429                        outc    r1,SPRITEREGS+50
2581
FFFFFFFFFFFFCB2C        E69AD042                ; SETLO
2582
FFFFFFFFFFFFCB30        EE800003                ; SETMID
2583
FFFFFFFFFFFFCB34        6A0D0429                        outc    r1,SPRITEREGS+66
2584
FFFFFFFFFFFFCB38        E69AD052                ; SETLO
2585
FFFFFFFFFFFFCB3C        EE800003                ; SETMID
2586
FFFFFFFFFFFFCB40        6A0D0429                        outc    r1,SPRITEREGS+82
2587
FFFFFFFFFFFFCB44        E69AD062                ; SETLO
2588
FFFFFFFFFFFFCB48        EE800003                ; SETMID
2589
FFFFFFFFFFFFCB4C        6A0D0429                        outc    r1,SPRITEREGS+98
2590
FFFFFFFFFFFFCB50        E69AD072                ; SETLO
2591
FFFFFFFFFFFFCB54        EE800003                ; SETMID
2592
FFFFFFFFFFFFCB58        6A0D0429                        outc    r1,SPRITEREGS+114
2593
FFFFFFFFFFFFCB5C        37EF8000                        ret
2594
 
2595
                                                 ;------------------------------------------------------------------------------
2596
                                                 ;------------------------------------------------------------------------------
2597
FFFFFFFFFFFFCB60                                 DisplayDatetime:
2598
FFFFFFFFFFFFCB60        0FEF0020                        subui   sp,sp,#32
2599
FFFFFFFFFFFFCB64        67E08000                        sw              r1,[sp]
2600
FFFFFFFFFFFFCB68        67E10008                        sw              r2,8[sp]
2601
FFFFFFFFFFFFCB6C        67E18010                        sw              r3,16[sp]
2602
FFFFFFFFFFFFCB70        67EF8018                        sw              lr,24[sp]
2603
FFFFFFFFFFFFCB74        31FFEEBA                        call    CursorOff
2604
FFFFFFFFFFFFCB78        42011416                        lc              r2,CursorRow
2605
FFFFFFFFFFFFCB7C        42019418                        lc              r3,CursorCol
2606
FFFFFFFFFFFFCB80        E69C0418                ; SETLO
2607
FFFFFFFFFFFFCB84        EE800003                ; SETMID
2608
FFFFFFFFFFFFCB88        6A0D002B                        outw    r0,DATETIME+24          ; trigger a snapshot
2609
FFFFFFFFFFFFCB8C        1600802E                        lw              r1,#46                          ; move cursor down to last display line
2610
FFFFFFFFFFFFCB90        62009416                        sc              r1,CursorRow
2611
FFFFFFFFFFFFCB94        16008040                        lw              r1,#64
2612
FFFFFFFFFFFFCB98        62009418                        sc              r1,CursorCol
2613
FFFFFFFFFFFFCB9C        E69C0400                ; SETLO
2614
FFFFFFFFFFFFCBA0        EE800003                ; SETMID
2615
FFFFFFFFFFFFCBA4        6A0D0423                        inw             r1,DATETIME                     ; get the snapshotted date and time
2616
FFFFFFFFFFFFCBA8        31FFF019                        call    DisplayWord                     ; display on screen
2617
FFFFFFFFFFFFCBAC        62011416                        sc              r2,CursorRow            ; restore cursor position
2618
FFFFFFFFFFFFCBB0        62019418                        sc              r3,CursorCol
2619
FFFFFFFFFFFFCBB4        31FFEF37                        call    CalcScreenLoc
2620
FFFFFFFFFFFFCBB8        31FFEEBF                        call    CursorOn
2621
FFFFFFFFFFFFCBBC        47EF8018                        lw              lr,24[sp]
2622
FFFFFFFFFFFFCBC0        47E18010                        lw              r3,16[sp]
2623
FFFFFFFFFFFFCBC4        47E10008                        lw              r2,8[sp]
2624
FFFFFFFFFFFFCBC8        47E08000                        lw              r1,[sp]
2625
FFFFFFFFFFFFCBCC        37EF8020                        ret             #32
2626
 
2627
                                                 ;==============================================================================
2628
                                                 ;==============================================================================
2629
FFFFFFFFFFFFCBD0                                 InitializeGame:
2630
FFFFFFFFFFFFCBD0        0FEF0010                        subui   sp,sp,#16
2631
FFFFFFFFFFFFCBD4        27F40000004                     sm              [sp],r3/lr
2632
FFFFFFFFFFFFCBD8        E0C00140                        setlo   r3,#320
2633
FFFFFFFFFFFFCBDC        62019508                        sc              r3,Manpos
2634
FFFFFFFFFFFFCBE0        62001500                        sc              r0,Score
2635
FFFFFFFFFFFFCBE4        60001510                        sb              r0,MissileActive
2636
FFFFFFFFFFFFCBE8        62001512                        sc              r0,MissileX
2637
FFFFFFFFFFFFCBEC        62001514                        sc              r0,MissileY
2638
FFFFFFFFFFFFCBF0        27740000004                     lm              [sp],r3/lr
2639
FFFFFFFFFFFFCBF4        37EF8010                        ret             #16
2640
 
2641
FFFFFFFFFFFFCBF8                                 DrawScore:
2642
FFFFFFFFFFFFCBF8        0FEF0018                        subui   sp,sp,#24
2643
FFFFFFFFFFFFCBFC        27F40000005                     sm              [sp],r1/r3/lr
2644
FFFFFFFFFFFFCC00        E0C00001                        setlo   r3,#1
2645
FFFFFFFFFFFFCC04        60019416                        sb              r3,CursorRow
2646
FFFFFFFFFFFFCC08        E0C00028                        setlo   r3,#40
2647
FFFFFFFFFFFFCC0C        60019418                        sb              r3,CursorCol
2648
FFFFFFFFFFFFCC10        40009500                        lb              r1,Score
2649
FFFFFFFFFFFFCC14        31FFF00F                        call    DisplayByte
2650
FFFFFFFFFFFFCC18        40009501                        lb              r1,Score+1
2651
FFFFFFFFFFFFCC1C        31FFF00F                        call    DisplayByte
2652
FFFFFFFFFFFFCC20        27740000005                     lm              [sp],r1/r3/lr
2653
FFFFFFFFFFFFCC24        37EF8018                        ret             #24
2654
 
2655
FFFFFFFFFFFFCC28                                 DrawMissile:
2656
FFFFFFFFFFFFCC28        0FEF0010                        subui   sp,sp,#16
2657
FFFFFFFFFFFFCC2C        27F40000001                     sm              [sp],r1/lr
2658
FFFFFFFFFFFFCC30        42009514                        lc              r1,MissileY
2659
FFFFFFFFFFFFCC34        AC101402                        bleu    r1,#2,MissileOff
2660
FFFFFFFFFFFFCC38        42009512                        lc              r1,MissileX
2661
FFFFFFFFFFFFCC3C        06108601                        shrui   r1,r1,#3
2662
FFFFFFFFFFFFCC40        60009418                        sb              r1,CursorCol
2663
FFFFFFFFFFFFCC44        42009514                        lc              r1,MissileY
2664
FFFFFFFFFFFFCC48        60009416                        sb              r1,CursorRow
2665
FFFFFFFFFFFFCC4C        0E108001                        subui   r1,r1,#1
2666
FFFFFFFFFFFFCC50        62009514                        sc              r1,MissileY
2667
FFFFFFFFFFFFCC54        E040005E                        setlo   r1,#'^'
2668
FFFFFFFFFFFFCC58        31FFEF47                        call    DisplayChar
2669
FFFFFFFFFFFFCC5C        40009418                        lb              r1,CursorCol
2670
FFFFFFFFFFFFCC60        0E108001                        subui   r1,r1,#1
2671
FFFFFFFFFFFFCC64        60009418                        sb              r1,CursorCol
2672
FFFFFFFFFFFFCC68        40009416                        lb              r1,CursorRow
2673
FFFFFFFFFFFFCC6C        0E108001                        subui   r1,r1,#1
2674
FFFFFFFFFFFFCC70        60009416                        sb              r1,CursorRow
2675
FFFFFFFFFFFFCC74        E0400020                        setlo   r1,#' '
2676
FFFFFFFFFFFFCC78        31FFEF47                        call    DisplayChar
2677
FFFFFFFFFFFFCC7C        27740000001                     lm              [sp],r1/lr
2678
FFFFFFFFFFFFCC80        37EF8010                        ret             #16
2679
FFFFFFFFFFFFCC84                                 MissileOff:
2680
FFFFFFFFFFFFCC84        60001510                        sb              r0,MissileActive
2681
FFFFFFFFFFFFCC88        42009512                        lc              r1,MissileX
2682
FFFFFFFFFFFFCC8C        06108601                        shrui   r1,r1,#3
2683
FFFFFFFFFFFFCC90        60009418                        sb              r1,CursorCol
2684
FFFFFFFFFFFFCC94        42009514                        lc              r1,MissileY
2685
FFFFFFFFFFFFCC98        60009416                        sb              r1,CursorRow
2686
FFFFFFFFFFFFCC9C        E0400020                        setlo   r1,#' '
2687
FFFFFFFFFFFFCCA0        31FFEF47                        call    DisplayChar
2688
FFFFFFFFFFFFCCA4        27740000001                     lm              [sp],r1/lr
2689
FFFFFFFFFFFFCCA8        37EF8010                        ret             #16
2690
 
2691
FFFFFFFFFFFFCCAC                                 DrawMan:
2692
FFFFFFFFFFFFCCAC        0FEF0018                        subui   sp,sp,#24
2693
FFFFFFFFFFFFCCB0        27F40000005                     sm              [sp],r1/r3/lr
2694
FFFFFFFFFFFFCCB4        E0C0002E                        setlo   r3,#46
2695
FFFFFFFFFFFFCCB8        60019416                        sb              r3,CursorRow
2696
FFFFFFFFFFFFCCBC        42019508                        lc              r3,Manpos
2697
FFFFFFFFFFFFCCC0        06318601                        shrui   r3,r3,#3
2698
FFFFFFFFFFFFCCC4        60019418                        sb              r3,CursorCol
2699
FFFFFFFFFFFFCCC8        E0400020                        setlo   r1,#' '
2700
FFFFFFFFFFFFCCCC        31FFEF47                        call    DisplayChar
2701
FFFFFFFFFFFFCCD0        E0400023                        setlo   r1,#'#'
2702
FFFFFFFFFFFFCCD4        31FFEF47                        call    DisplayChar
2703
FFFFFFFFFFFFCCD8        E0400041                        setlo   r1,#'A'
2704
FFFFFFFFFFFFCCDC        31FFEF47                        call    DisplayChar
2705
FFFFFFFFFFFFCCE0        E0400023                        setlo   r1,#'#'
2706
FFFFFFFFFFFFCCE4        31FFEF47                        call    DisplayChar
2707
FFFFFFFFFFFFCCE8        E0400020                        setlo   r1,#' '
2708
FFFFFFFFFFFFCCEC        31FFEF47                        call    DisplayChar
2709
FFFFFFFFFFFFCCF0        27740000005                     lm              [sp],r1/r3/lr
2710
FFFFFFFFFFFFCCF4        37EF8018                        ret             #24
2711
 
2712
FFFFFFFFFFFFCCF8                                 DrawInvader:
2713
FFFFFFFFFFFFCCF8        46018000                        lw              r3,InvaderPos
2714
FFFFFFFFFFFFCCFC        160080E9                        lw              r1,#233
2715
FFFFFFFFFFFFCD00        62308000                        sc              r1,[r3]
2716
FFFFFFFFFFFFCD04        160080F2                        lw              r1,#242
2717
FFFFFFFFFFFFCD08        62308001                        sc              r1,1[r3]
2718
FFFFFFFFFFFFCD0C        160080DF                        lw              r1,#223
2719
FFFFFFFFFFFFCD10        62308002                        sc              r1,2[r3]
2720
FFFFFFFFFFFFCD14        37EF8000                        ret
2721
 
2722
FFFFFFFFFFFFCD18                                 DrawInvaders:
2723
FFFFFFFFFFFFCD18        0FEF0028                        subui   sp,sp,#40
2724
FFFFFFFFFFFFCD1C        27F4000000F                     sm              [sp],r1/r2/r3/r4/lr
2725
FFFFFFFFFFFFCD20        42009520                        lc              r1,InvadersRow1
2726
FFFFFFFFFFFFCD24        42021570                        lc              r4,InvadersColpos
2727
FFFFFFFFFFFFCD28        14110001                        andi    r2,r1,#1
2728
FFFFFFFFFFFFCD2C        BE2003A8                        beq             r2,r0,dinv1
2729
FFFFFFFFFFFFCD30        40019571                        lb              r3,InvadersRowpos
2730
FFFFFFFFFFFFCD34        60019416                        sb              r3,CursorRow
2731
FFFFFFFFFFFFCD38        60021418                        sb              r4,CursorCol
2732
FFFFFFFFFFFFCD3C        E0400020                        setlo   r1,#' '
2733
FFFFFFFFFFFFCD40        31FFF00F                        call    DisplayByte
2734
FFFFFFFFFFFFCD44        E0400023                        setlo   r1,#'#'
2735
FFFFFFFFFFFFCD48        31FFF00F                        call    DisplayByte
2736
FFFFFFFFFFFFCD4C        E0400023                        setlo   r1,#'#'
2737
FFFFFFFFFFFFCD50        31FFF00F                        call    DisplayByte
2738
FFFFFFFFFFFFCD54        E0400023                        setlo   r1,#'#'
2739
FFFFFFFFFFFFCD58        31FFF00F                        call    DisplayByte
2740
FFFFFFFFFFFFCD5C        E0400020                        setlo   r1,#' '
2741
FFFFFFFFFFFFCD60        31FFF00F                        call    DisplayByte
2742
FFFFFFFFFFFFCD64        40009416                        lb              r1,CursorRow
2743
FFFFFFFFFFFFCD68        0A108001                        addui   r1,r1,#1
2744
FFFFFFFFFFFFCD6C        60009416                        sb              r1,CursorRow
2745
FFFFFFFFFFFFCD70        40009418                        lb              r1,CursorCol
2746
FFFFFFFFFFFFCD74        0E108005                        subui   r1,r1,#5
2747
FFFFFFFFFFFFCD78        E0400020                        setlo   r1,#' '
2748
FFFFFFFFFFFFCD7C        31FFF00F                        call    DisplayByte
2749
FFFFFFFFFFFFCD80        E0400058                        setlo   r1,#'X'
2750
FFFFFFFFFFFFCD84        31FFF00F                        call    DisplayByte
2751
FFFFFFFFFFFFCD88        E0400020                        setlo   r1,#' '
2752
FFFFFFFFFFFFCD8C        31FFF00F                        call    DisplayByte
2753
FFFFFFFFFFFFCD90        E0400058                        setlo   r1,#'X'
2754
FFFFFFFFFFFFCD94        31FFF00F                        call    DisplayByte
2755
FFFFFFFFFFFFCD98        E0400020                        setlo   r1,#' '
2756
FFFFFFFFFFFFCD9C        31FFF00F                        call    DisplayByte
2757
FFFFFFFFFFFFCDA0                                 dinv1:
2758
FFFFFFFFFFFFCDA0        2774000000F                     lm              [sp],r1/r2/r3/r4/lr
2759
FFFFFFFFFFFFCDA4        37EF8028                        ret             #40
2760
FFFFFFFFFFFFCDA8                                 DrawBombs:
2761
FFFFFFFFFFFFCDA8        37EF8000                        ret
2762
 
2763
FFFFFFFFFFFFCDAC                                 Invaders:
2764
FFFFFFFFFFFFCDAC        FFFFFFFFFFFF0000                        subui   sp,#240
2765
FFFFFFFFFFFFCDB0        27F4000000F                     sm              [sp],r1/r2/r3/r4/lr
2766
FFFFFFFFFFFFCDB4        31FFF2F4                        call    InitializeGame
2767
FFFFFFFFFFFFCDB8                                 InvadersLoop:
2768
FFFFFFFFFFFFCDB8        31FFF2FE                        call    DrawScore
2769
FFFFFFFFFFFFCDBC        31FFF346                        call    DrawInvaders
2770
FFFFFFFFFFFFCDC0        31FFF36A                        call    DrawBombs
2771
FFFFFFFFFFFFCDC4        31FFF30A                        call    DrawMissile
2772
FFFFFFFFFFFFCDC8        31FFF32B                        call    DrawMan
2773
FFFFFFFFFFFFCDCC                                 TestMoveMan:
2774
FFFFFFFFFFFFCDCC        31FFEE08                        call    KeybdGetChar
2775
FFFFFFFFFFFFCDD0        B010046B                        beqi    r1,#'k',MoveManRight
2776
FFFFFFFFFFFFCDD4        B010096A                        beqi    r1,#'j',MoveManLeft
2777
FFFFFFFFFFFFCDD8        B0100D20                        beqi    r1,#' ',FireMissile
2778
FFFFFFFFFFFFCDDC        BE0002AA                        bra             Invaders1
2779
FFFFFFFFFFFFCDE0                                 MoveManRight:
2780
FFFFFFFFFFFFCDE0        42011508                        lc              r2,Manpos
2781
FFFFFFFFFFFFCDE4        E6800280                ; SETLO
2782
FFFFFFFFFFFFCDE8        BE2D0247                        bgtu    r2,#640,Invaders1
2783
FFFFFFFFFFFFCDEC        0A210008                        addui   r2,r2,#8
2784
FFFFFFFFFFFFCDF0        62011508                        sc              r2,Manpos
2785
FFFFFFFFFFFFCDF4        BE0001EA                        bra             Invaders1
2786
FFFFFFFFFFFFCDF8                                 MoveManLeft:
2787
FFFFFFFFFFFFCDF8        42011508                        lc              r2,Manpos
2788
FFFFFFFFFFFFCDFC        BE2001A2                        ble             r2,r0,Invaders1
2789
FFFFFFFFFFFFCE00        0E210008                        subui   r2,r2,#8
2790
FFFFFFFFFFFFCE04        62011508                        sc              r2,Manpos
2791
FFFFFFFFFFFFCE08        BE00014A                        bra             Invaders1
2792
FFFFFFFFFFFFCE0C                                 FireMissile:
2793
FFFFFFFFFFFFCE0C        40011510                        lb              r2,MissileActive
2794
FFFFFFFFFFFFCE10        BE200109                        bne             r2,r0,Invaders1
2795
FFFFFFFFFFFFCE14        E0800001                        setlo   r2,#1
2796
FFFFFFFFFFFFCE18        60011510                        sb              r2,MissileActive
2797
FFFFFFFFFFFFCE1C        42011508                        lc              r2,Manpos
2798
FFFFFFFFFFFFCE20        62011512                        sc              r2,MissileX
2799
FFFFFFFFFFFFCE24        E080002E                        setlo   r2,#46
2800
FFFFFFFFFFFFCE28        62011514                        sc              r2,MissileY
2801
FFFFFFFFFFFFCE2C        BE00002A                        bra             Invaders1
2802
FFFFFFFFFFFFCE30                                 Invaders1:
2803
FFFFFFFFFFFFCE30        B0100203                        beqi    r1,#CTRLC,InvadersEnd
2804
FFFFFFFFFFFFCE34        BE007C2A                        bra             InvadersLoop
2805
FFFFFFFFFFFFCE38                                 InvadersEnd:
2806
FFFFFFFFFFFFCE38        2774000000F                     lm              [sp],r1/r2/r3/r4/lr
2807
FFFFFFFFFFFFCE3C        0BEF00F0                        addui   sp,sp,#240
2808
FFFFFFFFFFFFCE40        BE0020CA                        bra             Monitor
2809
 
2810
                                                 ;==============================================================================
2811
                                                 ;==============================================================================
2812
                                                 ;****************************************************************;
2813
                                                 ;                                                                ;
2814
                                                 ;              Tiny BASIC for the Raptor64                              ;
2815
                                                 ;                                                                ;
2816
                                                 ; Derived from a 68000 derivative of Palo Alto Tiny BASIC as     ;
2817
                                                 ; published in the May 1976 issue of Dr. Dobb's Journal.         ;
2818
                                                 ; Adapted to the 68000 by:                                       ;
2819
                                                 ;      Gordon brndly                                                                    ;
2820
                                                 ;      12147 - 51 Street                                                                ;
2821
                                                 ;      Edmonton AB  T5W 3G8                                                         ;
2822
                                                 ;      Canada                                                                               ;
2823
                                                 ;      (updated mailing address for 1996)                                       ;
2824
                                                 ;                                                                ;
2825
                                                 ; Adapted to the Raptor64 by:                                    ;
2826
                                                 ;    Robert Finch                                                ;
2827
                                                 ;    Ontario, Canada                                             ;
2828
                                                 ;       robfinch@opencores.org                              ;
2829
                                                 ;****************************************************************;
2830
                                                 ;    Copyright (C) 2012 by Robert Finch. This program may be    ;
2831
                                                 ;    freely distributed for personal use only. All commercial   ;
2832
                                                 ;                     rights are reserved.                                          ;
2833
                                                 ;****************************************************************;
2834
                                                 ;
2835
                                                 ; Register Usage
2836
                                                 ; r8 = text pointer (global usage)
2837
                                                 ; r3,r4 = inputs parameters to subroutines
2838
                                                 ; r2 = return value
2839
                                                 ;
2840
                                                 ;* Vers. 1.0  1984/7/17        - Original version by Gordon brndly
2841
                                                 ;*     1.1  1984/12/9  - Addition of '0x' print term by Marvin Lipford
2842
                                                 ;*     1.2  1985/4/9   - Bug fix in multiply routine by Rick Murray
2843
 
2844
                                                 ;
2845
                                                 ; Standard jump table. You can change these addresses if you are
2846
                                                 ; customizing this interpreter for a different environment.
2847
                                                 ;
2848
FFFFFFFFFFFFCE44                                 GOSTART:
2849
FFFFFFFFFFFFCE44        33FFF39C                                jmp     CSTART  ;       Cold Start entry point
2850
FFFFFFFFFFFFCE48                                 GOWARM:
2851
FFFFFFFFFFFFCE48        33FFF3BE                                jmp     WSTART  ;       Warm Start entry point
2852
FFFFFFFFFFFFCE4C                                 GOOUT:
2853
FFFFFFFFFFFFCE4C        33FFF95A                                jmp     OUTC    ;       Jump to character-out routine
2854
FFFFFFFFFFFFCE50                                 GOIN:
2855
FFFFFFFFFFFFCE50        33FFF95B                                jmp     INC             ;Jump to character-in routine
2856
FFFFFFFFFFFFCE54                                 GOAUXO:
2857
FFFFFFFFFFFFCE54        33FFF962                                jmp     AUXOUT  ;       Jump to auxiliary-out routine
2858
FFFFFFFFFFFFCE58                                 GOAUXI:
2859
FFFFFFFFFFFFCE58        33FFF95C                                jmp     AUXIN   ;       Jump to auxiliary-in routine
2860
FFFFFFFFFFFFCE5C                                 GOBYE:
2861
FFFFFFFFFFFFCE5C        33FFF9EA                                jmp     BYEBYE  ;       Jump to monitor, DOS, etc.
2862
                                                 ;
2863
                                                 ; Modifiable system constants:
2864
                                                 ;
2865
FFFFFFFFFFFFCE60                                                align   8
2866
FFFFFFFFFFFFCE60 0000000010060000        TXTBGN dw      0x000000001_00600000    ;TXT            ;beginning of program memory
2867
FFFFFFFFFFFFCE68 00000000107FFFF8        ENDMEM dw      0x000000001_07FFFFF8    ;       end of available memory
2868
                                                 ;
2869
                                                 ; The main interpreter starts here:
2870
                                                 ;
2871
                                                 ; Usage
2872
                                                 ; r1 = temp
2873
                                                 ; r8 = text buffer pointer
2874
                                                 ; r12 = end of text in text buffer
2875
                                                 ;
2876
FFFFFFFFFFFFCE70                                        align   16
2877
FFFFFFFFFFFFCE70                                 CSTART:
2878
                                                        ; First save off the link register and OS sp value
2879
FFFFFFFFFFFFCE70        0FEF0008                        subui   sp,sp,#8
2880
FFFFFFFFFFFFCE74        67EF8000                        sw              lr,[sp]
2881
FFFFFFFFFFFFCE78        660F1088                        sw              sp,OSSP
2882
FFFFFFFFFFFFCE7C        460F4E68                        lw              sp,ENDMEM       ; initialize stack pointer
2883
FFFFFFFFFFFFCE80        0FEF0008                        subui   sp,sp,#8
2884
FFFFFFFFFFFFCE84        67EF8000                        sw      lr,[sp]    ; save off return address
2885
FFFFFFFFFFFFCE88        62001416                        sc              r0,CursorRow    ; set screen output
2886
FFFFFFFFFFFFCE8C        62001418                        sc              r0,CursorCol
2887
FFFFFFFFFFFFCE90        6000141A                        sb              r0,CursorFlash
2888
FFFFFFFFFFFFCE94        6600103C                        sw              r0,pos
2889
FFFFFFFFFFFFCE98        E6800020                ; SETLO
2890
FFFFFFFFFFFFCE9C        EE800040                ; SETMID
2891
FFFFFFFFFFFFCEA0        040D0809                        lw              r2,#0x10000020  ; black chars, yellow background
2892
FFFFFFFFFFFFCEA4        64011040                        sh              r2,charToPrint
2893
FFFFFFFFFFFFCEA8        31FFEED9                        call    ClearScreen
2894
FFFFFFFFFFFFCEAC        9A00E5C0                        lea             r1,msgInit      ;       tell who we are
2895
FFFFFFFFFFFFCEB0        31FFF94D                        call    PRMESGAUX
2896
FFFFFFFFFFFFCEB4        9A00E5C0                        lea             r1,msgInit      ;       tell who we are
2897
FFFFFFFFFFFFCEB8        31FFF940                        call    PRMESG
2898
FFFFFFFFFFFFCEBC        4600CE60                        lw              r1,TXTBGN       ;       init. end-of-program pointer
2899
FFFFFFFFFFFFCEC0        660090D0                        sw              r1,TXTUNF
2900
FFFFFFFFFFFFCEC4        4600CE68                        lw              r1,ENDMEM       ;       get address of end of memory
2901
FFFFFFFFFFFFCEC8        0E108800                        subui   r1,r1,#2048     ;       reserve 2K for the stack
2902
FFFFFFFFFFFFCECC        660090F8                        sw              r1,STKBOT
2903
FFFFFFFFFFFFCED0        0E10A000                        subui   r1,r1,#8192 ;   1000 vars
2904
FFFFFFFFFFFFCED4        660090D8                        sw      r1,VARBGN
2905
FFFFFFFFFFFFCED8        31FFF4C3                        call    clearVars   ; clear the variable area
2906
FFFFFFFFFFFFCEDC        460090D8                        lw      r1,VARBGN   ; calculate number of bytes free
2907
FFFFFFFFFFFFCEE0        460190D0                        lw              r3,TXTUNF
2908
FFFFFFFFFFFFCEE4        04118404                        sub     r1,r1,r3
2909
FFFFFFFFFFFFCEE8        E0800000                        setlo   r2,#0
2910
FFFFFFFFFFFFCEEC        31FFF88D                        call    PRTNUM
2911
FFFFFFFFFFFFCEF0        9A00E668                        lea             r1,msgBytesFree
2912
FFFFFFFFFFFFCEF4        31FFF940                        call    PRMESG
2913
FFFFFFFFFFFFCEF8                                 WSTART:
2914
FFFFFFFFFFFFCEF8        660010A8                        sw              r0,LOPVAR   ; initialize internal variables
2915
FFFFFFFFFFFFCEFC        66001098                        sw              r0,STKGOS
2916
FFFFFFFFFFFFCF00        66001090                        sw              r0,CURRNT       ;       current line number pointer = 0
2917
FFFFFFFFFFFFCF04        460F4E68                        lw              sp,ENDMEM       ;       init S.P. again, just in case
2918
FFFFFFFFFFFFCF08        9A00E676                        lea             r1,msgReady     ;       display "Ready"
2919
FFFFFFFFFFFFCF0C        31FFF940                        call    PRMESG
2920
FFFFFFFFFFFFCF10                                 ST3:
2921
FFFFFFFFFFFFCF10        E040003E                        setlo   r1,#'>'         ; Prompt with a '>' and
2922
FFFFFFFFFFFFCF14        31FFF7D8                        call    GETLN           ; read a line.
2923
FFFFFFFFFFFFCF18        31FFF91D                        call    TOUPBUF         ; convert to upper case
2924
FFFFFFFFFFFFCF1C        02860009                        mov             r12,r8          ; save pointer to end of line
2925
FFFFFFFFFFFFCF20        9A04111B                        lea             r8,BUFFER       ; point to the beginning of line
2926
FFFFFFFFFFFFCF24        31FFF8FF                        call    TSTNUM          ; is there a number there?
2927
FFFFFFFFFFFFCF28        31FFF914                        call    IGNBLK          ; skip trailing blanks
2928
                                                 ; does line no. exist? (or nonzero?)
2929
FFFFFFFFFFFFCF2C        BE101728                        beq             r1,r0,DIRECT            ; if not, it's a direct statement
2930
FFFFFFFFFFFFCF30        AC1003FF                        bleu    r1,#0xFFFF,ST2  ; see if line no. is <= 16 bits
2931
FFFFFFFFFFFFCF34        9A00E694                        lea             r1,msgLineRange ; if not, we've overflowed
2932
FFFFFFFFFFFFCF38        BE007F4A                        bra             ERROR
2933
FFFFFFFFFFFFCF3C                                 ST2:
2934
                                                     ; ugliness - store a character at potentially an
2935
                                                     ; odd address (unaligned).
2936
FFFFFFFFFFFFCF3C        02110009                        mov             r2,r1       ; r2 = line number
2937
FFFFFFFFFFFFCF40        60817FFE                        sb              r2,-2[r8]
2938
FFFFFFFFFFFFCF44        06211001                        shrui   r2,r2,#8
2939
FFFFFFFFFFFFCF48        60817FFF                        sb              r2,-1[r8]       ; store the binary line no.
2940
FFFFFFFFFFFFCF4C        0E840002                        subui   r8,r8,#2
2941
FFFFFFFFFFFFCF50        31FFF80C                        call    FNDLN           ; find this line in save area
2942
FFFFFFFFFFFFCF54        02968009                        mov             r13,r9          ; save possible line pointer
2943
FFFFFFFFFFFFCF58        BE1001C8                        beq             r1,r0,ST4       ; if not found, insert
2944
                                                        ; here we found the line, so we're replacing the line
2945
                                                        ; in the text area
2946
                                                        ; first step - delete the line
2947
FFFFFFFFFFFFCF5C        E0400000                        setlo   r1,#0
2948
FFFFFFFFFFFFCF60        31FFF820                        call    FNDNXT          ; find the next line (into r9)
2949
FFFFFFFFFFFFCF64        BE100049                        bne             r1,r0,ST7
2950
FFFFFFFFFFFFCF68        BE900108                        beq             r9,r0,ST6       ; no more lines
2951
FFFFFFFFFFFFCF6C                                 ST7:
2952
FFFFFFFFFFFFCF6C        02908009                        mov             r1,r9           ; r1 = pointer to next line
2953
FFFFFFFFFFFFCF70        02D10009                        mov             r2,r13          ; pointer to line to be deleted
2954
FFFFFFFFFFFFCF74        460190D0                        lw              r3,TXTUNF       ; points to top of save area
2955
FFFFFFFFFFFFCF78        31FFF829                        call    MVUP            ; move up to delete
2956
FFFFFFFFFFFFCF7C        660110D0                        sw              r2,TXTUNF       ; update the end pointer
2957
                                                        ; we moved the lines of text after the line being
2958
                                                        ; deleted down, so the pointer to the next line
2959
                                                        ; needs to be reset
2960
FFFFFFFFFFFFCF80        02D48009                        mov             r9,r13
2961
FFFFFFFFFFFFCF84        BE00006A                        bra             ST4
2962
                                                        ; here there were no more lines, so just move the
2963
                                                        ; end of text pointer down
2964
FFFFFFFFFFFFCF88                                 ST6:
2965
FFFFFFFFFFFFCF88        660690D0                        sw              r13,TXTUNF
2966
FFFFFFFFFFFFCF8C        02D48009                        mov             r9,r13
2967
FFFFFFFFFFFFCF90                                 ST4:
2968
                                                        ; here we're inserting because the line wasn't found
2969
                                                        ; or it was deleted     from the text area
2970
FFFFFFFFFFFFCF90        02C08009                        mov             r1,r12          ; calculate the length of new line
2971
FFFFFFFFFFFFCF94        04140404                        sub             r1,r1,r8
2972
FFFFFFFFFFFFCF98        A41FDE03                        blei    r1,#3,ST3       ; is it just a line no. & CR? if so, it was just a delete
2973
 
2974
FFFFFFFFFFFFCF9C        460590D0                        lw              r11,TXTUNF      ; compute new end of text
2975
FFFFFFFFFFFFCFA0        02B50009                        mov             r10,r11         ; r10 = old TXTUNF
2976
FFFFFFFFFFFFCFA4        04B0AC02                        add             r11,r11,r1              ; r11 = new top of TXTUNF (r1=line length)
2977
 
2978
FFFFFFFFFFFFCFA8        460090D8                        lw              r1,VARBGN       ; see if there's enough room
2979
FFFFFFFFFFFFCFAC        BEB08064                        bltu    r11,r1,ST5
2980
FFFFFFFFFFFFCFB0        9A00E76F                        lea             r1,msgTooBig    ; if not, say so
2981
FFFFFFFFFFFFCFB4        33FFF7C8                        jmp             ERROR
2982
 
2983
                                                        ; open a space in the text area
2984
FFFFFFFFFFFFCFB8                                 ST5:
2985
FFFFFFFFFFFFCFB8        660590D0                        sw              r11,TXTUNF      ; if so, store new end position
2986
FFFFFFFFFFFFCFBC        02A08009                        mov             r1,r10          ; points to old end of text
2987
FFFFFFFFFFFFCFC0        02B10009                        mov             r2,r11          ; points to new end of text
2988
FFFFFFFFFFFFCFC4        02918009                        mov             r3,r9       ; points to start of line after insert line
2989
FFFFFFFFFFFFCFC8        31FFF82F                        call    MVDOWN          ; move things out of the way
2990
 
2991
                                                        ; copy line into text space
2992
FFFFFFFFFFFFCFCC        02808009                        mov             r1,r8           ; set up to do the insertion; move from buffer
2993
FFFFFFFFFFFFCFD0        02D10009                        mov             r2,r13          ; to vacated space
2994
FFFFFFFFFFFFCFD4        02C18009                        mov             r3,r12          ; until end of buffer
2995
FFFFFFFFFFFFCFD8        31FFF829                        call    MVUP            ; do it
2996
FFFFFFFFFFFFCFDC        BE0079AA                        bra             ST3                     ; go back and get another line
2997
 
2998
                                                 ;******************************************************************
2999
                                                 ;
3000
                                                 ; *** Tables *** DIRECT *** EXEC ***
3001
                                                 ;
3002
                                                 ; This section of the code tests a string against a table. When
3003
                                                 ; a match is found, control is transferred to the section of
3004
                                                 ; code according to the table.
3005
                                                 ;
3006
                                                 ; At 'EXEC', r8 should point to the string, r9 should point to
3007
                                                 ; the character table, and r10 should point to the execution
3008
                                                 ; table. At 'DIRECT', r8 should point to the string, r9 and
3009
                                                 ; r10 will be set up to point to TAB1 and TAB1_1, which are
3010
                                                 ; the tables of all direct and statement commands.
3011
                                                 ;
3012
                                                 ; A '.' in the string will terminate the test and the partial
3013
                                                 ; match will be considered as a match, e.g. 'P.', 'PR.','PRI.',
3014
                                                 ; 'PRIN.', or 'PRINT' will all match 'PRINT'.
3015
                                                 ;
3016
                                                 ; There are two tables: the character table and the execution
3017
                                                 ; table. The character table consists of any number of text items.
3018
                                                 ; Each item is a string of characters with the last character's
3019
                                                 ; high bit set to one. The execution table holds a 32-bit
3020
                                                 ; execution addresses that correspond to each entry in the
3021
                                                 ; character table.
3022
                                                 ;
3023
                                                 ; The end of the character table is a 0 byte which corresponds
3024
                                                 ; to the default routine in the execution table, which is
3025
                                                 ; executed if none of the other table items are matched.
3026
                                                 ;
3027
                                                 ; Character-matching tables:
3028
FFFFFFFFFFFFCFE0                                        align   8
3029
FFFFFFFFFFFFCFE0                                 TAB1:
3030
FFFFFFFFFFFFCFE0 C4414F4CD453494C               db      "LOA",'D'+0x80
3031
FFFFFFFFFFFFCFE8 4153CE5552D7454E               db      "SAV",'E'+0x80
3032
FFFFFFFFFFFFCFF2                                 TAB2:
3033
FFFFFFFFFFFFCFF0 454CD458454EC556               db      "LE",'T'+0x80
3034
FFFFFFFFFFFFCFF8 47CF544F47C649D4               db      "GOSU",'B'+0x80
3035
FFFFFFFFFFFFD000 55544552C255534F               db      "RETUR",'N'+0x80
3036
FFFFFFFFFFFFD008 D24F46CD4552CE52               db      "FO",'R'+0x80
3037
FFFFFFFFFFFFD010 495250D455504E49               db      "PRIN",'T'+0x80
3038
FFFFFFFFFFFFD018 50C3454B4F50D44E               db      "POKE",'H'+0x80
3039
FFFFFFFFFFFFD020 454B4F50C8454B4F               db      "POKE",'W'+0x80
3040
FFFFFFFFFFFFD028 4F5453C54B4F50D7               db      "STO",'P'+0x80
3041
FFFFFFFFFFFFD030 43D35953C55942D0               db      "CL",'S'+0x80
3042
FFFFFFFFFFFFD038 434452D24C43D34C            db "RDC",'F'+0x80
3043
FFFFFFFFFFFFD042                                 TAB4:
3044
FFFFFFFFFFFFD040 50C34B45455000C6               db      "PEEK",'H'+0x80        ;Functions
3045
FFFFFFFFFFFFD048 4B454550C84B4545               db      "PEEK",'W'+0x80        ;Functions
3046
FFFFFFFFFFFFD050 C44E52CB454550D7               db      "RN",'D'+0x80
3047
FFFFFFFFFFFFD058 55C55A4953D34241               db  "US",'R'+0x80
3048
FFFFFFFFFFFFD063                                 TAB5:
3049
FFFFFFFFFFFFD066                                 TAB6:
3050
FFFFFFFFFFFFD060 545300CF5400D253               db      "STE",'P'+0x80         ;"STEP" in "FOR"
3051
FFFFFFFFFFFFD06B                                 TAB8:
3052
FFFFFFFFFFFFD068 BEBE3CBD3E00D045               db      '>'+0x80
3053
FFFFFFFFFFFFD075                                 TAB9:
3054
FFFFFFFFFFFFD070 C44E4100BCBD3CBD            db  "AN",'D'+0x80
3055
FFFFFFFFFFFFD079                                 TAB10:
3056
 
3057
FFFFFFFFFFFFD080                                        .align  8
3058
 
3059
                                                 ;* Execution address tables:
3060
FFFFFFFFFFFFD080                                 TAB1_1:
3061
FFFFFFFFFFFFD080 FFFFFFFFFFFFD338               dw      LISTX                   ;Direct commands
3062
FFFFFFFFFFFFD088 FFFFFFFFFFFFD67C               dw      LOAD
3063
FFFFFFFFFFFFD090 FFFFFFFFFFFFD284               dw      NEW
3064
FFFFFFFFFFFFD098 FFFFFFFFFFFFD29C               dw      RUN
3065
FFFFFFFFFFFFD0A0 FFFFFFFFFFFFD728               dw      SAVE
3066
FFFFFFFFFFFFD0A8                                 TAB2_1:
3067
FFFFFFFFFFFFD0A8 FFFFFFFFFFFFD508               dw      NEXT            ;       Direct / statement
3068
FFFFFFFFFFFFD0B0 FFFFFFFFFFFFD664               dw      LET
3069
FFFFFFFFFFFFD0B8 FFFFFFFFFFFFD578               dw      IF
3070
FFFFFFFFFFFFD0C0 FFFFFFFFFFFFD2E4               dw      GOTO
3071
FFFFFFFFFFFFD0C8 FFFFFFFFFFFFD418               dw      GOSUB
3072
FFFFFFFFFFFFD0D0 FFFFFFFFFFFFD454               dw      RETURN
3073
FFFFFFFFFFFFD0D8 FFFFFFFFFFFFD580               dw      IF2                     ; REM
3074
FFFFFFFFFFFFD0E0 FFFFFFFFFFFFD48C               dw      FOR
3075
FFFFFFFFFFFFD0E8 FFFFFFFFFFFFD5A8               dw      INPUT
3076
FFFFFFFFFFFFD0F0 FFFFFFFFFFFFD380               dw      PRINT
3077
FFFFFFFFFFFFD0F8 FFFFFFFFFFFFD83C               dw      POKEC
3078
FFFFFFFFFFFFD100 FFFFFFFFFFFFD868               dw      POKEH
3079
FFFFFFFFFFFFD108 FFFFFFFFFFFFD894               dw      POKEW
3080
FFFFFFFFFFFFD110 FFFFFFFFFFFFD808               dw      POKE
3081
FFFFFFFFFFFFD118 FFFFFFFFFFFFD294               dw      STOP
3082
FFFFFFFFFFFFD120 FFFFFFFFFFFFCE5C               dw      GOBYE
3083
FFFFFFFFFFFFD128 FFFFFFFFFFFFD8C0               dw      SYSX
3084
FFFFFFFFFFFFD130 FFFFFFFFFFFFE58C               dw      _cls
3085
FFFFFFFFFFFFD138 FFFFFFFFFFFFD304               dw  _clr
3086
FFFFFFFFFFFFD140 FFFFFFFFFFFFE5A0               dw      _rdcf
3087
FFFFFFFFFFFFD148 FFFFFFFFFFFFD65C               dw      DEFLT
3088
FFFFFFFFFFFFD150                                 TAB4_1:
3089
FFFFFFFFFFFFD150 FFFFFFFFFFFFDD3C               dw  PEEKC
3090
FFFFFFFFFFFFD158 FFFFFFFFFFFFDD50               dw  PEEKH
3091
FFFFFFFFFFFFD160 FFFFFFFFFFFFDD64               dw  PEEKW
3092
FFFFFFFFFFFFD168 FFFFFFFFFFFFDD2C               dw      PEEK                    ;Functions
3093
FFFFFFFFFFFFD170 FFFFFFFFFFFFDD94               dw      RND
3094
FFFFFFFFFFFFD178 FFFFFFFFFFFFDE2C               dw      ABS
3095
FFFFFFFFFFFFD180 FFFFFFFFFFFFDE4C               dw      SIZEX
3096
FFFFFFFFFFFFD188 FFFFFFFFFFFFDD78               dw  USRX
3097
FFFFFFFFFFFFD190 FFFFFFFFFFFFDB50               dw      XP40
3098
FFFFFFFFFFFFD198                                 TAB5_1
3099
FFFFFFFFFFFFD198 FFFFFFFFFFFFD4A4               dw      FR1                     ;"TO" in "FOR"
3100
FFFFFFFFFFFFD1A0 FFFFFFFFFFFFDF1C               dw      QWHAT
3101
FFFFFFFFFFFFD1A8                                 TAB6_1
3102
FFFFFFFFFFFFD1A8 FFFFFFFFFFFFD4B8               dw      FR2                     ;"STEP" in "FOR"
3103
FFFFFFFFFFFFD1B0 FFFFFFFFFFFFD4C0               dw      FR3
3104
FFFFFFFFFFFFD1B8                                 TAB8_1
3105
FFFFFFFFFFFFD1B8 FFFFFFFFFFFFD9D0               dw      XP11    ;>=             Relational operators
3106
FFFFFFFFFFFFD1C0 FFFFFFFFFFFFD9E0               dw      XP12    ;<>
3107
FFFFFFFFFFFFD1C8 FFFFFFFFFFFFD9F0               dw      XP13    ;>
3108
FFFFFFFFFFFFD1D0 FFFFFFFFFFFFDA10               dw      XP15    ;=
3109
FFFFFFFFFFFFD1D8 FFFFFFFFFFFFDA00               dw      XP14    ;<=
3110
FFFFFFFFFFFFD1E0 FFFFFFFFFFFFDA20               dw      XP16    ;<
3111
FFFFFFFFFFFFD1E8 FFFFFFFFFFFFDA48               dw      XP17
3112
FFFFFFFFFFFFD1F0                                 TAB9_1
3113
FFFFFFFFFFFFD1F0 FFFFFFFFFFFFD93C            dw  XP_AND
3114
FFFFFFFFFFFFD1F8 FFFFFFFFFFFFD94C            dw  XP_ANDX
3115
FFFFFFFFFFFFD200                                 TAB10_1
3116
FFFFFFFFFFFFD200 FFFFFFFFFFFFD904            dw  XP_OR
3117
FFFFFFFFFFFFD208 FFFFFFFFFFFFD914            dw  XP_ORX
3118
 
3119
FFFFFFFFFFFFD210                                        .align  16
3120
 
3121 27 robfinch
                                                 ;*
3122 43 robfinch
                                                 ; r3 = match flag (trashed)
3123
                                                 ; r9 = text table
3124
                                                 ; r10 = exec table
3125
                                                 ; r11 = trashed
3126
FFFFFFFFFFFFD210                                 DIRECT:
3127
FFFFFFFFFFFFD210        9A04CFE0                        lea             r9,TAB1
3128
FFFFFFFFFFFFD214        9A055080                        lea             r10,TAB1_1
3129
FFFFFFFFFFFFD218                                 EXEC:
3130
FFFFFFFFFFFFD218        03F58009                        mov             r11,lr          ; save link reg
3131
FFFFFFFFFFFFD21C        31FFF914                        call    IGNBLK          ; ignore leading blanks
3132
FFFFFFFFFFFFD220        02BF8009                        mov             lr,r11          ; restore link reg
3133
FFFFFFFFFFFFD224        02858009                        mov             r11,r8          ; save the pointer
3134
FFFFFFFFFFFFD228        E0C00000                        setlo   r3,#0           ; clear match flag
3135
FFFFFFFFFFFFD22C                                 EXLP:
3136
FFFFFFFFFFFFD22C        4A808000                        lbu             r1,[r8]         ; get the program character
3137
FFFFFFFFFFFFD230        0A840001                        addui   r8,r8,#1
3138
FFFFFFFFFFFFD234        4A910000                        lbu             r2,[r9]         ; get the table character
3139
FFFFFFFFFFFFD238        BE200069                        bne             r2,r0,EXNGO             ; If end of table,
3140
FFFFFFFFFFFFD23C        02B40009                        mov             r8,r11          ;       restore the text pointer and...
3141
FFFFFFFFFFFFD240        BE0001EA                        bra             EXGO            ;   execute the default.
3142
FFFFFFFFFFFFD244                                 EXNGO:
3143
FFFFFFFFFFFFD244        BE1181C8                        beq             r1,r3,EXGO      ; Else check for period... if so, execute
3144
FFFFFFFFFFFFD248        1421007F                        andi    r2,r2,#0x7f     ; ignore the table's high bit
3145
FFFFFFFFFFFFD24C        BE208108                        beq             r2,r1,EXMAT;            is there a match?
3146
FFFFFFFFFFFFD250        0AA50008                        addui   r10,r10,#8      ;if not, try the next entry
3147
FFFFFFFFFFFFD254        02B40009                        mov             r8,r11          ; reset the program pointer
3148
FFFFFFFFFFFFD258        E0C00000                        setlo   r3,#0           ; sorry, no match
3149
FFFFFFFFFFFFD25C                                 EX1:
3150
FFFFFFFFFFFFD25C        0A948001                        addui   r9,r9,#1
3151
FFFFFFFFFFFFD260        4090FFFF                        lb              r1,-1[r9]       ; get to the end of the entry
3152
FFFFFFFFFFFFD264        BE107FC3                        bgt             r1,r0,EX1
3153
FFFFFFFFFFFFD268        BE007E2A                        bra             EXLP            ; back for more matching
3154
FFFFFFFFFFFFD26C                                 EXMAT:
3155
FFFFFFFFFFFFD26C        E0C0002E                        setlo   r3,#'.'         ; we've got a match so far
3156
FFFFFFFFFFFFD270        0A948001                        addui   r9,r9,#1
3157
FFFFFFFFFFFFD274        4090FFFF                        lb              r1,-1[r9]       ; end of table entry?
3158
FFFFFFFFFFFFD278        BE107DA3                        bgt             r1,r0,EXLP              ; if not, go back for more
3159
FFFFFFFFFFFFD27C                                 EXGO:
3160
FFFFFFFFFFFFD27C        46A58000                        lw              r11,[r10]       ; execute the appropriate routine
3161
FFFFFFFFFFFFD280        34B00000                        jal             r0,[r11]
3162
 
3163
                                                 ;    lb      r1,[r8]     ; get token from text space
3164
                                                 ;    bpl
3165
                                                 ;    and     r1,#0x7f
3166
                                                 ;    shl     r1,#2       ; * 4 - word offset
3167
                                                 ;    add     r1,r1,#TAB1_1
3168
                                                 ;    lw      r1,[r1]
3169
                                                 ;    jmp     [r1]
3170
 
3171
 
3172
                                                 ;******************************************************************
3173
                                                 ;
3174
                                                 ; What follows is the code to execute direct and statement
3175
                                                 ; commands. Control is transferred to these points via the command
3176
                                                 ; table lookup code of 'DIRECT' and 'EXEC' in the last section.
3177
                                                 ; After the command is executed, control is transferred to other
3178
                                                 ; sections as follows:
3179
                                                 ;
3180
                                                 ; For 'LISTX', 'NEW', and 'STOP': go back to the warm start point.
3181
                                                 ; For 'RUN': go execute the first stored line if any; else go
3182
                                                 ; back to the warm start point.
3183
                                                 ; For 'GOTO' and 'GOSUB': go execute the target line.
3184
                                                 ; For 'RETURN' and 'NEXT'; go back to saved return line.
3185
                                                 ; For all others: if 'CURRNT' is 0, go to warm start; else go
3186
                                                 ; execute next command. (This is done in 'FINISH'.)
3187
                                                 ;
3188
                                                 ;******************************************************************
3189
                                                 ;
3190
                                                 ; *** NEW *** STOP *** RUN (& friends) *** GOTO ***
3191
                                                 ;
3192
                                                 ; 'NEW' sets TXTUNF to point to TXTBGN
3193
                                                 ;
3194
                                                 ; 'STOP' goes back to WSTART
3195
                                                 ;
3196
                                                 ; 'RUN' finds the first stored line, stores its address
3197
                                                 ; in CURRNT, and starts executing it. Note that only those
3198
                                                 ; commands in TAB2 are legal for a stored program.
3199
                                                 ;
3200
                                                 ; There are 3 more entries in 'RUN':
3201
                                                 ; 'RUNNXL' finds next line, stores it's address and executes it.
3202
                                                 ; 'RUNTSL' stores the address of this line and executes it.
3203
                                                 ; 'RUNSML' continues the execution on same line.
3204
                                                 ;
3205
                                                 ; 'GOTO expr' evaluates the expression, finds the target
3206
                                                 ; line, and jumps to 'RUNTSL' to do it.
3207
                                                 ;
3208
FFFFFFFFFFFFD284                                 NEW:
3209
FFFFFFFFFFFFD284        31FFF7B9                        call    ENDCHK
3210
FFFFFFFFFFFFD288        4600CE60                        lw              r1,TXTBGN
3211
FFFFFFFFFFFFD28C        660090D0                        sw              r1,TXTUNF       ;       set the end pointer
3212
FFFFFFFFFFFFD290        31FFF4C3                        call    clearVars
3213
 
3214
FFFFFFFFFFFFD294                                 STOP:
3215
FFFFFFFFFFFFD294        31FFF7B9                        call    ENDCHK
3216
FFFFFFFFFFFFD298        BE00630A                        bra             WSTART          ; WSTART will reset the stack
3217
 
3218
FFFFFFFFFFFFD29C                                 RUN:
3219
FFFFFFFFFFFFD29C        31FFF7B9                        call    ENDCHK
3220
FFFFFFFFFFFFD2A0        46044E60                        lw              r8,TXTBGN       ;       set pointer to beginning
3221
FFFFFFFFFFFFD2A4        66041090                        sw              r8,CURRNT
3222
FFFFFFFFFFFFD2A8        31FFF4C3                        call    clearVars
3223
 
3224
FFFFFFFFFFFFD2AC                                 RUNNXL:                                        ; RUN 
3225
FFFFFFFFFFFFD2AC        46009090                        lw              r1,CURRNT       ; executing a program?
3226
FFFFFFFFFFFFD2B0        BE106248                        beq             r1,r0,WSTART    ; if not, we've finished a direct stat.
3227
FFFFFFFFFFFFD2B4        E0400000                        setlo   r1,#0       ; else find the next line number
3228
FFFFFFFFFFFFD2B8        02848009                        mov             r9,r8
3229
FFFFFFFFFFFFD2BC        31FFF810                        call    FNDLNP          ; search for the next line
3230
FFFFFFFFFFFFD2C0        BE100069                        bne             r1,r0,RUNTSL
3231
FFFFFFFFFFFFD2C4        BE900049                        bne             r9,r0,RUNTSL
3232
FFFFFFFFFFFFD2C8        BE00618A                        bra             WSTART          ; if we've fallen off the end, stop
3233
 
3234
FFFFFFFFFFFFD2CC                                 RUNTSL:                                        ; RUN 
3235
FFFFFFFFFFFFD2CC        66049090                        sw              r9,CURRNT       ; set CURRNT to point to the line no.
3236
FFFFFFFFFFFFD2D0        9A940002                        lea             r8,2[r9]        ; set the text pointer to
3237
 
3238
FFFFFFFFFFFFD2D4                                 RUNSML:                 ; RUN 
3239
FFFFFFFFFFFFD2D4        31FFF936                        call    CHKIO           ; see if a control-C was pressed
3240
FFFFFFFFFFFFD2D8        9A04CFF2                        lea             r9,TAB2         ; find command in TAB2
3241
FFFFFFFFFFFFD2DC        9A0550A8                        lea             r10,TAB2_1
3242
FFFFFFFFFFFFD2E0        BE0079CA                        bra             EXEC            ; and execute it
3243
 
3244
FFFFFFFFFFFFD2E4                                 GOTO:
3245
FFFFFFFFFFFFD2E4        31FFF63A                        call    OREXPR          ;evaluate the following expression
3246
FFFFFFFFFFFFD2E8        02128009                        mov     r5,r1
3247
FFFFFFFFFFFFD2EC        31FFF7B9                        call    ENDCHK          ;must find end of line
3248
FFFFFFFFFFFFD2F0        02508009                        mov     r1,r5
3249
FFFFFFFFFFFFD2F4        31FFF80C                        call    FNDLN           ; find the target line
3250
FFFFFFFFFFFFD2F8        BE107EA9                        bne             r1,r0,RUNTSL            ; go do it
3251
FFFFFFFFFFFFD2FC        9A00E73B                        lea             r1,msgBadGotoGosub
3252
FFFFFFFFFFFFD300        BE00610A                        bra             ERROR           ; no such line no.
3253
 
3254
FFFFFFFFFFFFD304                                 _clr:
3255
FFFFFFFFFFFFD304        31FFF4C3                     call    clearVars
3256
FFFFFFFFFFFFD308        BE00084A                     bra     FINISH
3257
 
3258
                                                 ; Clear the variable area of memory
3259
FFFFFFFFFFFFD30C                                 clearVars:
3260
FFFFFFFFFFFFD30C        0FEF0010                     subui   sp,sp,#16
3261
FFFFFFFFFFFFD310        67E30000                     sw         r6,[sp]
3262
FFFFFFFFFFFFD314        67EF8008                     sw         lr,8[sp]
3263
FFFFFFFFFFFFD318        E1800800                     setlo   r6,#2048    ; number of words to clear
3264
FFFFFFFFFFFFD31C        460090D8                     lw      r1,VARBGN
3265
FFFFFFFFFFFFD320                                 cv1:
3266
FFFFFFFFFFFFD320        66100000                     sw      r0,[r1]
3267
FFFFFFFFFFFFD324        08108008                     add     r1,r1,#8
3268
FFFFFFFFFFFFD328        BE037FCF                     loop       r6,cv1
3269
FFFFFFFFFFFFD32C        47EF8008                     lw         lr,8[sp]
3270
FFFFFFFFFFFFD330        47E30000                     lw         r6,[sp]
3271
FFFFFFFFFFFFD334        37EF8010                     ret                #16
3272
 
3273
 
3274
                                                 ;******************************************************************
3275
                                                 ; LIST
3276
                                                 ;
3277
                                                 ; LISTX has two forms:
3278
                                                 ; 'LIST' lists all saved lines
3279
                                                 ; 'LIST #' starts listing at the line #
3280
                                                 ; Control-S pauses the listing, control-C stops it.
3281
                                                 ;******************************************************************
3282
                                                 ;
3283
FFFFFFFFFFFFD338                                 LISTX:
3284
FFFFFFFFFFFFD338        31FFF8FF                        call    TSTNUM          ; see if there's a line no.
3285
FFFFFFFFFFFFD33C        02128009                        mov     r5,r1
3286
FFFFFFFFFFFFD340        31FFF7B9                        call    ENDCHK          ; if not, we get a zero
3287
FFFFFFFFFFFFD344        02508009                        mov     r1,r5
3288
FFFFFFFFFFFFD348        31FFF80C                        call    FNDLN           ; find this or next line
3289
FFFFFFFFFFFFD34C                                 LS1:
3290
FFFFFFFFFFFFD34C        BE100049                        bne             r1,r0,LS4
3291
FFFFFFFFFFFFD350        BE905D48                        beq             r9,r0,WSTART    ; warm start if we passed the end
3292
FFFFFFFFFFFFD354                                 LS4:
3293
FFFFFFFFFFFFD354        02908009                        mov             r1,r9
3294
FFFFFFFFFFFFD358        31FFF8DF                        call    PRTLN           ; print the line
3295
FFFFFFFFFFFFD35C        02148009                        mov             r9,r1           ; set pointer for next
3296
FFFFFFFFFFFFD360        31FFF936                        call    CHKIO           ; check for listing halt request
3297
FFFFFFFFFFFFD364        BE100088                        beq             r1,r0,LS3
3298
FFFFFFFFFFFFD368        B2100313                        bnei    r1,#CTRLS,LS3   ; pause the listing?
3299
FFFFFFFFFFFFD36C                                 LS2:
3300
FFFFFFFFFFFFD36C        31FFF936                        call    CHKIO           ; if so, wait for another keypress
3301
FFFFFFFFFFFFD370        BE107FE8                        beq             r1,r0,LS2
3302
FFFFFFFFFFFFD374                                 LS3:
3303
FFFFFFFFFFFFD374        E0400000                        setlo   r1,#0
3304
FFFFFFFFFFFFD378        31FFF810                        call    FNDLNP          ; find the next line
3305
FFFFFFFFFFFFD37C        BE007E8A                        bra             LS1
3306
 
3307
 
3308
                                                 ;******************************************************************
3309
                                                 ; PRINT command is 'PRINT ....:' or 'PRINT ....'
3310
                                                 ; where '....' is a list of expressions, formats, back-arrows,
3311
                                                 ; and strings. These items a separated by commas.
3312
                                                 ;
3313
                                                 ; A format is a pound sign followed by a number.  It controls
3314
                                                 ; the number of spaces the value of an expression is going to
3315
                                                 ; be printed in.  It stays effective for the rest of the print
3316
                                                 ; command unless changed by another format.  If no format is
3317
                                                 ; specified, 11 positions will be used.
3318
                                                 ;
3319
                                                 ; A string is quoted in a pair of single- or double-quotes.
3320
                                                 ;
3321
                                                 ; An underline (back-arrow) means generate a  without a 
3322
                                                 ;
3323
                                                 ; A  is generated after the entire list has been printed
3324
                                                 ; or if the list is empty.  If the list ends with a semicolon,
3325
                                                 ; however, no  is generated.
3326
                                                 ;******************************************************************
3327
                                                 ;
3328
FFFFFFFFFFFFD380                                 PRINT:
3329
FFFFFFFFFFFFD380        1602800B                        lw              r5,#11          ; D4 = number of print spaces
3330
FFFFFFFFFFFFD384        E0C0003A                        setlo   r3,#':'
3331
FFFFFFFFFFFFD388        9A025398                        lea             r4,PR2
3332
FFFFFFFFFFFFD38C        31FFF8F1                        call    TSTC            ; if null list and ":"
3333
FFFFFFFFFFFFD390        31FFEFFA                        call    CRLF            ; give CR-LF and continue
3334
FFFFFFFFFFFFD394        BE007A0A                        bra             RUNSML          ;               execution on the same line
3335
FFFFFFFFFFFFD398                                 PR2:
3336
FFFFFFFFFFFFD398        E0C0000D                        setlo   r3,#CR
3337
FFFFFFFFFFFFD39C        9A0253AC                        lea             r4,PR0
3338
FFFFFFFFFFFFD3A0        31FFF8F1                        call    TSTC            ;if null list and 
3339
FFFFFFFFFFFFD3A4        31FFEFFA                        call    CRLF            ;also give CR-LF and
3340
FFFFFFFFFFFFD3A8        BE00782A                        bra             RUNNXL          ;execute the next line
3341
FFFFFFFFFFFFD3AC                                 PR0:
3342
FFFFFFFFFFFFD3AC        E0C00023                        setlo   r3,#'#'
3343
FFFFFFFFFFFFD3B0        9A0253C4                        lea             r4,PR1
3344
FFFFFFFFFFFFD3B4        31FFF8F1                        call    TSTC            ;else is it a format?
3345
FFFFFFFFFFFFD3B8        31FFF63A                        call    OREXPR          ; yes, evaluate expression
3346
FFFFFFFFFFFFD3BC        04101409                        lw              r5,r1           ; and save it as print width
3347
FFFFFFFFFFFFD3C0        BE00012A                        bra             PR3             ; look for more to print
3348
FFFFFFFFFFFFD3C4                                 PR1:
3349
FFFFFFFFFFFFD3C4        E0C00024                        setlo   r3,#'$'
3350
FFFFFFFFFFFFD3C8        9A0253DC                        lea             r4,PR4
3351
FFFFFFFFFFFFD3CC        31FFF8F1                        call    TSTC    ;       is character expression? (MRL)
3352
FFFFFFFFFFFFD3D0        31FFF63A                        call    OREXPR  ;       yep. Evaluate expression (MRL)
3353
FFFFFFFFFFFFD3D4        31FFF393                        call    GOOUT   ;       print low byte (MRL)
3354
FFFFFFFFFFFFD3D8        BE00006A                        bra             PR3             ;look for more. (MRL)
3355
FFFFFFFFFFFFD3DC                                 PR4:
3356
FFFFFFFFFFFFD3DC        31FFF867                        call    QTSTG   ;       is it a string?
3357
                                                        ; the following branch must occupy only two bytes!
3358
FFFFFFFFFFFFD3E0        BE00010A                        bra             PR8             ;       if not, must be an expression
3359
FFFFFFFFFFFFD3E4                                 PR3:
3360
FFFFFFFFFFFFD3E4        E0C0002C                        setlo   r3,#','
3361
FFFFFFFFFFFFD3E8        9A0253F8                        lea             r4,PR6
3362
FFFFFFFFFFFFD3EC        31FFF8F1                        call    TSTC    ;       if ",", go find next
3363
FFFFFFFFFFFFD3F0        31FFF7AA                        call    FIN             ;in the list.
3364
FFFFFFFFFFFFD3F4        BE007DCA                        bra             PR0
3365
FFFFFFFFFFFFD3F8                                 PR6:
3366
FFFFFFFFFFFFD3F8        31FFEFFA                        call    CRLF            ;list ends here
3367
FFFFFFFFFFFFD3FC        BE0000AA                        bra             FINISH
3368
FFFFFFFFFFFFD400                                 PR8:
3369
FFFFFFFFFFFFD400        31FFF63A                        call    OREXPR          ; evaluate the expression
3370
FFFFFFFFFFFFD404        04500809                        lw              r2,r5           ; set the width
3371
FFFFFFFFFFFFD408        31FFF88D                        call    PRTNUM          ; print its value
3372
FFFFFFFFFFFFD40C        BE007ECA                        bra             PR3                     ; more to print?
3373
 
3374
FFFFFFFFFFFFD410                                 FINISH:
3375
FFFFFFFFFFFFD410        31FFF7AA                        call    FIN             ; Check end of command
3376
FFFFFFFFFFFFD414        33FFF7C7                        jmp             QWHAT   ; print "What?" if wrong
3377
 
3378
 
3379
                                                 ;*******************************************************************
3380
                                                 ;
3381
                                                 ; *** GOSUB *** & RETURN ***
3382
                                                 ;
3383
                                                 ; 'GOSUB expr:' or 'GOSUB expr' is like the 'GOTO' command,
3384
                                                 ; except that the current text pointer, stack pointer, etc. are
3385
                                                 ; saved so that execution can be continued after the subroutine
3386
                                                 ; 'RETURN's.  In order that 'GOSUB' can be nested (and even
3387
                                                 ; recursive), the save area must be stacked.  The stack pointer
3388
                                                 ; is saved in 'STKGOS'.  The old 'STKGOS' is saved on the stack.
3389
                                                 ; If we are in the main routine, 'STKGOS' is zero (this was done
3390
                                                 ; in the initialization section of the interpreter), but we still
3391
                                                 ; save it as a flag for no further 'RETURN's.
3392
                                                 ;******************************************************************
3393
                                                 ;
3394
FFFFFFFFFFFFD418                                 GOSUB:
3395
FFFFFFFFFFFFD418        31FFF83E                        call    PUSHA           ; save the current 'FOR' parameters
3396
FFFFFFFFFFFFD41C        31FFF63A                        call    OREXPR          ; get line number
3397
FFFFFFFFFFFFD420        31FFF80C                        call    FNDLN           ; find the target line
3398
FFFFFFFFFFFFD424        BE100069                        bne             r1,r0,gosub1
3399
FFFFFFFFFFFFD428        9A00E73B                        lea             r1,msgBadGotoGosub
3400
FFFFFFFFFFFFD42C        BE0057AA                        bra             ERROR           ; if not there, say "How?"
3401
FFFFFFFFFFFFD430                                 gosub1:
3402
FFFFFFFFFFFFD430        0DEF0018                        sub             sp,sp,#24
3403
FFFFFFFFFFFFD434        67E40000                        sw              r8,[sp]         ; save text pointer
3404
FFFFFFFFFFFFD438        46009090                        lw              r1,CURRNT
3405
FFFFFFFFFFFFD43C        67E08008                        sw              r1,8[sp]        ; found it, save old 'CURRNT'...
3406
FFFFFFFFFFFFD440        46009098                        lw              r1,STKGOS
3407
FFFFFFFFFFFFD444        67E08010                        sw              r1,16[sp]       ; and 'STKGOS'
3408
FFFFFFFFFFFFD448        660010A8                        sw              r0,LOPVAR       ; load new values
3409
FFFFFFFFFFFFD44C        660F1098                        sw              sp,STKGOS
3410
FFFFFFFFFFFFD450        BE0073EA                        bra             RUNTSL
3411
 
3412
 
3413
                                                 ;******************************************************************
3414
                                                 ; 'RETURN' undoes everything that 'GOSUB' did, and thus
3415
                                                 ; returns the execution to the command after the most recent
3416
                                                 ; 'GOSUB'.  If 'STKGOS' is zero, it indicates that we never had
3417
                                                 ; a 'GOSUB' and is thus an error.
3418
                                                 ;******************************************************************
3419
                                                 ;
3420
FFFFFFFFFFFFD454                                 RETURN:
3421
FFFFFFFFFFFFD454        31FFF7B9                        call    ENDCHK          ; there should be just a 
3422
FFFFFFFFFFFFD458        46009098                        lw              r1,STKGOS       ; get old stack pointer
3423
FFFFFFFFFFFFD45C        BE100069                        bne             r1,r0,return1
3424
FFFFFFFFFFFFD460        9A00E758                        lea             r1,msgRetWoGosub
3425
FFFFFFFFFFFFD464        BE0055EA                        bra             ERROR           ; if zero, it doesn't exist
3426
FFFFFFFFFFFFD468                                 return1:
3427
FFFFFFFFFFFFD468        021F0009                        mov             sp,r1           ; else restore it
3428
FFFFFFFFFFFFD46C        47E08010                        lw              r1,16[sp]
3429
FFFFFFFFFFFFD470        66009098                        sw              r1,STKGOS       ; and the old 'STKGOS'
3430
FFFFFFFFFFFFD474        47E08008                        lw              r1,8[sp]
3431
FFFFFFFFFFFFD478        66009090                        sw              r1,CURRNT       ; and the old 'CURRNT'
3432
FFFFFFFFFFFFD47C        47E40000                        lw              r8,[sp]         ; and the old text pointer
3433
FFFFFFFFFFFFD480        09EF0018                        add             sp,sp,#24
3434
FFFFFFFFFFFFD484        31FFF831                        call    POPA            ;and the old 'FOR' parameters
3435
FFFFFFFFFFFFD488        BE007C4A                        bra             FINISH          ;and we are back home
3436
 
3437
                                                 ;******************************************************************
3438
                                                 ; *** FOR *** & NEXT ***
3439
                                                 ;
3440
                                                 ; 'FOR' has two forms:
3441
                                                 ; 'FOR var=exp1 TO exp2 STEP exp1' and 'FOR var=exp1 TO exp2'
3442
                                                 ; The second form means the same thing as the first form with a
3443
                                                 ; STEP of positive 1.  The interpreter will find the variable 'var'
3444
                                                 ; and set its value to the current value of 'exp1'.  It also
3445
                                                 ; evaluates 'exp2' and 'exp1' and saves all these together with
3446
                                                 ; the text pointer, etc. in the 'FOR' save area, which consists of
3447
                                                 ; 'LOPVAR', 'LOPINC', 'LOPLMT', 'LOPLN', and 'LOPPT'.  If there is
3448
                                                 ; already something in the save area (indicated by a non-zero
3449
                                                 ; 'LOPVAR'), then the old save area is saved on the stack before
3450
                                                 ; the new values are stored.  The interpreter will then dig in the
3451
                                                 ; stack and find out if this same variable was used in another
3452
                                                 ; currently active 'FOR' loop.  If that is the case, then the old
3453
                                                 ; 'FOR' loop is deactivated. (i.e. purged from the stack)
3454
                                                 ;******************************************************************
3455
                                                 ;
3456
FFFFFFFFFFFFD48C                                 FOR:
3457
FFFFFFFFFFFFD48C        31FFF83E                        call    PUSHA           ; save the old 'FOR' save area
3458
FFFFFFFFFFFFD490        31FFF798                        call    SETVAL          ; set the control variable
3459
FFFFFFFFFFFFD494        660090A8                        sw              r1,LOPVAR       ; save its address
3460
FFFFFFFFFFFFD498        9A04D063                        lea             r9,TAB5
3461
FFFFFFFFFFFFD49C        9A055198                        lea             r10,TAB5_1; use 'EXEC' to test for 'TO'
3462
FFFFFFFFFFFFD4A0        33FFF486                        jmp             EXEC
3463
FFFFFFFFFFFFD4A4                                 FR1:
3464
FFFFFFFFFFFFD4A4        31FFF63A                        call    OREXPR          ; evaluate the limit
3465
FFFFFFFFFFFFD4A8        660090B8                        sw              r1,LOPLMT       ; save that
3466
FFFFFFFFFFFFD4AC        9A04D066                        lea             r9,TAB6
3467
FFFFFFFFFFFFD4B0        9A0551A8                        lea             r10,TAB6_1      ; use 'EXEC' to test for the word 'STEP
3468
FFFFFFFFFFFFD4B4        33FFF486                        jmp             EXEC
3469
FFFFFFFFFFFFD4B8                                 FR2:
3470
FFFFFFFFFFFFD4B8        31FFF63A                        call    OREXPR          ; found it, get the step value
3471
FFFFFFFFFFFFD4BC        BE00004A                        bra             FR4
3472
FFFFFFFFFFFFD4C0                                 FR3:
3473
FFFFFFFFFFFFD4C0        E0400001                        setlo   r1,#1           ; not found, step defaults to 1
3474
FFFFFFFFFFFFD4C4                                 FR4:
3475
FFFFFFFFFFFFD4C4        660090B0                        sw              r1,LOPINC       ; save that too
3476
FFFFFFFFFFFFD4C8                                 FR5:
3477
FFFFFFFFFFFFD4C8        46011090                        lw              r2,CURRNT
3478
FFFFFFFFFFFFD4CC        660110C0                        sw              r2,LOPLN        ; save address of current line number
3479
FFFFFFFFFFFFD4D0        660410C8                        sw              r8,LOPPT        ; and text pointer
3480
FFFFFFFFFFFFD4D4        05E00C09                        lw              r3,sp           ; dig into the stack to find 'LOPVAR'
3481
FFFFFFFFFFFFD4D8        460310A8                        lw              r6,LOPVAR
3482
FFFFFFFFFFFFD4DC        BE00004A                        bra             FR7
3483
FFFFFFFFFFFFD4E0                                 FR6:
3484
FFFFFFFFFFFFD4E0        0A318028                        addui   r3,r3,#40       ; look at next stack frame
3485
FFFFFFFFFFFFD4E4                                 FR7:
3486
FFFFFFFFFFFFD4E4        46310000                        lw              r2,[r3]         ; is it zero?
3487
FFFFFFFFFFFFD4E8        BE2000E8                        beq             r2,r0,FR8       ; if so, we're done
3488
FFFFFFFFFFFFD4EC        BE237FA9                        bne             r2,r6,FR6       ; same as current LOPVAR? nope, look some more
3489
 
3490
FFFFFFFFFFFFD4F0        04300409                     lw      r1,r3       ; Else remove 5 long words from...
3491
FFFFFFFFFFFFD4F4        0A310028                        addui   r2,r3,#40   ; inside the stack.
3492
FFFFFFFFFFFFD4F8        05E00C09                        lw              r3,sp
3493
FFFFFFFFFFFFD4FC        31FFF82F                        call    MVDOWN
3494
FFFFFFFFFFFFD500        09EF0028                        add             sp,sp,#40       ; set the SP 5 long words up
3495
FFFFFFFFFFFFD504                                 FR8:
3496
FFFFFFFFFFFFD504        BE00786A                     bra            FINISH              ; and continue execution
3497
 
3498
 
3499
                                                 ;******************************************************************
3500
                                                 ; 'NEXT var' serves as the logical (not necessarily physical) end
3501
                                                 ; of the 'FOR' loop.  The control variable 'var' is checked with
3502
                                                 ; the 'LOPVAR'.  If they are not the same, the interpreter digs in
3503
                                                 ; the stack to find the right one and purges all those that didn't
3504
                                                 ; match.  Either way, it then adds the 'STEP' to that variable and
3505
                                                 ; checks the result with against the limit value.  If it is within
3506
                                                 ; the limit, control loops back to the command following the
3507
                                                 ; 'FOR'.  If it's outside the limit, the save area is purged and
3508
                                                 ; execution continues.
3509
                                                 ;******************************************************************
3510
                                                 ;
3511
FFFFFFFFFFFFD508                                 NEXT:
3512
FFFFFFFFFFFFD508        E0400000                        setlo   r1,#0           ; don't allocate it
3513
FFFFFFFFFFFFD50C        31FFF6EC                        call    TSTV            ; get address of variable
3514
FFFFFFFFFFFFD510        BE100069                        bne             r1,r0,NX4
3515
FFFFFFFFFFFFD514        9A00E717                        lea             r1,msgNextVar
3516
FFFFFFFFFFFFD518        BE00504A                        bra             ERROR           ; if no variable, say "What?"
3517
FFFFFFFFFFFFD51C                                 NX4:
3518
FFFFFFFFFFFFD51C        02148009                        mov             r9,r1           ; save variable's address
3519
FFFFFFFFFFFFD520                                 NX0:
3520
FFFFFFFFFFFFD520        460090A8                        lw              r1,LOPVAR       ; If 'LOPVAR' is zero, we never...
3521
FFFFFFFFFFFFD524        BE100069                        bne             r1,r0,NX5   ; had a FOR loop
3522
FFFFFFFFFFFFD528        9A00E704                        lea             r1,msgNextFor
3523
FFFFFFFFFFFFD52C        BE004FAA                        bra             ERROR
3524
FFFFFFFFFFFFD530                                 NX5:
3525
FFFFFFFFFFFFD530        BE148068                        beq             r1,r9,NX2       ; else we check them OK, they agree
3526
FFFFFFFFFFFFD534        31FFF831                        call    POPA            ; nope, let's see the next frame
3527
FFFFFFFFFFFFD538        BE007F4A                        bra             NX0
3528
FFFFFFFFFFFFD53C                                 NX2:
3529
FFFFFFFFFFFFD53C        46908000                        lw              r1,[r9]         ; get control variable's value
3530
FFFFFFFFFFFFD540        460110B0                        lw              r2,LOPINC
3531
FFFFFFFFFFFFD544        04110403                        addu    r1,r1,r2        ; add in loop increment
3532
                                                 ;      BVS.L   QHOW            say "How?" for 32-bit overflow
3533
FFFFFFFFFFFFD548        66908000                        sw              r1,[r9]         ; save control variable's new value
3534
FFFFFFFFFFFFD54C        460190B8                        lw              r3,LOPLMT       ; get loop's limit value
3535
FFFFFFFFFFFFD550        BE200063                        bgt             r2,r0,NX1       ; check loop increment, branch if loop increment is positive
3536
FFFFFFFFFFFFD554        BE1180E0                        blt             r1,r3,NXPurge   ; test against limit
3537
FFFFFFFFFFFFD558        BE00004A                        bra     NX3
3538
FFFFFFFFFFFFD55C                                 NX1:
3539
FFFFFFFFFFFFD55C        BE1180A3                        bgt             r1,r3,NXPurge
3540
FFFFFFFFFFFFD560                                 NX3:
3541
FFFFFFFFFFFFD560        460410C0                        lw              r8,LOPLN        ; Within limit, go back to the...
3542
FFFFFFFFFFFFD564        66041090                        sw              r8,CURRNT
3543
FFFFFFFFFFFFD568        460410C8                        lw              r8,LOPPT        ; saved 'CURRNT' and text pointer.
3544
FFFFFFFFFFFFD56C        BE00752A                        bra             FINISH
3545
FFFFFFFFFFFFD570                                 NXPurge:
3546
FFFFFFFFFFFFD570        31FFF831                     call    POPA        ; purge this loop
3547
FFFFFFFFFFFFD574        BE0074EA                     bra     FINISH
3548
 
3549
 
3550
                                                 ;******************************************************************
3551
                                                 ; *** REM *** IF *** INPUT *** LET (& DEFLT) ***
3552
                                                 ;
3553
                                                 ; 'REM' can be followed by anything and is ignored by the
3554
                                                 ; interpreter.
3555
                                                 ;
3556
                                                 ;REM
3557
                                                 ;    br            IF2             ; skip the rest of the line
3558
                                                 ; 'IF' is followed by an expression, as a condition and one or
3559
                                                 ; more commands (including other 'IF's) separated by colons.
3560
                                                 ; Note that the word 'THEN' is not used.  The interpreter evaluates
3561
                                                 ; the expression.  If it is non-zero, execution continues.  If it
3562
                                                 ; is zero, the commands that follow are ignored and execution
3563
                                                 ; continues on the next line.
3564
                                                 ;******************************************************************
3565
                                                 ;
3566
FFFFFFFFFFFFD578                                 IF:
3567
FFFFFFFFFFFFD578        31FFF63A                     call       OREXPR          ; evaluate the expression
3568
FFFFFFFFFFFFD57C                                 IF1:
3569
FFFFFFFFFFFFD57C        BE106AC9                     bne            r1,r0,RUNSML                ; is it zero? if not, continue
3570
FFFFFFFFFFFFD580                                 IF2:
3571
FFFFFFFFFFFFD580        02848009                     mov                r9,r8           ; set lookup pointer
3572
FFFFFFFFFFFFD584        E0400000                        setlo   r1,#0           ; find line #0 (impossible)
3573
FFFFFFFFFFFFD588        31FFF821                        call    FNDSKP          ; if so, skip the rest of the line
3574
FFFFFFFFFFFFD58C        BE104B63                        bgt             r1,r0,WSTART    ; if no next line, do a warm start
3575
FFFFFFFFFFFFD590                                 IF3:
3576
FFFFFFFFFFFFD590        BE0069EA                        bra             RUNTSL          ; run the next line
3577
 
3578
 
3579
                                                 ;******************************************************************
3580
                                                 ; INPUT is called first and establishes a stack frame
3581
FFFFFFFFFFFFD594                                 INPERR:
3582
FFFFFFFFFFFFD594        460F10A0                        lw              sp,STKINP       ; restore the old stack pointer
3583
FFFFFFFFFFFFD598        47E40010                        lw              r8,16[sp]
3584
FFFFFFFFFFFFD59C        66041090                        sw              r8,CURRNT       ; and old 'CURRNT'
3585
FFFFFFFFFFFFD5A0        47E40008                        lw              r8,8[sp]        ; and old text pointer
3586
FFFFFFFFFFFFD5A4        0BEF0028                        addui   sp,sp,#40       ; fall through will subtract 40
3587
 
3588
                                                 ; 'INPUT' is like the 'PRINT' command, and is followed by a list
3589
                                                 ; of items.  If the item is a string in single or double quotes,
3590
                                                 ; or is an underline (back arrow), it has the same effect as in
3591
                                                 ; 'PRINT'.  If an item is a variable, this variable name is
3592
                                                 ; printed out followed by a colon, then the interpreter waits for
3593
                                                 ; an expression to be typed in.  The variable is then set to the
3594
                                                 ; value of this expression.  If the variable is preceeded by a
3595
                                                 ; string (again in single or double quotes), the string will be
3596
                                                 ; displayed followed by a colon.  The interpreter the waits for an
3597
                                                 ; expression to be entered and sets the variable equal to the
3598
                                                 ; expression's value.  If the input expression is invalid, the
3599
                                                 ; interpreter will print "What?", "How?", or "Sorry" and reprint
3600
                                                 ; the prompt and redo the input.  The execution will not terminate
3601
                                                 ; unless you press control-C.  This is handled in 'INPERR'.
3602
                                                 ;
3603
FFFFFFFFFFFFD5A8                                 INPUT:
3604
FFFFFFFFFFFFD5A8        0FEF0028                        subui   sp,sp,#40       ; allocate stack frame
3605
FFFFFFFFFFFFD5AC        67E28020                        sw      r5,32[sp]
3606
FFFFFFFFFFFFD5B0                                 IP6:
3607
FFFFFFFFFFFFD5B0        67E40000                        sw              r8,[sp]         ; save in case of error
3608
FFFFFFFFFFFFD5B4        31FFF867                        call    QTSTG           ; is next item a string?
3609
FFFFFFFFFFFFD5B8        BE0000CA                        bra             IP2                     ; nope - this branch must take only two bytes
3610
FFFFFFFFFFFFD5BC        E0400001                        setlo   r1,#1           ; allocate var
3611
FFFFFFFFFFFFD5C0        31FFF6EC                        call    TSTV            ; yes, but is it followed by a variable?
3612
FFFFFFFFFFFFD5C4        BE1003E8                        beq     r1,r0,IP4   ; if not, brnch
3613
FFFFFFFFFFFFD5C8        02150009                        mov             r10,r1          ; put away the variable's address
3614
FFFFFFFFFFFFD5CC        BE0001AA                        bra             IP3                     ; if so, input to variable
3615
FFFFFFFFFFFFD5D0                                 IP2:
3616
FFFFFFFFFFFFD5D0        67E40008                        sw              r8,8[sp]        ; save for 'PRTSTG'
3617
FFFFFFFFFFFFD5D4        E0400001                        setlo   r1,#1
3618
FFFFFFFFFFFFD5D8        31FFF6EC                        call    TSTV            ; must be a variable now
3619
FFFFFFFFFFFFD5DC        BE100069                        bne             r1,r0,IP7
3620
FFFFFFFFFFFFD5E0        9A00E6E7                        lea             r1,msgInputVar
3621
FFFFFFFFFFFFD5E4        BE0049EA                        bra             ERROR           ; "What?" it isn't?
3622
FFFFFFFFFFFFD5E8                                 IP7:
3623
FFFFFFFFFFFFD5E8        02150009                        mov             r10,r1          ; put away the variable's address
3624
FFFFFFFFFFFFD5EC        40828000                        lb              r5,[r8]         ; get ready for 'PRTSTG' by null terminating
3625
FFFFFFFFFFFFD5F0        60800000                        sb              r0,[r8]
3626
FFFFFFFFFFFFD5F4        47E08008                        lw              r1,8[sp]        ; get back text pointer
3627
FFFFFFFFFFFFD5F8        31FFF851                        call    PRTSTG          ; print string as prompt
3628
FFFFFFFFFFFFD5FC        60828000                        sb              r5,[r8]         ; un-null terminate
3629
FFFFFFFFFFFFD600                                 IP3
3630
FFFFFFFFFFFFD600        67E40008                        sw              r8,8[sp]        ; save in case of error
3631
FFFFFFFFFFFFD604        46009090                        lw              r1,CURRNT
3632
FFFFFFFFFFFFD608        67E08010                        sw              r1,16[sp]       ; also save 'CURRNT'
3633
FFFFFFFFFFFFD60C        E07FFFFF                        setlo   r1,#-1
3634
FFFFFFFFFFFFD610        66009090                        sw              r1,CURRNT       ; flag that we are in INPUT
3635
FFFFFFFFFFFFD614        660F10A0                        sw              sp,STKINP       ; save the stack pointer too
3636
FFFFFFFFFFFFD618        67E50018                        sw              r10,24[sp]      ; save the variable address
3637
FFFFFFFFFFFFD61C        E040003A                        setlo   r1,#':'         ; print a colon first
3638
FFFFFFFFFFFFD620        31FFF7D8                        call    GETLN           ; then get an input line
3639
FFFFFFFFFFFFD624        9A04111B                        lea             r8,BUFFER       ; point to the buffer
3640
FFFFFFFFFFFFD628        31FFF63A                        call    OREXPR          ; evaluate the input
3641
FFFFFFFFFFFFD62C        47E50018                        lw              r10,24[sp]      ; restore the variable address
3642
FFFFFFFFFFFFD630        66A08000                        sw              r1,[r10]        ; save value in variable
3643
FFFFFFFFFFFFD634        47E08010                        lw              r1,16[sp]       ; restore old 'CURRNT'
3644
FFFFFFFFFFFFD638        66009090                        sw              r1,CURRNT
3645
FFFFFFFFFFFFD63C        47E40008                        lw              r8,8[sp]        ; and the old text pointer
3646
FFFFFFFFFFFFD640                                 IP4:
3647
FFFFFFFFFFFFD640        E0C0002C                        setlo   r3,#','
3648
FFFFFFFFFFFFD644        9A025650                        lea             r4,IP5          ; is the next thing a comma?
3649
FFFFFFFFFFFFD648        31FFF8F1                        call    TSTC
3650
FFFFFFFFFFFFD64C        BE007B2A                        bra             IP6                     ; yes, more items
3651
FFFFFFFFFFFFD650                                 IP5:
3652
FFFFFFFFFFFFD650        47E28020                     lw      r5,32[sp]
3653
FFFFFFFFFFFFD654        09EF0028                        add             sp,sp,#40       ; clean up the stack
3654
FFFFFFFFFFFFD658        33FFF504                        jmp             FINISH
3655
 
3656
 
3657
FFFFFFFFFFFFD65C                                 DEFLT:
3658
FFFFFFFFFFFFD65C        40808000                     lb      r1,[r8]
3659
FFFFFFFFFFFFD660        B01F6C0D                        beq         r1,#CR,FINISH           ; empty line is OK else it is 'LET'
3660
 
3661
 
3662
                                                 ;******************************************************************
3663
                                                 ; 'LET' is followed by a list of items separated by commas.
3664
                                                 ; Each item consists of a variable, an equals sign, and an
3665
                                                 ; expression.  The interpreter evaluates the expression and sets
3666
                                                 ; the variable to that value.  The interpreter will also handle
3667
                                                 ; 'LET' commands without the word 'LET'.  This is done by 'DEFLT'.
3668
                                                 ;******************************************************************
3669
                                                 ;
3670
FFFFFFFFFFFFD664                                 LET:
3671
FFFFFFFFFFFFD664        31FFF798                     call       SETVAL          ; do the assignment
3672
FFFFFFFFFFFFD668        E0C0002C                     setlo      r3,#','
3673
FFFFFFFFFFFFD66C        9A025410                     lea                r4,FINISH
3674
FFFFFFFFFFFFD670        31FFF8F1                        call    TSTC            ; check for more 'LET' items
3675
FFFFFFFFFFFFD674        BE007F8A                        bra         LET
3676
FFFFFFFFFFFFD678                                 LT1:
3677
FFFFFFFFFFFFD678        BE006CCA                     bra            FINISH              ; until we are finished.
3678
 
3679
 
3680
                                                 ;******************************************************************
3681
                                                 ; *** LOAD *** & SAVE ***
3682
                                                 ;
3683
                                                 ; These two commands transfer a program to/from an auxiliary
3684
                                                 ; device such as a cassette, another computer, etc.  The program
3685
                                                 ; is converted to an easily-stored format: each line starts with
3686
                                                 ; a colon, the line no. as 4 hex digits, and the rest of the line.
3687
                                                 ; At the end, a line starting with an '@' sign is sent.  This
3688
                                                 ; format can be read back with a minimum of processing time by
3689
                                                 ; the Butterfly.
3690
                                                 ;******************************************************************
3691
                                                 ;
3692
FFFFFFFFFFFFD67C                                 LOAD
3693
FFFFFFFFFFFFD67C        46044E60                        lw              r8,TXTBGN       ; set pointer to start of prog. area
3694
FFFFFFFFFFFFD680        E040000D                        setlo   r1,#CR          ; For a CP/M host, tell it we're ready...
3695
FFFFFFFFFFFFD684        31FFF395                        call    GOAUXO          ; by sending a CR to finish PIP command.
3696
FFFFFFFFFFFFD688                                 LOD1:
3697
FFFFFFFFFFFFD688        31FFF396                        call    GOAUXI          ; look for start of line
3698
FFFFFFFFFFFFD68C        BE107FE2                        ble             r1,r0,LOD1
3699
FFFFFFFFFFFFD690        B0100E40                        beq             r1,#'@',LODEND  ; end of program?
3700
FFFFFFFFFFFFD694        B0100D1A                        beq     r1,#0x1A,LODEND ; or EOF marker
3701
FFFFFFFFFFFFD698        B21FFC3A                        bne             r1,#':',LOD1    ; if not, is it start of line? if not, wait for it
3702
FFFFFFFFFFFFD69C        31FFF5B4                        call    GCHAR           ; get line number
3703
FFFFFFFFFFFFD6A0        60808000                        sb              r1,[r8]         ; store it
3704
FFFFFFFFFFFFD6A4        06109001                        shrui   r1,r1,#8
3705
FFFFFFFFFFFFD6A8        60808001                        sb              r1,1[r8]
3706
FFFFFFFFFFFFD6AC        0A840002                        addui   r8,r8,#2
3707
FFFFFFFFFFFFD6B0                                 LOD2:
3708
FFFFFFFFFFFFD6B0        31FFF396                        call    GOAUXI          ; get another text char.
3709
FFFFFFFFFFFFD6B4        BE107FE2                        ble             r1,r0,LOD2
3710
FFFFFFFFFFFFD6B8        60808000                        sb              r1,[r8]
3711
FFFFFFFFFFFFD6BC        0A840001                        addui   r8,r8,#1        ; store it
3712
FFFFFFFFFFFFD6C0        B21FFC0D                        bne             r1,#CR,LOD2             ; is it the end of the line? if not, go back for more
3713
FFFFFFFFFFFFD6C4        BE007E2A                        bra             LOD1            ; if so, start a new line
3714
FFFFFFFFFFFFD6C8                                 LODEND:
3715
FFFFFFFFFFFFD6C8        660410D0                        sw              r8,TXTUNF       ; set end-of program pointer
3716
FFFFFFFFFFFFD6CC        BE00416A                        bra             WSTART          ; back to direct mode
3717
 
3718
 
3719
                                                 ; get character from input (16 bit value)
3720
FFFFFFFFFFFFD6D0                                 GCHAR:
3721
FFFFFFFFFFFFD6D0        0FEF0018                        subui   sp,sp,#24
3722
FFFFFFFFFFFFD6D4        67E28000                        sw              r5,[sp]
3723
FFFFFFFFFFFFD6D8        67E30008                        sw              r6,8[sp]
3724
FFFFFFFFFFFFD6DC        67EF8010                        sw              lr,16[sp]
3725
FFFFFFFFFFFFD6E0        E1800003                        setlo   r6,#3       ; repeat four times
3726
FFFFFFFFFFFFD6E4        E1400000                        setlo   r5,#0
3727
FFFFFFFFFFFFD6E8                                 GCHAR1:
3728
FFFFFFFFFFFFD6E8        31FFF396                        call    GOAUXI          ; get a char
3729
FFFFFFFFFFFFD6EC        BE107FE2                        ble             r1,r0,GCHAR1
3730
FFFFFFFFFFFFD6F0        31FFF5C5                        call    asciiToHex
3731
FFFFFFFFFFFFD6F4        06528800                        shli    r5,r5,#4
3732
FFFFFFFFFFFFD6F8        04509409                        or              r5,r5,r1
3733
FFFFFFFFFFFFD6FC        BE037F6F                        loop    r6,GCHAR1
3734
FFFFFFFFFFFFD700        02508009                        mov             r1,r5
3735
FFFFFFFFFFFFD704        47EF8010                        lw              lr,16[sp]
3736
FFFFFFFFFFFFD708        47E30008                        lw              r6,8[sp]
3737
FFFFFFFFFFFFD70C        47E28000                        lw              r5,[sp]
3738
FFFFFFFFFFFFD710        37EF8018                        ret             #24
3739
 
3740
 
3741
                                                 ; convert an ascii char to hex code
3742
                                                 ; input
3743
                                                 ;      r1 = char to convert
3744
 
3745
FFFFFFFFFFFFD714                                 asciiToHex:
3746
FFFFFFFFFFFFD714        A4100239                        blei    r1,#'9',a2h1    ; less than '9'
3747
FFFFFFFFFFFFD718        0E108007                        subui   r1,r1,#7        ; shift 'A' to '9'+1
3748
FFFFFFFFFFFFD71C                                 a2h1:
3749
FFFFFFFFFFFFD71C        0E108030                        subui   r1,r1,#'0'      ;
3750
FFFFFFFFFFFFD720        1410800F                        andi    r1,r1,#15       ; make sure a nybble
3751
FFFFFFFFFFFFD724        37EF8000                        ret
3752
 
3753
 
3754
 
3755
FFFFFFFFFFFFD728                                 SAVE:
3756
FFFFFFFFFFFFD728        46044E60                        lw              r8,TXTBGN       ;set pointer to start of prog. area
3757
FFFFFFFFFFFFD72C        460490D0                        lw              r9,TXTUNF       ;set pointer to end of prog. area
3758
FFFFFFFFFFFFD730                                 SAVE1:
3759
FFFFFFFFFFFFD730        31FFF5E1                        call    AUXOCRLF    ; send out a CR & LF (CP/M likes this)
3760
FFFFFFFFFFFFD734        BE8481C5                        bgeu    r8,r9,SAVEND    ; are we finished?
3761
FFFFFFFFFFFFD738        E040003A                        setlo   r1,#':'         ; if not, start a line
3762
FFFFFFFFFFFFD73C        31FFF395                        call    GOAUXO
3763
FFFFFFFFFFFFD740        4A808000                        lbu             r1,[r8]         ; get line number
3764
FFFFFFFFFFFFD744        4A810001                        lbu             r2,1[r8]
3765
FFFFFFFFFFFFD748        06211000                        shli    r2,r2,#8
3766
FFFFFFFFFFFFD74C        04110409                        or              r1,r1,r2
3767
FFFFFFFFFFFFD750        0A840002                        addui   r8,r8,#2
3768
FFFFFFFFFFFFD754        31FFF5E9                        call    PWORD       ; output line number as 4-digit hex
3769
FFFFFFFFFFFFD758                                 SAVE2:
3770
FFFFFFFFFFFFD758        40808000                        lb              r1,[r8]         ; get a text char.
3771
FFFFFFFFFFFFD75C        0A840001                        addui   r8,r8,#1
3772
FFFFFFFFFFFFD760        B01FF40D                        beqi    r1,#CR,SAVE1            ; is it the end of the line? if so, send CR & LF and start new line
3773
FFFFFFFFFFFFD764        31FFF395                        call    GOAUXO          ; send it out
3774
FFFFFFFFFFFFD768        BE007F8A                        bra             SAVE2           ; go back for more text
3775
FFFFFFFFFFFFD76C                                 SAVEND:
3776
FFFFFFFFFFFFD76C        E0400040                        setlo   r1,#'@'         ; send end-of-program indicator
3777
FFFFFFFFFFFFD770        31FFF395                        call    GOAUXO
3778
FFFFFFFFFFFFD774        31FFF5E1                        call    AUXOCRLF    ; followed by a CR & LF
3779
FFFFFFFFFFFFD778        E040001A                        setlo   r1,#0x1A        ; and a control-Z to end the CP/M file
3780
FFFFFFFFFFFFD77C        31FFF395                        call    GOAUXO
3781
FFFFFFFFFFFFD780        BE003BCA                        bra             WSTART          ; then go do a warm start
3782
 
3783
 
3784
                                                 ; output a CR LF sequence to auxillary output
3785
                                                 ; Registers Affected
3786
                                                 ;   r3 = LF
3787
FFFFFFFFFFFFD784                                 AUXOCRLF:
3788
FFFFFFFFFFFFD784        0FEF0008                     subui   sp,sp,#8
3789
FFFFFFFFFFFFD788        67EF8000                     sw      lr,[sp]
3790
FFFFFFFFFFFFD78C        E040000D                     setlo   r1,#CR
3791
FFFFFFFFFFFFD790        31FFF395                     call    GOAUXO
3792
FFFFFFFFFFFFD794        E040000A                     setlo   r1,#LF
3793
FFFFFFFFFFFFD798        31FFF395                     call    GOAUXO
3794
FFFFFFFFFFFFD79C        47EF8000                     lw      lr,[sp]
3795
FFFFFFFFFFFFD7A0        37EF8008                     ret                #8
3796
 
3797
 
3798
                                                 ; output a word in hex format
3799
                                                 ; tricky because of the need to reverse the order of the chars
3800
FFFFFFFFFFFFD7A4                                 PWORD:
3801
FFFFFFFFFFFFD7A4        0DEF0010                        sub             sp,sp,#16
3802
FFFFFFFFFFFFD7A8        67EF8000                        sw              lr,[sp]
3803
FFFFFFFFFFFFD7AC        67E28008                        sw              r5,8[sp]
3804
FFFFFFFFFFFFD7B0        9A02910F                        lea             r5,NUMWKA+15
3805
FFFFFFFFFFFFD7B4        02120009                        mov             r4,r1           ; r4 = value
3806
FFFFFFFFFFFFD7B8                                 pword1:
3807
FFFFFFFFFFFFD7B8        02408009                     mov     r1,r4          ; r1 = value
3808
FFFFFFFFFFFFD7BC        06420801                     shrui      r4,r4,#4        ; shift over to next nybble
3809
FFFFFFFFFFFFD7C0        31FFF5FD                     call    toAsciiHex  ; convert LS nybble to ascii hex
3810
FFFFFFFFFFFFD7C4        60508000                     sb      r1,[r5]     ; save in work area
3811
FFFFFFFFFFFFD7C8        0E528001                     subui   r5,r5,#1
3812
FFFFFFFFFFFFD7CC        12509100                     cmpui   r1,r5,#NUMWKA
3813
FFFFFFFFFFFFD7D0        BE107F41                     bge     r1,r0,pword1
3814
FFFFFFFFFFFFD7D4                                 pword2:
3815
FFFFFFFFFFFFD7D4        0A528001                     addui   r5,r5,#1
3816
FFFFFFFFFFFFD7D8        40508000                     lb      r1,[r5]     ; get char to output
3817
FFFFFFFFFFFFD7DC        31FFF395                        call    GOAUXO          ; send it
3818
FFFFFFFFFFFFD7E0        1250910F                        cmpui   r1,r5,#NUMWKA+15
3819
FFFFFFFFFFFFD7E4        BE107F80                        blt     r1,r0,pword2
3820
FFFFFFFFFFFFD7E8        47E28008                        lw              r5,8[sp]
3821
FFFFFFFFFFFFD7EC        47EF8000                        lw              lr,[sp]
3822
FFFFFFFFFFFFD7F0        37EF8010                        ret             #16
3823
 
3824
 
3825
                                                 ; convert nybble in r2 to ascii hex char2
3826
                                                 ; r2 = character to convert
3827
 
3828
FFFFFFFFFFFFD7F4                                 toAsciiHex:
3829
FFFFFFFFFFFFD7F4        1410800F                        andi    r1,r1,#15       ; make sure it's a nybble
3830
FFFFFFFFFFFFD7F8        A010020A                        blti    r1,#10,tah1     ; > 10 ?
3831
FFFFFFFFFFFFD7FC        08108007                        addi    r1,r1,#7        ; bump it up to the letter 'A'
3832
FFFFFFFFFFFFD800                                 tah1:
3833
FFFFFFFFFFFFD800        0A108030                        addui   r1,r1,#'0'      ; bump up to ascii '0'
3834
FFFFFFFFFFFFD804        37EF8000                        ret
3835
 
3836
 
3837
 
3838
                                                 ;******************************************************************
3839
                                                 ; *** POKE *** & SYSX ***
3840
                                                 ;
3841
                                                 ; 'POKE expr1,expr2' stores the byte from 'expr2' into the memory
3842
                                                 ; address specified by 'expr1'.
3843
                                                 ;
3844
                                                 ; 'SYSX expr' jumps to the machine language subroutine whose
3845
                                                 ; starting address is specified by 'expr'.  The subroutine can use
3846
                                                 ; all registers but must leave the stack the way it found it.
3847
                                                 ; The subroutine returns to the interpreter by executing an RET.
3848
                                                 ;******************************************************************
3849
                                                 ;
3850
FFFFFFFFFFFFD808                                 POKE:
3851
FFFFFFFFFFFFD808        0FEF0008                        subui   sp,sp,#8
3852
FFFFFFFFFFFFD80C        31FFF63A                        call    OREXPR          ; get the memory address
3853
FFFFFFFFFFFFD810        E0C0002C                        setlo   r3,#','
3854
FFFFFFFFFFFFD814        9A025834                        lea             r4,PKER         ; it must be followed by a comma
3855
FFFFFFFFFFFFD818        31FFF8F1                        call    TSTC            ; it must be followed by a comma
3856
FFFFFFFFFFFFD81C        67E08000                        sw              r1,[sp]     ; save the address
3857
FFFFFFFFFFFFD820        31FFF63A                        call    OREXPR          ; get the byte to be POKE'd
3858
FFFFFFFFFFFFD824        47E10000                        lw              r2,[sp]     ; get the address back
3859
FFFFFFFFFFFFD828        60208000                        sb              r1,[r2]         ; store the byte in memory
3860
FFFFFFFFFFFFD82C        0BEF0008                        addui   sp,sp,#8
3861
FFFFFFFFFFFFD830        BE005F0A                        bra             FINISH
3862
FFFFFFFFFFFFD834                                 PKER:
3863
FFFFFFFFFFFFD834        9A00E680                        lea             r1,msgComma
3864
FFFFFFFFFFFFD838        BE00374A                        bra             ERROR           ; if no comma, say "What?"
3865
 
3866
FFFFFFFFFFFFD83C                                 POKEC:
3867
FFFFFFFFFFFFD83C        0FEF0008                        subui   sp,sp,#8
3868
FFFFFFFFFFFFD840        31FFF63A                        call    OREXPR          ; get the memory address
3869
FFFFFFFFFFFFD844        E0C0002C                        setlo   r3,#','
3870
FFFFFFFFFFFFD848        9A025834                        lea             r4,PKER         ; it must be followed by a comma
3871
FFFFFFFFFFFFD84C        31FFF8F1                        call    TSTC            ; it must be followed by a comma
3872
FFFFFFFFFFFFD850        67E08000                        sw              r1,[sp]     ; save the address
3873
FFFFFFFFFFFFD854        31FFF63A                        call    OREXPR          ; get the byte to be POKE'd
3874
FFFFFFFFFFFFD858        47E10000                        lw              r2,[sp]     ; get the address back
3875
FFFFFFFFFFFFD85C        62208000                        sc              r1,[r2]         ; store the char in memory
3876
FFFFFFFFFFFFD860        0BEF0008                        addui   sp,sp,#8
3877
FFFFFFFFFFFFD864        33FFF504                        jmp             FINISH
3878
 
3879
FFFFFFFFFFFFD868                                 POKEH:
3880
FFFFFFFFFFFFD868        0FEF0008                        subui   sp,sp,#8
3881
FFFFFFFFFFFFD86C        31FFF63A                        call    OREXPR          ; get the memory address
3882
FFFFFFFFFFFFD870        E0C0002C                        setlo   r3,#','
3883
FFFFFFFFFFFFD874        9A025834                        lea             r4,PKER         ; it must be followed by a comma
3884
FFFFFFFFFFFFD878        31FFF8F1                        call    TSTC
3885
FFFFFFFFFFFFD87C        67E08000                        sw              r1,[sp]     ; save the address
3886
FFFFFFFFFFFFD880        31FFF63A                        call    OREXPR          ; get the byte to be POKE'd
3887
FFFFFFFFFFFFD884        47E10000                        lw              r2,[sp]     ; get the address back
3888
FFFFFFFFFFFFD888        64208000                        sh              r1,[r2]         ; store the word in memory
3889
FFFFFFFFFFFFD88C        0BEF0008                        addui   sp,sp,#8
3890
FFFFFFFFFFFFD890        33FFF504                        jmp             FINISH
3891
 
3892
FFFFFFFFFFFFD894                                 POKEW:
3893
FFFFFFFFFFFFD894        0FEF0008                        subui   sp,sp,#8
3894
FFFFFFFFFFFFD898        31FFF63A                        call    OREXPR          ; get the memory address
3895
FFFFFFFFFFFFD89C        E0C0002C                        setlo   r3,#','
3896
FFFFFFFFFFFFD8A0        9A025834                        lea             r4,PKER         ; it must be followed by a comma
3897
FFFFFFFFFFFFD8A4        31FFF8F1                        call    TSTC
3898
FFFFFFFFFFFFD8A8        67E08000                        sw              r1,[sp]     ; save the address
3899
FFFFFFFFFFFFD8AC        31FFF63A                        call    OREXPR          ; get the word to be POKE'd
3900
FFFFFFFFFFFFD8B0        47E10000                        lw              r2,[sp]     ; get the address back
3901
FFFFFFFFFFFFD8B4        66208000                        sw              r1,[r2]         ; store the word in memory
3902
FFFFFFFFFFFFD8B8        0BEF0008                        addui   sp,sp,#8
3903
FFFFFFFFFFFFD8BC        33FFF504                        jmp             FINISH
3904
 
3905
FFFFFFFFFFFFD8C0                                 SYSX:
3906
FFFFFFFFFFFFD8C0        0FEF0008                        subui   sp,sp,#8
3907
FFFFFFFFFFFFD8C4        31FFF63A                        call    OREXPR          ; get the subroutine's address
3908
FFFFFFFFFFFFD8C8        BE100069                        bne             r1,r0,sysx1     ; make sure we got a valid address
3909
FFFFFFFFFFFFD8CC        9A00E6D5                        lea             r1,msgSYSBad
3910
FFFFFFFFFFFFD8D0        BE00328A                        bra             ERROR
3911
FFFFFFFFFFFFD8D4                                 sysx1:
3912
FFFFFFFFFFFFD8D4        67E40000                        sw              r8,[sp]     ; save the text pointer
3913
FFFFFFFFFFFFD8D8        341F8000                        jal             r31,[r1]        ; jump to the subroutine
3914
FFFFFFFFFFFFD8DC        47E40000                        lw              r8,[sp]     ; restore the text pointer
3915
FFFFFFFFFFFFD8E0        0BEF0008                        addui   sp,sp,#8
3916
FFFFFFFFFFFFD8E4        BE00596A                        bra             FINISH
3917
 
3918
                                                 ;******************************************************************
3919
                                                 ; *** EXPR ***
3920
                                                 ;
3921
                                                 ; 'EXPR' evaluates arithmetical or logical expressions.
3922
                                                 ; ::=  OR  ...
3923
                                                 ; ::= AND  ...
3924
                                                 ; ::=
3925
                                                 ;         
3926
                                                 ; where  is one of the operators in TAB8 and the result
3927
                                                 ; of these operations is 1 if true and 0 if false.
3928
                                                 ; ::=(+ or -)(+ or -)(...
3929
                                                 ; where () are optional and (... are optional repeats.
3930
                                                 ; ::=( <* or /> )(...
3931
                                                 ; ::=
3932
                                                 ;          
3933
                                                 ;          ()
3934
                                                 ;  is recursive so that the variable '@' can have an 
3935
                                                 ; as an index, functions can have an  as arguments, and
3936
                                                 ;  can be an  in parenthesis.
3937
                                                 ;
3938
 
3939
                                                 ; ::= OR  ...
3940
                                                 ;
3941
FFFFFFFFFFFFD8E8                                 OREXPR:
3942
FFFFFFFFFFFFD8E8        0FEF0010                        subui   sp,sp,#16
3943
FFFFFFFFFFFFD8EC        67EF8000                        sw              lr,[sp]
3944
FFFFFFFFFFFFD8F0        31FFF648                        call    ANDEXPR         ; get first 
3945
FFFFFFFFFFFFD8F4                                 XP_OR1:
3946
FFFFFFFFFFFFD8F4        67E08004                        sw              r1,4[sp]        ; save  value
3947
FFFFFFFFFFFFD8F8        9A04D079                        lea             r9,TAB10        ; look up a logical operator
3948
FFFFFFFFFFFFD8FC        9A055200                        lea             r10,TAB10_1
3949
FFFFFFFFFFFFD900        33FFF486                        jmp             EXEC            ; go do it
3950
FFFFFFFFFFFFD904                                 XP_OR:
3951
FFFFFFFFFFFFD904        31FFF648                     call    ANDEXPR
3952
FFFFFFFFFFFFD908        47E10008                     lw      r2,8[sp]
3953
FFFFFFFFFFFFD90C        04110409                     or      r1,r1,r2
3954
FFFFFFFFFFFFD910        BE007F2A                     bra     XP_OR1
3955
FFFFFFFFFFFFD914                                 XP_ORX:
3956
FFFFFFFFFFFFD914        47E08008                        lw              r1,8[sp]
3957
FFFFFFFFFFFFD918        47EF8000                     lw      lr,[sp]
3958
FFFFFFFFFFFFD91C        37EF8010                     ret                #16
3959
 
3960
 
3961
                                                 ; ::= AND  ...
3962
                                                 ;
3963
FFFFFFFFFFFFD920                                 ANDEXPR:
3964
FFFFFFFFFFFFD920        0FEF0010                        subui   sp,sp,#16
3965
FFFFFFFFFFFFD924        67EF8000                        sw              lr,[sp]
3966
FFFFFFFFFFFFD928        31FFF66D                        call    EXPR            ; get first 
3967
FFFFFFFFFFFFD92C                                 XP_AND1:
3968
FFFFFFFFFFFFD92C        67E08008                        sw              r1,8[sp]        ; save  value
3969
FFFFFFFFFFFFD930        9A04D075                        lea             r9,TAB9         ; look up a logical operator
3970
FFFFFFFFFFFFD934        9A0551F0                        lea             r10,TAB9_1
3971
FFFFFFFFFFFFD938        33FFF486                        jmp             EXEC            ; go do it
3972
FFFFFFFFFFFFD93C                                 XP_AND:
3973
FFFFFFFFFFFFD93C        31FFF66D                     call    EXPR
3974
FFFFFFFFFFFFD940        47E10008                     lw      r2,8[sp]
3975
FFFFFFFFFFFFD944        04110408                     and     r1,r1,r2
3976
FFFFFFFFFFFFD948        BE007F2A                     bra     XP_AND1
3977
FFFFFFFFFFFFD94C                                 XP_ANDX:
3978
FFFFFFFFFFFFD94C        47E08008                        lw              r1,8[sp]
3979
FFFFFFFFFFFFD950        47EF8000                     lw      lr,[sp]
3980
FFFFFFFFFFFFD954        37EF8010                     ret                #16
3981
 
3982
 
3983
                                                 ; Determine if the character is a digit
3984
                                                 ;   Parameters
3985
                                                 ;       r1 = char to test
3986
                                                 ;   Returns
3987
                                                 ;       r1 = 1 if digit, otherwise 0
3988
                                                 ;
3989
FFFFFFFFFFFFD958                                 isDigit:
3990
FFFFFFFFFFFFD958        A0100430                     blt     r1,#'0',isDigitFalse
3991
FFFFFFFFFFFFD95C        A6100339                     bgt     r1,#'9',isDigitFalse
3992
FFFFFFFFFFFFD960        E0400001                     setlo   r1,#1
3993
FFFFFFFFFFFFD964        37EF8000                     ret
3994
FFFFFFFFFFFFD968                                 isDigitFalse:
3995
FFFFFFFFFFFFD968        E0400000                     setlo   r1,#0
3996
FFFFFFFFFFFFD96C        37EF8000                     ret
3997
 
3998
 
3999
                                                 ; Determine if the character is a alphabetic
4000
                                                 ;   Parameters
4001
                                                 ;       r1 = char to test
4002
                                                 ;   Returns
4003
                                                 ;       r1 = 1 if alpha, otherwise 0
4004
                                                 ;
4005
FFFFFFFFFFFFD970                                 isAlpha:
4006
FFFFFFFFFFFFD970        A0100641                     blt     r1,#'A',isAlphaFalse
4007
FFFFFFFFFFFFD974        A410035A                     ble     r1,#'Z',isAlphaTrue
4008
FFFFFFFFFFFFD978        A0100461                     blt     r1,#'a',isAlphaFalse
4009
FFFFFFFFFFFFD97C        A610037A                     bgt     r1,#'z',isAlphaFalse
4010
FFFFFFFFFFFFD980                                 isAlphaTrue:
4011
FFFFFFFFFFFFD980        E0400001                     setlo   r1,#1
4012
FFFFFFFFFFFFD984        37EF8000                     ret
4013
FFFFFFFFFFFFD988                                 isAlphaFalse:
4014
FFFFFFFFFFFFD988        E0400000                     setlo   r1,#0
4015
FFFFFFFFFFFFD98C        37EF8000                     ret
4016
 
4017
 
4018
                                                 ; Determine if the character is a alphanumeric
4019
                                                 ;   Parameters
4020
                                                 ;       r1 = char to test
4021
                                                 ;   Returns
4022
                                                 ;       r1 = 1 if alpha, otherwise 0
4023
                                                 ;
4024
FFFFFFFFFFFFD990                                 isAlnum:
4025
FFFFFFFFFFFFD990        0FEF0008                     subui   sp,sp,#8
4026
FFFFFFFFFFFFD994        67EF8000                     sw      lr,[sp]
4027
FFFFFFFFFFFFD998        04100809                     or      r2,r1,r0           ; save test char
4028
FFFFFFFFFFFFD99C        31FFF656                     call    isDigit
4029
FFFFFFFFFFFFD9A0        BE100069                     bne                r1,r0,isDigitx  ; if it is a digit
4030
FFFFFFFFFFFFD9A4        04200409                     or      r1,r2,r0           ; get back test char
4031
FFFFFFFFFFFFD9A8        31FFF65C                     call    isAlpha
4032
FFFFFFFFFFFFD9AC                                 isDigitx:
4033
FFFFFFFFFFFFD9AC        47EF8000                     lw      lr,[sp]
4034
FFFFFFFFFFFFD9B0        37EF8008                     ret                #8
4035
 
4036
 
4037
FFFFFFFFFFFFD9B4                                 EXPR:
4038
FFFFFFFFFFFFD9B4        0FEF0010                        subui   sp,sp,#16
4039
FFFFFFFFFFFFD9B8        67EF8000                        sw              lr,[sp]
4040
FFFFFFFFFFFFD9BC        31FFF69C                        call    EXPR2
4041
FFFFFFFFFFFFD9C0        67E08008                        sw              r1,8[sp]        ; save  value
4042
FFFFFFFFFFFFD9C4        9A04D06B                        lea             r9,TAB8         ; look up a relational operator
4043
FFFFFFFFFFFFD9C8        9A0551B8                        lea             r10,TAB8_1
4044
FFFFFFFFFFFFD9CC        33FFF486                        jmp             EXEC            ; go do it
4045
FFFFFFFFFFFFD9D0                                 XP11:
4046
FFFFFFFFFFFFD9D0        47E08008                        lw              r1,8[sp]
4047
FFFFFFFFFFFFD9D4        31FFF695                        call    XP18    ; is it ">="?
4048
FFFFFFFFFFFFD9D8        BE208321                        bge             r2,r1,XPRT1     ; no, return r2=1
4049
FFFFFFFFFFFFD9DC        BE0002AA                        bra             XPRT0   ; else return r2=0
4050
FFFFFFFFFFFFD9E0                                 XP12:
4051
FFFFFFFFFFFFD9E0        47E08008                        lw              r1,8[sp]
4052
FFFFFFFFFFFFD9E4        31FFF695                        call    XP18    ; is it "<>"?
4053
FFFFFFFFFFFFD9E8        BE2082A9                        bne             r2,r1,XPRT1     ; no, return r2=1
4054
FFFFFFFFFFFFD9EC        BE00022A                        bra             XPRT0   ; else return r2=0
4055
FFFFFFFFFFFFD9F0                                 XP13:
4056
FFFFFFFFFFFFD9F0        47E08008                        lw              r1,8[sp]
4057
FFFFFFFFFFFFD9F4        31FFF695                        call    XP18    ; is it ">"?
4058
FFFFFFFFFFFFD9F8        BE208223                        bgt             r2,r1,XPRT1     ; no, return r2=1
4059
FFFFFFFFFFFFD9FC        BE0001AA                        bra             XPRT0   ; else return r2=0
4060
FFFFFFFFFFFFDA00                                 XP14:
4061
FFFFFFFFFFFFDA00        47E08008                        lw              r1,8[sp]
4062
FFFFFFFFFFFFDA04        31FFF695                        call    XP18    ; is it "<="?
4063
FFFFFFFFFFFFDA08        BE2081A2                        ble             r2,r1,XPRT1     ; no, return r2=1
4064
FFFFFFFFFFFFDA0C        BE00012A                        bra             XPRT0   ; else return r2=0
4065
FFFFFFFFFFFFDA10                                 XP15:
4066
FFFFFFFFFFFFDA10        47E08008                        lw              r1,8[sp]
4067
FFFFFFFFFFFFDA14        31FFF695                        call    XP18    ; is it "="?
4068
FFFFFFFFFFFFDA18        BE208128                        beq             r2,r1,XPRT1     ; if not, return r2=1
4069
FFFFFFFFFFFFDA1C        BE0000AA                        bra             XPRT0   ; else return r2=0
4070
FFFFFFFFFFFFDA20                                 XP16:
4071
FFFFFFFFFFFFDA20        47E08008                        lw              r1,8[sp]
4072
FFFFFFFFFFFFDA24        31FFF695                        call    XP18    ; is it "<"?
4073
FFFFFFFFFFFFDA28        BE2080A0                        blt             r2,r1,XPRT1     ; if not, return r2=1
4074
FFFFFFFFFFFFDA2C        BE00002A                        bra             XPRT0   ; else return r2=0
4075
FFFFFFFFFFFFDA30                                 XPRT0:
4076
FFFFFFFFFFFFDA30        47EF8000                        lw              lr,[sp]
4077
FFFFFFFFFFFFDA34        E0400000                        setlo   r1,#0   ; return r1=0 (false)
4078
FFFFFFFFFFFFDA38        37EF8010                        ret             #16
4079
FFFFFFFFFFFFDA3C                                 XPRT1:
4080
FFFFFFFFFFFFDA3C        47EF8000                        lw              lr,[sp]
4081
FFFFFFFFFFFFDA40        E0400001                        setlo   r1,#1   ; return r1=1 (true)
4082
FFFFFFFFFFFFDA44        37EF8010                        ret             #16
4083
 
4084
FFFFFFFFFFFFDA48                                 XP17:                          ; it's not a rel. operator
4085
FFFFFFFFFFFFDA48        47E08008                        lw              r1,8[sp]        ; return r2=
4086
FFFFFFFFFFFFDA4C        47EF8000                        lw              lr,[sp]
4087
FFFFFFFFFFFFDA50        37EF8010                        ret             #16
4088
 
4089
FFFFFFFFFFFFDA54                                 XP18:
4090
FFFFFFFFFFFFDA54        0FEF0010                        subui   sp,sp,#16
4091
FFFFFFFFFFFFDA58        67EF8000                        sw              lr,[sp]
4092
FFFFFFFFFFFFDA5C        67E08008                        sw              r1,8[sp]
4093
FFFFFFFFFFFFDA60        31FFF69C                        call    EXPR2           ; do a second 
4094
FFFFFFFFFFFFDA64        47E10008                        lw              r2,8[sp]
4095
FFFFFFFFFFFFDA68        47EF8000                        lw              lr,[sp]
4096
FFFFFFFFFFFFDA6C        37EF8010                        ret             #16
4097
 
4098
                                                 ; ::=(+ or -)(+ or -)(...
4099
 
4100
FFFFFFFFFFFFDA70                                 EXPR2:
4101
FFFFFFFFFFFFDA70        0FEF0010                        subui   sp,sp,#16
4102
FFFFFFFFFFFFDA74        67EF8000                        sw              lr,[sp]
4103
FFFFFFFFFFFFDA78        E0C0002D                        setlo   r3,#'-'
4104
FFFFFFFFFFFFDA7C        9A025A90                        lea             r4,XP21
4105
FFFFFFFFFFFFDA80        31FFF8F1                        call    TSTC            ; negative sign?
4106
FFFFFFFFFFFFDA84        E0400000                        setlo   r1,#0           ; yes, fake '0-'
4107
FFFFFFFFFFFFDA88        67E00008                        sw              r0,8[sp]
4108
FFFFFFFFFFFFDA8C        BE00020A                        bra             XP26
4109
FFFFFFFFFFFFDA90                                 XP21:
4110
FFFFFFFFFFFFDA90        E0C0002B                        setlo   r3,#'+'
4111
FFFFFFFFFFFFDA94        9A025A9C                        lea             r4,XP22
4112
FFFFFFFFFFFFDA98        31FFF8F1                        call    TSTC            ; positive sign? ignore it
4113
FFFFFFFFFFFFDA9C                                 XP22:
4114
FFFFFFFFFFFFDA9C        31FFF6B9                        call    EXPR3           ; first 
4115
FFFFFFFFFFFFDAA0                                 XP23:
4116
FFFFFFFFFFFFDAA0        67E08008                        sw              r1,8[sp]        ; yes, save the value
4117
FFFFFFFFFFFFDAA4        E0C0002B                        setlo   r3,#'+'
4118
FFFFFFFFFFFFDAA8        9A025AC0                        lea             r4,XP25
4119
FFFFFFFFFFFFDAAC        31FFF8F1                        call    TSTC            ; add?
4120
FFFFFFFFFFFFDAB0        31FFF6B9                        call    EXPR3           ; get the second 
4121
FFFFFFFFFFFFDAB4                                 XP24:
4122
FFFFFFFFFFFFDAB4        47E10008                        lw              r2,8[sp]
4123
FFFFFFFFFFFFDAB8        04110402                        add             r1,r1,r2        ; add it to the first 
4124
                                                 ;      BVS.L   QHOW            brnch if there's an overflow
4125
FFFFFFFFFFFFDABC        BE007F2A                        bra             XP23            ; else go back for more operations
4126
FFFFFFFFFFFFDAC0                                 XP25:
4127
FFFFFFFFFFFFDAC0        E0C0002D                        setlo   r3,#'-'
4128
FFFFFFFFFFFFDAC4        9A025AD8                        lea             r4,XP45
4129
FFFFFFFFFFFFDAC8        31FFF8F1                        call    TSTC            ; subtract?
4130
FFFFFFFFFFFFDACC                                 XP26:
4131
FFFFFFFFFFFFDACC        31FFF6B9                        call    EXPR3           ; get second 
4132
FFFFFFFFFFFFDAD0        02108006                        neg             r1,r1           ; change its sign
4133
FFFFFFFFFFFFDAD4        BE007F0A                        bra             XP24            ; and do an addition
4134
FFFFFFFFFFFFDAD8                                 XP45:
4135
FFFFFFFFFFFFDAD8        47E08008                        lw              r1,8[sp]
4136
FFFFFFFFFFFFDADC        47EF8000                        lw              lr,[sp]
4137
FFFFFFFFFFFFDAE0        37EF8010                        ret             #16
4138
 
4139
 
4140
                                                 ; ::=( <* or /> )(...
4141
 
4142
FFFFFFFFFFFFDAE4                                 EXPR3:
4143
FFFFFFFFFFFFDAE4        0FEF0010                        subui   sp,sp,#16
4144
FFFFFFFFFFFFDAE8        67EF8000                        sw              lr,[sp]
4145
FFFFFFFFFFFFDAEC        31FFF6CF                        call    EXPR4           ; get first 
4146
FFFFFFFFFFFFDAF0                                 XP31:
4147
FFFFFFFFFFFFDAF0        67E08008                        sw              r1,8[sp]        ; yes, save that first result
4148
FFFFFFFFFFFFDAF4        E0C0002A                        setlo   r3,#'*'
4149
FFFFFFFFFFFFDAF8        9A025B10                        lea             r4,XP34
4150
FFFFFFFFFFFFDAFC        31FFF8F1                        call    TSTC            ; multiply?
4151
FFFFFFFFFFFFDB00        31FFF6CF                        call    EXPR4           ; get second 
4152
FFFFFFFFFFFFDB04        47E10008                        lw              r2,8[sp]
4153
FFFFFFFFFFFFDB08        04110419                        muls    r1,r1,r2        ; multiply the two
4154
FFFFFFFFFFFFDB0C        BE007F2A                        bra             XP31        ; then look for more terms
4155
FFFFFFFFFFFFDB10                                 XP34:
4156
FFFFFFFFFFFFDB10        E0C0002F                        setlo   r3,#'/'
4157
FFFFFFFFFFFFDB14        9A025B30                        lea             r4,XP47
4158
FFFFFFFFFFFFDB18        31FFF8F1                        call    TSTC            ; divide?
4159
FFFFFFFFFFFFDB1C        31FFF6CF                        call    EXPR4           ; get second 
4160
FFFFFFFFFFFFDB20        04100809                        or      r2,r1,r0
4161
FFFFFFFFFFFFDB24        47E08008                        lw              r1,8[sp]
4162
FFFFFFFFFFFFDB28        0411041B                        divs    r1,r1,r2        ; do the division
4163
FFFFFFFFFFFFDB2C        BE007E2A                        bra             XP31            ; go back for any more terms
4164
FFFFFFFFFFFFDB30                                 XP47:
4165
FFFFFFFFFFFFDB30        47E08008                        lw              r1,8[sp]
4166
FFFFFFFFFFFFDB34        47EF8000                        lw              lr,[sp]
4167
FFFFFFFFFFFFDB38        37EF8010                        ret             #16
4168
 
4169
 
4170
                                                 ; Functions are called through EXPR4
4171
                                                 ; ::=
4172
                                                 ;          
4173
                                                 ;          ()
4174
 
4175
FFFFFFFFFFFFDB3C                                 EXPR4:
4176
FFFFFFFFFFFFDB3C        0FEF0018                     subui   sp,sp,#24
4177
FFFFFFFFFFFFDB40        67EF8000                     sw      lr,[sp]
4178
FFFFFFFFFFFFDB44        9A04D042                     lea                r9,TAB4         ; find possible function
4179
FFFFFFFFFFFFDB48        9A055150                     lea                r10,TAB4_1
4180
FFFFFFFFFFFFDB4C        33FFF486                        jmp             EXEC        ; branch to function which does subsequent ret for EXPR4
4181
FFFFFFFFFFFFDB50                                 XP40:                   ; we get here if it wasn't a function
4182
FFFFFFFFFFFFDB50        E0400000                        setlo   r1,#0
4183
FFFFFFFFFFFFDB54        31FFF6EC                        call    TSTV
4184
FFFFFFFFFFFFDB58        BE100088                        beq     r1,r0,XP41  ; nor a variable
4185
FFFFFFFFFFFFDB5C        46108000                        lw              r1,[r1]         ; if a variable, return its value in r1
4186
FFFFFFFFFFFFDB60        47EF8000                        lw      lr,[sp]
4187
FFFFFFFFFFFFDB64        37EF8018                        ret             #24
4188
FFFFFFFFFFFFDB68                                 XP41:
4189
FFFFFFFFFFFFDB68        31FFF8FF                        call    TSTNUM          ; or is it a number?
4190
FFFFFFFFFFFFDB6C        BE200049                        bne             r2,r0,XP46      ; (if not, # of digits will be zero) if so, return it in r1
4191
FFFFFFFFFFFFDB70        31FFF6DF                        call    PARN        ; check for (EXPR)
4192
FFFFFFFFFFFFDB74                                 XP46:
4193
FFFFFFFFFFFFDB74        47EF8000                        lw      lr,[sp]
4194
FFFFFFFFFFFFDB78        37EF8018                        ret             #24
4195
 
4196
 
4197
                                                 ; Check for a parenthesized expression
4198
FFFFFFFFFFFFDB7C                                 PARN:
4199
FFFFFFFFFFFFDB7C        0FEF0008                        subui   sp,sp,#8
4200
FFFFFFFFFFFFDB80        67EF8000                        sw              lr,[sp]
4201
FFFFFFFFFFFFDB84        E0C00028                        setlo   r3,#'('
4202
FFFFFFFFFFFFDB88        9A025BA8                        lea             r4,XP43
4203
FFFFFFFFFFFFDB8C        31FFF8F1                        call    TSTC            ; else look for ( OREXPR )
4204
FFFFFFFFFFFFDB90        31FFF63A                        call    OREXPR
4205
FFFFFFFFFFFFDB94        E0C00029                        setlo   r3,#')'
4206
FFFFFFFFFFFFDB98        9A025BA8                        lea             r4,XP43
4207
FFFFFFFFFFFFDB9C        31FFF8F1                        call    TSTC
4208
FFFFFFFFFFFFDBA0                                 XP42:
4209
FFFFFFFFFFFFDBA0        47EF8000                        lw              lr,[sp]
4210
FFFFFFFFFFFFDBA4        37EF8008                        ret             #8
4211
FFFFFFFFFFFFDBA8                                 XP43:
4212
FFFFFFFFFFFFDBA8        9A00E5FD                        lea             r1,msgWhat
4213
FFFFFFFFFFFFDBAC        BE001BAA                        bra             ERROR
4214
 
4215
 
4216
                                                 ; ===== Test for a valid variable name.  Returns Z=1 if not
4217
                                                 ;      found, else returns Z=0 and the address of the
4218
                                                 ;      variable in r1.
4219
                                                 ; Parameters
4220
                                                 ;      r1 = 1 = allocate if not found
4221
                                                 ; Returns
4222
                                                 ;      r1 = address of variable, zero if not found
4223
 
4224
FFFFFFFFFFFFDBB0                                 TSTV:
4225
FFFFFFFFFFFFDBB0        0FEF0018                        subui   sp,sp,#24
4226
FFFFFFFFFFFFDBB4        67EF8000                        sw              lr,[sp]
4227
FFFFFFFFFFFFDBB8        67E28008                        sw              r5,8[sp]
4228
FFFFFFFFFFFFDBBC        04101409                        or              r5,r1,r0        ; allocate flag
4229
FFFFFFFFFFFFDBC0        31FFF914                        call    IGNBLK
4230
FFFFFFFFFFFFDBC4        4A808000                        lbu             r1,[r8]         ; look at the program text
4231
FFFFFFFFFFFFDBC8        A0101740                        blt     r1,#'@',tstv_notfound   ; C=1: not a variable
4232
FFFFFFFFFFFFDBCC        B2100F40                        bne             r1,#'@',TV1     ; brnch if not "@" array
4233
FFFFFFFFFFFFDBD0        0A840001                        addui   r8,r8,#1        ; If it is, it should be
4234
FFFFFFFFFFFFDBD4        31FFF6DF                        call    PARN            ; followed by (EXPR) as its index.
4235
FFFFFFFFFFFFDBD8        06108600                        shli    r1,r1,#3
4236
                                                 ;      BCS.L   QHOW            say "How?" if index is too big
4237
FFFFFFFFFFFFDBDC        0FEF0018                        subui   sp,sp,#24
4238
FFFFFFFFFFFFDBE0        67E08008                     sw      r1,8[sp]    ; save the index
4239
FFFFFFFFFFFFDBE4        67EF8000                     sw         lr,[sp]
4240
FFFFFFFFFFFFDBE8        31FFF793                        call    SIZEX           ; get amount of free memory
4241
FFFFFFFFFFFFDBEC        47EF8000                        lw              lr,[sp]
4242
FFFFFFFFFFFFDBF0        47E10008                        lw      r2,8[sp]    ; get back the index
4243
FFFFFFFFFFFFDBF4        BE208044                        bltu    r2,r1,TV2       ; see if there's enough memory
4244
FFFFFFFFFFFFDBF8        33FFF7C5                        jmp     QSORRY          ; if not, say "Sorry"
4245
FFFFFFFFFFFFDBFC                                 TV2:
4246
FFFFFFFFFFFFDBFC        9A0090D8                        lea             r1,VARBGN   ; put address of array element...
4247
FFFFFFFFFFFFDC00        04110405                        subu    r1,r1,r2       ; into r1 (neg. offset is used)
4248
FFFFFFFFFFFFDC04        BE0000AA                        bra     TSTVRT
4249
FFFFFFFFFFFFDC08                                 TV1:
4250
FFFFFFFFFFFFDC08        31FFF70D                     call    getVarName      ; get variable name
4251
FFFFFFFFFFFFDC0C        BE100068                     beq     r1,r0,TSTVRT    ; if not, return r1=0
4252
FFFFFFFFFFFFDC10        02510009                     mov                r2,r5
4253
FFFFFFFFFFFFDC14        31FFF733                     call    findVar     ; find or allocate
4254
FFFFFFFFFFFFDC18                                 TSTVRT:
4255
FFFFFFFFFFFFDC18        47E28008                        lw              r5,8[sp]
4256
FFFFFFFFFFFFDC1C        47EF8000                        lw              lr,[sp]
4257
FFFFFFFFFFFFDC20        37EF8018                        ret             #24                     ; r1<>0 (found)
4258
FFFFFFFFFFFFDC24                                 tstv_notfound:
4259
FFFFFFFFFFFFDC24        47E28008                        lw              r5,8[sp]
4260
FFFFFFFFFFFFDC28        47EF8000                     lw      lr,[sp]
4261
FFFFFFFFFFFFDC2C        E0400000                     setlo   r1,#0       ; r1=0 if not found
4262
FFFFFFFFFFFFDC30        37EF8018                     ret                #24
4263
 
4264
 
4265
                                                 ; Returns
4266
                                                 ;   r1 = 6 character variable name + type
4267
                                                 ;
4268
FFFFFFFFFFFFDC34                                 getVarName:
4269
FFFFFFFFFFFFDC34        0FEF0018                     subui   sp,sp,#24
4270
FFFFFFFFFFFFDC38        67EF8000                     sw      lr,[sp]
4271
FFFFFFFFFFFFDC3C        67E28010                     sw         r5,16[sp]
4272
 
4273
FFFFFFFFFFFFDC40        40808000                     lb      r1,[r8]     ; get first character
4274
FFFFFFFFFFFFDC44        67E08008                     sw         r1,8[sp]        ; save off current name
4275
FFFFFFFFFFFFDC48        31FFF65C                     call    isAlpha
4276
FFFFFFFFFFFFDC4C        BE100388                     beq     r1,r0,gvn1
4277
FFFFFFFFFFFFDC50        E1400005                     setlo   r5,#5       ; loop six more times
4278
 
4279
                                                        ; check for second/third character
4280
FFFFFFFFFFFFDC54                                 gvn4:
4281
FFFFFFFFFFFFDC54        0A840001                        addui   r8,r8,#1
4282
FFFFFFFFFFFFDC58        40808000                        lb      r1,[r8]     ; do we have another char ?
4283
FFFFFFFFFFFFDC5C        31FFF664                        call    isAlnum
4284
FFFFFFFFFFFFDC60        BE100168                        beq     r1,r0,gvn2  ; nope
4285
FFFFFFFFFFFFDC64        47E08008                        lw      r1,8[sp]    ; get varname
4286
FFFFFFFFFFFFDC68        06109000                        shli    r1,r1,#8
4287
FFFFFFFFFFFFDC6C        40810000                        lb      r2,[r8]
4288
FFFFFFFFFFFFDC70        04110409                        or      r1,r1,r2   ; add in new char
4289
FFFFFFFFFFFFDC74        67E08008                     sw      r1,8[sp]   ; save off name again
4290
FFFFFFFFFFFFDC78        BE02FEEF                     loop       r5,gvn4
4291
 
4292
                                                     ; now ignore extra variable name characters
4293
FFFFFFFFFFFFDC7C                                 gvn6:
4294
FFFFFFFFFFFFDC7C        0A840001                     addui   r8,r8,#1
4295
FFFFFFFFFFFFDC80        40808000                     lb      r1,[r8]
4296
FFFFFFFFFFFFDC84        31FFF664                     call    isAlnum
4297
FFFFFFFFFFFFDC88        BE107FA9                     bne     r1,r0,gvn6 ; keep looping as long as we have identifier chars
4298
 
4299
                                                     ; check for a variable type
4300
FFFFFFFFFFFFDC8C                                 gvn2:
4301
FFFFFFFFFFFFDC8C        40808000                        lb              r1,[r8]
4302
FFFFFFFFFFFFDC90        B0100425                     beq     r1,#'%',gvn3
4303
FFFFFFFFFFFFDC94        B0100324                     beq     r1,#'$',gvn3
4304
FFFFFFFFFFFFDC98        E0400000                     setlo   r1,#0
4305
FFFFFFFFFFFFDC9C        0E840001                     subui   r8,r8,#1
4306
 
4307
                                                     ; insert variable type indicator and return
4308
FFFFFFFFFFFFDCA0                                 gvn3:
4309
FFFFFFFFFFFFDCA0        0A840001                     addui   r8,r8,#1
4310
FFFFFFFFFFFFDCA4        47E10008                     lw      r2,8[sp]
4311
FFFFFFFFFFFFDCA8        06211000                     shli       r2,r2,#8
4312
FFFFFFFFFFFFDCAC        04110409                     or      r1,r1,r2    ; add in variable type
4313
FFFFFFFFFFFFDCB0        47EF8000                     lw      lr,[sp]
4314
FFFFFFFFFFFFDCB4        47E28010                     lw         r5,16[sp]
4315
FFFFFFFFFFFFDCB8        37EF8018                     ret                #24                     ; return Z = 0, r1 = varname
4316
 
4317
                                                     ; not a variable name
4318
FFFFFFFFFFFFDCBC                                 gvn1:
4319
FFFFFFFFFFFFDCBC        47EF8000                     lw      lr,[sp]
4320
FFFFFFFFFFFFDCC0        47E28010                     lw         r5,16[sp]
4321
FFFFFFFFFFFFDCC4        E0400000                     setlo   r1,#0       ; return Z = 1 if not a varname
4322
FFFFFFFFFFFFDCC8        37EF8018                     ret                #24
4323
 
4324
 
4325
                                                 ; Find variable
4326
                                                 ;   r1 = varname
4327
                                                 ;      r2 = allocate flag
4328
                                                 ; Returns
4329
                                                 ;   r1 = variable address, Z =0 if found / allocated, Z=1 if not found
4330
 
4331
FFFFFFFFFFFFDCCC                                 findVar:
4332
FFFFFFFFFFFFDCCC        0FEF0010                     subui   sp,sp,#16
4333
FFFFFFFFFFFFDCD0        67EF8000                     sw      lr,[sp]
4334
FFFFFFFFFFFFDCD4        67E38008                     sw      r7,8[sp]
4335
FFFFFFFFFFFFDCD8        460190D8                     lw      r3,VARBGN
4336
FFFFFFFFFFFFDCDC                                 fv4:
4337
FFFFFFFFFFFFDCDC        46338000                     lw      r7,[r3]     ; get varname / type
4338
FFFFFFFFFFFFDCE0        BE700108                     beq     r7,r0,fv3   ; no more vars ?
4339
FFFFFFFFFFFFDCE4        BE138128                     beq     r1,r7,fv1  ; match ?
4340
FFFFFFFFFFFFDCE8        08318008                     add     r3,r3,#8    ; move to next var
4341
FFFFFFFFFFFFDCEC        460390F8                     lw      r7,STKBOT
4342
FFFFFFFFFFFFDCF0        BE33FF60                     blt     r3,r7,fv4   ; loop back to look at next var
4343
 
4344
                                                     ; variable not found
4345
                                                     ; no more memory
4346
FFFFFFFFFFFFDCF4        E07FE650                     setlo      r1,#
4347
FFFFFFFFFFFFDCF8        F04FFFFF                     sethi      r1,#>msgVarSpace
4348
FFFFFFFFFFFFDCFC        BE00112A                     bra     ERROR
4349
                                                 ;    lw      lr,[sp]
4350
                                                 ;    lw      r7,4[sp]
4351
                                                 ;    add     sp,sp,#8
4352
                                                 ;    lw      r1,#0
4353
                                                 ;    ret
4354
 
4355
                                                     ; variable not found
4356
                                                     ; allocate new ?
4357
FFFFFFFFFFFFDD00                                 fv3:
4358
FFFFFFFFFFFFDD00        BE2000C8                        beq             r2,r0,fv2
4359
FFFFFFFFFFFFDD04        66308000                     sw      r1,[r3]     ; save varname / type
4360
                                                     ; found variable
4361
                                                     ; return address
4362
FFFFFFFFFFFFDD08                                 fv1:
4363
FFFFFFFFFFFFDD08        0A308008                     addui   r1,r3,#8
4364
FFFFFFFFFFFFDD0C        47EF8000                     lw      lr,[sp]
4365
FFFFFFFFFFFFDD10        47E38008                     lw      r7,8[sp]
4366
FFFFFFFFFFFFDD14        37EF8010                     ret                #16    ; Z = 0, r1 = address
4367
 
4368
                                                     ; didn't find var and not allocating
4369
FFFFFFFFFFFFDD18                                 fv2:
4370
FFFFFFFFFFFFDD18        47EF8000                     lw      lr,[sp]
4371
FFFFFFFFFFFFDD1C        47E38008                     lw      r7,8[sp]
4372
FFFFFFFFFFFFDD20        0BEF0010                     addui   sp,sp,#16   ; Z = 0, r1 = address
4373
FFFFFFFFFFFFDD24        E0400000                        setlo   r1,#0           ; Z = 1, r1 = 0
4374
FFFFFFFFFFFFDD28        37EF8000                     ret
4375
 
4376
 
4377
                                                 ; ===== Multiplies the 32 bit values in r1 and r2, returning
4378
                                                 ;      the 32 bit result in r1.
4379
                                                 ;
4380
 
4381
                                                 ; ===== Divide the 32 bit value in r2 by the 32 bit value in r3.
4382
                                                 ;      Returns the 32 bit quotient in r1, remainder in r2
4383
                                                 ;
4384
                                                 ; r2 = a
4385
                                                 ; r3 = b
4386
                                                 ; r6 = remainder
4387
                                                 ; r7 = iteration count
4388
                                                 ; r8 = sign
4389
                                                 ;
4390
 
4391
                                                 ; q = a / b
4392
                                                 ; a = r1
4393
                                                 ; b = r2
4394
                                                 ; q = r2
4395
 
4396
 
4397
                                                 ; ===== The PEEK function returns the byte stored at the address
4398
                                                 ;      contained in the following expression.
4399
                                                 ;
4400
FFFFFFFFFFFFDD2C                                 PEEK:
4401
FFFFFFFFFFFFDD2C        31FFF6DF                        call    PARN            ; get the memory address
4402
FFFFFFFFFFFFDD30        4A108000                        lbu             r1,[r1]         ; get the addressed byte
4403
FFFFFFFFFFFFDD34        47EF8000                        lw              lr,[sp]         ; and return it
4404
FFFFFFFFFFFFDD38        37EF8018                        ret             #24
4405
 
4406
                                                 ; ===== The PEEK function returns the byte stored at the address
4407
                                                 ;      contained in the following expression.
4408
                                                 ;
4409
FFFFFFFFFFFFDD3C                                 PEEKC:
4410
FFFFFFFFFFFFDD3C        31FFF6DF                        call    PARN            ; get the memory address
4411
FFFFFFFFFFFFDD40        1410FFFE                        andi    r1,r1,#-2       ; align to char address
4412
FFFFFFFFFFFFDD44        4C108000                        lcu             r1,[r1]         ; get the addressed char
4413
FFFFFFFFFFFFDD48        47EF8000                        lw              lr,[sp]         ; and return it
4414
FFFFFFFFFFFFDD4C        37EF8018                        ret             #24
4415
 
4416
                                                 ; ===== The PEEK function returns the byte stored at the address
4417
                                                 ;      contained in the following expression.
4418
                                                 ;
4419
FFFFFFFFFFFFDD50                                 PEEKH:
4420
FFFFFFFFFFFFDD50        31FFF6DF                        call    PARN            ; get the memory address
4421
FFFFFFFFFFFFDD54        1410FFFC                        andi    r1,r1,#-4       ; align to half-word address
4422
FFFFFFFFFFFFDD58        4E108000                        lhu             r1,[r1]         ; get the addressed char
4423
FFFFFFFFFFFFDD5C        47EF8000                        lw              lr,[sp]         ; and return it
4424
FFFFFFFFFFFFDD60        37EF8018                        ret             #24
4425
 
4426
                                                 ; ===== The PEEK function returns the byte stored at the address
4427
                                                 ;      contained in the following expression.
4428
                                                 ;
4429
FFFFFFFFFFFFDD64                                 PEEKW:
4430
FFFFFFFFFFFFDD64        31FFF6DF                        call    PARN            ; get the memory address
4431
FFFFFFFFFFFFDD68        1410FFF8                        andi    r1,r1,#-8               ; align to word address
4432
FFFFFFFFFFFFDD6C        46108000                        lw              r1,[r1]         ; get the addressed word
4433
FFFFFFFFFFFFDD70        47EF8000                        lw              lr,[sp]         ; and return it
4434
FFFFFFFFFFFFDD74        37EF8018                        ret             #24
4435
 
4436
                                                 ; user function call
4437
                                                 ; call the user function with argument in r1
4438
FFFFFFFFFFFFDD78                                 USRX:
4439
FFFFFFFFFFFFDD78        31FFF6DF                        call    PARN            ; get expression value
4440
FFFFFFFFFFFFDD7C        67E40008                        sw              r8,8[sp]        ; save the text pointer
4441
FFFFFFFFFFFFDD80        46011028                        lw      r2,usrJmp   ; get usr vector
4442
FFFFFFFFFFFFDD84        342F8000                        jal             r31,[r2]        ; jump to the subroutine
4443
FFFFFFFFFFFFDD88        47E40008                        lw              r8,8[sp]        ; restore the text pointer
4444
FFFFFFFFFFFFDD8C        47EF8000                        lw              lr,[sp]
4445
FFFFFFFFFFFFDD90        37EF8018                        ret             #24
4446
 
4447
 
4448
                                                 ; ===== The RND function returns a random number from 1 to
4449
                                                 ;      the value of the following expression in D0.
4450
                                                 ;
4451
FFFFFFFFFFFFDD94                                 RND:
4452
FFFFFFFFFFFFDD94        31FFF6DF                        call    PARN            ; get the upper limit
4453
FFFFFFFFFFFFDD98        BE100168                        beq             r1,r0,rnd2      ; it must be positive and non-zero
4454
FFFFFFFFFFFFDD9C        BE100100                        blt             r1,r0,rnd1
4455
FFFFFFFFFFFFDDA0        04100809                        lw              r2,r1
4456
FFFFFFFFFFFFDDA4        00000050                        gran                            ; generate a random number
4457
FFFFFFFFFFFFDDA8        020088A8                        mfspr   r1,rand         ; get the number
4458
FFFFFFFFFFFFDDAC        31FFF775                        call    modu4           ; RND(n)=MOD(number,n)+1
4459
FFFFFFFFFFFFDDB0        0A108001                        addui   r1,r1,#1
4460
FFFFFFFFFFFFDDB4        47EF8000                        lw              lr,[sp]
4461
FFFFFFFFFFFFDDB8        37EF8018                        ret             #24
4462
FFFFFFFFFFFFDDBC                                 rnd1:
4463
FFFFFFFFFFFFDDBC        9A00E6C1                        lea             r1,msgRNDBad
4464
FFFFFFFFFFFFDDC0        BE000B0A                        bra             ERROR
4465
FFFFFFFFFFFFDDC4                                 rnd2:
4466
FFFFFFFFFFFFDDC4        00000050                        gran
4467
FFFFFFFFFFFFDDC8        020088A8                        mfspr   r1,rand
4468
FFFFFFFFFFFFDDCC        47EF8000                        lw              lr,[sp]
4469
FFFFFFFFFFFFDDD0        37EF8018                        ret             #24
4470
 
4471
 
4472
                                                 ; r = a mod b
4473
                                                 ; a = r1
4474
                                                 ; b = r2
4475
                                                 ; r = r6
4476
FFFFFFFFFFFFDDD4                                 modu4:
4477
FFFFFFFFFFFFDDD4        0FEF0020                        subui   sp,sp,#32
4478
FFFFFFFFFFFFDDD8        67E18000                        sw              r3,[sp]
4479
FFFFFFFFFFFFDDDC        67E28008                        sw              r5,8[sp]
4480
FFFFFFFFFFFFDDE0        67E30010                        sw              r6,16[sp]
4481
FFFFFFFFFFFFDDE4        67E38018                        sw              r7,24[sp]
4482
FFFFFFFFFFFFDDE8        1603803F                        lw      r7,#63          ; n = 64
4483
FFFFFFFFFFFFDDEC        0452940A                        xor             r5,r5,r5        ; w = 0
4484
FFFFFFFFFFFFDDF0        0463180A                        xor             r6,r6,r6        ; r = 0
4485
FFFFFFFFFFFFDDF4                                 mod2:
4486
FFFFFFFFFFFFDDF4        06108202                        roli    r1,r1,#1        ; a <<= 1
4487
FFFFFFFFFFFFDDF8        14118001                        andi    r3,r1,#1
4488
FFFFFFFFFFFFDDFC        06630200                        shli    r6,r6,#1        ; r <<= 1
4489
FFFFFFFFFFFFDE00        04619809                        or              r6,r6,r3
4490
FFFFFFFFFFFFDE04        1410FFFE                        andi    r1,r1,#-2
4491
FFFFFFFFFFFFDE08        BE230047                        bgtu    r2,r6,mod1      ; b < r ?
4492
FFFFFFFFFFFFDE0C        04611805                        subu    r6,r6,r2        ; r -= b
4493
FFFFFFFFFFFFDE10                                 mod1:
4494
FFFFFFFFFFFFDE10        BE03FF2F                     loop       r7,mod2         ; n--
4495
FFFFFFFFFFFFDE14        02608009                        mov             r1,r6
4496
FFFFFFFFFFFFDE18        47E18000                        lw              r3,[sp]
4497
FFFFFFFFFFFFDE1C        47E28008                        lw              r5,8[sp]
4498
FFFFFFFFFFFFDE20        47E30010                        lw              r6,16[sp]
4499
FFFFFFFFFFFFDE24        47E38018                        lw              r7,24[sp]
4500
FFFFFFFFFFFFDE28        37EF8020                        ret             #32
4501
 
4502
 
4503
                                                 ; ===== The ABS function returns an absolute value in r2.
4504
                                                 ;
4505
FFFFFFFFFFFFDE2C                                 ABS:
4506
FFFFFFFFFFFFDE2C        31FFF6DF                        call    PARN            ; get the following expr.'s value
4507
FFFFFFFFFFFFDE30        02108007                        abs             r1,r1
4508
FFFFFFFFFFFFDE34        47EF8000                        lw              lr,[sp]
4509
FFFFFFFFFFFFDE38        37EF8018                        ret             #24
4510
 
4511
                                                 ; ===== The SGN function returns the sign in r1. +1,0, or -1
4512
                                                 ;
4513
FFFFFFFFFFFFDE3C                                 SGN:
4514
FFFFFFFFFFFFDE3C        31FFF6DF                        call    PARN            ; get the following expr.'s value
4515
FFFFFFFFFFFFDE40        02108008                        sgn             r1,r1
4516
FFFFFFFFFFFFDE44        47EF8000                        lw              lr,[sp]
4517
FFFFFFFFFFFFDE48        37EF8018                        ret             #24
4518
 
4519
                                                 ; ===== The SIZE function returns the size of free memory in r1.
4520
                                                 ;
4521
FFFFFFFFFFFFDE4C                                 SIZEX:
4522
FFFFFFFFFFFFDE4C        460090D8                        lw              r1,VARBGN       ; get the number of free bytes...
4523
FFFFFFFFFFFFDE50        460110D0                        lw              r2,TXTUNF       ; between 'TXTUNF' and 'VARBGN'
4524
FFFFFFFFFFFFDE54        04110405                        subu    r1,r1,r2
4525
FFFFFFFFFFFFDE58        47EF8000                        lw              lr,[sp]
4526
FFFFFFFFFFFFDE5C        37EF8018                        ret             #24                     ; return the number in r2
4527
 
4528
 
4529
                                                 ;******************************************************************
4530
                                                 ;
4531
                                                 ; *** SETVAL *** FIN *** ENDCHK *** ERROR (& friends) ***
4532
                                                 ;
4533
                                                 ; 'SETVAL' expects a variable, followed by an equal sign and then
4534
                                                 ; an expression.  It evaluates the expression and sets the variable
4535
                                                 ; to that value.
4536
                                                 ;
4537
                                                 ; 'FIN' checks the end of a command.  If it ended with ":",
4538
                                                 ; execution continues. If it ended with a CR, it finds the
4539
                                                 ; the next line and continues from there.
4540
                                                 ;
4541
                                                 ; 'ENDCHK' checks if a command is ended with a CR. This is
4542
                                                 ; required in certain commands, such as GOTO, RETURN, STOP, etc.
4543
                                                 ;
4544
                                                 ; 'ERROR' prints the string pointed to by r1. It then prints the
4545
                                                 ; line pointed to by CURRNT with a "?" inserted at where the
4546
                                                 ; old text pointer (should be on top of the stack) points to.
4547
                                                 ; Execution of Tiny BASIC is stopped and a warm start is done.
4548
                                                 ; If CURRNT is zero (indicating a direct command), the direct
4549
                                                 ; command is not printed. If CURRNT is -1 (indicating
4550
                                                 ; 'INPUT' command in progress), the input line is not printed
4551
                                                 ; and execution is not terminated but continues at 'INPERR'.
4552
                                                 ;
4553
                                                 ; Related to 'ERROR' are the following:
4554
                                                 ; 'QWHAT' saves text pointer on stack and gets "What?" message.
4555
                                                 ; 'AWHAT' just gets the "What?" message and jumps to 'ERROR'.
4556
                                                 ; 'QSORRY' and 'ASORRY' do the same kind of thing.
4557
                                                 ; 'QHOW' and 'AHOW' also do this for "How?".
4558
                                                 ;
4559
 
4560
                                                 ; returns
4561
                                                 ; r2 = variable's address
4562
                                                 ;
4563
FFFFFFFFFFFFDE60                                 SETVAL:
4564
FFFFFFFFFFFFDE60        0FEF0010                     subui   sp,sp,#16
4565
FFFFFFFFFFFFDE64        67EF8000                     sw      lr,[sp]
4566
FFFFFFFFFFFFDE68        E0400001                     setlo      r1,#1           ; allocate var
4567
FFFFFFFFFFFFDE6C        31FFF6EC                     call       TSTV            ; variable name?
4568
FFFFFFFFFFFFDE70        BE100069                     bne                r1,r0,sv2
4569
FFFFFFFFFFFFDE74        9A00E6AA                        lea             r1,msgVar
4570
FFFFFFFFFFFFDE78        BE00054A                        bra             ERROR
4571
FFFFFFFFFFFFDE7C                                 sv2:
4572
FFFFFFFFFFFFDE7C        67E08008                        sw      r1,8[sp]    ; save the variable's address
4573
FFFFFFFFFFFFDE80        E0C0003D                        setlo   r3,#'='
4574
FFFFFFFFFFFFDE84        9A025EA4                        lea             r4,SV1
4575
FFFFFFFFFFFFDE88        31FFF8F1                        call    TSTC            ; get past the "=" sign
4576
FFFFFFFFFFFFDE8C        31FFF63A                        call    OREXPR          ; evaluate the expression
4577
FFFFFFFFFFFFDE90        47E10008                        lw      r2,8[sp]    ; get back the variable's address
4578
FFFFFFFFFFFFDE94        66208000                        sw      r1,[r2]     ; and save value in the variable
4579
FFFFFFFFFFFFDE98        04200409                        lw              r1,r2           ; return r1 = variable address
4580
FFFFFFFFFFFFDE9C        47EF8000                        lw      lr,[sp]
4581
FFFFFFFFFFFFDEA0        37EF8010                        ret             #16
4582
FFFFFFFFFFFFDEA4                                 SV1:
4583
FFFFFFFFFFFFDEA4        BE0003CA                     bra            QWHAT               ; if no "=" sign
4584
 
4585
 
4586
FFFFFFFFFFFFDEA8                                 FIN:
4587
FFFFFFFFFFFFDEA8        0FEF0008                        subui   sp,sp,#8
4588
FFFFFFFFFFFFDEAC        67EF8000                        sw              lr,[sp]
4589
FFFFFFFFFFFFDEB0        E0C0003A                        setlo   r3,#':'
4590
FFFFFFFFFFFFDEB4        9A025EC4                        lea             r4,FI1
4591
FFFFFFFFFFFFDEB8        31FFF8F1                        call    TSTC            ; *** FIN ***
4592
FFFFFFFFFFFFDEBC        0BEF0008                        addui   sp,sp,#8        ; if ":", discard return address
4593
FFFFFFFFFFFFDEC0        BE0020AA                        bra             RUNSML          ; continue on the same line
4594
FFFFFFFFFFFFDEC4                                 FI1:
4595
FFFFFFFFFFFFDEC4        E0C0000D                        setlo   r3,#CR
4596
FFFFFFFFFFFFDEC8        9A025EDC                        lea             r4,FI2
4597
FFFFFFFFFFFFDECC        31FFF8F1                        call    TSTC            ; not ":", is it a CR?
4598
FFFFFFFFFFFFDED0        47EF8000                        lw              lr,[sp] ; else return to the caller
4599
FFFFFFFFFFFFDED4        0BEF0008                        addui   sp,sp,#8        ; yes, purge return address
4600
FFFFFFFFFFFFDED8        BE001EAA                        bra             RUNNXL          ; execute the next line
4601
FFFFFFFFFFFFDEDC                                 FI2:
4602
FFFFFFFFFFFFDEDC        47EF8000                        lw              lr,[sp] ; else return to the caller
4603
FFFFFFFFFFFFDEE0        37EF8008                        ret             #8
4604
 
4605
 
4606
                                                 ; Check that there is nothing else on the line
4607
                                                 ; Registers Affected
4608
                                                 ;   r1
4609
                                                 ;
4610
FFFFFFFFFFFFDEE4                                 ENDCHK:
4611
FFFFFFFFFFFFDEE4        0FEF0008                        subui   sp,sp,#8
4612
FFFFFFFFFFFFDEE8        67EF8000                        sw              lr,[sp]
4613
FFFFFFFFFFFFDEEC        31FFF914                        call    IGNBLK
4614
FFFFFFFFFFFFDEF0        40808000                        lb              r1,[r8]
4615
FFFFFFFFFFFFDEF4        B010040D                        beq             r1,#CR,ec1      ; does it end with a CR?
4616
FFFFFFFFFFFFDEF8        E07FE784                        setlo   r1,#
4617
FFFFFFFFFFFFDEFC        F04FFFFF                        sethi   r1,#>msgExtraChars
4618
FFFFFFFFFFFFDF00        33FFF7C8                        jmp             ERROR
4619
FFFFFFFFFFFFDF04                                 ec1:
4620
FFFFFFFFFFFFDF04        47EF8000                        lw              lr,[sp]
4621
FFFFFFFFFFFFDF08        37EF8008                        ret             #8
4622
 
4623
 
4624
FFFFFFFFFFFFDF0C                                 TOOBIG:
4625
FFFFFFFFFFFFDF0C        9A00E76F                        lea             r1,msgTooBig
4626
FFFFFFFFFFFFDF10        BE00008A                        bra             ERROR
4627
FFFFFFFFFFFFDF14                                 QSORRY:
4628
FFFFFFFFFFFFDF14        9A00E605                     lea                r1,SRYMSG
4629
FFFFFFFFFFFFDF18        BE00004A                        bra         ERROR
4630
FFFFFFFFFFFFDF1C                                 QWHAT:
4631
FFFFFFFFFFFFDF1C        9A00E5FD                        lea             r1,msgWhat
4632
FFFFFFFFFFFFDF20                                 ERROR:
4633
FFFFFFFFFFFFDF20        31FFF940                        call    PRMESG          ; display the error message
4634
FFFFFFFFFFFFDF24        46009090                        lw              r1,CURRNT       ; get the current line number
4635
FFFFFFFFFFFFDF28        BE107E88                        beq             r1,r0,WSTART    ; if zero, do a warm start
4636
FFFFFFFFFFFFDF2C        B01D9AFF                        beq             r1,#-1,INPERR           ; is the line no. pointer = -1? if so, redo input
4637
FFFFFFFFFFFFDF30        40828000                        lb              r5,[r8]         ; save the char. pointed to
4638
FFFFFFFFFFFFDF34        60800000                        sb              r0,[r8]         ; put a zero where the error is
4639
FFFFFFFFFFFFDF38        46009090                        lw              r1,CURRNT       ; point to start of current line
4640
FFFFFFFFFFFFDF3C        31FFF8DF                        call    PRTLN           ; display the line in error up to the 0
4641
FFFFFFFFFFFFDF40        04101809                        or      r6,r1,r0    ; save off end pointer
4642
FFFFFFFFFFFFDF44        60828000                        sb              r5,[r8]         ; restore the character
4643
FFFFFFFFFFFFDF48        E040003F                        setlo   r1,#'?'         ; display a "?"
4644
FFFFFFFFFFFFDF4C        31FFF393                        call    GOOUT
4645
FFFFFFFFFFFFDF50        E0800000                        setlo   r2,#0       ; stop char = 0
4646
FFFFFFFFFFFFDF54        0E608001                        subui   r1,r6,#1        ; point back to the error char.
4647
FFFFFFFFFFFFDF58        31FFF851                        call    PRTSTG          ; display the rest of the line
4648
FFFFFFFFFFFFDF5C        33FFF3BE                        jmp         WSTART              ; and do a warm start
4649
 
4650
                                                 ;******************************************************************
4651
                                                 ;
4652
                                                 ; *** GETLN *** FNDLN (& friends) ***
4653
                                                 ;
4654
                                                 ; 'GETLN' reads in input line into 'BUFFER'. It first prompts with
4655
                                                 ; the character in r3 (given by the caller), then it fills the
4656
                                                 ; buffer and echos. It ignores LF's but still echos
4657
                                                 ; them back. Control-H is used to delete the last character
4658
                                                 ; entered (if there is one), and control-X is used to delete the
4659
                                                 ; whole line and start over again. CR signals the end of a line,
4660
                                                 ; and causes 'GETLN' to return.
4661
                                                 ;
4662
                                                 ;
4663
FFFFFFFFFFFFDF60                                 GETLN:
4664
FFFFFFFFFFFFDF60        0FEF0010                        subui   sp,sp,#16
4665
FFFFFFFFFFFFDF64        67EF8000                        sw              lr,[sp]
4666
FFFFFFFFFFFFDF68        67E28008                        sw              r5,8[sp]
4667
FFFFFFFFFFFFDF6C        31FFF393                        call    GOOUT           ; display the prompt
4668
FFFFFFFFFFFFDF70        E0400001                        setlo   r1,#1           ; turn on cursor flash
4669
FFFFFFFFFFFFDF74        60009046                        sb              r1,cursFlash
4670
FFFFFFFFFFFFDF78        E0400020                        setlo   r1,#' '         ; and a space
4671
FFFFFFFFFFFFDF7C        31FFF393                        call    GOOUT
4672
FFFFFFFFFFFFDF80        E200111B                        setlo   r8,#
4673
FFFFFFFFFFFFDF84        F2000000                        sethi   r8,#>BUFFER
4674
FFFFFFFFFFFFDF88                                 GL1:
4675
FFFFFFFFFFFFDF88        31FFF936                        call    CHKIO           ; check keyboard
4676
FFFFFFFFFFFFDF8C        BE107FE8                        beq             r1,r0,GL1       ; wait for a char. to come in
4677
FFFFFFFFFFFFDF90        B0100B08                        beq             r1,#CTRLH,GL3   ; delete last character? if so
4678
FFFFFFFFFFFFDF94        B0101418                        beq             r1,#CTRLX,GL4   ; delete the whole line?
4679
FFFFFFFFFFFFDF98        B010020D                        beq             r1,#CR,GL2      ; accept a CR
4680
FFFFFFFFFFFFDF9C        A81FFB20                        bltu    r1,#' ',GL1     ; if other control char., discard it
4681
FFFFFFFFFFFFDFA0                                 GL2:
4682
FFFFFFFFFFFFDFA0        60808000                        sb              r1,[r8]         ; save the char.
4683
FFFFFFFFFFFFDFA4        08840001                        add             r8,r8,#1
4684
FFFFFFFFFFFFDFA8        31FFF393                        call    GOOUT           ; echo the char back out
4685
FFFFFFFFFFFFDFAC        4080FFFF                        lb      r1,-1[r8]   ; get char back (GOOUT destroys r1)
4686
FFFFFFFFFFFFDFB0        B010190D                        beq             r1,#CR,GL7      ; if it's a CR, end the line
4687
FFFFFFFFFFFFDFB4        1280916A                        cmpui   r1,r8,#BUFFER+BUFLEN-1  ; any more room?
4688
FFFFFFFFFFFFDFB8        BE107E80                        blt             r1,r0,GL1       ; yes: get some more, else delete last char.
4689
FFFFFFFFFFFFDFBC                                 GL3:
4690
FFFFFFFFFFFFDFBC        E0400008                        setlo   r1,#CTRLH       ; delete a char. if possible
4691
FFFFFFFFFFFFDFC0        31FFF393                        call    GOOUT
4692
FFFFFFFFFFFFDFC4        E0400020                        setlo   r1,#' '
4693
FFFFFFFFFFFFDFC8        31FFF393                        call    GOOUT
4694
FFFFFFFFFFFFDFCC        1280911B                        cmpui   r1,r8,#BUFFER   ; any char.'s left?
4695
FFFFFFFFFFFFDFD0        BE107DC2                        ble             r1,r0,GL1               ; if not
4696
FFFFFFFFFFFFDFD4        E0400008                        setlo   r1,#CTRLH       ; if so, finish the BS-space-BS sequence
4697
FFFFFFFFFFFFDFD8        31FFF393                        call    GOOUT
4698
FFFFFFFFFFFFDFDC        0C840001                        sub             r8,r8,#1        ; decrement the text pointer
4699
FFFFFFFFFFFFDFE0        BE007D4A                        bra             GL1                     ; back for more
4700
FFFFFFFFFFFFDFE4                                 GL4:
4701
FFFFFFFFFFFFDFE4        04800409                        or              r1,r8,r0                ; delete the whole line
4702
FFFFFFFFFFFFDFE8        0E12911B                        subui   r5,r1,#BUFFER   ; figure out how many backspaces we need
4703
FFFFFFFFFFFFDFEC        BE500108                        beq             r5,r0,GL6               ; if none needed, brnch
4704
FFFFFFFFFFFFDFF0                                 GL5:
4705
FFFFFFFFFFFFDFF0        E0400008                        setlo   r1,#CTRLH       ; and display BS-space-BS sequences
4706
FFFFFFFFFFFFDFF4        31FFF393                        call    GOOUT
4707
FFFFFFFFFFFFDFF8        E0400020                        setlo   r1,#' '
4708
FFFFFFFFFFFFDFFC        31FFF393                        call    GOOUT
4709
FFFFFFFFFFFFE000        E0400008                        setlo   r1,#CTRLH
4710
FFFFFFFFFFFFE004        31FFF393                        call    GOOUT
4711
FFFFFFFFFFFFE008        BE02FF4F                        loop    r5,GL5
4712
FFFFFFFFFFFFE00C                                 GL6:
4713
FFFFFFFFFFFFE00C        9A04111B                        lea             r8,BUFFER       ; reinitialize the text pointer
4714
FFFFFFFFFFFFE010        BE007BCA                        bra             GL1                     ; and go back for more
4715
FFFFFFFFFFFFE014                                 GL7:
4716
FFFFFFFFFFFFE014        E0400000                        setlo   r1,#0           ; turn off cursor flash
4717
FFFFFFFFFFFFE018        60009046                        sb              r1,cursFlash
4718
FFFFFFFFFFFFE01C        E040000A                        setlo   r1,#LF          ; echo a LF for the CR
4719
FFFFFFFFFFFFE020        31FFF393                        call    GOOUT
4720
FFFFFFFFFFFFE024        47EF8000                        lw              lr,[sp]
4721
FFFFFFFFFFFFE028        47E28008                        lw              r5,8[sp]
4722
FFFFFFFFFFFFE02C        37EF8010                        ret             #16
4723
 
4724
 
4725
                                                 ; 'FNDLN' finds a line with a given line no. (in r1) in the
4726
                                                 ; text save area.  r9 is used as the text pointer. If the line
4727
                                                 ; is found, r9 will point to the beginning of that line
4728
                                                 ; (i.e. the high byte of the line no.), and flags are Z.
4729
                                                 ; If that line is not there and a line with a higher line no.
4730
                                                 ; is found, r9 points there and flags are NC & NZ. If we reached
4731
                                                 ; the end of the text save area and cannot find the line, flags
4732
                                                 ; are C & NZ.
4733
                                                 ; Z=1 if line found
4734
                                                 ; N=1 if end of text save area
4735
                                                 ; Z=0 & N=0 if higher line found
4736
                                                 ; r0 = 1       <= line is found
4737
                                                 ;      r9 = pointer to line
4738
                                                 ; r0 = 0    <= line is not found
4739
                                                 ;      r9 = zero, if end of text area
4740
                                                 ;      r9 = otherwise higher line number
4741
                                                 ;
4742
                                                 ; 'FNDLN' will initialize r9 to the beginning of the text save
4743
                                                 ; area to start the search. Some other entries of this routine
4744
                                                 ; will not initialize r9 and do the search.
4745
                                                 ; 'FNDLNP' will start with r9 and search for the line no.
4746
                                                 ; 'FNDNXT' will bump r9 by 2, find a CR and then start search.
4747
                                                 ; 'FNDSKP' uses r9 to find a CR, and then starts the search.
4748
                                                 ; return Z=1 if line is found, r9 = pointer to line
4749
                                                 ;
4750
                                                 ; Parameters
4751
                                                 ;      r1 = line number to find
4752
                                                 ;
4753
FFFFFFFFFFFFE030                                 FNDLN:
4754
FFFFFFFFFFFFE030        AC1003FF                        bleui   r1,#0xFFFF,fl1  ; line no. must be < 65535
4755
FFFFFFFFFFFFE034        9A00E694                        lea             r1,msgLineRange
4756
FFFFFFFFFFFFE038        BE00774A                        bra             ERROR
4757
FFFFFFFFFFFFE03C                                 fl1:
4758
FFFFFFFFFFFFE03C        4604CE60                        lw              r9,TXTBGN       ; init. the text save pointer
4759
 
4760
FFFFFFFFFFFFE040                                 FNDLNP:
4761
FFFFFFFFFFFFE040        460510D0                        lw              r10,TXTUNF      ; check if we passed the end
4762
FFFFFFFFFFFFE044        0EA50001                        subui   r10,r10,#1
4763
FFFFFFFFFFFFE048        BE950127                        bgtu    r9,r10,FNDRET1          ; if so, return with r9=0,r1=0
4764
FFFFFFFFFFFFE04C        4A918000                        lbu             r3,[r9]         ; get low order byte of line number
4765
FFFFFFFFFFFFE050        4A910001                        lbu             r2,1[r9]        ; get high order byte
4766
FFFFFFFFFFFFE054        06211000                        shli    r2,r2,#8
4767
FFFFFFFFFFFFE058        04218809                        or              r2,r2,r3        ; build whole line number
4768
FFFFFFFFFFFFE05C        BE110127                        bgtu    r1,r2,FNDNXT    ; is this the line we want? no, not there yet
4769
FFFFFFFFFFFFE060        BE1100C8                        beq             r1,r2,FNDRET2
4770
FFFFFFFFFFFFE064                                 FNDRET:
4771
FFFFFFFFFFFFE064        0410840A                        xor             r1,r1,r1        ; line not found, but r9=next line pointer
4772
FFFFFFFFFFFFE068        37EF8000                        ret                     ; return the cond. codes
4773
FFFFFFFFFFFFE06C                                 FNDRET1:
4774
FFFFFFFFFFFFE06C        0494A40A                        xor             r9,r9,r9        ; no higher line
4775
FFFFFFFFFFFFE070        0410840A                        xor             r1,r1,r1        ; line not found
4776
FFFFFFFFFFFFE074        37EF8000                        ret
4777
FFFFFFFFFFFFE078                                 FNDRET2:
4778
FFFFFFFFFFFFE078        E0400001                        setlo   r1,#1           ; line found
4779
FFFFFFFFFFFFE07C        37EF8000                        ret
4780
 
4781
FFFFFFFFFFFFE080                                 FNDNXT:
4782
FFFFFFFFFFFFE080        0A948002                        addui   r9,r9,#2        ; find the next line
4783
 
4784
FFFFFFFFFFFFE084                                 FNDSKP:
4785
FFFFFFFFFFFFE084        4A910000                        lbu             r2,[r9]
4786
FFFFFFFFFFFFE088        0A948001                        addui   r9,r9,#1
4787
FFFFFFFFFFFFE08C        B22FFE0D                        bnei    r2,#CR,FNDSKP           ; try to find a CR, keep looking
4788
FFFFFFFFFFFFE090        BE007D8A                        bra             FNDLNP          ; check if end of text
4789
 
4790
 
4791
                                                 ;******************************************************************
4792
                                                 ; 'MVUP' moves a block up from where r1 points to where r2 points
4793
                                                 ; until r1=r3
4794
                                                 ;
4795
FFFFFFFFFFFFE094                                 MVUP1:
4796
FFFFFFFFFFFFE094        40120000                        lb              r4,[r1]
4797
FFFFFFFFFFFFE098        60220000                        sb              r4,[r2]
4798
FFFFFFFFFFFFE09C        08108001                        add             r1,r1,#1
4799
FFFFFFFFFFFFE0A0        08210001                        add             r2,r2,#1
4800
FFFFFFFFFFFFE0A4                                 MVUP:
4801
FFFFFFFFFFFFE0A4        BE11FF89                        bne             r1,r3,MVUP1
4802
FFFFFFFFFFFFE0A8                                 MVRET:
4803
FFFFFFFFFFFFE0A8        37EF8000                        ret
4804
 
4805
 
4806
                                                 ; 'MVDOWN' moves a block down from where r1 points to where r2
4807
                                                 ; points until r1=r3
4808
                                                 ;
4809
FFFFFFFFFFFFE0AC                                 MVDOWN1:
4810
FFFFFFFFFFFFE0AC        0C108001                        sub             r1,r1,#1
4811
FFFFFFFFFFFFE0B0        0C210001                        sub             r2,r2,#1
4812
FFFFFFFFFFFFE0B4        40120000                        lb              r4,[r1]
4813
FFFFFFFFFFFFE0B8        60220000                        sb              r4,[r2]
4814
FFFFFFFFFFFFE0BC                                 MVDOWN:
4815
FFFFFFFFFFFFE0BC        BE11FF89                        bne             r1,r3,MVDOWN1
4816
FFFFFFFFFFFFE0C0        37EF8000                        ret
4817
 
4818
 
4819
                                                 ; 'POPA' restores the 'FOR' loop variable save area from the stack
4820
                                                 ;
4821
                                                 ; 'PUSHA' stacks for 'FOR' loop variable save area onto the stack
4822
                                                 ;
4823
                                                 ; Note: a single zero word is stored on the stack in the
4824
                                                 ; case that no FOR loops need to be saved. This needs to be
4825
                                                 ; done because PUSHA / POPA is called all the time.
4826
 
4827
FFFFFFFFFFFFE0C4                                 POPA:
4828
FFFFFFFFFFFFE0C4        47E08000                        lw              r1,[sp]         ; restore LOPVAR, but zero means no more
4829
FFFFFFFFFFFFE0C8        660090A8                        sw              r1,LOPVAR
4830
FFFFFFFFFFFFE0CC        BE100148                        beq             r1,r0,PP1
4831
FFFFFFFFFFFFE0D0        47E08020                        lw              r1,32[sp]       ; if not zero, restore the rest
4832
FFFFFFFFFFFFE0D4        660090C8                        sw              r1,LOPPT
4833
FFFFFFFFFFFFE0D8        47E08018                        lw              r1,24[sp]
4834
FFFFFFFFFFFFE0DC        660090C0                        sw              r1,LOPLN
4835
FFFFFFFFFFFFE0E0        47E08010                        lw              r1,16[sp]
4836
FFFFFFFFFFFFE0E4        660090B8                        sw              r1,LOPLMT
4837
FFFFFFFFFFFFE0E8        47E08008                        lw              r1,8[sp]
4838
FFFFFFFFFFFFE0EC        660090B0                        sw              r1,LOPINC
4839
FFFFFFFFFFFFE0F0        37EF8028                        ret             #40
4840
FFFFFFFFFFFFE0F4                                 PP1:
4841
FFFFFFFFFFFFE0F4        37EF8008                        ret             #8
4842
 
4843
 
4844
FFFFFFFFFFFFE0F8                                 PUSHA:
4845
FFFFFFFFFFFFE0F8        460090F8                        lw              r1,STKBOT       ; Are we running out of stack room?
4846
FFFFFFFFFFFFE0FC        0A108028                        addui   r1,r1,#40       ; we might need this many bytes
4847
FFFFFFFFFFFFE100        BFE0F0A4                        bltu    sp,r1,QSORRY    ; out of stack space
4848
FFFFFFFFFFFFE104        460090A8                        lw              r1,LOPVAR       ; save loop variables
4849
FFFFFFFFFFFFE108        BE100188                        beq             r1,r0,PU1       ; if LOPVAR is zero, that's all
4850
FFFFFFFFFFFFE10C        0FEF0028                        subui   sp,sp,#40
4851
FFFFFFFFFFFFE110        67E08000                        sw              r1,[sp]
4852
FFFFFFFFFFFFE114        460090C8                        lw              r1,LOPPT
4853
FFFFFFFFFFFFE118        67E08020                        sw              r1,32[sp]       ; else save all the others
4854
FFFFFFFFFFFFE11C        460090C0                        lw              r1,LOPLN
4855
FFFFFFFFFFFFE120        67E08018                        sw              r1,24[sp]
4856
FFFFFFFFFFFFE124        460090B8                        lw              r1,LOPLMT
4857
FFFFFFFFFFFFE128        67E08010                        sw              r1,16[sp]
4858
FFFFFFFFFFFFE12C        460090B0                        lw              r1,LOPINC
4859
FFFFFFFFFFFFE130        67E08008                        sw              r1,8[sp]
4860
FFFFFFFFFFFFE134        37EF8000                        ret
4861
FFFFFFFFFFFFE138                                 PU1:
4862
FFFFFFFFFFFFE138        0FEF0008                        subui   sp,sp,#8
4863
FFFFFFFFFFFFE13C        67E08000                        sw              r1,[sp]
4864
FFFFFFFFFFFFE140        37EF8000                        ret
4865
 
4866
 
4867
                                                 ;******************************************************************
4868
                                                 ;
4869
                                                 ; *** PRTSTG *** QTSTG *** PRTNUM *** PRTLN ***
4870
                                                 ;
4871
                                                 ; 'PRTSTG' prints a string pointed to by r3. It stops printing
4872
                                                 ; and returns to the caller when either a CR is printed or when
4873
                                                 ; the next byte is the same as what was passed in r4 by the
4874
                                                 ; caller.
4875
                                                 ;
4876
                                                 ; 'QTSTG' looks for an underline (back-arrow on some systems),
4877
                                                 ; single-quote, or double-quote.  If none of these are found, returns
4878
                                                 ; to the caller.  If underline, outputs a CR without a LF.  If single
4879
                                                 ; or double quote, prints the quoted string and demands a matching
4880
                                                 ; end quote.  After the printing, the next i-word of the caller is
4881
                                                 ; skipped over (usually a branch instruction).
4882
                                                 ;
4883
                                                 ; 'PRTNUM' prints the 32 bit number in r3, leading blanks are added if
4884
                                                 ; needed to pad the number of spaces to the number in r4.
4885
                                                 ; However, if the number of digits is larger than the no. in
4886
                                                 ; r4, all digits are printed anyway. Negative sign is also
4887
                                                 ; printed and counted in, positive sign is not.
4888
                                                 ;
4889
                                                 ; 'PRTLN' prints the saved text line pointed to by r3
4890
                                                 ; with line no. and all.
4891
                                                 ;
4892
 
4893
                                                 ; r1 = pointer to string
4894
                                                 ; r2 = stop character
4895
                                                 ; return r1 = pointer to end of line + 1
4896
 
4897
FFFFFFFFFFFFE144                                 PRTSTG:
4898
FFFFFFFFFFFFE144        0DEF0020                     sub     sp,sp,#32
4899
FFFFFFFFFFFFE148        67E28000                     sw         r5,[sp]
4900
FFFFFFFFFFFFE14C        67E28008                     sw         r5,8[sp]
4901
FFFFFFFFFFFFE150        67E38010                     sw         r7,16[sp]
4902
FFFFFFFFFFFFE154        67EF8018                     sw         lr,24[sp]
4903
FFFFFFFFFFFFE158        02128009                     mov     r5,r1       ; r5 = pointer
4904
FFFFFFFFFFFFE15C        02230009                     mov     r6,r2       ; r6 = stop char
4905
FFFFFFFFFFFFE160                                 PS1:
4906
FFFFFFFFFFFFE160        4A538000                     lbu     r7,[r5]     ; get a text character
4907
FFFFFFFFFFFFE164        0A528001                     addui   r5,r5,#1
4908
FFFFFFFFFFFFE168        BE7300C8                        beq         r7,r6,PRTRET                ; same as stop character? if so, return
4909
FFFFFFFFFFFFE16C        02708009                        mov     r1,r7
4910
FFFFFFFFFFFFE170        31FFF393                        call    GOOUT           ; display the char.
4911
FFFFFFFFFFFFE174        B27FFB0D                        bnei    r7,#CR,PS1  ; is it a C.R.? no, go back for more
4912
FFFFFFFFFFFFE178        E040000A                        setlo   r1,#LF      ; yes, add a L.F.
4913
FFFFFFFFFFFFE17C        31FFF393                        call    GOOUT
4914
FFFFFFFFFFFFE180                                 PRTRET:
4915
FFFFFFFFFFFFE180        02710009                     mov     r2,r7       ; return r2 = stop char
4916
FFFFFFFFFFFFE184        02508009                        mov             r1,r5           ; return r1 = line pointer
4917
FFFFFFFFFFFFE188        47EF8018                     lw         lr,24[sp]
4918
FFFFFFFFFFFFE18C        47E38010                     lw         r7,16[sp]
4919
FFFFFFFFFFFFE190        47E28008                     lw         r5,8[sp]
4920
FFFFFFFFFFFFE194        47E28000                     lw         r5,[sp]
4921
FFFFFFFFFFFFE198        37EF8020                     ret                #32             ; then return
4922
 
4923
 
4924
FFFFFFFFFFFFE19C                                 QTSTG:
4925
FFFFFFFFFFFFE19C        0FEF0008                        subui   sp,sp,#8
4926
FFFFFFFFFFFFE1A0        67EF8000                        sw              lr,[sp]
4927
FFFFFFFFFFFFE1A4        E0C00022                        setlo   r3,#'"'
4928
FFFFFFFFFFFFE1A8        E13FE1D0                        setlo   r4,#
4929
FFFFFFFFFFFFE1AC        F10FFFFF                        sethi   r4,#>QT3
4930
FFFFFFFFFFFFE1B0        31FFF8F1                        call    TSTC            ; *** QTSTG ***
4931
FFFFFFFFFFFFE1B4        E0800022                        setlo   r2,#'"'         ; it is a "
4932
FFFFFFFFFFFFE1B8                                 QT1:
4933
FFFFFFFFFFFFE1B8        04800409                        or              r1,r8,r0
4934
FFFFFFFFFFFFE1BC        31FFF851                        call    PRTSTG          ; print until another
4935
FFFFFFFFFFFFE1C0        04102009                        lw              r8,r1
4936
FFFFFFFFFFFFE1C4        B2200F0A                        bne             r2,#LF,QT2      ; was last one a CR?
4937
FFFFFFFFFFFFE1C8        0BEF0008                        addui   sp,sp,#8
4938
FFFFFFFFFFFFE1CC        BE00070A                        bra             RUNNXL          ; if so, run next line
4939
FFFFFFFFFFFFE1D0                                 QT3:
4940
FFFFFFFFFFFFE1D0        E0C00027                        setlo   r3,#''''
4941
FFFFFFFFFFFFE1D4        E13FE1E8                        setlo   r4,#
4942
FFFFFFFFFFFFE1D8        F10FFFFF                        sethi   r4,#>QT4
4943
FFFFFFFFFFFFE1DC        31FFF8F1                        call    TSTC            ; is it a single quote?
4944
FFFFFFFFFFFFE1E0        E0800027                        setlo   r2,#''''        ; if so, do same as above
4945
FFFFFFFFFFFFE1E4        BE007EAA                        bra             QT1
4946
FFFFFFFFFFFFE1E8                                 QT4:
4947
FFFFFFFFFFFFE1E8        E0C0005F                        setlo   r3,#'_'
4948
FFFFFFFFFFFFE1EC        E13FE20C                        setlo   r4,#
4949
FFFFFFFFFFFFE1F0        F10FFFFF                        sethi   r4,#>QT5
4950
FFFFFFFFFFFFE1F4        31FFF8F1                        call    TSTC            ; is it an underline?
4951
FFFFFFFFFFFFE1F8        E040000D                        setlo   r1,#CR          ; if so, output a CR without LF
4952
FFFFFFFFFFFFE1FC        31FFF393                        call    GOOUT
4953
FFFFFFFFFFFFE200                                 QT2:
4954
FFFFFFFFFFFFE200        47EF8000                        lw              lr,[sp]
4955
FFFFFFFFFFFFE204        0BEF0008                        addui   sp,sp,#8
4956
FFFFFFFFFFFFE208        35F00004                        jal             r0,4[lr]                ; skip over next i-word when returning
4957
FFFFFFFFFFFFE20C                                 QT5:                                           ; not " ' or _
4958
FFFFFFFFFFFFE20C        47EF8000                        lw              lr,[sp]
4959
FFFFFFFFFFFFE210        37EF8008                        ret             #8
4960
 
4961
 
4962
                                                 ; Output a CR LF sequence
4963
                                                 ;
4964
FFFFFFFFFFFFE214                                 prCRLF:
4965
FFFFFFFFFFFFE214        0FEF0008                        subui   sp,sp,#8
4966
FFFFFFFFFFFFE218        67EF8000                        sw              lr,[sp]
4967
FFFFFFFFFFFFE21C        E040000D                        setlo   r1,#CR
4968
FFFFFFFFFFFFE220        31FFF393                        call    GOOUT
4969
FFFFFFFFFFFFE224        E040000A                        setlo   r1,#LF
4970
FFFFFFFFFFFFE228        31FFF393                        call    GOOUT
4971
FFFFFFFFFFFFE22C        47EF8000                        lw              lr,[sp]
4972
FFFFFFFFFFFFE230        37EF8008                        ret             #8
4973
 
4974
 
4975
                                                 ; r1 = number to print
4976
                                                 ; r2 = number of digits
4977
                                                 ; Register Usage
4978
                                                 ;      r5 = number of padding spaces
4979
FFFFFFFFFFFFE234                                 PRTNUM:
4980
FFFFFFFFFFFFE234        0FEF0028                        subui   sp,sp,#40
4981
FFFFFFFFFFFFE238        67E18000                        sw              r3,[sp]
4982
FFFFFFFFFFFFE23C        67E28008                        sw              r5,8[sp]
4983
FFFFFFFFFFFFE240        67E30010                        sw              r6,16[sp]
4984
FFFFFFFFFFFFE244        67E38018                        sw              r7,24[sp]
4985
FFFFFFFFFFFFE248        67EF8020                        sw              lr,32[sp]
4986
FFFFFFFFFFFFE24C        16039100                        ori             r7,r0,#NUMWKA   ; r7 = pointer to numeric work area
4987
FFFFFFFFFFFFE250        02130009                        mov             r6,r1           ; save number for later
4988
FFFFFFFFFFFFE254        02228009                        mov             r5,r2           ; r5 = min number of chars
4989
FFFFFFFFFFFFE258        BE100063                        bgt             r1,r0,PN1       ; is it negative? if not
4990
FFFFFFFFFFFFE25C        02108006                        neg             r1,r1           ; else make it positive
4991
FFFFFFFFFFFFE260        0E528001                        subui   r5,r5,#1        ; one less for width count
4992
FFFFFFFFFFFFE264                                 PN1:
4993
FFFFFFFFFFFFE264        1601800A                        lw              r3,#10
4994
FFFFFFFFFFFFE268        0411881C                        mod             r2,r1,r3        ; r2 = r1 mod 10
4995
FFFFFFFFFFFFE26C        1C10800A                        divui   r1,r1,#10       ; r1 /= 10 divide by 10
4996
FFFFFFFFFFFFE270        0A210030                        addui   r2,r2,#'0'      ; convert remainder to ascii
4997
FFFFFFFFFFFFE274        60710000                        sb              r2,[r7]         ; and store in buffer
4998
FFFFFFFFFFFFE278        0A738001                        addui   r7,r7,#1
4999
FFFFFFFFFFFFE27C        0E528001                        subui   r5,r5,#1        ; decrement width
5000
FFFFFFFFFFFFE280        BE107F29                        bne             r1,r0,PN1
5001
FFFFFFFFFFFFE284                                 PN6:
5002
FFFFFFFFFFFFE284        BE500082                        ble             r5,r0,PN4       ; test pad count, skip padding if not needed
5003
FFFFFFFFFFFFE288                                 PN3:
5004
FFFFFFFFFFFFE288        E0400020                        setlo   r1,#' '         ; display the required leading spaces
5005
FFFFFFFFFFFFE28C        31FFF393                        call    GOOUT
5006
FFFFFFFFFFFFE290        BE02FFCF                        loop    r5,PN3
5007
FFFFFFFFFFFFE294                                 PN4:
5008
FFFFFFFFFFFFE294        BE600063                        bgt             r6,r0,PN5       ; is number negative?
5009
FFFFFFFFFFFFE298        E040002D                        setlo   r1,#'-'         ; if so, display the sign
5010
FFFFFFFFFFFFE29C        31FFF393                        call    GOOUT
5011
FFFFFFFFFFFFE2A0                                 PN5:
5012
FFFFFFFFFFFFE2A0        0E738001                        subui   r7,r7,#1
5013
FFFFFFFFFFFFE2A4        40708000                        lb              r1,[r7]         ; now unstack the digits and display
5014
FFFFFFFFFFFFE2A8        31FFF393                        call    GOOUT
5015
FFFFFFFFFFFFE2AC        12709100                        cmpui   r1,r7,#NUMWKA
5016
FFFFFFFFFFFFE2B0        BE107F87                        bgtu    r1,r0,PN5
5017
FFFFFFFFFFFFE2B4                                 PNRET:
5018
FFFFFFFFFFFFE2B4        47EF8020                        lw              lr,32[sp]
5019
FFFFFFFFFFFFE2B8        47E38018                        lw              r7,24[sp]
5020
FFFFFFFFFFFFE2BC        47E30010                        lw              r6,16[sp]
5021
FFFFFFFFFFFFE2C0        47E28008                        lw              r5,8[sp]
5022
FFFFFFFFFFFFE2C4        47E18000                        lw              r3,[sp]
5023
FFFFFFFFFFFFE2C8        37EF8028                        ret             #40
5024
 
5025
 
5026
                                                 ; r1 = number to print
5027
                                                 ; r2 = number of digits
5028
FFFFFFFFFFFFE2CC                                 PRTHEXNUM:
5029
FFFFFFFFFFFFE2CC        0FEF0028                        subui   sp,sp,#40
5030
FFFFFFFFFFFFE2D0        67E28000                        sw              r5,[sp]
5031
FFFFFFFFFFFFE2D4        67E30008                        sw              r6,8[sp]
5032
FFFFFFFFFFFFE2D8        67E38010                        sw              r7,16[sp]
5033
FFFFFFFFFFFFE2DC        67E40018                        sw              r8,24[sp]
5034
FFFFFFFFFFFFE2E0        67EF8020                        sw              lr,32[sp]
5035
FFFFFFFFFFFFE2E4        E1C01100                        setlo   r7,#
5036
FFFFFFFFFFFFE2E8        F1C00000                        sethi   r7,#>NUMWKA
5037
FFFFFFFFFFFFE2EC        04101809                        or              r6,r1,r0        ; save number for later
5038
FFFFFFFFFFFFE2F0        E1400014                        setlo   r5,#20          ; r5 = min number of chars
5039
FFFFFFFFFFFFE2F4        04101009                        or              r4,r1,r0
5040
FFFFFFFFFFFFE2F8        BE400083                        bgt             r4,r0,PHN1              ; is it negative? if not
5041
FFFFFFFFFFFFE2FC        02420006                        neg             r4,r4                   ; else make it positive
5042
FFFFFFFFFFFFE300        0C528001                        sub             r5,r5,#1        ; one less for width count
5043
FFFFFFFFFFFFE304        E2000014                        setlo   r8,#20          ; maximum of 10 digits
5044
FFFFFFFFFFFFE308                                 PHN1:
5045
FFFFFFFFFFFFE308        04400409                        or              r1,r4,r0
5046
FFFFFFFFFFFFE30C        1410800F                        andi    r1,r1,#15
5047
FFFFFFFFFFFFE310        A010030A                        blt             r1,#10,PHN7
5048
FFFFFFFFFFFFE314        0A108037                        addui   r1,r1,#'A'-10
5049
FFFFFFFFFFFFE318        BE00004A                        bra             PHN8
5050
FFFFFFFFFFFFE31C                                 PHN7:
5051
FFFFFFFFFFFFE31C        08108030                        add             r1,r1,#'0'              ; convert remainder to ascii
5052
FFFFFFFFFFFFE320                                 PHN8:
5053
FFFFFFFFFFFFE320        60708000                        sb              r1,[r7]         ; and store in buffer
5054
FFFFFFFFFFFFE324        08738001                        add             r7,r7,#1
5055
FFFFFFFFFFFFE328        0C528001                        sub             r5,r5,#1        ; decrement width
5056
FFFFFFFFFFFFE32C                                        shru    r4,r4,#4
5057
FFFFFFFFFFFFE32C        BE400048                        beq             r4,r0,PHN6                      ; is it zero yet ?
5058
FFFFFFFFFFFFE330        BE047ECF                        loop    r8,PHN1         ; safety
5059
FFFFFFFFFFFFE334                                 PHN6:  ; test pad count
5060
FFFFFFFFFFFFE334        BE500082                        ble             r5,r0,PHN4      ; skip padding if not needed
5061
FFFFFFFFFFFFE338                                 PHN3:
5062
FFFFFFFFFFFFE338        E0400020                        setlo   r1,#' '         ; display the required leading spaces
5063
FFFFFFFFFFFFE33C        31FFF393                        call    GOOUT
5064
FFFFFFFFFFFFE340        BE02FFCF                        loop    r5,PHN3
5065
FFFFFFFFFFFFE344                                 PHN4:
5066
FFFFFFFFFFFFE344        BE600063                        bgt             r6,r0,PHN5      ; is number negative?
5067
FFFFFFFFFFFFE348        E040002D                        setlo   r1,#'-'         ; if so, display the sign
5068
FFFFFFFFFFFFE34C        31FFF393                        call    GOOUT
5069
FFFFFFFFFFFFE350                                 PHN5:
5070
FFFFFFFFFFFFE350        0C738001                        sub             r7,r7,#1
5071
FFFFFFFFFFFFE354        40708000                        lb              r1,[r7]         ; now unstack the digits and display
5072
FFFFFFFFFFFFE358        31FFF393                        call    GOOUT
5073
FFFFFFFFFFFFE35C        12709100                        cmpui   r1,r7,#NUMWKA
5074
FFFFFFFFFFFFE360        BE107F83                        bgt             r1,r0,PHN5
5075
FFFFFFFFFFFFE364                                 PHNRET:
5076
FFFFFFFFFFFFE364        47EF8020                        lw              lr,32[sp]
5077
FFFFFFFFFFFFE368        47E40018                        lw              r8,24[sp]
5078
FFFFFFFFFFFFE36C        47E38010                        lw              r7,16[sp]
5079
FFFFFFFFFFFFE370        47E30008                        lw              r6,8[sp]
5080
FFFFFFFFFFFFE374        47E28000                        lw              r5,[sp]
5081
FFFFFFFFFFFFE378        37EF8028                        ret             #40
5082
 
5083
 
5084
                                                 ; r1 = pointer to line
5085
                                                 ; returns r1 = pointer to end of line + 1
5086
FFFFFFFFFFFFE37C                                 PRTLN:
5087
FFFFFFFFFFFFE37C        0FEF0010                     subui   sp,sp,#16
5088
FFFFFFFFFFFFE380        67E28000                     sw         r5,[sp]
5089
FFFFFFFFFFFFE384        67EF8008                     sw         lr,8[sp]
5090
FFFFFFFFFFFFE388        08128002                     addi    r5,r1,#2
5091
FFFFFFFFFFFFE38C        4A50FFFE                     lbu                r1,-2[r5]       ; get the binary line number
5092
FFFFFFFFFFFFE390        4A517FFF                     lbu                r2,-1[r5]
5093
FFFFFFFFFFFFE394        06211000                     shli       r2,r2,#8
5094
FFFFFFFFFFFFE398        04110409                     or         r1,r1,r2
5095
FFFFFFFFFFFFE39C        E0800000                     setlo   r2,#0       ; display a 0 or more digit line no.
5096
FFFFFFFFFFFFE3A0        31FFF88D                        call    PRTNUM
5097
FFFFFFFFFFFFE3A4        E0400020                        setlo   r1,#' '     ; followed by a blank
5098
FFFFFFFFFFFFE3A8        31FFF393                        call    GOOUT
5099
FFFFFFFFFFFFE3AC        E0800000                        setlo   r2,#0       ; stop char. is a zero
5100
FFFFFFFFFFFFE3B0        04500409                        or      r1,r5,r0
5101
FFFFFFFFFFFFE3B4        31FFF851                        call    PRTSTG          ; display the rest of the line
5102
FFFFFFFFFFFFE3B8        47EF8008                        lw              lr,8[sp]
5103
FFFFFFFFFFFFE3BC        47E28000                        lw              r5,[sp]
5104
FFFFFFFFFFFFE3C0        37EF8010                        ret             #16
5105
 
5106
 
5107
                                                 ; ===== Test text byte following the call to this subroutine. If it
5108
                                                 ;      equals the byte pointed to by r8, return to the code following
5109
                                                 ;      the call. If they are not equal, brnch to the point
5110
                                                 ;      indicated in r4.
5111
                                                 ;
5112
                                                 ; Registers Affected
5113
                                                 ;   r3,r8
5114
                                                 ; Returns
5115
                                                 ;      r8 = updated text pointer
5116
                                                 ;
5117
FFFFFFFFFFFFE3C4                                 TSTC
5118
FFFFFFFFFFFFE3C4        0FEF0010                        subui   sp,sp,#16
5119
FFFFFFFFFFFFE3C8        67EF8000                        sw              lr,[sp]
5120
FFFFFFFFFFFFE3CC        67E08008                        sw              r1,8[sp]
5121
FFFFFFFFFFFFE3D0        31FFF914                        call    IGNBLK          ; ignore leading blanks
5122
FFFFFFFFFFFFE3D4        40808000                        lb              r1,[r8]
5123
FFFFFFFFFFFFE3D8        BE3080A8                        beq             r3,r1,TC1       ; is it = to what r8 points to? if so
5124
FFFFFFFFFFFFE3DC        47E08008                        lw              r1,8[sp]
5125
FFFFFFFFFFFFE3E0        47EF8000                        lw              lr,[sp]
5126
FFFFFFFFFFFFE3E4        0BEF0010                        addui   sp,sp,#16
5127
FFFFFFFFFFFFE3E8        34400000                        jal             r0,[r4]         ; jump to the routine
5128
FFFFFFFFFFFFE3EC                                 TC1:
5129
FFFFFFFFFFFFE3EC        08840001                        add             r8,r8,#1        ; if equal, bump text pointer
5130
FFFFFFFFFFFFE3F0        47E08008                        lw              r1,8[sp]
5131
FFFFFFFFFFFFE3F4        47EF8000                        lw              lr,[sp]
5132
FFFFFFFFFFFFE3F8        37EF8010                        ret             #16
5133
 
5134
                                                 ; ===== See if the text pointed to by r8 is a number. If so,
5135
                                                 ;      return the number in r2 and the number of digits in r3,
5136
                                                 ;      else return zero in r2 and r3.
5137
                                                 ; Registers Affected
5138
                                                 ;   r1,r2,r3,r4
5139
                                                 ; Returns
5140
                                                 ;      r1 = number
5141
                                                 ;      r2 = number of digits in number
5142
                                                 ;      r8 = updated text pointer
5143
                                                 ;
5144
FFFFFFFFFFFFE3FC                                 TSTNUM:
5145
FFFFFFFFFFFFE3FC        0FEF0008                        subui   sp,sp,#8
5146
FFFFFFFFFFFFE400        67EF8000                        sw              lr,[sp]
5147
FFFFFFFFFFFFE404        31FFF914                        call    IGNBLK          ; skip over blanks
5148
FFFFFFFFFFFFE408        E0400000                        setlo   r1,#0           ; initialize return parameters
5149
FFFFFFFFFFFFE40C        E0800000                        setlo   r2,#0
5150
FFFFFFFFFFFFE410                                 TN1:
5151
FFFFFFFFFFFFE410        40818000                        lb              r3,[r8]
5152
FFFFFFFFFFFFE414        A8300D30                        bltui   r3,#'0',TSNMRET ; is it less than zero?
5153
FFFFFFFFFFFFE418        AE300C39                        bgtui   r3,#'9',TSNMRET ; is it greater than nine?
5154
FFFFFFFFFFFFE41C        E13FFFFF                        setlo   r4,#0xFFFFFFFF
5155
FFFFFFFFFFFFE420        F10FFFFF                        sethi   r4,#0x07FFFFFF
5156
FFFFFFFFFFFFE424        BE120066                        bleu    r1,r4,TN2       ; see if there's room for new digit
5157
FFFFFFFFFFFFE428        E07FE629                        setlo   r1,msgNumTooBig
5158
FFFFFFFFFFFFE42C        BE0057AA                        bra             ERROR           ; if not, we've overflowd
5159
FFFFFFFFFFFFE430                                 TN2:
5160
FFFFFFFFFFFFE430        1A10800A                        mului   r1,r1,#10       ; quickly multiply result by 10
5161
FFFFFFFFFFFFE434        08840001                        addi    r8,r8,#1        ; adjust text pointer
5162
FFFFFFFFFFFFE438        1431800F                        andi    r3,r3,#0x0F     ; add in the new digit
5163
FFFFFFFFFFFFE43C        04118402                        add             r1,r1,r3
5164
FFFFFFFFFFFFE440        08210001                        addi    r2,r2,#1        ; increment the no. of digits
5165
FFFFFFFFFFFFE444        BE007E6A                        bra             TN1
5166
FFFFFFFFFFFFE448                                 TSNMRET:
5167
FFFFFFFFFFFFE448        47EF8000                        lw              lr,[sp]
5168
FFFFFFFFFFFFE44C        37EF8008                        ret             #8
5169
 
5170
 
5171
                                                 ;===== Skip over blanks in the text pointed to by r8.
5172
                                                 ;
5173
                                                 ; Registers Affected:
5174
                                                 ;      r8
5175
                                                 ; Returns
5176
                                                 ;      r8 = pointer updateded past any spaces or tabs
5177
                                                 ;
5178
FFFFFFFFFFFFE450                                 IGNBLK:
5179
FFFFFFFFFFFFE450        0FEF0008                        subui   sp,sp,#8
5180
FFFFFFFFFFFFE454        67E08000                        sw              r1,[sp]
5181
FFFFFFFFFFFFE458                                 IGB2:
5182
FFFFFFFFFFFFE458        40808000                        lb              r1,[r8]                 ; get char
5183
FFFFFFFFFFFFE45C        B0100220                        beqi    r1,#' ',IGB1    ; see if it's a space
5184
FFFFFFFFFFFFE460        B2100300                        bnei    r1,#'\t',IGBRET ; or a tab
5185
FFFFFFFFFFFFE464                                 IGB1:
5186
FFFFFFFFFFFFE464        08840001                        add             r8,r8,#1                ; increment the text pointer
5187
FFFFFFFFFFFFE468        BE007F8A                        bra             IGB2
5188
FFFFFFFFFFFFE46C                                 IGBRET:
5189
FFFFFFFFFFFFE46C        47E08000                        lw              r1,[sp]
5190
FFFFFFFFFFFFE470        37EF8008                        ret             #8
5191
 
5192
 
5193
                                                 ; ===== Convert the line of text in the input buffer to upper
5194
                                                 ;      case (except for stuff between quotes).
5195
                                                 ;
5196
                                                 ; Registers Affected
5197
                                                 ;   r1,r3
5198
                                                 ; Returns
5199
                                                 ;      r8 = pointing to end of text in buffer
5200
                                                 ;
5201
FFFFFFFFFFFFE474                                 TOUPBUF:
5202
FFFFFFFFFFFFE474        0FEF0008                        subui   sp,sp,#8
5203
FFFFFFFFFFFFE478        67EF8000                        sw              lr,[sp]
5204
FFFFFFFFFFFFE47C        E200111B                        setlo   r8,BUFFER       ; set up text pointer
5205
FFFFFFFFFFFFE480        E0C00000                        setlo   r3,#0           ; clear quote flag
5206
FFFFFFFFFFFFE484                                 TOUPB1:
5207
FFFFFFFFFFFFE484        40808000                        lb              r1,[r8]         ; get the next text char.
5208
FFFFFFFFFFFFE488        08840001                        add             r8,r8,#1
5209
FFFFFFFFFFFFE48C        B0100D0D                        beqi    r1,#CR,TOUPBRT          ; is it end of line?
5210
FFFFFFFFFFFFE490        B0100622                        beqi    r1,#'"',DOQUO   ; a double quote?
5211
FFFFFFFFFFFFE494        B0100527                        beqi    r1,#'''',DOQUO  ; or a single quote?
5212
FFFFFFFFFFFFE498        BE307F69                        bne             r3,r0,TOUPB1    ; inside quotes?
5213
FFFFFFFFFFFFE49C        31FFF932                        call    toUpper         ; convert to upper case
5214
FFFFFFFFFFFFE4A0        6080FFFF                        sb              r1,-1[r8]       ; store it
5215
FFFFFFFFFFFFE4A4        BE007F0A                        bra             TOUPB1          ; and go back for more
5216
FFFFFFFFFFFFE4A8                                 DOQUO:
5217
FFFFFFFFFFFFE4A8        BE300069                        bne             r3,r0,DOQUO1; are we inside quotes?
5218
FFFFFFFFFFFFE4AC        04100C09                        or              r3,r1,r0        ; if not, toggle inside-quotes flag
5219
FFFFFFFFFFFFE4B0        BE007EAA                        bra             TOUPB1
5220
FFFFFFFFFFFFE4B4                                 DOQUO1:
5221
FFFFFFFFFFFFE4B4        BE30FE89                        bne             r3,r1,TOUPB1            ; make sure we're ending proper quote
5222
FFFFFFFFFFFFE4B8        E0C00000                        setlo   r3,#0           ; else clear quote flag
5223
FFFFFFFFFFFFE4BC        BE007E4A                        bra             TOUPB1
5224
FFFFFFFFFFFFE4C0                                 TOUPBRT:
5225
FFFFFFFFFFFFE4C0        47EF8000                        lw              lr,[sp]
5226
FFFFFFFFFFFFE4C4        37EF8008                        ret             #8
5227
 
5228
 
5229
                                                 ; ===== Convert the character in r1 to upper case
5230
                                                 ;
5231
FFFFFFFFFFFFE4C8                                 toUpper
5232
FFFFFFFFFFFFE4C8        A0100361                        blt             r1,#'a',TOUPRET ; is it < 'a'?
5233
FFFFFFFFFFFFE4CC        A610027A                        bgt             r1,#'z',TOUPRET ; or > 'z'?
5234
FFFFFFFFFFFFE4D0        0C108020                        sub             r1,r1,#32       ; if not, make it upper case
5235
FFFFFFFFFFFFE4D4                                 TOUPRET
5236
FFFFFFFFFFFFE4D4        37EF8000                        ret
5237
 
5238
 
5239
                                                 ; 'CHKIO' checks the input. If there's no input, it will return
5240
                                                 ; to the caller with the r1=0. If there is input, the input byte is in r1.
5241
                                                 ; However, if a control-C is read, 'CHKIO' will warm-start BASIC and will
5242
                                                 ; not return to the caller.
5243
                                                 ;
5244
FFFFFFFFFFFFE4D8                                 CHKIO:
5245
FFFFFFFFFFFFE4D8        0FEF0008                        subui   sp,sp,#8        ; save link reg
5246
FFFFFFFFFFFFE4DC        67EF8000                        sw              lr,[sp]
5247
FFFFFFFFFFFFE4E0        31FFF394                        call    GOIN            ; get input if possible
5248
FFFFFFFFFFFFE4E4        B01003FF                        beq             r1,#-1,CHKRET2          ; if Zero, no input
5249
FFFFFFFFFFFFE4E8        B2100303                        bnei    r1,#CTRLC,CHKRET        ; is it control-C?
5250
FFFFFFFFFFFFE4EC        33FFF3BE                        jmp             WSTART          ; if so, do a warm start
5251
FFFFFFFFFFFFE4F0                                 CHKRET2:
5252
FFFFFFFFFFFFE4F0        0410840A                        xor             r1,r1,r1
5253
FFFFFFFFFFFFE4F4                                 CHKRET:
5254
FFFFFFFFFFFFE4F4        47EF8000                        lw              lr,[sp]         ;r1=0
5255
FFFFFFFFFFFFE4F8        37EF8008                        ret             #8
5256
 
5257
 
5258
                                                 ; ===== Display a CR-LF sequence
5259
                                                 ;
5260
FFFFFFFFFFFFE4FC                                 CRLF:
5261
FFFFFFFFFFFFE4FC        E07FE60B                        setlo   r1,CLMSG
5262
 
5263
 
5264
                                                 ; ===== Display a zero-ended string pointed to by register r1
5265
                                                 ; Registers Affected
5266
                                                 ;   r1,r2,r4
5267
                                                 ;
5268
FFFFFFFFFFFFE500                                 PRMESG:
5269
FFFFFFFFFFFFE500        0FEF0010                        subui   sp,sp,#16
5270
FFFFFFFFFFFFE504        67E28000                        sw              r5,[sp]
5271
FFFFFFFFFFFFE508        67EF8008                        sw              lr,8[sp]
5272
FFFFFFFFFFFFE50C        02128009                        mov     r5,r1       ; r5 = pointer to message
5273
FFFFFFFFFFFFE510                                 PRMESG1:
5274
FFFFFFFFFFFFE510        08528001                        add             r5,r5,#1
5275
FFFFFFFFFFFFE514        4050FFFF                        lb              r1,-1[r5]       ;       get the char.
5276
FFFFFFFFFFFFE518        BE100068                        beq             r1,r0,PRMRET
5277
FFFFFFFFFFFFE51C        31FFF393                        call    GOOUT           ;else display it trashes r4
5278
FFFFFFFFFFFFE520        BE007F8A                        bra             PRMESG1
5279
FFFFFFFFFFFFE524                                 PRMRET:
5280
FFFFFFFFFFFFE524        02508009                        mov             r1,r5
5281
FFFFFFFFFFFFE528        47EF8008                        lw              lr,8[sp]
5282
FFFFFFFFFFFFE52C        47E28000                        lw              r5,[sp]
5283
FFFFFFFFFFFFE530        37EF8010                        ret             #16
5284
 
5285
 
5286
                                                 ; ===== Display a zero-ended string pointed to by register r1
5287
                                                 ; Registers Affected
5288
                                                 ;   r1,r2,r3
5289
                                                 ;
5290
FFFFFFFFFFFFE534                                 PRMESGAUX:
5291
FFFFFFFFFFFFE534        0FEF0010                        subui   sp,sp,#16
5292
FFFFFFFFFFFFE538        67E28000                        sw              r5,[sp]
5293
FFFFFFFFFFFFE53C        67EF8008                        sw              lr,8[sp]
5294
FFFFFFFFFFFFE540        02128009                        mov     r5,r1       ; r3 = pointer
5295
FFFFFFFFFFFFE544                                 PRMESGA1:
5296
FFFFFFFFFFFFE544        0A528001                        addui   r5,r5,#1
5297
FFFFFFFFFFFFE548        4050FFFF                        lb              r1,-1[r5]       ;       get the char.
5298
FFFFFFFFFFFFE54C        BE100068                        beq             r1,r0,PRMRETA
5299
FFFFFFFFFFFFE550        31FFF395                        call    GOAUXO          ;else display it
5300
FFFFFFFFFFFFE554        BE007F8A                        bra             PRMESGA1
5301
FFFFFFFFFFFFE558                                 PRMRETA:
5302
FFFFFFFFFFFFE558        02508009                        mov             r1,r5
5303
FFFFFFFFFFFFE55C        47EF8008                        lw              lr,8[sp]
5304
FFFFFFFFFFFFE560        47E28000                        lw              r5,[sp]
5305
FFFFFFFFFFFFE564        37EF8010                        ret             #16
5306
 
5307
                                                 ;*****************************************************
5308
                                                 ; The following routines are the only ones that need *
5309
                                                 ; to be changed for a different I/O environment.     *
5310
                                                 ;*****************************************************
5311
 
5312
 
5313
                                                 ; ===== Output character to the console (Port 1) from register r1
5314
                                                 ;      (Preserves all registers.)
5315
                                                 ;
5316
FFFFFFFFFFFFE568                                 OUTC:
5317
FFFFFFFFFFFFE568        33FFEF47                        jmp             DisplayChar
5318
 
5319
 
5320
                                                 ; ===== Input a character from the console into register D0 (or
5321
                                                 ;      return Zero status if there's no character available).
5322
                                                 ;
5323
FFFFFFFFFFFFE56C                                 INC:
5324
FFFFFFFFFFFFE56C        33FFEE08                        jmp             KeybdGetChar
5325
 
5326
 
5327
                                                 ;*
5328
                                                 ;* ===== Input a character from the host into register r1 (or
5329 27 robfinch
                                                 ;*     return Zero status if there's no character available).
5330
                                                 ;*
5331 43 robfinch
FFFFFFFFFFFFE570                                 AUXIN:
5332
FFFFFFFFFFFFE570        31FFED54                        call    SerialGetChar
5333
FFFFFFFFFFFFE574        B01003FF                        beqi    r1,#-1,AXIRET_ZERO
5334
FFFFFFFFFFFFE578        1410807F                        andi    r1,r1,#0x7f             ;zero out the high bit
5335
FFFFFFFFFFFFE57C                                 AXIRET:
5336
FFFFFFFFFFFFE57C        37EF8000                        ret
5337
FFFFFFFFFFFFE580                                 AXIRET_ZERO:
5338
FFFFFFFFFFFFE580        0410840A                        xor             r1,r1,r1
5339
FFFFFFFFFFFFE584        37EF8000                        ret
5340 27 robfinch
 
5341 43 robfinch
                                                 ; ===== Output character to the host (Port 2) from register r1
5342
                                                 ;      (Preserves all registers.)
5343
                                                 ;
5344
FFFFFFFFFFFFE588                                 AUXOUT
5345
FFFFFFFFFFFFE588        33FFED0C                        jmp             SerialPutChar   ; call boot rom routine
5346
 
5347
 
5348
FFFFFFFFFFFFE58C                                 _cls
5349
FFFFFFFFFFFFE58C        31FFEED9                        call    clearScreen
5350
FFFFFFFFFFFFE590        BE00740A                        bra             FINISH
5351
 
5352
FFFFFFFFFFFFE594                                 _wait10
5353
FFFFFFFFFFFFE594        37EF8000                        ret
5354
FFFFFFFFFFFFE598                                 _getATAStatus
5355
FFFFFFFFFFFFE598        37EF8000                        ret
5356
FFFFFFFFFFFFE59C                                 _waitCFNotBusy
5357
FFFFFFFFFFFFE59C        37EF8000                        ret
5358
FFFFFFFFFFFFE5A0                                 _rdcf
5359
FFFFFFFFFFFFE5A0        BE00738A                        br              FINISH
5360
FFFFFFFFFFFFE5A4                                 rdcf6
5361
FFFFFFFFFFFFE5A4        BE004BEA                        br              ERROR
5362
 
5363
 
5364
                                                 ; ===== Return to the resident monitor, operating system, etc.
5365
                                                 ;
5366
FFFFFFFFFFFFE5A8                                 BYEBYE:
5367
FFFFFFFFFFFFE5A8        460F1088                        lw              sp,OSSP
5368
FFFFFFFFFFFFE5AC        47EF8000                     lw      lr,[sp]
5369
FFFFFFFFFFFFE5B0        37EF8008                        ret             #8
5370
 
5371
                                                 ;      MOVE.B  #228,D7         return to Tutor
5372
                                                 ;      TRAP    #14
5373
 
5374
FFFFFFFFFFFFE5B0 C44E4100BCBD3CBD               .align  16
5375
FFFFFFFFFFFFE5B8 0000000000D24F00
5376
FFFFFFFFFFFFE5C0                                        .align  16
5377
FFFFFFFFFFFFE5C0 726F747061520A0D        msgInit db     CR,LF,"Raptor64 Tiny BASIC v1.0",CR,LF,"(C) 2012  Robert Finch",CR,LF,LF,0
5378
FFFFFFFFFFFFE5C8 20796E6954203436
5379
FFFFFFFFFFFFE5D0 3176204349534142
5380
FFFFFFFFFFFFE5D8 202943280A0D302E
5381
FFFFFFFFFFFFE5E0 6F52202032313032
5382
FFFFFFFFFFFFE5E8 6E69462074726562
5383
FFFFFFFFFFFFE5F0 0A0D000A0A0D6863        OKMSG  db      CR,LF,"OK",CR,LF,0
5384
FFFFFFFFFFFFE5F8 616857000A0D4B4F        msgWhat        db      "What?",CR,LF,0
5385
FFFFFFFFFFFFE600 726F53000A0D3F74        SRYMSG db      "Sorry."
5386
FFFFFFFFFFFFE608 6F43000A0D2E7972        msgReadError   db      "Compact FLASH read error",CR,LF,0
5387
FFFFFFFFFFFFE610 4C4620746361706D
5388
FFFFFFFFFFFFE618 6461657220485341
5389
FFFFFFFFFFFFE620 0A0D726F72726520
5390
FFFFFFFFFFFFE628 207265626D754E00        msgNumTooBig   db      "Number is too big",CR,LF,0
5391
FFFFFFFFFFFFE630 62206F6F74207369
5392
FFFFFFFFFFFFE638 766944000A0D6769        msgDivZero             db      "Division by zero",CR,LF,0
5393
FFFFFFFFFFFFE640 7962206E6F697369
5394
FFFFFFFFFFFFE648 000A0D6F72657A20
5395
FFFFFFFFFFFFE650 7620666F2074754F        msgVarSpace     db  "Out of variable space",CR,LF,0
5396
FFFFFFFFFFFFE658 20656C6261697261
5397
FFFFFFFFFFFFE660 000A0D6563617073
5398
FFFFFFFFFFFFE668 6620736574796220        msgBytesFree   db      " bytes free",CR,LF,0
5399
FFFFFFFFFFFFE670 0A0D000A0D656572        msgReady               db      CR,LF,"Ready",CR,LF,0
5400
FFFFFFFFFFFFE678 000A0D7964616552
5401
FFFFFFFFFFFFE680 6E69746365707845        msgComma               db      "Expecting a comma",CR,LF,0
5402
FFFFFFFFFFFFE688 6D6D6F6320612067
5403
FFFFFFFFFFFFE690 656E694C000A0D61        msgLineRange   db      "Line number too big",CR,LF,0
5404
FFFFFFFFFFFFE698 207265626D756E20
5405
FFFFFFFFFFFFE6A0 0D676962206F6F74
5406
FFFFFFFFFFFFE6A8 746365707845000A        msgVar                 db      "Expecting a variable",CR,LF,0
5407
FFFFFFFFFFFFE6B0 6176206120676E69
5408
FFFFFFFFFFFFE6B8 0A0D656C62616972
5409
FFFFFFFFFFFFE6C0 64616220444E5200        msgRNDBad              db      "RND bad parameter",CR,LF,0
5410
FFFFFFFFFFFFE6C8 74656D6172617020
5411
FFFFFFFFFFFFE6D0 535953000A0D7265        msgSYSBad              db      "SYS bad address",CR,LF,0
5412
FFFFFFFFFFFFE6D8 6464612064616220
5413
FFFFFFFFFFFFE6E0 49000A0D73736572        msgInputVar            db      "INPUT expecting a variable",CR,LF,0
5414
FFFFFFFFFFFFE6E8 707865205455504E
5415
FFFFFFFFFFFFE6F0 6120676E69746365
5416
FFFFFFFFFFFFE6F8 6C62616972617620
5417
FFFFFFFFFFFFE700 5458454E000A0D65        msgNextFor             db      "NEXT without FOR",CR,LF,0
5418
FFFFFFFFFFFFE708 74756F6874697720
5419
FFFFFFFFFFFFE710 4E000A0D524F4620        msgNextVar             db      "NEXT expecting a defined variable",CR,LF,0
5420
FFFFFFFFFFFFE718 6570786520545845
5421
FFFFFFFFFFFFE720 206120676E697463
5422
FFFFFFFFFFFFE728 2064656E69666564
5423
FFFFFFFFFFFFE730 656C626169726176
5424
FFFFFFFFFFFFE738 2F4F544F47000A0D        msgBadGotoGosub        db      "GOTO/GOSUB bad line number",CR,LF,0
5425
FFFFFFFFFFFFE740 6162204255534F47
5426
FFFFFFFFFFFFE748 6E20656E696C2064
5427
FFFFFFFFFFFFE750 000A0D7265626D75
5428
FFFFFFFFFFFFE758 77204E5255544552        msgRetWoGosub   db     "RETURN without GOSUB",CR,LF,0
5429
FFFFFFFFFFFFE760 472074756F687469
5430
FFFFFFFFFFFFE768 50000A0D4255534F        msgTooBig              db      "Program is too big",CR,LF,0
5431
FFFFFFFFFFFFE770 69206D6172676F72
5432
FFFFFFFFFFFFE778 6962206F6F742073
5433
FFFFFFFFFFFFE780 72747845000A0D67        msgExtraChars  db      "Extra characters on line ignored",CR,LF,0
5434
FFFFFFFFFFFFE788 6361726168632061
5435
FFFFFFFFFFFFE790 206E6F2073726574
5436
FFFFFFFFFFFFE798 6E676920656E696C
5437
 
5438
FFFFFFFFFFFFE7A0 00000A0D6465726F               align   8
5439
FFFFFFFFFFFFE7A8                                        align   8
5440
                                                 LSTROM equ     *               ; end of possible ROM area
5441
                                                 ;      END
5442
 
5443 27 robfinch
                                                 ;*
5444
                                                 ;* ===== Return to the resident monitor, operating system, etc.
5445
                                                 ;*
5446 43 robfinch
FFFFFFFFFFFFE7A8                                 BYEBYE:
5447
FFFFFFFFFFFFE7A8        33FFF096                        jmp             Monitor
5448 27 robfinch
                                                 ;    MOVE.B    #228,D7         ;return to Tutor
5449
                                                 ;      TRAP    #14
5450
 
5451
                                                 ;==============================================================================
5452 10 robfinch
                                                 ; Checkerboard RAM tester
5453
                                                 ;==============================================================================
5454
                                                 ;
5455 43 robfinch
FFFFFFFFFFFFE7AC                                        code
5456
FFFFFFFFFFFFE7A8 0000000033FFF096               align   16
5457
FFFFFFFFFFFFE7B0                                        align   16
5458
FFFFFFFFFFFFE7B0                                 ramtest:
5459
FFFFFFFFFFFFE7B0        04002009                        or              r8,r0,r0                ; r8 = 0
5460
FFFFFFFFFFFFE7B4        E6AA5555                ; SETLO
5461
FFFFFFFFFFFFE7B8        EE9556AA                ; SETMID
5462
FFFFFFFFFFFFE7BC        F68AAAA5                ; SETHI
5463
FFFFFFFFFFFFE7C0        040D0409                        ori             r1,r0,#0xAAAA5555AAAA5555       ; checkerboard pattern
5464
FFFFFFFFFFFFE7C4                                 ramtest2:
5465
FFFFFFFFFFFFE7C4        66808000                        sw              r1,[r8]                 ; save the checkerboard to memory
5466
FFFFFFFFFFFFE7C8        46810000                        lw              r2,[r8]                 ; read it back
5467
FFFFFFFFFFFFE7CC        04110C06                        cmp             r3,r1,r2                ; is it the same ?
5468
FFFFFFFFFFFFE7D0        BE3000C9                        bne     r3,r0,ramtest1
5469
FFFFFFFFFFFFE7D4        0A840008                        addui   r8,r8,#8                ; increment RAM pointer
5470
FFFFFFFFFFFFE7D8        E6800000                ; SETLO
5471
FFFFFFFFFFFFE7DC        EE800010                ; SETMID
5472
FFFFFFFFFFFFE7E0        048D0C06                        cmpi    r3,r8,#0x0000_0000_0400_0000
5473
FFFFFFFFFFFFE7E4        BE307F00                        blt             r3,r0,ramtest2
5474
FFFFFFFFFFFFE7E8                                 ramtest1:
5475
FFFFFFFFFFFFE7E8        04802809                        or              r10,r8,r0               ; r10 = max ram address
5476 10 robfinch
                                                        ; readback the checkerboard pattern
5477 43 robfinch
FFFFFFFFFFFFE7EC        04002009                        or              r8,r0,r0                ; r8 = 0
5478
FFFFFFFFFFFFE7F0                                 ramtest4:
5479
FFFFFFFFFFFFE7F0        46810000                        lw              r2,[r8]
5480
FFFFFFFFFFFFE7F4        E6AA5555                ; SETLO
5481
FFFFFFFFFFFFE7F8        EE9556AA                ; SETMID
5482
FFFFFFFFFFFFE7FC        F68AAAA5                ; SETHI
5483
FFFFFFFFFFFFE800        042D0C06                        cmpi    r3,r2,#0xAAAA5555AAAA5555
5484
FFFFFFFFFFFFE804        BE3000C9                        bne             r3,r0,ramtest3
5485
FFFFFFFFFFFFE808        08840008                        addi    r8,r8,#8
5486
FFFFFFFFFFFFE80C        E6800000                ; SETLO
5487
FFFFFFFFFFFFE810        EE800004                ; SETMID
5488
FFFFFFFFFFFFE814        048D0C06                        cmpi    r3,r8,#0x0000_0000_0100_0000
5489
FFFFFFFFFFFFE818        BE307EC0                        blt     r3,r0,ramtest4
5490
FFFFFFFFFFFFE81C                                 ramtest3:
5491
FFFFFFFFFFFFE81C        BE850389                        bne             r8,r10,ramtest8 ; check for equal maximum address
5492 10 robfinch
 
5493
                                                        ; perform ramtest again with inverted checkerboard
5494 43 robfinch
FFFFFFFFFFFFE820        04002009                        or              r8,r0,r0                ; r8 = 0
5495
FFFFFFFFFFFFE824        E695AAAA                ; SETLO
5496
FFFFFFFFFFFFE828        EEAAA955                ; SETMID
5497
FFFFFFFFFFFFE82C        F685555A                ; SETHI
5498
FFFFFFFFFFFFE830        040D0409                        ori             r1,r0,#0x5555AAAA5555AAAA
5499
FFFFFFFFFFFFE834                                 ramtest5:
5500
FFFFFFFFFFFFE834        66808000                        sw              r1,[r8]
5501
FFFFFFFFFFFFE838        46810000                        lw              r2,[r8]
5502
FFFFFFFFFFFFE83C        04110C06                        cmp             r3,r1,r2
5503
FFFFFFFFFFFFE840        BE3000C9                        bne             r3,r0,ramtest6
5504
FFFFFFFFFFFFE844        08840008                        addi    r8,r8,#8
5505
FFFFFFFFFFFFE848        E6800000                ; SETLO
5506
FFFFFFFFFFFFE84C        EE800004                ; SETMID
5507
FFFFFFFFFFFFE850        048D0C06                        cmpi    r3,r8,#0x0000_0000_0100_0000
5508
FFFFFFFFFFFFE854        BE307F00                        blt             r3,r0,ramtest5
5509
FFFFFFFFFFFFE858                                 ramtest6:
5510
FFFFFFFFFFFFE858        04802C09                        or              r11,r8,r0               ; r11 = max ram address
5511 10 robfinch
                                                        ; readback checkerboard
5512 43 robfinch
FFFFFFFFFFFFE85C        04002009                        or              r8,r0,r0
5513
FFFFFFFFFFFFE860                                 ramtest7:
5514
FFFFFFFFFFFFE860        46810000                        lw              r2,[r8]
5515
FFFFFFFFFFFFE864        E695AAAA                ; SETLO
5516
FFFFFFFFFFFFE868        EEAAA955                ; SETMID
5517
FFFFFFFFFFFFE86C        F685555A                ; SETHI
5518
FFFFFFFFFFFFE870        042D0C06                        cmpi    r3,r2,#0x5555AAAA5555AAAA
5519
FFFFFFFFFFFFE874        BE3000C9                        bne             r3,r0,ramtest8
5520
FFFFFFFFFFFFE878        08840008                        addi    r8,r8,#8
5521
FFFFFFFFFFFFE87C        E6800000                ; SETLO
5522
FFFFFFFFFFFFE880        EE800004                ; SETMID
5523
FFFFFFFFFFFFE884        048D0C06                        cmpi    r3,r8,#0x0000_0000_0100_0000
5524
FFFFFFFFFFFFE888        BE307EC0                        blt             r3,r0,ramtest7
5525
FFFFFFFFFFFFE88C                                 ramtest8:
5526
FFFFFFFFFFFFE88C        BE858048                        beq             r8,r11,ramtest9
5527
FFFFFFFFFFFFE890        0485A014                        min             r8,r8,r11
5528
FFFFFFFFFFFFE894                                 ramtest9:
5529
FFFFFFFFFFFFE894        BE850048                        beq             r8,r10,ramtest10
5530
FFFFFFFFFFFFE898        04852014                        min             r8,r8,r10
5531
FFFFFFFFFFFFE89C                                 ramtest10:
5532
FFFFFFFFFFFFE89C        66040400                        sw              r8,0x00000400   ;memend
5533
FFFFFFFFFFFFE8A0        37EF8000                        ret
5534 27 robfinch
 
5535
                                                 ;-------------------------------------------
5536
                                                 ;-------------------------------------------
5537 43 robfinch
                                                 ;
5538
FFFFFFFFFFFFE8A4                                 iberr_rout:
5539
FFFFFFFFFFFFE8A4        9A00E92B                        lea             r1,msgiberr
5540
FFFFFFFFFFFFE8A8        31FFEFE7                        call    DisplayString
5541
FFFFFFFFFFFFE8AC        020085E8                        mfspr   r1,EPC
5542
FFFFFFFFFFFFE8B0        31FFF019                        call    DisplayWord
5543
FFFFFFFFFFFFE8B4        00000028                        wait
5544
FFFFFFFFFFFFE8B8        33FFEC07                        jmp             start
5545
FFFFFFFFFFFFE8BC                                 dberr_rout:
5546
FFFFFFFFFFFFE8BC        9A00E910                        lea             r1,msgdberr
5547
FFFFFFFFFFFFE8C0        31FFEFE7                        call    DisplayString
5548
FFFFFFFFFFFFE8C4        02008628                        mfspr   r1,ERRADR
5549
FFFFFFFFFFFFE8C8        31FFF019                        call    DisplayWord
5550
FFFFFFFFFFFFE8CC        9A00E924                        lea             r1,msgEPC
5551
FFFFFFFFFFFFE8D0        31FFEFE7                        call    DisplayString
5552
FFFFFFFFFFFFE8D4        020085E8                        mfspr   r1,EPC
5553
FFFFFFFFFFFFE8D8        31FFF019                        call    DisplayWord
5554
FFFFFFFFFFFFE8DC        31FFF93F                        call    CRLF
5555
FFFFFFFFFFFFE8E0        1601001F                        lw              r2,#31
5556
FFFFFFFFFFFFE8E4                                 dberr1:
5557
FFFFFFFFFFFFE8E4        02200FA9                        mtspr   PCHI,r2
5558
FFFFFFFFFFFFE8E8        DE000000                        nop
5559
FFFFFFFFFFFFE8EC        DE000000                        nop
5560
FFFFFFFFFFFFE8F0        DE000000                        nop
5561
FFFFFFFFFFFFE8F4        02008FE8                        mfspr   r1,PCHISTORIC
5562
FFFFFFFFFFFFE8F8        31FFF019                        call    DisplayWord
5563
FFFFFFFFFFFFE8FC        31FFF93F                        call    CRLF
5564
FFFFFFFFFFFFE900        BE017F2F                        loop    r2,dberr1
5565
FFFFFFFFFFFFE904        00000028                        wait
5566
FFFFFFFFFFFFE908        33FFEC07                        jmp             start
5567
FFFFFFFFFFFFE908 0000000033FFEC07               .align  16
5568
FFFFFFFFFFFFE910                                        .align  16
5569
FFFFFFFFFFFFE910                                 msgdberr:
5570
FFFFFFFFFFFFE910 7375622061746144               db      "Data bus error at: ",0
5571
FFFFFFFFFFFFE918 6120726F72726520
5572
FFFFFFFFFFFFE924                                 msgEPC:
5573
FFFFFFFFFFFFE920 4350452000203A74               db      " EPC: ",0
5574
FFFFFFFFFFFFE92B                                 msgiberr:
5575
FFFFFFFFFFFFE928 662072724500203A               db      "Err fetching instruction at: ",0
5576
FFFFFFFFFFFFE930 20676E6968637465
5577
FFFFFFFFFFFFE938 7463757274736E69
5578
FFFFFFFFFFFFE940 203A7461206E6F69
5579
FFFFFFFFFFFFE948 0000000000000000               .align  16
5580
FFFFFFFFFFFFE950                                        .align  16
5581 27 robfinch
 
5582 43 robfinch
                                                 ;------------------------------------------------------------------------------
5583
                                                 ; IRQ routine
5584
                                                 ;------------------------------------------------------------------------------
5585
                                                 ;
5586
FFFFFFFFFFFFE950                                 irqrout:
5587
FFFFFFFFFFFFE950        0FEF0020                        subui   sp,sp,#32
5588
FFFFFFFFFFFFE954        67E08000                        sw              r1,[sp]                                 ; save off a working register
5589
FFFFFFFFFFFFE958        67E10008                        sw              r2,8[sp]                                ; and a second work register
5590
FFFFFFFFFFFFE95C        67ED0010                        sw              r26,16[sp]                              ; save off implicit constant builder reg
5591
FFFFFFFFFFFFE960        67EF8018                        sw              lr,24[sp]
5592
FFFFFFFFFFFFE964        E69C0FF0                ; SETLO
5593
FFFFFFFFFFFFE968        EE800003                ; SETMID
5594
FFFFFFFFFFFFE96C        6A0D0421                        inch    r1,PIC                                  ; r1= which IRQ line is active
5595
 
5596
                                                 ; 1000 Hz interrupt
5597
                                                 ; This IRQ must be fast, so it's placed inline
5598
                                                 ; Increments the millisecond counter, and switches to the next context
5599
                                                 ;
5600
FFFFFFFFFFFFE970                                 irq1000Hz:
5601
FFFFFFFFFFFFE970        B2101602                        bnei    r1,#2,irq100Hz
5602
FFFFFFFFFFFFE974        E6BF0000                ; SETLO
5603
FFFFFFFFFFFFE978        6A0D0028                        outb    r0,0xFFFFFFFF_FFFF0000  ; acknowledge interrupt
5604
FFFFFFFFFFFFE97C        46009400                        lw              r1,Milliseconds                 ; increment milliseconds count
5605
FFFFFFFFFFFFE980        0A108001                        addui   r1,r1,#1
5606
FFFFFFFFFFFFE984        66009400                        sw              r1,Milliseconds
5607
FFFFFFFFFFFFE988        E6900000                ; SETLO
5608
FFFFFFFFFFFFE98C        EE800003                ; SETMID
5609
FFFFFFFFFFFFE990        6A0D082D                        lea             r2,TEXTSCR
5610
FFFFFFFFFFFFE994        8220814C                        inch    r1,332[r2]
5611
FFFFFFFFFFFFE998        0A108001                        addui   r1,r1,#1
5612
FFFFFFFFFFFFE99C        9220814C                        outc    r1,332[r2]
5613
FFFFFFFFFFFFE9A0        47EF8018                        lw              lr,24[sp]
5614
FFFFFFFFFFFFE9A4        47ED0010                        lw              r26,16[sp]                              ; restore registers from stack
5615
FFFFFFFFFFFFE9A8        47E10008                        lw              r2,8[sp]
5616
FFFFFFFFFFFFE9AC        47E08000                        lw              r1,[sp]
5617
FFFFFFFFFFFFE9B0        0BEF0020                        addui   sp,sp,#32                               ; restore stack pointer
5618
FFFFFFFFFFFFE9B4        0000000F                        iepp                                                    ; move to the next context
5619
FFFFFFFFFFFFE9B8        DE000000                        nop
5620
FFFFFFFFFFFFE9BC        DE000000                        nop
5621
FFFFFFFFFFFFE9C0        DE000000                        nop
5622
FFFFFFFFFFFFE9C4        01900020                        iret                                                    ; return to the next context
5623
 
5624
                                                 ; 100 Hz interrupt
5625
                                                 ; This IRQ could have some work to do, including flashing a cursor. So
5626
                                                 ; we call a subroutine.
5627
                                                 ;
5628
FFFFFFFFFFFFE9C8                                 irq100Hz:
5629
FFFFFFFFFFFFE9C8        B2100403                        bnei    r1,#3,irqSerial
5630
FFFFFFFFFFFFE9CC        4600B000                        lw              r1,p100IRQvec
5631
                                                 ;      jal             lr,[r1]
5632
FFFFFFFFFFFFE9D0        31FFEE3B                        call    Pulse100
5633
FFFFFFFFFFFFE9D4        BE0001AA                        bra             irqret
5634
 
5635
FFFFFFFFFFFFE9D8                                 irqSerial:
5636
FFFFFFFFFFFFE9D8        B2100408                        bnei    r1,#8,irqRaster
5637
FFFFFFFFFFFFE9DC        4600B010                        lw              r1,serialIRQvec
5638
FFFFFFFFFFFFE9E0        341F8000                        jal             lr,[r1]
5639
FFFFFFFFFFFFE9E4        BE00012A                        bra             irqret
5640
 
5641
FFFFFFFFFFFFE9E8                                 irqRaster:
5642
FFFFFFFFFFFFE9E8        B210040D                        bnei    r1,#13,irqKeybd
5643
FFFFFFFFFFFFE9EC        4600B018                        lw              r1,rasterIRQvec
5644
                                                 ;      jal             lr,[r1]
5645
FFFFFFFFFFFFE9F0        31FFF2B1                        call    RasterIRQfn
5646
FFFFFFFFFFFFE9F4        BE0000AA                        bra             irqret
5647
 
5648
FFFFFFFFFFFFE9F8                                 irqKeybd:
5649
FFFFFFFFFFFFE9F8        B0118901                        beqi    r1,#1,ColdStart                 ; CTRL-ALT-DEL interrupt
5650
FFFFFFFFFFFFE9FC        B210030F                        bnei    r1,#15,irqret
5651
FFFFFFFFFFFFEA00        4600B008                        lw              r1,keybdIRQvec
5652
FFFFFFFFFFFFEA04        31FFEDF1                        call    KeybdIRQ
5653
                                                 ;      jal             lr,[r1]
5654
 
5655
FFFFFFFFFFFFEA08                                 irqret:
5656
FFFFFFFFFFFFEA08        47EF8018                        lw              lr,24[sp]
5657
FFFFFFFFFFFFEA0C        47ED0010                        lw              r26,16[sp]                              ; restore registers from stack
5658
FFFFFFFFFFFFEA10        47E10008                        lw              r2,8[sp]
5659
FFFFFFFFFFFFEA14        47E08000                        lw              r1,[sp]
5660
FFFFFFFFFFFFEA18        0BEF0020                        addui   sp,sp,#32                               ; restore stack pointer
5661
FFFFFFFFFFFFEA1C        01900020                        iret
5662
 
5663 27 robfinch
                                                 ;-------------------------------------------
5664
                                                 ; NMI routine
5665
                                                 ;-------------------------------------------
5666 43 robfinch
FFFFFFFFFFFFEA20                                 nmirout:
5667
FFFFFFFFFFFFEA20        01900020                        iret
5668 27 robfinch
 
5669
                                                 ;-------------------------------------------
5670
                                                 ; Handle miss on Data TLB
5671
                                                 ;-------------------------------------------
5672 43 robfinch
FFFFFFFFFFFFEA24                                 DTLBHandler:
5673
FFFFFFFFFFFFEA24        E6BF0000                ; SETLO
5674
FFFFFFFFFFFFEA28        6A0D0413                        sw              r1,0xFFFF_FFFF_FFFF_0000
5675
FFFFFFFFFFFFEA2C        E6BF0008                ; SETLO
5676
FFFFFFFFFFFFEA30        6A0D0813                        sw              r2,0xFFFF_FFFF_FFFF_0008
5677
FFFFFFFFFFFFEA34                                 dh1:
5678
FFFFFFFFFFFFEA34        02008034                        omgi    r1,#0           ; try open mutex gate #0 (TLB protector)
5679
FFFFFFFFFFFFEA38        BE107FE9                        bne             r1,r0,dh1       ; spinlock if gate is closed
5680
FFFFFFFFFFFFEA3C        02008128                        mfspr   r1,PTA          ; get the page table address
5681
FFFFFFFFFFFFEA40        02010228                        mfspr   r2,BadVAddr     ; get the bad virtual address
5682
FFFFFFFFFFFFEA44        022002E9                        mtspr   TLBVirtPage,r2  ; which virtual address to update
5683
FFFFFFFFFFFFEA48        06211A01                        shrui   r2,r2,#13       ; turn va into index
5684
FFFFFFFFFFFFEA4C        04110403                        addu    r1,r1,r2
5685
FFFFFFFFFFFFEA50        46110000                        lw              r2,[r1]         ; get the physical address from the table
5686
FFFFFFFFFFFFEA54        14210000                        and             r2,r2,#FFFF_FFFF_FFFF_E000      ; mask off lower bits
5687
FFFFFFFFFFFFEA58        022002A9                        mtspr   TLBPhysPage0,r2 ;
5688
FFFFFFFFFFFFEA5C        46110008                        lw              r2,8[r1]        ; get the physical address from the table
5689
FFFFFFFFFFFFEA60        14210000                        and             r2,r2,#FFFF_FFFF_FFFF_E000      ; mask off lower bits
5690
FFFFFFFFFFFFEA64        022002E9                        mtspr   TLBPhysPage1,r2 ;
5691
FFFFFFFFFFFFEA68        02000034                        tlbwr                           ; update a random entry in the TLB
5692
FFFFFFFFFFFFEA6C        02000035                        cmgi    #0                      ; close the mutex gate
5693
FFFFFFFFFFFFEA70        E6BF0000                ; SETLO
5694
FFFFFFFFFFFFEA74        6A0D0403                        lw              r1,0xFFFF_FFFF_FFFF_0000
5695
FFFFFFFFFFFFEA78        E6BF0008                ; SETLO
5696
FFFFFFFFFFFFEA7C        6A0D0803                        lw              r2,0xFFFF_FFFF_FFFF_0008
5697
FFFFFFFFFFFFEA80        01900020                        iret
5698
FFFFFFFFFFFFEA80 0000000001900020               .align  32
5699
FFFFFFFFFFFFEA88 6A0D0803E6BF0008
5700
FFFFFFFFFFFFEA90 0000000000000000
5701
FFFFFFFFFFFFEA98 0000000000000000
5702
FFFFFFFFFFFFEAA0                                        .align  32
5703
 
5704
FFFFFFFFFFFFFFB0                                        org             0xFFFF_FFFF_FFFF_FFB0
5705
FFFFFFFFFFFFFFB0        33FFFA89                        jmp             DTLBHandler
5706
FFFFFFFFFFFFFFB4        DE000000                        nop
5707
FFFFFFFFFFFFFFB8        DE000000                        nop
5708
FFFFFFFFFFFFFFC0                                        org             0xFFFF_FFFF_FFFF_FFC0
5709
FFFFFFFFFFFFFFC0        33FFFA89                        jmp             DTLBHandler
5710
FFFFFFFFFFFFFFC4        DE000000                        nop
5711
FFFFFFFFFFFFFFC8        DE000000                        nop
5712
 
5713
                                                        ; NMI vector
5714
FFFFFFFFFFFFFFE0                                        org     0xFFFF_FFFF_FFFF_FFE0
5715
FFFFFFFFFFFFFFE0        33FFFA88                        jmp             nmirout
5716
FFFFFFFFFFFFFFE4        DE000000                        nop
5717
FFFFFFFFFFFFFFE8        DE000000                        nop
5718 10 robfinch
 
5719 43 robfinch
                                                        ; RST vector
5720
FFFFFFFFFFFFFFF0                                        org             0xFFFF_FFFF_FFFF_FFF0
5721
FFFFFFFFFFFFFFF0        33FFEC07                        jmp             start
5722
FFFFFFFFFFFFFFF4        DE000000                        nop
5723
FFFFFFFFFFFFFFF8        DE000000                        nop
5724 10 robfinch
 
5725 27 robfinch
 
5726
 
5727 43 robfinch
FFFFFFFFFFFFFFFC        00000000
5728
0000000000000000        00000000
5729 27 robfinch
 
5730
 
5731
Symbol Table:
5732
==========================================================
5733
Name                   Typ  Segment     Address/Value
5734
----------------------------------------------------------
5735
CR                      C       constant        000000000000000D
5736
LF                      C       constant        000000000000000A
5737
TAB                     C       constant        0000000000000009
5738
CTRLC                   C       constant        0000000000000003
5739
CTRLH                   C       constant        0000000000000008
5740
CTRLS                   C       constant        0000000000000013
5741
CTRLX                   C       constant        0000000000000018
5742 43 robfinch
XON                     C       constant        0000000000000011
5743
XOFF                    C       constant        0000000000000013
5744
DATA_PRESENT            C       constant        0000000000000001
5745
XMIT_NOT_FULL           C       constant        0000000000000020
5746
BUFLEN                  C       constant        0000000000000050
5747
STACKTOP0               C       constant        FFFFFFFFFFFEFFF8
5748
STACKTOP1               C       constant        FFFFFFFFFFFEFBF8
5749
STACKTOP2               C       constant        FFFFFFFFFFFEF7F8
5750
STACKTOP3               C       constant        FFFFFFFFFFFEF3F8
5751
STACKTOP4               C       constant        FFFFFFFFFFFEEFF8
5752
STACKTOP5               C       constant        FFFFFFFFFFFEEBF8
5753
STACKTOP6               C       constant        FFFFFFFFFFFEE7F8
5754
STACKTOP7               C       constant        FFFFFFFFFFFEE3F8
5755
STACKTOP8               C       constant        FFFFFFFFFFFEDFF8
5756
STACKTOP9               C       constant        FFFFFFFFFFFEDBF8
5757
STACKTOP10              C       constant        FFFFFFFFFFFED7F8
5758
STACKTOP11              C       constant        FFFFFFFFFFFED3F8
5759
STACKTOP12              C       constant        FFFFFFFFFFFECFF8
5760
STACKTOP13              C       constant        FFFFFFFFFFFECBF8
5761
STACKTOP14              C       constant        FFFFFFFFFFFEC7F8
5762
STACKTOP15              C       constant        FFFFFFFFFFFEC3F8
5763
TCBSize                 C       constant        0000000000000200
5764
TCBBase                 C       constant        0000000100000000
5765
TCBr1                   C       constant        0000000000000000
5766
TCBr2                   C       constant        0000000000000008
5767
TCBr3                   C       constant        0000000000000010
5768
TCBr4                   C       constant        0000000000000018
5769
TCBr5                   C       constant        0000000000000020
5770
TCBr6                   C       constant        0000000000000028
5771
TCBr7                   C       constant        0000000000000030
5772
TCBr8                   C       constant        0000000000000038
5773
TCBr9                   C       constant        0000000000000040
5774
TCBr10                  C       constant        0000000000000048
5775
TCBr11                  C       constant        0000000000000050
5776
TCBr12                  C       constant        0000000000000058
5777
TCBr13                  C       constant        0000000000000060
5778
TCBr14                  C       constant        0000000000000068
5779
TCBr15                  C       constant        0000000000000070
5780
TCBr16                  C       constant        0000000000000078
5781
TCBr17                  C       constant        0000000000000080
5782
TCBr18                  C       constant        0000000000000088
5783
TCBr19                  C       constant        0000000000000090
5784
TCBr20                  C       constant        0000000000000098
5785
TCBr21                  C       constant        00000000000000A0
5786
TCBr22                  C       constant        00000000000000A8
5787
TCBr23                  C       constant        00000000000000B0
5788
TCBr24                  C       constant        00000000000000B8
5789
TCBr25                  C       constant        00000000000000C0
5790
TCBr26                  C       constant        00000000000000C8
5791
TCBr27                  C       constant        00000000000000D0
5792
TCBr28                  C       constant        00000000000000D8
5793
TCBr29                  C       constant        00000000000000E0
5794
TCBr30                  C       constant        00000000000000E8
5795
TCBr31                  C       constant        00000000000000F0
5796
warmStart               C       constant        0000000000001020
5797
usrJmp                  C       constant        0000000000001028
5798
TickIRQAddr             C       constant        0000000000001030
5799
TaskBlock               C       constant        0000000000001038
5800
tencount                C       constant        00000000000013F8
5801
Milliseconds            C       constant        0000000000001400
5802
Lastloc                 C       constant        0000000000001408
5803
ScreenColor             C       constant        0000000000001414
5804
CursorRow               C       constant        0000000000001416
5805
CursorCol               C       constant        0000000000001418
5806
CursorFlash             C       constant        000000000000141A
5807
KeybdEcho               C       constant        000000000000141C
5808
KeybdBuffer             C       constant        0000000000001440
5809
KeybdHead               C       constant        0000000000001450
5810
KeybdTail               C       constant        0000000000001451
5811
Score                   C       constant        0000000000001500
5812
Manpos                  C       constant        0000000000001508
5813
MissileActive           C       constant        0000000000001510
5814
MissileX                C       constant        0000000000001512
5815
MissileY                C       constant        0000000000001514
5816
InvadersRow1            C       constant        0000000000001520
5817
InvadersRow2            C       constant        0000000000001530
5818
InvadersRow3            C       constant        0000000000001540
5819
InvadersRow4            C       constant        0000000000001550
5820
InvadersRow5            C       constant        0000000000001560
5821
InvadersColpos          C       constant        0000000000001570
5822
InvadersRowpos          C       constant        0000000000001571
5823
Uart_rxfifo             C       constant        0000000000001600
5824
Uart_rxhead             C       constant        0000000000001800
5825
Uart_rxtail             C       constant        0000000000001802
5826
Uart_ms                 C       constant        0000000000001808
5827
Uart_rxrts              C       constant        0000000000001809
5828
Uart_rxdtr              C       constant        000000000000180A
5829
Uart_rxxon              C       constant        000000000000180B
5830
Uart_rxflow             C       constant        000000000000180C
5831
Uart_fon                C       constant        000000000000180E
5832
Uart_foff               C       constant        0000000000001810
5833
Uart_txrts              C       constant        0000000000001812
5834
Uart_txdtr              C       constant        0000000000001813
5835
Uart_txxon              C       constant        0000000000001814
5836
Uart_txxonoff           C       constant        0000000000001815
5837
TaskList                C       constant        0000000000002000
5838
ReadyList1              C       constant        0000000000002000
5839
ReadyList2              C       constant        0000000000002020
5840
ReadyList3              C       constant        0000000000002040
5841
ReadyList4              C       constant        0000000000002060
5842
ReadyList5              C       constant        0000000000002080
5843
ReadyNdx1               C       constant        00000000000020A0
5844
ReadyNdx2               C       constant        00000000000020A1
5845
ReadyNdx3               C       constant        00000000000020A2
5846
ReadyNdx4               C       constant        00000000000020A3
5847
ReadyNdx5               C       constant        00000000000020A4
5848
RunningTCB              C       constant        00000000000020A6
5849
NextToRunTCB            C       constant        00000000000020A8
5850
r1save                  C       constant        00000000000020B0
5851
r2save                  C       constant        00000000000020B8
5852
AXCstart                C       constant        00000000000020C0
5853
p100IRQvec              C       constant        0000000000003000
5854
keybdIRQvec             C       constant        0000000000003008
5855
serialIRQvec            C       constant        0000000000003010
5856
rasterIRQvec            C       constant        0000000000003018
5857
TEXTSCR                 C       constant        0000000000D00000
5858
COLORSCR                C       constant        0000000000D10000
5859
TEXTREG                 C       constant        0000000000DA0000
5860 27 robfinch
TEXT_COLS               C       constant        0000000000000000
5861
TEXT_ROWS               C       constant        0000000000000002
5862
TEXT_CURPOS             C       constant        0000000000000016
5863 43 robfinch
KEYBD                   C       constant        0000000000DC0000
5864
KEYBDCLR                C       constant        0000000000DC0002
5865
UART                    C       constant        0000000000DC0A00
5866
UART_LS                 C       constant        0000000000DC0A01
5867
UART_IS                 C       constant        0000000000DC0A03
5868
UART_IE                 C       constant        0000000000DC0A04
5869
UART_MC                 C       constant        0000000000DC0A06
5870
DATETIME                C       constant        0000000000DC0400
5871
PIC                     C       constant        0000000000DC0FF0
5872
PIC_IE                  C       constant        0000000000DC0FF2
5873
PSG                     C       constant        0000000000D50000
5874
PSGFREQ0                C       constant        0000000000D50000
5875
PSGPW0                  C       constant        0000000000D50002
5876
PSGCTRL0                C       constant        0000000000D50004
5877
PSGADSR0                C       constant        0000000000D50006
5878
SPRRAM                  C       constant        0000000000D80000
5879
AC97                    C       constant        0000000000DC1000
5880
LED                     C       constant        0000000000DC0600
5881
GACCEL                  C       constant        0000000000DAE000
5882
RASTERIRQ               C       constant        0000000000DA0100
5883 27 robfinch
BOOT_STACK              C       constant        FFFFFFFFFFFEFFF8
5884 43 robfinch
SPRITEREGS              C       constant        0000000000DAD000
5885 27 robfinch
BITMAPSCR               C       constant        0000000100200000
5886
txempty                 C       constant        0000000000000040
5887
rxfull                  C       constant        0000000000000001
5888 43 robfinch
txtWidth                L       bss             0000000000001038
5889
txtHeight               L       bss             0000000000001039
5890
cursx                   L       bss             000000000000103A
5891
cursy                   L       bss             000000000000103B
5892
pos                     L       bss             000000000000103C
5893
dh                      L       bss             000000000000103C
5894
 
5895
charToPrint             L       bss             0000000000001040
5896
fgColor                 L       bss             0000000000001042
5897
bkColor                 L       bss             0000000000001045
5898
cursFlash               L       bss             0000000000001046
5899
lineLinkTbl             L       bss             0000000000001047
5900
typef                   L       bss             0000000000001080
5901
OSSP                    L       bss             0000000000001088
5902
CURRNT                  L       bss             0000000000001090
5903
STKGOS                  L       bss             0000000000001098
5904
STKINP                  L       bss             00000000000010A0
5905
LOPVAR                  L       bss             00000000000010A8
5906
LOPINC                  L       bss             00000000000010B0
5907
LOPLMT                  L       bss             00000000000010B8
5908
LOPLN                   L       bss             00000000000010C0
5909
LOPPT                   L       bss             00000000000010C8
5910
TXTUNF                  L       bss             00000000000010D0
5911
VARBGN                  L       bss             00000000000010D8
5912
IVARBGN                 L       bss             00000000000010E0
5913
SVARBGN                 L       bss             00000000000010E8
5914
FVARBGN                 L       bss             00000000000010F0
5915
STKBOT                  L       bss             00000000000010F8
5916
NUMWKA                  L       bss             0000000000001100
5917
BUFFER                  L       bss             000000000000111B
5918
TXT                     C       constant        0000000100600000
5919
SerialGetChar           L       code            FFFFFFFFFFFFB550
5920
SerialPutChar           L       code            FFFFFFFFFFFFB430
5921
SetKeyboardEcho         L       code            FFFFFFFFFFFFB818
5922
KeybdCheckForKey        L       code            FFFFFFFFFFFFB874
5923
KeybdGetChar            L       code            FFFFFFFFFFFFB820
5924
DisplayChar             L       code            FFFFFFFFFFFFBD1C
5925
DisplayString           L       code            FFFFFFFFFFFFBF9C
5926
start                   L       code            FFFFFFFFFFFFB01C
5927
ColdStart               L       code            FFFFFFFFFFFFB01C
5928
ict1                    L       code            FFFFFFFFFFFFB028
5929
ctxstart3               L       code            FFFFFFFFFFFFB1F8
5930
ctxstart2               L       code            FFFFFFFFFFFFB210
5931
ctxstart                L       code            FFFFFFFFFFFFB214
5932
ctxstart1               L       code            FFFFFFFFFFFFB318
5933
csj5                    L       code            FFFFFFFFFFFFB22C
5934
SerialInit              L       code            FFFFFFFFFFFFB3B0
5935
KeybdInit               L       code            FFFFFFFFFFFFB7B0
5936
PICInit                 L       code            FFFFFFFFFFFFB390
5937
SetupRasterIRQ          L       code            FFFFFFFFFFFFCA64
5938
dcokay                  L       code            FFFFFFFFFFFFB2C4
5939
ClearScreen             L       code            FFFFFFFFFFFFBB64
5940
ClearBmpScreen          L       code            FFFFFFFFFFFFBB10
5941
RandomizeSprram         L       code            FFFFFFFFFFFFC7B4
5942
DisplayStringCRLF       L       code            FFFFFFFFFFFFBFD4
5943
Monitor                 L       code            FFFFFFFFFFFFC258
5944
SetupAC97               L       code            FFFFFFFFFFFFC7DC
5945
Beep                    L       code            FFFFFFFFFFFFC884
5946
j4                      L       code            FFFFFFFFFFFFB310
5947
HelloWorld              L       code            FFFFFFFFFFFFB31C
5948
j3                      L       code            FFFFFFFFFFFFB334
5949
j2                      L       code            FFFFFFFFFFFFB348
5950
MSG                     L       code            FFFFFFFFFFFFB360
5951
MSGSTART                L       code            FFFFFFFFFFFFB36D
5952
PICret                  L       code            FFFFFFFFFFFFB3AC
5953
SerialGetCharDirect     L       code            FFFFFFFFFFFFB3F4
5954
sgc1                    L       code            FFFFFFFFFFFFC6E0
5955
SerialCheckForCharDirect        L       code            FFFFFFFFFFFFB418
5956
spcb1                   L       code            FFFFFFFFFFFFB490
5957
spcb3                   L       code            FFFFFFFFFFFFB470
5958
spcabort                L       code            FFFFFFFFFFFFB518
5959
spcb2                   L       code            FFFFFFFFFFFFB4C0
5960
spcb4                   L       code            FFFFFFFFFFFFB4A0
5961
spcb5                   L       code            FFFFFFFFFFFFB4DC
5962
spcb6                   L       code            FFFFFFFFFFFFB4C8
5963
spcb8                   L       code            FFFFFFFFFFFFB4E4
5964
spcb7                   L       code            FFFFFFFFFFFFB50C
5965
CharsInRxBuf            L       code            FFFFFFFFFFFFB52C
5966
cirxb1                  L       code            FFFFFFFFFFFFB54C
5967
sgcfifo1                L       code            FFFFFFFFFFFFB610
5968
sgcfifo2                L       code            FFFFFFFFFFFFB5FC
5969
sgcfifo3                L       code            FFFFFFFFFFFFB5C0
5970
sgcfifo4                L       code            FFFFFFFFFFFFB5E4
5971
sgcfifo5                L       code            FFFFFFFFFFFFB5FC
5972
SerialIRQ               L       code            FFFFFFFFFFFFB628
5973
sirq1                   L       code            FFFFFFFFFFFFB660
5974
srxirq                  L       code            FFFFFFFFFFFFB688
5975
stxirq                  L       code            FFFFFFFFFFFFB684
5976
smsirq                  L       code            FFFFFFFFFFFFB678
5977
srxirq1                 L       code            FFFFFFFFFFFFB688
5978
srxirq3                 L       code            FFFFFFFFFFFFB6B8
5979
srxirq2                 L       code            FFFFFFFFFFFFB6AC
5980
srxirq5                 L       code            FFFFFFFFFFFFB6D4
5981
srxirq8                 L       code            FFFFFFFFFFFFB764
5982
srxirq6                 L       code            FFFFFFFFFFFFB728
5983
srxirq7                 L       code            FFFFFFFFFFFFB74C
5984
KeybdSC                 L       code            FFFFFFFFFFFFB768
5985
kbdsc1                  L       code            FFFFFFFFFFFFB77C
5986
kbdscRet                L       code            FFFFFFFFFFFFB7A4
5987
kbdsc2                  L       code            FFFFFFFFFFFFB78C
5988
kbdsc3                  L       code            FFFFFFFFFFFFB798
5989
kbdsc4                  L       code            FFFFFFFFFFFFB7A4
5990
KeybdIRQ                L       code            FFFFFFFFFFFFB7C4
5991
KeybdIRQa               L       code            FFFFFFFFFFFFB7D4
5992
KeybdIRQb               L       code            FFFFFFFFFFFFB7FC
5993
KeybdIRQc               L       code            FFFFFFFFFFFFB810
5994
nochar                  L       code            FFFFFFFFFFFFB864
5995
kgc3                    L       code            FFFFFFFFFFFFB868
5996
kgc2                    L       code            FFFFFFFFFFFFB85C
5997
CRLF                    L       code            FFFFFFFFFFFFE4FC
5998
KeybdCheckForKeyDirect  L       code            FFFFFFFFFFFFB884
5999
KeybdGetCharDirect      L       code            FFFFFFFFFFFFB898
6000
kgc1                    L       code            FFFFFFFFFFFFB8A8
6001
gk1                     L       code            FFFFFFFFFFFFB8E0
6002
gk2                     L       code            FFFFFFFFFFFFB8DC
6003
Pulse100                L       code            FFFFFFFFFFFFB8EC
6004
DisplayDatetime         L       code            FFFFFFFFFFFFCB60
6005
SelectNextToRunTCB      L       code            FFFFFFFFFFFFB928
6006
SwitchTask              L       code            FFFFFFFFFFFFB930
6007
p1001                   L       code            FFFFFFFFFFFFB920
6008
swtsk1                  L       code            FFFFFFFFFFFFB950
6009
FlashCursor             L       code            FFFFFFFFFFFFBA80
6010
CalcScreenLoc           L       code            FFFFFFFFFFFFBCDC
6011
flshcrsr2               L       code            FFFFFFFFFFFFBADC
6012
flshcrsr3               L       code            FFFFFFFFFFFFBAB4
6013
flshcrsr1               L       code            FFFFFFFFFFFFBAC8
6014
CursorOff               L       code            FFFFFFFFFFFFBAE8
6015
CursorOn                L       code            FFFFFFFFFFFFBAFC
6016
csj4                    L       code            FFFFFFFFFFFFBBAC
6017
AsciiToScreen           L       code            FFFFFFFFFFFFBCAC
6018
ScrollUp                L       code            FFFFFFFFFFFFBBD8
6019
scrup1                  L       code            FFFFFFFFFFFFBC18
6020
BlankLine               L       code            FFFFFFFFFFFFBC58
6021
blnkln1                 L       code            FFFFFFFFFFFFBC90
6022
atoscr1                 L       code            FFFFFFFFFFFFBCC4
6023
ScreenToAscii           L       code            FFFFFFFFFFFFBCCC
6024
stasc1                  L       code            FFFFFFFFFFFFBCD8
6025
dccr                    L       code            FFFFFFFFFFFFBD3C
6026
dcx7                    L       code            FFFFFFFFFFFFBD68
6027
dcx6                    L       code            FFFFFFFFFFFFBD80
6028
dcx8                    L       code            FFFFFFFFFFFFBDB0
6029
dcx9                    L       code            FFFFFFFFFFFFBDE0
6030
dcx10                   L       code            FFFFFFFFFFFFBE10
6031
dcx11                   L       code            FFFFFFFFFFFFBE44
6032
dcx12                   L       code            FFFFFFFFFFFFBE3C
6033
dcx13                   L       code            FFFFFFFFFFFFBE78
6034
dcx5                    L       code            FFFFFFFFFFFFBE98
6035
dcx3                    L       code            FFFFFFFFFFFFBECC
6036
dcx4                    L       code            FFFFFFFFFFFFBEF4
6037
dclf                    L       code            FFFFFFFFFFFFBEF0
6038
IncCursorPos            L       code            FFFFFFFFFFFFBF10
6039
IncCursorRow            L       code            FFFFFFFFFFFFBF48
6040
icc1                    L       code            FFFFFFFFFFFFBF84
6041
icr1                    L       code            FFFFFFFFFFFFBF5C
6042
dspj1                   L       code            FFFFFFFFFFFFBFB0
6043
dsret                   L       code            FFFFFFFFFFFFBFC4
6044
DisplayNybble           L       code            FFFFFFFFFFFFC010
6045
dispnyb1                L       code            FFFFFFFFFFFFC02C
6046
DisplayByte             L       code            FFFFFFFFFFFFC03C
6047
DisplayWord             L       code            FFFFFFFFFFFFC064
6048
dspwd1                  L       code            FFFFFFFFFFFFC078
6049
DisplayMem              L       code            FFFFFFFFFFFFC094
6050
dspmem1                 L       code            FFFFFFFFFFFFC0B8
6051
BinToBCD                L       code            FFFFFFFFFFFFC0E4
6052
bta1                    L       code            FFFFFFFFFFFFC108
6053
BCDToAscii              L       code            FFFFFFFFFFFFC160
6054
bta2                    L       code            FFFFFFFFFFFFC178
6055
BinToStr                L       code            FFFFFFFFFFFFC1BC
6056
btos3                   L       code            FFFFFFFFFFFFC1F0
6057
btos1                   L       code            FFFFFFFFFFFFC1F4
6058
btos2                   L       code            FFFFFFFFFFFFC224
6059
PromptLn                L       code            FFFFFFFFFFFFC264
6060
Prompt3                 L       code            FFFFFFFFFFFFC270
6061
Prompt1                 L       code            FFFFFFFFFFFFC284
6062
Prompt2                 L       code            FFFFFFFFFFFFC2AC
6063
Editmem                 L       code            FFFFFFFFFFFFC404
6064
Dumpmem                 L       code            FFFFFFFFFFFFC43C
6065
CSTART                  L       code            FFFFFFFFFFFFCE70
6066
ExecuteCode             L       code            FFFFFFFFFFFFC42C
6067
LoadS19                 L       code            FFFFFFFFFFFFC500
6068
DisplayHelp             L       code            FFFFFFFFFFFFC314
6069
TestCLS                 L       code            FFFFFFFFFFFFC2E0
6070
RandomLinesCall         L       code            FFFFFFFFFFFFC2D8
6071
Invaders                L       code            FFFFFFFFFFFFCDAC
6072
Piano                   L       code            FFFFFFFFFFFFC95C
6073
RandomLines             L       code            FFFFFFFFFFFFC6F0
6074
HelpMsg                 L       code            FFFFFFFFFFFFC320
6075
ignBlanks               L       code            FFFFFFFFFFFFC3E0
6076
ignBlanks1              L       code            FFFFFFFFFFFFC3E8
6077
GetHexNumber            L       code            FFFFFFFFFFFFC470
6078
edtmem1                 L       code            FFFFFFFFFFFFC414
6079
gthxn2                  L       code            FFFFFFFFFFFFC488
6080
AsciiToHexNybble        L       code            FFFFFFFFFFFFC4C0
6081
gthxn1                  L       code            FFFFFFFFFFFFC4AC
6082
gthx3                   L       code            FFFFFFFFFFFFC4F8
6083
gthx5                   L       code            FFFFFFFFFFFFC4D0
6084
gthx6                   L       code            FFFFFFFFFFFFC4E4
6085
ProcessRec              L       code            FFFFFFFFFFFFC50C
6086
NextRec                 L       code            FFFFFFFFFFFFC504
6087
sGetChar                L       code            FFFFFFFFFFFFC6C8
6088
ProcessS1               L       code            FFFFFFFFFFFFC5C4
6089
ProcessS2               L       code            FFFFFFFFFFFFC5CC
6090
ProcessS3               L       code            FFFFFFFFFFFFC5D4
6091
ProcessS7               L       code            FFFFFFFFFFFFC5DC
6092
ProcessS8               L       code            FFFFFFFFFFFFC5E8
6093
ProcessS9               L       code            FFFFFFFFFFFFC5F4
6094
pcssxa                  L       code            FFFFFFFFFFFFC56C
6095
pcss1a                  L       code            FFFFFFFFFFFFC574
6096
S19Get16BitAddress      L       code            FFFFFFFFFFFFC600
6097
S19Get24BitAddress      L       code            FFFFFFFFFFFFC618
6098
S19Get32BitAddress      L       code            FFFFFFFFFFFFC630
6099
S1932b                  L       code            FFFFFFFFFFFFC684
6100
S1932a                  L       code            FFFFFFFFFFFFC664
6101
sgc2                    L       code            FFFFFFFFFFFFC6D0
6102
AUXIN                   L       code            FFFFFFFFFFFFE570
6103
rl5                     L       code            FFFFFFFFFFFFC700
6104
rl1                     L       code            FFFFFFFFFFFFC714
6105
rl2                     L       code            FFFFFFFFFFFFC730
6106
rl3                     L       code            FFFFFFFFFFFFC74C
6107
rl4                     L       code            FFFFFFFFFFFFC768
6108
rl8                     L       code            FFFFFFFFFFFFC794
6109
rl7                     L       code            FFFFFFFFFFFFC7A4
6110
rsr1                    L       code            FFFFFFFFFFFFC7C4
6111
sac974                  L       code            FFFFFFFFFFFFC7E8
6112
sac971                  L       code            FFFFFFFFFFFFC7F4
6113
sac973                  L       code            FFFFFFFFFFFFC820
6114
sac972                  L       code            FFFFFFFFFFFFC860
6115
sac975                  L       code            FFFFFFFFFFFFC878
6116
beep1                   L       code            FFFFFFFFFFFFC8FC
6117
beep2                   L       code            FFFFFFFFFFFFC92C
6118
playnt                  L       code            FFFFFFFFFFFFC96C
6119
playnt1a                L       code            FFFFFFFFFFFFC994
6120
playnt1b                L       code            FFFFFFFFFFFFC9A0
6121
playnt1c                L       code            FFFFFFFFFFFFC9AC
6122
playnt1d                L       code            FFFFFFFFFFFFC9B8
6123
playnt1e                L       code            FFFFFFFFFFFFC9C4
6124
playnt1f                L       code            FFFFFFFFFFFFC9D0
6125
playnt1g                L       code            FFFFFFFFFFFFC9DC
6126
Tone                    L       code            FFFFFFFFFFFFC9E8
6127
tone1                   L       code            FFFFFFFFFFFFCA28
6128
tone2                   L       code            FFFFFFFFFFFFCA44
6129
RasterIRQfn             L       code            FFFFFFFFFFFFCAC4
6130
rirq1                   L       code            FFFFFFFFFFFFCAF4
6131
rirq2                   L       code            FFFFFFFFFFFFCAF4
6132
rirq3                   L       code            FFFFFFFFFFFFCAF4
6133
rirq4                   L       code            FFFFFFFFFFFFCAF4
6134
rirq5                   L       code            FFFFFFFFFFFFCAF4
6135
rirq6                   L       code            FFFFFFFFFFFFCAF4
6136
rirq7                   L       code            FFFFFFFFFFFFCAF4
6137
rirq8                   L       code            FFFFFFFFFFFFCAF4
6138
InitializeGame          L       code            FFFFFFFFFFFFCBD0
6139
DrawScore               L       code            FFFFFFFFFFFFCBF8
6140
DrawMissile             L       code            FFFFFFFFFFFFCC28
6141
MissileOff              L       code            FFFFFFFFFFFFCC84
6142
DrawMan                 L       code            FFFFFFFFFFFFCCAC
6143
DrawInvader             L       code            FFFFFFFFFFFFCCF8
6144
DrawInvaders            L       code            FFFFFFFFFFFFCD18
6145
dinv1                   L       code            FFFFFFFFFFFFCDA0
6146
DrawBombs               L       code            FFFFFFFFFFFFCDA8
6147
InvadersLoop            L       code            FFFFFFFFFFFFCDB8
6148
TestMoveMan             L       code            FFFFFFFFFFFFCDCC
6149
MoveManRight            L       code            FFFFFFFFFFFFCDE0
6150
MoveManLeft             L       code            FFFFFFFFFFFFCDF8
6151
FireMissile             L       code            FFFFFFFFFFFFCE0C
6152
Invaders1               L       code            FFFFFFFFFFFFCE30
6153
InvadersEnd             L       code            FFFFFFFFFFFFCE38
6154
GOSTART                 L       code            FFFFFFFFFFFFCE44
6155
GOWARM                  L       code            FFFFFFFFFFFFCE48
6156
WSTART                  L       code            FFFFFFFFFFFFCEF8
6157
GOOUT                   L       code            FFFFFFFFFFFFCE4C
6158
OUTC                    L       code            FFFFFFFFFFFFE568
6159
GOIN                    L       code            FFFFFFFFFFFFCE50
6160
INC                     L       code            FFFFFFFFFFFFE56C
6161
GOAUXO                  L       code            FFFFFFFFFFFFCE54
6162
AUXOUT                  L       code            FFFFFFFFFFFFE588
6163
GOAUXI                  L       code            FFFFFFFFFFFFCE58
6164
GOBYE                   L       code            FFFFFFFFFFFFCE5C
6165
BYEBYE                  L       code            FFFFFFFFFFFFE7A8
6166
TXTBGN                  L       code            FFFFFFFFFFFFCE60
6167
ENDMEM                  L       code            FFFFFFFFFFFFCE68
6168
PRMESGAUX               L       code            FFFFFFFFFFFFE534
6169
PRMESG                  L       code            FFFFFFFFFFFFE500
6170
clearVars               L       code            FFFFFFFFFFFFD30C
6171
PRTNUM                  L       code            FFFFFFFFFFFFE234
6172
ST3                     L       code            FFFFFFFFFFFFCF10
6173
GETLN                   L       code            FFFFFFFFFFFFDF60
6174
TOUPBUF                 L       code            FFFFFFFFFFFFE474
6175
TSTNUM                  L       code            FFFFFFFFFFFFE3FC
6176
IGNBLK                  L       code            FFFFFFFFFFFFE450
6177
DIRECT                  L       code            FFFFFFFFFFFFD210
6178
ST2                     L       code            FFFFFFFFFFFFCF3C
6179
ERROR                   L       code            FFFFFFFFFFFFDF20
6180
FNDLN                   L       code            FFFFFFFFFFFFE030
6181
ST4                     L       code            FFFFFFFFFFFFCF90
6182
FNDNXT                  L       code            FFFFFFFFFFFFE080
6183
ST7                     L       code            FFFFFFFFFFFFCF6C
6184
ST6                     L       code            FFFFFFFFFFFFCF88
6185
MVUP                    L       code            FFFFFFFFFFFFE0A4
6186
ST5                     L       code            FFFFFFFFFFFFCFB8
6187
MVDOWN                  L       code            FFFFFFFFFFFFE0BC
6188
TAB1                    L       code            FFFFFFFFFFFFCFE0
6189
TAB2                    L       code            FFFFFFFFFFFFCFF2
6190
TAB4                    L       code            FFFFFFFFFFFFD042
6191
TAB5                    L       code            FFFFFFFFFFFFD063
6192
TAB6                    L       code            FFFFFFFFFFFFD066
6193
TAB8                    L       code            FFFFFFFFFFFFD06B
6194
TAB9                    L       code            FFFFFFFFFFFFD075
6195
TAB10                   L       code            FFFFFFFFFFFFD079
6196
TAB1_1                  L       code            FFFFFFFFFFFFD080
6197
TAB2_1                  L       code            FFFFFFFFFFFFD0A8
6198
TAB4_1                  L       code            FFFFFFFFFFFFD150
6199
TAB5_1                  L       code            FFFFFFFFFFFFD198
6200
TAB6_1                  L       code            FFFFFFFFFFFFD1A8
6201
TAB8_1                  L       code            FFFFFFFFFFFFD1B8
6202
TAB9_1                  L       code            FFFFFFFFFFFFD1F0
6203
TAB10_1                 L       code            FFFFFFFFFFFFD200
6204
EXEC                    L       code            FFFFFFFFFFFFD218
6205
EXLP                    L       code            FFFFFFFFFFFFD22C
6206
EXNGO                   L       code            FFFFFFFFFFFFD244
6207
EXGO                    L       code            FFFFFFFFFFFFD27C
6208
EXMAT                   L       code            FFFFFFFFFFFFD26C
6209
EX1                     L       code            FFFFFFFFFFFFD25C
6210
NEW                     L       code            FFFFFFFFFFFFD284
6211
ENDCHK                  L       code            FFFFFFFFFFFFDEE4
6212
STOP                    L       code            FFFFFFFFFFFFD294
6213
RUN                     L       code            FFFFFFFFFFFFD29C
6214
RUNNXL                  L       code            FFFFFFFFFFFFD2AC
6215
FNDLNP                  L       code            FFFFFFFFFFFFE040
6216
RUNTSL                  L       code            FFFFFFFFFFFFD2CC
6217
RUNSML                  L       code            FFFFFFFFFFFFD2D4
6218
CHKIO                   L       code            FFFFFFFFFFFFE4D8
6219
GOTO                    L       code            FFFFFFFFFFFFD2E4
6220
OREXPR                  L       code            FFFFFFFFFFFFD8E8
6221
_clr                    L       code            FFFFFFFFFFFFD304
6222
FINISH                  L       code            FFFFFFFFFFFFD410
6223
cv1                     L       code            FFFFFFFFFFFFD320
6224
LISTX                   L       code            FFFFFFFFFFFFD338
6225
LS1                     L       code            FFFFFFFFFFFFD34C
6226
LS4                     L       code            FFFFFFFFFFFFD354
6227
PRTLN                   L       code            FFFFFFFFFFFFE37C
6228
LS3                     L       code            FFFFFFFFFFFFD374
6229
LS2                     L       code            FFFFFFFFFFFFD36C
6230
PRINT                   L       code            FFFFFFFFFFFFD380
6231
TSTC                    L       code            FFFFFFFFFFFFE3C4
6232
PR2                     L       code            FFFFFFFFFFFFD398
6233
PR0                     L       code            FFFFFFFFFFFFD3AC
6234
PR3                     L       code            FFFFFFFFFFFFD3E4
6235
PR1                     L       code            FFFFFFFFFFFFD3C4
6236
PR4                     L       code            FFFFFFFFFFFFD3DC
6237
QTSTG                   L       code            FFFFFFFFFFFFE19C
6238
PR8                     L       code            FFFFFFFFFFFFD400
6239
FIN                     L       code            FFFFFFFFFFFFDEA8
6240
PR6                     L       code            FFFFFFFFFFFFD3F8
6241
QWHAT                   L       code            FFFFFFFFFFFFDF1C
6242
GOSUB                   L       code            FFFFFFFFFFFFD418
6243
PUSHA                   L       code            FFFFFFFFFFFFE0F8
6244
gosub1                  L       code            FFFFFFFFFFFFD430
6245
RETURN                  L       code            FFFFFFFFFFFFD454
6246
return1                 L       code            FFFFFFFFFFFFD468
6247
POPA                    L       code            FFFFFFFFFFFFE0C4
6248
FOR                     L       code            FFFFFFFFFFFFD48C
6249
SETVAL                  L       code            FFFFFFFFFFFFDE60
6250
FR1                     L       code            FFFFFFFFFFFFD4A4
6251
FR2                     L       code            FFFFFFFFFFFFD4B8
6252
FR4                     L       code            FFFFFFFFFFFFD4C4
6253
FR3                     L       code            FFFFFFFFFFFFD4C0
6254
FR5                     L       code            FFFFFFFFFFFFD4C8
6255
FR7                     L       code            FFFFFFFFFFFFD4E4
6256
FR6                     L       code            FFFFFFFFFFFFD4E0
6257
FR8                     L       code            FFFFFFFFFFFFD504
6258
NEXT                    L       code            FFFFFFFFFFFFD508
6259
TSTV                    L       code            FFFFFFFFFFFFDBB0
6260
NX4                     L       code            FFFFFFFFFFFFD51C
6261
NX0                     L       code            FFFFFFFFFFFFD520
6262
NX5                     L       code            FFFFFFFFFFFFD530
6263
NX2                     L       code            FFFFFFFFFFFFD53C
6264
NX1                     L       code            FFFFFFFFFFFFD55C
6265
NXPurge                 L       code            FFFFFFFFFFFFD570
6266
NX3                     L       code            FFFFFFFFFFFFD560
6267
IF                      L       code            FFFFFFFFFFFFD578
6268
IF1                     L       code            FFFFFFFFFFFFD57C
6269
IF2                     L       code            FFFFFFFFFFFFD580
6270
FNDSKP                  L       code            FFFFFFFFFFFFE084
6271
IF3                     L       code            FFFFFFFFFFFFD590
6272
INPERR                  L       code            FFFFFFFFFFFFD594
6273
INPUT                   L       code            FFFFFFFFFFFFD5A8
6274
IP6                     L       code            FFFFFFFFFFFFD5B0
6275
IP2                     L       code            FFFFFFFFFFFFD5D0
6276
IP4                     L       code            FFFFFFFFFFFFD640
6277
IP3                     L       code            FFFFFFFFFFFFD600
6278
IP7                     L       code            FFFFFFFFFFFFD5E8
6279
PRTSTG                  L       code            FFFFFFFFFFFFE144
6280
IP5                     L       code            FFFFFFFFFFFFD650
6281
DEFLT                   L       code            FFFFFFFFFFFFD65C
6282
LET                     L       code            FFFFFFFFFFFFD664
6283
LT1                     L       code            FFFFFFFFFFFFD678
6284
LOAD                    L       code            FFFFFFFFFFFFD67C
6285
LOD1                    L       code            FFFFFFFFFFFFD688
6286
LODEND                  L       code            FFFFFFFFFFFFD6C8
6287
GCHAR                   L       code            FFFFFFFFFFFFD6D0
6288
LOD2                    L       code            FFFFFFFFFFFFD6B0
6289
GCHAR1                  L       code            FFFFFFFFFFFFD6E8
6290
asciiToHex              L       code            FFFFFFFFFFFFD714
6291
a2h1                    L       code            FFFFFFFFFFFFD71C
6292
SAVE                    L       code            FFFFFFFFFFFFD728
6293
SAVE1                   L       code            FFFFFFFFFFFFD730
6294
AUXOCRLF                L       code            FFFFFFFFFFFFD784
6295
SAVEND                  L       code            FFFFFFFFFFFFD76C
6296
PWORD                   L       code            FFFFFFFFFFFFD7A4
6297
SAVE2                   L       code            FFFFFFFFFFFFD758
6298
pword1                  L       code            FFFFFFFFFFFFD7B8
6299
toAsciiHex              L       code            FFFFFFFFFFFFD7F4
6300
pword2                  L       code            FFFFFFFFFFFFD7D4
6301
tah1                    L       code            FFFFFFFFFFFFD800
6302
POKE                    L       code            FFFFFFFFFFFFD808
6303
PKER                    L       code            FFFFFFFFFFFFD834
6304
POKEC                   L       code            FFFFFFFFFFFFD83C
6305
POKEH                   L       code            FFFFFFFFFFFFD868
6306
POKEW                   L       code            FFFFFFFFFFFFD894
6307
SYSX                    L       code            FFFFFFFFFFFFD8C0
6308
sysx1                   L       code            FFFFFFFFFFFFD8D4
6309
ANDEXPR                 L       code            FFFFFFFFFFFFD920
6310
XP_OR1                  L       code            FFFFFFFFFFFFD8F4
6311
XP_OR                   L       code            FFFFFFFFFFFFD904
6312
XP_ORX                  L       code            FFFFFFFFFFFFD914
6313
EXPR                    L       code            FFFFFFFFFFFFD9B4
6314
XP_AND1                 L       code            FFFFFFFFFFFFD92C
6315
XP_AND                  L       code            FFFFFFFFFFFFD93C
6316
XP_ANDX                 L       code            FFFFFFFFFFFFD94C
6317
isDigit                 L       code            FFFFFFFFFFFFD958
6318
isDigitFalse            L       code            FFFFFFFFFFFFD968
6319
isAlpha                 L       code            FFFFFFFFFFFFD970
6320
isAlphaFalse            L       code            FFFFFFFFFFFFD988
6321
isAlphaTrue             L       code            FFFFFFFFFFFFD980
6322
isAlnum                 L       code            FFFFFFFFFFFFD990
6323
isDigitx                L       code            FFFFFFFFFFFFD9AC
6324
EXPR2                   L       code            FFFFFFFFFFFFDA70
6325
XP11                    L       code            FFFFFFFFFFFFD9D0
6326
XP18                    L       code            FFFFFFFFFFFFDA54
6327
XPRT1                   L       code            FFFFFFFFFFFFDA3C
6328
XPRT0                   L       code            FFFFFFFFFFFFDA30
6329
XP12                    L       code            FFFFFFFFFFFFD9E0
6330
XP13                    L       code            FFFFFFFFFFFFD9F0
6331
XP14                    L       code            FFFFFFFFFFFFDA00
6332
XP15                    L       code            FFFFFFFFFFFFDA10
6333
XP16                    L       code            FFFFFFFFFFFFDA20
6334
XP17                    L       code            FFFFFFFFFFFFDA48
6335
XP26                    L       code            FFFFFFFFFFFFDACC
6336
XP21                    L       code            FFFFFFFFFFFFDA90
6337
XP22                    L       code            FFFFFFFFFFFFDA9C
6338
EXPR3                   L       code            FFFFFFFFFFFFDAE4
6339
XP23                    L       code            FFFFFFFFFFFFDAA0
6340
XP24                    L       code            FFFFFFFFFFFFDAB4
6341
XP25                    L       code            FFFFFFFFFFFFDAC0
6342
XP45                    L       code            FFFFFFFFFFFFDAD8
6343
EXPR4                   L       code            FFFFFFFFFFFFDB3C
6344
XP31                    L       code            FFFFFFFFFFFFDAF0
6345
XP34                    L       code            FFFFFFFFFFFFDB10
6346
XP47                    L       code            FFFFFFFFFFFFDB30
6347
XP40                    L       code            FFFFFFFFFFFFDB50
6348
XP41                    L       code            FFFFFFFFFFFFDB68
6349
XP46                    L       code            FFFFFFFFFFFFDB74
6350
PARN                    L       code            FFFFFFFFFFFFDB7C
6351
XP42                    L       code            FFFFFFFFFFFFDBA0
6352
XP43                    L       code            FFFFFFFFFFFFDBA8
6353
tstv_notfound           L       code            FFFFFFFFFFFFDC24
6354
TV1                     L       code            FFFFFFFFFFFFDC08
6355
SIZEX                   L       code            FFFFFFFFFFFFDE4C
6356
TV2                     L       code            FFFFFFFFFFFFDBFC
6357
QSORRY                  L       code            FFFFFFFFFFFFDF14
6358
TSTVRT                  L       code            FFFFFFFFFFFFDC18
6359
getVarName              L       code            FFFFFFFFFFFFDC34
6360
findVar                 L       code            FFFFFFFFFFFFDCCC
6361
gvn1                    L       code            FFFFFFFFFFFFDCBC
6362
gvn4                    L       code            FFFFFFFFFFFFDC54
6363
gvn2                    L       code            FFFFFFFFFFFFDC8C
6364
gvn6                    L       code            FFFFFFFFFFFFDC7C
6365
gvn3                    L       code            FFFFFFFFFFFFDCA0
6366
fv4                     L       code            FFFFFFFFFFFFDCDC
6367
fv3                     L       code            FFFFFFFFFFFFDD00
6368
fv1                     L       code            FFFFFFFFFFFFDD08
6369
fv2                     L       code            FFFFFFFFFFFFDD18
6370
PEEK                    L       code            FFFFFFFFFFFFDD2C
6371
PEEKC                   L       code            FFFFFFFFFFFFDD3C
6372
PEEKH                   L       code            FFFFFFFFFFFFDD50
6373
PEEKW                   L       code            FFFFFFFFFFFFDD64
6374
USRX                    L       code            FFFFFFFFFFFFDD78
6375
RND                     L       code            FFFFFFFFFFFFDD94
6376
rnd2                    L       code            FFFFFFFFFFFFDDC4
6377
rnd1                    L       code            FFFFFFFFFFFFDDBC
6378
modu4                   L       code            FFFFFFFFFFFFDDD4
6379
mod2                    L       code            FFFFFFFFFFFFDDF4
6380
mod1                    L       code            FFFFFFFFFFFFDE10
6381
ABS                     L       code            FFFFFFFFFFFFDE2C
6382
SGN                     L       code            FFFFFFFFFFFFDE3C
6383
sv2                     L       code            FFFFFFFFFFFFDE7C
6384
SV1                     L       code            FFFFFFFFFFFFDEA4
6385
FI1                     L       code            FFFFFFFFFFFFDEC4
6386
FI2                     L       code            FFFFFFFFFFFFDEDC
6387
ec1                     L       code            FFFFFFFFFFFFDF04
6388
TOOBIG                  L       code            FFFFFFFFFFFFDF0C
6389
GL1                     L       code            FFFFFFFFFFFFDF88
6390
GL3                     L       code            FFFFFFFFFFFFDFBC
6391
GL4                     L       code            FFFFFFFFFFFFDFE4
6392
GL2                     L       code            FFFFFFFFFFFFDFA0
6393
GL7                     L       code            FFFFFFFFFFFFE014
6394
GL6                     L       code            FFFFFFFFFFFFE00C
6395
GL5                     L       code            FFFFFFFFFFFFDFF0
6396
fl1                     L       code            FFFFFFFFFFFFE03C
6397
FNDRET1                 L       code            FFFFFFFFFFFFE06C
6398
FNDRET2                 L       code            FFFFFFFFFFFFE078
6399
FNDRET                  L       code            FFFFFFFFFFFFE064
6400
MVUP1                   L       code            FFFFFFFFFFFFE094
6401
MVRET                   L       code            FFFFFFFFFFFFE0A8
6402
MVDOWN1                 L       code            FFFFFFFFFFFFE0AC
6403
PP1                     L       code            FFFFFFFFFFFFE0F4
6404
PU1                     L       code            FFFFFFFFFFFFE138
6405
PS1                     L       code            FFFFFFFFFFFFE160
6406
PRTRET                  L       code            FFFFFFFFFFFFE180
6407
QT1                     L       code            FFFFFFFFFFFFE1B8
6408
QT2                     L       code            FFFFFFFFFFFFE200
6409
QT3                     L       code            FFFFFFFFFFFFE1D0
6410
QT4                     L       code            FFFFFFFFFFFFE1E8
6411
QT5                     L       code            FFFFFFFFFFFFE20C
6412
prCRLF                  L       code            FFFFFFFFFFFFE214
6413
PN1                     L       code            FFFFFFFFFFFFE264
6414
PN6                     L       code            FFFFFFFFFFFFE284
6415
PN4                     L       code            FFFFFFFFFFFFE294
6416
PN3                     L       code            FFFFFFFFFFFFE288
6417
PN5                     L       code            FFFFFFFFFFFFE2A0
6418
PNRET                   L       code            FFFFFFFFFFFFE2B4
6419
PRTHEXNUM               L       code            FFFFFFFFFFFFE2CC
6420
PHN1                    L       code            FFFFFFFFFFFFE308
6421
PHN7                    L       code            FFFFFFFFFFFFE31C
6422
PHN8                    L       code            FFFFFFFFFFFFE320
6423
shru                    L       code            FFFFFFFFFFFFE32C
6424
r4                      L       code            FFFFFFFFFFFFE32C
6425
#4                      L       code            FFFFFFFFFFFFE32C
6426
PHN6                    L       code            FFFFFFFFFFFFE334
6427
PHN4                    L       code            FFFFFFFFFFFFE344
6428
PHN3                    L       code            FFFFFFFFFFFFE338
6429
PHN5                    L       code            FFFFFFFFFFFFE350
6430
PHNRET                  L       code            FFFFFFFFFFFFE364
6431
TC1                     L       code            FFFFFFFFFFFFE3EC
6432
TN1                     L       code            FFFFFFFFFFFFE410
6433
TSNMRET                 L       code            FFFFFFFFFFFFE448
6434
TN2                     L       code            FFFFFFFFFFFFE430
6435
IGB2                    L       code            FFFFFFFFFFFFE458
6436
IGB1                    L       code            FFFFFFFFFFFFE464
6437
IGBRET                  L       code            FFFFFFFFFFFFE46C
6438
TOUPB1                  L       code            FFFFFFFFFFFFE484
6439
TOUPBRT                 L       code            FFFFFFFFFFFFE4C0
6440
DOQUO                   L       code            FFFFFFFFFFFFE4A8
6441
toUpper                 L       code            FFFFFFFFFFFFE4C8
6442
DOQUO1                  L       code            FFFFFFFFFFFFE4B4
6443
TOUPRET                 L       code            FFFFFFFFFFFFE4D4
6444
CHKRET2                 L       code            FFFFFFFFFFFFE4F0
6445
CHKRET                  L       code            FFFFFFFFFFFFE4F4
6446
PRMESG1                 L       code            FFFFFFFFFFFFE510
6447
PRMRET                  L       code            FFFFFFFFFFFFE524
6448
PRMESGA1                L       code            FFFFFFFFFFFFE544
6449
PRMRETA                 L       code            FFFFFFFFFFFFE558
6450
AXIRET_ZERO             L       code            FFFFFFFFFFFFE580
6451
AXIRET                  L       code            FFFFFFFFFFFFE57C
6452
_cls                    L       code            FFFFFFFFFFFFE58C
6453
_wait10                 L       code            FFFFFFFFFFFFE594
6454
_getATAStatus           L       code            FFFFFFFFFFFFE598
6455
_waitCFNotBusy          L       code            FFFFFFFFFFFFE59C
6456
_rdcf                   L       code            FFFFFFFFFFFFE5A0
6457
rdcf6                   L       code            FFFFFFFFFFFFE5A4
6458
msgInit                 L       code            FFFFFFFFFFFFE5C0
6459
OKMSG                   L       code            FFFFFFFFFFFFE5F6
6460
msgWhat                 L       code            FFFFFFFFFFFFE5FD
6461
SRYMSG                  L       code            FFFFFFFFFFFFE605
6462
CLMSG                   L       code            FFFFFFFFFFFFE60B
6463
msgReadError            L       code            FFFFFFFFFFFFE60E
6464
msgNumTooBig            L       code            FFFFFFFFFFFFE629
6465
msgDivZero              L       code            FFFFFFFFFFFFE63D
6466
msgVarSpace             L       code            FFFFFFFFFFFFE650
6467
msgBytesFree            L       code            FFFFFFFFFFFFE668
6468
msgReady                L       code            FFFFFFFFFFFFE676
6469
msgComma                L       code            FFFFFFFFFFFFE680
6470
msgLineRange            L       code            FFFFFFFFFFFFE694
6471
msgVar                  L       code            FFFFFFFFFFFFE6AA
6472
msgRNDBad               L       code            FFFFFFFFFFFFE6C1
6473
msgSYSBad               L       code            FFFFFFFFFFFFE6D5
6474
msgInputVar             L       code            FFFFFFFFFFFFE6E7
6475
msgNextFor              L       code            FFFFFFFFFFFFE704
6476
msgNextVar              L       code            FFFFFFFFFFFFE717
6477
msgBadGotoGosub         L       code            FFFFFFFFFFFFE73B
6478
msgRetWoGosub           L       code            FFFFFFFFFFFFE758
6479
msgTooBig               L       code            FFFFFFFFFFFFE76F
6480
msgExtraChars           L       code            FFFFFFFFFFFFE784
6481 27 robfinch
LSTROM                  C       constant        0000000000000000
6482 43 robfinch
ramtest                 L       code            FFFFFFFFFFFFE7B0
6483
ramtest2                L       code            FFFFFFFFFFFFE7C4
6484
ramtest1                L       code            FFFFFFFFFFFFE7E8
6485
ramtest4                L       code            FFFFFFFFFFFFE7F0
6486
ramtest3                L       code            FFFFFFFFFFFFE81C
6487
ramtest8                L       code            FFFFFFFFFFFFE88C
6488
ramtest5                L       code            FFFFFFFFFFFFE834
6489
ramtest6                L       code            FFFFFFFFFFFFE858
6490
ramtest7                L       code            FFFFFFFFFFFFE860
6491
ramtest9                L       code            FFFFFFFFFFFFE894
6492
ramtest10               L       code            FFFFFFFFFFFFE89C
6493
iberr_rout              L       code            FFFFFFFFFFFFE8A4
6494
dberr_rout              L       code            FFFFFFFFFFFFE8BC
6495
dberr1                  L       code            FFFFFFFFFFFFE8E4
6496
msgdberr                L       code            FFFFFFFFFFFFE910
6497
msgEPC                  L       code            FFFFFFFFFFFFE924
6498
msgiberr                L       code            FFFFFFFFFFFFE92B
6499
irqrout                 L       code            FFFFFFFFFFFFE950
6500
irq1000Hz               L       code            FFFFFFFFFFFFE970
6501
irq100Hz                L       code            FFFFFFFFFFFFE9C8
6502
irqSerial               L       code            FFFFFFFFFFFFE9D8
6503
irqret                  L       code            FFFFFFFFFFFFEA08
6504
irqRaster               L       code            FFFFFFFFFFFFE9E8
6505
irqKeybd                L       code            FFFFFFFFFFFFE9F8
6506
nmirout                 L       code            FFFFFFFFFFFFEA20
6507
DTLBHandler             L       code            FFFFFFFFFFFFEA24
6508
dh1                     L       code            FFFFFFFFFFFFEA34

powered by: WebSVN 2.1.0

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