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

Subversion Repositories raptor64

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 27 robfinch
                                                ; ============================================================================
2 46 robfinch
                                                 ;        __
3
                                                 ;   \\__/ o\    (C) 2012-2013  Robert Finch, Stratford
4
                                                 ;    \  __ /    All rights reserved.
5
                                                 ;     \/_//     robfinch@opencores.org
6
                                                 ;       ||
7
                                                 ;
8 27 robfinch
                                                 ;
9
                                                 ; This source file is free software: you can redistribute it and/or modify
10
                                                 ; it under the terms of the GNU Lesser General Public License as published
11
                                                 ; by the Free Software Foundation, either version 3 of the License, or
12
                                                 ; (at your option) any later version.
13
                                                 ;
14
                                                 ; This source file is distributed in the hope that it will be useful,
15
                                                 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
16
                                                 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
                                                 ; GNU General Public License for more details.
18
                                                 ;
19
                                                 ; You should have received a copy of the GNU General Public License
20
                                                 ; along with this program.  If not, see .
21
                                                 ;
22
                                                 ; ============================================================================
23
                                                 ;
24
                                                 CR     EQU     0x0D            ;ASCII equates
25
                                                 LF     EQU     0x0A
26
                                                 TAB    EQU     0x09
27
                                                 CTRLC  EQU     0x03
28
                                                 CTRLH  EQU     0x08
29 46 robfinch
                                                 CTRLI  EQU     0x09
30
                                                 CTRLJ  EQU     0x0A
31
                                                 CTRLK  EQU     0x0B
32
                                                 CTRLM   EQU 0x0D
33 27 robfinch
                                                 CTRLS  EQU     0x13
34
                                                 CTRLX  EQU     0x18
35 43 robfinch
                                                 XON            EQU     0x11
36
                                                 XOFF   EQU     0x13
37 27 robfinch
 
38 46 robfinch
                                                 EX_IRQ EQU     449
39
 
40 43 robfinch
                                                 DATA_PRESENT   EQU     0x01            ; there is data preset at the serial port bc_uart3
41
                                                 XMIT_NOT_FULL  EQU     0x20
42
 
43
                                                 BUFLEN EQU     80      ;       length of keyboard input buffer
44
 
45
                                                 ; Initial stack tops for contexts
46
                                                 ; Each context gets 1k from the special 16k startup stack memory
47
                                                 ;
48
                                                 STACKTOP0      EQU             0xFFFF_FFFF_FFFE_FFF8
49
                                                 STACKTOP1      EQU             0xFFFF_FFFF_FFFE_FBF8
50
                                                 STACKTOP2      EQU             0xFFFF_FFFF_FFFE_F7F8
51
                                                 STACKTOP3      EQU             0xFFFF_FFFF_FFFE_F3F8
52
                                                 STACKTOP4      EQU             0xFFFF_FFFF_FFFE_EFF8
53
                                                 STACKTOP5      EQU             0xFFFF_FFFF_FFFE_EBF8
54
                                                 STACKTOP6      EQU             0xFFFF_FFFF_FFFE_E7F8
55
                                                 STACKTOP7      EQU             0xFFFF_FFFF_FFFE_E3F8
56
                                                 STACKTOP8      EQU             0xFFFF_FFFF_FFFE_DFF8
57
                                                 STACKTOP9      EQU             0xFFFF_FFFF_FFFE_DBF8
58
                                                 STACKTOP10     EQU             0xFFFF_FFFF_FFFE_D7F8
59
                                                 STACKTOP11     EQU             0xFFFF_FFFF_FFFE_D3F8
60
                                                 STACKTOP12     EQU             0xFFFF_FFFF_FFFE_CFF8
61
                                                 STACKTOP13     EQU             0xFFFF_FFFF_FFFE_CBF8
62
                                                 STACKTOP14     EQU             0xFFFF_FFFF_FFFE_C7F8
63
                                                 STACKTOP15     EQU             0xFFFF_FFFF_FFFE_C3F8
64
 
65
 
66
                                                 ; BOOT ROM routines
67
 
68
                                                 TCBSize                EQU             0x200                   ; 512 bytes per TCB
69
                                                 TCBBase                EQU             0x00000001_00000000                     ; TCB pages
70
                                                 TCBr1          EQU             0x00
71
                                                 TCBr2          EQU             0x08
72
                                                 TCBr3          EQU             0x10
73
                                                 TCBr4          EQU             0x18
74
                                                 TCBr5          EQU             0x20
75
                                                 TCBr6          EQU             0x28
76
                                                 TCBr7          EQU             0x30
77
                                                 TCBr8          EQU             0x38
78
                                                 TCBr9          EQU             0x40
79
                                                 TCBr10         EQU             0x48
80
                                                 TCBr11         EQU             0x50
81
                                                 TCBr12         EQU             0x58
82
                                                 TCBr13         EQU             0x60
83
                                                 TCBr14         EQU             0x68
84
                                                 TCBr15         EQU             0x70
85
                                                 TCBr16         EQU             0x78
86
                                                 TCBr17         EQU             0x80
87
                                                 TCBr18         EQU             0x88
88
                                                 TCBr19         EQU             0x90
89
                                                 TCBr20         EQU             0x98
90
                                                 TCBr21         EQU             0xA0
91
                                                 TCBr22         EQU             0xA8
92
                                                 TCBr23         EQU             0xB0
93
                                                 TCBr24         EQU             0xB8
94
                                                 TCBr25         EQU             0xC0
95
                                                 TCBr26         EQU             0xC8
96
                                                 TCBr27         EQU             0xD0
97
                                                 TCBr28         EQU             0xD8
98
                                                 TCBr29         EQU             0xE0
99
                                                 TCBr30         EQU             0xE8
100
                                                 TCBr31         EQU             0xF0
101
 
102 46 robfinch
                                                 SCREENGATE     EQU             0x00
103
                                                 KEYBDGATE      EQU             0x01
104
                                                 VIDEOGATE      EQU             0x02
105
                                                 CARDGATE       EQU             0x03
106 43 robfinch
                                                 warmStart   EQU     0x1020
107
                                                 usrJmp      EQU     0x1028
108
                                                 TickIRQAddr            EQU             0x1030
109
                                                 TaskBlock              EQU             0x1038
110
                                                 Milliseconds   EQU             0x1400
111
                                                 Lastloc                        EQU             0x1408
112 46 robfinch
                                                 CharColor      EQU             0x1410
113 43 robfinch
                                                 ScreenColor    EQU             0x1414
114 46 robfinch
                                                 CursorRow      EQU             0x1417
115 43 robfinch
                                                 CursorCol      EQU             0x1418
116
                                                 CursorFlash    EQU             0x141A
117
                                                 KeybdEcho      EQU             0x141C
118
                                                 KeybdBuffer    EQU             0x1440
119
                                                 KeybdHead      EQU             0x1450
120
                                                 KeybdTail      EQU             0x1451
121 46 robfinch
                                                 sp_save                EQU             0x1460
122
                                                 lr_save                EQU             0x1468
123
                                                 r1_save                EQU             0x1470
124
                                                 r2_save                EQU             0x1478
125
                                                 r26_save       EQU             0x1480
126 43 robfinch
                                                 Score          EQU             0x1500
127
                                                 Manpos         EQU             0x1508
128
                                                 MissileActive  EQU             0x1510
129
                                                 MissileX       EQU             0x1512
130
                                                 MissileY       EQU             0x1514
131
                                                 InvadersRow1   EQU             0x1520
132
                                                 InvadersRow2   EQU             0x1530
133
                                                 InvadersRow3   EQU             0x1540
134
                                                 InvadersRow4   EQU             0x1550
135
                                                 InvadersRow5   EQU             0x1560
136
                                                 InvadersColpos EQU             0x1570
137
                                                 InvadersRowpos EQU             0x1571
138
                                                 Uart_rxfifo            EQU             0x1600
139
                                                 Uart_rxhead            EQU             0x1800
140
                                                 Uart_rxtail            EQU             0x1802
141
                                                 Uart_ms                        EQU             0x1808
142
                                                 Uart_rxrts             EQU             0x1809
143
                                                 Uart_rxdtr             EQU             0x180A
144
                                                 Uart_rxxon             EQU             0x180B
145
                                                 Uart_rxflow            EQU             0x180C
146
                                                 Uart_fon               EQU             0x180E
147
                                                 Uart_foff              EQU             0x1810
148
                                                 Uart_txrts             EQU             0x1812
149
                                                 Uart_txdtr             EQU             0x1813
150
                                                 Uart_txxon             EQU             0x1814
151
                                                 Uart_txxonoff  EQU             0x1815
152
                                                 TaskList               EQU             0x2000
153
                                                 ReadyList1             EQU             0x2000
154
                                                 ReadyList2             EQU             0x2020
155
                                                 ReadyList3             EQU             0x2040
156
                                                 ReadyList4             EQU             0x2060
157
                                                 ReadyList5             EQU             0x2080
158
                                                 ReadyNdx1              EQU             0x20A0
159
                                                 ReadyNdx2              EQU             0x20A1
160
                                                 ReadyNdx3              EQU             0x20A2
161
                                                 ReadyNdx4              EQU             0x20A3
162
                                                 ReadyNdx5              EQU             0x20A4
163
                                                 RunningTCB             EQU             0x20A6
164
                                                 NextToRunTCB   EQU             0x20A8
165
                                                 r1save                 EQU             0x20B0
166
                                                 r2save                 EQU             0x20B8
167
                                                 AXCstart               EQU             0x20C0
168
 
169 46 robfinch
                                                 ; Context startup address table
170
                                                 ;
171
                                                 ctx0start              EQU             0x20D0
172
                                                 ctx1start              EQU             0x20D8
173
                                                 ctx2start              EQU             0x20E0
174
                                                 ctx3start              EQU             0x20E8
175
                                                 ctx4start              EQU             0x20F0
176
                                                 ctx5start              EQU             0x20F8
177
                                                 ctx6start              EQU             0x2100
178
                                                 ctx7start              EQU             0x2108
179
                                                 ctx8start              EQU             0x2110
180
                                                 ctx9start              EQU             0x2118
181
                                                 ctx10start             EQU             0x2120
182
                                                 ctx11start             EQU             0x2128
183
                                                 ctx12start             EQU             0x2130
184
                                                 ctx13start             EQU             0x2138
185
                                                 ctx14start             EQU             0x2140
186
                                                 ctx15start             EQU             0x2148
187
                                                 sp_saves               EQU             0x2200
188
                                                 sp_saves_end   EQU             0x2280
189 43 robfinch
                                                 p100IRQvec             EQU             0x3000
190
                                                 keybdIRQvec            EQU             0x3008
191
                                                 serialIRQvec   EQU             0x3010
192
                                                 rasterIRQvec   EQU             0x3018
193
 
194 46 robfinch
                                                 startSector    EQU             0x30F8
195
                                                 BPB                    EQU             0x3100
196
 
197 43 robfinch
                                                 TEXTSCR                EQU             0xD0_0000
198
                                                 COLORSCR       EQU             0xD1_0000
199
                                                 TEXTREG                EQU             0xDA_0000
200 27 robfinch
                                                 TEXT_COLS      EQU             0x0
201
                                                 TEXT_ROWS      EQU             0x2
202
                                                 TEXT_CURPOS    EQU             0x16
203 43 robfinch
                                                 KEYBD          EQU             0xDC_0000
204
                                                 KEYBDCLR       EQU             0xDC_0002
205
 
206
                                                 UART           EQU             0xDC_0A00
207
                                                 UART_LS                EQU             0xDC_0A01
208
                                                 UART_MS                EQU             0xDC_0A02
209
                                                 UART_IS                EQU             0xDC_0A03
210
                                                 UART_IE                EQU             0xDC_0A04
211
                                                 UART_MC                EQU             0xDC_0A06
212
                                                 DATETIME       EQU             0xDC_0400
213 46 robfinch
 
214
                                                 SPIMASTER      EQU             0xDC_0500
215
                                                 SPI_MASTER_VERSION_REG EQU     0x00
216
                                                 SPI_MASTER_CONTROL_REG EQU     0x01
217
                                                 SPI_TRANS_TYPE_REG     EQU             0x02
218
                                                 SPI_TRANS_CTRL_REG     EQU             0x03
219
                                                 SPI_TRANS_STATUS_REG   EQU     0x04
220
                                                 SPI_TRANS_ERROR_REG            EQU     0x05
221
                                                 SPI_DIRECT_ACCESS_DATA_REG             EQU     0x06
222
                                                 SPI_SD_ADDR_7_0_REG            EQU     0x07
223
                                                 SPI_SD_ADDR_15_8_REG   EQU     0x08
224
                                                 SPI_SD_ADDR_23_16_REG  EQU     0x09
225
                                                 SPI_SD_ADDR_31_24_REG  EQU     0x0a
226
                                                 SPI_RX_FIFO_DATA_REG   EQU     0x10
227
                                                 SPI_RX_FIFO_DATA_COUNT_MSB     EQU     0x12
228
                                                 SPI_RX_FIFO_DATA_COUNT_LSB  EQU 0x13
229
                                                 SPI_RX_FIFO_CTRL_REG           EQU     0x14
230
                                                 SPI_TX_FIFO_DATA_REG   EQU     0x20
231
                                                 SPI_TX_FIFO_CTRL_REG   EQU     0x24
232
                                                 SPI_INIT_SD                    EQU             0x01
233
                                                 SPI_TRANS_START                EQU             0x01
234
                                                 SPI_TRANS_BUSY         EQU             0x01
235
                                                 SPI_INIT_NO_ERROR      EQU             0x00
236
                                                 SPI_READ_NO_ERROR      EQU             0x00
237
                                                 RW_READ_SD_BLOCK       EQU             0x02
238
                                                 RW_WRITE_SD_BLOCK      EQU             0x03
239
 
240
 
241 43 robfinch
                                                 PIC                    EQU             0xDC_0FF0
242
                                                 PIC_IE         EQU             0xDC_0FF2
243
 
244
                                                 PSG                    EQU             0xD5_0000
245
                                                 PSGFREQ0       EQU             0xD5_0000
246
                                                 PSGPW0         EQU             0xD5_0002
247
                                                 PSGCTRL0       EQU             0xD5_0004
248
                                                 PSGADSR0       EQU             0xD5_0006
249
 
250
                                                 SPRRAM         EQU             0xD8_0000
251
                                                 AC97           EQU             0xDC_1000
252 46 robfinch
                                                 TMP                    EQU             0xDC_0300
253 43 robfinch
                                                 LED                    EQU             0xDC_0600
254 46 robfinch
                                                 ETHMAC         EQU             0xDC_2000
255
                                                 CONFIGREC      EQU             0xDC_FFFF
256
                                                 MIIMODER       EQU             0x28
257
                                                 MIIADDRESS     EQU             0x30
258 43 robfinch
                                                 GACCEL         EQU             0xDA_E000
259
                                                 RASTERIRQ      EQU             0xDA_0100
260 27 robfinch
                                                 BOOT_STACK     EQU             0xFFFF_FFFF_FFFE_FFF8
261 43 robfinch
                                                 SPRITEREGS     EQU             0xDA_D000
262 27 robfinch
                                                 BITMAPSCR      EQU             0x00000001_00200000
263
 
264 46 robfinch
                                                 BOOTJMP                EQU             0x100800204
265
 
266 27 robfinch
                                                 txempty        EQU             0x40
267
                                                 rxfull EQU             0x01
268
 
269 43 robfinch
                                                 ;
270
                                                 ; Internal variables follow:
271
                                                 ;
272
0000000100600000                                                bss
273 46 robfinch
0000000000001048                                                org             0x1048
274 43 robfinch
0000000000000000                                 pos            dh              0                ; text screen position
275
 
276 46 robfinch
1050 0000000000000000    lineLinkTbl            fill.b  47,0    ; screen line link table
277 43 robfinch
1058 0000000000000000
278 46 robfinch
1060 0000000000000000
279
1068 0000000000000000
280
1070 0000000000000000
281
1078 0000000000000000
282 43 robfinch
0000000000001088                                         align   8
283
0000000000001088 0000000000000001        OSSP   dw      1       ; OS value of sp
284
0000000000001090 0000000000000001        CURRNT dw      1       ;       Current line pointer
285
0000000000001098 0000000000000001        STKGOS dw      1       ;       Saves stack pointer in 'GOSUB'
286
00000000000010A0 0000000000000001        STKINP dw      1       ;       Saves stack pointer during 'INPUT'
287
00000000000010A8 0000000000000001        LOPVAR dw      1       ;       'FOR' loop save area
288
00000000000010B0 0000000000000001        LOPINC dw      1       ;       increment
289
00000000000010B8 0000000000000001        LOPLMT dw      1       ;       limit
290
00000000000010C0 0000000000000001        LOPLN  dw      1       ;       line number
291
00000000000010C8 0000000000000001        LOPPT  dw      1       ;       text pointer
292
00000000000010D0 0000000000000001        TXTUNF dw      1       ;       points to unfilled text area
293
00000000000010D8 0000000000000001        VARBGN dw      1       ;       points to variable area
294
00000000000010E0 0000000000000001        IVARBGN dw  1   ;   points to integer variable area
295
00000000000010E8 0000000000000001        SVARBGN dw  1   ;   points to string variable area
296
00000000000010F0 0000000000000001        FVARBGN dw  1   ;   points to float variable area
297
00000000000010F8 0000000000000001        STKBOT dw      1       ;       holds lower limit for stack growth
298
1100 0000000000000000    NUMWKA fill.b  24,0                    ; numeric work area
299
1108 0000000000000000
300
1110 0000000000000000
301
1118 0000000000000000    BUFFER fill.b  BUFLEN,0x00             ;               Keyboard input buffer
302
1120 0000000000000000
303
1128 0000000000000000
304
1130 0000000000000000
305
1138 0000000000000000
306
1140 0000000000000000
307
1148 0000000000000000
308
1150 0000000000000000
309
1158 0000000000000000
310
1160 0000000000000000
311
 
312
000000000000116E                                         bss
313
0000000100600000                                         org     0x1_00600000
314
                                                 TXT            equ             0x1_00600000    ; Beginning of program area
315
 
316 27 robfinch
                                                 ;      org 0x070
317
                                                 ;      iret
318
                                                 ;      nop
319
                                                 ;      nop
320
                                                 ;      nop
321
                                                 ;      nop
322
                                                 ;      nop
323
                                                 ;      nop
324
                                                 ;      nop
325
                                                 ;
326 43 robfinch
0000000000000000                                        code
327
FFFFFFFFFFFFB000                                        org 0xFFFF_FFFF_FFFF_B000
328 27 robfinch
 
329
                                                 ; jump table
330
                                                 ;
331 46 robfinch
FFFFFFFFFFFFB000        33FFEDA4                        jmp             SerialGetChar
332
FFFFFFFFFFFFB004        33FFED5C                        jmp             SerialPutChar
333
FFFFFFFFFFFFB008        33FFEF05                        jmp             SetKeyboardEcho
334
FFFFFFFFFFFFB00C        33FFEF1C                        jmp             KeybdCheckForKey
335
FFFFFFFFFFFFB010        33FFEF07                        jmp             KeybdGetChar
336
FFFFFFFFFFFFB014        33FFF07F                        jmp             DisplayChar
337
FFFFFFFFFFFFB018        33FFF122                        jmp             DisplayString
338
FFFFFFFFFFFFB01C        33FFF13F                        jmp             DisplayNum
339
FFFFFFFFFFFFB020        33FFF06F                        jmp             CalcScreenLoc
340
FFFFFFFFFFFFB024        33FFF011                        jmp             ClearScreen
341
FFFFFFFFFFFFB028        33FFF169                        jmp             DisplayWord
342 27 robfinch
 
343 46 robfinch
FFFFFFFFFFFFB02C                                 start:
344 27 robfinch
                                                 ;      lea             MSGRAM,a1
345
                                                 ;      jsr             DisplayString
346
 
347 46 robfinch
FFFFFFFFFFFFB02C                                 ColdStart:
348
FFFFFFFFFFFFB02C        0000000B                        icache_off                              ; turn on the ICache
349
FFFFFFFFFFFFB030        0000000D                        dcache_off                              ; turn on the DCache
350 27 robfinch
 
351 46 robfinch
                                                 ; Make sure semaphores are available by closing the gates.
352
                                                 ; We don't know what power up state is.
353
 
354
FFFFFFFFFFFFB034        02000075                        cmgi    #KEYBDGATE
355
FFFFFFFFFFFFB038        020000B5                        cmgi    #VIDEOGATE
356
 
357
                                                 ; Initialize the context startup address table with NULL
358
 
359
FFFFFFFFFFFFB03C        0410840A                        xor             r1,r1,r1
360
FFFFFFFFFFFFB040        6600A0D0                        sw              r1,ctx0start
361
FFFFFFFFFFFFB044        6600A0D8                        sw              r1,ctx1start
362
FFFFFFFFFFFFB048        6600A0E0                        sw              r1,ctx2start
363
FFFFFFFFFFFFB04C        6600A0E8                        sw              r1,ctx3start
364
FFFFFFFFFFFFB050        6600A0F0                        sw              r1,ctx4start
365
FFFFFFFFFFFFB054        6600A0F8                        sw              r1,ctx5start
366
FFFFFFFFFFFFB058        6600A100                        sw              r1,ctx6start
367
FFFFFFFFFFFFB05C        6600A108                        sw              r1,ctx7start
368
FFFFFFFFFFFFB060        6600A110                        sw              r1,ctx8start
369
FFFFFFFFFFFFB064        6600A118                        sw              r1,ctx9start
370
FFFFFFFFFFFFB068        6600A120                        sw              r1,ctx10start
371
FFFFFFFFFFFFB06C        6600A128                        sw              r1,ctx11start
372
FFFFFFFFFFFFB070        6600A130                        sw              r1,ctx12start
373
FFFFFFFFFFFFB074        6600A138                        sw              r1,ctx13start
374
FFFFFFFFFFFFB078        6600A140                        sw              r1,ctx14start
375
FFFFFFFFFFFFB07C        6600A148                        sw              r1,ctx15start
376
 
377 43 robfinch
                                                 ; Initialize the context schedule with all contexts treated equally
378
                                                 ; There are only 16 contexts, but 256 schedule slots. Each context is
379
                                                 ; given 16 slots distributed evenly throughout the execution pattern
380
                                                 ; table.
381 27 robfinch
                                                 ;
382 46 robfinch
FFFFFFFFFFFFB080        0410840A                        xor             r1,r1,r1        ; r1 = 0
383
FFFFFFFFFFFFB084                                 ict1:
384
FFFFFFFFFFFFB084        0410803A                        mtep    r1,r1           ; only the low order four bits of r1 will move to the pattern table
385
FFFFFFFFFFFFB088        0A108001                        addui   r1,r1,#1
386
FFFFFFFFFFFFB08C        101100FF                        cmpi    r2,r1,#255
387
FFFFFFFFFFFFB090        BE207FA9                        bne             r2,r0,ict1
388 27 robfinch
 
389 43 robfinch
                                                 ; Point the interrupt return address register of the context to the
390
                                                 ; context startup code. The context will start up when an interrupt return
391
                                                 ; occurs.
392
                                                 ;
393
                                                 ; We cannot use a loop for this. Fortunately there's only 16 contexts.
394
                                                 ;
395 46 robfinch
FFFFFFFFFFFFB094        E6BFB228                ; SETLO
396
FFFFFFFFFFFFB098        6A0D642D                        lea             r25,ctxstart
397
FFFFFFFFFFFFB09C        03900869                        mtspr   IPC,r25
398
FFFFFFFFFFFFB0A0        E6BEFFF8                ; SETLO
399
FFFFFFFFFFFFB0A4        6A0D782D                        lea             r30,STACKTOP0
400
FFFFFFFFFFFFB0A8        0000000F                        iepp
401
FFFFFFFFFFFFB0AC        E6BFB228                ; SETLO
402
FFFFFFFFFFFFB0B0        6A0D642D                        lea             r25,ctxstart
403
FFFFFFFFFFFFB0B4        03900869                        mtspr   IPC,r25
404
FFFFFFFFFFFFB0B8        E6BEFBF8                ; SETLO
405
FFFFFFFFFFFFB0BC        6A0D782D                        lea             r30,STACKTOP1
406
FFFFFFFFFFFFB0C0        0000000F                        iepp
407
FFFFFFFFFFFFB0C4        E6BFB228                ; SETLO
408 43 robfinch
FFFFFFFFFFFFB0C8        6A0D642D                        lea             r25,ctxstart
409 46 robfinch
FFFFFFFFFFFFB0CC        03900869                        mtspr   IPC,r25
410
FFFFFFFFFFFFB0D0        E6BEF7F8                ; SETLO
411
FFFFFFFFFFFFB0D4        6A0D782D                        lea             r30,STACKTOP2
412
FFFFFFFFFFFFB0D8        0000000F                        iepp
413
FFFFFFFFFFFFB0DC        E6BFB228                ; SETLO
414
FFFFFFFFFFFFB0E0        6A0D642D                        lea             r25,ctxstart
415
FFFFFFFFFFFFB0E4        03900869                        mtspr   IPC,r25
416
FFFFFFFFFFFFB0E8        E6BEF3F8                ; SETLO
417
FFFFFFFFFFFFB0EC        6A0D782D                        lea             r30,STACKTOP3
418 43 robfinch
FFFFFFFFFFFFB0F0        0000000F                        iepp
419 46 robfinch
 
420
FFFFFFFFFFFFB0F4        E6BFB228                ; SETLO
421
FFFFFFFFFFFFB0F8        6A0D642D                        lea             r25,ctxstart
422
FFFFFFFFFFFFB0FC        03900869                        mtspr   IPC,r25
423
FFFFFFFFFFFFB100        E6BEEFF8                ; SETLO
424
FFFFFFFFFFFFB104        6A0D782D                        lea             r30,STACKTOP4
425
FFFFFFFFFFFFB108        0000000F                        iepp
426
FFFFFFFFFFFFB10C        E6BFB228                ; SETLO
427
FFFFFFFFFFFFB110        6A0D642D                        lea             r25,ctxstart
428
FFFFFFFFFFFFB114        03900869                        mtspr   IPC,r25
429
FFFFFFFFFFFFB118        E6BEEBF8                ; SETLO
430
FFFFFFFFFFFFB11C        6A0D782D                        lea             r30,STACKTOP5
431
FFFFFFFFFFFFB120        0000000F                        iepp
432
FFFFFFFFFFFFB124        E6BFB228                ; SETLO
433
FFFFFFFFFFFFB128        6A0D642D                        lea             r25,ctxstart
434
FFFFFFFFFFFFB12C        03900869                        mtspr   IPC,r25
435
FFFFFFFFFFFFB130        E6BEE7F8                ; SETLO
436
FFFFFFFFFFFFB134        6A0D782D                        lea             r30,STACKTOP6
437
FFFFFFFFFFFFB138        0000000F                        iepp
438
FFFFFFFFFFFFB13C        E6BFB228                ; SETLO
439
FFFFFFFFFFFFB140        6A0D642D                        lea             r25,ctxstart
440
FFFFFFFFFFFFB144        03900869                        mtspr   IPC,r25
441
FFFFFFFFFFFFB148        E6BEE3F8                ; SETLO
442
FFFFFFFFFFFFB14C        6A0D782D                        lea             r30,STACKTOP7
443
FFFFFFFFFFFFB150        0000000F                        iepp
444 43 robfinch
 
445 46 robfinch
FFFFFFFFFFFFB154        E6BFB228                ; SETLO
446
FFFFFFFFFFFFB158        6A0D642D                        lea             r25,ctxstart
447
FFFFFFFFFFFFB15C        03900869                        mtspr   IPC,r25
448
FFFFFFFFFFFFB160        E6BEDFF8                ; SETLO
449
FFFFFFFFFFFFB164        6A0D782D                        lea             r30,STACKTOP8
450
FFFFFFFFFFFFB168        0000000F                        iepp
451
FFFFFFFFFFFFB16C        E6BFB228                ; SETLO
452 43 robfinch
FFFFFFFFFFFFB170        6A0D642D                        lea             r25,ctxstart
453 46 robfinch
FFFFFFFFFFFFB174        03900869                        mtspr   IPC,r25
454
FFFFFFFFFFFFB178        E6BEDBF8                ; SETLO
455
FFFFFFFFFFFFB17C        6A0D782D                        lea             r30,STACKTOP9
456
FFFFFFFFFFFFB180        0000000F                        iepp
457
FFFFFFFFFFFFB184        E6BFB228                ; SETLO
458
FFFFFFFFFFFFB188        6A0D642D                        lea             r25,ctxstart
459
FFFFFFFFFFFFB18C        03900869                        mtspr   IPC,r25
460
FFFFFFFFFFFFB190        E6BED7F8                ; SETLO
461
FFFFFFFFFFFFB194        6A0D782D                        lea             r30,STACKTOP10
462
FFFFFFFFFFFFB198        0000000F                        iepp
463
FFFFFFFFFFFFB19C        E6BFB228                ; SETLO
464
FFFFFFFFFFFFB1A0        6A0D642D                        lea             r25,ctxstart
465
FFFFFFFFFFFFB1A4        03900869                        mtspr   IPC,r25
466
FFFFFFFFFFFFB1A8        E6BED3F8                ; SETLO
467
FFFFFFFFFFFFB1AC        6A0D782D                        lea             r30,STACKTOP11
468
FFFFFFFFFFFFB1B0        0000000F                        iepp
469 43 robfinch
 
470 46 robfinch
FFFFFFFFFFFFB1B4        E6BFB228                ; SETLO
471
FFFFFFFFFFFFB1B8        6A0D642D                        lea             r25,ctxstart
472
FFFFFFFFFFFFB1BC        03900869                        mtspr   IPC,r25
473
FFFFFFFFFFFFB1C0        E6BECFF8                ; SETLO
474
FFFFFFFFFFFFB1C4        6A0D782D                        lea             r30,STACKTOP12
475
FFFFFFFFFFFFB1C8        0000000F                        iepp
476
FFFFFFFFFFFFB1CC        E6BFB228                ; SETLO
477
FFFFFFFFFFFFB1D0        6A0D642D                        lea             r25,ctxstart
478
FFFFFFFFFFFFB1D4        03900869                        mtspr   IPC,r25
479
FFFFFFFFFFFFB1D8        E6BECBF8                ; SETLO
480
FFFFFFFFFFFFB1DC        6A0D782D                        lea             r30,STACKTOP13
481
FFFFFFFFFFFFB1E0        0000000F                        iepp
482
FFFFFFFFFFFFB1E4        E6BFB228                ; SETLO
483
FFFFFFFFFFFFB1E8        6A0D642D                        lea             r25,ctxstart
484
FFFFFFFFFFFFB1EC        03900869                        mtspr   IPC,r25
485
FFFFFFFFFFFFB1F0        E6BEC7F8                ; SETLO
486
FFFFFFFFFFFFB1F4        6A0D782D                        lea             r30,STACKTOP14
487
FFFFFFFFFFFFB1F8        0000000F                        iepp
488
FFFFFFFFFFFFB1FC        E6BFB228                ; SETLO
489
FFFFFFFFFFFFB200        6A0D642D                        lea             r25,ctxstart
490
FFFFFFFFFFFFB204        03900869                        mtspr   IPC,r25
491
FFFFFFFFFFFFB208        E6BEC3F8                ; SETLO
492
FFFFFFFFFFFFB20C        6A0D782D                        lea             r30,STACKTOP15
493
FFFFFFFFFFFFB210        0000000F                        iepp
494 43 robfinch
 
495
                                                 ; Ensure that context zero is the active context
496
                                                 ;
497 46 robfinch
FFFFFFFFFFFFB214                                 ctxstart3:
498
FFFFFFFFFFFFB214        02008568                        mfspr   r1,AXC
499
FFFFFFFFFFFFB218        BE100068                        beq             r1,r0,ctxstart2
500
FFFFFFFFFFFFB21C        0000000F                        iepp
501
FFFFFFFFFFFFB220        BE007FAA                        bra             ctxstart3
502
FFFFFFFFFFFFB224                                 ctxstart2:
503
FFFFFFFFFFFFB224        6000A0C0                        sb              r1,AXCstart             ; save off the startup context which should be context zero
504 43 robfinch
 
505
                                                 ; Entry point for context startup
506
                                                 ;
507
                                                 ; Avoid repeating all the system initialization when a context starts up by testing whether
508
                                                 ; or not the context is the starting context.
509
                                                 ;
510 46 robfinch
FFFFFFFFFFFFB228                                 ctxstart:
511
FFFFFFFFFFFFB228        02008568                        mfspr   r1,AXC
512
FFFFFFFFFFFFB22C        4A0120C0                        lbu             r2,AXCstart
513
FFFFFFFFFFFFB230        BE110E69                        bne             r1,r2,ctxstart1
514 43 robfinch
 
515
                                                 ;
516
                                                 ; set system vectors
517
                                                 ; TBA defaults to zero on reset
518
                                                 ;
519 46 robfinch
FFFFFFFFFFFFB234        E0C00000                        setlo   r3,#0
520
FFFFFFFFFFFFB238        E08001FF                        setlo   r2,#511
521
FFFFFFFFFFFFB23C        9A00FB38                        lea             r1,nmirout
522
FFFFFFFFFFFFB240                                 csj5:
523
FFFFFFFFFFFFB240        66308000                        sw              r1,[r3]
524
FFFFFFFFFFFFB244        0A318008                        addui   r3,r3,#8
525
FFFFFFFFFFFFB248        BE017FCF                        loop    r2,csj5
526
FFFFFFFFFFFFB24C        E6BFB8A8                ; SETLO
527
FFFFFFFFFFFFB250        6A0D042D                        lea             r1,VideoSC              ; Video BIOS vector
528
FFFFFFFFFFFFB254        66008CD0                        sw              r1,0xCD0
529
FFFFFFFFFFFFB258        9A008000                        lea             r1,SCCARDSC             ; SD Card BIOS vector
530
FFFFFFFFFFFFB25C        66008CE8                        sw              r1,0xCE8
531
FFFFFFFFFFFFB260        E6BFBAA8                ; SETLO
532
FFFFFFFFFFFFB264        6A0D042D                        lea             r1,RTCSC                ; Real time clock vector
533
FFFFFFFFFFFFB268        66008D00                        sw              r1,0xD00
534
FFFFFFFFFFFFB26C        E6BFBB14                ; SETLO
535
FFFFFFFFFFFFB270        6A0D042D                        lea             r1,KeybdSC              ; keyboard BIOS vector
536
FFFFFFFFFFFFB274        66008D08                        sw              r1,0xD08
537
FFFFFFFFFFFFB278        9A00FA5C                        lea             r1,irqrout
538
FFFFFFFFFFFFB27C        66008E08                        sw              r1,0xE08                ; set IRQ vector
539
FFFFFFFFFFFFB280        9A00FB94                        lea             r1,ui_irout
540
FFFFFFFFFFFFB284        66008F78                        sw              r1,0xF78                ; set unimplemented instruction vector
541
FFFFFFFFFFFFB288        9A00F9BC                        lea             r1,dberr_rout
542
FFFFFFFFFFFFB28C        66008FE0                        sw              r1,0xFE0                ; set Bus error vector
543
FFFFFFFFFFFFB290        9A00F9A4                        lea             r1,iberr_rout
544
FFFFFFFFFFFFB294        66008FE8                        sw              r1,0xFE8                ; set Bus error vector
545
FFFFFFFFFFFFB298        9A00FB38                        lea             r1,nmirout
546
FFFFFFFFFFFFB29C        66008FF0                        sw              r1,0xFF0                ; set NMI vector
547 43 robfinch
 
548 46 robfinch
                                                 ; set system interrupt hook vectors
549
 
550
FFFFFFFFFFFFB2A0        E6BFBBC0                ; SETLO
551
FFFFFFFFFFFFB2A4        6A0D042D                        lea             r1,KeybdIRQ
552
FFFFFFFFFFFFB2A8        6600B008                        sw              r1,keybdIRQvec
553
FFFFFFFFFFFFB2AC        E6BFBDCC                ; SETLO
554
FFFFFFFFFFFFB2B0        6A0D042D                        lea             r1,Pulse100
555
FFFFFFFFFFFFB2B4        6600B000                        sw              r1,p100IRQvec
556
FFFFFFFFFFFFB2B8        E6BFB768                ; SETLO
557
FFFFFFFFFFFFB2BC        6A0D042D                        lea             r1,SerialIRQ
558
FFFFFFFFFFFFB2C0        6600B010                        sw              r1,serialIRQvec
559
FFFFFFFFFFFFB2C4        9A00D1AC                        lea             r1,RasterIRQfn
560
FFFFFFFFFFFFB2C8        6600B018                        sw              r1,rasterIRQvec
561
 
562 43 robfinch
                                                        ;-------------------------------
563
                                                        ; Initialize I/O devices
564
                                                        ;-------------------------------
565 46 robfinch
FFFFFFFFFFFFB2CC        E69CFFFF                ; SETLO
566
FFFFFFFFFFFFB2D0        EE800003                ; SETMID
567
FFFFFFFFFFFFB2D4        6A0D0424                        inbu    r1,CONFIGREC
568
FFFFFFFFFFFFB2D8        2A108824                        bfext   r1,r1,#4,#4
569
FFFFFFFFFFFFB2DC        BE100048                        beq             r1,r0,skip5
570
FFFFFFFFFFFFB2E0        31FFEF3A                        call    tmp_init
571
FFFFFFFFFFFFB2E4                                 skip5:
572
FFFFFFFFFFFFB2E4        E69CFFFF                ; SETLO
573
FFFFFFFFFFFFB2E8        EE800003                ; SETMID
574
FFFFFFFFFFFFB2EC        6A0D0424                        inbu    r1,CONFIGREC
575
FFFFFFFFFFFFB2F0        2A108A2C                        bfext   r1,r1,#5,#5
576
FFFFFFFFFFFFB2F4        BE100048                        beq             r1,r0,skip4
577
FFFFFFFFFFFFB2F8        31FFED3C                        call    SerialInit
578
FFFFFFFFFFFFB2FC                                 skip4:
579
FFFFFFFFFFFFB2FC        31FFEEEB                        call    KeybdInit
580
FFFFFFFFFFFFB300        31FFED34                        call    PICInit
581
FFFFFFFFFFFFB304        31FFF453                        call    SetupRasterIRQ
582
FFFFFFFFFFFFB308        00000040                        cli                                             ; enable interrupts
583 43 robfinch
                                                 ;      call    HelloWorld
584 46 robfinch
FFFFFFFFFFFFB30C        E0C000CE                        setlo   r3,#0xCE                ; blue on blue
585
FFFFFFFFFFFFB310        62019414                        sc              r3,ScreenColor
586
FFFFFFFFFFFFB314        62019410                        sc              r3,CharColor
587
FFFFFFFFFFFFB318        42019414                        lc              r3,0x1414
588
FFFFFFFFFFFFB31C        E0C00020                        setlo   r3,#32
589
FFFFFFFFFFFFB320        62019416                        sc              r3,0x1416               ; we do a store, then a load through the dcache
590
FFFFFFFFFFFFB324        42011416                        lc              r2,0x1416               ;
591
FFFFFFFFFFFFB328        BE218048                        beq             r2,r3,dcokay
592
FFFFFFFFFFFFB32C        0000000D                        dcache_off                              ; data cache failed
593
FFFFFFFFFFFFB330                                 dcokay:
594
FFFFFFFFFFFFB330        620020A8                        sc              r0,NextToRunTCB
595
FFFFFFFFFFFFB334        620020A6                        sc              r0,RunningTCB
596
FFFFFFFFFFFFB338        16008002                        lw              r1,#2                   ; get rid of startup keyboard glitchs by trying to get a character
597
FFFFFFFFFFFFB33C        0181D097                        syscall #417
598
FFFFFFFFFFFFB340        16008002                        lw              r1,#2                   ; get rid of startup keyboard glitchs by trying to get a character
599
FFFFFFFFFFFFB344        0181D097                        syscall #417
600 43 robfinch
 
601 46 robfinch
                                                        ; wait for screen to be available
602
FFFFFFFFFFFFB348        31FFF011                        call    ClearScreen
603
FFFFFFFFFFFFB34C        31FFEFFC                        call    ClearBmpScreen
604 43 robfinch
 
605 46 robfinch
                                                 ; Test whether or not the sprite controller is present. Skip
606
                                                 ; Initialization if it isn't.
607
 
608
FFFFFFFFFFFFB350        E69CFFFF                ; SETLO
609
FFFFFFFFFFFFB354        EE800003                ; SETMID
610
FFFFFFFFFFFFB358        6A0D0420                        inb             r1,CONFIGREC
611
FFFFFFFFFFFFB35C        2A108004                        bfext   r1,r1,#0,#0
612
FFFFFFFFFFFFB360        BE100048                        beq             r1,r0,skip1
613
FFFFFFFFFFFFB364        31FFF3A7                        call    RandomizeSprram
614
FFFFFFFFFFFFB368                                 skip1:
615
 
616
FFFFFFFFFFFFB368        60001417                        sb              r0,CursorRow
617
FFFFFFFFFFFFB36C        60001418                        sb              r0,CursorCol
618
FFFFFFFFFFFFB370        16008001                        lw              r1,#1
619
FFFFFFFFFFFFB374        6000941A                        sb              r1,CursorFlash
620
FFFFFFFFFFFFB378        E6BFB4AD                ; SETLO
621
FFFFFFFFFFFFB37C        6A0D042D                        lea             r1,MSGSTART
622
FFFFFFFFFFFFB380        31FFF130                        call    DisplayStringCRLF
623
 
624
                                                 ; Test whether or not sound generator is present
625
                                                 ; skip initialization and beep if not present
626
 
627
FFFFFFFFFFFFB384        E69CFFFF                ; SETLO
628
FFFFFFFFFFFFB388        EE800003                ; SETMID
629
FFFFFFFFFFFFB38C        6A0D0420                        inb             r1,CONFIGREC
630
FFFFFFFFFFFFB390        2A108414                        bfext   r1,r1,#2,#2
631
FFFFFFFFFFFFB394        BE1000E8                        beq             r1,r0,skip2
632
FFFFFFFFFFFFB398        31FFF3B1                        call    SetupAC97               ; and Beep
633
FFFFFFFFFFFFB39C        16008004                        lw              r1,#4
634
FFFFFFFFFFFFB3A0        E69C0600                ; SETLO
635
FFFFFFFFFFFFB3A4        EE800003                ; SETMID
636
FFFFFFFFFFFFB3A8        6A0D0428                        outb    r1,LED
637
FFFFFFFFFFFFB3AC        31FFF3DB                        call    Beep
638
FFFFFFFFFFFFB3B0                                 skip2:
639
 
640
FFFFFFFFFFFFB3B0        E6BFB428                ; SETLO
641
FFFFFFFFFFFFB3B4        6A0D042D                        lea             r1,context1disp ; start a display
642
FFFFFFFFFFFFB3B8        6600A0D8                        sw              r1,ctx1start
643
 
644
                                                 ; Startup Ethernet access ?
645 43 robfinch
                                                 ;
646 46 robfinch
FFFFFFFFFFFFB3BC        E69CFFFF                ; SETLO
647
FFFFFFFFFFFFB3C0        EE800003                ; SETMID
648
FFFFFFFFFFFFB3C4        6A0D0420                        inb             r1,CONFIGREC
649
FFFFFFFFFFFFB3C8        2A10820C                        bfext   r1,r1,#1,#1
650
FFFFFFFFFFFFB3CC        BE100068                        beq             r1,r0,skip3
651
FFFFFFFFFFFFB3D0        9A00DD3C                        lea             r1,eth_main
652
FFFFFFFFFFFFB3D4        6600A0E0                        sw              r1,ctx2start
653
FFFFFFFFFFFFB3D8                                 skip3:
654 43 robfinch
 
655 46 robfinch
FFFFFFFFFFFFB3D8        9A00CDD0                        lea             r1,RandomLines
656
FFFFFFFFFFFFB3DC        6600A0E8                        sw              r1,ctx3start
657
FFFFFFFFFFFFB3E0        31FFF54E                        call    spi_init
658
FFFFFFFFFFFFB3E4        BE100069                        bne             r1,r0,skip_spi_read
659
FFFFFFFFFFFFB3E8        31FFF59D                        call    spi_read_boot
660
FFFFFFFFFFFFB3EC        31FFF605                        call    loadBootFile
661
FFFFFFFFFFFFB3F0                                 skip_spi_read:
662
FFFFFFFFFFFFB3F0        33FFF20A                        jmp             Monitor
663
 
664
FFFFFFFFFFFFB3F4                                 j4:
665
FFFFFFFFFFFFB3F4        33FFF20A                        jmp             Monitor
666
FFFFFFFFFFFFB3F8        BE007FEA                        bra             j4
667
 
668
                                                 ; The contexts wait for a context startup address to be placed in the
669
                                                 ; startup table. Once an address is in the table, a call to the context
670
                                                 ; code will be made. The default is a NULL pointer, which
671
                                                 ; causes the context to loop around back to here while waiting for a
672
                                                 ; code to run.
673
                                                 ;
674
FFFFFFFFFFFFB3FC                                 ctxstart1:
675
FFFFFFFFFFFFB3FC        9A00A0D0                        lea             r1,ctx0start    ; r1 = context start table base
676
FFFFFFFFFFFFB400        02010568                        mfspr   r2,AXC                  ; r2 = index into start table
677
FFFFFFFFFFFFB404        6A110703                        lw              r1,[r1+r2*8]    ; r1 = context start address
678
FFFFFFFFFFFFB408        BE100048                        beq             r1,r0,ctx12
679
FFFFFFFFFFFFB40C        341F8000                        jal             lr,[r1]                 ; perform a call to the context code
680
 
681
                                                 ; We might as well move to the next context, since there's nothing
682
                                                 ; to do. This can be accomplished by tirggering a IRQ interrupt.
683
                                                 ; We can't just increment the excution pattern pointer, because that
684
                                                 ; would only switch the register set and not the program counter.
685
                                                 ; An interrupt saves the program counter, and restores it from the
686
                                                 ; IPC context register.
687
                                                 ;
688
FFFFFFFFFFFFB410                                 ctx12:
689
FFFFFFFFFFFFB410        00000040                        sei                                     ; causes a priv violation. don't allow interrupts during syscall
690
FFFFFFFFFFFFB414        DE000000                        nop                                     ; wait for sei to take effect
691
FFFFFFFFFFFFB418        DE000000                        nop
692
FFFFFFFFFFFFB41C        DE000000                        nop
693
FFFFFFFFFFFFB420        0181E097                        syscall #EX_IRQ
694
FFFFFFFFFFFFB424        BE007ECA                        bra             ctxstart1
695
 
696 27 robfinch
                                                 ;      call    ramtest
697
 
698 46 robfinch
FFFFFFFFFFFFB428                                 context1disp:
699
 
700
                                                 ; once we've started, clear the start vector so that the context
701
                                                 ; isn't continuously restarted.
702
                                                 ;
703
FFFFFFFFFFFFB428        660020D8                        sw              r0,ctx1start
704
FFFFFFFFFFFFB42C        E6900000                ; SETLO
705
FFFFFFFFFFFFB430        EE800003                ; SETMID
706
FFFFFFFFFFFFB434        6A0D0C2D                        lea             r3,TEXTSCR
707
FFFFFFFFFFFFB438        16008056                        lw              r1,#'V'
708
FFFFFFFFFFFFB43C        1601014A                        lw              r2,#330
709
FFFFFFFFFFFFB440        1602002F                        lw              r4,#47
710
FFFFFFFFFFFFB444        31FFF063                        call    AsciiToScreen
711
FFFFFFFFFFFFB448                                 ctx11:
712
FFFFFFFFFFFFB448        6A310421                        inch    r1,[r3+r2]
713
FFFFFFFFFFFFB44C        0A108001                        addui   r1,r1,#1
714
FFFFFFFFFFFFB450        6A310429                        outc    r1,[r3+r2]
715
FFFFFFFFFFFFB454        0A2100A8                        addui   r2,r2,#168
716
FFFFFFFFFFFFB458        BE027F8F                        loop    r4,ctx11
717
FFFFFFFFFFFFB45C        BE007E6A                        bra             context1disp
718
 
719 27 robfinch
                                                 ;-----------------------------------------
720
                                                 ; Hello World!
721
                                                 ;-----------------------------------------
722 46 robfinch
FFFFFFFFFFFFB460                                 HelloWorld:
723
FFFFFFFFFFFFB460        0FEF0018                        subui   r30,r30,#24
724
FFFFFFFFFFFFB464        67E08000                        sw              r1,[sp]
725
FFFFFFFFFFFFB468        67E10008                        sw              r2,8[sp]
726
FFFFFFFFFFFFB46C        67EF8010                        sw              lr,16[sp]
727
FFFFFFFFFFFFB470        E6BFB4A0                ; SETLO
728
FFFFFFFFFFFFB474        6A0D082D                        lea             r2,MSG
729
FFFFFFFFFFFFB478                                 j3:
730
FFFFFFFFFFFFB478        40208000                        lb              r1,[r2]
731
FFFFFFFFFFFFB47C        BE100088                        beq             r1,r0,j2
732
FFFFFFFFFFFFB480        31FFED5C                        call    SerialPutChar
733
FFFFFFFFFFFFB484        0A210001                        addui   r2,r2,#1
734
FFFFFFFFFFFFB488        BE007F8A                        bra             j3
735
FFFFFFFFFFFFB48C                                 j2:
736
FFFFFFFFFFFFB48C        67EF8010                        sw              lr,16[sp]
737
FFFFFFFFFFFFB490        67E10008                        sw              r2,8[sp]
738
FFFFFFFFFFFFB494        67E08000                        sw              r1,[sp]
739
FFFFFFFFFFFFB498        37EF8018                        ret             #24
740 27 robfinch
 
741
 
742 46 robfinch
FFFFFFFFFFFFB498 0000000037EF8018               align   16
743
FFFFFFFFFFFFB4A0                                        align   16
744
FFFFFFFFFFFFB4A0                                 MSG:
745
FFFFFFFFFFFFB4A0 6F57206F6C6C6548               db      "Hello World!",0
746
FFFFFFFFFFFFB4AD                                 MSGSTART:
747
FFFFFFFFFFFFB4A8 7061520021646C72               db      "Raptor64 system starting....",0
748
FFFFFFFFFFFFB4B0 7973203436726F74
749
FFFFFFFFFFFFB4B8 617473206D657473
750
FFFFFFFFFFFFB4C0 2E2E2E676E697472
751 27 robfinch
 
752 46 robfinch
FFFFFFFFFFFFB4C8 000000000000002E               align 16
753
FFFFFFFFFFFFB4D0                                        align 16
754 27 robfinch
 
755
                                                 ;----------------------------------------------------------
756
                                                 ; Initialize programmable interrupt controller (PIC)
757 46 robfinch
                                                 ;  0 = nmi (parity error)
758 27 robfinch
                                                 ;  1 = keyboard reset
759 43 robfinch
                                                 ;  2 = 1000Hz pulse (context switcher)
760
                                                 ;  3 = 100Hz pulse (cursor flash)
761 46 robfinch
                                                 ;  4 = ethmac
762 43 robfinch
                                                 ;  8 = uart
763
                                                 ; 13 = raster interrupt
764 27 robfinch
                                                 ; 15 = keyboard char
765
                                                 ;----------------------------------------------------------
766 46 robfinch
FFFFFFFFFFFFB4D0                                 PICInit:
767
FFFFFFFFFFFFB4D0        E6BFB4EC                ; SETLO
768
FFFFFFFFFFFFB4D4        6A0D042D                        lea             r1,PICret
769
FFFFFFFFFFFFB4D8        66009030                        sw              r1,TickIRQAddr
770 43 robfinch
                                                        ; enable: raster irq,
771 46 robfinch
FFFFFFFFFFFFB4DC        E07F800F                        setlo   r1,#0x800F      ; enable nmi,kbd_rst,and kbd_irq
772 43 robfinch
                                                        ; A10F enable serial IRQ
773 46 robfinch
FFFFFFFFFFFFB4E0        E69C0FF2                ; SETLO
774
FFFFFFFFFFFFB4E4        EE800003                ; SETMID
775
FFFFFFFFFFFFB4E8        6A0D0429                        outc    r1,PIC_IE
776
FFFFFFFFFFFFB4EC                                 PICret:
777
FFFFFFFFFFFFB4EC        37EF8000                        ret
778 27 robfinch
 
779 43 robfinch
                                                 ;==============================================================================
780
                                                 ; Serial port
781
                                                 ;==============================================================================
782 27 robfinch
                                                 ;-----------------------------------------
783 43 robfinch
                                                 ; Initialize the serial port
784 27 robfinch
                                                 ;-----------------------------------------
785 43 robfinch
                                                 ;
786 46 robfinch
FFFFFFFFFFFFB4F0                                 SerialInit:
787
FFFFFFFFFFFFB4F0        62001800                        sc              r0,Uart_rxhead          ; reset buffer indexes
788
FFFFFFFFFFFFB4F4        62001802                        sc              r0,Uart_rxtail
789
FFFFFFFFFFFFB4F8        E04001F0                        setlo   r1,#0x1f0
790
FFFFFFFFFFFFB4FC        62009810                        sc              r1,Uart_foff            ; set threshold for XOFF
791
FFFFFFFFFFFFB500        E0400010                        setlo   r1,#0x010
792
FFFFFFFFFFFFB504        6200980E                        sc              r1,Uart_fon                     ; set threshold for XON
793
FFFFFFFFFFFFB508        E0400001                        setlo   r1,#1
794
FFFFFFFFFFFFB50C        E69C0A04                ; SETLO
795
FFFFFFFFFFFFB510        EE800003                ; SETMID
796
FFFFFFFFFFFFB514        6A0D0428                        outb    r1,UART_IE                      ; enable receive interrupt only
797
FFFFFFFFFFFFB518        60001809                        sb              r0,Uart_rxrts           ; no RTS/CTS signals available
798
FFFFFFFFFFFFB51C        60001812                        sb              r0,Uart_txrts           ; no RTS/CTS signals available
799
FFFFFFFFFFFFB520        60001813                        sb              r0,Uart_txdtr           ; no DTR signals available
800
FFFFFFFFFFFFB524        6000180A                        sb              r0,Uart_rxdtr           ; no DTR signals available
801
FFFFFFFFFFFFB528        E0400001                        setlo   r1,#1
802
FFFFFFFFFFFFB52C        60009814                        sb              r1,Uart_txxon           ; for now
803
FFFFFFFFFFFFB530        37EF8000                        ret
804 27 robfinch
 
805 43 robfinch
                                                 ;---------------------------------------------------------------------------------
806
                                                 ; Get character directly from serial port. Blocks until a character is available.
807
                                                 ;---------------------------------------------------------------------------------
808
                                                 ;
809 46 robfinch
FFFFFFFFFFFFB534                                 SerialGetCharDirect:
810
FFFFFFFFFFFFB534                                 sgc1:
811
FFFFFFFFFFFFB534        E69C0A01                ; SETLO
812
FFFFFFFFFFFFB538        EE800003                ; SETMID
813
FFFFFFFFFFFFB53C        6A0D0420                        inb             r1,UART_LS              ; uart status
814
FFFFFFFFFFFFB540        14108001                        andi    r1,r1,#rxfull   ; is there a char available ?
815
FFFFFFFFFFFFB544        BE107F88                        beq             r1,r0,sgc1
816
FFFFFFFFFFFFB548        E69C0A00                ; SETLO
817
FFFFFFFFFFFFB54C        EE800003                ; SETMID
818
FFFFFFFFFFFFB550        6A0D0420                        inb             r1,UART
819
FFFFFFFFFFFFB554        37EF8000                        ret
820 43 robfinch
 
821
                                                 ;------------------------------------------------
822
                                                 ; Check for a character at the serial port
823
                                                 ; returns r1 = 1 if char available, 0 otherwise
824
                                                 ;------------------------------------------------
825
                                                 ;
826 46 robfinch
FFFFFFFFFFFFB558                                 SerialCheckForCharDirect:
827
FFFFFFFFFFFFB558        E69C0A01                ; SETLO
828
FFFFFFFFFFFFB55C        EE800003                ; SETMID
829
FFFFFFFFFFFFB560        6A0D0420                        inb             r1,UART_LS              ; uart status
830
FFFFFFFFFFFFB564        14108001                        andi    r1,r1,#rxfull   ; is there a char available ?
831
FFFFFFFFFFFFB568        04100439                        sne             r1,r1,r0
832
FFFFFFFFFFFFB56C        37EF8000                        ret
833 43 robfinch
 
834 27 robfinch
                                                 ;-----------------------------------------
835
                                                 ; Put character to serial port
836 43 robfinch
                                                 ; r1 = char to put
837 27 robfinch
                                                 ;-----------------------------------------
838 43 robfinch
                                                 ;
839 46 robfinch
FFFFFFFFFFFFB570                                 SerialPutChar:
840
FFFFFFFFFFFFB570        0FEF0020                        subui   sp,sp,#32
841
FFFFFFFFFFFFB574        67E10000                        sw              r2,[sp]
842
FFFFFFFFFFFFB578        67E18008                        sw              r3,8[sp]
843
FFFFFFFFFFFFB57C        67E20010                        sw              r4,16[sp]
844
FFFFFFFFFFFFB580        67E28018                        sw              r5,24[sp]
845
FFFFFFFFFFFFB584        E69C0A06                ; SETLO
846
FFFFFFFFFFFFB588        EE800003                ; SETMID
847
FFFFFFFFFFFFB58C        6A0D0820                        inb             r2,UART_MC
848
FFFFFFFFFFFFB590        16210003                        ori             r2,r2,#3                ; assert DTR / RTS
849
FFFFFFFFFFFFB594        E69C0A06                ; SETLO
850
FFFFFFFFFFFFB598        EE800003                ; SETMID
851
FFFFFFFFFFFFB59C        6A0D0828                        outb    r2,UART_MC
852
FFFFFFFFFFFFB5A0        40011812                        lb              r2,Uart_txrts
853
FFFFFFFFFFFFB5A4        BE200168                        beq             r2,r0,spcb1
854
FFFFFFFFFFFFB5A8        46021400                        lw              r4,Milliseconds
855
FFFFFFFFFFFFB5AC        E0C00064                        setlo   r3,#100                 ; delay count (1 s)
856
FFFFFFFFFFFFB5B0                                 spcb3:
857
FFFFFFFFFFFFB5B0        80011808                        inb             r2,UART_MS
858
FFFFFFFFFFFFB5B4        1421000A                        andi    r2,r2,#10               ; is CTS asserted ?
859
FFFFFFFFFFFFB5B8        BE2000C9                        bne             r2,r0,spcb1
860
FFFFFFFFFFFFB5BC        46029400                        lw              r5,Milliseconds
861
FFFFFFFFFFFFB5C0        BE42FF88                        beq             r4,r5,spcb3
862
FFFFFFFFFFFFB5C4        02520009                        mov             r4,r5
863
FFFFFFFFFFFFB5C8        BE01FF4F                        loop    r3,spcb3
864
FFFFFFFFFFFFB5CC        BE00046A                        bra             spcabort
865
FFFFFFFFFFFFB5D0                                 spcb1:
866
FFFFFFFFFFFFB5D0        40011813                        lb              r2,Uart_txdtr
867
FFFFFFFFFFFFB5D4        BE200168                        beq             r2,r0,spcb2
868
FFFFFFFFFFFFB5D8        46021400                        lw              r4,Milliseconds
869
FFFFFFFFFFFFB5DC        E0C00064                        setlo   r3,#100                 ; delay count
870
FFFFFFFFFFFFB5E0                                 spcb4:
871
FFFFFFFFFFFFB5E0        80011808                        inb             r2,UART_MS
872
FFFFFFFFFFFFB5E4        14210014                        andi    r2,r2,#20               ; is DSR asserted ?
873
FFFFFFFFFFFFB5E8        BE2000C9                        bne             r2,r0,spcb2
874
FFFFFFFFFFFFB5EC        46029400                        lw              r5,Milliseconds
875
FFFFFFFFFFFFB5F0        BE42FF88                        beq             r4,r5,spcb4
876
FFFFFFFFFFFFB5F4        02520009                        mov             r4,r5
877
FFFFFFFFFFFFB5F8        BE01FF4F                        loop    r3,spcb4
878
FFFFFFFFFFFFB5FC        BE0002EA                        bra             spcabort
879
FFFFFFFFFFFFB600                                 spcb2:
880
FFFFFFFFFFFFB600        40011814                        lb              r2,Uart_txxon
881
FFFFFFFFFFFFB604        BE2000C8                        beq             r2,r0,spcb5
882
FFFFFFFFFFFFB608                                 spcb6:
883
FFFFFFFFFFFFB608        40011815                        lb              r2,Uart_txxonoff
884
FFFFFFFFFFFFB60C        BE200088                        beq             r2,r0,spcb5
885
FFFFFFFFFFFFB610        80021808                        inb             r4,UART_MS
886
FFFFFFFFFFFFB614        14420080                        andi    r4,r4,#0x80                     ; DCD ?
887
FFFFFFFFFFFFB618        BE407F89                        bne             r4,r0,spcb6
888
FFFFFFFFFFFFB61C                                 spcb5:
889
FFFFFFFFFFFFB61C        46021400                        lw              r4,Milliseconds
890
FFFFFFFFFFFFB620        E0C00064                        setlo   r3,#100                         ; wait up to 1s
891
FFFFFFFFFFFFB624                                 spcb8:
892
FFFFFFFFFFFFB624        E69C0A01                ; SETLO
893
FFFFFFFFFFFFB628        EE800003                ; SETMID
894
FFFFFFFFFFFFB62C        6A0D0820                        inb             r2,UART_LS
895
FFFFFFFFFFFFB630        14210020                        andi    r2,r2,#0x20                     ; tx not full ?
896
FFFFFFFFFFFFB634        BE2000C9                        bne             r2,r0,spcb7
897
FFFFFFFFFFFFB638        46029400                        lw              r5,Milliseconds
898
FFFFFFFFFFFFB63C        BE42FF48                        beq             r4,r5,spcb8
899
FFFFFFFFFFFFB640        02520009                        mov             r4,r5
900
FFFFFFFFFFFFB644        BE01FF0F                        loop    r3,spcb8
901
FFFFFFFFFFFFB648        BE00008A                        bra             spcabort
902
FFFFFFFFFFFFB64C                                 spcb7:
903
FFFFFFFFFFFFB64C        E69C0A00                ; SETLO
904
FFFFFFFFFFFFB650        EE800003                ; SETMID
905
FFFFFFFFFFFFB654        6A0D0428                        outb    r1,UART
906
FFFFFFFFFFFFB658                                 spcabort:
907
FFFFFFFFFFFFB658        47E10000                        lw              r2,[sp]
908
FFFFFFFFFFFFB65C        47E18008                        lw              r3,8[sp]
909
FFFFFFFFFFFFB660        47E20010                        lw              r4,16[sp]
910
FFFFFFFFFFFFB664        47E28018                        lw              r5,24[sp]
911
FFFFFFFFFFFFB668        37EF8020                        ret             #32
912 27 robfinch
 
913 43 robfinch
                                                 ;-------------------------------------------------
914
                                                 ; Compute number of characters in recieve buffer.
915
                                                 ; r4 = number of chars
916
                                                 ;-------------------------------------------------
917 46 robfinch
FFFFFFFFFFFFB66C                                 CharsInRxBuf:
918
FFFFFFFFFFFFB66C        42021800                        lc              r4,Uart_rxhead
919
FFFFFFFFFFFFB670        42011802                        lc              r2,Uart_rxtail
920
FFFFFFFFFFFFB674        04411005                        subu    r4,r4,r2
921
FFFFFFFFFFFFB678        BE4000A3                        bgt             r4,r0,cirxb1
922
FFFFFFFFFFFFB67C        E1000200                        setlo   r4,#0x200
923
FFFFFFFFFFFFB680        04411003                        addu    r4,r4,r2
924
FFFFFFFFFFFFB684        42011800                        lc              r2,Uart_rxhead
925
FFFFFFFFFFFFB688        04411005                        subu    r4,r4,r2
926
FFFFFFFFFFFFB68C                                 cirxb1:
927
FFFFFFFFFFFFB68C        37EF8000                        ret
928 43 robfinch
 
929
                                                 ;----------------------------------------------
930
                                                 ; Get character from rx fifo
931
                                                 ; If the fifo is empty enough then send an XON
932
                                                 ;----------------------------------------------
933
                                                 ;
934 46 robfinch
FFFFFFFFFFFFB690                                 SerialGetChar:
935
FFFFFFFFFFFFB690        0FEF0020                        subui   sp,sp,#32
936
FFFFFFFFFFFFB694        67E10000                        sw              r2,[sp]
937
FFFFFFFFFFFFB698        67E18008                        sw              r3,8[sp]
938
FFFFFFFFFFFFB69C        67E20010                        sw              r4,16[sp]
939
FFFFFFFFFFFFB6A0        67EF8018                        sw              lr,24[sp]
940
FFFFFFFFFFFFB6A4        42019800                        lc              r3,Uart_rxhead
941
FFFFFFFFFFFFB6A8        42011802                        lc              r2,Uart_rxtail
942
FFFFFFFFFFFFB6AC        BE218528                        beq             r2,r3,sgcfifo1  ; is there a char available ?
943
FFFFFFFFFFFFB6B0        9A019600                        lea             r3,Uart_rxfifo
944
FFFFFFFFFFFFB6B4        6A218400                        lb              r1,[r2+r3]              ; get the char from the fifo into r1
945
FFFFFFFFFFFFB6B8        0A210001                        addui   r2,r2,#1                ; increment the fifo pointer
946
FFFFFFFFFFFFB6BC        142101FF                        andi    r2,r2,#0x1ff
947
FFFFFFFFFFFFB6C0        62011802                        sc              r2,Uart_rxtail
948
FFFFFFFFFFFFB6C4        4001180C                        lb              r2,Uart_rxflow  ; using flow control ?
949
FFFFFFFFFFFFB6C8        BE2003A8                        beq             r2,r0,sgcfifo2
950
FFFFFFFFFFFFB6CC        4201980E                        lc              r3,Uart_fon             ; enough space in Rx buffer ?
951
FFFFFFFFFFFFB6D0        31FFED9B                        call    CharsInRxBuf
952
FFFFFFFFFFFFB6D4        BE418343                        bgt             r4,r3,sgcfifo2
953
FFFFFFFFFFFFB6D8        6000180C                        sb              r0,Uart_rxflow  ; flow off
954
FFFFFFFFFFFFB6DC        40021809                        lb              r4,Uart_rxrts
955
FFFFFFFFFFFFB6E0        BE400108                        beq             r4,r0,sgcfifo3
956
FFFFFFFFFFFFB6E4        E69C0A06                ; SETLO
957
FFFFFFFFFFFFB6E8        EE800003                ; SETMID
958
FFFFFFFFFFFFB6EC        6A0D1020                        inb             r4,UART_MC              ; set rts bit in MC
959
FFFFFFFFFFFFB6F0        16420002                        ori             r4,r4,#2
960
FFFFFFFFFFFFB6F4        E69C0A06                ; SETLO
961
FFFFFFFFFFFFB6F8        EE800003                ; SETMID
962
FFFFFFFFFFFFB6FC        6A0D1028                        outb    r4,UART_MC
963
FFFFFFFFFFFFB700                                 sgcfifo3:
964
FFFFFFFFFFFFB700        4002180A                        lb              r4,Uart_rxdtr
965
FFFFFFFFFFFFB704        BE400108                        beq             r4,r0,sgcfifo4
966
FFFFFFFFFFFFB708        E69C0A06                ; SETLO
967
FFFFFFFFFFFFB70C        EE800003                ; SETMID
968
FFFFFFFFFFFFB710        6A0D1020                        inb             r4,UART_MC              ; set DTR
969
FFFFFFFFFFFFB714        16420001                        ori             r4,r4,#1
970
FFFFFFFFFFFFB718        E69C0A06                ; SETLO
971
FFFFFFFFFFFFB71C        EE800003                ; SETMID
972
FFFFFFFFFFFFB720        6A0D1028                        outb    r4,UART_MC
973
FFFFFFFFFFFFB724                                 sgcfifo4:
974
FFFFFFFFFFFFB724        4002180B                        lb              r4,Uart_rxxon
975
FFFFFFFFFFFFB728        BE4000A8                        beq             r4,r0,sgcfifo5
976
FFFFFFFFFFFFB72C        E1000011                        setlo   r4,#XON
977
FFFFFFFFFFFFB730        E69C0A00                ; SETLO
978
FFFFFFFFFFFFB734        EE800003                ; SETMID
979
FFFFFFFFFFFFB738        6A0D1028                        outb    r4,UART
980
FFFFFFFFFFFFB73C                                 sgcfifo5:
981
FFFFFFFFFFFFB73C                                 sgcfifo2:                                      ; return with char in r1
982
FFFFFFFFFFFFB73C        47E10000                        lw              r2,[sp]
983
FFFFFFFFFFFFB740        47E18008                        lw              r3,8[sp]
984
FFFFFFFFFFFFB744        47E20010                        lw              r4,16[sp]
985
FFFFFFFFFFFFB748        47EF8018                        lw              lr,24[sp]
986
FFFFFFFFFFFFB74C        37EF8020                        ret             #32
987
FFFFFFFFFFFFB750                                 sgcfifo1:
988
FFFFFFFFFFFFB750        E07FFFFF                        setlo   r1,#-1                  ; no char available
989
FFFFFFFFFFFFB754        47E10000                        lw              r2,[sp]
990
FFFFFFFFFFFFB758        47E18008                        lw              r3,8[sp]
991
FFFFFFFFFFFFB75C        47E20010                        lw              r4,16[sp]
992
FFFFFFFFFFFFB760        47EF8018                        lw              lr,24[sp]
993
FFFFFFFFFFFFB764        37EF8020                        ret             #32
994 43 robfinch
 
995
                                                 ;-----------------------------------------
996
                                                 ; Serial port IRQ
997
                                                 ;-----------------------------------------
998
                                                 ;
999 46 robfinch
FFFFFFFFFFFFB768                                 SerialIRQ:
1000
FFFFFFFFFFFFB768        0FEF0028                        subui   sp,sp,#40
1001
FFFFFFFFFFFFB76C        67E08000                        sw              r1,[sp]
1002
FFFFFFFFFFFFB770        67E10008                        sw              r2,8[sp]
1003
FFFFFFFFFFFFB774        67E18010                        sw              r3,16[sp]
1004
FFFFFFFFFFFFB778        67E20018                        sw              r4,24[sp]
1005
FFFFFFFFFFFFB77C        67EF8020                        sw              lr,32[sp]
1006
FFFFFFFFFFFFB780        E69C0A03                ; SETLO
1007
FFFFFFFFFFFFB784        EE800003                ; SETMID
1008
FFFFFFFFFFFFB788        6A0D0420                        inb             r1,UART_IS              ; get interrupt status
1009
FFFFFFFFFFFFB78C        BE1000A1                        bge             r1,r0,sirq1
1010
FFFFFFFFFFFFB790        1410807F                        andi    r1,r1,#0x7f             ; switch on interrupt type
1011
FFFFFFFFFFFFB794        B0100D04                        beqi    r1,#4,srxirq
1012
FFFFFFFFFFFFB798        B0100B0C                        beqi    r1,#0xC,stxirq
1013
FFFFFFFFFFFFB79C        B0100710                        beqi    r1,#0x10,smsirq
1014
FFFFFFFFFFFFB7A0                                 sirq1:
1015
FFFFFFFFFFFFB7A0        47E08000                        lw              r1,[sp]
1016
FFFFFFFFFFFFB7A4        47E10008                        lw              r2,8[sp]
1017
FFFFFFFFFFFFB7A8        47E18010                        lw              r3,16[sp]
1018
FFFFFFFFFFFFB7AC        47E20018                        lw              r4,24[sp]
1019
FFFFFFFFFFFFB7B0        47EF8020                        lw              lr,32[sp]
1020
FFFFFFFFFFFFB7B4        37EF8028                        ret             #40
1021 43 robfinch
 
1022
                                                 ; Get the modem status and record it
1023 46 robfinch
FFFFFFFFFFFFB7B8                                 smsirq:
1024
FFFFFFFFFFFFB7B8        80009808                        inb             r1,UART_MS
1025
FFFFFFFFFFFFB7BC        60009808                        sb              r1,Uart_ms
1026
FFFFFFFFFFFFB7C0        BE007F0A                        bra             sirq1
1027 43 robfinch
 
1028 46 robfinch
FFFFFFFFFFFFB7C4                                 stxirq:
1029
FFFFFFFFFFFFB7C4        BE007EEA                        bra             sirq1
1030 43 robfinch
 
1031
                                                 ; Get a character from the uart and store it in the rx fifo
1032 46 robfinch
FFFFFFFFFFFFB7C8                                 srxirq:
1033
FFFFFFFFFFFFB7C8                                 srxirq1:
1034
FFFFFFFFFFFFB7C8        E69C0A00                ; SETLO
1035
FFFFFFFFFFFFB7CC        EE800003                ; SETMID
1036
FFFFFFFFFFFFB7D0        6A0D0420                        inb             r1,UART                         ; get the char (clears interrupt)
1037
FFFFFFFFFFFFB7D4        40011814                        lb              r2,Uart_txxon
1038
FFFFFFFFFFFFB7D8        BE200108                        beq             r2,r0,srxirq3
1039
FFFFFFFFFFFFB7DC        B2100413                        bnei    r1,#XOFF,srxirq2
1040
FFFFFFFFFFFFB7E0        E0400001                        setlo   r1,#1
1041
FFFFFFFFFFFFB7E4        60009815                        sb              r1,Uart_txxonoff
1042
FFFFFFFFFFFFB7E8        BE00016A                        bra             srxirq5
1043
FFFFFFFFFFFFB7EC                                 srxirq2:
1044
FFFFFFFFFFFFB7EC        B2100311                        bnei    r1,#XON,srxirq3
1045
FFFFFFFFFFFFB7F0        60001815                        sb              r0,Uart_txxonoff
1046
FFFFFFFFFFFFB7F4        BE00010A                        bra             srxirq5
1047
FFFFFFFFFFFFB7F8                                 srxirq3:
1048
FFFFFFFFFFFFB7F8        60001815                        sb              r0,Uart_txxonoff
1049
FFFFFFFFFFFFB7FC        42011800                        lc              r2,Uart_rxhead
1050
FFFFFFFFFFFFB800        9A019600                        lea             r3,Uart_rxfifo
1051
FFFFFFFFFFFFB804        6A310410                        sb              r1,[r3+r2]                      ; store in buffer
1052
FFFFFFFFFFFFB808        0A210001                        addui   r2,r2,#1
1053
FFFFFFFFFFFFB80C        142101FF                        andi    r2,r2,#0x1ff
1054
FFFFFFFFFFFFB810        62011800                        sc              r2,Uart_rxhead
1055
FFFFFFFFFFFFB814                                 srxirq5:
1056
FFFFFFFFFFFFB814        E69C0A01                ; SETLO
1057
FFFFFFFFFFFFB818        EE800003                ; SETMID
1058
FFFFFFFFFFFFB81C        6A0D0420                        inb             r1,UART_LS                      ; check for another ready character
1059
FFFFFFFFFFFFB820        14108001                        andi    r1,r1,#rxfull
1060
FFFFFFFFFFFFB824        BE107D29                        bne             r1,r0,srxirq1
1061
FFFFFFFFFFFFB828        4000980C                        lb              r1,Uart_rxflow          ; are we using flow controls?
1062
FFFFFFFFFFFFB82C        BE1003C9                        bne             r1,r0,srxirq8
1063
FFFFFFFFFFFFB830        31FFED9B                        call    CharsInRxBuf
1064
FFFFFFFFFFFFB834        42009810                        lc              r1,Uart_foff
1065
FFFFFFFFFFFFB838        BE408360                        blt             r4,r1,srxirq8
1066
FFFFFFFFFFFFB83C        E0400001                        setlo   r1,#1
1067
FFFFFFFFFFFFB840        6000980C                        sb              r1,Uart_rxflow
1068
FFFFFFFFFFFFB844        40009809                        lb              r1,Uart_rxrts
1069
FFFFFFFFFFFFB848        BE100108                        beq             r1,r0,srxirq6
1070
FFFFFFFFFFFFB84C        E69C0A06                ; SETLO
1071
FFFFFFFFFFFFB850        EE800003                ; SETMID
1072
FFFFFFFFFFFFB854        6A0D0420                        inb             r1,UART_MC
1073
FFFFFFFFFFFFB858        141080FD                        andi    r1,r1,#0xFD             ; turn off RTS
1074
FFFFFFFFFFFFB85C        E69C0A06                ; SETLO
1075
FFFFFFFFFFFFB860        EE800003                ; SETMID
1076
FFFFFFFFFFFFB864        6A0D0428                        outb    r1,UART_MC
1077
FFFFFFFFFFFFB868                                 srxirq6:
1078
FFFFFFFFFFFFB868        4000980A                        lb              r1,Uart_rxdtr
1079
FFFFFFFFFFFFB86C        BE100108                        beq             r1,r0,srxirq7
1080
FFFFFFFFFFFFB870        E69C0A06                ; SETLO
1081
FFFFFFFFFFFFB874        EE800003                ; SETMID
1082
FFFFFFFFFFFFB878        6A0D0420                        inb             r1,UART_MC
1083
FFFFFFFFFFFFB87C        141080FE                        andi    r1,r1,#0xFE             ; turn off DTR
1084
FFFFFFFFFFFFB880        E69C0A06                ; SETLO
1085
FFFFFFFFFFFFB884        EE800003                ; SETMID
1086
FFFFFFFFFFFFB888        6A0D0428                        outb    r1,UART_MC
1087
FFFFFFFFFFFFB88C                                 srxirq7:
1088
FFFFFFFFFFFFB88C        4000980B                        lb              r1,Uart_rxxon
1089
FFFFFFFFFFFFB890        BE1000A8                        beq             r1,r0,srxirq8
1090
FFFFFFFFFFFFB894        E0400013                        setlo   r1,#XOFF
1091
FFFFFFFFFFFFB898        E69C0A00                ; SETLO
1092
FFFFFFFFFFFFB89C        EE800003                ; SETMID
1093
FFFFFFFFFFFFB8A0        6A0D0428                        outb    r1,UART
1094
FFFFFFFFFFFFB8A4                                 srxirq8:
1095
FFFFFFFFFFFFB8A4        BE0077EA                        bra             sirq1
1096 43 robfinch
 
1097 27 robfinch
                                                 ;==============================================================================
1098 46 robfinch
                                                 ; Video BIOS
1099
                                                 ; Video interrupt #410
1100
                                                 ;
1101
                                                 ; Function in R1
1102
                                                 ; 0x02 = Set Cursor Position   r2 = row, r3 = col
1103
                                                 ; 0x03 = Get Cursor position   returns r1 = row, r2 = col
1104
                                                 ; 0x06 = Scroll screen up
1105
                                                 ; 0x09 = Display character+attribute, r2=char, r3=attrib, r4=#times
1106
                                                 ; 0x0A = Display character, r2 = char, r3 = # times
1107
                                                 ; 0x0C = Display Pixel r2 = x, r3 = y, r4 = color
1108
                                                 ; 0x0D = Get pixel  r2 = x, r3 = y
1109
                                                 ; 0x14 = Display String        r2 = pointer to string
1110
                                                 ; 0x15 = Display number r2 = number, r3 = # digits
1111
                                                 ; 0x16 = Display String + CRLF   r2 = pointer to string
1112
                                                 ; 0x17 = Display Word r2 as hex = word
1113
                                                 ; 0x18 = Display Half word as hex r2 = half word
1114
                                                 ; 0x19 = Display Charr char in hex r2 = char
1115
                                                 ; 0x1A = Display Byte in hex r2 = byte
1116
                                                 ;==============================================================================
1117
                                                 ;
1118
FFFFFFFFFFFFB8A8                                 VideoSC:
1119
FFFFFFFFFFFFB8A8        020D0568                        mfspr   r26,AXC                         ; get context
1120
FFFFFFFFFFFFB8AC        07AD0606                        shlui   r26,r26,#3                      ; *8
1121
FFFFFFFFFFFFB8B0        67AF2200                        sw              sp,sp_saves[r26]        ; save sp in save area
1122
FFFFFFFFFFFFB8B4        07AD1006                        shlui   r26,r26,#8                      ; 2k for stack
1123
FFFFFFFFFFFFB8B8        03AF0009                        mov             sp,r26
1124
FFFFFFFFFFFFB8BC        E6808000                ; SETLO
1125
FFFFFFFFFFFFB8C0        EE800400                ; SETMID
1126
FFFFFFFFFFFFB8C4        05ED7803                        addui   sp,sp,#0x100008000      ; base stacks address
1127
FFFFFFFFFFFFB8C8        0FEF0008                        subui   sp,sp,#8
1128
FFFFFFFFFFFFB8CC        67EF8000                        sw              lr,[sp]
1129
FFFFFFFFFFFFB8D0                                 Video1:
1130
FFFFFFFFFFFFB8D0        020F80B4                        omgi    lr,#VIDEOGATE
1131
FFFFFFFFFFFFB8D4        BFF07FE9                        bne             lr,r0,Video1
1132
FFFFFFFFFFFFB8D8        B0100D02                        beqi    r1,#0x02,Video_x02
1133
FFFFFFFFFFFFB8DC        B0101003                        beqi    r1,#0x03,Video_x03
1134
FFFFFFFFFFFFB8E0        B0101206                        beqi    r1,#0x06,Video_x06
1135
FFFFFFFFFFFFB8E4        B0101309                        beqi    r1,#0x09,Video_x09
1136
FFFFFFFFFFFFB8E8        B010170A                        beqi    r1,#0x0A,Video_x0A
1137
FFFFFFFFFFFFB8EC        B0101A0C                        beqi    r1,#0x0C,Video_x0C
1138
FFFFFFFFFFFFB8F0        B010270C                        beqi    r1,#0x0C,Video_x0D
1139
FFFFFFFFFFFFB8F4        B0103B14                        beqi    r1,#0x14,Video_x14
1140
FFFFFFFFFFFFB8F8        B0103D15                        beqi    r1,#0x15,Video_x15
1141
FFFFFFFFFFFFB8FC        B0104016                        beqi    r1,#0x16,Video_x16
1142
FFFFFFFFFFFFB900        B0104217                        beqi    r1,#0x17,Video_x17
1143
FFFFFFFFFFFFB904        B010441A                        beqi    r1,#0x1A,Video_x1A
1144
FFFFFFFFFFFFB908        BE0008CA                        bra             VideoRet
1145
 
1146
FFFFFFFFFFFFB90C                                 Video_x02:
1147
FFFFFFFFFFFFB90C        60011417                        sb              r2,CursorRow
1148
FFFFFFFFFFFFB910        60019418                        sb              r3,CursorCol
1149
FFFFFFFFFFFFB914        31FFF06F                        call    CalcScreenLoc
1150
FFFFFFFFFFFFB918        BE00084A                        bra             VideoRet
1151
 
1152
FFFFFFFFFFFFB91C                                 Video_x03:
1153
FFFFFFFFFFFFB91C        4A009417                        lbu             r1,CursorRow
1154
FFFFFFFFFFFFB920        4A011418                        lbu             r2,CursorCol
1155
FFFFFFFFFFFFB924        BE0007EA                        bra             VideoRet
1156
 
1157
FFFFFFFFFFFFB928                                 Video_x06:
1158
FFFFFFFFFFFFB928        31FFF02E                        call    ScrollUp
1159
FFFFFFFFFFFFB92C        BE0007AA                        bra             VideoRet
1160
 
1161
FFFFFFFFFFFFB930                                 Video_x09:
1162
FFFFFFFFFFFFB930        62019410                        sc              r3,CharColor
1163
FFFFFFFFFFFFB934        02208009                        mov             r1,r2
1164
FFFFFFFFFFFFB938                                 Video_x09a:
1165
FFFFFFFFFFFFB938        31FFF07F                        call    DisplayChar
1166
FFFFFFFFFFFFB93C        BE027FEF                        loop    r4,Video_x09a
1167
FFFFFFFFFFFFB940        BE00070A                        bra             VideoRet
1168
 
1169
FFFFFFFFFFFFB944                                 Video_x0A:
1170
FFFFFFFFFFFFB944        02208009                        mov             r1,r2
1171
FFFFFFFFFFFFB948                                 Video_x0Aa:
1172
FFFFFFFFFFFFB948        31FFF07F                        call    DisplayChar
1173
FFFFFFFFFFFFB94C        BE01FFEF                        loop    r3,Video_x0Aa
1174
FFFFFFFFFFFFB950        BE00068A                        bra             VideoRet
1175
 
1176
FFFFFFFFFFFFB954                                 Video_x0C:
1177
FFFFFFFFFFFFB954        E69AE008                ; SETLO
1178
FFFFFFFFFFFFB958        EE800003                ; SETMID
1179
FFFFFFFFFFFFB95C        6A0D0812                        sh              r2,GACCEL+8             ; x0
1180
FFFFFFFFFFFFB960        E69AE00C                ; SETLO
1181
FFFFFFFFFFFFB964        EE800003                ; SETMID
1182
FFFFFFFFFFFFB968        6A0D0C12                        sh              r3,GACCEL+12    ; y0
1183
FFFFFFFFFFFFB96C        E69AE000                ; SETLO
1184
FFFFFFFFFFFFB970        EE800003                ; SETMID
1185
FFFFFFFFFFFFB974        6A0D1012                        sh              r4,GACCEL+0             ; color
1186
FFFFFFFFFFFFB978        16008001                        lw              r1,#1
1187
FFFFFFFFFFFFB97C        E69AE03C                ; SETLO
1188
FFFFFFFFFFFFB980        EE800003                ; SETMID
1189
FFFFFFFFFFFFB984        6A0D0412                        sh              r1,GACCEL+60    ; DRAW PIXEL command
1190
FFFFFFFFFFFFB988        BE0004CA                        bra             VideoRet
1191
 
1192
FFFFFFFFFFFFB98C                                 Video_x0D:
1193
FFFFFFFFFFFFB98C        E69AE008                ; SETLO
1194
FFFFFFFFFFFFB990        EE800003                ; SETMID
1195
FFFFFFFFFFFFB994        6A0D0812                        sh              r2,GACCEL+8             ; x0
1196
FFFFFFFFFFFFB998        E69AE00C                ; SETLO
1197
FFFFFFFFFFFFB99C        EE800003                ; SETMID
1198
FFFFFFFFFFFFB9A0        6A0D0C12                        sh              r3,GACCEL+12    ; y0
1199
FFFFFFFFFFFFB9A4        16008008                        lw              r1,#8
1200
FFFFFFFFFFFFB9A8        E69AE03C                ; SETLO
1201
FFFFFFFFFFFFB9AC        EE800003                ; SETMID
1202
FFFFFFFFFFFFB9B0        6A0D0412                        sh              r1,GACCEL+60    ; GET PIXEL command
1203
FFFFFFFFFFFFB9B4        DE000000                        nop                                             ; let command start
1204
FFFFFFFFFFFFB9B8        DE000000                        nop
1205
FFFFFFFFFFFFB9BC        DE000000                        nop
1206
FFFFFFFFFFFFB9C0                                 vxd1:
1207
FFFFFFFFFFFFB9C0        E69AE038                ; SETLO
1208
FFFFFFFFFFFFB9C4        EE800003                ; SETMID
1209
FFFFFFFFFFFFB9C8        6A0D0407                        lhu             r1,GACCEL+56    ; wait for state = IDLE
1210
FFFFFFFFFFFFB9CC        BE107FA9                        bne             r1,r0,vxd1
1211
FFFFFFFFFFFFB9D0        E69AE034                ; SETLO
1212
FFFFFFFFFFFFB9D4        EE800003                ; SETMID
1213
FFFFFFFFFFFFB9D8        6A0D0407                        lhu             r1,GACCEL+52
1214
FFFFFFFFFFFFB9DC        BE00022A                        bra             VideoRet
1215
 
1216
FFFFFFFFFFFFB9E0                                 Video_x14:
1217
FFFFFFFFFFFFB9E0        02208009                        mov             r1,r2
1218
FFFFFFFFFFFFB9E4        31FFF122                        call    DisplayString
1219
FFFFFFFFFFFFB9E8        BE0001CA                        bra             VideoRet
1220
 
1221
FFFFFFFFFFFFB9EC                                 Video_x15:
1222
FFFFFFFFFFFFB9EC        02208009                        mov             r1,r2
1223
FFFFFFFFFFFFB9F0        02310009                        mov             r2,r3
1224
FFFFFFFFFFFFB9F4        31FFF13F                        call    DisplayNum
1225
FFFFFFFFFFFFB9F8        BE00014A                        bra             VideoRet
1226
 
1227
FFFFFFFFFFFFB9FC                                 Video_x16:
1228
FFFFFFFFFFFFB9FC        02208009                        mov             r1,r2
1229
FFFFFFFFFFFFBA00        31FFF130                        call    DisplayStringCRLF
1230
FFFFFFFFFFFFBA04        BE0000EA                        bra             VideoRet
1231
 
1232
FFFFFFFFFFFFBA08                                 Video_x17:
1233
FFFFFFFFFFFFBA08        02208009                        mov             r1,r2
1234
FFFFFFFFFFFFBA0C        31FFF169                        call    DisplayWord
1235
FFFFFFFFFFFFBA10        BE00008A                        bra             VideoRet
1236
 
1237
FFFFFFFFFFFFBA14                                 Video_x1A:
1238
FFFFFFFFFFFFBA14        02208009                        mov             r1,r2
1239
FFFFFFFFFFFFBA18        31FFF14B                        call    DisplayByte
1240
FFFFFFFFFFFFBA1C        BE00002A                        bra             VideoRet
1241
 
1242
FFFFFFFFFFFFBA20                                 VideoRet:
1243
FFFFFFFFFFFFBA20        020000B5                        cmgi    #VIDEOGATE
1244
FFFFFFFFFFFFBA24        47EF8000                        lw              lr,[sp]
1245
FFFFFFFFFFFFBA28        020D0568                        mfspr   r26,AXC                         ; get context
1246
FFFFFFFFFFFFBA2C        07AD0606                        shlui   r26,r26,#3                      ; *8
1247
FFFFFFFFFFFFBA30        47AF2200                        lw              sp,sp_saves[r26]        ; get back the stack
1248
FFFFFFFFFFFFBA34        01800021                        eret
1249
 
1250
                                                 ;==============================================================================
1251
                                                 ; BIOS interrupt #413
1252
                                                 ; 0x00  initialize
1253
                                                 ; 0x01 read sector             r2 = sector #, r3 = pointer to buffer
1254
                                                 ; 0x02 write sector
1255
                                                 ;==============================================================================
1256
                                                 ;
1257
FFFFFFFFFFFFBA38                                 SDCARDSC:
1258
FFFFFFFFFFFFBA38        020D0568                        mfspr   r26,AXC                         ; get context
1259
FFFFFFFFFFFFBA3C        07AD0606                        shlui   r26,r26,#3                      ; *8
1260
FFFFFFFFFFFFBA40        67AF2200                        sw              sp,sp_saves[r26]        ; save sp in save area
1261
FFFFFFFFFFFFBA44        07AD1006                        shlui   r26,r26,#8                      ; 2k for stack
1262
FFFFFFFFFFFFBA48        03AF0009                        mov             sp,r26
1263
FFFFFFFFFFFFBA4C        E6808000                ; SETLO
1264
FFFFFFFFFFFFBA50        EE800400                ; SETMID
1265
FFFFFFFFFFFFBA54        05ED7803                        addui   sp,sp,#0x100008000      ; base stacks address
1266
FFFFFFFFFFFFBA58        0FEF0008                        subui   sp,sp,#8
1267
FFFFFFFFFFFFBA5C        67EF8000                        sw              lr,[sp]
1268
FFFFFFFFFFFFBA60                                 SDC_1:
1269
FFFFFFFFFFFFBA60        020F80F4                        omgi    lr,#CARDGATE
1270
FFFFFFFFFFFFBA64        BFF07FE9                        bne             lr,r0,SDC_1
1271
FFFFFFFFFFFFBA68        B0100400                        beqi    r1,#0,SDC_x00
1272
FFFFFFFFFFFFBA6C        B0100501                        beqi    r1,#1,SDC_x01
1273
FFFFFFFFFFFFBA70        B0100802                        beqi    r1,#2,SDC_x02
1274
FFFFFFFFFFFFBA74        BE0000EA                        bra             SDCRet
1275
FFFFFFFFFFFFBA78                                 SDC_x00:
1276
FFFFFFFFFFFFBA78        31FFF54E                        call    spi_init
1277
FFFFFFFFFFFFBA7C        BE0000AA                        bra             SDCRet
1278
FFFFFFFFFFFFBA80                                 SDC_x01:
1279
FFFFFFFFFFFFBA80        02208009                        mov             r1,r2
1280
FFFFFFFFFFFFBA84        02310009                        mov             r2,r3
1281
FFFFFFFFFFFFBA88        31FFF56D                        call    spi_read_sector
1282
FFFFFFFFFFFFBA8C        BE00002A                        bra             SDCRet
1283
FFFFFFFFFFFFBA90                                 SDC_x02:
1284
FFFFFFFFFFFFBA90                                 SDCRet:
1285
FFFFFFFFFFFFBA90        020000F5                        cmgi    #CARDGATE
1286
FFFFFFFFFFFFBA94        47EF8000                        lw              lr,[sp]
1287
FFFFFFFFFFFFBA98        020D0568                        mfspr   r26,AXC                         ; get context
1288
FFFFFFFFFFFFBA9C        07AD0606                        shlui   r26,r26,#3                      ; *8
1289
FFFFFFFFFFFFBAA0        47AF2200                        lw              sp,sp_saves[r26]        ; get back the stack
1290
FFFFFFFFFFFFBAA4        01800021                        eret
1291
 
1292
                                                 ;==============================================================================
1293
                                                 ; Real time clock BIOS
1294
                                                 ; BIOS interrupt #416
1295
                                                 ;
1296
                                                 ; Function
1297
                                                 ; 0x00 = get system tick
1298
                                                 ; 0x01 = get date/time
1299
                                                 ; 0x02 = set date/time
1300
                                                 ;==============================================================================
1301
                                                 ;
1302
FFFFFFFFFFFFBAA8                                 RTCSC:
1303
FFFFFFFFFFFFBAA8        020D0568                        mfspr   r26,AXC                         ; get context
1304
FFFFFFFFFFFFBAAC        07AD0606                        shlui   r26,r26,#3                      ; *8
1305
FFFFFFFFFFFFBAB0        67AF2200                        sw              sp,sp_saves[r26]        ; save sp in save area
1306
FFFFFFFFFFFFBAB4        07AD1006                        shlui   r26,r26,#8                      ; 2k for stack
1307
FFFFFFFFFFFFBAB8        03AF0009                        mov             sp,r26
1308
FFFFFFFFFFFFBABC        E6808000                ; SETLO
1309
FFFFFFFFFFFFBAC0        EE800400                ; SETMID
1310
FFFFFFFFFFFFBAC4        05ED7803                        addui   sp,sp,#0x100008000      ; base stacks address
1311
FFFFFFFFFFFFBAC8        0FEF0008                        subui   sp,sp,#8
1312
FFFFFFFFFFFFBACC        67EF8000                        sw              lr,[sp]
1313
                                                        ;
1314
FFFFFFFFFFFFBAD0        B0100200                        beqi    r1,#0x00,RTC_x00
1315
FFFFFFFFFFFFBAD4        B0100301                        beqi    r1,#0x01,RTC_x01
1316
FFFFFFFFFFFFBAD8                                 RTC_x00:
1317
FFFFFFFFFFFFBAD8        020085A8                        mfspr   r1,TICK
1318
FFFFFFFFFFFFBADC        BE00012A                        bra             RTCRet
1319
FFFFFFFFFFFFBAE0                                 RTC_x01:
1320
FFFFFFFFFFFFBAE0        E69C0418                ; SETLO
1321
FFFFFFFFFFFFBAE4        EE800003                ; SETMID
1322
FFFFFFFFFFFFBAE8        6A0D002B                        outw    r0,DATETIME+24          ; trigger a snapshot
1323
FFFFFFFFFFFFBAEC        DE000000                        nop
1324
FFFFFFFFFFFFBAF0        E69C0400                ; SETLO
1325
FFFFFFFFFFFFBAF4        EE800003                ; SETMID
1326
FFFFFFFFFFFFBAF8        6A0D0423                        inw             r1,DATETIME                     ; get the snapshotted date and time
1327
FFFFFFFFFFFFBAFC        BE00002A                        bra             RTCRet
1328
FFFFFFFFFFFFBB00                                 RTCRet:
1329
FFFFFFFFFFFFBB00        47EF8000                        lw              lr,[sp]
1330
FFFFFFFFFFFFBB04        020D0568                        mfspr   r26,AXC                         ; get context
1331
FFFFFFFFFFFFBB08        07AD0606                        shlui   r26,r26,#3                      ; *8
1332
FFFFFFFFFFFFBB0C        47AF2200                        lw              sp,sp_saves[r26]        ; get back the stack
1333
FFFFFFFFFFFFBB10        01800021                        eret
1334
 
1335
                                                 ;==============================================================================
1336 43 robfinch
                                                 ; Keyboard BIOS
1337
                                                 ; BIOS interrupt #417
1338
                                                 ;
1339
                                                 ; Function in R1
1340 46 robfinch
                                                 ; 0x00 = initialize keyboard
1341
                                                 ; 0x01 = set keyboard echo
1342
                                                 ; 0x02 = get keyboard character from buffer
1343
                                                 ; 0x03 = check for key available in buffer
1344
                                                 ; 0x04 = check for key directly at keyboard port
1345
                                                 ; 0x05 = get keyboard character directly from keyboard port (blocks)
1346 27 robfinch
                                                 ;==============================================================================
1347 43 robfinch
                                                 ;
1348 46 robfinch
FFFFFFFFFFFFBB14                                 KeybdSC:
1349
FFFFFFFFFFFFBB14        020D0568                        mfspr   r26,AXC                         ; get context
1350
FFFFFFFFFFFFBB18        07AD0606                        shlui   r26,r26,#3                      ; *8
1351
FFFFFFFFFFFFBB1C        67AF2200                        sw              sp,sp_saves[r26]        ; save sp in save area
1352
FFFFFFFFFFFFBB20        07AD1006                        shlui   r26,r26,#8                      ; 2k for stack
1353
FFFFFFFFFFFFBB24        03AF0009                        mov             sp,r26
1354
FFFFFFFFFFFFBB28        E6808000                ; SETLO
1355
FFFFFFFFFFFFBB2C        EE800400                ; SETMID
1356
FFFFFFFFFFFFBB30        05ED7803                        addui   sp,sp,#0x100008000      ; base stacks address
1357
FFFFFFFFFFFFBB34        0FEF0008                        subui   sp,sp,#8
1358
FFFFFFFFFFFFBB38        67EF8000                        sw              lr,[sp]
1359
FFFFFFFFFFFFBB3C                                 kbdsc5:
1360
FFFFFFFFFFFFBB3C        020F8074                        omgi    lr,#KEYBDGATE
1361
FFFFFFFFFFFFBB40        BFF07FE9                        bne             lr,r0,kbdsc5
1362
FFFFFFFFFFFFBB44        B0100700                        beqi    r1,#0,kbd_x00
1363
FFFFFFFFFFFFBB48        B0100801                        beqi    r1,#1,kbd_x01
1364
FFFFFFFFFFFFBB4C        B0100A02                        beqi    r1,#2,kbd_x02
1365
FFFFFFFFFFFFBB50        B0100B03                        beqi    r1,#3,kbd_x03
1366
FFFFFFFFFFFFBB54        B0100C04                        beqi    r1,#4,kbd_x04
1367
FFFFFFFFFFFFBB58        B0100D05                        beqi    r1,#5,kbd_x05
1368
FFFFFFFFFFFFBB5C        BE0001CA                        bra             kbdscRet
1369
FFFFFFFFFFFFBB60                                 kbd_x00:
1370
FFFFFFFFFFFFBB60        31FFEEEB                        call    KeybdInit
1371
FFFFFFFFFFFFBB64        BE00018A                        bra             kbdscRet
1372
FFFFFFFFFFFFBB68                                 kbd_x01:
1373
FFFFFFFFFFFFBB68        02208009                        mov             r1,r2
1374
FFFFFFFFFFFFBB6C        31FFEF05                        call    SetKeyboardEcho
1375
FFFFFFFFFFFFBB70        BE00012A                        bra             kbdscRet
1376
FFFFFFFFFFFFBB74                                 kbd_x02:
1377
FFFFFFFFFFFFBB74        31FFEF07                        call    KeybdGetChar
1378
FFFFFFFFFFFFBB78        BE0000EA                        bra             kbdscRet
1379
FFFFFFFFFFFFBB7C                                 kbd_x03:
1380
FFFFFFFFFFFFBB7C        31FFEF1C                        call    KeybdCheckForKey
1381
FFFFFFFFFFFFBB80        BE0000AA                        bra             kbdscRet
1382
FFFFFFFFFFFFBB84                                 kbd_x04:
1383
FFFFFFFFFFFFBB84        31FFEF20                        call    KeybdCheckForKeyDirect
1384
FFFFFFFFFFFFBB88        BE00006A                        bra             kbdscRet
1385
FFFFFFFFFFFFBB8C                                 kbd_x05:
1386
FFFFFFFFFFFFBB8C        31FFEF25                        call    KeybdGetCharDirect
1387
FFFFFFFFFFFFBB90        BE00002A                        bra             kbdscRet
1388
FFFFFFFFFFFFBB94                                 kbdscRet:
1389
FFFFFFFFFFFFBB94        02000075                        cmgi    #KEYBDGATE
1390
FFFFFFFFFFFFBB98        47EF8000                        lw              lr,[sp]
1391
FFFFFFFFFFFFBB9C        020D0568                        mfspr   r26,AXC                         ; get context
1392
FFFFFFFFFFFFBBA0        07AD0606                        shlui   r26,r26,#3                      ; *8
1393
FFFFFFFFFFFFBBA4        47AF2200                        lw              sp,sp_saves[r26]        ; get back the stack
1394
FFFFFFFFFFFFBBA8        01800021                        eret
1395 43 robfinch
 
1396 27 robfinch
                                                 ;------------------------------------------------------------------------------
1397
                                                 ; Initialize keyboard
1398
                                                 ;------------------------------------------------------------------------------
1399 46 robfinch
FFFFFFFFFFFFBBAC                                 KeybdInit:
1400
FFFFFFFFFFFFBBAC        60001450                        sb              r0,KeybdHead
1401
FFFFFFFFFFFFBBB0        60001451                        sb              r0,KeybdTail
1402
FFFFFFFFFFFFBBB4        E0400001                        setlo   r1,#1                   ; turn on keyboard echo
1403
FFFFFFFFFFFFBBB8        6000941C                        sb              r1,KeybdEcho
1404
FFFFFFFFFFFFBBBC        37EF8000                        ret
1405 27 robfinch
 
1406
                                                 ;------------------------------------------------------------------------------
1407
                                                 ; Normal keyboard interrupt, the lowest priority interrupt in the system.
1408
                                                 ; Grab the character from the keyboard device and store it in a buffer.
1409
                                                 ;------------------------------------------------------------------------------
1410
                                                 ;
1411 46 robfinch
FFFFFFFFFFFFBBC0                                 KeybdIRQ:
1412
FFFFFFFFFFFFBBC0        0FEF0008                        subui   sp,sp,#8
1413
FFFFFFFFFFFFBBC4        67E10000                        sw              r2,[sp]
1414
FFFFFFFFFFFFBBC8        4A009450                        lbu             r1,KeybdHead
1415
FFFFFFFFFFFFBBCC        1410800F                        andi    r1,r1,#0x0f                             ; r1 = index into buffer
1416
FFFFFFFFFFFFBBD0                                 KeybdIRQa:
1417
FFFFFFFFFFFFBBD0        E69C0000                ; SETLO
1418
FFFFFFFFFFFFBBD4        EE800003                ; SETMID
1419
FFFFFFFFFFFFBBD8        6A0D0821                        inch    r2,KEYBD                                ; get keyboard character
1420
FFFFFFFFFFFFBBDC        E69C0002                ; SETLO
1421
FFFFFFFFFFFFBBE0        EE800003                ; SETMID
1422
FFFFFFFFFFFFBBE4        6A0D0029                        outc    r0,KEYBD+2                              ; clear keyboard strobe (turns off the IRQ)
1423
FFFFFFFFFFFFBBE8        60111440                        sb              r2,KeybdBuffer[r1]              ; store character in buffer
1424
FFFFFFFFFFFFBBEC        0A108001                        addui   r1,r1,#1                                ; increment head index
1425
FFFFFFFFFFFFBBF0        1410800F                        andi    r1,r1,#0x0f
1426
FFFFFFFFFFFFBBF4        60009450                        sb              r1,KeybdHead
1427
FFFFFFFFFFFFBBF8                                 KeybdIRQb:
1428
FFFFFFFFFFFFBBF8        4A011451                        lbu             r2,KeybdTail                    ; check to see if we've collided
1429
FFFFFFFFFFFFBBFC        BE110089                        bne             r1,r2,KeybdIRQc                 ; with the tail
1430
FFFFFFFFFFFFBC00        0A210001                        addui   r2,r2,#1                                ; if so, increment the tail index
1431
FFFFFFFFFFFFBC04        1421000F                        andi    r2,r2,#0x0f                             ; the oldest character will be lost
1432
FFFFFFFFFFFFBC08        60011451                        sb              r2,KeybdTail
1433
FFFFFFFFFFFFBC0C                                 KeybdIRQc:
1434
FFFFFFFFFFFFBC0C        47E10000                        lw              r2,[sp]
1435
FFFFFFFFFFFFBC10        37EF8008                        ret             #8
1436 27 robfinch
 
1437
                                                 ;------------------------------------------------------------------------------
1438
                                                 ; r1 0=echo off, non-zero = echo on
1439
                                                 ;------------------------------------------------------------------------------
1440 46 robfinch
FFFFFFFFFFFFBC14                                 SetKeyboardEcho:
1441
FFFFFFFFFFFFBC14        6000941C                        sb              r1,KeybdEcho
1442
FFFFFFFFFFFFBC18        37EF8000                        ret
1443 27 robfinch
 
1444
                                                 ;-----------------------------------------
1445
                                                 ; Get character from keyboard buffer
1446
                                                 ;-----------------------------------------
1447 46 robfinch
FFFFFFFFFFFFBC1C                                 KeybdGetChar:
1448
FFFFFFFFFFFFBC1C        0FEF0010                        subui   sp,sp,#16
1449
FFFFFFFFFFFFBC20        67E10000                        sw              r2,[sp]
1450
FFFFFFFFFFFFBC24        67EF8008                        sw              lr,8[sp]
1451
FFFFFFFFFFFFBC28        4A011451                        lbu             r2,KeybdTail
1452
FFFFFFFFFFFFBC2C        4A009450                        lbu             r1,KeybdHead
1453
FFFFFFFFFFFFBC30        BE110188                        beq             r1,r2,nochar
1454
FFFFFFFFFFFFBC34        4A209440                        lbu             r1,KeybdBuffer[r2]
1455
FFFFFFFFFFFFBC38        0A210001                        addui   r2,r2,#1
1456
FFFFFFFFFFFFBC3C        1421000F                        andi    r2,r2,#0x0f
1457
FFFFFFFFFFFFBC40        60011451                        sb              r2,KeybdTail
1458
FFFFFFFFFFFFBC44        4001141C                        lb              r2,KeybdEcho
1459
FFFFFFFFFFFFBC48        BE2000E8                        beq             r2,r0,kgc3
1460
FFFFFFFFFFFFBC4C        B210030D                        bnei    r1,#CR,kgc2
1461
FFFFFFFFFFFFBC50        31FFFD80                        call    CRLF                    ; convert CR keystroke into CRLF
1462
FFFFFFFFFFFFBC54        BE00008A                        bra             kgc3
1463
FFFFFFFFFFFFBC58                                 kgc2:
1464
FFFFFFFFFFFFBC58        31FFF07F                        call    DisplayChar
1465
FFFFFFFFFFFFBC5C        BE00004A                        bra             kgc3
1466
FFFFFFFFFFFFBC60                                 nochar:
1467
FFFFFFFFFFFFBC60        E07FFFFF                        setlo   r1,#-1
1468
FFFFFFFFFFFFBC64                                 kgc3:
1469
FFFFFFFFFFFFBC64        47EF8008                        lw              lr,8[sp]
1470
FFFFFFFFFFFFBC68        47E10000                        lw              r2,[sp]
1471
FFFFFFFFFFFFBC6C        37EF8010                        ret             #16
1472 27 robfinch
 
1473
                                                 ;------------------------------------------------------------------------------
1474
                                                 ; Check if there is a keyboard character available in the keyboard buffer.
1475
                                                 ;------------------------------------------------------------------------------
1476
                                                 ;
1477 46 robfinch
FFFFFFFFFFFFBC70                                 KeybdCheckForKey:
1478
FFFFFFFFFFFFBC70        4A009451                        lbu             r1,KeybdTail
1479
FFFFFFFFFFFFBC74        4A011450                        lbu             r2,KeybdHead
1480
FFFFFFFFFFFFBC78        04110439                        sne             r1,r1,r2
1481
FFFFFFFFFFFFBC7C        37EF8000                        ret
1482 27 robfinch
 
1483
                                                 ;------------------------------------------------------------------------------
1484
                                                 ; Check if there is a keyboard character available. If so return true (1)
1485
                                                 ; otherwise return false (0) in r1.
1486
                                                 ;------------------------------------------------------------------------------
1487
                                                 ;
1488 46 robfinch
FFFFFFFFFFFFBC80                                 KeybdCheckForKeyDirect:
1489
FFFFFFFFFFFFBC80        E69C0000                ; SETLO
1490
FFFFFFFFFFFFBC84        EE800003                ; SETMID
1491
FFFFFFFFFFFFBC88        6A0D0421                        inch    r1,KEYBD
1492
FFFFFFFFFFFFBC8C        04100430                        slt             r1,r1,r0
1493
FFFFFFFFFFFFBC90        37EF8000                        ret
1494 27 robfinch
 
1495
                                                 ;------------------------------------------------------------------------------
1496
                                                 ; Get character directly from keyboard. This routine blocks until a key is
1497
                                                 ; available.
1498
                                                 ;------------------------------------------------------------------------------
1499
                                                 ;
1500 46 robfinch
FFFFFFFFFFFFBC94                                 KeybdGetCharDirect:
1501
FFFFFFFFFFFFBC94        0FEF0010                        subui   sp,sp,#16
1502
FFFFFFFFFFFFBC98        67E10000                        sw              r2,[sp]
1503
FFFFFFFFFFFFBC9C        67EF8008                        sw              lr,8[sp]
1504
FFFFFFFFFFFFBCA0        E09C0000                        setlo   r2,KEYBD
1505
FFFFFFFFFFFFBCA4                                 kgc1:
1506
FFFFFFFFFFFFBCA4        E69C0000                ; SETLO
1507
FFFFFFFFFFFFBCA8        EE800003                ; SETMID
1508
FFFFFFFFFFFFBCAC        6A0D0421                        inch    r1,KEYBD
1509
FFFFFFFFFFFFBCB0        BE107FA1                        bge             r1,r0,kgc1
1510
FFFFFFFFFFFFBCB4        E69C0002                ; SETLO
1511
FFFFFFFFFFFFBCB8        EE800003                ; SETMID
1512
FFFFFFFFFFFFBCBC        6A0D0029                        outc    r0,KEYBD+2              ; clear keyboard strobe
1513
FFFFFFFFFFFFBCC0        141080FF                        andi    r1,r1,#0xff             ; remove strobe bit
1514
FFFFFFFFFFFFBCC4        4001141C                        lb              r2,KeybdEcho    ; is keyboard echo on ?
1515
FFFFFFFFFFFFBCC8        BE2000A8                        beq             r2,r0,gk1
1516
FFFFFFFFFFFFBCCC        B210030D                        bnei    r1,#'\r',gk2    ; convert CR keystroke into CRLF
1517
FFFFFFFFFFFFBCD0        31FFFD80                        call    CRLF
1518
FFFFFFFFFFFFBCD4        BE00004A                        bra             gk1
1519
FFFFFFFFFFFFBCD8                                 gk2:
1520
FFFFFFFFFFFFBCD8        31FFF07F                        call    DisplayChar
1521
FFFFFFFFFFFFBCDC                                 gk1:
1522
FFFFFFFFFFFFBCDC        47E10000                        lw              r2,[sp]
1523
FFFFFFFFFFFFBCE0        47EF8008                        lw              lr,8[sp]
1524
FFFFFFFFFFFFBCE4        37EF8010                        ret             #16
1525 27 robfinch
 
1526
                                                 ;==============================================================================
1527
                                                 ;==============================================================================
1528 46 robfinch
FFFFFFFFFFFFBCE8                                 tmp_init:
1529
                                                        ; wait for the rst1626 to go low
1530
FFFFFFFFFFFFBCE8        E6989680                ; SETLO
1531
FFFFFFFFFFFFBCEC        EE800002                ; SETMID
1532
FFFFFFFFFFFFBCF0        040D0809                        lw              r2,#10000000    ; retry for up to several seconds
1533
FFFFFFFFFFFFBCF4                                 tmp_init4:
1534
FFFFFFFFFFFFBCF4        BE2000C8                        beq             r2,r0,tmp_init5
1535
FFFFFFFFFFFFBCF8        0E210001                        subui   r2,r2,#1
1536
FFFFFFFFFFFFBCFC        E69C0302                ; SETLO
1537
FFFFFFFFFFFFBD00        EE800003                ; SETMID
1538
FFFFFFFFFFFFBD04        6A0D0421                        inch    r1,TMP+2        ; read the status reg
1539
FFFFFFFFFFFFBD08        BE107F60                        blt             r1,r0,tmp_init4
1540
FFFFFFFFFFFFBD0C                                 tmp_init5:
1541
 
1542
FFFFFFFFFFFFBD0C        16008051                        lw              r1,#0x51        ; Start temperature conversion
1543
FFFFFFFFFFFFBD10        E69C0300                ; SETLO
1544
FFFFFFFFFFFFBD14        EE800003                ; SETMID
1545
FFFFFFFFFFFFBD18        6A0D0429                        outc    r1,TMP
1546
 
1547
                                                        ; wait a bit for the trigger to take effect
1548
FFFFFFFFFFFFBD1C        160089C4                        lw              r1,#2500
1549
FFFFFFFFFFFFBD20                                 tmp_init1:
1550
FFFFFFFFFFFFBD20        BE00800F                        loop    r1,tmp_init1
1551
 
1552
                                                        ; wait for the rst1626 to go low
1553
FFFFFFFFFFFFBD24        E6989680                ; SETLO
1554
FFFFFFFFFFFFBD28        EE800002                ; SETMID
1555
FFFFFFFFFFFFBD2C        040D0809                        lw              r2,#10000000    ; retry for up to several seconds
1556
FFFFFFFFFFFFBD30                                 tmp_init2:
1557
FFFFFFFFFFFFBD30        BE2000C8                        beq             r2,r0,tmp_init3
1558
FFFFFFFFFFFFBD34        0E210001                        subui   r2,r2,#1
1559
FFFFFFFFFFFFBD38        E69C0302                ; SETLO
1560
FFFFFFFFFFFFBD3C        EE800003                ; SETMID
1561
FFFFFFFFFFFFBD40        6A0D0421                        inch    r1,TMP+2        ; read the status reg
1562
FFFFFFFFFFFFBD44        BE107F60                        blt             r1,r0,tmp_init2
1563
FFFFFFFFFFFFBD48                                 tmp_init3:
1564
FFFFFFFFFFFFBD48        37EF8000                        ret
1565
 
1566
FFFFFFFFFFFFBD4C                                 tmp_read:
1567
FFFFFFFFFFFFBD4C        0FEF0018                        subui   sp,sp,#24
1568
FFFFFFFFFFFFBD50        67EF8000                        sw              lr,[sp]
1569
FFFFFFFFFFFFBD54        67E08008                        sw              r1,8[sp]
1570
FFFFFFFFFFFFBD58        67E10010                        sw              r2,16[sp]
1571
 
1572
FFFFFFFFFFFFBD5C        E6BD7840                ; SETLO
1573
FFFFFFFFFFFFBD60        EE800005                ; SETMID
1574
FFFFFFFFFFFFBD64        040D0409                        lw              r1,#25000000    ; wait about 1 second or so
1575
FFFFFFFFFFFFBD68                                 tmp_read1:
1576
FFFFFFFFFFFFBD68        BE00800F                        loop    r1,tmp_read1
1577
FFFFFFFFFFFFBD6C        160080AC                        lw              r1,#0xAC        ; issue read temperature conversion
1578
FFFFFFFFFFFFBD70        E69C0300                ; SETLO
1579
FFFFFFFFFFFFBD74        EE800003                ; SETMID
1580
FFFFFFFFFFFFBD78        6A0D0429                        outc    r1,TMP
1581
 
1582
                                                        ; wait a bit for the trigger to take effect
1583
FFFFFFFFFFFFBD7C        160089C4                        lw              r1,#2500
1584
FFFFFFFFFFFFBD80                                 tmp_read3:
1585
FFFFFFFFFFFFBD80        BE00800F                        loop    r1,tmp_read3
1586
 
1587
                                                        ; wait for the rst1626 to go low
1588
FFFFFFFFFFFFBD84        E6989680                ; SETLO
1589
FFFFFFFFFFFFBD88        EE800002                ; SETMID
1590
FFFFFFFFFFFFBD8C        040D0809                        lw              r2,#10000000
1591
FFFFFFFFFFFFBD90                                 tmp_read2:
1592
FFFFFFFFFFFFBD90        E69C0302                ; SETLO
1593
FFFFFFFFFFFFBD94        EE800003                ; SETMID
1594
FFFFFFFFFFFFBD98        6A0D0421                        inch    r1,TMP+2        ; read the status reg
1595
FFFFFFFFFFFFBD9C        BE200068                        beq             r2,r0,tmp_read4
1596
FFFFFFFFFFFFBDA0        0E210001                        subui   r2,r2,#1
1597
FFFFFFFFFFFFBDA4        BE107F60                        blt             r1,r0,tmp_read2
1598
FFFFFFFFFFFFBDA8                                 tmp_read4:
1599
FFFFFFFFFFFFBDA8        E69C0302                ; SETLO
1600
FFFFFFFFFFFFBDAC        EE800003                ; SETMID
1601
FFFFFFFFFFFFBDB0        6A0D0421                        inch    r1,TMP+2                ; read the temperature
1602
FFFFFFFFFFFFBDB4        16010005                        lw              r2,#5                   ; five digits
1603
FFFFFFFFFFFFBDB8        31FFF13F                        call    DisplayNum
1604
FFFFFFFFFFFFBDBC        47EF8000                        lw              lr,[sp]
1605
FFFFFFFFFFFFBDC0        47E08008                        lw              r1,8[sp]
1606
FFFFFFFFFFFFBDC4        47E10010                        lw              r2,16[sp]
1607
FFFFFFFFFFFFBDC8        37EF8018                        ret             #24
1608
 
1609
                                                 ;==============================================================================
1610
                                                 ;==============================================================================
1611 27 robfinch
                                                 ;------------------------------------------------------------------------------
1612 43 robfinch
                                                 ; 100 Hz interrupt
1613 27 robfinch
                                                 ; - takes care of "flashing" the cursor
1614
                                                 ;------------------------------------------------------------------------------
1615
                                                 ;
1616 46 robfinch
FFFFFFFFFFFFBDCC                                 Pulse100:
1617
FFFFFFFFFFFFBDCC        0FEF0008                        subui   sp,sp,#8
1618
FFFFFFFFFFFFBDD0        67EF8000                        sw              lr,[sp]
1619
FFFFFFFFFFFFBDD4        E6900000                ; SETLO
1620
FFFFFFFFFFFFBDD8        EE800003                ; SETMID
1621
FFFFFFFFFFFFBDDC        6A0D082D                        lea             r2,TEXTSCR
1622
FFFFFFFFFFFFBDE0        8220814E                        inch    r1,334[r2]
1623
FFFFFFFFFFFFBDE4        0A108001                        addui   r1,r1,#1
1624
FFFFFFFFFFFFBDE8        9220814E                        outc    r1,334[r2]
1625
                                                 ;      call    DisplayDatetime
1626
FFFFFFFFFFFFBDEC        31FFEF82                        call    SelectNextToRunTCB
1627
FFFFFFFFFFFFBDF0        31FFEF84                        call    SwitchTask
1628
FFFFFFFFFFFFBDF4        E69CFFFC                ; SETLO
1629
FFFFFFFFFFFFBDF8        EE800003                ; SETMID
1630
FFFFFFFFFFFFBDFC        6A0D0028                        outb    r0,0xDCFFFC             ; clear interrupt
1631 43 robfinch
                                                 ;      lw              r1,TickIRQAddr
1632
                                                 ;      jal             r31,[r1]
1633
                                                 ;      lw              r1,Milliseconds
1634
                                                 ;      andi    r1,r1,#0x0f
1635
                                                 ;      bnei    r1,#5,p1001
1636
                                                 ;      call    FlashCursor
1637 46 robfinch
FFFFFFFFFFFFBE00                                 p1001:
1638
FFFFFFFFFFFFBE00        47EF8000                        lw              lr,[sp]
1639
FFFFFFFFFFFFBE04        37EF8008                        ret             #8
1640 27 robfinch
 
1641
                                                 ;------------------------------------------------------------------------------
1642 43 robfinch
                                                 ;------------------------------------------------------------------------------
1643 46 robfinch
FFFFFFFFFFFFBE08                                 SelectNextToRunTCB:
1644
FFFFFFFFFFFFBE08        620020A8                        sc              r0,NextToRunTCB
1645
FFFFFFFFFFFFBE0C        37EF8000                        ret
1646 43 robfinch
 
1647
                                                 ;------------------------------------------------------------------------------
1648
                                                 ; Switch from the RunningTCB to the NextToRunTCB
1649
                                                 ;------------------------------------------------------------------------------
1650 46 robfinch
FFFFFFFFFFFFBE10                                 SwitchTask:
1651
FFFFFFFFFFFFBE10        6600A0B0                        sw              r1,r1save
1652
FFFFFFFFFFFFBE14        660120B8                        sw              r2,r2save
1653
FFFFFFFFFFFFBE18        4C00A0A8                        lcu             r1,NextToRunTCB
1654
FFFFFFFFFFFFBE1C        4C0120A6                        lcu             r2,RunningTCB
1655
FFFFFFFFFFFFBE20        BE110089                        bne             r1,r2,swtsk1            ; are we already running this TCB ?
1656
FFFFFFFFFFFFBE24        4600A0B0                        lw              r1,r1save
1657
FFFFFFFFFFFFBE28        460120B8                        lw              r2,r2save
1658
FFFFFFFFFFFFBE2C        37EF8000                        ret
1659
FFFFFFFFFFFFBE30                                 swtsk1:
1660
FFFFFFFFFFFFBE30        142101FF                        andi    r2,r2,#0x1ff            ; max 512 TCB's
1661
FFFFFFFFFFFFBE34        1A210200                        mului   r2,r2,#TCBSize
1662
FFFFFFFFFFFFBE38        E6800000                ; SETLO
1663
FFFFFFFFFFFFBE3C        EE800400                ; SETMID
1664
FFFFFFFFFFFFBE40        042D0803                        addui   r2,r2,#TCBBase
1665
FFFFFFFFFFFFBE44        4600A0B0                        lw              r1,r1save                       ; get back r1
1666
FFFFFFFFFFFFBE48        66208000                        sw              r1,TCBr1[r2]
1667
FFFFFFFFFFFFBE4C        4600A0B8                        lw              r1,r2save                       ; get back r2
1668
FFFFFFFFFFFFBE50        66208008                        sw              r1,TCBr2[r2]
1669
FFFFFFFFFFFFBE54        66218010                        sw              r3,TCBr3[r2]
1670
FFFFFFFFFFFFBE58        66220018                        sw              r4,TCBr4[r2]
1671
FFFFFFFFFFFFBE5C        66228020                        sw              r5,TCBr5[r2]
1672
FFFFFFFFFFFFBE60        66230028                        sw              r6,TCBr6[r2]
1673
FFFFFFFFFFFFBE64        66238030                        sw              r7,TCBr7[r2]
1674
FFFFFFFFFFFFBE68        66240038                        sw              r8,TCBr8[r2]
1675
FFFFFFFFFFFFBE6C        66248040                        sw              r9,TCBr9[r2]
1676
FFFFFFFFFFFFBE70        66250048                        sw              r10,TCBr10[r2]
1677
FFFFFFFFFFFFBE74        66258050                        sw              r11,TCBr11[r2]
1678
FFFFFFFFFFFFBE78        66260058                        sw              r12,TCBr12[r2]
1679
FFFFFFFFFFFFBE7C        66268060                        sw              r13,TCBr13[r2]
1680
FFFFFFFFFFFFBE80        66270068                        sw              r14,TCBr14[r2]
1681
FFFFFFFFFFFFBE84        66278070                        sw              r15,TCBr15[r2]
1682
FFFFFFFFFFFFBE88        66280078                        sw              r16,TCBr16[r2]
1683
FFFFFFFFFFFFBE8C        66288080                        sw              r17,TCBr17[r2]
1684
FFFFFFFFFFFFBE90        66290088                        sw              r18,TCBr18[r2]
1685
FFFFFFFFFFFFBE94        66298090                        sw              r19,TCBr19[r2]
1686
FFFFFFFFFFFFBE98        662A0098                        sw              r20,TCBr20[r2]
1687
FFFFFFFFFFFFBE9C        662A80A0                        sw              r21,TCBr21[r2]
1688
FFFFFFFFFFFFBEA0        662B00A8                        sw              r22,TCBr22[r2]
1689
FFFFFFFFFFFFBEA4        662B80B0                        sw              r23,TCBr23[r2]
1690
FFFFFFFFFFFFBEA8        662C00B8                        sw              r24,TCBr24[r2]
1691
FFFFFFFFFFFFBEAC        662C80C0                        sw              r25,TCBr25[r2]
1692
FFFFFFFFFFFFBEB0        662D00C8                        sw              r26,TCBr26[r2]
1693
FFFFFFFFFFFFBEB4        662D80D0                        sw              r27,TCBr27[r2]
1694
FFFFFFFFFFFFBEB8        662E00D8                        sw              r28,TCBr28[r2]
1695
FFFFFFFFFFFFBEBC        662E80E0                        sw              r29,TCBr29[r2]
1696
FFFFFFFFFFFFBEC0        662F00E8                        sw              r30,TCBr30[r2]
1697
FFFFFFFFFFFFBEC4        662F80F0                        sw              r31,TCBr31[r2]
1698 43 robfinch
 
1699 46 robfinch
FFFFFFFFFFFFBEC8        4C0120A8                        lcu             r2,NextToRunTCB
1700
FFFFFFFFFFFFBECC        620120A6                        sc              r2,RunningTCB
1701
FFFFFFFFFFFFBED0        1A210200                        mului   r2,r2,#TCBSize
1702
FFFFFFFFFFFFBED4        E6800000                ; SETLO
1703
FFFFFFFFFFFFBED8        EE800400                ; SETMID
1704
FFFFFFFFFFFFBEDC        042D0803                        addui   r2,r2,#TCBBase
1705 43 robfinch
 
1706 46 robfinch
FFFFFFFFFFFFBEE0        46208000                        lw              r1,TCBr1[r2]
1707
FFFFFFFFFFFFBEE4        46218010                        lw              r3,TCBr3[r2]
1708
FFFFFFFFFFFFBEE8        46220018                        lw              r4,TCBr4[r2]
1709
FFFFFFFFFFFFBEEC        46228020                        lw              r5,TCBr5[r2]
1710
FFFFFFFFFFFFBEF0        46230028                        lw              r6,TCBr6[r2]
1711
FFFFFFFFFFFFBEF4        46238030                        lw              r7,TCBr7[r2]
1712
FFFFFFFFFFFFBEF8        46240038                        lw              r8,TCBr8[r2]
1713
FFFFFFFFFFFFBEFC        46248040                        lw              r9,TCBr9[r2]
1714
FFFFFFFFFFFFBF00        46250048                        lw              r10,TCBr10[r2]
1715
FFFFFFFFFFFFBF04        46258050                        lw              r11,TCBr11[r2]
1716
FFFFFFFFFFFFBF08        46260058                        lw              r12,TCBr12[r2]
1717
FFFFFFFFFFFFBF0C        46268060                        lw              r13,TCBr13[r2]
1718
FFFFFFFFFFFFBF10        46270068                        lw              r14,TCBr14[r2]
1719
FFFFFFFFFFFFBF14        46278070                        lw              r15,TCBr15[r2]
1720
FFFFFFFFFFFFBF18        46280078                        lw              r16,TCBr16[r2]
1721
FFFFFFFFFFFFBF1C        46288080                        lw              r17,TCBr17[r2]
1722
FFFFFFFFFFFFBF20        46290088                        lw              r18,TCBr18[r2]
1723
FFFFFFFFFFFFBF24        46298090                        lw              r19,TCBr19[r2]
1724
FFFFFFFFFFFFBF28        462A0098                        lw              r20,TCBr20[r2]
1725
FFFFFFFFFFFFBF2C        462A80A0                        lw              r21,TCBr21[r2]
1726
FFFFFFFFFFFFBF30        462B00A8                        lw              r22,TCBr22[r2]
1727
FFFFFFFFFFFFBF34        462B80B0                        lw              r23,TCBr23[r2]
1728
FFFFFFFFFFFFBF38        462C00B8                        lw              r24,TCBr24[r2]
1729
FFFFFFFFFFFFBF3C        462C80C0                        lw              r25,TCBr25[r2]
1730
FFFFFFFFFFFFBF40        462D00C8                        lw              r26,TCBr26[r2]
1731
FFFFFFFFFFFFBF44        462D80D0                        lw              r27,TCBr27[r2]
1732
FFFFFFFFFFFFBF48        462E00D8                        lw              r28,TCBr28[r2]
1733
FFFFFFFFFFFFBF4C        462E80E0                        lw              r29,TCBr29[r2]
1734
FFFFFFFFFFFFBF50        462F00E8                        lw              r30,TCBr30[r2]
1735
FFFFFFFFFFFFBF54        462F80F0                        lw              r31,TCBr31[r2]
1736
FFFFFFFFFFFFBF58        46210008                        lw              r2,TCBr2[r2]
1737
FFFFFFFFFFFFBF5C        37EF8000                        ret
1738 43 robfinch
 
1739
                                                 ;------------------------------------------------------------------------------
1740 27 robfinch
                                                 ; Flash Cursor
1741
                                                 ;------------------------------------------------------------------------------
1742
                                                 ;
1743 46 robfinch
FFFFFFFFFFFFBF60                                 FlashCursor:
1744
FFFFFFFFFFFFBF60        0FEF0020                        subui   sp,sp,#32
1745
FFFFFFFFFFFFBF64        67E08000                        sw              r1,[sp]
1746
FFFFFFFFFFFFBF68        67E10008                        sw              r2,8[sp]
1747
FFFFFFFFFFFFBF6C        67E18010                        sw              r3,16[sp]
1748
FFFFFFFFFFFFBF70        67EF8018                        sw              lr,24[sp]
1749
FFFFFFFFFFFFBF74        31FFF06F                        call    CalcScreenLoc
1750
FFFFFFFFFFFFBF78        E6810000                ; SETLO
1751
FFFFFFFFFFFFBF7C        041D0403                        addui   r1,r1,#0x10000
1752
FFFFFFFFFFFFBF80        4001141A                        lb              r2,CursorFlash
1753
FFFFFFFFFFFFBF84        BE2001C8                        beq             r2,r0,flshcrsr2
1754 27 robfinch
                                                        ; causes screen colors to flip around
1755 46 robfinch
FFFFFFFFFFFFBF88        82110000                        inch    r2,[r1]
1756
FFFFFFFFFFFFBF8C        0A210001                        addui   r2,r2,#1
1757
FFFFFFFFFFFFBF90        92110000                        outc    r2,[r1]
1758
FFFFFFFFFFFFBF94                                 flshcrsr3:
1759
FFFFFFFFFFFFBF94        46011408                        lw              r2,Lastloc
1760
FFFFFFFFFFFFBF98        BE110088                        beq             r1,r2,flshcrsr1
1761 27 robfinch
                                                        ; restore the screen colors of the previous cursor location
1762 46 robfinch
FFFFFFFFFFFFBF9C        42019414                        lc              r3,ScreenColor
1763
FFFFFFFFFFFFBFA0        92218000                        outc    r3,[r2]
1764
FFFFFFFFFFFFBFA4        66009408                        sw              r1,Lastloc
1765
FFFFFFFFFFFFBFA8                                 flshcrsr1:
1766
FFFFFFFFFFFFBFA8        47E08000                        lw              r1,[sp]
1767
FFFFFFFFFFFFBFAC        47E10008                        lw              r2,8[sp]
1768
FFFFFFFFFFFFBFB0        47E18010                        lw              r3,16[sp]
1769
FFFFFFFFFFFFBFB4        47EF8018                        lw              lr,24[sp]
1770
FFFFFFFFFFFFBFB8        37EF8020                        ret             #32
1771
FFFFFFFFFFFFBFBC                                 flshcrsr2:
1772
FFFFFFFFFFFFBFBC        42019414                        lc              r3,ScreenColor
1773
FFFFFFFFFFFFBFC0        92118000                        outc    r3,[r1]
1774
FFFFFFFFFFFFBFC4        BE007E8A                        bra             flshcrsr3
1775 27 robfinch
 
1776 46 robfinch
FFFFFFFFFFFFBFC8                                 CursorOff:
1777
FFFFFFFFFFFFBFC8        160080A0                        lw              r1,#0xA0
1778
FFFFFFFFFFFFBFCC        E69A0010                ; SETLO
1779
FFFFFFFFFFFFBFD0        EE800003                ; SETMID
1780
FFFFFFFFFFFFBFD4        6A0D0429                        outc    r1,TEXTREG+16           ; turn off cursor
1781
FFFFFFFFFFFFBFD8        37EF8000                        ret
1782
FFFFFFFFFFFFBFDC                                 CursorOn:
1783
FFFFFFFFFFFFBFDC        160080E0                        lw              r1,#0xE0
1784
FFFFFFFFFFFFBFE0        E69A0010                ; SETLO
1785
FFFFFFFFFFFFBFE4        EE800003                ; SETMID
1786
FFFFFFFFFFFFBFE8        6A0D0429                        outc    r1,TEXTREG+16           ; turn on cursor
1787
FFFFFFFFFFFFBFEC        37EF8000                        ret
1788 43 robfinch
 
1789 27 robfinch
                                                 ;------------------------------------------------------------------------------
1790
                                                 ;------------------------------------------------------------------------------
1791 46 robfinch
FFFFFFFFFFFFBFF0                                 ClearBmpScreen:
1792
FFFFFFFFFFFFBFF0        0FEF0018                        subui   sp,sp,#24
1793
FFFFFFFFFFFFBFF4        67E08000                        sw              r1,[sp]
1794
FFFFFFFFFFFFBFF8        67E10008                        sw              r2,8[sp]
1795
FFFFFFFFFFFFBFFC        67E18010                        sw              r3,16[sp]
1796
FFFFFFFFFFFFC000        E68FFC00                ; SETLO
1797
FFFFFFFFFFFFC004        040D0809                        lw              r2,#1364*768
1798
FFFFFFFFFFFFC008        06210601                        shrui   r2,r2,#3                        ; r2 = # words to clear
1799
FFFFFFFFFFFFC00C        E6A92929                ; SETLO
1800
FFFFFFFFFFFFC010        EEA4A4A4                ; SETMID
1801
FFFFFFFFFFFFC014        F6829292                ; SETHI
1802
FFFFFFFFFFFFC018        6A0D042D                        lea             r1,0x2929292929292929   ; r1 = color for eight pixels
1803
FFFFFFFFFFFFC01C        E6A00000                ; SETLO
1804
FFFFFFFFFFFFC020        EE800400                ; SETMID
1805
FFFFFFFFFFFFC024        6A0D0C2D                        lea             r3,BITMAPSCR            ; r3 = screen address
1806
FFFFFFFFFFFFC028                                 csj4:
1807
FFFFFFFFFFFFC028        66308000                        sw              r1,[r3]                         ; store pixel data
1808
FFFFFFFFFFFFC02C        0A318008                        addui   r3,r3,#8                        ; advance screen address by eight
1809
FFFFFFFFFFFFC030        BE017FCF                        loop    r2,csj4                         ; decrement pixel count and loop back
1810
FFFFFFFFFFFFC034        47E08000                        lw              r1,[sp]
1811
FFFFFFFFFFFFC038        47E10008                        lw              r2,8[sp]
1812
FFFFFFFFFFFFC03C        47E18010                        lw              r3,16[sp]
1813
FFFFFFFFFFFFC040        37EF8018                        ret             #24
1814 27 robfinch
 
1815
                                                 ;------------------------------------------------------------------------------
1816
                                                 ; Clear the screen and the screen color memory
1817
                                                 ; We clear the screen to give a visual indication that the system
1818
                                                 ; is working at all.
1819
                                                 ;------------------------------------------------------------------------------
1820
                                                 ;
1821 46 robfinch
FFFFFFFFFFFFC044                                 ClearScreen:
1822
FFFFFFFFFFFFC044        0FEF0028                        subui   sp,sp,#40
1823
FFFFFFFFFFFFC048        67E08000                        sw              r1,[sp]
1824
FFFFFFFFFFFFC04C        67E10008                        sw              r2,8[sp]
1825
FFFFFFFFFFFFC050        67E18010                        sw              r3,16[sp]
1826
FFFFFFFFFFFFC054        67E20018                        sw              r4,24[sp]
1827
FFFFFFFFFFFFC058        67EF8020                        sw              lr,32[sp]
1828
FFFFFFFFFFFFC05C        E69A0000                ; SETLO
1829
FFFFFFFFFFFFC060        EE800003                ; SETMID
1830
FFFFFFFFFFFFC064        6A0D0C2D                        lea             r3,TEXTREG
1831
FFFFFFFFFFFFC068        82308000                        inch    r1,TEXT_COLS[r3]        ; calc number to clear
1832
FFFFFFFFFFFFC06C        82310002                        inch    r2,TEXT_ROWS[r3]
1833
FFFFFFFFFFFFC070        04110818                        mulu    r2,r1,r2                        ; r2 = # chars to clear
1834
FFFFFFFFFFFFC074        E0400020                        setlo   r1,#32                  ; space char
1835
FFFFFFFFFFFFC078        42021414                        lc              r4,ScreenColor
1836
FFFFFFFFFFFFC07C        31FFF063                        call    AsciiToScreen
1837
FFFFFFFFFFFFC080        E6900000                ; SETLO
1838
FFFFFFFFFFFFC084        EE800003                ; SETMID
1839
FFFFFFFFFFFFC088        6A0D0C2D                        lea             r3,TEXTSCR              ; text screen address
1840
FFFFFFFFFFFFC08C                                 csj4:
1841
FFFFFFFFFFFFC08C        92308000                        outc    r1,[r3]
1842
FFFFFFFFFFFFC090        E6810000                ; SETLO
1843
FFFFFFFFFFFFC094        6A3D1029                        outc    r4,0x10000[r3]  ; color screen is 0x10000 higher
1844
FFFFFFFFFFFFC098        0A318002                        addui   r3,r3,#2
1845
FFFFFFFFFFFFC09C        BE017F8F                        loop    r2,csj4
1846
FFFFFFFFFFFFC0A0        47EF8020                        lw              lr,32[sp]
1847
FFFFFFFFFFFFC0A4        47E20018                        lw              r4,24[sp]
1848
FFFFFFFFFFFFC0A8        47E18010                        lw              r3,16[sp]
1849
FFFFFFFFFFFFC0AC        47E10008                        lw              r2,8[sp]
1850
FFFFFFFFFFFFC0B0        47E08000                        lw              r1,[sp]
1851
FFFFFFFFFFFFC0B4        37EF8028                        ret             #40
1852 27 robfinch
 
1853
                                                 ;------------------------------------------------------------------------------
1854
                                                 ; Scroll text on the screen upwards
1855
                                                 ;------------------------------------------------------------------------------
1856
                                                 ;
1857 46 robfinch
FFFFFFFFFFFFC0B8                                 ScrollUp:
1858
FFFFFFFFFFFFC0B8        0FEF0028                        subui   sp,sp,#40
1859
FFFFFFFFFFFFC0BC        67E08000                        sw              r1,[sp]
1860
FFFFFFFFFFFFC0C0        67E10008                        sw              r2,8[sp]
1861
FFFFFFFFFFFFC0C4        67E18010                        sw              r3,16[sp]
1862
FFFFFFFFFFFFC0C8        67E20018                        sw              r4,24[sp]
1863
FFFFFFFFFFFFC0CC        67EF8020                        sw              lr,32[sp]
1864
FFFFFFFFFFFFC0D0        E69A0000                ; SETLO
1865
FFFFFFFFFFFFC0D4        EE800003                ; SETMID
1866
FFFFFFFFFFFFC0D8        6A0D0C2D                        lea             r3,TEXTREG
1867
FFFFFFFFFFFFC0DC        82308000                        inch    r1,TEXT_COLS[r3]        ; r1 = # text columns
1868
FFFFFFFFFFFFC0E0        82310002                        inch    r2,TEXT_ROWS[r3]
1869
FFFFFFFFFFFFC0E4        04110818                        mulu    r2,r1,r2                        ; calc number of chars to scroll
1870
FFFFFFFFFFFFC0E8        04208805                        subu    r2,r2,r1                        ; one less row
1871
FFFFFFFFFFFFC0EC        E6900000                ; SETLO
1872
FFFFFFFFFFFFC0F0        EE800003                ; SETMID
1873
FFFFFFFFFFFFC0F4        6A0D0C2D                        lea             r3,TEXTSCR
1874
FFFFFFFFFFFFC0F8                                 scrup1:
1875
FFFFFFFFFFFFC0F8        6A309121                        inch    r4,[r3+r1*2]            ; indexed addressing example
1876
FFFFFFFFFFFFC0FC        92320000                        outc    r4,[r3]
1877
FFFFFFFFFFFFC100        0A318002                        addui   r3,r3,#2
1878
FFFFFFFFFFFFC104        BE017FAF                        loop    r2,scrup1
1879 27 robfinch
 
1880 46 robfinch
FFFFFFFFFFFFC108        E69A0000                ; SETLO
1881
FFFFFFFFFFFFC10C        EE800003                ; SETMID
1882
FFFFFFFFFFFFC110        6A0D0C2D                        lea             r3,TEXTREG
1883
FFFFFFFFFFFFC114        82308002                        inch    r1,TEXT_ROWS[r3]
1884
FFFFFFFFFFFFC118        0E108001                        subui   r1,r1,#1
1885
FFFFFFFFFFFFC11C        31FFF04E                        call    BlankLine
1886
FFFFFFFFFFFFC120        47E08000                        lw              r1,[sp]
1887
FFFFFFFFFFFFC124        47E10008                        lw              r2,8[sp]
1888
FFFFFFFFFFFFC128        47E18010                        lw              r3,16[sp]
1889
FFFFFFFFFFFFC12C        47E20018                        lw              r4,24[sp]
1890
FFFFFFFFFFFFC130        47EF8020                        lw              lr,32[sp]
1891
FFFFFFFFFFFFC134        37EF8028                        ret             #40
1892 27 robfinch
 
1893
                                                 ;------------------------------------------------------------------------------
1894
                                                 ; Blank out a line on the display
1895
                                                 ; line number to blank is in r1
1896
                                                 ;------------------------------------------------------------------------------
1897
                                                 ;
1898 46 robfinch
FFFFFFFFFFFFC138                                 BlankLine:
1899
FFFFFFFFFFFFC138        0FEF0018                        subui   sp,sp,#24
1900
FFFFFFFFFFFFC13C        67E08000                        sw              r1,[sp]
1901
FFFFFFFFFFFFC140        67E10008                        sw              r2,8[sp]
1902
FFFFFFFFFFFFC144        67E18010                        sw              r3,16[sp]
1903
FFFFFFFFFFFFC148        E69A0000                ; SETLO
1904
FFFFFFFFFFFFC14C        EE800003                ; SETMID
1905
FFFFFFFFFFFFC150        6A0D0C2D                        lea             r3,TEXTREG                      ; r3 = text register address
1906
FFFFFFFFFFFFC154        82310000                        inch    r2,TEXT_COLS[r3]        ; r2 = # chars to blank out
1907
FFFFFFFFFFFFC158        04208C18                        mulu    r3,r2,r1
1908
FFFFFFFFFFFFC15C        06318200                        shli    r3,r3,#1
1909
FFFFFFFFFFFFC160        E6900000                ; SETLO
1910
FFFFFFFFFFFFC164        EE800003                ; SETMID
1911
FFFFFFFFFFFFC168        043D0C03                        addui   r3,r3,#TEXTSCR          ; r3 = screen address
1912
FFFFFFFFFFFFC16C        E0400020                        setlo   r1,#' '
1913
FFFFFFFFFFFFC170                                 blnkln1:
1914
FFFFFFFFFFFFC170        92308000                        outc    r1,[r3]
1915
FFFFFFFFFFFFC174        0A318002                        addui   r3,r3,#2
1916
FFFFFFFFFFFFC178        BE017FCF                        loop    r2,blnkln1
1917
FFFFFFFFFFFFC17C        47E08000                        lw              r1,[sp]
1918
FFFFFFFFFFFFC180        47E10008                        lw              r2,8[sp]
1919
FFFFFFFFFFFFC184        47E18010                        lw              r3,16[sp]
1920
FFFFFFFFFFFFC188        37EF8018                        ret             #24
1921 27 robfinch
 
1922
                                                 ;------------------------------------------------------------------------------
1923
                                                 ; Convert ASCII character to screen display character.
1924
                                                 ;------------------------------------------------------------------------------
1925
                                                 ;
1926 46 robfinch
FFFFFFFFFFFFC18C                                 AsciiToScreen:
1927
FFFFFFFFFFFFC18C        141080FF                        andi    r1,r1,#0x00ff
1928
FFFFFFFFFFFFC190        A8100541                        bltui   r1,#'A',atoscr1
1929
FFFFFFFFFFFFC194        AC10045A                        bleui   r1,#'Z',atoscr1
1930
FFFFFFFFFFFFC198        AE10037A                        bgtui   r1,#'z',atoscr1
1931
FFFFFFFFFFFFC19C        A8100261                        bltui   r1,#'a',atoscr1
1932
FFFFFFFFFFFFC1A0        0E108060                        subui   r1,r1,#0x60
1933
FFFFFFFFFFFFC1A4                                 atoscr1:
1934
FFFFFFFFFFFFC1A4        16108100                        ori             r1,r1,#0x100
1935
FFFFFFFFFFFFC1A8        37EF8000                        ret
1936 27 robfinch
 
1937
                                                 ;------------------------------------------------------------------------------
1938
                                                 ; Convert screen character to ascii character
1939
                                                 ;------------------------------------------------------------------------------
1940
                                                 ;
1941 46 robfinch
FFFFFFFFFFFFC1AC                                 ScreenToAscii:
1942
FFFFFFFFFFFFC1AC        141080FF                        andi    r1,r1,#0xff
1943
FFFFFFFFFFFFC1B0        AE10021A                        bgtui   r1,#26,stasc1
1944
FFFFFFFFFFFFC1B4        0A10803C                        addui   r1,r1,#60
1945
FFFFFFFFFFFFC1B8                                 stasc1:
1946
FFFFFFFFFFFFC1B8        37EF8000                        ret
1947 27 robfinch
 
1948
                                                 ;------------------------------------------------------------------------------
1949
                                                 ; Calculate screen memory location from CursorRow,CursorCol.
1950
                                                 ; Also refreshes the cursor location.
1951
                                                 ; Destroys r1,r2,r3
1952
                                                 ; r1 = screen location
1953
                                                 ;------------------------------------------------------------------------------
1954
                                                 ;
1955 46 robfinch
FFFFFFFFFFFFC1BC                                 CalcScreenLoc:
1956
FFFFFFFFFFFFC1BC        4A009417                        lbu             r1,CursorRow
1957
FFFFFFFFFFFFC1C0        1410807F                        andi    r1,r1,#0x7f
1958
FFFFFFFFFFFFC1C4        E69A0000                ; SETLO
1959
FFFFFFFFFFFFC1C8        EE800003                ; SETMID
1960
FFFFFFFFFFFFC1CC        6A0D0C2D                        lea             r3,TEXTREG
1961
FFFFFFFFFFFFC1D0        82310000                        inch    r2,TEXT_COLS[r3]
1962
FFFFFFFFFFFFC1D4        04208818                        mulu    r2,r2,r1
1963
FFFFFFFFFFFFC1D8        4A009418                        lbu             r1,CursorCol
1964
FFFFFFFFFFFFC1DC        1410807F                        andi    r1,r1,#0x7f
1965
FFFFFFFFFFFFC1E0        04208803                        addu    r2,r2,r1
1966
FFFFFFFFFFFFC1E4        92310016                        outc    r2,TEXT_CURPOS[r3]
1967
FFFFFFFFFFFFC1E8        06210206                        shlui   r2,r2,#1
1968
FFFFFFFFFFFFC1EC        E6900000                ; SETLO
1969
FFFFFFFFFFFFC1F0        EE800003                ; SETMID
1970
FFFFFFFFFFFFC1F4        042D0403                        addui   r1,r2,#TEXTSCR                  ; r1 = screen location
1971
FFFFFFFFFFFFC1F8        37EF8000                        ret
1972 27 robfinch
 
1973
                                                 ;------------------------------------------------------------------------------
1974
                                                 ; Display a character on the screen
1975
                                                 ; d1.b = char to display
1976
                                                 ;------------------------------------------------------------------------------
1977
                                                 ;
1978 46 robfinch
FFFFFFFFFFFFC1FC                                 DisplayChar:
1979
FFFFFFFFFFFFC1FC        B210080D                        bnei    r1,#'\r',dccr           ; carriage return ?
1980
FFFFFFFFFFFFC200        0FEF0020                        subui   sp,sp,#32
1981
FFFFFFFFFFFFC204        67E08000                        sw              r1,[sp]
1982
FFFFFFFFFFFFC208        67E10008                        sw              r2,8[sp]
1983
FFFFFFFFFFFFC20C        67E18010                        sw              r3,16[sp]
1984
FFFFFFFFFFFFC210        67EF8018                        sw              lr,24[sp]
1985
FFFFFFFFFFFFC214        60001418                        sb              r0,CursorCol            ; just set cursor column to zero on a CR
1986
FFFFFFFFFFFFC218        BE00018A                        bra             dcx7
1987
FFFFFFFFFFFFC21C                                 dccr:
1988
                                                 ;      beqi    r1,#CTRLK,dccr1
1989
FFFFFFFFFFFFC21C        E6800091                ; SETLO
1990
FFFFFFFFFFFFC220        BE1D0209                        bnei    r1,#0x91,dcx6           ; cursor right ?
1991
FFFFFFFFFFFFC224                                 dccr1:
1992
FFFFFFFFFFFFC224        0FEF0020                        subui   sp,sp,#32
1993
FFFFFFFFFFFFC228        67E08000                        sw              r1,[sp]
1994
FFFFFFFFFFFFC22C        67E10008                        sw              r2,8[sp]
1995
FFFFFFFFFFFFC230        67E18010                        sw              r3,16[sp]
1996
FFFFFFFFFFFFC234        67EF8018                        sw              lr,24[sp]
1997
FFFFFFFFFFFFC238        4A011418                        lbu             r2,CursorCol
1998
FFFFFFFFFFFFC23C        B0200338                        beqi    r2,#56,dcx7
1999
FFFFFFFFFFFFC240        0A210001                        addui   r2,r2,#1
2000
FFFFFFFFFFFFC244        60011418                        sb              r2,CursorCol
2001
FFFFFFFFFFFFC248                                 dcx7:
2002
FFFFFFFFFFFFC248        31FFF06F                        call    CalcScreenLoc
2003
FFFFFFFFFFFFC24C        47EF8018                        lw              lr,24[sp]
2004
FFFFFFFFFFFFC250        47E18010                        lw              r3,16[sp]
2005
FFFFFFFFFFFFC254        47E10008                        lw              r2,8[sp]
2006
FFFFFFFFFFFFC258        47E08000                        lw              r1,[sp]
2007
FFFFFFFFFFFFC25C        37EF8020                        ret             #32
2008
FFFFFFFFFFFFC260                                 dcx6:
2009
                                                 ;      beqi    r1,#CTRLI,dccu1
2010
FFFFFFFFFFFFC260        E6800090                ; SETLO
2011
FFFFFFFFFFFFC264        BE1D0169                        bnei    r1,#0x90,dcx8           ; cursor up ?
2012
FFFFFFFFFFFFC268                                 dccu1:
2013
FFFFFFFFFFFFC268        0FEF0020                        subui   sp,sp,#32
2014
FFFFFFFFFFFFC26C        67E08000                        sw              r1,[sp]
2015
FFFFFFFFFFFFC270        67E10008                        sw              r2,8[sp]
2016
FFFFFFFFFFFFC274        67E18010                        sw              r3,16[sp]
2017
FFFFFFFFFFFFC278        67EF8018                        sw              lr,24[sp]
2018
FFFFFFFFFFFFC27C        4A011417                        lbu             r2,CursorRow
2019
FFFFFFFFFFFFC280        B02FF200                        beqi    r2,#0,dcx7
2020
FFFFFFFFFFFFC284        0E210001                        subui   r2,r2,#1
2021
FFFFFFFFFFFFC288        60011417                        sb              r2,CursorRow
2022
FFFFFFFFFFFFC28C        BE007DEA                        bra             dcx7
2023
FFFFFFFFFFFFC290                                 dcx8:
2024
                                                 ;      beqi    r1,#CTRLJ,dccl1
2025
FFFFFFFFFFFFC290        E6800093                ; SETLO
2026
FFFFFFFFFFFFC294        BE1D0169                        bnei    r1,#0x93,dcx9           ; cursor left ?
2027
FFFFFFFFFFFFC298                                 dccl1:
2028
FFFFFFFFFFFFC298        0FEF0020                        subui   sp,sp,#32
2029
FFFFFFFFFFFFC29C        67E08000                        sw              r1,[sp]
2030
FFFFFFFFFFFFC2A0        67E10008                        sw              r2,8[sp]
2031
FFFFFFFFFFFFC2A4        67E18010                        sw              r3,16[sp]
2032
FFFFFFFFFFFFC2A8        67EF8018                        sw              lr,24[sp]
2033
FFFFFFFFFFFFC2AC        4A011418                        lbu             r2,CursorCol
2034
FFFFFFFFFFFFC2B0        B02FE600                        beqi    r2,#0,dcx7
2035
FFFFFFFFFFFFC2B4        0E210001                        subui   r2,r2,#1
2036
FFFFFFFFFFFFC2B8        60011418                        sb              r2,CursorCol
2037
FFFFFFFFFFFFC2BC        BE007C6A                        bra             dcx7
2038
FFFFFFFFFFFFC2C0                                 dcx9:
2039
                                                 ;      beqi    r1,#CTRLM,dccd1
2040
FFFFFFFFFFFFC2C0        E6800092                ; SETLO
2041
FFFFFFFFFFFFC2C4        BE1D0169                        bnei    r1,#0x92,dcx10          ; cursor down ?
2042
FFFFFFFFFFFFC2C8                                 dccd1:
2043
FFFFFFFFFFFFC2C8        0FEF0020                        subui   sp,sp,#32
2044
FFFFFFFFFFFFC2CC        67E08000                        sw              r1,[sp]
2045
FFFFFFFFFFFFC2D0        67E10008                        sw              r2,8[sp]
2046
FFFFFFFFFFFFC2D4        67E18010                        sw              r3,16[sp]
2047
FFFFFFFFFFFFC2D8        67EF8018                        sw              lr,24[sp]
2048
FFFFFFFFFFFFC2DC        4A011417                        lbu             r2,CursorRow
2049
FFFFFFFFFFFFC2E0        B02FDA1E                        beqi    r2,#30,dcx7
2050
FFFFFFFFFFFFC2E4        0A210001                        addui   r2,r2,#1
2051
FFFFFFFFFFFFC2E8        60011417                        sb              r2,CursorRow
2052
FFFFFFFFFFFFC2EC        BE007AEA                        bra             dcx7
2053
FFFFFFFFFFFFC2F0                                 dcx10:
2054
FFFFFFFFFFFFC2F0        E6800094                ; SETLO
2055
FFFFFFFFFFFFC2F4        BE1D0189                        bnei    r1,#0x94,dcx11                  ; cursor home ?
2056
FFFFFFFFFFFFC2F8        0FEF0020                        subui   sp,sp,#32
2057
FFFFFFFFFFFFC2FC        67E08000                        sw              r1,[sp]
2058
FFFFFFFFFFFFC300        67E10008                        sw              r2,8[sp]
2059
FFFFFFFFFFFFC304        67E18010                        sw              r3,16[sp]
2060
FFFFFFFFFFFFC308        67EF8018                        sw              lr,24[sp]
2061
FFFFFFFFFFFFC30C        4A011418                        lbu             r2,CursorCol
2062
FFFFFFFFFFFFC310        BE200068                        beq             r2,r0,dcx12
2063
FFFFFFFFFFFFC314        60001418                        sb              r0,CursorCol
2064
FFFFFFFFFFFFC318        BE00798A                        bra             dcx7
2065
FFFFFFFFFFFFC31C                                 dcx12:
2066
FFFFFFFFFFFFC31C        60001417                        sb              r0,CursorRow
2067
FFFFFFFFFFFFC320        BE00794A                        bra             dcx7
2068
FFFFFFFFFFFFC324                                 dcx11:
2069
FFFFFFFFFFFFC324        0FEF0030                        subui   sp,sp,#48
2070
FFFFFFFFFFFFC328        67E08000                        sw              r1,[sp]
2071
FFFFFFFFFFFFC32C        67E10008                        sw              r2,8[sp]
2072
FFFFFFFFFFFFC330        67E18010                        sw              r3,16[sp]
2073
FFFFFFFFFFFFC334        67E20018                        sw              r4,24[sp]
2074
FFFFFFFFFFFFC338        67E28020                        sw              r5,32[sp]
2075
FFFFFFFFFFFFC33C        67EF8028                        sw              lr,40[sp]
2076
FFFFFFFFFFFFC340        E6800099                ; SETLO
2077
FFFFFFFFFFFFC344        BE1D00A9                        bnei    r1,#0x99,dcx13          ; delete ?
2078
FFFFFFFFFFFFC348        31FFF06F                        call    CalcScreenLoc
2079
FFFFFFFFFFFFC34C        02118009                        mov             r3,r1                           ; r3 = screen location
2080
FFFFFFFFFFFFC350        4A009418                        lbu             r1,CursorCol            ; r1 = cursor column
2081
FFFFFFFFFFFFC354        BE00012A                        bra             dcx5
2082
FFFFFFFFFFFFC358                                 dcx13:
2083
FFFFFFFFFFFFC358        B2101508                        bnei    r1,#CTRLH,dcx3          ; backspace ?
2084
FFFFFFFFFFFFC35C        4A011418                        lbu             r2,CursorCol
2085
FFFFFFFFFFFFC360        BE200408                        beq             r2,r0,dcx4
2086
FFFFFFFFFFFFC364        0E210001                        subui   r2,r2,#1
2087
FFFFFFFFFFFFC368        60011418                        sb              r2,CursorCol
2088
FFFFFFFFFFFFC36C        31FFF06F                        call    CalcScreenLoc           ; a0 = screen location
2089
FFFFFFFFFFFFC370        02118009                        mov             r3,r1                           ; r3 = screen location
2090
FFFFFFFFFFFFC374        4A009418                        lbu             r1,CursorCol
2091
FFFFFFFFFFFFC378                                 dcx5:
2092
FFFFFFFFFFFFC378        82310002                        inch    r2,2[r3]
2093
FFFFFFFFFFFFC37C        92310000                        outc    r2,[r3]
2094
FFFFFFFFFFFFC380        0A318002                        addui   r3,r3,#2
2095
FFFFFFFFFFFFC384        0A108001                        addui   r1,r1,#1
2096
FFFFFFFFFFFFC388        E69A0000                ; SETLO
2097
FFFFFFFFFFFFC38C        EE800003                ; SETMID
2098
FFFFFFFFFFFFC390        6A0D102D                        lea             r4,TEXTREG
2099
FFFFFFFFFFFFC394        82428000                        inch    r5,TEXT_COLS[r4]
2100
FFFFFFFFFFFFC398        BE12FF04                        bltu    r1,r5,dcx5
2101
FFFFFFFFFFFFC39C        E0400020                        setlo   r1,#' '
2102
FFFFFFFFFFFFC3A0        31FFF063                        call    AsciiToScreen
2103
FFFFFFFFFFFFC3A4        9230FFFE                        outc    r1,-2[r3]
2104
FFFFFFFFFFFFC3A8        BE0001CA                        bra             dcx4
2105
FFFFFFFFFFFFC3AC                                 dcx3:
2106
FFFFFFFFFFFFC3AC        B0100C0A                        beqi    r1,#'\n',dclf   ; linefeed ?
2107
FFFFFFFFFFFFC3B0        02120009                        mov             r4,r1                   ; save r1 in r4
2108
FFFFFFFFFFFFC3B4        31FFF06F                        call    CalcScreenLoc   ; r1 = screen location
2109
FFFFFFFFFFFFC3B8        02118009                        mov             r3,r1                   ; r3 = screen location
2110
FFFFFFFFFFFFC3BC        02408009                        mov             r1,r4                   ; restore r1
2111
FFFFFFFFFFFFC3C0        31FFF063                        call    AsciiToScreen   ; convert ascii char to screen char
2112
FFFFFFFFFFFFC3C4        92308000                        outc    r1,[r3]
2113
FFFFFFFFFFFFC3C8        42009410                        lc              r1,CharColor
2114
FFFFFFFFFFFFC3CC        E6810000                ; SETLO
2115
FFFFFFFFFFFFC3D0        6A3D0429                        outc    r1,0x10000[r3]
2116
FFFFFFFFFFFFC3D4        31FFF0FF                        call    IncCursorPos
2117
FFFFFFFFFFFFC3D8        BE00004A                        bra             dcx4
2118
FFFFFFFFFFFFC3DC                                 dclf:
2119
FFFFFFFFFFFFC3DC        31FFF10D                        call    IncCursorRow
2120
FFFFFFFFFFFFC3E0                                 dcx4:
2121
FFFFFFFFFFFFC3E0        47EF8028                        lw              lr,40[sp]
2122
FFFFFFFFFFFFC3E4        47E28020                        lw              r5,32[sp]
2123
FFFFFFFFFFFFC3E8        47E20018                        lw              r4,24[sp]
2124
FFFFFFFFFFFFC3EC        47E18010                        lw              r3,16[sp]
2125
FFFFFFFFFFFFC3F0        47E10008                        lw              r2,8[sp]
2126
FFFFFFFFFFFFC3F4        47E08000                        lw              r1,[sp]
2127
FFFFFFFFFFFFC3F8        37EF8030                        ret             #48
2128 27 robfinch
 
2129
 
2130
                                                 ;------------------------------------------------------------------------------
2131
                                                 ; Increment the cursor position, scroll the screen if needed.
2132
                                                 ;------------------------------------------------------------------------------
2133
                                                 ;
2134 46 robfinch
FFFFFFFFFFFFC3FC                                 IncCursorPos:
2135
FFFFFFFFFFFFC3FC        0FEF0020                        subui   sp,sp,#32
2136
FFFFFFFFFFFFC400        67E08000                        sw              r1,[sp]
2137
FFFFFFFFFFFFC404        67E10008                        sw              r2,8[sp]
2138
FFFFFFFFFFFFC408        67E18010                        sw              r3,16[sp]
2139
FFFFFFFFFFFFC40C        67EF8018                        sw              lr,24[sp]
2140
FFFFFFFFFFFFC410        4A009418                        lbu             r1,CursorCol
2141
FFFFFFFFFFFFC414        0A108001                        addui   r1,r1,#1
2142
FFFFFFFFFFFFC418        60009418                        sb              r1,CursorCol
2143
FFFFFFFFFFFFC41C        E69A0000                ; SETLO
2144
FFFFFFFFFFFFC420        EE800003                ; SETMID
2145
FFFFFFFFFFFFC424        6A0D0821                        inch    r2,TEXTREG+TEXT_COLS
2146
FFFFFFFFFFFFC428        BE110246                        bleu    r1,r2,icc1
2147
FFFFFFFFFFFFC42C        60001418                        sb              r0,CursorCol            ; column = 0
2148
FFFFFFFFFFFFC430        BE0000CA                        bra             icr1
2149
FFFFFFFFFFFFC434                                 IncCursorRow:
2150
FFFFFFFFFFFFC434        0FEF0020                        subui   sp,sp,#32
2151
FFFFFFFFFFFFC438        67E08000                        sw              r1,[sp]
2152
FFFFFFFFFFFFC43C        67E10008                        sw              r2,8[sp]
2153
FFFFFFFFFFFFC440        67E18010                        sw              r3,16[sp]
2154
FFFFFFFFFFFFC444        67EF8018                        sw              lr,24[sp]
2155
FFFFFFFFFFFFC448                                 icr1:
2156
FFFFFFFFFFFFC448        4A009417                        lbu             r1,CursorRow
2157
FFFFFFFFFFFFC44C        0A108001                        addui   r1,r1,#1
2158
FFFFFFFFFFFFC450        60009417                        sb              r1,CursorRow
2159
FFFFFFFFFFFFC454        E69A0002                ; SETLO
2160
FFFFFFFFFFFFC458        EE800003                ; SETMID
2161
FFFFFFFFFFFFC45C        6A0D0821                        inch    r2,TEXTREG+TEXT_ROWS
2162
FFFFFFFFFFFFC460        BE110086                        bleu    r1,r2,icc1
2163
FFFFFFFFFFFFC464        0E210001                        subui   r2,r2,#1                        ; backup the cursor row, we are scrolling up
2164
FFFFFFFFFFFFC468        60011417                        sb              r2,CursorRow
2165
FFFFFFFFFFFFC46C        31FFF02E                        call    ScrollUp
2166
FFFFFFFFFFFFC470                                 icc1:
2167
FFFFFFFFFFFFC470        31FFF06F                        call    CalcScreenLoc
2168
FFFFFFFFFFFFC474        47EF8018                        lw              lr,24[sp]
2169
FFFFFFFFFFFFC478        47E18010                        lw              r3,16[sp]
2170
FFFFFFFFFFFFC47C        47E10008                        lw              r2,8[sp]
2171
FFFFFFFFFFFFC480        47E08000                        lw              r1,[sp]
2172
FFFFFFFFFFFFC484        37EF8020                        ret             #32
2173 27 robfinch
 
2174
                                                 ;------------------------------------------------------------------------------
2175
                                                 ; Display a string on the screen.
2176
                                                 ;------------------------------------------------------------------------------
2177
                                                 ;
2178 46 robfinch
FFFFFFFFFFFFC488                                 DisplayString:
2179
FFFFFFFFFFFFC488        0FEF0018                        subui   sp,sp,#24
2180
FFFFFFFFFFFFC48C        67E08000                        sw              r1,[sp]
2181
FFFFFFFFFFFFC490        67E10008                        sw              r2,8[sp]
2182
FFFFFFFFFFFFC494        67EF8010                        sw              lr,16[sp]
2183
FFFFFFFFFFFFC498        02110009                        mov             r2,r1                   ; r2 = pointer to string
2184
FFFFFFFFFFFFC49C                                 dspj1:
2185
FFFFFFFFFFFFC49C        4A208000                        lbu             r1,[r2]                 ; move string char into r1
2186
FFFFFFFFFFFFC4A0        0A210001                        addui   r2,r2,#1                ; increment pointer
2187
FFFFFFFFFFFFC4A4        BE100068                        beq             r1,r0,dsret             ; is it end of string ?
2188
FFFFFFFFFFFFC4A8        31FFF07F                        call    DisplayChar             ; display character
2189
FFFFFFFFFFFFC4AC        BE007F8A                        bra             dspj1                   ; go back for next character
2190
FFFFFFFFFFFFC4B0                                 dsret:
2191
FFFFFFFFFFFFC4B0        47EF8010                        lw              lr,16[sp]
2192
FFFFFFFFFFFFC4B4        47E10008                        lw              r2,8[sp]
2193
FFFFFFFFFFFFC4B8        47E08000                        lw              r1,[sp]
2194
FFFFFFFFFFFFC4BC        37EF8018                        ret             #24
2195 27 robfinch
 
2196 46 robfinch
FFFFFFFFFFFFC4C0                                 DisplayStringCRLF:
2197
FFFFFFFFFFFFC4C0        0FEF0008                        subui   r30,r30,#8
2198
FFFFFFFFFFFFC4C4        67EF8000                        sw              r31,[r30]
2199
FFFFFFFFFFFFC4C8        31FFF122                        call    DisplayString
2200
FFFFFFFFFFFFC4CC        47EF8000                        lw              r31,[r30]
2201
FFFFFFFFFFFFC4D0        0BEF0008                        addui   r30,r30,#8
2202 27 robfinch
 
2203 46 robfinch
FFFFFFFFFFFFC4D4                                 CRLF:
2204
FFFFFFFFFFFFC4D4        0FEF0010                        subui   sp,sp,#16
2205
FFFFFFFFFFFFC4D8        67E08000                        sw              r1,[sp]
2206
FFFFFFFFFFFFC4DC        67EF8008                        sw              lr,8[sp]
2207
FFFFFFFFFFFFC4E0        E040000D                        setlo   r1,#'\r'
2208
FFFFFFFFFFFFC4E4        31FFF07F                        call    DisplayChar
2209
FFFFFFFFFFFFC4E8        E040000A                        setlo   r1,#'\n'
2210
FFFFFFFFFFFFC4EC        31FFF07F                        call    DisplayChar
2211
FFFFFFFFFFFFC4F0        47EF8008                        lw              lr,8[sp]
2212
FFFFFFFFFFFFC4F4        47E08000                        lw              r1,[sp]
2213
FFFFFFFFFFFFC4F8        37EF8010                        ret             #16
2214 27 robfinch
 
2215 46 robfinch
                                                 ; Call the Tiny BASIC routine to display a number
2216
                                                 ;
2217
FFFFFFFFFFFFC4FC                                 DisplayNum:
2218
FFFFFFFFFFFFC4FC        33FFFCCC                        jmp             PRTNUM
2219
 
2220 27 robfinch
                                                 ;------------------------------------------------------------------------------
2221
                                                 ; Display nybble in r1
2222
                                                 ;------------------------------------------------------------------------------
2223
                                                 ;
2224 46 robfinch
FFFFFFFFFFFFC500                                 DisplayNybble:
2225
FFFFFFFFFFFFC500        0FEF0010                        subui   sp,sp,#16
2226
FFFFFFFFFFFFC504        67E08000                        sw              r1,[sp]
2227
FFFFFFFFFFFFC508        67EF8008                        sw              lr,8[sp]
2228
FFFFFFFFFFFFC50C        1410800F                        andi    r1,r1,#0x0F
2229
FFFFFFFFFFFFC510        0A108030                        addui   r1,r1,#'0'
2230
FFFFFFFFFFFFC514        AC100239                        bleui   r1,#'9',dispnyb1
2231
FFFFFFFFFFFFC518        0A108007                        addui   r1,r1,#7
2232
FFFFFFFFFFFFC51C                                 dispnyb1:
2233
FFFFFFFFFFFFC51C        31FFF07F                        call    DisplayChar
2234
FFFFFFFFFFFFC520        47EF8008                        lw              lr,8[sp]
2235
FFFFFFFFFFFFC524        47E08000                        lw              r1,[sp]
2236
FFFFFFFFFFFFC528        37EF8010                        ret             #16
2237 27 robfinch
 
2238
                                                 ;------------------------------------------------------------------------------
2239
                                                 ; Display the byte in r1
2240
                                                 ;------------------------------------------------------------------------------
2241
                                                 ;
2242 46 robfinch
FFFFFFFFFFFFC52C                                 DisplayByte:
2243
FFFFFFFFFFFFC52C        0FEF0010                        subui   sp,sp,#16
2244
FFFFFFFFFFFFC530        67E08000                        sw              r1,[sp]
2245
FFFFFFFFFFFFC534        67EF8008                        sw              lr,8[sp]
2246
FFFFFFFFFFFFC538        06108804                        rori    r1,r1,#4
2247
FFFFFFFFFFFFC53C        31FFF140                        call    DisplayNybble
2248
FFFFFFFFFFFFC540        06108802                        roli    r1,r1,#4
2249
FFFFFFFFFFFFC544        31FFF140                        call    DisplayNybble
2250
FFFFFFFFFFFFC548        47EF8008                        lw              lr,8[sp]
2251
FFFFFFFFFFFFC54C        47E08000                        lw              r1,[sp]
2252
FFFFFFFFFFFFC550        37EF8010                        ret             #16
2253 27 robfinch
 
2254
                                                 ;------------------------------------------------------------------------------
2255 46 robfinch
                                                 ; Display the char in r1
2256
                                                 ;------------------------------------------------------------------------------
2257
                                                 ;
2258
FFFFFFFFFFFFC554                                 DisplayCharr:
2259
FFFFFFFFFFFFC554        0FEF0010                        subui   sp,sp,#16
2260
FFFFFFFFFFFFC558        67E08000                        sw              r1,[sp]
2261
FFFFFFFFFFFFC55C        67EF8008                        sw              lr,8[sp]
2262
FFFFFFFFFFFFC560        06109004                        rori    r1,r1,#8
2263
FFFFFFFFFFFFC564        31FFF14B                        call    DisplayByte
2264
FFFFFFFFFFFFC568        06109002                        roli    r1,r1,#8
2265
FFFFFFFFFFFFC56C        31FFF14B                        call    DisplayByte
2266
FFFFFFFFFFFFC570        47EF8008                        lw              lr,8[sp]
2267
FFFFFFFFFFFFC574        47E08000                        lw              r1,[sp]
2268
FFFFFFFFFFFFC578        37EF8010                        ret             #16
2269
 
2270
                                                 ;------------------------------------------------------------------------------
2271
                                                 ; Display the half-word in r1
2272
                                                 ;------------------------------------------------------------------------------
2273
                                                 ;
2274
FFFFFFFFFFFFC57C                                 DisplayHalf:
2275
FFFFFFFFFFFFC57C        0FEF0010                        subui   sp,sp,#16
2276
FFFFFFFFFFFFC580        67E08000                        sw              r1,[sp]
2277
FFFFFFFFFFFFC584        67EF8008                        sw              lr,8[sp]
2278
FFFFFFFFFFFFC588        0610A004                        rori    r1,r1,#16
2279
FFFFFFFFFFFFC58C        31FFF155                        call    DisplayCharr
2280
FFFFFFFFFFFFC590        0610A002                        roli    r1,r1,#16
2281
FFFFFFFFFFFFC594        31FFF155                        call    DisplayCharr
2282
FFFFFFFFFFFFC598        47EF8008                        lw              lr,8[sp]
2283
FFFFFFFFFFFFC59C        47E08000                        lw              r1,[sp]
2284
FFFFFFFFFFFFC5A0        37EF8010                        ret             #16
2285
 
2286
                                                 ;------------------------------------------------------------------------------
2287 27 robfinch
                                                 ; Display the 64 bit word in r1
2288
                                                 ;------------------------------------------------------------------------------
2289
                                                 ;
2290 46 robfinch
FFFFFFFFFFFFC5A4                                 DisplayWord:
2291
FFFFFFFFFFFFC5A4        0FEF0018                        subui   sp,sp,#24
2292
FFFFFFFFFFFFC5A8        67E08000                        sw              r1,[sp]
2293
FFFFFFFFFFFFC5AC        67E18008                        sw              r3,8[sp]
2294
FFFFFFFFFFFFC5B0        67EF8010                        sw              lr,16[sp]
2295
FFFFFFFFFFFFC5B4        E0C00007                        setlo   r3,#7
2296
FFFFFFFFFFFFC5B8                                 dspwd1:
2297
FFFFFFFFFFFFC5B8        06109002                        roli    r1,r1,#8
2298
FFFFFFFFFFFFC5BC        31FFF14B                        call    DisplayByte
2299
FFFFFFFFFFFFC5C0        BE01FFCF                        loop    r3,dspwd1
2300
FFFFFFFFFFFFC5C4        47EF8010                        lw              lr,16[sp]
2301
FFFFFFFFFFFFC5C8        47E18008                        lw              r3,8[sp]
2302
FFFFFFFFFFFFC5CC        47E08000                        lw              r1,[sp]
2303
FFFFFFFFFFFFC5D0        37EF8018                        ret             #24
2304 27 robfinch
 
2305
                                                 ;------------------------------------------------------------------------------
2306
                                                 ; Display memory pointed to by r2.
2307
                                                 ; destroys r1,r3
2308
                                                 ;------------------------------------------------------------------------------
2309
                                                 ;
2310 46 robfinch
FFFFFFFFFFFFC5D4                                 DisplayMemB:
2311
FFFFFFFFFFFFC5D4        0FEF0018                        subui   sp,sp,#24
2312
FFFFFFFFFFFFC5D8        67E08000                        sw              r1,[sp]
2313
FFFFFFFFFFFFC5DC        67E18008                        sw              r3,8[sp]
2314
FFFFFFFFFFFFC5E0        67EF8010                        sw              lr,16[sp]
2315
FFFFFFFFFFFFC5E4        E040003A                        setlo   r1,#':'
2316
FFFFFFFFFFFFC5E8        31FFF07F                        call    DisplayChar
2317
FFFFFFFFFFFFC5EC        02208009                        mov             r1,r2
2318
FFFFFFFFFFFFC5F0        31FFF169                        call    DisplayWord
2319
FFFFFFFFFFFFC5F4        E0C00007                        setlo   r3,#7
2320
FFFFFFFFFFFFC5F8                                 dspmem1:
2321
FFFFFFFFFFFFC5F8        E0400020                        setlo   r1,#' '
2322
FFFFFFFFFFFFC5FC        31FFF07F                        call    DisplayChar
2323
FFFFFFFFFFFFC600        4A208000                        lbu             r1,[r2]
2324
FFFFFFFFFFFFC604        31FFF14B                        call    DisplayByte
2325
FFFFFFFFFFFFC608        0A210001                        addui   r2,r2,#1
2326
FFFFFFFFFFFFC60C        BE01FF6F                        loop    r3,dspmem1
2327
FFFFFFFFFFFFC610        31FFF135                        call    CRLF
2328
FFFFFFFFFFFFC614        47EF8010                        lw              lr,16[sp]
2329
FFFFFFFFFFFFC618        47E18008                        lw              r3,8[sp]
2330
FFFFFFFFFFFFC61C        47E08000                        lw              r1,[sp]
2331
FFFFFFFFFFFFC620        37EF8018                        ret             #24
2332 27 robfinch
 
2333 46 robfinch
FFFFFFFFFFFFC624                                 DisplayMemC:
2334
FFFFFFFFFFFFC624        0FEF0018                        subui   sp,sp,#24
2335
FFFFFFFFFFFFC628        67E08000                        sw              r1,[sp]
2336
FFFFFFFFFFFFC62C        67E18008                        sw              r3,8[sp]
2337
FFFFFFFFFFFFC630        67EF8010                        sw              lr,16[sp]
2338
FFFFFFFFFFFFC634        E040003A                        setlo   r1,#':'
2339
FFFFFFFFFFFFC638        31FFF07F                        call    DisplayChar
2340
FFFFFFFFFFFFC63C        02208009                        mov             r1,r2
2341
FFFFFFFFFFFFC640        31FFF169                        call    DisplayWord
2342
FFFFFFFFFFFFC644        E0C00003                        setlo   r3,#3
2343
FFFFFFFFFFFFC648                                 dspmemc1:
2344
FFFFFFFFFFFFC648        E0400020                        setlo   r1,#' '
2345
FFFFFFFFFFFFC64C        31FFF07F                        call    DisplayChar
2346
FFFFFFFFFFFFC650        4C208000                        lcu             r1,[r2]
2347
FFFFFFFFFFFFC654        31FFF155                        call    DisplayCharr
2348
FFFFFFFFFFFFC658        0A210002                        addui   r2,r2,#2
2349
FFFFFFFFFFFFC65C        BE01FF6F                        loop    r3,dspmemc1
2350
FFFFFFFFFFFFC660        31FFF135                        call    CRLF
2351
FFFFFFFFFFFFC664        47EF8010                        lw              lr,16[sp]
2352
FFFFFFFFFFFFC668        47E18008                        lw              r3,8[sp]
2353
FFFFFFFFFFFFC66C        47E08000                        lw              r1,[sp]
2354
FFFFFFFFFFFFC670        37EF8018                        ret             #24
2355
 
2356
FFFFFFFFFFFFC674                                 DisplayMemW:
2357
FFFFFFFFFFFFC674        0FEF0018                        subui   sp,sp,#24
2358
FFFFFFFFFFFFC678        67E08000                        sw              r1,[sp]
2359
FFFFFFFFFFFFC67C        67EF8010                        sw              lr,16[sp]
2360
FFFFFFFFFFFFC680        E040003A                        setlo   r1,#':'
2361
FFFFFFFFFFFFC684        31FFF07F                        call    DisplayChar
2362
FFFFFFFFFFFFC688        02208009                        mov             r1,r2
2363
FFFFFFFFFFFFC68C        31FFF169                        call    DisplayWord
2364
FFFFFFFFFFFFC690        E0400020                        setlo   r1,#' '
2365
FFFFFFFFFFFFC694        31FFF07F                        call    DisplayChar
2366
FFFFFFFFFFFFC698        46208000                        lw              r1,[r2]
2367
FFFFFFFFFFFFC69C        31FFF169                        call    DisplayWord
2368
FFFFFFFFFFFFC6A0        0A210008                        addui   r2,r2,#8
2369
FFFFFFFFFFFFC6A4        31FFF135                        call    CRLF
2370
FFFFFFFFFFFFC6A8        47EF8010                        lw              lr,16[sp]
2371
FFFFFFFFFFFFC6AC        47E08000                        lw              r1,[sp]
2372
FFFFFFFFFFFFC6B0        37EF8018                        ret             #24
2373
 
2374 27 robfinch
                                                 ;------------------------------------------------------------------------------
2375
                                                 ; Converts binary number in r1 into BCD number in r2 and r1.
2376
                                                 ;------------------------------------------------------------------------------
2377
                                                 ;
2378 46 robfinch
FFFFFFFFFFFFC6B4                                 BinToBCD:
2379
FFFFFFFFFFFFC6B4        0FEF0030                        subui   sp,sp,#48
2380
FFFFFFFFFFFFC6B8        67E18000                        sw              r3,[sp]
2381
FFFFFFFFFFFFC6BC        67E20008                        sw              r4,8[sp]
2382
FFFFFFFFFFFFC6C0        67E28010                        sw              r5,16[sp]
2383
FFFFFFFFFFFFC6C4        67E30018                        sw              r6,24[sp]
2384
FFFFFFFFFFFFC6C8        67E38020                        sw              r7,32[sp]
2385
FFFFFFFFFFFFC6CC        67E40028                        sw              r8,40[sp]
2386
FFFFFFFFFFFFC6D0        E080000A                        setlo   r2,#10
2387
FFFFFFFFFFFFC6D4        E2000013                        setlo   r8,#19          ; number of digits to produce - 1
2388
FFFFFFFFFFFFC6D8                                 bta1:
2389
FFFFFFFFFFFFC6D8        04110C1C                        modu    r3,r1,r2
2390
FFFFFFFFFFFFC6DC        0631F800                        shli    r3,r3,#60       ; shift result to uppermost bits
2391
FFFFFFFFFFFFC6E0        0653F800                        shli    r7,r5,#60       ; copy low order nybble of r5 to r4 topmost nybble
2392
FFFFFFFFFFFFC6E4        06420801                        shrui   r4,r4,#4
2393
FFFFFFFFFFFFC6E8        04439009                        or              r4,r4,r7
2394
FFFFFFFFFFFFC6EC        06528801                        shrui   r5,r5,#4
2395
FFFFFFFFFFFFC6F0        04519409                        or              r5,r5,r3        ; copy new bcd digit into uppermost bits of r5
2396
FFFFFFFFFFFFC6F4        1E108000                        divui   r1,r1,r2        ; r1=r1/10
2397
FFFFFFFFFFFFC6F8        BE047F0F                        loop    r8,bta1
2398
FFFFFFFFFFFFC6FC        06426001                        shrui   r4,r4,#48       ; right align number in register
2399
FFFFFFFFFFFFC700        06532000                        shli    r6,r5,#16
2400
FFFFFFFFFFFFC704        04431009                        or              r4,r4,r6        ; copy bits into r4
2401
FFFFFFFFFFFFC708        0652E001                        shrui   r5,r5,#48
2402
FFFFFFFFFFFFC70C        02408009                        mov             r1,r4
2403
FFFFFFFFFFFFC710        02510009                        mov             r2,r5
2404
FFFFFFFFFFFFC714        47E18000                        lw              r3,[sp]
2405
FFFFFFFFFFFFC718        47E20008                        lw              r4,8[sp]
2406
FFFFFFFFFFFFC71C        47E28010                        lw              r5,16[sp]
2407
FFFFFFFFFFFFC720        47E30018                        lw              r6,24[sp]
2408
FFFFFFFFFFFFC724        47E38020                        lw              r7,32[sp]
2409
FFFFFFFFFFFFC728        47E40028                        lw              r8,40[sp]
2410
FFFFFFFFFFFFC72C        37EF8030                        ret             #48
2411 27 robfinch
 
2412
                                                 ;------------------------------------------------------------------------------
2413
                                                 ; Converts BCD number in r1 into Ascii number in r2 and r1.
2414
                                                 ;------------------------------------------------------------------------------
2415
                                                 ;
2416 46 robfinch
FFFFFFFFFFFFC730                                 BCDToAscii:
2417
FFFFFFFFFFFFC730        0FEF0020                        subui   sp,sp,#32
2418
FFFFFFFFFFFFC734        67E18000                        sw              r3,[sp]
2419
FFFFFFFFFFFFC738        67E20008                        sw              r4,8[sp]
2420
FFFFFFFFFFFFC73C        67E28010                        sw              r5,16[sp]
2421
FFFFFFFFFFFFC740        67E40018                        sw              r8,24[sp]
2422
FFFFFFFFFFFFC744        E200000F                        setlo   r8,#15
2423
FFFFFFFFFFFFC748                                 bta2:
2424
FFFFFFFFFFFFC748        1411000F                        andi    r2,r1,#0x0F
2425
FFFFFFFFFFFFC74C        16210030                        ori             r2,r2,#0x30
2426
FFFFFFFFFFFFC750        06217000                        shli    r2,r2,#56
2427
FFFFFFFFFFFFC754        06421001                        shrui   r4,r4,#8
2428
FFFFFFFFFFFFC758        0632F000                        shli    r5,r3,#56
2429
FFFFFFFFFFFFC75C        04429009                        or              r4,r4,r5
2430
FFFFFFFFFFFFC760        06319001                        shrui   r3,r3,#8
2431
FFFFFFFFFFFFC764        04310C09                        or              r3,r3,r2
2432
FFFFFFFFFFFFC768        06108801                        shrui   r1,r1,#4
2433
FFFFFFFFFFFFC76C        BE047EEF                        loop    r8,bta2
2434
FFFFFFFFFFFFC770        02408009                        mov             r1,r4
2435
FFFFFFFFFFFFC774        02310009                        mov             r2,r3
2436
FFFFFFFFFFFFC778        47E18000                        lw              r3,[sp]
2437
FFFFFFFFFFFFC77C        47E20008                        lw              r4,8[sp]
2438
FFFFFFFFFFFFC780        47E28010                        lw              r5,16[sp]
2439
FFFFFFFFFFFFC784        47E40018                        lw              r8,24[sp]
2440
FFFFFFFFFFFFC788        37EF8020                        ret             #32
2441 27 robfinch
 
2442
                                                 ;------------------------------------------------------------------------------
2443
                                                 ; Convert a binary number into a 20 character ascii string.
2444
                                                 ; r1 = number to convert
2445
                                                 ; r2 = address of string buffer
2446
                                                 ;------------------------------------------------------------------------------
2447
                                                 ;
2448 46 robfinch
FFFFFFFFFFFFC78C                                 BinToStr:
2449
FFFFFFFFFFFFC78C        0FEF0038                        subui   sp,sp,#56
2450
FFFFFFFFFFFFC790        67E18000                        sw              r3,[sp]
2451
FFFFFFFFFFFFC794        67E38008                        sw              r7,8[sp]
2452
FFFFFFFFFFFFC798        67E40010                        sw              r8,16[sp]
2453
FFFFFFFFFFFFC79C        67E48018                        sw              r9,24[sp]
2454
FFFFFFFFFFFFC7A0        67E50020                        sw              r10,32[sp]
2455
FFFFFFFFFFFFC7A4        67E58028                        sw              r11,40[sp]
2456
FFFFFFFFFFFFC7A8        67EF8030                        sw              lr,48[sp]
2457
FFFFFFFFFFFFC7AC        02258009                        mov             r11,r2
2458
FFFFFFFFFFFFC7B0        31FFF1AD                        call    BinToBCD
2459
FFFFFFFFFFFFC7B4        02250009                        mov             r10,r2  ; save off r2
2460
FFFFFFFFFFFFC7B8        31FFF1CC                        call    BCDToAscii
2461
FFFFFFFFFFFFC7BC        E2400001                        setlo   r9,#1
2462
FFFFFFFFFFFFC7C0                                 btos3:
2463
FFFFFFFFFFFFC7C0        E2000007                        setlo   r8,#7
2464
FFFFFFFFFFFFC7C4                                 btos1:
2465
FFFFFFFFFFFFC7C4        06938600                        shli    r7,r9,#3
2466
FFFFFFFFFFFFC7C8        0A738000                        addui   r7,r7,r8
2467
FFFFFFFFFFFFC7CC        0A738004                        addui   r7,r7,#4
2468
FFFFFFFFFFFFC7D0        141180FF                        andi    r3,r1,#0xff
2469
FFFFFFFFFFFFC7D4        6A758C10                        sb              r3,[r7+r11]
2470
FFFFFFFFFFFFC7D8        06109001                        shrui   r1,r1,#8
2471
FFFFFFFFFFFFC7DC        BE047F4F                        loop    r8,btos1
2472
FFFFFFFFFFFFC7E0        02208009                        mov             r1,r2
2473
FFFFFFFFFFFFC7E4        BE04FEEF                        loop    r9,btos3
2474 27 robfinch
                                                 ; the last four digits
2475 46 robfinch
FFFFFFFFFFFFC7E8        02A08009                        mov             r1,r10  ; get back r2
2476
FFFFFFFFFFFFC7EC        31FFF1CC                        call    BCDToAscii
2477
FFFFFFFFFFFFC7F0        E2000003                        setlo   r8,#3
2478
FFFFFFFFFFFFC7F4                                 btos2:
2479
FFFFFFFFFFFFC7F4        141180FF                        andi    r3,r1,#0xff
2480
FFFFFFFFFFFFC7F8        6A858C10                        sb              r3,[r8+r11]
2481
FFFFFFFFFFFFC7FC        06109001                        shrui   r1,r1,#8
2482
FFFFFFFFFFFFC800        BE047FAF                        loop    r8,btos2
2483
FFFFFFFFFFFFC804        60B00014                        sb              r0,20[r11]      ; null terminate
2484
FFFFFFFFFFFFC808        47E18000                        lw              r3,[sp]
2485
FFFFFFFFFFFFC80C        47E38008                        lw              r7,8[sp]
2486
FFFFFFFFFFFFC810        47E40010                        lw              r8,16[sp]
2487
FFFFFFFFFFFFC814        47E48018                        lw              r9,24[sp]
2488
FFFFFFFFFFFFC818        47E50020                        lw              r10,32[sp]
2489
FFFFFFFFFFFFC81C        47E58028                        lw              r11,40[sp]
2490
FFFFFFFFFFFFC820        47EF8030                        lw              lr,48[sp]
2491
FFFFFFFFFFFFC824        37EF8038                        ret             #56
2492 27 robfinch
 
2493
 
2494
                                                 ;==============================================================================
2495 46 robfinch
                                                 ; System Monitor Program
2496 27 robfinch
                                                 ;==============================================================================
2497 46 robfinch
                                                 ;
2498
FFFFFFFFFFFFC828                                 Monitor:
2499
FFFFFFFFFFFFC828        E6BEFFF8                ; SETLO
2500
FFFFFFFFFFFFC82C        6A0D782D                        lea             sp,STACKTOP0    ; top of stack; reset the stack pointer
2501
FFFFFFFFFFFFC830        6000141C                        sb              r0,KeybdEcho    ; turn off keyboard echo
2502
FFFFFFFFFFFFC834                                 PromptLn:
2503
FFFFFFFFFFFFC834        31FFF135                        call    CRLF
2504
FFFFFFFFFFFFC838        E0400024                        setlo   r1,#'$'
2505
FFFFFFFFFFFFC83C        31FFF07F                        call    DisplayChar
2506 27 robfinch
 
2507
                                                 ; Get characters until a CR is keyed
2508
                                                 ;
2509 46 robfinch
FFFFFFFFFFFFC840                                 Prompt3:
2510
                                                 ;      lw              r1,#2                   ; get keyboard character
2511
                                                 ;      syscall #417
2512
FFFFFFFFFFFFC840        31FFEF07                        call    KeybdGetChar
2513
FFFFFFFFFFFFC844        B01FFFFF                        beqi    r1,#-1,Prompt3  ; wait for a character
2514
FFFFFFFFFFFFC848        B010030D                        beqi    r1,#CR,Prompt1
2515
FFFFFFFFFFFFC84C        31FFF07F                        call    DisplayChar
2516
FFFFFFFFFFFFC850        BE007F8A                        bra             Prompt3
2517 27 robfinch
 
2518
                                                 ; Process the screen line that the CR was keyed on
2519
                                                 ;
2520 46 robfinch
FFFFFFFFFFFFC854                                 Prompt1:
2521
FFFFFFFFFFFFC854        60001418                        sb              r0,CursorCol    ; go back to the start of the line
2522
FFFFFFFFFFFFC858        31FFF06F                        call    CalcScreenLoc   ; r1 = screen memory location
2523
FFFFFFFFFFFFC85C        02118009                        mov             r3,r1
2524
FFFFFFFFFFFFC860        82308000                        inch    r1,[r3]
2525
FFFFFFFFFFFFC864        0A318002                        addui   r3,r3,#2
2526
FFFFFFFFFFFFC868        31FFF06B                        call    ScreenToAscii
2527
FFFFFFFFFFFFC86C        B2100424                        bnei    r1,#'$',Prompt2 ; skip over '$' prompt character
2528
FFFFFFFFFFFFC870        82308000                        inch    r1,[r3]
2529
FFFFFFFFFFFFC874        0A318002                        addui   r3,r3,#2
2530
FFFFFFFFFFFFC878        31FFF06B                        call    ScreenToAscii
2531 27 robfinch
 
2532
                                                 ; Dispatch based on command character
2533
                                                 ;
2534 46 robfinch
FFFFFFFFFFFFC87C                                 Prompt2:
2535
FFFFFFFFFFFFC87C        B0106A3A                        beqi    r1,#':',Editmem         ; $: - edit memory
2536
FFFFFFFFFFFFC880        B0107C44                        beqi    r1,#'D',Dumpmem         ; $D - dump memory
2537
FFFFFFFFFFFFC884        B0109446                        beqi    r1,#'F',Fillmem         ; $F - fill memory
2538
FFFFFFFFFFFFC888                                 Prompt7:
2539
FFFFFFFFFFFFC888        B2100242                        bnei    r1,#'B',Prompt4         ; $B - start tiny basic
2540
FFFFFFFFFFFFC88C        33FFF7E0                        jmp             CSTART
2541
FFFFFFFFFFFFC890                                 Prompt4:
2542
FFFFFFFFFFFFC890        B0106F4A                        beqi    r1,#'J',ExecuteCode     ; $J - execute code
2543
FFFFFFFFFFFFC894        B210024C                        bnei    r1,#'L',Prompt9 ; $L - load S19 file
2544
FFFFFFFFFFFFC898        33FFF297                        jmp             LoadSector
2545
FFFFFFFFFFFFC89C                                 Prompt9:
2546
FFFFFFFFFFFFC89C        B210043F                        bnei    r1,#'?',Prompt10        ; $? - display help
2547
FFFFFFFFFFFFC8A0        9A00C910                        lea             r1,HelpMsg
2548
FFFFFFFFFFFFC8A4        31FFF122                        call    DisplayString
2549
FFFFFFFFFFFFC8A8        33FFF20A                        jmp             Monitor
2550
FFFFFFFFFFFFC8AC                                 Prompt10:
2551
FFFFFFFFFFFFC8AC        B0100C43                        beqi    r1,#'C',TestCLS         ; $C - clear screen
2552
FFFFFFFFFFFFC8B0        B2100252                        bnei    r1,#'R',Prompt12
2553
FFFFFFFFFFFFC8B4        33FFF235                        jmp             RandomLinesCall
2554
FFFFFFFFFFFFC8B8                                 Prompt12:
2555
FFFFFFFFFFFFC8B8        B2100249                        bnei    r1,#'I',Prompt13
2556
FFFFFFFFFFFFC8BC        33FFF528                        jmp             Invaders
2557
FFFFFFFFFFFFC8C0                                 Prompt13:
2558
FFFFFFFFFFFFC8C0        B2100250                        bnei    r1,#'P',Prompt14
2559
FFFFFFFFFFFFC8C4        33FFF411                        jmp             Piano
2560
FFFFFFFFFFFFC8C8                                 Prompt14:
2561
FFFFFFFFFFFFC8C8        B2100254                        bnei    r1,#'T',Prompt15
2562
FFFFFFFFFFFFC8CC        31FFEF53                        call    tmp_read
2563
FFFFFFFFFFFFC8D0                                 Prompt15:
2564
FFFFFFFFFFFFC8D0        33FFF20A                        jmp             Monitor
2565 27 robfinch
 
2566 46 robfinch
FFFFFFFFFFFFC8D4                                 RandomLinesCall:
2567
FFFFFFFFFFFFC8D4        31FFF374                        call    RandomLines
2568
FFFFFFFFFFFFC8D8        33FFF20A                        jmp             Monitor
2569 43 robfinch
 
2570 46 robfinch
FFFFFFFFFFFFC8DC                                 TestCLS:
2571
FFFFFFFFFFFFC8DC        82308000                        inch    r1,[r3]
2572
FFFFFFFFFFFFC8E0        0A318002                        addui   r3,r3,#2
2573
FFFFFFFFFFFFC8E4        31FFF06B                        call    ScreenToAscii
2574
FFFFFFFFFFFFC8E8        B21FD04C                        bnei    r1,#'L',Monitor
2575
FFFFFFFFFFFFC8EC        82308000                        inch    r1,[r3]
2576
FFFFFFFFFFFFC8F0        0A318002                        addui   r3,r3,#2
2577
FFFFFFFFFFFFC8F4        31FFF06B                        call    ScreenToAscii
2578
FFFFFFFFFFFFC8F8        B21FCC53                        bnei    r1,#'S',Monitor
2579
FFFFFFFFFFFFC8FC        31FFF011                        call    ClearScreen
2580
FFFFFFFFFFFFC900        60001418                        sb              r0,CursorCol
2581
FFFFFFFFFFFFC904        60001417                        sb              r0,CursorRow
2582
FFFFFFFFFFFFC908        31FFF06F                        call    CalcScreenLoc
2583
FFFFFFFFFFFFC90C        33FFF20A                        jmp             Monitor
2584 10 robfinch
 
2585 46 robfinch
FFFFFFFFFFFFC910                                 HelpMsg:
2586
FFFFFFFFFFFFC910 70736944203D203F               db      "? = Display help",CR,LF
2587
FFFFFFFFFFFFC918 706C65682079616C
2588
FFFFFFFFFFFFC920 203D20534C430A0D               db      "CLS = clear screen",CR,LF
2589
FFFFFFFFFFFFC928 6373207261656C63
2590
FFFFFFFFFFFFC930 203A0A0D6E656572               db      ": = Edit memory bytes",CR,LF
2591
FFFFFFFFFFFFC938 6D2074696445203D
2592
FFFFFFFFFFFFC940 79622079726F6D65
2593
FFFFFFFFFFFFC948 3D204C0A0D736574               db      "L = Load S19 file",CR,LF
2594
FFFFFFFFFFFFC950 31532064616F4C20
2595
FFFFFFFFFFFFC958 0A0D656C69662039
2596
FFFFFFFFFFFFC960 7C487C437C425B44               db      "D[B|C|H|W] = Dump memory",CR,LF
2597
FFFFFFFFFFFFC968 6D7544203D205D57
2598
FFFFFFFFFFFFC970 79726F6D656D2070
2599
FFFFFFFFFFFFC978 7C437C425B460A0D               db      "F[B|C|H|W] = Fill memory",CR,LF
2600
FFFFFFFFFFFFC980 46203D205D577C48
2601
FFFFFFFFFFFFC988 6F6D656D206C6C69
2602
FFFFFFFFFFFFC990 203D20420A0D7972               db      "B = start tiny basic",CR,LF
2603
FFFFFFFFFFFFC998 6974207472617473
2604
FFFFFFFFFFFFC9A0 636973616220796E
2605
FFFFFFFFFFFFC9A8 754A203D204A0A0D               db      "J = Jump to code",CR,LF
2606
FFFFFFFFFFFFC9B0 6F63206F7420706D
2607
FFFFFFFFFFFFC9B8 203D20490A0D6564               db      "I = Invaders",CR,LF
2608
FFFFFFFFFFFFC9C0 7372656461766E49
2609
FFFFFFFFFFFFC9C8 6152203D20520A0D               db      "R = Random lines",CR,LF
2610
FFFFFFFFFFFFC9D0 6E696C206D6F646E
2611
FFFFFFFFFFFFC9D8 203D20540A0D7365               db      "T = get temperature",CR,LF
2612
FFFFFFFFFFFFC9E0 706D657420746567
2613
FFFFFFFFFFFFC9E8 0D65727574617265
2614
FFFFFFFFFFFFC9F0 616950203D20500A               db      "P = Piano",CR,LF,0
2615
FFFFFFFFFFFFC9F8 000000000A0D6F6E               align   4
2616
FFFFFFFFFFFFCA00                                        align   4
2617 10 robfinch
 
2618 27 robfinch
                                                 ;------------------------------------------------------------------------------
2619
                                                 ; Ignore blanks in the input
2620
                                                 ; r3 = text pointer
2621
                                                 ; r1 destroyed
2622
                                                 ;------------------------------------------------------------------------------
2623
                                                 ;
2624 46 robfinch
FFFFFFFFFFFFCA00                                 ignBlanks:
2625
FFFFFFFFFFFFCA00        0FEF0008                        subui   sp,sp,#8
2626
FFFFFFFFFFFFCA04        67EF8000                        sw              r31,[sp]
2627
FFFFFFFFFFFFCA08                                 ignBlanks1:
2628
FFFFFFFFFFFFCA08        82308000                        inch    r1,[r3]
2629
FFFFFFFFFFFFCA0C        0A318002                        addui   r3,r3,#2
2630
FFFFFFFFFFFFCA10        31FFF06B                        call    ScreenToAscii
2631
FFFFFFFFFFFFCA14        B01FFD20                        beqi    r1,#' ',ignBlanks1
2632
FFFFFFFFFFFFCA18        0E318002                        subui   r3,r3,#2
2633
FFFFFFFFFFFFCA1C        47EF8000                        lw              r31,[sp]
2634
FFFFFFFFFFFFCA20        37EF8008                        ret             #8
2635 27 robfinch
 
2636
                                                 ;------------------------------------------------------------------------------
2637
                                                 ; Edit memory byte(s).
2638
                                                 ;------------------------------------------------------------------------------
2639
                                                 ;
2640 46 robfinch
FFFFFFFFFFFFCA24                                 EditMem:
2641
FFFFFFFFFFFFCA24        31FFF280                        call    ignBlanks
2642
FFFFFFFFFFFFCA28        31FFF2D4                        call    GetHexNumber
2643
FFFFFFFFFFFFCA2C        04101409                        or              r5,r1,r0
2644
FFFFFFFFFFFFCA30        E1000007                        setlo   r4,#7
2645
FFFFFFFFFFFFCA34                                 edtmem1:
2646
FFFFFFFFFFFFCA34        31FFF280                        call    ignBlanks
2647
FFFFFFFFFFFFCA38        31FFF2D4                        call    GetHexNumber
2648
FFFFFFFFFFFFCA3C        60508000                        sb              r1,[r5]
2649
FFFFFFFFFFFFCA40        0A528001                        addui   r5,r5,#1
2650
FFFFFFFFFFFFCA44        BE027F8F                        loop    r4,edtmem1
2651
FFFFFFFFFFFFCA48        33FFF20A                        jmp             Monitor
2652 27 robfinch
 
2653
                                                 ;------------------------------------------------------------------------------
2654
                                                 ; Execute code at the specified address.
2655
                                                 ;------------------------------------------------------------------------------
2656
                                                 ;
2657 46 robfinch
FFFFFFFFFFFFCA4C                                 ExecuteCode:
2658
FFFFFFFFFFFFCA4C        31FFF280                        call    ignBlanks
2659
FFFFFFFFFFFFCA50        31FFF2D4                        call    GetHexNumber
2660
FFFFFFFFFFFFCA54        341F8000                        jal             r31,[r1]
2661
FFFFFFFFFFFFCA58        33FFF20A                        jmp     Monitor
2662 27 robfinch
 
2663 46 robfinch
FFFFFFFFFFFFCA5C                                 LoadSector:
2664
FFFFFFFFFFFFCA5C        31FFF280                        call    ignBlanks
2665
FFFFFFFFFFFFCA60        31FFF2D4                        call    GetHexNumber
2666
FFFFFFFFFFFFCA64        16013800                        lw              r2,#0x3800
2667
FFFFFFFFFFFFCA68        31FFF56D                        call    spi_read_sector
2668
FFFFFFFFFFFFCA6C        33FFF20A                        jmp             Monitor
2669
 
2670 27 robfinch
                                                 ;------------------------------------------------------------------------------
2671
                                                 ; Do a memory dump of the requested location.
2672
                                                 ;------------------------------------------------------------------------------
2673
                                                 ;
2674 46 robfinch
FFFFFFFFFFFFCA70                                 DumpMem:
2675
FFFFFFFFFFFFCA70        82308000                        inch    r1,[r3]
2676
FFFFFFFFFFFFCA74        0A318002                        addui   r3,r3,#2
2677
FFFFFFFFFFFFCA78        31FFF06B                        call    ScreenToAscii
2678
FFFFFFFFFFFFCA7C        02130009                        mov             r6,r1                   ; r6 = fill type character
2679
FFFFFFFFFFFFCA80        31FFF280                        call    ignBlanks
2680
FFFFFFFFFFFFCA84        31FFF2D4                        call    GetHexNumber    ; get start address of dump
2681
FFFFFFFFFFFFCA88        02110009                        mov             r2,r1
2682
FFFFFFFFFFFFCA8C        31FFF280                        call    ignBlanks
2683
FFFFFFFFFFFFCA90        31FFF2D4                        call    GetHexNumber    ; get number of bytes to dump
2684
FFFFFFFFFFFFCA94        06108601                        shrui   r1,r1,#3                ; 1/8 as many dump rows
2685
FFFFFFFFFFFFCA98        B2100200                        bnei    r1,#0,Dumpmem2
2686
FFFFFFFFFFFFCA9C        16008001                        lw              r1,#1                   ; dump at least one row
2687
FFFFFFFFFFFFCAA0                                 Dumpmem2:
2688
FFFFFFFFFFFFCAA0        31FFF135                        call    CRLF
2689
FFFFFFFFFFFFCAA4        B0600857                        beqi    r6,#'W',DumpmemW
2690
                                                 ;      beqi    r6,#'H',DumpmemH
2691
FFFFFFFFFFFFCAA8        B0600443                        beqi    r6,#'C',DumpmemC
2692
FFFFFFFFFFFFCAAC                                 DumpmemB:
2693
FFFFFFFFFFFFCAAC        31FFF175                        call    DisplayMemB
2694
FFFFFFFFFFFFCAB0        BE00FFEF                        loop    r1,DumpmemB
2695
FFFFFFFFFFFFCAB4        33FFF20A                        jmp             Monitor
2696
FFFFFFFFFFFFCAB8                                 DumpmemC:
2697
FFFFFFFFFFFFCAB8        31FFF189                        call    DisplayMemC
2698
FFFFFFFFFFFFCABC        BE00FFEF                        loop    r1,DumpmemC
2699
FFFFFFFFFFFFCAC0        33FFF20A                        jmp             Monitor
2700
FFFFFFFFFFFFCAC4                                 DumpmemW:
2701
FFFFFFFFFFFFCAC4        31FFF19D                        call    DisplayMemW
2702
FFFFFFFFFFFFCAC8        BE00FFEF                        loop    r1,DumpmemW
2703
FFFFFFFFFFFFCACC        33FFF20A                        jmp             Monitor
2704 27 robfinch
 
2705 46 robfinch
                                                 ;      call    DisplayMem
2706
                                                 ;      call    DisplayMem
2707
                                                 ;      call    DisplayMem
2708
                                                 ;      call    DisplayMem
2709
                                                 ;      call    DisplayMem
2710
                                                 ;      call    DisplayMem
2711
                                                 ;      call    DisplayMem
2712
FFFFFFFFFFFFCAD0        BE006ACA                        bra             Monitor
2713
 
2714
FFFFFFFFFFFFCAD4                                 Fillmem:
2715
FFFFFFFFFFFFCAD4        82308000                        inch    r1,[r3]
2716
FFFFFFFFFFFFCAD8        0A318002                        addui   r3,r3,#2
2717
FFFFFFFFFFFFCADC        31FFF06B                        call    ScreenToAscii
2718
FFFFFFFFFFFFCAE0        02130009                        mov             r6,r1                   ; r6 = fill type character
2719
FFFFFFFFFFFFCAE4        31FFF280                        call    ignBlanks
2720
FFFFFFFFFFFFCAE8        31FFF2D4                        call    GetHexNumber    ; get start address of dump
2721
FFFFFFFFFFFFCAEC        02110009                        mov             r2,r1
2722
FFFFFFFFFFFFCAF0        31FFF280                        call    ignBlanks
2723
FFFFFFFFFFFFCAF4        31FFF2D4                        call    GetHexNumber    ; get number of bytes to fill
2724
FFFFFFFFFFFFCAF8        02128009                        mov             r5,r1
2725
FFFFFFFFFFFFCAFC        31FFF280                        call    ignBlanks
2726
FFFFFFFFFFFFCB00        31FFF2D4                        call    GetHexNumber    ; get the fill byte
2727
FFFFFFFFFFFFCB04        B0600743                        beqi    r6,#'C',FillmemC
2728
FFFFFFFFFFFFCB08        B0600A48                        beqi    r6,#'H',FillmemH
2729
FFFFFFFFFFFFCB0C        B0600D57                        beqi    r6,#'W',FillmemW
2730
FFFFFFFFFFFFCB10                                 FillmemB:
2731
FFFFFFFFFFFFCB10        60208000                        sb              r1,[r2]
2732
FFFFFFFFFFFFCB14        0A210001                        addui   r2,r2,#1
2733
FFFFFFFFFFFFCB18        BE02FFCF                        loop    r5,FillmemB
2734
FFFFFFFFFFFFCB1C        33FFF20A                        jmp             Monitor
2735
FFFFFFFFFFFFCB20                                 FillmemC:
2736
FFFFFFFFFFFFCB20        62208000                        sc              r1,[r2]
2737
FFFFFFFFFFFFCB24        0A210002                        addui   r2,r2,#2
2738
FFFFFFFFFFFFCB28        BE02FFCF                        loop    r5,FillmemC
2739
FFFFFFFFFFFFCB2C        33FFF20A                        jmp             Monitor
2740
FFFFFFFFFFFFCB30                                 FillmemH:
2741
FFFFFFFFFFFFCB30        64208000                        sh              r1,[r2]
2742
FFFFFFFFFFFFCB34        0A210004                        addui   r2,r2,#4
2743
FFFFFFFFFFFFCB38        BE02FFCF                        loop    r5,FillmemH
2744
FFFFFFFFFFFFCB3C        33FFF20A                        jmp             Monitor
2745
FFFFFFFFFFFFCB40                                 FillmemW:
2746
FFFFFFFFFFFFCB40        66208000                        sw              r1,[r2]
2747
FFFFFFFFFFFFCB44        0A210008                        addui   r2,r2,#8
2748
FFFFFFFFFFFFCB48        BE02FFCF                        loop    r5,FillmemW
2749
FFFFFFFFFFFFCB4C        33FFF20A                        jmp             Monitor
2750
 
2751 27 robfinch
                                                 ;------------------------------------------------------------------------------
2752
                                                 ; Get a hexidecimal number. Maximum of sixteen digits.
2753
                                                 ; R3 = text pointer (updated)
2754 43 robfinch
                                                 ; R1 = hex number
2755 27 robfinch
                                                 ;------------------------------------------------------------------------------
2756
                                                 ;
2757 46 robfinch
FFFFFFFFFFFFCB50                                 GetHexNumber:
2758
FFFFFFFFFFFFCB50        0FEF0018                        subui   sp,sp,#24
2759
FFFFFFFFFFFFCB54        67E10000                        sw              r2,[sp]
2760
FFFFFFFFFFFFCB58        67E20008                        sw              r4,8[sp]
2761
FFFFFFFFFFFFCB5C        67EF8010                        sw              lr,16[sp]
2762
FFFFFFFFFFFFCB60        E0800000                        setlo   r2,#0
2763
FFFFFFFFFFFFCB64        E100000F                        setlo   r4,#15
2764
FFFFFFFFFFFFCB68                                 gthxn2:
2765
FFFFFFFFFFFFCB68        82308000                        inch    r1,[r3]
2766
FFFFFFFFFFFFCB6C        0A318002                        addui   r3,r3,#2
2767
FFFFFFFFFFFFCB70        31FFF06B                        call    ScreenToAscii
2768
FFFFFFFFFFFFCB74        31FFF2E8                        call    AsciiToHexNybble
2769
FFFFFFFFFFFFCB78        B01005FF                        beqi    r1,#-1,gthxn1
2770
FFFFFFFFFFFFCB7C        06210800                        shli    r2,r2,#4
2771
FFFFFFFFFFFFCB80        1410800F                        andi    r1,r1,#0x0f
2772
FFFFFFFFFFFFCB84        04208809                        or              r2,r2,r1
2773
FFFFFFFFFFFFCB88        BE027F0F                        loop    r4,gthxn2
2774
FFFFFFFFFFFFCB8C                                 gthxn1:
2775
FFFFFFFFFFFFCB8C        02208009                        mov             r1,r2
2776
FFFFFFFFFFFFCB90        47EF8010                        lw              lr,16[sp]
2777
FFFFFFFFFFFFCB94        47E20008                        lw              r4,8[sp]
2778
FFFFFFFFFFFFCB98        47E10000                        lw              r2,[sp]
2779
FFFFFFFFFFFFCB9C        37EF8018                        ret             #24
2780 27 robfinch
 
2781
                                                 ;------------------------------------------------------------------------------
2782
                                                 ; Convert ASCII character in the range '0' to '9', 'a' to 'f' or 'A' to 'F'
2783
                                                 ; to a hex nybble.
2784
                                                 ;------------------------------------------------------------------------------
2785
                                                 ;
2786 46 robfinch
FFFFFFFFFFFFCBA0                                 AsciiToHexNybble:
2787
FFFFFFFFFFFFCBA0        A8100E30                        bltui   r1,#'0',gthx3
2788
FFFFFFFFFFFFCBA4        AE100339                        bgtui   r1,#'9',gthx5
2789
FFFFFFFFFFFFCBA8        0E108030                        subui   r1,r1,#'0'
2790
FFFFFFFFFFFFCBAC        37EF8000                        ret
2791
FFFFFFFFFFFFCBB0                                 gthx5:
2792
FFFFFFFFFFFFCBB0        A8100A41                        bltui   r1,#'A',gthx3
2793
FFFFFFFFFFFFCBB4        AE100446                        bgtui   r1,#'F',gthx6
2794
FFFFFFFFFFFFCBB8        0E108041                        subui   r1,r1,#'A'
2795
FFFFFFFFFFFFCBBC        0A10800A                        addui   r1,r1,#10
2796
FFFFFFFFFFFFCBC0        37EF8000                        ret
2797
FFFFFFFFFFFFCBC4                                 gthx6:
2798
FFFFFFFFFFFFCBC4        A8100561                        bltui   r1,#'a',gthx3
2799
FFFFFFFFFFFFCBC8        AE100466                        bgtui   r1,#'f',gthx3
2800
FFFFFFFFFFFFCBCC        0E108061                        subui   r1,r1,#'a'
2801
FFFFFFFFFFFFCBD0        0A10800A                        addui   r1,r1,#10
2802
FFFFFFFFFFFFCBD4        37EF8000                        ret
2803
FFFFFFFFFFFFCBD8                                 gthx3:
2804
FFFFFFFFFFFFCBD8        E07FFFFF                        setlo   r1,#-1          ; not a hex number
2805
FFFFFFFFFFFFCBDC        37EF8000                        ret
2806 27 robfinch
 
2807 10 robfinch
                                                 ;==============================================================================
2808 27 robfinch
                                                 ; Load an S19 format file
2809
                                                 ;==============================================================================
2810
                                                 ;
2811 46 robfinch
FFFFFFFFFFFFCBE0                                 LoadS19:
2812
FFFFFFFFFFFFCBE0        BE00006A                        bra             ProcessRec
2813
FFFFFFFFFFFFCBE4                                 NextRec:
2814
FFFFFFFFFFFFCBE4        31FFF36A                        call    sGetChar
2815
FFFFFFFFFFFFCBE8        B21FFF0A                        bne             r1,#LF,NextRec
2816
FFFFFFFFFFFFCBEC                                 ProcessRec:
2817
FFFFFFFFFFFFCBEC        31FFF36A                        call    sGetChar
2818
FFFFFFFFFFFFCBF0        B01F0E1A                        beqi    r1,#26,Monitor  ; CTRL-Z ?
2819
FFFFFFFFFFFFCBF4        B21FFC53                        bnei    r1,#'S',NextRec
2820
FFFFFFFFFFFFCBF8        31FFF36A                        call    sGetChar
2821
FFFFFFFFFFFFCBFC        A01FFA30                        blt             r1,#'0',NextRec
2822
FFFFFFFFFFFFCC00        A61FF939                        bgt             r1,#'9',NextRec
2823
FFFFFFFFFFFFCC04        04101009                        or              r4,r1,r0                ; r4 = record type
2824
FFFFFFFFFFFFCC08        31FFF36A                        call    sGetChar
2825
FFFFFFFFFFFFCC0C        31FFF2E8                        call    AsciiToHexNybble
2826
FFFFFFFFFFFFCC10        04100809                        or              r2,r1,r0
2827
FFFFFFFFFFFFCC14        31FFF36A                        call    sGetChar
2828
FFFFFFFFFFFFCC18        31FFF2E8                        call    AsciiToHexNybble
2829
FFFFFFFFFFFFCC1C        06210800                        shli    r2,r2,#4
2830
FFFFFFFFFFFFCC20        04208809                        or              r2,r2,r1                ; r2 = byte count
2831
FFFFFFFFFFFFCC24        04208C09                        or              r3,r2,r1                ; r3 = byte count
2832
FFFFFFFFFFFFCC28        B04FEF30                        beqi    r4,#'0',NextRec ; manufacturer ID record, ignore
2833
FFFFFFFFFFFFCC2C        B0401E31                        beqi    r4,#'1',ProcessS1
2834
FFFFFFFFFFFFCC30        B0401F32                        beqi    r4,#'2',ProcessS2
2835
FFFFFFFFFFFFCC34        B0402033                        beqi    r4,#'3',ProcessS3
2836
FFFFFFFFFFFFCC38        B04FEB35                        beqi    r4,#'5',NextRec ; record count record, ignore
2837
FFFFFFFFFFFFCC3C        B0402037                        beqi    r4,#'7',ProcessS7
2838
FFFFFFFFFFFFCC40        B0402238                        beqi    r4,#'8',ProcessS8
2839
FFFFFFFFFFFFCC44        B0402439                        beqi    r4,#'9',ProcessS9
2840
FFFFFFFFFFFFCC48        BE007CEA                        bra             NextRec
2841 27 robfinch
 
2842 46 robfinch
FFFFFFFFFFFFCC4C                                 pcssxa:
2843
FFFFFFFFFFFFCC4C        143180FF                        andi    r3,r3,#0xff
2844
FFFFFFFFFFFFCC50        0E318001                        subui   r3,r3,#1                ; one less for loop
2845
FFFFFFFFFFFFCC54                                 pcss1a:
2846
FFFFFFFFFFFFCC54        31FFF36A                        call    sGetChar
2847
FFFFFFFFFFFFCC58        31FFF2E8                        call    AsciiToHexNybble
2848
FFFFFFFFFFFFCC5C        06210800                        shli    r2,r2,#4
2849
FFFFFFFFFFFFCC60        04208809                        or              r2,r2,r1
2850
FFFFFFFFFFFFCC64        31FFF36A                        call    sGetChar
2851
FFFFFFFFFFFFCC68        31FFF2E8                        call    AsciiToHexNybble
2852
FFFFFFFFFFFFCC6C        06210800                        shli    r2,r2,#4
2853
FFFFFFFFFFFFCC70        04208809                        or              r2,r2,r1
2854
FFFFFFFFFFFFCC74        60510000                        sb              r2,[r5]
2855
FFFFFFFFFFFFCC78        0A528001                        addui   r5,r5,#1
2856
FFFFFFFFFFFFCC7C        BE01FECF                        loop    r3,pcss1a
2857 27 robfinch
                                                 ; Get the checksum byte
2858 46 robfinch
FFFFFFFFFFFFCC80        31FFF36A                        call    sGetChar
2859
FFFFFFFFFFFFCC84        31FFF2E8                        call    AsciiToHexNybble
2860
FFFFFFFFFFFFCC88        06210800                        shli    r2,r2,#4
2861
FFFFFFFFFFFFCC8C        04208809                        or              r2,r2,r1
2862
FFFFFFFFFFFFCC90        31FFF36A                        call    sGetChar
2863
FFFFFFFFFFFFCC94        31FFF2E8                        call    AsciiToHexNybble
2864
FFFFFFFFFFFFCC98        06210800                        shli    r2,r2,#4
2865
FFFFFFFFFFFFCC9C        04208809                        or              r2,r2,r1
2866
FFFFFFFFFFFFCCA0        BE007A2A                        bra             NextRec
2867 27 robfinch
 
2868 46 robfinch
FFFFFFFFFFFFCCA4                                 ProcessS1:
2869
FFFFFFFFFFFFCCA4        31FFF338                        call    S19Get16BitAddress
2870
FFFFFFFFFFFFCCA8        BE007D2A                        bra             pcssxa
2871
FFFFFFFFFFFFCCAC                                 ProcessS2:
2872
FFFFFFFFFFFFCCAC        31FFF33E                        call    S19Get24BitAddress
2873
FFFFFFFFFFFFCCB0        BE007CEA                        bra             pcssxa
2874
FFFFFFFFFFFFCCB4                                 ProcessS3:
2875
FFFFFFFFFFFFCCB4        31FFF344                        call    S19Get32BitAddress
2876
FFFFFFFFFFFFCCB8        BE007CAA                        bra             pcssxa
2877
FFFFFFFFFFFFCCBC                                 ProcessS7:
2878
FFFFFFFFFFFFCCBC        31FFF344                        call    S19Get32BitAddress
2879
FFFFFFFFFFFFCCC0        66028000                        sw              r5,S19StartAddress
2880
FFFFFFFFFFFFCCC4        BE005B2A                        bra             Monitor
2881
FFFFFFFFFFFFCCC8                                 ProcessS8:
2882
FFFFFFFFFFFFCCC8        31FFF33E                        call    S19Get24BitAddress
2883
FFFFFFFFFFFFCCCC        66028000                        sw              r5,S19StartAddress
2884
FFFFFFFFFFFFCCD0        BE005ACA                        bra             Monitor
2885
FFFFFFFFFFFFCCD4                                 ProcessS9:
2886
FFFFFFFFFFFFCCD4        31FFF338                        call    S19Get16BitAddress
2887
FFFFFFFFFFFFCCD8        66028000                        sw              r5,S19StartAddress
2888
FFFFFFFFFFFFCCDC        33FFF20A                        jmp             Monitor
2889 27 robfinch
 
2890 46 robfinch
FFFFFFFFFFFFCCE0                                 S19Get16BitAddress:
2891
FFFFFFFFFFFFCCE0        0FEF0008                        subui   sp,sp,#8
2892
FFFFFFFFFFFFCCE4        67EF8000                        sw              r31,[sp]
2893
FFFFFFFFFFFFCCE8        31FFF36A                        call    sGetChar
2894
FFFFFFFFFFFFCCEC        31FFF2E8                        call    AsciiToHexNybble
2895
FFFFFFFFFFFFCCF0        04100809                        or              r2,r1,r0
2896
FFFFFFFFFFFFCCF4        BE00038A                        bra             S1932b
2897 27 robfinch
 
2898 46 robfinch
FFFFFFFFFFFFCCF8                                 S19Get24BitAddress:
2899
FFFFFFFFFFFFCCF8        0FEF0008                        subui   sp,sp,#8
2900
FFFFFFFFFFFFCCFC        67EF8000                        sw              r31,[sp]
2901
FFFFFFFFFFFFCD00        31FFF36A                        call    sGetChar
2902
FFFFFFFFFFFFCD04        31FFF2E8                        call    AsciiToHexNybble
2903
FFFFFFFFFFFFCD08        04100809                        or              r2,r1,r0
2904
FFFFFFFFFFFFCD0C        BE0001CA                        bra             S1932a
2905 27 robfinch
 
2906 46 robfinch
FFFFFFFFFFFFCD10                                 S19Get32BitAddress:
2907
FFFFFFFFFFFFCD10        0FEF0008                        subui   sp,sp,#8
2908
FFFFFFFFFFFFCD14        67EF8000                        sw              r31,[sp]
2909
FFFFFFFFFFFFCD18        31FFF36A                        call    sGetChar
2910
FFFFFFFFFFFFCD1C        31FFF2E8                        call    AsciiToHexNybble
2911
FFFFFFFFFFFFCD20        04100809                        or              r2,r1,r0
2912
FFFFFFFFFFFFCD24        31FFF36A                        call    sGetChar
2913
FFFFFFFFFFFFCD28        31FFF2E8                        call    AsciiToHexNybble
2914
FFFFFFFFFFFFCD2C        06210800                        shli    r2,r2,#4
2915
FFFFFFFFFFFFCD30        04110809                        or              r2,r1,r2
2916
FFFFFFFFFFFFCD34        31FFF36A                        call    sGetChar
2917
FFFFFFFFFFFFCD38        31FFF2E8                        call    AsciiToHexNybble
2918
FFFFFFFFFFFFCD3C        06210800                        shli    r2,r2,#4
2919
FFFFFFFFFFFFCD40        04208809                        or              r2,r2,r1
2920
FFFFFFFFFFFFCD44                                 S1932a:
2921
FFFFFFFFFFFFCD44        31FFF36A                        call    sGetChar
2922
FFFFFFFFFFFFCD48        31FFF2E8                        call    AsciiToHexNybble
2923
FFFFFFFFFFFFCD4C        06210800                        shli    r2,r2,#4
2924
FFFFFFFFFFFFCD50        04208809                        or              r2,r2,r1
2925
FFFFFFFFFFFFCD54        31FFF36A                        call    sGetChar
2926
FFFFFFFFFFFFCD58        31FFF2E8                        call    AsciiToHexNybble
2927
FFFFFFFFFFFFCD5C        06210800                        shli    r2,r2,#4
2928
FFFFFFFFFFFFCD60        04208809                        or              r2,r2,r1
2929
FFFFFFFFFFFFCD64                                 S1932b:
2930
FFFFFFFFFFFFCD64        31FFF36A                        call    sGetChar
2931
FFFFFFFFFFFFCD68        31FFF2E8                        call    AsciiToHexNybble
2932
FFFFFFFFFFFFCD6C        06210800                        shli    r2,r2,#4
2933
FFFFFFFFFFFFCD70        04208809                        or              r2,r2,r1
2934
FFFFFFFFFFFFCD74        31FFF36A                        call    sGetChar
2935
FFFFFFFFFFFFCD78        31FFF2E8                        call    AsciiToHexNybble
2936
FFFFFFFFFFFFCD7C        06210800                        shli    r2,r2,#4
2937
FFFFFFFFFFFFCD80        04208809                        or              r2,r2,r1
2938
FFFFFFFFFFFFCD84        31FFF36A                        call    sGetChar
2939
FFFFFFFFFFFFCD88        31FFF2E8                        call    AsciiToHexNybble
2940
FFFFFFFFFFFFCD8C        06210800                        shli    r2,r2,#4
2941
FFFFFFFFFFFFCD90        04208809                        or              r2,r2,r1
2942
FFFFFFFFFFFFCD94        0442100A                        xor             r4,r4,r4
2943
FFFFFFFFFFFFCD98        04201409                        or              r5,r2,r0
2944
FFFFFFFFFFFFCD9C        47EF8000                        lw              r31,[sp]
2945
FFFFFFFFFFFFCDA0        0BEF0008                        addui   sp,sp,#8
2946
FFFFFFFFFFFFCDA4        37EF8000                        ret
2947 27 robfinch
 
2948
                                                 ;------------------------------------------------------------------------------
2949
                                                 ; Get a character from auxillary input, checking the keyboard status for a
2950
                                                 ; CTRL-C
2951
                                                 ;------------------------------------------------------------------------------
2952
                                                 ;
2953 46 robfinch
FFFFFFFFFFFFCDA8                                 sGetChar:
2954
FFFFFFFFFFFFCDA8        0FEF0008                        subui   sp,sp,#8
2955
FFFFFFFFFFFFCDAC        67EF8000                        sw              r31,[sp]
2956
FFFFFFFFFFFFCDB0                                 sgc2:
2957
FFFFFFFFFFFFCDB0        31FFEF1C                        call    KeybdCheckForKey
2958
FFFFFFFFFFFFCDB4        BE103C08                        beq             r1,r0,sgc1
2959
FFFFFFFFFFFFCDB8        31FFEF07                        call    KeybdGetchar
2960
FFFFFFFFFFFFCDBC        B01E9B00                        beqi    r1,#CRTLC,Monitor
2961
FFFFFFFFFFFFCDC0                                 sgc1:
2962
FFFFFFFFFFFFCDC0        31FFFD9D                        call    AUXIN
2963
FFFFFFFFFFFFCDC4        BE107F62                        ble             r1,r0,sgc2
2964
FFFFFFFFFFFFCDC8        47EF8000                        lw              r31,[sp]
2965
FFFFFFFFFFFFCDCC        37EF8008                        ret             #8
2966 27 robfinch
 
2967
                                                 ;--------------------------------------------------------------------------
2968 43 robfinch
                                                 ; Draw random lines on the bitmap screen.
2969
                                                 ;--------------------------------------------------------------------------
2970 46 robfinch
                                                 ;
2971
FFFFFFFFFFFFCDD0                                 RandomLines:
2972
FFFFFFFFFFFFCDD0        0FEF0018                        subui   sp,sp,#24
2973
FFFFFFFFFFFFCDD4        67E08000                        sw              r1,[sp]
2974
FFFFFFFFFFFFCDD8        67E18008                        sw              r3,8[sp]
2975
FFFFFFFFFFFFCDDC        67EF8010                        sw              lr,16[sp]
2976
FFFFFFFFFFFFCDE0        660020E8                        sw              r0,ctx3start    ; prevent restarting context over and over again
2977
FFFFFFFFFFFFCDE4                                 rl5:
2978
FFFFFFFFFFFFCDE4        00000050                        gran
2979
FFFFFFFFFFFFCDE8        020088A8                        mfspr   r1,rand                 ; select a random color
2980
FFFFFFFFFFFFCDEC        E69AE000                ; SETLO
2981
FFFFFFFFFFFFCDF0        EE800003                ; SETMID
2982
FFFFFFFFFFFFCDF4        6A0D042A                        outh    r1,GACCEL
2983
FFFFFFFFFFFFCDF8                                 rl1:                                           ; random X0
2984
FFFFFFFFFFFFCDF8        00000050                        gran
2985
FFFFFFFFFFFFCDFC        020088A8                        mfspr   r1,rand
2986
FFFFFFFFFFFFCE00        16018554                        lw              r3,#1364
2987
FFFFFFFFFFFFCE04        0411841C                        modu    r1,r1,r3
2988
FFFFFFFFFFFFCE08        E69AE008                ; SETLO
2989
FFFFFFFFFFFFCE0C        EE800003                ; SETMID
2990
FFFFFFFFFFFFCE10        6A0D042A                        outh    r1,GACCEL+8
2991
FFFFFFFFFFFFCE14                                 rl2:                                           ; random X1
2992
FFFFFFFFFFFFCE14        00000050                        gran
2993
FFFFFFFFFFFFCE18        020088A8                        mfspr   r1,rand
2994
FFFFFFFFFFFFCE1C        16018554                        lw              r3,#1364
2995
FFFFFFFFFFFFCE20        0411841C                        modu    r1,r1,r3
2996
FFFFFFFFFFFFCE24        E69AE010                ; SETLO
2997
FFFFFFFFFFFFCE28        EE800003                ; SETMID
2998
FFFFFFFFFFFFCE2C        6A0D042A                        outh    r1,GACCEL+16
2999
FFFFFFFFFFFFCE30                                 rl3:                                           ; random Y0
3000
FFFFFFFFFFFFCE30        00000050                        gran
3001
FFFFFFFFFFFFCE34        020088A8                        mfspr   r1,rand
3002
FFFFFFFFFFFFCE38        16018300                        lw              r3,#768
3003
FFFFFFFFFFFFCE3C        0411841C                        modu    r1,r1,r3
3004
FFFFFFFFFFFFCE40        E69AE00C                ; SETLO
3005
FFFFFFFFFFFFCE44        EE800003                ; SETMID
3006
FFFFFFFFFFFFCE48        6A0D042A                        outh    r1,GACCEL+12
3007
FFFFFFFFFFFFCE4C                                 rl4:                                           ; random Y1
3008
FFFFFFFFFFFFCE4C        00000050                        gran
3009
FFFFFFFFFFFFCE50        020088A8                        mfspr   r1,rand
3010
FFFFFFFFFFFFCE54        16018300                        lw              r3,#768
3011
FFFFFFFFFFFFCE58        0411841C                        modu    r1,r1,r3
3012
FFFFFFFFFFFFCE5C        E69AE014                ; SETLO
3013
FFFFFFFFFFFFCE60        EE800003                ; SETMID
3014
FFFFFFFFFFFFCE64        6A0D042A                        outh    r1,GACCEL+20
3015
FFFFFFFFFFFFCE68        E0400002                        setlo   r1,#2                   ; draw line command
3016
FFFFFFFFFFFFCE6C        E69AE03C                ; SETLO
3017
FFFFFFFFFFFFCE70        EE800003                ; SETMID
3018
FFFFFFFFFFFFCE74        6A0D042A                        outh    r1,GACCEL+60
3019
FFFFFFFFFFFFCE78                                 rl8:
3020
                                                 ;      call    KeybdGetChar
3021
                                                 ;      beqi    r1,#CTRLC,rl7
3022
FFFFFFFFFFFFCE78        E69AE038                ; SETLO
3023
FFFFFFFFFFFFCE7C        EE800003                ; SETMID
3024
FFFFFFFFFFFFCE80        6A0D0421                        inch    r1,GACCEL+56    ; ensure controller is in IDLE state
3025
FFFFFFFFFFFFCE84        BE107FA9                        bne             r1,r0,rl8
3026
FFFFFFFFFFFFCE88        BE007AEA                        bra             rl5
3027
FFFFFFFFFFFFCE8C                                 rl7:
3028
FFFFFFFFFFFFCE8C        47EF8010                        lw              lr,16[sp]
3029
FFFFFFFFFFFFCE90        47E18008                        lw              r3,8[sp]
3030
FFFFFFFFFFFFCE94        47E08000                        lw              r1,[sp]
3031
FFFFFFFFFFFFCE98        37EF8018                        ret             #24
3032 43 robfinch
 
3033
                                                 ;--------------------------------------------------------------------------
3034
                                                 ; Initialize sprite image caches with random data.
3035
                                                 ;--------------------------------------------------------------------------
3036 46 robfinch
FFFFFFFFFFFFCE9C                                 RandomizeSprram:
3037
FFFFFFFFFFFFCE9C        E6980000                ; SETLO
3038
FFFFFFFFFFFFCEA0        EE800003                ; SETMID
3039
FFFFFFFFFFFFCEA4        6A0D082D                        lea             r2,SPRRAM
3040
FFFFFFFFFFFFCEA8        E10037FF                        setlo   r4,#14335               ; number of chars to initialize
3041
FFFFFFFFFFFFCEAC                                 rsr1:
3042
FFFFFFFFFFFFCEAC        00000050                        gran
3043
FFFFFFFFFFFFCEB0        020088A8                        mfspr   r1,rand
3044
FFFFFFFFFFFFCEB4        92208000                        outc    r1,[r2]
3045
FFFFFFFFFFFFCEB8        0A210002                        addui   r2,r2,#2
3046
FFFFFFFFFFFFCEBC        BE027F8F                        loop    r4,rsr1
3047
FFFFFFFFFFFFCEC0        37EF8000                        ret
3048 43 robfinch
 
3049
                                                 ;--------------------------------------------------------------------------
3050
                                                 ; Setup the AC97/LM4550 audio controller. Check keyboard for a CTRL-C
3051
                                                 ; interrupt which may be necessary if the audio controller isn't
3052
                                                 ; responding.
3053
                                                 ;--------------------------------------------------------------------------
3054
                                                 ;
3055 46 robfinch
FFFFFFFFFFFFCEC4                                 SetupAC97:
3056
FFFFFFFFFFFFCEC4        0FEF0010                        subui   sp,sp,#16
3057
FFFFFFFFFFFFCEC8        67E08000                        sw              r1,[sp]
3058
FFFFFFFFFFFFCECC        67EF8008                        sw              lr,8[sp]
3059
FFFFFFFFFFFFCED0                                 sac974:
3060
FFFFFFFFFFFFCED0        E69C1026                ; SETLO
3061
FFFFFFFFFFFFCED4        EE800003                ; SETMID
3062
FFFFFFFFFFFFCED8        6A0D0029                        outc    r0,AC97+0x26    ; trigger a read of register 26 (status reg)
3063
FFFFFFFFFFFFCEDC                                 sac971:                                                ; wait for status to register 0xF (all ready)
3064
FFFFFFFFFFFFCEDC        31FFEF07                        call    KeybdGetChar    ; see if we needed to CTRL-C
3065
FFFFFFFFFFFFCEE0        B0100A03                        beqi    r1,#CTRLC,sac973
3066
FFFFFFFFFFFFCEE4        E69C1068                ; SETLO
3067
FFFFFFFFFFFFCEE8        EE800003                ; SETMID
3068
FFFFFFFFFFFFCEEC        6A0D0421                        inch    r1,AC97+0x68    ; wait for dirty bit to clear
3069
FFFFFFFFFFFFCEF0        BE107F69                        bne             r1,r0,sac971
3070
FFFFFFFFFFFFCEF4        E69C1026                ; SETLO
3071
FFFFFFFFFFFFCEF8        EE800003                ; SETMID
3072
FFFFFFFFFFFFCEFC        6A0D0421                        inch    r1,AC97+0x26    ; check status at reg h26, wait for
3073
FFFFFFFFFFFFCF00        1410800F                        andi    r1,r1,#0x0F             ; analogue to be ready
3074
FFFFFFFFFFFFCF04        B21FF30F                        bnei    r1,#0x0F,sac974
3075
FFFFFFFFFFFFCF08                                 sac973:
3076
FFFFFFFFFFFFCF08        E69C1002                ; SETLO
3077
FFFFFFFFFFFFCF0C        EE800003                ; SETMID
3078
FFFFFFFFFFFFCF10        6A0D0029                        outc    r0,AC97+2               ; master volume, 0db attenuation, mute off
3079
FFFFFFFFFFFFCF14        E69C1004                ; SETLO
3080
FFFFFFFFFFFFCF18        EE800003                ; SETMID
3081
FFFFFFFFFFFFCF1C        6A0D0029                        outc    r0,AC97+4               ; headphone volume, 0db attenuation, mute off
3082
FFFFFFFFFFFFCF20        E69C1018                ; SETLO
3083
FFFFFFFFFFFFCF24        EE800003                ; SETMID
3084
FFFFFFFFFFFFCF28        6A0D0029                        outc    r0,AC97+0x18    ; PCM gain (mixer) mute off, no attenuation
3085
FFFFFFFFFFFFCF2C        E69C100A                ; SETLO
3086
FFFFFFFFFFFFCF30        EE800003                ; SETMID
3087
FFFFFFFFFFFFCF34        6A0D0029                        outc    r0,AC97+0x0A    ; mute PC beep
3088
FFFFFFFFFFFFCF38        E07F8000                        setlo   r1,#0x8000              ; bypass 3D sound
3089
FFFFFFFFFFFFCF3C        E69C1020                ; SETLO
3090
FFFFFFFFFFFFCF40        EE800003                ; SETMID
3091
FFFFFFFFFFFFCF44        6A0D0429                        outc    r1,AC97+0x20
3092
FFFFFFFFFFFFCF48                                 sac972:
3093
FFFFFFFFFFFFCF48        31FFEF07                        call    KeybdGetChar
3094
FFFFFFFFFFFFCF4C        B0100503                        beqi    r1,#CTRLC,sac975
3095
FFFFFFFFFFFFCF50        E69C1068                ; SETLO
3096
FFFFFFFFFFFFCF54        EE800003                ; SETMID
3097
FFFFFFFFFFFFCF58        6A0D0421                        inch    r1,AC97+0x68    ; wait for dirty bits to clear
3098
FFFFFFFFFFFFCF5C        BE107F69                        bne             r1,r0,sac972    ; wait a while for the settings to take effect
3099
FFFFFFFFFFFFCF60                                 sac975:
3100
FFFFFFFFFFFFCF60        47EF8008                        lw              lr,8[sp]
3101
FFFFFFFFFFFFCF64        47E08000                        lw              r1,[sp]
3102
FFFFFFFFFFFFCF68        37EF8010                        ret             #16
3103 43 robfinch
 
3104
                                                 ;--------------------------------------------------------------------------
3105 27 robfinch
                                                 ; Sound a 800 Hz beep
3106
                                                 ;--------------------------------------------------------------------------
3107
                                                 ;
3108 46 robfinch
FFFFFFFFFFFFCF6C                                 Beep:
3109
FFFFFFFFFFFFCF6C        0FEF0010                        subui   sp,sp,#16
3110
FFFFFFFFFFFFCF70        67E08000                        sw              r1,[sp]
3111
FFFFFFFFFFFFCF74        67EF8008                        sw              lr,8[sp]
3112
FFFFFFFFFFFFCF78        E0400008                        setlo   r1,#8
3113
FFFFFFFFFFFFCF7C        E69C0600                ; SETLO
3114
FFFFFFFFFFFFCF80        EE800003                ; SETMID
3115
FFFFFFFFFFFFCF84        6A0D0428                        outb    r1,LED
3116
FFFFFFFFFFFFCF88        1600800F                        ori             r1,r0,#15               ; master volume to max
3117
FFFFFFFFFFFFCF8C        E6950080                ; SETLO
3118
FFFFFFFFFFFFCF90        EE800003                ; SETMID
3119
FFFFFFFFFFFFCF94        6A0D0429                        outc    r1,PSG+128
3120
FFFFFFFFFFFFCF98        1600B46E                        ori             r1,r0,#13422    ; 800Hz
3121
FFFFFFFFFFFFCF9C        E6950000                ; SETLO
3122
FFFFFFFFFFFFCFA0        EE800003                ; SETMID
3123
FFFFFFFFFFFFCFA4        6A0D0429                        outc    r1,PSGFREQ0
3124
FFFFFFFFFFFFCFA8        E0400009                        setlo   r1,#9
3125
FFFFFFFFFFFFCFAC        E69C0600                ; SETLO
3126
FFFFFFFFFFFFCFB0        EE800003                ; SETMID
3127
FFFFFFFFFFFFCFB4        6A0D0428                        outb    r1,LED
3128 43 robfinch
                                                        ; decay  (16.384 ms)2
3129
                                                        ; attack (8.192 ms)1
3130
                                                        ; release (1.024 s)A
3131
                                                        ; sustain level C
3132 46 robfinch
FFFFFFFFFFFFCFB8        E07FCA12                        setlo   r1,#0xCA12
3133
FFFFFFFFFFFFCFBC        E6950006                ; SETLO
3134
FFFFFFFFFFFFCFC0        EE800003                ; SETMID
3135
FFFFFFFFFFFFCFC4        6A0D0429                        outc    r1,PSGADSR0
3136
FFFFFFFFFFFFCFC8        16009104                        ori             r1,r0,#0x1104   ; gate, output enable, triangle waveform
3137
FFFFFFFFFFFFCFCC        E6950004                ; SETLO
3138
FFFFFFFFFFFFCFD0        EE800003                ; SETMID
3139
FFFFFFFFFFFFCFD4        6A0D0429                        outc    r1,PSGCTRL0
3140
FFFFFFFFFFFFCFD8        E6A625A0                ; SETLO
3141
FFFFFFFFFFFFCFDC        EE800000                ; SETMID
3142
FFFFFFFFFFFFCFE0        040D0409                        ori             r1,r0,#2500000  ; delay about 1s
3143
FFFFFFFFFFFFCFE4                                 beep1:
3144
FFFFFFFFFFFFCFE4        BE00800F                        loop    r1,beep1
3145
FFFFFFFFFFFFCFE8        E040000D                        setlo   r1,#13
3146
FFFFFFFFFFFFCFEC        E69C0600                ; SETLO
3147
FFFFFFFFFFFFCFF0        EE800003                ; SETMID
3148
FFFFFFFFFFFFCFF4        6A0D0428                        outb    r1,LED
3149
FFFFFFFFFFFFCFF8        16008104                        ori             r1,r0,#0x0104   ; gate off, output enable, triangle waveform
3150
FFFFFFFFFFFFCFFC        E6950004                ; SETLO
3151
FFFFFFFFFFFFD000        EE800003                ; SETMID
3152
FFFFFFFFFFFFD004        6A0D0429                        outc    r1,PSGCTRL0
3153
FFFFFFFFFFFFD008        E6A625A0                ; SETLO
3154
FFFFFFFFFFFFD00C        EE800000                ; SETMID
3155
FFFFFFFFFFFFD010        040D0409                        ori             r1,r0,#2500000  ; delay about 1s
3156
FFFFFFFFFFFFD014                                 beep2:
3157
FFFFFFFFFFFFD014        BE00800F                        loop    r1,beep2
3158
FFFFFFFFFFFFD018        E0400010                        setlo   r1,#16
3159
FFFFFFFFFFFFD01C        E69C0600                ; SETLO
3160
FFFFFFFFFFFFD020        EE800003                ; SETMID
3161
FFFFFFFFFFFFD024        6A0D0428                        outb    r1,LED
3162
FFFFFFFFFFFFD028        16008000                        ori             r1,r0,#0x0000   ; gate off, output enable off, no waveform
3163
FFFFFFFFFFFFD02C        E6950004                ; SETLO
3164
FFFFFFFFFFFFD030        EE800003                ; SETMID
3165
FFFFFFFFFFFFD034        6A0D0429                        outc    r1,PSGCTRL0
3166
FFFFFFFFFFFFD038        47EF8008                        lw              lr,8[sp]
3167
FFFFFFFFFFFFD03C        47E08000                        lw              r1,[sp]
3168
FFFFFFFFFFFFD040        37EF8010                        ret             #16
3169 27 robfinch
 
3170 43 robfinch
                                                 ;--------------------------------------------------------------------------
3171
                                                 ;--------------------------------------------------------------------------
3172
                                                 ;
3173 46 robfinch
FFFFFFFFFFFFD044                                 Piano:
3174
FFFFFFFFFFFFD044        1600800F                        ori             r1,r0,#15               ; master volume to max
3175
FFFFFFFFFFFFD048        E6950080                ; SETLO
3176
FFFFFFFFFFFFD04C        EE800003                ; SETMID
3177
FFFFFFFFFFFFD050        6A0D0429                        outc    r1,PSG+128
3178
FFFFFFFFFFFFD054                                 playnt:
3179
FFFFFFFFFFFFD054        31FFEF07                        call    KeybdGetChar
3180
FFFFFFFFFFFFD058        B01DF403                        beqi    r1,#CTRLC,Monitor
3181
FFFFFFFFFFFFD05C        B0100861                        beqi    r1,#'a',playnt1a
3182
FFFFFFFFFFFFD060        B0100A62                        beqi    r1,#'b',playnt1b
3183
FFFFFFFFFFFFD064        B0100C63                        beqi    r1,#'c',playnt1c
3184
FFFFFFFFFFFFD068        B0100E64                        beqi    r1,#'d',playnt1d
3185
FFFFFFFFFFFFD06C        B0101065                        beqi    r1,#'e',playnt1e
3186
FFFFFFFFFFFFD070        B0101266                        beqi    r1,#'f',playnt1f
3187
FFFFFFFFFFFFD074        B0101467                        beqi    r1,#'g',playnt1g
3188
FFFFFFFFFFFFD078        BE007EEA                        bra             playnt
3189 27 robfinch
 
3190 46 robfinch
FFFFFFFFFFFFD07C                                 playnt1a:
3191
FFFFFFFFFFFFD07C        E0401C31                        setlo   r1,#7217
3192
FFFFFFFFFFFFD080        31FFF434                        call    Tone
3193
FFFFFFFFFFFFD084        BE007E8A                        bra             playnt
3194
FFFFFFFFFFFFD088                                 playnt1b:
3195
FFFFFFFFFFFFD088        E0401FA5                        setlo   r1,#8101
3196
FFFFFFFFFFFFD08C        31FFF434                        call    Tone
3197
FFFFFFFFFFFFD090        BE007E2A                        bra             playnt
3198
FFFFFFFFFFFFD094                                 playnt1c:
3199
FFFFFFFFFFFFD094        E04010C3                        setlo   r1,#4291
3200
FFFFFFFFFFFFD098        31FFF434                        call    Tone
3201
FFFFFFFFFFFFD09C        BE007DCA                        bra             playnt
3202
FFFFFFFFFFFFD0A0                                 playnt1d:
3203
FFFFFFFFFFFFD0A0        E04012D1                        setlo   r1,#4817
3204
FFFFFFFFFFFFD0A4        31FFF434                        call    Tone
3205
FFFFFFFFFFFFD0A8        BE007D6A                        bra             playnt
3206
FFFFFFFFFFFFD0AC                                 playnt1e:
3207
FFFFFFFFFFFFD0AC        E040151F                        setlo   r1,#5407
3208
FFFFFFFFFFFFD0B0        31FFF434                        call    Tone
3209
FFFFFFFFFFFFD0B4        BE007D0A                        bra             playnt
3210
FFFFFFFFFFFFD0B8                                 playnt1f:
3211
FFFFFFFFFFFFD0B8        E0401660                        setlo   r1,#5728
3212
FFFFFFFFFFFFD0BC        31FFF434                        call    Tone
3213
FFFFFFFFFFFFD0C0        BE007CAA                        bra             playnt
3214
FFFFFFFFFFFFD0C4                                 playnt1g:
3215
FFFFFFFFFFFFD0C4        E040191E                        setlo   r1,#6430
3216
FFFFFFFFFFFFD0C8        31FFF434                        call    Tone
3217
FFFFFFFFFFFFD0CC        BE007C4A                        bra             playnt
3218 43 robfinch
 
3219 46 robfinch
FFFFFFFFFFFFD0D0                                 Tone:
3220
FFFFFFFFFFFFD0D0        0FEF0010                        subui   sp,sp,#16
3221
FFFFFFFFFFFFD0D4        67E08000                        sw              r1,[sp]
3222
FFFFFFFFFFFFD0D8        67EF8008                        sw              lr,8[sp]
3223
FFFFFFFFFFFFD0DC        E6950000                ; SETLO
3224
FFFFFFFFFFFFD0E0        EE800003                ; SETMID
3225
FFFFFFFFFFFFD0E4        6A0D0429                        outc    r1,PSGFREQ0
3226 43 robfinch
                                                        ; decay  (16.384 ms)2
3227
                                                        ; attack (8.192 ms)1
3228
                                                        ; release (1.024 s)A
3229
                                                        ; sustain level C
3230 46 robfinch
FFFFFFFFFFFFD0E8        E07FCA12                        setlo   r1,#0xCA12
3231
FFFFFFFFFFFFD0EC        E6950006                ; SETLO
3232
FFFFFFFFFFFFD0F0        EE800003                ; SETMID
3233
FFFFFFFFFFFFD0F4        6A0D0429                        outc    r1,PSGADSR0
3234
FFFFFFFFFFFFD0F8        16009104                        ori             r1,r0,#0x1104   ; gate, output enable, triangle waveform
3235
FFFFFFFFFFFFD0FC        E6950004                ; SETLO
3236
FFFFFFFFFFFFD100        EE800003                ; SETMID
3237
FFFFFFFFFFFFD104        6A0D0429                        outc    r1,PSGCTRL0
3238
FFFFFFFFFFFFD108        E683D090                ; SETLO
3239
FFFFFFFFFFFFD10C        040D0409                        ori             r1,r0,#250000   ; delay about 10ms
3240
FFFFFFFFFFFFD110                                 tone1:
3241
FFFFFFFFFFFFD110        BE00800F                        loop    r1,tone1
3242
FFFFFFFFFFFFD114        16008104                        ori             r1,r0,#0x0104   ; gate off, output enable, triangle waveform
3243
FFFFFFFFFFFFD118        E6950004                ; SETLO
3244
FFFFFFFFFFFFD11C        EE800003                ; SETMID
3245
FFFFFFFFFFFFD120        6A0D0429                        outc    r1,PSGCTRL0
3246
FFFFFFFFFFFFD124        E683D090                ; SETLO
3247
FFFFFFFFFFFFD128        040D0409                        ori             r1,r0,#250000   ; delay about 10ms
3248
FFFFFFFFFFFFD12C                                 tone2:
3249
FFFFFFFFFFFFD12C        BE00800F                        loop    r1,tone2
3250
FFFFFFFFFFFFD130        16008000                        ori             r1,r0,#0x0000   ; gate off, output enable off, no waveform
3251
FFFFFFFFFFFFD134        E6950004                ; SETLO
3252
FFFFFFFFFFFFD138        EE800003                ; SETMID
3253
FFFFFFFFFFFFD13C        6A0D0429                        outc    r1,PSGCTRL0
3254
FFFFFFFFFFFFD140        47EF8008                        lw              lr,8[sp]
3255
FFFFFFFFFFFFD144        47E08000                        lw              r1,[sp]
3256
FFFFFFFFFFFFD148        37EF8010                        ret             #16
3257 43 robfinch
 
3258
                                                 ;==============================================================================
3259
                                                 ;==============================================================================
3260 46 robfinch
FFFFFFFFFFFFD14C                                 SetupRasterIRQ:
3261
FFFFFFFFFFFFD14C        0FEF0008                        subui   sp,sp,#8
3262
FFFFFFFFFFFFD150        67E08000                        sw              r1,[sp]
3263
FFFFFFFFFFFFD154        E04000C8                        setlo   r1,#200
3264
FFFFFFFFFFFFD158        E69A0100                ; SETLO
3265
FFFFFFFFFFFFD15C        EE800003                ; SETMID
3266
FFFFFFFFFFFFD160        6A0D0429                        outc    r1,RASTERIRQ
3267
FFFFFFFFFFFFD164        E04000F0                        setlo   r1,#240
3268
FFFFFFFFFFFFD168        E69A0102                ; SETLO
3269
FFFFFFFFFFFFD16C        EE800003                ; SETMID
3270
FFFFFFFFFFFFD170        6A0D0429                        outc    r1,RASTERIRQ+2
3271
FFFFFFFFFFFFD174        E0400118                        setlo   r1,#280
3272
FFFFFFFFFFFFD178        E69A0104                ; SETLO
3273
FFFFFFFFFFFFD17C        EE800003                ; SETMID
3274
FFFFFFFFFFFFD180        6A0D0429                        outc    r1,RASTERIRQ+4
3275
FFFFFFFFFFFFD184        E0400140                        setlo   r1,#320
3276
FFFFFFFFFFFFD188        E69A0106                ; SETLO
3277
FFFFFFFFFFFFD18C        EE800003                ; SETMID
3278
FFFFFFFFFFFFD190        6A0D0429                        outc    r1,RASTERIRQ+6
3279
FFFFFFFFFFFFD194        E0400168                        setlo   r1,#360
3280
FFFFFFFFFFFFD198        E69A0108                ; SETLO
3281
FFFFFFFFFFFFD19C        EE800003                ; SETMID
3282
FFFFFFFFFFFFD1A0        6A0D0429                        outc    r1,RASTERIRQ+8
3283
FFFFFFFFFFFFD1A4        47E08000                        lw              r1,[sp]
3284
FFFFFFFFFFFFD1A8        37EF8008                        ret             #8
3285 43 robfinch
 
3286 46 robfinch
FFFFFFFFFFFFD1AC                                 RasterIRQfn:
3287
FFFFFFFFFFFFD1AC        E69A011E                ; SETLO
3288
FFFFFFFFFFFFD1B0        EE800003                ; SETMID
3289
FFFFFFFFFFFFD1B4        6A0D0421                        inch    r1,RASTERIRQ+30         ; get the raster compare register # (clears IRQ)
3290
FFFFFFFFFFFFD1B8        B0100901                        beqi    r1,#1,rirq1
3291
FFFFFFFFFFFFD1BC        B0100802                        beqi    r1,#2,rirq2
3292
FFFFFFFFFFFFD1C0        B0100703                        beqi    r1,#3,rirq3
3293
FFFFFFFFFFFFD1C4        B0100604                        beqi    r1,#4,rirq4
3294
FFFFFFFFFFFFD1C8        B0100505                        beqi    r1,#5,rirq5
3295
FFFFFFFFFFFFD1CC        B0100406                        beqi    r1,#6,rirq6
3296
FFFFFFFFFFFFD1D0        B0100307                        beqi    r1,#7,rirq7
3297
FFFFFFFFFFFFD1D4        B0100208                        beqi    r1,#8,rirq8
3298
FFFFFFFFFFFFD1D8        37EF8000                        ret
3299
FFFFFFFFFFFFD1DC                                 rirq1:
3300
FFFFFFFFFFFFD1DC                                 rirq2:
3301
FFFFFFFFFFFFD1DC                                 rirq3:
3302
FFFFFFFFFFFFD1DC                                 rirq4:
3303
FFFFFFFFFFFFD1DC                                 rirq5:
3304
FFFFFFFFFFFFD1DC                                 rirq6:
3305
FFFFFFFFFFFFD1DC                                 rirq7:
3306
FFFFFFFFFFFFD1DC                                 rirq8:
3307
FFFFFFFFFFFFD1DC        1A108028                        mului   r1,r1,#40
3308
FFFFFFFFFFFFD1E0        0A1080CC                        addui   r1,r1,#204
3309
FFFFFFFFFFFFD1E4        E69AD002                ; SETLO
3310
FFFFFFFFFFFFD1E8        EE800003                ; SETMID
3311
FFFFFFFFFFFFD1EC        6A0D0429                        outc    r1,SPRITEREGS+2
3312
FFFFFFFFFFFFD1F0        E69AD012                ; SETLO
3313
FFFFFFFFFFFFD1F4        EE800003                ; SETMID
3314
FFFFFFFFFFFFD1F8        6A0D0429                        outc    r1,SPRITEREGS+18
3315
FFFFFFFFFFFFD1FC        E69AD022                ; SETLO
3316
FFFFFFFFFFFFD200        EE800003                ; SETMID
3317
FFFFFFFFFFFFD204        6A0D0429                        outc    r1,SPRITEREGS+34
3318
FFFFFFFFFFFFD208        E69AD032                ; SETLO
3319
FFFFFFFFFFFFD20C        EE800003                ; SETMID
3320
FFFFFFFFFFFFD210        6A0D0429                        outc    r1,SPRITEREGS+50
3321
FFFFFFFFFFFFD214        E69AD042                ; SETLO
3322
FFFFFFFFFFFFD218        EE800003                ; SETMID
3323
FFFFFFFFFFFFD21C        6A0D0429                        outc    r1,SPRITEREGS+66
3324
FFFFFFFFFFFFD220        E69AD052                ; SETLO
3325
FFFFFFFFFFFFD224        EE800003                ; SETMID
3326
FFFFFFFFFFFFD228        6A0D0429                        outc    r1,SPRITEREGS+82
3327
FFFFFFFFFFFFD22C        E69AD062                ; SETLO
3328
FFFFFFFFFFFFD230        EE800003                ; SETMID
3329
FFFFFFFFFFFFD234        6A0D0429                        outc    r1,SPRITEREGS+98
3330
FFFFFFFFFFFFD238        E69AD072                ; SETLO
3331
FFFFFFFFFFFFD23C        EE800003                ; SETMID
3332
FFFFFFFFFFFFD240        6A0D0429                        outc    r1,SPRITEREGS+114
3333
FFFFFFFFFFFFD244        37EF8000                        ret
3334 43 robfinch
 
3335
                                                 ;------------------------------------------------------------------------------
3336
                                                 ;------------------------------------------------------------------------------
3337 46 robfinch
FFFFFFFFFFFFD248                                 DisplayDatetime:
3338
FFFFFFFFFFFFD248        0FEF0030                        subui   sp,sp,#48
3339
FFFFFFFFFFFFD24C        67E08000                        sw              r1,[sp]
3340
FFFFFFFFFFFFD250        67E10008                        sw              r2,8[sp]
3341
FFFFFFFFFFFFD254        67E18010                        sw              r3,16[sp]
3342
FFFFFFFFFFFFD258        67E20018                        sw              r4,24[sp]
3343
FFFFFFFFFFFFD25C        67E28020                        sw              r5,32[sp]
3344
FFFFFFFFFFFFD260        67EF8018                        sw              lr,24[sp]
3345
FFFFFFFFFFFFD264        31FFEFF2                        call    CursorOff
3346
FFFFFFFFFFFFD268        16008003                        lw              r1,#3                           ; get cursor position
3347
FFFFFFFFFFFFD26C        0181CD17                        syscall #410
3348
FFFFFFFFFFFFD270        02120009                        mov             r4,r1                           ; r4 = row
3349
FFFFFFFFFFFFD274        02228009                        mov             r5,r2                           ; r5 = col
3350
FFFFFFFFFFFFD278        16008002                        lw              r1,#2                           ; set cursor position
3351
FFFFFFFFFFFFD27C        1601002E                        lw              r2,#46                          ; move cursor down to last display line
3352
FFFFFFFFFFFFD280        16018040                        lw              r3,#64
3353
FFFFFFFFFFFFD284        0181CD17                        syscall #410
3354
FFFFFFFFFFFFD288        16008001                        lw              r1,#1                           ; get the snapshotted date and time
3355
FFFFFFFFFFFFD28C        0181D017                        syscall #416
3356
FFFFFFFFFFFFD290        31FFF169                        call    DisplayWord                     ; display on screen
3357
FFFFFFFFFFFFD294        16008002                        lw              r1,#2                           ; restore cursor position
3358
FFFFFFFFFFFFD298        02410009                        mov             r2,r4                           ; r2 = row
3359
FFFFFFFFFFFFD29C        02518009                        mov             r3,r5                           ; r3 = col
3360
FFFFFFFFFFFFD2A0        0181CD17                        syscall #410
3361
FFFFFFFFFFFFD2A4        31FFEFF7                        call    CursorOn
3362
FFFFFFFFFFFFD2A8        47EF8018                        lw              lr,24[sp]
3363
FFFFFFFFFFFFD2AC        47E18010                        lw              r3,16[sp]
3364
FFFFFFFFFFFFD2B0        47E10008                        lw              r2,8[sp]
3365
FFFFFFFFFFFFD2B4        47E08000                        lw              r1,[sp]
3366
FFFFFFFFFFFFD2B8        47E20018                        lw              r4,24[sp]
3367
FFFFFFFFFFFFD2BC        47E28020                        lw              r5,32[sp]
3368
FFFFFFFFFFFFD2C0        37EF8030                        ret             #48
3369 43 robfinch
 
3370
                                                 ;==============================================================================
3371
                                                 ;==============================================================================
3372 46 robfinch
FFFFFFFFFFFFD2C4                                 InitializeGame:
3373
FFFFFFFFFFFFD2C4        0FEF0010                        subui   sp,sp,#16
3374
FFFFFFFFFFFFD2C8        27F40000004                     sm              [sp],r3/lr
3375
FFFFFFFFFFFFD2CC        E0C00140                        setlo   r3,#320
3376
FFFFFFFFFFFFD2D0        62019508                        sc              r3,Manpos
3377
FFFFFFFFFFFFD2D4        62001500                        sc              r0,Score
3378
FFFFFFFFFFFFD2D8        60001510                        sb              r0,MissileActive
3379
FFFFFFFFFFFFD2DC        62001512                        sc              r0,MissileX
3380
FFFFFFFFFFFFD2E0        62001514                        sc              r0,MissileY
3381
FFFFFFFFFFFFD2E4        27740000004                     lm              [sp],r3/lr
3382
FFFFFFFFFFFFD2E8        37EF8010                        ret             #16
3383 43 robfinch
 
3384 46 robfinch
FFFFFFFFFFFFD2EC                                 DrawScore:
3385
FFFFFFFFFFFFD2EC        0FEF0018                        subui   sp,sp,#24
3386
FFFFFFFFFFFFD2F0        27F40000005                     sm              [sp],r1/r3/lr
3387
FFFFFFFFFFFFD2F4        E0C00001                        setlo   r3,#1
3388
FFFFFFFFFFFFD2F8        60019417                        sb              r3,CursorRow
3389
FFFFFFFFFFFFD2FC        E0C00028                        setlo   r3,#40
3390
FFFFFFFFFFFFD300        60019418                        sb              r3,CursorCol
3391
FFFFFFFFFFFFD304        40009500                        lb              r1,Score
3392
FFFFFFFFFFFFD308        31FFF14B                        call    DisplayByte
3393
FFFFFFFFFFFFD30C        40009501                        lb              r1,Score+1
3394
FFFFFFFFFFFFD310        31FFF14B                        call    DisplayByte
3395
FFFFFFFFFFFFD314        27740000005                     lm              [sp],r1/r3/lr
3396
FFFFFFFFFFFFD318        37EF8018                        ret             #24
3397 43 robfinch
 
3398 46 robfinch
FFFFFFFFFFFFD31C                                 DrawMissile:
3399
FFFFFFFFFFFFD31C        0FEF0010                        subui   sp,sp,#16
3400
FFFFFFFFFFFFD320        27F40000001                     sm              [sp],r1/lr
3401
FFFFFFFFFFFFD324        42009514                        lc              r1,MissileY
3402
FFFFFFFFFFFFD328        AC101402                        bleu    r1,#2,MissileOff
3403
FFFFFFFFFFFFD32C        42009512                        lc              r1,MissileX
3404
FFFFFFFFFFFFD330        06108601                        shrui   r1,r1,#3
3405
FFFFFFFFFFFFD334        60009418                        sb              r1,CursorCol
3406
FFFFFFFFFFFFD338        42009514                        lc              r1,MissileY
3407
FFFFFFFFFFFFD33C        60009417                        sb              r1,CursorRow
3408
FFFFFFFFFFFFD340        0E108001                        subui   r1,r1,#1
3409
FFFFFFFFFFFFD344        62009514                        sc              r1,MissileY
3410
FFFFFFFFFFFFD348        E040005E                        setlo   r1,#'^'
3411
FFFFFFFFFFFFD34C        31FFF07F                        call    DisplayChar
3412
FFFFFFFFFFFFD350        40009418                        lb              r1,CursorCol
3413
FFFFFFFFFFFFD354        0E108001                        subui   r1,r1,#1
3414
FFFFFFFFFFFFD358        60009418                        sb              r1,CursorCol
3415
FFFFFFFFFFFFD35C        40009417                        lb              r1,CursorRow
3416
FFFFFFFFFFFFD360        0E108001                        subui   r1,r1,#1
3417
FFFFFFFFFFFFD364        60009417                        sb              r1,CursorRow
3418
FFFFFFFFFFFFD368        E0400020                        setlo   r1,#' '
3419
FFFFFFFFFFFFD36C        31FFF07F                        call    DisplayChar
3420
FFFFFFFFFFFFD370        27740000001                     lm              [sp],r1/lr
3421
FFFFFFFFFFFFD374        37EF8010                        ret             #16
3422
FFFFFFFFFFFFD378                                 MissileOff:
3423
FFFFFFFFFFFFD378        60001510                        sb              r0,MissileActive
3424
FFFFFFFFFFFFD37C        42009512                        lc              r1,MissileX
3425
FFFFFFFFFFFFD380        06108601                        shrui   r1,r1,#3
3426
FFFFFFFFFFFFD384        60009418                        sb              r1,CursorCol
3427
FFFFFFFFFFFFD388        42009514                        lc              r1,MissileY
3428
FFFFFFFFFFFFD38C        60009417                        sb              r1,CursorRow
3429
FFFFFFFFFFFFD390        E0400020                        setlo   r1,#' '
3430
FFFFFFFFFFFFD394        31FFF07F                        call    DisplayChar
3431
FFFFFFFFFFFFD398        27740000001                     lm              [sp],r1/lr
3432
FFFFFFFFFFFFD39C        37EF8010                        ret             #16
3433 43 robfinch
 
3434 46 robfinch
FFFFFFFFFFFFD3A0                                 DrawMan:
3435
FFFFFFFFFFFFD3A0        0FEF0018                        subui   sp,sp,#24
3436
FFFFFFFFFFFFD3A4        27F40000005                     sm              [sp],r1/r3/lr
3437
FFFFFFFFFFFFD3A8        E0C0002E                        setlo   r3,#46
3438
FFFFFFFFFFFFD3AC        60019417                        sb              r3,CursorRow
3439
FFFFFFFFFFFFD3B0        42019508                        lc              r3,Manpos
3440
FFFFFFFFFFFFD3B4        06318601                        shrui   r3,r3,#3
3441
FFFFFFFFFFFFD3B8        60019418                        sb              r3,CursorCol
3442
FFFFFFFFFFFFD3BC        E0400020                        setlo   r1,#' '
3443
FFFFFFFFFFFFD3C0        31FFF07F                        call    DisplayChar
3444
FFFFFFFFFFFFD3C4        E0400023                        setlo   r1,#'#'
3445
FFFFFFFFFFFFD3C8        31FFF07F                        call    DisplayChar
3446
FFFFFFFFFFFFD3CC        E0400041                        setlo   r1,#'A'
3447
FFFFFFFFFFFFD3D0        31FFF07F                        call    DisplayChar
3448
FFFFFFFFFFFFD3D4        E0400023                        setlo   r1,#'#'
3449
FFFFFFFFFFFFD3D8        31FFF07F                        call    DisplayChar
3450
FFFFFFFFFFFFD3DC        E0400020                        setlo   r1,#' '
3451
FFFFFFFFFFFFD3E0        31FFF07F                        call    DisplayChar
3452
FFFFFFFFFFFFD3E4        27740000005                     lm              [sp],r1/r3/lr
3453
FFFFFFFFFFFFD3E8        37EF8018                        ret             #24
3454 43 robfinch
 
3455 46 robfinch
FFFFFFFFFFFFD3EC                                 DrawInvader:
3456
FFFFFFFFFFFFD3EC        46018000                        lw              r3,InvaderPos
3457
FFFFFFFFFFFFD3F0        160080E9                        lw              r1,#233
3458
FFFFFFFFFFFFD3F4        62308000                        sc              r1,[r3]
3459
FFFFFFFFFFFFD3F8        160080F2                        lw              r1,#242
3460
FFFFFFFFFFFFD3FC        62308001                        sc              r1,1[r3]
3461
FFFFFFFFFFFFD400        160080DF                        lw              r1,#223
3462
FFFFFFFFFFFFD404        62308002                        sc              r1,2[r3]
3463
FFFFFFFFFFFFD408        37EF8000                        ret
3464 43 robfinch
 
3465 46 robfinch
FFFFFFFFFFFFD40C                                 DrawInvaders:
3466
FFFFFFFFFFFFD40C        0FEF0028                        subui   sp,sp,#40
3467
FFFFFFFFFFFFD410        27F4000000F                     sm              [sp],r1/r2/r3/r4/lr
3468
FFFFFFFFFFFFD414        42009520                        lc              r1,InvadersRow1
3469
FFFFFFFFFFFFD418        42021570                        lc              r4,InvadersColpos
3470
FFFFFFFFFFFFD41C        14110001                        andi    r2,r1,#1
3471
FFFFFFFFFFFFD420        BE2003A8                        beq             r2,r0,dinv1
3472
FFFFFFFFFFFFD424        40019571                        lb              r3,InvadersRowpos
3473
FFFFFFFFFFFFD428        60019417                        sb              r3,CursorRow
3474
FFFFFFFFFFFFD42C        60021418                        sb              r4,CursorCol
3475
FFFFFFFFFFFFD430        E0400020                        setlo   r1,#' '
3476
FFFFFFFFFFFFD434        31FFF14B                        call    DisplayByte
3477
FFFFFFFFFFFFD438        E0400023                        setlo   r1,#'#'
3478
FFFFFFFFFFFFD43C        31FFF14B                        call    DisplayByte
3479
FFFFFFFFFFFFD440        E0400023                        setlo   r1,#'#'
3480
FFFFFFFFFFFFD444        31FFF14B                        call    DisplayByte
3481
FFFFFFFFFFFFD448        E0400023                        setlo   r1,#'#'
3482
FFFFFFFFFFFFD44C        31FFF14B                        call    DisplayByte
3483
FFFFFFFFFFFFD450        E0400020                        setlo   r1,#' '
3484
FFFFFFFFFFFFD454        31FFF14B                        call    DisplayByte
3485
FFFFFFFFFFFFD458        40009417                        lb              r1,CursorRow
3486
FFFFFFFFFFFFD45C        0A108001                        addui   r1,r1,#1
3487
FFFFFFFFFFFFD460        60009417                        sb              r1,CursorRow
3488
FFFFFFFFFFFFD464        40009418                        lb              r1,CursorCol
3489
FFFFFFFFFFFFD468        0E108005                        subui   r1,r1,#5
3490
FFFFFFFFFFFFD46C        E0400020                        setlo   r1,#' '
3491
FFFFFFFFFFFFD470        31FFF14B                        call    DisplayByte
3492
FFFFFFFFFFFFD474        E0400058                        setlo   r1,#'X'
3493
FFFFFFFFFFFFD478        31FFF14B                        call    DisplayByte
3494
FFFFFFFFFFFFD47C        E0400020                        setlo   r1,#' '
3495
FFFFFFFFFFFFD480        31FFF14B                        call    DisplayByte
3496
FFFFFFFFFFFFD484        E0400058                        setlo   r1,#'X'
3497
FFFFFFFFFFFFD488        31FFF14B                        call    DisplayByte
3498
FFFFFFFFFFFFD48C        E0400020                        setlo   r1,#' '
3499
FFFFFFFFFFFFD490        31FFF14B                        call    DisplayByte
3500
FFFFFFFFFFFFD494                                 dinv1:
3501
FFFFFFFFFFFFD494        2774000000F                     lm              [sp],r1/r2/r3/r4/lr
3502
FFFFFFFFFFFFD498        37EF8028                        ret             #40
3503
FFFFFFFFFFFFD49C                                 DrawBombs:
3504
FFFFFFFFFFFFD49C        37EF8000                        ret
3505 43 robfinch
 
3506 46 robfinch
FFFFFFFFFFFFD4A0                                 Invaders:
3507
FFFFFFFFFFFFD4A0        FFFFFFFFFFFF0000                        subui   sp,#240
3508
FFFFFFFFFFFFD4A4        27F4000000F                     sm              [sp],r1/r2/r3/r4/lr
3509
FFFFFFFFFFFFD4A8        31FFF4B1                        call    InitializeGame
3510
FFFFFFFFFFFFD4AC                                 InvadersLoop:
3511
FFFFFFFFFFFFD4AC        31FFF4BB                        call    DrawScore
3512
FFFFFFFFFFFFD4B0        31FFF503                        call    DrawInvaders
3513
FFFFFFFFFFFFD4B4        31FFF527                        call    DrawBombs
3514
FFFFFFFFFFFFD4B8        31FFF4C7                        call    DrawMissile
3515
FFFFFFFFFFFFD4BC        31FFF4E8                        call    DrawMan
3516
FFFFFFFFFFFFD4C0                                 TestMoveMan:
3517
FFFFFFFFFFFFD4C0        31FFEF07                        call    KeybdGetChar
3518
FFFFFFFFFFFFD4C4        B010046B                        beqi    r1,#'k',MoveManRight
3519
FFFFFFFFFFFFD4C8        B010096A                        beqi    r1,#'j',MoveManLeft
3520
FFFFFFFFFFFFD4CC        B0100D20                        beqi    r1,#' ',FireMissile
3521
FFFFFFFFFFFFD4D0        BE0002AA                        bra             Invaders1
3522
FFFFFFFFFFFFD4D4                                 MoveManRight:
3523
FFFFFFFFFFFFD4D4        42011508                        lc              r2,Manpos
3524
FFFFFFFFFFFFD4D8        E6800280                ; SETLO
3525
FFFFFFFFFFFFD4DC        BE2D0247                        bgtu    r2,#640,Invaders1
3526
FFFFFFFFFFFFD4E0        0A210008                        addui   r2,r2,#8
3527
FFFFFFFFFFFFD4E4        62011508                        sc              r2,Manpos
3528
FFFFFFFFFFFFD4E8        BE0001EA                        bra             Invaders1
3529
FFFFFFFFFFFFD4EC                                 MoveManLeft:
3530
FFFFFFFFFFFFD4EC        42011508                        lc              r2,Manpos
3531
FFFFFFFFFFFFD4F0        BE2001A2                        ble             r2,r0,Invaders1
3532
FFFFFFFFFFFFD4F4        0E210008                        subui   r2,r2,#8
3533
FFFFFFFFFFFFD4F8        62011508                        sc              r2,Manpos
3534
FFFFFFFFFFFFD4FC        BE00014A                        bra             Invaders1
3535
FFFFFFFFFFFFD500                                 FireMissile:
3536
FFFFFFFFFFFFD500        40011510                        lb              r2,MissileActive
3537
FFFFFFFFFFFFD504        BE200109                        bne             r2,r0,Invaders1
3538
FFFFFFFFFFFFD508        E0800001                        setlo   r2,#1
3539
FFFFFFFFFFFFD50C        60011510                        sb              r2,MissileActive
3540
FFFFFFFFFFFFD510        42011508                        lc              r2,Manpos
3541
FFFFFFFFFFFFD514        62011512                        sc              r2,MissileX
3542
FFFFFFFFFFFFD518        E080002E                        setlo   r2,#46
3543
FFFFFFFFFFFFD51C        62011514                        sc              r2,MissileY
3544
FFFFFFFFFFFFD520        BE00002A                        bra             Invaders1
3545
FFFFFFFFFFFFD524                                 Invaders1:
3546
FFFFFFFFFFFFD524        B0100203                        beqi    r1,#CTRLC,InvadersEnd
3547
FFFFFFFFFFFFD528        BE007C2A                        bra             InvadersLoop
3548
FFFFFFFFFFFFD52C                                 InvadersEnd:
3549
FFFFFFFFFFFFD52C        2774000000F                     lm              [sp],r1/r2/r3/r4/lr
3550
FFFFFFFFFFFFD530        0BEF00F0                        addui   sp,sp,#240
3551
FFFFFFFFFFFFD534        BE0017AA                        bra             Monitor
3552 43 robfinch
 
3553
                                                 ;==============================================================================
3554
                                                 ;==============================================================================
3555 46 robfinch
                                                 ;
3556
                                                 ; Initialize the SD card
3557
                                                 ; Returns
3558
                                                 ; r = 0 if successful, 1 otherwise
3559
                                                 ;
3560
FFFFFFFFFFFFD538                                 spi_init:
3561
FFFFFFFFFFFFD538        0FEF0018                        subui   sp,sp,#24
3562
FFFFFFFFFFFFD53C        67EF8000                        sw              lr,[sp]
3563
FFFFFFFFFFFFD540        67E10008                        sw              r2,8[sp]
3564
FFFFFFFFFFFFD544        67E18010                        sw              r3,16[sp]
3565
FFFFFFFFFFFFD548        E69C0500                ; SETLO
3566
FFFFFFFFFFFFD54C        EE800003                ; SETMID
3567
FFFFFFFFFFFFD550        6A0D0C2D                        lea             r3,SPIMASTER
3568
FFFFFFFFFFFFD554        16008001                        lw              r1,#SPI_INIT_SD
3569
FFFFFFFFFFFFD558        90308002                        outb    r1,SPI_TRANS_TYPE_REG[r3]
3570
FFFFFFFFFFFFD55C        16008001                        lw              r1,#SPI_TRANS_START
3571
FFFFFFFFFFFFD560        90308003                        outb    r1,SPI_TRANS_CTRL_REG[r3]
3572
FFFFFFFFFFFFD564        DE000000                        nop
3573
FFFFFFFFFFFFD568                                 spi_init1:
3574
FFFFFFFFFFFFD568        80308004                        inb             r1,SPI_TRANS_STATUS_REG[r3]
3575
FFFFFFFFFFFFD56C        02110009                        mov             r2,r1                                                   ; note: some time needs to be wasted
3576
FFFFFFFFFFFFD570        02208009                        mov             r1,r2                                                   ; between status reads.
3577
FFFFFFFFFFFFD574        B01FFD01                        beqi    r1,#SPI_TRANS_BUSY,spi_init1
3578
FFFFFFFFFFFFD578        80308005                        inb             r1,SPI_TRANS_ERROR_REG[r3]
3579
FFFFFFFFFFFFD57C        2A108204                        bfext   r1,r1,#1,#0
3580
FFFFFFFFFFFFD580        B2100500                        bne             r1,#SPI_INIT_NO_ERROR,spi_error
3581
FFFFFFFFFFFFD584        9A00D946                        lea             r1,spi_init_ok_msg
3582
FFFFFFFFFFFFD588        31FFF122                        call    DisplayString
3583
FFFFFFFFFFFFD58C        0410840A                        xor             r1,r1,r1
3584
FFFFFFFFFFFFD590        BE0000AA                        bra             spi_init_exit
3585
FFFFFFFFFFFFD594                                 spi_error:
3586
FFFFFFFFFFFFD594        31FFF14B                        call    DisplayByte
3587
FFFFFFFFFFFFD598        9A00D960                        lea             r1,spi_init_error_msg
3588
FFFFFFFFFFFFD59C        31FFF122                        call    DisplayString
3589
FFFFFFFFFFFFD5A0        16008001                        lw              r1,#1
3590
FFFFFFFFFFFFD5A4                                 spi_init_exit:
3591
FFFFFFFFFFFFD5A4        47EF8000                        lw              lr,[sp]
3592
FFFFFFFFFFFFD5A8        47E10008                        lw              r2,8[sp]
3593
FFFFFFFFFFFFD5AC        47E18010                        lw              r3,16[sp]
3594
FFFFFFFFFFFFD5B0        37EF8018                        ret             #24
3595
 
3596
 
3597
                                                 ; SPI read sector
3598
                                                 ;
3599
                                                 ; r1= sector number to read
3600
                                                 ; r2= address to place read data
3601
                                                 ; Returns:
3602
                                                 ; r1 = 0 if successful
3603
                                                 ;
3604
FFFFFFFFFFFFD5B4                                 spi_read_sector:
3605
FFFFFFFFFFFFD5B4        0FEF0028                        subui   sp,sp,#40
3606
FFFFFFFFFFFFD5B8        67EF8000                        sw              lr,[sp]
3607
FFFFFFFFFFFFD5BC        67E28008                        sw              r5,8[sp]
3608
FFFFFFFFFFFFD5C0        67E10010                        sw              r2,16[sp]
3609
FFFFFFFFFFFFD5C4        67E18018                        sw              r3,24[sp]
3610
FFFFFFFFFFFFD5C8        67E20020                        sw              r4,32[sp]
3611
FFFFFFFFFFFFD5CC        E69C0500                ; SETLO
3612
FFFFFFFFFFFFD5D0        EE800003                ; SETMID
3613
FFFFFFFFFFFFD5D4        6A0D0C2D                        lea             r3,SPIMASTER
3614
 
3615
                                                        ; spi master wants a byte address, so we multiply the sector number
3616
                                                        ; by 512.
3617
FFFFFFFFFFFFD5D8        06109206                        shlui   r1,r1,#9
3618
FFFFFFFFFFFFD5DC        90308007                        outb    r1,SPI_SD_ADDR_7_0_REG[r3]
3619
FFFFFFFFFFFFD5E0        06109001                        shrui   r1,r1,#8
3620
FFFFFFFFFFFFD5E4        90308008                        outb    r1,SPI_SD_ADDR_15_8_REG[r3]
3621
FFFFFFFFFFFFD5E8        06109001                        shrui   r1,r1,#8
3622
FFFFFFFFFFFFD5EC        90308009                        outb    r1,SPI_SD_ADDR_23_16_REG[r3]
3623
FFFFFFFFFFFFD5F0        06109001                        shrui   r1,r1,#8
3624
FFFFFFFFFFFFD5F4        9030800A                        outb    r1,SPI_SD_ADDR_31_24_REG[r3]
3625
 
3626
                                                        ; Force the reciever fifo to be empty, in case a prior error leaves it
3627
                                                        ; in an unknown state.
3628
FFFFFFFFFFFFD5F8        16008001                        lw              r1,#1
3629
FFFFFFFFFFFFD5FC        90308014                        outb    r1,SPI_RX_FIFO_CTRL_REG[r3]
3630
 
3631
FFFFFFFFFFFFD600        16008002                        lw              r1,#RW_READ_SD_BLOCK
3632
FFFFFFFFFFFFD604        90308002                        outb    r1,SPI_TRANS_TYPE_REG[r3]
3633
FFFFFFFFFFFFD608        16008001                        lw              r1,#SPI_TRANS_START
3634
FFFFFFFFFFFFD60C        90308003                        outb    r1,SPI_TRANS_CTRL_REG[r3]
3635
FFFFFFFFFFFFD610        DE000000                        nop
3636
FFFFFFFFFFFFD614                                 spi_read_sect1:
3637
FFFFFFFFFFFFD614        80308004                        inb             r1,SPI_TRANS_STATUS_REG[r3]
3638
FFFFFFFFFFFFD618        02120009                        mov             r4,r1                                                   ; just a delay between consecutive status reg reads
3639
FFFFFFFFFFFFD61C        02408009                        mov             r1,r4
3640
FFFFFFFFFFFFD620        B01FFD01                        beqi    r1,#SPI_TRANS_BUSY,spi_read_sect1
3641
FFFFFFFFFFFFD624        80308005                        inb             r1,SPI_TRANS_ERROR_REG[r3]
3642
FFFFFFFFFFFFD628        2A108614                        bfext   r1,r1,#3,#2
3643
FFFFFFFFFFFFD62C        B2100800                        bnei    r1,#SPI_READ_NO_ERROR,spi_read_error
3644
FFFFFFFFFFFFD630        16020200                        lw              r4,#512         ; read 512 bytes from fifo
3645
FFFFFFFFFFFFD634                                 spi_read_sect2:
3646
FFFFFFFFFFFFD634        80308010                        inb             r1,SPI_RX_FIFO_DATA_REG[r3]
3647
FFFFFFFFFFFFD638        60208000                        sb              r1,[r2]
3648
FFFFFFFFFFFFD63C        0A210001                        addui   r2,r2,#1
3649
FFFFFFFFFFFFD640        BE027FAF                        loop    r4,spi_read_sect2
3650
FFFFFFFFFFFFD644        0410840A                        xor             r1,r1,r1
3651
FFFFFFFFFFFFD648        BE0000AA                        bra             spi_read_ret
3652
FFFFFFFFFFFFD64C                                 spi_read_error:
3653
FFFFFFFFFFFFD64C        31FFF14B                        call    DisplayByte
3654
FFFFFFFFFFFFD650        9A00D99E                        lea             r1,spi_read_error_msg
3655
FFFFFFFFFFFFD654        31FFF122                        call    DisplayString
3656
FFFFFFFFFFFFD658        16008001                        lw              r1,#1
3657
FFFFFFFFFFFFD65C                                 spi_read_ret:
3658
FFFFFFFFFFFFD65C        47EF8000                        lw              lr,[sp]
3659
FFFFFFFFFFFFD660        47E28008                        lw              r5,8[sp]
3660
FFFFFFFFFFFFD664        47E10010                        lw              r2,16[sp]
3661
FFFFFFFFFFFFD668        47E18018                        lw              r3,24[sp]
3662
FFFFFFFFFFFFD66C        47E20020                        lw              r4,32[sp]
3663
FFFFFFFFFFFFD670        37EF8028                        ret             #40
3664
 
3665
                                                 ; Read the boot sector from the disk.
3666
                                                 ; Must find it first by looking for the signature bytes 'EB' and '55AA'.
3667
                                                 ;
3668
FFFFFFFFFFFFD674                                 spi_read_boot:
3669
FFFFFFFFFFFFD674        0FEF0020                        subui   sp,sp,#32
3670
FFFFFFFFFFFFD678        67EF8000                        sw              lr,[sp]
3671
FFFFFFFFFFFFD67C        67E10008                        sw              r2,8[sp]
3672
FFFFFFFFFFFFD680        67E18010                        sw              r3,16[sp]
3673
FFFFFFFFFFFFD684        67E28018                        sw              r5,24[sp]
3674
FFFFFFFFFFFFD688        660030F8                        sw              r0,startSector                                  ; default starting sector
3675
FFFFFFFFFFFFD68C        160181F4                        lw              r3,#500 ;1934720                                                ; number of sectors to read (up to 1GB)
3676
FFFFFFFFFFFFD690        16028000                        lw              r5,#0                                                   ; r5 = starting address
3677
FFFFFFFFFFFFD694                                 spi_read_boot1:
3678
FFFFFFFFFFFFD694        02508009                        mov             r1,r5                                                   ; r1 = sector number
3679
FFFFFFFFFFFFD698        16010008                        lw              r2,#8                                                   ; eight digits
3680
FFFFFFFFFFFFD69C        60001418                        sb              r0,CursorCol
3681
FFFFFFFFFFFFD6A0        31FFF13F                        call    DisplayNum                                              ; Display the sector number being checked
3682
FFFFFFFFFFFFD6A4        02508009                        mov             r1,r5                                                   ; r1 = sector number
3683
FFFFFFFFFFFFD6A8        E6800000                ; SETLO
3684
FFFFFFFFFFFFD6AC        EE800402                ; SETMID
3685
FFFFFFFFFFFFD6B0        040D0809                        lw              r2,#0x100800000                                 ; r2 = target address
3686
FFFFFFFFFFFFD6B4        31FFF56D                        call    spi_read_sector
3687
 
3688
                                                 ; The following displays the contents of the sector
3689
                                                 ;      lw              r1,#0x10
3690
                                                 ;      lw              r2,#0x3800
3691
                                                 ;spi_read_boot5:
3692
                                                 ;      call    DisplayMemB
3693
                                                 ;      loop    r1,spi_read_boot5
3694
 
3695
FFFFFFFFFFFFD6B8        0A528001                        addui   r5,r5,#1                                                ; move to next sector
3696
FFFFFFFFFFFFD6BC        E6800000                ; SETLO
3697
FFFFFFFFFFFFD6C0        EE800402                ; SETMID
3698
FFFFFFFFFFFFD6C4        6A0D0405                        lbu             r1,0x100800000
3699
FFFFFFFFFFFFD6C8        121100EB                        cmpui   r2,r1,#0xEB
3700
FFFFFFFFFFFFD6CC        BE200088                        beq             r2,r0,spi_read_boot2
3701
FFFFFFFFFFFFD6D0                                 spi_read_boot3:
3702
FFFFFFFFFFFFD6D0        BE01FE2F                        loop    r3,spi_read_boot1
3703
FFFFFFFFFFFFD6D4        16008001                        lw              r1,#1                                                   ; r1 = 1 for error
3704
FFFFFFFFFFFFD6D8        BE0001EA                        bra             spi_read_boot4
3705
FFFFFFFFFFFFD6DC                                 spi_read_boot2:
3706
FFFFFFFFFFFFD6DC        9A00D728                        lea             r1,msgFoundEB
3707
FFFFFFFFFFFFD6E0        31FFF122                        call    DisplayString
3708
FFFFFFFFFFFFD6E4        E68001FE                ; SETLO
3709
FFFFFFFFFFFFD6E8        EE800402                ; SETMID
3710
FFFFFFFFFFFFD6EC        6A0D0405                        lbu             r1,0x1008001FE                                  ; check for 0x55AA signature
3711
FFFFFFFFFFFFD6F0        B21FF855                        bnei    r1,#0x55,spi_read_boot3
3712
FFFFFFFFFFFFD6F4        E68001FF                ; SETLO
3713
FFFFFFFFFFFFD6F8        EE800402                ; SETMID
3714
FFFFFFFFFFFFD6FC        6A0D0405                        lbu             r1,0x1008001FF
3715
FFFFFFFFFFFFD700        E68000AA                ; SETLO
3716
FFFFFFFFFFFFD704        BE1D7E69                        bnei    r1,#0xAA,spi_read_boot3
3717
FFFFFFFFFFFFD708        0E508001                        subui   r1,r5,#1
3718
FFFFFFFFFFFFD70C        6600B0F8                        sw              r1,startSector
3719
FFFFFFFFFFFFD710        0410840A                        xor             r1,r1,r1                                                ; r1 = 0, for okay status
3720
FFFFFFFFFFFFD714                                 spi_read_boot4:
3721
FFFFFFFFFFFFD714        47EF8000                        lw              lr,[sp]
3722
FFFFFFFFFFFFD718        47E10008                        lw              r2,8[sp]
3723
FFFFFFFFFFFFD71C        47E18010                        lw              r3,16[sp]
3724
FFFFFFFFFFFFD720        47E28018                        lw              r5,24[sp]
3725
FFFFFFFFFFFFD724        37EF8020                        ret             #32
3726
 
3727
FFFFFFFFFFFFD728                                 msgFoundEB:
3728
FFFFFFFFFFFFD728 424520646E756F46               db      "Found EB code.",CR,LF,0
3729
FFFFFFFFFFFFD730 0A0D2E65646F6320
3730
FFFFFFFFFFFFD73C                                        .align 4
3731
 
3732
                                                 ; Load the FAT tables into memory
3733
                                                 ;
3734
FFFFFFFFFFFFD73C                                 loadFAT:
3735
FFFFFFFFFFFFD73C        0FEF0008                        subui   sp,sp,#8
3736
FFFFFFFFFFFFD740        67EF8000                        sw              lr,[sp]
3737
FFFFFFFFFFFFD744        E6800016                ; SETLO
3738
FFFFFFFFFFFFD748        EE800402                ; SETMID
3739
FFFFFFFFFFFFD74C        6A0D0C06                        lcu             r3,0x100800016                                  ; sectors per FAT
3740
FFFFFFFFFFFFD750        E6800010                ; SETLO
3741
FFFFFFFFFFFFD754        EE800402                ; SETMID
3742
FFFFFFFFFFFFD758        6A0D0805                        lbu             r2,0x100800010                                  ; number of FATs
3743
FFFFFFFFFFFFD75C        04310C18                        mulu    r3,r3,r2                                                ; offset
3744
FFFFFFFFFFFFD760        E6800200                ; SETLO
3745
FFFFFFFFFFFFD764        EE800402                ; SETMID
3746
FFFFFFFFFFFFD768        6A0D082D                        lea             r2,0x100800200                                  ; where to place FAT
3747
FFFFFFFFFFFFD76C        E680000E                ; SETLO
3748
FFFFFFFFFFFFD770        EE800402                ; SETMID
3749
FFFFFFFFFFFFD774        6A0D1406                        lcu             r5,0x10080000E                                  ; r5 = # reserved sectors before FAT
3750
FFFFFFFFFFFFD778        460330F8                        lw              r6,startSector
3751
FFFFFFFFFFFFD77C        04531403                        addu    r5,r5,r6
3752
FFFFFFFFFFFFD780                                 loadFAT1:
3753
FFFFFFFFFFFFD780        02508009                        mov             r1,r5                                                   ; r1 = sector #
3754
FFFFFFFFFFFFD784        31FFF56D                        call    spi_read_sector
3755
FFFFFFFFFFFFD788        0A528001                        addui   r5,r5,#1
3756
FFFFFFFFFFFFD78C        0A210200                        addui   r2,r2,#512                                              ; advance 512 bytes
3757
FFFFFFFFFFFFD790        BE01FF8F                        loop    r3,loadFAT1
3758
FFFFFFFFFFFFD794        47EF8000                        lw              lr,[sp]
3759
FFFFFFFFFFFFD798        37EF8008                        ret             #8
3760
 
3761
                                                 ; Load the root directory from disk
3762
                                                 ; r2 = where to place root directory in memory
3763
                                                 ;
3764
FFFFFFFFFFFFD79C                                 loadRootDirectory:
3765
FFFFFFFFFFFFD79C        E6800016                ; SETLO
3766
FFFFFFFFFFFFD7A0        EE800402                ; SETMID
3767
FFFFFFFFFFFFD7A4        6A0D0C06                        lcu             r3,0x100800016                                  ; sectors per FAT
3768
FFFFFFFFFFFFD7A8        E6800010                ; SETLO
3769
FFFFFFFFFFFFD7AC        EE800402                ; SETMID
3770
FFFFFFFFFFFFD7B0        6A0D1005                        lbu             r4,0x100800010                                  ; number of FATs
3771
FFFFFFFFFFFFD7B4        04320C18                        mulu    r3,r3,r4                                                ; offset
3772
FFFFFFFFFFFFD7B8        E680000E                ; SETLO
3773
FFFFFFFFFFFFD7BC        EE800402                ; SETMID
3774
FFFFFFFFFFFFD7C0        6A0D1006                        lcu             r4,0x10080000E                                  ; r2 = # reserved sectors before FAT
3775
FFFFFFFFFFFFD7C4        04320C03                        addu    r3,r3,r4                                                ; r3 = root directory sector number
3776
FFFFFFFFFFFFD7C8        460330F8                        lw              r6,startSector
3777
FFFFFFFFFFFFD7CC        04331403                        addu    r5,r3,r6                                                ; r5 = root directory sector number
3778
                                                        ; we have to use two byte loads here because the number is at an unaligned data address
3779
FFFFFFFFFFFFD7D0        E6800011                ; SETLO
3780
FFFFFFFFFFFFD7D4        EE800402                ; SETMID
3781
FFFFFFFFFFFFD7D8        6A0D1C05                        lbu             r7,0x100800011                                  ; r7 <= number of root directory entries
3782
FFFFFFFFFFFFD7DC        E6800012                ; SETLO
3783
FFFFFFFFFFFFD7E0        EE800402                ; SETMID
3784
FFFFFFFFFFFFD7E4        6A0D2005                        lbu             r8,0x100800012
3785
FFFFFFFFFFFFD7E8        06841006                        shlui   r8,r8,#8
3786
FFFFFFFFFFFFD7EC        04741C09                        or              r7,r7,r8
3787
FFFFFFFFFFFFD7F0        02740009                        mov             r8,r7                                                   ; r8 = number of root directory entries
3788
FFFFFFFFFFFFD7F4        06738A06                        shlui   r7,r7,#5                                                ; r7 *=32 = size of root directory table (bytes)
3789
FFFFFFFFFFFFD7F8        06739201                        shrui   r7,r7,#9                                                ; r7 /= 512 = number of sectors in root directory
3790
FFFFFFFFFFFFD7FC        02718009                        mov             r3,r7
3791
FFFFFFFFFFFFD800                                 loadRootDir1:
3792
FFFFFFFFFFFFD800        02508009                        mov             r1,r5
3793
FFFFFFFFFFFFD804        31FFF56D                        call    spi_read_sector
3794
FFFFFFFFFFFFD808        0A528001                        addui   r5,r5,#1
3795
FFFFFFFFFFFFD80C        0A210200                        addui   r2,r2,#512
3796
FFFFFFFFFFFFD810        BE01FF8F                        loop    r3,loadRootDir1
3797
 
3798
FFFFFFFFFFFFD814                                 loadBootFile:
3799
                                                        ; For now we cheat and just go directly to sector 512.
3800
FFFFFFFFFFFFD814        BE0004AA                        bra             loadBootFileTmp
3801
 
3802
FFFFFFFFFFFFD818        E6800016                ; SETLO
3803
FFFFFFFFFFFFD81C        EE800402                ; SETMID
3804
FFFFFFFFFFFFD820        6A0D0C06                        lcu             r3,0x100800016                                  ; sectors per FAT
3805
FFFFFFFFFFFFD824        E6800010                ; SETLO
3806
FFFFFFFFFFFFD828        EE800402                ; SETMID
3807
FFFFFFFFFFFFD82C        6A0D0805                        lbu             r2,0x100800010                                  ; number of FATs
3808
FFFFFFFFFFFFD830        04310C18                        mulu    r3,r3,r2                                                ; offset
3809
FFFFFFFFFFFFD834        E680000E                ; SETLO
3810
FFFFFFFFFFFFD838        EE800402                ; SETMID
3811
FFFFFFFFFFFFD83C        6A0D0806                        lcu             r2,0x10080000E                                  ; r2 = # reserved sectors before FAT
3812
FFFFFFFFFFFFD840        04310C03                        addu    r3,r3,r2                                                ; r3 = root directory sector number
3813
                                                        ; we have to use two byte loads here because the number is at an unaligned data address
3814
FFFFFFFFFFFFD844        E6800011                ; SETLO
3815
FFFFFFFFFFFFD848        EE800402                ; SETMID
3816
FFFFFFFFFFFFD84C        6A0D1C05                        lbu             r7,0x100800011                                  ; r7 <= number of root directory entries
3817
FFFFFFFFFFFFD850        E6800012                ; SETLO
3818
FFFFFFFFFFFFD854        EE800402                ; SETMID
3819
FFFFFFFFFFFFD858        6A0D2005                        lbu             r8,0x100800012
3820
FFFFFFFFFFFFD85C        06841006                        shlui   r8,r8,#8
3821
FFFFFFFFFFFFD860        04741C09                        or              r7,r7,r8
3822
FFFFFFFFFFFFD864        02740009                        mov             r8,r7                                                   ; r8 = number of root directory entries
3823
FFFFFFFFFFFFD868        06738A06                        shlui   r7,r7,#5                                                ; r7 *=32 = size of root directory table (bytes)
3824
FFFFFFFFFFFFD86C        06739201                        shrui   r7,r7,#9                                                ; r7 /= 512 = number of sectors in root directory
3825
 
3826
                                                 ; now we need to fetch the sectors of the root directory and put them somewhere in
3827
                                                 ; memory
3828
                                                 ;
3829
FFFFFFFFFFFFD870                                 loadBootFile4:
3830
FFFFFFFFFFFFD870        46308000                        lw              r1,[r3]                                                 ; get filename
3831
FFFFFFFFFFFFD874        E68F4F42                ; SETLO
3832
FFFFFFFFFFFFD878        EEA51951                ; SETMID
3833
FFFFFFFFFFFFD87C        F68454C4                ; SETHI
3834
FFFFFFFFFFFFD880        041D0407                        cmpui   r1,r1,#0x454C4946544F4F42               ; "BOOTFILE"
3835
FFFFFFFFFFFFD884        BE100068                        beq             r1,r0,loadBootFile5
3836
FFFFFFFFFFFFD888                                 loadBootFile3:
3837
FFFFFFFFFFFFD888        0A318020                        addui   r3,r3,#32                                               ; move to next directory entry
3838
FFFFFFFFFFFFD88C        BE03FF2F                        loop    r7,loadBootFile4
3839
                                                 ; boot file not found
3840
 
3841
                                                 ; here we found the file in the directory
3842
                                                 ;
3843
FFFFFFFFFFFFD890                                 loadBootFile5:
3844
FFFFFFFFFFFFD890        4C31001A                        lcu             r2,0x1a[r3]                                             ; get starting cluster
3845
FFFFFFFFFFFFD894        E6800011                ; SETLO
3846
FFFFFFFFFFFFD898        EE800402                ; SETMID
3847
FFFFFFFFFFFFD89C        6A0D1C06                        lcu             r7,0x100800011                                  ; r7 = number of root directory entries
3848
FFFFFFFFFFFFD8A0        06738A06                        shlui   r7,r7,#5                                                ; r7 *=32 = size of root directory table (bytes)
3849
FFFFFFFFFFFFD8A4        06739201                        shrui   r7,r7,#9                                                ; r7 /= 512 = number of sectors in root directory
3850
 
3851
FFFFFFFFFFFFD8A8                                 loadBootFileTmp:
3852
                                                        ; We load the number of sectors per cluster, then load a single cluster of the file.
3853
                                                        ; This is 16kib
3854
FFFFFFFFFFFFD8A8        E680000D                ; SETLO
3855
FFFFFFFFFFFFD8AC        EE800402                ; SETMID
3856
FFFFFFFFFFFFD8B0        6A0D0C05                        lbu             r3,0x10080000D                                  ; sectors per cluster
3857
FFFFFFFFFFFFD8B4        E6800200                ; SETLO
3858
FFFFFFFFFFFFD8B8        EE800402                ; SETMID
3859
FFFFFFFFFFFFD8BC        6A0D082D                        lea             r2,0x100800200                                  ; where to place FAT in memory
3860
FFFFFFFFFFFFD8C0        4602B0F8                        lw              r5,startSector                                  ; r5=start sector of disk
3861
FFFFFFFFFFFFD8C4        0A528200                        addui   r5,r5,#512                                              ; r5= sector 512
3862
FFFFFFFFFFFFD8C8                                 loadBootFile1:
3863
FFFFFFFFFFFFD8C8        02508009                        mov             r1,r5                                                   ; r1=sector to read
3864
FFFFFFFFFFFFD8CC        31FFF56D                        call    spi_read_sector
3865
FFFFFFFFFFFFD8D0        0A528001                        addui   r5,r5,#1                                                ; r5 = next sector
3866
FFFFFFFFFFFFD8D4        0A210200                        addui   r2,r2,#512
3867
FFFFFFFFFFFFD8D8        BE01FF8F                        loop    r3,loadBootFile1
3868
FFFFFFFFFFFFD8DC        E6800200                ; SETLO
3869
FFFFFFFFFFFFD8E0        EE800402                ; SETMID
3870
FFFFFFFFFFFFD8E4        6A0D0407                        lhu             r1,0x100800200                                  ; make sure it's bootable
3871
FFFFFFFFFFFFD8E8        E68F4F42                ; SETLO
3872
FFFFFFFFFFFFD8EC        EE800151                ; SETMID
3873
FFFFFFFFFFFFD8F0        BE1D0129                        bnei    r1,#0x544F4F42,loadBootFile2
3874
FFFFFFFFFFFFD8F4        16008016                        lw              r1,#0x16
3875
FFFFFFFFFFFFD8F8        9A00D920                        lea             r1,msgJumpingToBoot
3876
FFFFFFFFFFFFD8FC        31FFF122                        call    DisplayString
3877
FFFFFFFFFFFFD900        E6800204                ; SETLO
3878
FFFFFFFFFFFFD904        EE800402                ; SETMID
3879
FFFFFFFFFFFFD908        040D0409                        lw              r1,#0x100800204
3880
FFFFFFFFFFFFD90C        341F8000                        jal             lr,[r1]
3881
FFFFFFFFFFFFD910        33FFF20A                        jmp             Monitor
3882
FFFFFFFFFFFFD914                                 loadBootFile2:
3883
FFFFFFFFFFFFD914        9A00D930                        lea             r1,msgNotBootable
3884
FFFFFFFFFFFFD918        31FFF122                        call    DisplayString
3885
FFFFFFFFFFFFD91C        33FFF20A                        jmp             Monitor
3886
 
3887
FFFFFFFFFFFFD920                                 msgJumpingToBoot:
3888
FFFFFFFFFFFFD920 20676E69706D754A               db      "Jumping to boot",0
3889
FFFFFFFFFFFFD928 00746F6F62206F74
3890
FFFFFFFFFFFFD930                                 msgNotBootable:
3891
FFFFFFFFFFFFD930 2064726163204453               db      "SD card not bootable.",0
3892
FFFFFFFFFFFFD938 746F6F6220746F6E
3893
FFFFFFFFFFFFD946                                 spi_init_ok_msg:
3894
FFFFFFFFFFFFD940 4453002E656C6261               db "SD card initialized okay.",0
3895
FFFFFFFFFFFFD948 6E69206472616320
3896
FFFFFFFFFFFFD950 657A696C61697469
3897
FFFFFFFFFFFFD958 002E79616B6F2064
3898
FFFFFFFFFFFFD960                                 spi_init_error_msg:
3899
FFFFFFFFFFFFD960 20726F727265203A               db      ": error occurred initializing the SD card.",0
3900
FFFFFFFFFFFFD968 646572727563636F
3901
FFFFFFFFFFFFD970 6C616974696E6920
3902
FFFFFFFFFFFFD978 687420676E697A69
3903
FFFFFFFFFFFFD980 7261632044532065
3904
FFFFFFFFFFFFD98B                                 spi_boot_error_msg:
3905
FFFFFFFFFFFFD988 6163204453002E64               db      "SD card boot error",0
3906
FFFFFFFFFFFFD990 20746F6F62206472
3907
FFFFFFFFFFFFD99E                                 spi_read_error_msg:
3908
FFFFFFFFFFFFD998 445300726F727265               db      "SD card read error",0
3909
FFFFFFFFFFFFD9A0 6572206472616320
3910
FFFFFFFFFFFFD9A8 726F727265206461
3911
 
3912
FFFFFFFFFFFFD9B4                                        .align  4
3913
 
3914
                                                 ;==============================================================================
3915
                                                 ; Ethernet
3916
                                                 ;==============================================================================
3917
                                                 my_MAC1        EQU     0x00
3918
                                                 my_MAC2        EQU     0xFF
3919
                                                 my_MAC3        EQU     0xEE
3920
                                                 my_MAC4        EQU     0xF0
3921
                                                 my_MAC5        EQU     0xDA
3922
                                                 my_MAC6        EQU     0x42
3923
 
3924
FFFFFFFFFFFFD9B4                                        .bss
3925
FFFFFFFFFFFFD9B4 0000000000000000        eth_unique_id  dw              0
3926
 
3927
FFFFFFFFFFFFD9BC                                        .code
3928
 
3929
                                                 ; Initialize the ethmac controller.
3930
                                                 ; Supply a MAC address, set MD clock
3931
                                                 ;
3932
FFFFFFFFFFFFD9BC                                 eth_init:
3933
FFFFFFFFFFFFD9BC        E69C2000                ; SETLO
3934
FFFFFFFFFFFFD9C0        EE800003                ; SETMID
3935
FFFFFFFFFFFFD9C4        6A0D0C2D                        lea             r3,ETHMAC
3936
FFFFFFFFFFFFD9C8        16008064                        lw              r1,#0x64                        ; 100
3937
FFFFFFFFFFFFD9CC        64308028                        sh              r1,MIIMODER[r3]
3938
FFFFFFFFFFFFD9D0        16008007                        lw              r1,#7                           ; PHY address
3939
FFFFFFFFFFFFD9D4        64308030                        sh              r1,MIIADDRESS[r3]
3940
FFFFFFFFFFFFD9D8        E6B0DA42                ; SETLO
3941
FFFFFFFFFFFFD9DC        EEBFFFBB                ; SETMID
3942
FFFFFFFFFFFFD9E0        040D0409                        lw              r1,#0xEEF0DA42
3943
FFFFFFFFFFFFD9E4        64308040                        sh              r1,0x40[r3]                     ; MAC0
3944
FFFFFFFFFFFFD9E8        160080FF                        lw              r1,#0x00FF
3945
FFFFFFFFFFFFD9EC        64308044                        sh              r1,0x44[r3]                     ; MAC1
3946
FFFFFFFFFFFFD9F0        37EF8000                        ret
3947
 
3948
                                                 ; Request a packet and display on screen
3949
                                                 ; r1 = address where to put packet
3950
                                                 ;
3951
FFFFFFFFFFFFD9F4                                 eth_request_packet:
3952
FFFFFFFFFFFFD9F4        0FEF0018                        subui   sp,sp,#24
3953
FFFFFFFFFFFFD9F8        67E18000                        sw              r3,[sp]
3954
FFFFFFFFFFFFD9FC        67E10008                        sw              r2,8[sp]
3955
FFFFFFFFFFFFDA00        67E20010                        sw              r4,16[sp]
3956
FFFFFFFFFFFFDA04        E69C2000                ; SETLO
3957
FFFFFFFFFFFFDA08        EE800003                ; SETMID
3958
FFFFFFFFFFFFDA0C        6A0D0C2D                        lea             r3,ETHMAC
3959
FFFFFFFFFFFFDA10        16010004                        lw              r2,#4                           ; clear rx interrupt
3960
FFFFFFFFFFFFDA14        64310004                        sh              r2,4[r3]
3961
FFFFFFFFFFFFDA18        64308604                        sh              r1,0x604[r3]            ; storage address
3962
FFFFFFFFFFFFDA1C        16016000                        lw              r2,#0xe000                      ; enable interrupt
3963
FFFFFFFFFFFFDA20        64310600                        sh              r2,0x600[r3]
3964
FFFFFFFFFFFFDA24                                 eth1:
3965
FFFFFFFFFFFFDA24        DE000000                        nop
3966
FFFFFFFFFFFFDA28        84310004                        inh             r2,4[r3]
3967
FFFFFFFFFFFFDA2C        2A210414                        bfext   r2,r2,#2,#2                     ; get bit #2
3968
FFFFFFFFFFFFDA30        BE207FA8                        beq             r2,r0,eth1
3969
FFFFFFFFFFFFDA34        84310600                        inh             r2,0x600[r3]            ; get from descriptor
3970
FFFFFFFFFFFFDA38        06212001                        shrui   r2,r2,#16
3971
FFFFFFFFFFFFDA3C        16018000                        lw              r3,#0
3972
FFFFFFFFFFFFDA40        E6901D88                ; SETLO
3973
FFFFFFFFFFFFDA44        EE800003                ; SETMID
3974
FFFFFFFFFFFFDA48        6A0D102D                        lea             r4,TEXTSCR+7560         ; second last line of screen
3975
FFFFFFFFFFFFDA4C                                 eth20:
3976
FFFFFFFFFFFFDA4C        6A118805                        lbu             r2,[r1+r3]                      ; get byte
3977
FFFFFFFFFFFFDA50        6A418911                        sc              r2,[r4+r3*2]            ; store to screen
3978
FFFFFFFFFFFFDA54        0A318001                        addui   r3,r3,#1
3979
FFFFFFFFFFFFDA58        12310053                        cmpui   r2,r3,#83
3980
FFFFFFFFFFFFDA5C        BE207F89                        bne             r2,r0,eth20
3981
FFFFFFFFFFFFDA60        47E18000                        lw              r3,[sp]
3982
FFFFFFFFFFFFDA64        47E10008                        lw              r2,8[sp]
3983
FFFFFFFFFFFFDA68        47E20010                        lw              r4,16[sp]
3984
FFFFFFFFFFFFDA6C        37EF8018                        ret             #24
3985
 
3986
                                                 ; r1 = packet address
3987
                                                 ;
3988
FFFFFFFFFFFFDA70                                 eth_interpret_packet:
3989
FFFFFFFFFFFFDA70        0FEF0010                        subui   sp,sp,#16
3990
FFFFFFFFFFFFDA74        67E18000                        sw              r3,[sp]
3991
FFFFFFFFFFFFDA78        67E10008                        sw              r2,8[sp]
3992
FFFFFFFFFFFFDA7C        4A11000C                        lbu             r2,12[r1]
3993
FFFFFFFFFFFFDA80        4A11800D                        lbu             r3,13[r1]
3994
FFFFFFFFFFFFDA84        B2200608                        bnei    r2,#8,eth2                      ; 0x806 ?
3995
FFFFFFFFFFFFDA88        B2300506                        bnei    r3,#6,eth2
3996
FFFFFFFFFFFFDA8C        16008002                        lw              r1,#2                           ; return r1 = 2 for ARP
3997
FFFFFFFFFFFFDA90                                 eth5:
3998
FFFFFFFFFFFFDA90        47E18000                        lw              r3,[sp]
3999
FFFFFFFFFFFFDA94        47E10008                        lw              r2,8[sp]
4000
FFFFFFFFFFFFDA98        37EF8010                        ret             #16
4001
FFFFFFFFFFFFDA9C                                 eth2:
4002
FFFFFFFFFFFFDA9C        B2200C08                        bnei    r2,#8,eth3                      ; 0x800 ?
4003
FFFFFFFFFFFFDAA0        B2300B00                        bnei    r3,#0,eth3
4004
FFFFFFFFFFFFDAA4        4A110017                        lbu             r2,23[r1]
4005
FFFFFFFFFFFFDAA8        B2200301                        bnei    r2,#1,eth4
4006
FFFFFFFFFFFFDAAC        16008001                        lw              r1,#1
4007
FFFFFFFFFFFFDAB0        BE007F0A                        bra             eth5                            ; return 1 ICMP
4008
FFFFFFFFFFFFDAB4                                 eth4:
4009
FFFFFFFFFFFFDAB4        B2200311                        bnei    r2,#0x11,eth6
4010
FFFFFFFFFFFFDAB8        16008003                        lw              r1,#3                           ; return 3 for UDP
4011
FFFFFFFFFFFFDABC        BE007EAA                        bra             eth5
4012
FFFFFFFFFFFFDAC0                                 eth6:
4013
FFFFFFFFFFFFDAC0        B2200306                        bnei    r2,#6,eth7
4014
FFFFFFFFFFFFDAC4        16008004                        lw              r1,#4                           ; return 4 for TCP
4015
FFFFFFFFFFFFDAC8        BE007E4A                        bra             eth5
4016
FFFFFFFFFFFFDACC                                 eth7:
4017
FFFFFFFFFFFFDACC                                 eth3:
4018
FFFFFFFFFFFFDACC        0410840A                        xor             r1,r1,r1                        ; return zero for unknown
4019
FFFFFFFFFFFFDAD0        47E18000                        lw              r3,[sp]
4020
FFFFFFFFFFFFDAD4        47E10008                        lw              r2,8[sp]
4021
FFFFFFFFFFFFDAD8        37EF8010                        ret             #16
4022
 
4023
                                                 ; r1 = address of packet to send
4024
                                                 ; r2 = packet length
4025
                                                 ;
4026
FFFFFFFFFFFFDADC                                 eth_send_packet:
4027
FFFFFFFFFFFFDADC        0FEF0010                        subui   sp,sp,#16
4028
FFFFFFFFFFFFDAE0        67E18000                        sw              r3,[sp]
4029
FFFFFFFFFFFFDAE4        67E20008                        sw              r4,8[sp]
4030
FFFFFFFFFFFFDAE8        E69C2000                ; SETLO
4031
FFFFFFFFFFFFDAEC        EE800003                ; SETMID
4032
FFFFFFFFFFFFDAF0        6A0D0C2D                        lea             r3,ETHMAC
4033
                                                        ; wait for tx buffer to be clear
4034
FFFFFFFFFFFFDAF4                                 eth8:
4035
FFFFFFFFFFFFDAF4        84320400                        inh             r4,0x400[r3]
4036
FFFFFFFFFFFFDAF8        2A421E7C                        bfext   r4,r4,#15,#15
4037
FFFFFFFFFFFFDAFC        B04FFE01                        beqi    r4,#1,eth8
4038
FFFFFFFFFFFFDB00        16020001                        lw              r4,#1                   ; clear tx interrupt
4039
FFFFFFFFFFFFDB04        64320004                        sh              r4,4[r3]
4040
                                                        ; set address
4041
FFFFFFFFFFFFDB08        64308404                        sh              r1,0x404[r3]
4042
                                                        ; set the packet length field and enable interrupts
4043
FFFFFFFFFFFFDB0C        06212006                        shlui   r2,r2,#16
4044
FFFFFFFFFFFFDB10        16217000                        ori             r2,r2,#0xF000
4045
FFFFFFFFFFFFDB14        64310400                        sh              r2,0x400[r3]
4046
FFFFFFFFFFFFDB18        47E20008                        lw              r4,8[sp]
4047
FFFFFFFFFFFFDB1C        47E18000                        lw              r3,[sp]
4048
FFFFFFFFFFFFDB20        37EF8010                        ret             #16
4049
 
4050
                                                 ; Only for IP type packets (not ARP)
4051
                                                 ; r1 = rx buffer address
4052
                                                 ; r2 = swap flag
4053
                                                 ; Returns:
4054
                                                 ; r1 = data start index
4055
                                                 ;
4056
FFFFFFFFFFFFDB24                                 eth_build_packet:
4057
FFFFFFFFFFFFDB24        0FEF0040                        subui   sp,sp,#64
4058
FFFFFFFFFFFFDB28        67E18000                        sw              r3,[sp]
4059
FFFFFFFFFFFFDB2C        67E20008                        sw              r4,8[sp]
4060
FFFFFFFFFFFFDB30        67E28010                        sw              r5,16[sp]
4061
FFFFFFFFFFFFDB34        67E30018                        sw              r6,24[sp]
4062
FFFFFFFFFFFFDB38        67E38020                        sw              r7,32[sp]
4063
FFFFFFFFFFFFDB3C        67E40028                        sw              r8,40[sp]
4064
FFFFFFFFFFFFDB40        67E48030                        sw              r9,48[sp]
4065
FFFFFFFFFFFFDB44        67E50038                        sw              r10,56[sp]
4066
FFFFFFFFFFFFDB48        4A118006                        lbu             r3,6[r1]
4067
FFFFFFFFFFFFDB4C        4A120007                        lbu             r4,7[r1]
4068
FFFFFFFFFFFFDB50        4A128008                        lbu             r5,8[r1]
4069
FFFFFFFFFFFFDB54        4A130009                        lbu             r6,9[r1]
4070
FFFFFFFFFFFFDB58        4A13800A                        lbu             r7,10[r1]
4071
FFFFFFFFFFFFDB5C        4A14000B                        lbu             r8,11[r1]
4072
                                                        ; write to destination header
4073
FFFFFFFFFFFFDB60        60118000                        sb              r3,[r1]
4074
FFFFFFFFFFFFDB64        60120001                        sb              r4,1[r1]
4075
FFFFFFFFFFFFDB68        60128002                        sb              r5,2[r1]
4076
FFFFFFFFFFFFDB6C        60130003                        sb              r6,3[r1]
4077
FFFFFFFFFFFFDB70        60138004                        sb              r7,4[r1]
4078
FFFFFFFFFFFFDB74        60140005                        sb              r8,5[r1]
4079
                                                        ; write to source header
4080
FFFFFFFFFFFFDB78        16018000                        lw              r3,#my_MAC1
4081
FFFFFFFFFFFFDB7C        60118006                        sb              r3,6[r1]
4082
FFFFFFFFFFFFDB80        160180FF                        lw              r3,#my_MAC2
4083
FFFFFFFFFFFFDB84        60118007                        sb              r3,7[r1]
4084
FFFFFFFFFFFFDB88        160180EE                        lw              r3,#my_MAC3
4085
FFFFFFFFFFFFDB8C        60118008                        sb              r3,8[r1]
4086
FFFFFFFFFFFFDB90        160180F0                        lw              r3,#my_MAC4
4087
FFFFFFFFFFFFDB94        60118009                        sb              r3,9[r1]
4088
FFFFFFFFFFFFDB98        160180DA                        lw              r3,#my_MAC5
4089
FFFFFFFFFFFFDB9C        6011800A                        sb              r3,10[r1]
4090
FFFFFFFFFFFFDBA0        16018042                        lw              r3,#my_MAC6
4091
FFFFFFFFFFFFDBA4        6011800B                        sb              r3,11[r1]
4092
FFFFFFFFFFFFDBA8        B2201101                        bnei    r2,#1,eth16                     // if (swap)
4093
FFFFFFFFFFFFDBAC        4A11801A                        lbu             r3,26[r1]
4094
FFFFFFFFFFFFDBB0        4A12001B                        lbu             r4,27[r1]
4095
FFFFFFFFFFFFDBB4        4A12801C                        lbu             r5,28[r1]
4096
FFFFFFFFFFFFDBB8        4A13001D                        lbu             r6,29[r1]
4097
                                                        ; read destination
4098
FFFFFFFFFFFFDBBC        4A13801E                        lbu             r7,30[r1]
4099
FFFFFFFFFFFFDBC0        4A14001F                        lbu             r8,31[r1]
4100
FFFFFFFFFFFFDBC4        4A148020                        lbu             r9,32[r1]
4101
FFFFFFFFFFFFDBC8        4A150021                        lbu             r10,33[r1]
4102
                                                        ; write to sender
4103
FFFFFFFFFFFFDBCC        6013801A                        sb              r7,26[r1]
4104
FFFFFFFFFFFFDBD0        6014001B                        sb              r8,27[r1]
4105
FFFFFFFFFFFFDBD4        6014801C                        sb              r9,28[r1]
4106
FFFFFFFFFFFFDBD8        6015001D                        sb              r10,29[r1]
4107
                                                        ; write destination
4108
FFFFFFFFFFFFDBDC        6011801E                        sb              r3,30[r1]
4109
FFFFFFFFFFFFDBE0        6012001F                        sb              r4,31[r1]
4110
FFFFFFFFFFFFDBE4        60128020                        sb              r5,32[r1]
4111
FFFFFFFFFFFFDBE8        60130021                        sb              r6,33[r1]
4112
FFFFFFFFFFFFDBEC                                 eth16:
4113
FFFFFFFFFFFFDBEC        4601D9B4                        lw              r3,eth_unique_id
4114
FFFFFFFFFFFFDBF0        0A318001                        addui   r3,r3,#1
4115
FFFFFFFFFFFFDBF4        6601D9B4                        sw              r3,eth_unique_id
4116
FFFFFFFFFFFFDBF8        60118013                        sb              r3,19[r1]
4117
FFFFFFFFFFFFDBFC        06319001                        shrui   r3,r3,#8
4118
FFFFFFFFFFFFDC00        60118012                        sb              r3,18[r1]
4119
FFFFFFFFFFFFDC04        4A11800E                        lbu             r3,14[r1]
4120
FFFFFFFFFFFFDC08        1431800F                        andi    r3,r3,#0xF
4121
FFFFFFFFFFFFDC0C        06318406                        shlui   r3,r3,#2                ; *4
4122
FFFFFFFFFFFFDC10        0A30800E                        addui   r1,r3,#14               ; return datastart in r1
4123
FFFFFFFFFFFFDC14        47E18000                        lw              r3,[sp]
4124
FFFFFFFFFFFFDC18        47E20008                        lw              r4,8[sp]
4125
FFFFFFFFFFFFDC1C        47E28010                        lw              r5,16[sp]
4126
FFFFFFFFFFFFDC20        47E30018                        lw              r6,24[sp]
4127
FFFFFFFFFFFFDC24        47E38020                        lw              r7,32[sp]
4128
FFFFFFFFFFFFDC28        47E40028                        lw              r8,40[sp]
4129
FFFFFFFFFFFFDC2C        47E48030                        lw              r9,48[sp]
4130
FFFFFFFFFFFFDC30        47E50038                        lw              r10,56[sp]
4131
FFFFFFFFFFFFDC34        37EF8040                        ret             #64
4132
 
4133
                                                 ; Compute IPv4 checksum of header
4134
                                                 ; r1 = packet address
4135
                                                 ; r2 = data start
4136
                                                 ;
4137
FFFFFFFFFFFFDC38                                 eth_checksum:
4138
FFFFFFFFFFFFDC38        0FEF0018                        subui   sp,sp,#24
4139
FFFFFFFFFFFFDC3C        67E18000                        sw              r3,[sp]
4140
FFFFFFFFFFFFDC40        67E20008                        sw              r4,8[sp]
4141
FFFFFFFFFFFFDC44        67E28010                        sw              r5,16[sp]
4142
                                                        ; set checksum to zero
4143
FFFFFFFFFFFFDC48        60100018                        sb              r0,24[r1]
4144
FFFFFFFFFFFFDC4C        60100019                        sb              r0,25[r1]
4145
FFFFFFFFFFFFDC50        04318C0A                        xor             r3,r3,r3                ; r3 = sum = zero
4146
FFFFFFFFFFFFDC54        1602000E                        lw              r4,#14
4147
FFFFFFFFFFFFDC58                                 eth15:
4148
FFFFFFFFFFFFDC58        02228009                        mov             r5,r2
4149
FFFFFFFFFFFFDC5C        0E528001                        subui   r5,r5,#1                ; r5 = datastart - 1
4150
FFFFFFFFFFFFDC60        BE428101                        bge             r4,r5,eth14
4151
FFFFFFFFFFFFDC64        6A121405                        lbu             r5,[r1+r4]              ; shi = [rx_addr+i]
4152
FFFFFFFFFFFFDC68        6A121845                        lbu             r6,1[r1+r4]             ; slo = [rx_addr+i+1]
4153
FFFFFFFFFFFFDC6C        06529006                        shlui   r5,r5,#8
4154
FFFFFFFFFFFFDC70        04531409                        or              r5,r5,r6                ; shilo
4155
FFFFFFFFFFFFDC74        04328C03                        addu    r3,r3,r5                ; sum = sum + shilo
4156
FFFFFFFFFFFFDC78        0A420002                        addui   r4,r4,#2                ; i = i + 2
4157
FFFFFFFFFFFFDC7C        BE007EEA                        bra             eth15
4158
FFFFFFFFFFFFDC80                                 eth14:
4159
FFFFFFFFFFFFDC80        02328009                        mov             r5,r3                   ; r5 = sum
4160
FFFFFFFFFFFFDC84        1431FFFF                        andi    r3,r3,#0xffff
4161
FFFFFFFFFFFFDC88        0652A001                        shrui   r5,r5,#16
4162
FFFFFFFFFFFFDC8C        04328C03                        addu    r3,r3,r5
4163
FFFFFFFFFFFFDC90        02318004                        com             r3,r3
4164
FFFFFFFFFFFFDC94        60118019                        sb              r3,25[r1]               ; low byte
4165
FFFFFFFFFFFFDC98        06319001                        shrui   r3,r3,#8
4166
FFFFFFFFFFFFDC9C        60118018                        sb              r3,24[r1]               ; high byte
4167
FFFFFFFFFFFFDCA0        67E18000                        sw              r3,[sp]
4168
FFFFFFFFFFFFDCA4        67E20008                        sw              r4,8[sp]
4169
FFFFFFFFFFFFDCA8        67E28010                        sw              r5,16[sp]
4170
FFFFFFFFFFFFDCAC        37EF8018                        ret             #24
4171
 
4172
                                                 ; r1 = packet address
4173
                                                 ; returns r1 = 1 if this IP
4174
                                                 ;
4175
FFFFFFFFFFFFDCB0                                 eth_verifyIP:
4176
FFFFFFFFFFFFDCB0        0FEF0020                        subui   sp,sp,#32
4177
FFFFFFFFFFFFDCB4        67E10000                        sw              r2,[sp]
4178
FFFFFFFFFFFFDCB8        67E18008                        sw              r3,8[sp]
4179
FFFFFFFFFFFFDCBC        67E20010                        sw              r4,16[sp]
4180
FFFFFFFFFFFFDCC0        67E28018                        sw              r5,24[sp]
4181
FFFFFFFFFFFFDCC4        4A11001E                        lbu             r2,30[r1]
4182
FFFFFFFFFFFFDCC8        4A11801F                        lbu             r3,31[r1]
4183
FFFFFFFFFFFFDCCC        4A120020                        lbu             r4,32[r1]
4184
FFFFFFFFFFFFDCD0        4A128021                        lbu             r5,33[r1]
4185
                                                        ; Check for general broadcast
4186
FFFFFFFFFFFFDCD4        E68000FF                ; SETLO
4187
FFFFFFFFFFFFDCD8        BE2D01A9                        bnei    r2,#0xFF,eth11
4188
FFFFFFFFFFFFDCDC        E68000FF                ; SETLO
4189
FFFFFFFFFFFFDCE0        BE3D0169                        bnei    r3,#0xFF,eth11
4190
FFFFFFFFFFFFDCE4        E68000FF                ; SETLO
4191
FFFFFFFFFFFFDCE8        BE4D0129                        bnei    r4,#0xFF,eth11
4192
FFFFFFFFFFFFDCEC        E68000FF                ; SETLO
4193
FFFFFFFFFFFFDCF0        BE5D00E9                        bnei    r5,#0xFF,eth11
4194
FFFFFFFFFFFFDCF4                                 eth12:
4195
FFFFFFFFFFFFDCF4        16008001                        lw              r1,#1
4196
FFFFFFFFFFFFDCF8                                 eth13:
4197
FFFFFFFFFFFFDCF8        47E10000                        lw              r2,[sp]
4198
FFFFFFFFFFFFDCFC        47E18008                        lw              r3,8[sp]
4199
FFFFFFFFFFFFDD00        47E20010                        lw              r4,16[sp]
4200
FFFFFFFFFFFFDD04        47E28018                        lw              r5,24[sp]
4201
FFFFFFFFFFFFDD08        37EF8020                        ret             #32
4202
FFFFFFFFFFFFDD0C                                 eth11:
4203
FFFFFFFFFFFFDD0C        02208009                        mov             r1,r2
4204
FFFFFFFFFFFFDD10        06109006                        shlui   r1,r1,#8
4205
FFFFFFFFFFFFDD14        04118409                        or              r1,r1,r3
4206
FFFFFFFFFFFFDD18        06109006                        shlui   r1,r1,#8
4207
FFFFFFFFFFFFDD1C        04120409                        or              r1,r1,r4
4208
FFFFFFFFFFFFDD20        06109006                        shlui   r1,r1,#8
4209
FFFFFFFFFFFFDD24        04128409                        or              r1,r1,r5
4210
FFFFFFFFFFFFDD28        E6A8012A                ; SETLO
4211
FFFFFFFFFFFFDD2C        EEBFFF02                ; SETMID
4212
FFFFFFFFFFFFDD30        BE1D7E28                        beqi    r1,#0xC0A8012A,eth12
4213
FFFFFFFFFFFFDD34        0410840A                        xor             r1,r1,r1
4214
FFFFFFFFFFFFDD38        BE007E0A                        bra             eth13
4215
 
4216
 
4217
FFFFFFFFFFFFDD3C                                 eth_main:
4218
FFFFFFFFFFFFDD3C        31FFF66F                        call    eth_init
4219
FFFFFFFFFFFFDD40                                 eth_loop:
4220
FFFFFFFFFFFFDD40        0410840A                        xor             r1,r1,r1
4221
FFFFFFFFFFFFDD44        E6800000                ; SETLO
4222
FFFFFFFFFFFFDD48        EE800400                ; SETMID
4223
FFFFFFFFFFFFDD4C        040D0409                        lw              r1,#0x1_00000000                ; memory address zero
4224
FFFFFFFFFFFFDD50        31FFF67D                        call    eth_request_packet
4225
FFFFFFFFFFFFDD54        31FFF69C                        call    eth_interpret_packet    ; r1 = packet type
4226
 
4227
FFFFFFFFFFFFDD58        B2102801                        bnei    r1,#1,eth10
4228
FFFFFFFFFFFFDD5C        02110009                        mov             r2,r1                                   ; save off r1, r2 = packet type
4229
FFFFFFFFFFFFDD60        E6800000                ; SETLO
4230
FFFFFFFFFFFFDD64        EE800400                ; SETMID
4231
FFFFFFFFFFFFDD68        040D0409                        lw              r1,#0x1_00000000                ; memory address zero
4232
FFFFFFFFFFFFDD6C        31FFF72C                        call    eth_verifyIP
4233
FFFFFFFFFFFFDD70        02118009                        mov     r3,r1
4234
FFFFFFFFFFFFDD74        02208009                        mov     r1,r2                                   ; r1 = packet type again
4235
FFFFFFFFFFFFDD78        B2302001                        bnei    r3,#1,eth10
4236
 
4237
FFFFFFFFFFFFDD7C        E6800000                ; SETLO
4238
FFFFFFFFFFFFDD80        EE800400                ; SETMID
4239
FFFFFFFFFFFFDD84        040D0409                        lw              r1,#0x1_00000000                ; memory address zero
4240
FFFFFFFFFFFFDD88        16010001                        lw              r2,#1
4241
FFFFFFFFFFFFDD8C        31FFF6C9                        call    eth_build_packet
4242
FFFFFFFFFFFFDD90        02118009                        mov             r3,r1                                   ; r3 = icmpstart
4243
FFFFFFFFFFFFDD94        E6800000                ; SETLO
4244
FFFFFFFFFFFFDD98        EE800400                ; SETMID
4245
FFFFFFFFFFFFDD9C        040D0409                        lw              r1,#0x1_00000000                ; memory address zero
4246
FFFFFFFFFFFFDDA0        6A118010                        sb              r0,[r1+r3]                              ; [rx_addr+icmpstart] = 0
4247
FFFFFFFFFFFFDDA4        4A110011                        lbu             r2,17[r1]
4248
FFFFFFFFFFFFDDA8        0A21000E                        addui   r2,r2,#14                               ; r2 = len
4249
FFFFFFFFFFFFDDAC        02230009                        mov             r6,r2                                   ; r6 = len
4250
FFFFFFFFFFFFDDB0        6A119085                        lbu             r4,2[r1+r3]                             ; shi
4251
FFFFFFFFFFFFDDB4        6A1194C5                        lbu             r5,3[r1+r3]                             ; slo
4252
FFFFFFFFFFFFDDB8        06421006                        shlui   r4,r4,#8
4253
FFFFFFFFFFFFDDBC        04429009                        or              r4,r4,r5                                ; sum = {shi,slo};
4254
FFFFFFFFFFFFDDC0        02420004                        com             r4,r4                                   ; sum = ~sum
4255
FFFFFFFFFFFFDDC4        0E420800                        subui   r4,r4,#0x800                    ; sum = sum - 0x800
4256
FFFFFFFFFFFFDDC8        02420004                        com             r4,r4                                   ; sum = ~sum
4257
FFFFFFFFFFFFDDCC        6A1190D0                        sb              r4,3[r1+r3]
4258
FFFFFFFFFFFFDDD0        06421001                        shrui   r4,r4,#8
4259
FFFFFFFFFFFFDDD4        6A119090                        sb              r4,2[r1+r3]
4260
FFFFFFFFFFFFDDD8        02310009                        mov             r2,r3
4261
FFFFFFFFFFFFDDDC        31FFF70E                        call    eth_checksum
4262
FFFFFFFFFFFFDDE0        E6800000                ; SETLO
4263
FFFFFFFFFFFFDDE4        EE800400                ; SETMID
4264
FFFFFFFFFFFFDDE8        040D0409                        lw              r1,#0x1_00000000                ; memory address zero
4265
FFFFFFFFFFFFDDEC        02610009                        mov             r2,r6
4266
FFFFFFFFFFFFDDF0        31FFF6B7                        call    eth_send_packet
4267
FFFFFFFFFFFFDDF4        33FFF750                        jmp             eth_loop
4268
FFFFFFFFFFFFDDF8                                 eth10:
4269
                                                        ; r2 = rx_addr
4270
FFFFFFFFFFFFDDF8        B21FD202                        bnei    r1,#2,eth_loop          ; Do we have ARP ?
4271
                                                 ;      xor             r2,r2,r2                        ; memory address zero
4272
FFFFFFFFFFFFDDFC        E6B5E100                ; SETLO
4273
FFFFFFFFFFFFDE00        EE800017                ; SETMID
4274
FFFFFFFFFFFFDE04        040D0809                        lw              r2,#1_00000000
4275
                                                        ; get the opcode
4276
FFFFFFFFFFFFDE08        4A268015                        lbu             r13,21[r2]
4277
FFFFFFFFFFFFDE0C        B2DFCD01                        bnei    r13,#1,eth_loop         ; ARP request
4278
                                                        ; get destination IP address
4279
FFFFFFFFFFFFDE10        4A248026                        lbu             r9,38[r2]
4280
FFFFFFFFFFFFDE14        4A250027                        lbu             r10,39[r2]
4281
FFFFFFFFFFFFDE18        4A258028                        lbu             r11,40[r2]
4282
FFFFFFFFFFFFDE1C        4A260029                        lbu             r12,41[r2]
4283
                                                        ; set r15 = destination IP
4284
FFFFFFFFFFFFDE20        02978009                        mov             r15,r9
4285
FFFFFFFFFFFFDE24        06F79006                        shlui   r15,r15,#8
4286
FFFFFFFFFFFFDE28        04F53C09                        or              r15,r15,r10
4287
FFFFFFFFFFFFDE2C        06F79006                        shlui   r15,r15,#8
4288
FFFFFFFFFFFFDE30        04F5BC09                        or              r15,r15,r11
4289
FFFFFFFFFFFFDE34        06F79006                        shlui   r15,r15,#8
4290
FFFFFFFFFFFFDE38        04F63C09                        or              r15,r15,r12
4291
                                                        ; Is it our IP ?
4292
FFFFFFFFFFFFDE3C        E6A8012A                ; SETLO
4293
FFFFFFFFFFFFDE40        EEBFFF02                ; SETMID
4294
FFFFFFFFFFFFDE44        BEFD77E9                        bnei    r15,#0xC0A8012A,eth_loop; //192.168.1.42
4295
                                                        ; get source IP address
4296
FFFFFFFFFFFFDE48        4A22801C                        lbu             r5,28[r2]
4297
FFFFFFFFFFFFDE4C        4A23001D                        lbu             r6,29[r2]
4298
FFFFFFFFFFFFDE50        4A23801E                        lbu             r7,30[r2]
4299
FFFFFFFFFFFFDE54        4A24001F                        lbu             r8,31[r2]
4300
                                                        ; set r14 = source IP
4301
FFFFFFFFFFFFDE58        02570009                        mov             r14,r5
4302
FFFFFFFFFFFFDE5C        06E71006                        shlui   r14,r14,#8
4303
FFFFFFFFFFFFDE60        04E33809                        or              r14,r14,r6
4304
FFFFFFFFFFFFDE64        06E71006                        shlui   r14,r14,#8
4305
FFFFFFFFFFFFDE68        04E3B809                        or              r14,r14,r7
4306
FFFFFFFFFFFFDE6C        06E71006                        shlui   r14,r14,#8
4307
FFFFFFFFFFFFDE70        04E43809                        or              r14,r14,r8
4308
                                                        ; Get the source MAC address
4309
FFFFFFFFFFFFDE74        4A280016                        lbu             r16,22[r2]
4310
FFFFFFFFFFFFDE78        4A288017                        lbu             r17,23[r2]
4311
FFFFFFFFFFFFDE7C        4A290018                        lbu             r18,24[r2]
4312
FFFFFFFFFFFFDE80        4A298019                        lbu             r19,25[r2]
4313
FFFFFFFFFFFFDE84        4A2A001A                        lbu             r20,26[r2]
4314
FFFFFFFFFFFFDE88        4A2A801B                        lbu             r21,27[r2]
4315
                                                        ; write to destination header
4316
FFFFFFFFFFFFDE8C        60280000                        sb              r16,[r2]
4317
FFFFFFFFFFFFDE90        60288001                        sb              r17,1[r2]
4318
FFFFFFFFFFFFDE94        60290002                        sb              r18,2[r2]
4319
FFFFFFFFFFFFDE98        60298003                        sb              r19,3[r2]
4320
FFFFFFFFFFFFDE9C        602A0004                        sb              r20,4[r2]
4321
FFFFFFFFFFFFDEA0        602A8005                        sb              r21,5[r2]
4322
                                                        ; and write to ARP destination
4323
FFFFFFFFFFFFDEA4        60280020                        sb              r16,32[r2]
4324
FFFFFFFFFFFFDEA8        60288021                        sb              r17,33[r2]
4325
FFFFFFFFFFFFDEAC        60290022                        sb              r18,34[r2]
4326
FFFFFFFFFFFFDEB0        60298023                        sb              r19,35[r2]
4327
FFFFFFFFFFFFDEB4        602A0024                        sb              r20,36[r2]
4328
FFFFFFFFFFFFDEB8        602A8025                        sb              r21,37[r2]
4329
                                                        ; write to source header
4330
                                                 ;      stbc    #0x00,6[r2]
4331
                                                 ;      stbc    #0xFF,7[r2]
4332
                                                 ;      stbc    #0xEE,8[r2]
4333
                                                 ;      stbc    #0xF0,9[r2]
4334
                                                 ;      stbc    #0xDA,10[r2]
4335
                                                 ;      stbc    #0x42,11[r2]
4336
FFFFFFFFFFFFDEBC        60200006                        sb              r0,6[r2]
4337
FFFFFFFFFFFFDEC0        160080FF                        lw              r1,#0xFF
4338
FFFFFFFFFFFFDEC4        60208007                        sb              r1,7[r2]
4339
FFFFFFFFFFFFDEC8        160080EE                        lw              r1,#0xEE
4340
FFFFFFFFFFFFDECC        60208008                        sb              r1,8[r2]
4341
FFFFFFFFFFFFDED0        160080F0                        lw              r1,#0xF0
4342
FFFFFFFFFFFFDED4        60208009                        sb              r1,9[r2]
4343
FFFFFFFFFFFFDED8        160080DA                        lw              r1,#0xDA
4344
FFFFFFFFFFFFDEDC        6020800A                        sb              r1,10[r2]
4345
FFFFFFFFFFFFDEE0        16008042                        lw              r1,#0x42
4346
FFFFFFFFFFFFDEE4        6020800B                        sb              r1,11[r2]
4347
                                                        ; write to ARP source
4348
                                                 ;      stbc    #0x00,22[r2]
4349
                                                 ;      stbc    #0xFF,23[r2]
4350
                                                 ;      stbc    #0xEE,24[r2]
4351
                                                 ;      stbc    #0xF0,25[r2]
4352
                                                 ;      stbc    #0xDA,26[r2]
4353
                                                 ;      stbc    #0x42,27[r2]
4354
FFFFFFFFFFFFDEE8        60200016                        sb              r0,22[r2]
4355
FFFFFFFFFFFFDEEC        160080FF                        lw              r1,#0xFF
4356
FFFFFFFFFFFFDEF0        60208017                        sb              r1,23[r2]
4357
FFFFFFFFFFFFDEF4        160080EE                        lw              r1,#0xEE
4358
FFFFFFFFFFFFDEF8        60208018                        sb              r1,24[r2]
4359
FFFFFFFFFFFFDEFC        160080F0                        lw              r1,#0xF0
4360
FFFFFFFFFFFFDF00        60208019                        sb              r1,25[r2]
4361
FFFFFFFFFFFFDF04        160080DA                        lw              r1,#0xDA
4362
FFFFFFFFFFFFDF08        6020801A                        sb              r1,26[r2]
4363
FFFFFFFFFFFFDF0C        16008042                        lw              r1,#0x42
4364
FFFFFFFFFFFFDF10        6020801B                        sb              r1,27[r2]
4365
                                                        ; swap sender / destination IP
4366
                                                        ; write sender
4367
FFFFFFFFFFFFDF14        6024801C                        sb              r9,28[r2]
4368
FFFFFFFFFFFFDF18        6025001D                        sb              r10,29[r2]
4369
FFFFFFFFFFFFDF1C        6025801E                        sb              r11,30[r2]
4370
FFFFFFFFFFFFDF20        6026001F                        sb              r12,31[r2]
4371
                                                        ; write destination
4372
FFFFFFFFFFFFDF24        60228026                        sb              r5,38[r2]
4373
FFFFFFFFFFFFDF28        60230027                        sb              r6,39[r2]
4374
FFFFFFFFFFFFDF2C        60238028                        sb              r7,40[r2]
4375
FFFFFFFFFFFFDF30        60240029                        sb              r8,41[r2]
4376
                                                        ; change request to reply
4377
                                                 ;      stbc    #2,21[r2]
4378
FFFFFFFFFFFFDF34        16008002                        lw              r1,#2
4379
FFFFFFFFFFFFDF38        60208015                        sb              r1,21[r2]
4380
FFFFFFFFFFFFDF3C        02208009                        mov             r1,r2                   ; r1 = packet address
4381
FFFFFFFFFFFFDF40        1601002A                        lw              r2,#0x2A                ; r2 = packet length
4382
FFFFFFFFFFFFDF44        31FFF6B7                        call    eth_send_packet
4383
FFFFFFFFFFFFDF48        33FFF750                        jmp             eth_loop
4384
 
4385
 
4386
                                                 ;==============================================================================
4387
                                                 ;==============================================================================
4388 43 robfinch
                                                 ;****************************************************************;
4389
                                                 ;                                                                ;
4390
                                                 ;              Tiny BASIC for the Raptor64                              ;
4391
                                                 ;                                                                ;
4392
                                                 ; Derived from a 68000 derivative of Palo Alto Tiny BASIC as     ;
4393
                                                 ; published in the May 1976 issue of Dr. Dobb's Journal.         ;
4394
                                                 ; Adapted to the 68000 by:                                       ;
4395
                                                 ;      Gordon brndly                                                                    ;
4396
                                                 ;      12147 - 51 Street                                                                ;
4397
                                                 ;      Edmonton AB  T5W 3G8                                                         ;
4398
                                                 ;      Canada                                                                               ;
4399
                                                 ;      (updated mailing address for 1996)                                       ;
4400
                                                 ;                                                                ;
4401
                                                 ; Adapted to the Raptor64 by:                                    ;
4402
                                                 ;    Robert Finch                                                ;
4403
                                                 ;    Ontario, Canada                                             ;
4404
                                                 ;       robfinch@opencores.org                              ;
4405
                                                 ;****************************************************************;
4406
                                                 ;    Copyright (C) 2012 by Robert Finch. This program may be    ;
4407
                                                 ;    freely distributed for personal use only. All commercial   ;
4408
                                                 ;                     rights are reserved.                                          ;
4409
                                                 ;****************************************************************;
4410
                                                 ;
4411
                                                 ; Register Usage
4412
                                                 ; r8 = text pointer (global usage)
4413
                                                 ; r3,r4 = inputs parameters to subroutines
4414
                                                 ; r2 = return value
4415
                                                 ;
4416
                                                 ;* Vers. 1.0  1984/7/17        - Original version by Gordon brndly
4417
                                                 ;*     1.1  1984/12/9  - Addition of '0x' print term by Marvin Lipford
4418
                                                 ;*     1.2  1985/4/9   - Bug fix in multiply routine by Rick Murray
4419
 
4420
                                                 ;
4421
                                                 ; Standard jump table. You can change these addresses if you are
4422
                                                 ; customizing this interpreter for a different environment.
4423
                                                 ;
4424 46 robfinch
FFFFFFFFFFFFDF4C                                 GOSTART:
4425
FFFFFFFFFFFFDF4C        33FFF7E0                                jmp     CSTART  ;       Cold Start entry point
4426
FFFFFFFFFFFFDF50                                 GOWARM:
4427
FFFFFFFFFFFFDF50        33FFF801                                jmp     WSTART  ;       Warm Start entry point
4428
FFFFFFFFFFFFDF54                                 GOOUT:
4429
FFFFFFFFFFFFDF54        33FFFD9B                                jmp     OUTC    ;       Jump to character-out routine
4430
FFFFFFFFFFFFDF58                                 GOIN:
4431
FFFFFFFFFFFFDF58        33FFFD9C                                jmp     INC             ;Jump to character-in routine
4432
FFFFFFFFFFFFDF5C                                 GOAUXO:
4433
FFFFFFFFFFFFDF5C        33FFFDA3                                jmp     AUXOUT  ;       Jump to auxiliary-out routine
4434
FFFFFFFFFFFFDF60                                 GOAUXI:
4435
FFFFFFFFFFFFDF60        33FFFD9D                                jmp     AUXIN   ;       Jump to auxiliary-in routine
4436
FFFFFFFFFFFFDF64                                 GOBYE:
4437
FFFFFFFFFFFFDF64        33FFFE28                                jmp     BYEBYE  ;       Jump to monitor, DOS, etc.
4438 43 robfinch
                                                 ;
4439
                                                 ; Modifiable system constants:
4440
                                                 ;
4441 46 robfinch
FFFFFFFFFFFFDF68                                                align   8
4442
FFFFFFFFFFFFDF68 0000000010060000        TXTBGN dw      0x000000001_00600000    ;TXT            ;beginning of program memory
4443
FFFFFFFFFFFFDF70 00000000107FFFF8        ENDMEM dw      0x000000001_07FFFFF8    ;       end of available memory
4444 43 robfinch
                                                 ;
4445
                                                 ; The main interpreter starts here:
4446
                                                 ;
4447
                                                 ; Usage
4448
                                                 ; r1 = temp
4449
                                                 ; r8 = text buffer pointer
4450
                                                 ; r12 = end of text in text buffer
4451
                                                 ;
4452 46 robfinch
FFFFFFFFFFFFDF78 0000000000000000               align   16
4453
FFFFFFFFFFFFDF80                                        align   16
4454
FFFFFFFFFFFFDF80                                 CSTART:
4455 43 robfinch
                                                        ; First save off the link register and OS sp value
4456 46 robfinch
FFFFFFFFFFFFDF80        0FEF0008                        subui   sp,sp,#8
4457
FFFFFFFFFFFFDF84        67EF8000                        sw              lr,[sp]
4458
FFFFFFFFFFFFDF88        660F1088                        sw              sp,OSSP
4459
FFFFFFFFFFFFDF8C        460F5F70                        lw              sp,ENDMEM       ; initialize stack pointer
4460
FFFFFFFFFFFFDF90        0FEF0008                        subui   sp,sp,#8
4461
FFFFFFFFFFFFDF94        67EF8000                        sw      lr,[sp]    ; save off return address
4462
FFFFFFFFFFFFDF98        60001417                        sb              r0,CursorRow    ; set screen output
4463
FFFFFFFFFFFFDF9C        60001418                        sb              r0,CursorCol
4464
FFFFFFFFFFFFDFA0        6000141A                        sb              r0,CursorFlash
4465
FFFFFFFFFFFFDFA4        6400104C                        sh              r0,pos
4466
FFFFFFFFFFFFDFA8        E6800020                ; SETLO
4467
FFFFFFFFFFFFDFAC        EE800040                ; SETMID
4468
FFFFFFFFFFFFDFB0        040D0809                        lw              r2,#0x10000020  ; black chars, yellow background
4469
                                                 ;      sh              r2,charToPrint
4470
FFFFFFFFFFFFDFB4        31FFF011                        call    ClearScreen
4471
FFFFFFFFFFFFDFB8        9A00F6B8                        lea             r1,msgInit      ;       tell who we are
4472
                                                 ;      call    PRMESGAUX
4473
FFFFFFFFFFFFDFBC        9A00F6B8                        lea             r1,msgInit      ;       tell who we are
4474
FFFFFFFFFFFFDFC0        31FFFD81                        call    PRMESG
4475
FFFFFFFFFFFFDFC4        4600DF68                        lw              r1,TXTBGN       ;       init. end-of-program pointer
4476
FFFFFFFFFFFFDFC8        660090D0                        sw              r1,TXTUNF
4477
FFFFFFFFFFFFDFCC        4600DF70                        lw              r1,ENDMEM       ;       get address of end of memory
4478
FFFFFFFFFFFFDFD0        0E109000                        subui   r1,r1,#4096     ;       reserve 4K for the stack
4479
FFFFFFFFFFFFDFD4        660090F8                        sw              r1,STKBOT
4480
FFFFFFFFFFFFDFD8        E6804000                ; SETLO
4481
FFFFFFFFFFFFDFDC        041D0405                        subui   r1,r1,#16384 ;   1000 vars
4482
FFFFFFFFFFFFDFE0        660090D8                        sw      r1,VARBGN
4483
FFFFFFFFFFFFDFE4        31FFF905                        call    clearVars   ; clear the variable area
4484
FFFFFFFFFFFFDFE8        460090D8                        lw      r1,VARBGN   ; calculate number of bytes free
4485
FFFFFFFFFFFFDFEC        460190D0                        lw              r3,TXTUNF
4486
FFFFFFFFFFFFDFF0        04118405                        subu    r1,r1,r3
4487
FFFFFFFFFFFFDFF4        E0800000                        setlo   r2,#0
4488
FFFFFFFFFFFFDFF8        31FFFCCC                        call    PRTNUM
4489
FFFFFFFFFFFFDFFC        9A00F760                        lea             r1,msgBytesFree
4490
FFFFFFFFFFFFE000        31FFFD81                        call    PRMESG
4491
FFFFFFFFFFFFE004                                 WSTART:
4492
FFFFFFFFFFFFE004        660010A8                        sw              r0,LOPVAR   ; initialize internal variables
4493
FFFFFFFFFFFFE008        66001098                        sw              r0,STKGOS
4494
FFFFFFFFFFFFE00C        66001090                        sw              r0,CURRNT       ;       current line number pointer = 0
4495
FFFFFFFFFFFFE010        460F5F70                        lw              sp,ENDMEM       ;       init S.P. again, just in case
4496
FFFFFFFFFFFFE014        9A00F76E                        lea             r1,msgReady     ;       display "Ready"
4497
FFFFFFFFFFFFE018        31FFFD81                        call    PRMESG
4498
FFFFFFFFFFFFE01C                                 ST3:
4499
FFFFFFFFFFFFE01C        E040003E                        setlo   r1,#'>'         ; Prompt with a '>' and
4500
FFFFFFFFFFFFE020        31FFFC1A                        call    GETLN           ; read a line.
4501
FFFFFFFFFFFFE024        31FFFD5E                        call    TOUPBUF         ; convert to upper case
4502
FFFFFFFFFFFFE028        02860009                        mov             r12,r8          ; save pointer to end of line
4503
FFFFFFFFFFFFE02C        9A04111B                        lea             r8,BUFFER       ; point to the beginning of line
4504
FFFFFFFFFFFFE030        31FFFD3E                        call    TSTNUM          ; is there a number there?
4505
FFFFFFFFFFFFE034        31FFFD55                        call    IGNBLK          ; skip trailing blanks
4506 43 robfinch
                                                 ; does line no. exist? (or nonzero?)
4507 46 robfinch
FFFFFFFFFFFFE038        BE101708                        beq             r1,r0,DIRECT            ; if not, it's a direct statement
4508
FFFFFFFFFFFFE03C        AC1003FF                        bleu    r1,#0xFFFF,ST2  ; see if line no. is <= 16 bits
4509
FFFFFFFFFFFFE040        9A00F78C                        lea             r1,msgLineRange ; if not, we've overflowed
4510
FFFFFFFFFFFFE044        BE007F2A                        bra             ERROR
4511
FFFFFFFFFFFFE048                                 ST2:
4512 43 robfinch
                                                     ; ugliness - store a character at potentially an
4513
                                                     ; odd address (unaligned).
4514 46 robfinch
FFFFFFFFFFFFE048        02110009                        mov             r2,r1       ; r2 = line number
4515
FFFFFFFFFFFFE04C        60817FFE                        sb              r2,-2[r8]
4516
FFFFFFFFFFFFE050        06211001                        shrui   r2,r2,#8
4517
FFFFFFFFFFFFE054        60817FFF                        sb              r2,-1[r8]       ; store the binary line no.
4518
FFFFFFFFFFFFE058        0E840002                        subui   r8,r8,#2
4519
FFFFFFFFFFFFE05C        31FFFC4E                        call    FNDLN           ; find this line in save area
4520
FFFFFFFFFFFFE060        02968009                        mov             r13,r9          ; save possible line pointer
4521
FFFFFFFFFFFFE064        BE1001C8                        beq             r1,r0,ST4       ; if not found, insert
4522 43 robfinch
                                                        ; here we found the line, so we're replacing the line
4523
                                                        ; in the text area
4524
                                                        ; first step - delete the line
4525 46 robfinch
FFFFFFFFFFFFE068        E0400000                        setlo   r1,#0
4526
FFFFFFFFFFFFE06C        31FFFC62                        call    FNDNXT          ; find the next line (into r9)
4527
FFFFFFFFFFFFE070        BE100049                        bne             r1,r0,ST7
4528
FFFFFFFFFFFFE074        BE900108                        beq             r9,r0,ST6       ; no more lines
4529
FFFFFFFFFFFFE078                                 ST7:
4530
FFFFFFFFFFFFE078        02908009                        mov             r1,r9           ; r1 = pointer to next line
4531
FFFFFFFFFFFFE07C        02D10009                        mov             r2,r13          ; pointer to line to be deleted
4532
FFFFFFFFFFFFE080        460190D0                        lw              r3,TXTUNF       ; points to top of save area
4533
FFFFFFFFFFFFE084        31FFFC6B                        call    MVUP            ; move up to delete
4534
FFFFFFFFFFFFE088        660110D0                        sw              r2,TXTUNF       ; update the end pointer
4535 43 robfinch
                                                        ; we moved the lines of text after the line being
4536
                                                        ; deleted down, so the pointer to the next line
4537
                                                        ; needs to be reset
4538 46 robfinch
FFFFFFFFFFFFE08C        02D48009                        mov             r9,r13
4539
FFFFFFFFFFFFE090        BE00006A                        bra             ST4
4540 43 robfinch
                                                        ; here there were no more lines, so just move the
4541
                                                        ; end of text pointer down
4542 46 robfinch
FFFFFFFFFFFFE094                                 ST6:
4543
FFFFFFFFFFFFE094        660690D0                        sw              r13,TXTUNF
4544
FFFFFFFFFFFFE098        02D48009                        mov             r9,r13
4545
FFFFFFFFFFFFE09C                                 ST4:
4546 43 robfinch
                                                        ; here we're inserting because the line wasn't found
4547
                                                        ; or it was deleted     from the text area
4548 46 robfinch
FFFFFFFFFFFFE09C        02C08009                        mov             r1,r12          ; calculate the length of new line
4549
FFFFFFFFFFFFE0A0        04140404                        sub             r1,r1,r8
4550
FFFFFFFFFFFFE0A4        A41FDE03                        blei    r1,#3,ST3       ; is it just a line no. & CR? if so, it was just a delete
4551 43 robfinch
 
4552 46 robfinch
FFFFFFFFFFFFE0A8        460590D0                        lw              r11,TXTUNF      ; compute new end of text
4553
FFFFFFFFFFFFE0AC        02B50009                        mov             r10,r11         ; r10 = old TXTUNF
4554
FFFFFFFFFFFFE0B0        04B0AC02                        add             r11,r11,r1              ; r11 = new top of TXTUNF (r1=line length)
4555 43 robfinch
 
4556 46 robfinch
FFFFFFFFFFFFE0B4        460090D8                        lw              r1,VARBGN       ; see if there's enough room
4557
FFFFFFFFFFFFE0B8        BEB08064                        bltu    r11,r1,ST5
4558
FFFFFFFFFFFFE0BC        9A00F867                        lea             r1,msgTooBig    ; if not, say so
4559
FFFFFFFFFFFFE0C0        33FFFC0A                        jmp             ERROR
4560 43 robfinch
 
4561
                                                        ; open a space in the text area
4562 46 robfinch
FFFFFFFFFFFFE0C4                                 ST5:
4563
FFFFFFFFFFFFE0C4        660590D0                        sw              r11,TXTUNF      ; if so, store new end position
4564
FFFFFFFFFFFFE0C8        02A08009                        mov             r1,r10          ; points to old end of text
4565
FFFFFFFFFFFFE0CC        02B10009                        mov             r2,r11          ; points to new end of text
4566
FFFFFFFFFFFFE0D0        02918009                        mov             r3,r9       ; points to start of line after insert line
4567
FFFFFFFFFFFFE0D4        31FFFC71                        call    MVDOWN          ; move things out of the way
4568 43 robfinch
 
4569
                                                        ; copy line into text space
4570 46 robfinch
FFFFFFFFFFFFE0D8        02808009                        mov             r1,r8           ; set up to do the insertion; move from buffer
4571
FFFFFFFFFFFFE0DC        02D10009                        mov             r2,r13          ; to vacated space
4572
FFFFFFFFFFFFE0E0        02C18009                        mov             r3,r12          ; until end of buffer
4573
FFFFFFFFFFFFE0E4        31FFFC6B                        call    MVUP            ; do it
4574
FFFFFFFFFFFFE0E8        BE0079AA                        bra             ST3                     ; go back and get another line
4575 43 robfinch
 
4576
                                                 ;******************************************************************
4577
                                                 ;
4578
                                                 ; *** Tables *** DIRECT *** EXEC ***
4579
                                                 ;
4580
                                                 ; This section of the code tests a string against a table. When
4581
                                                 ; a match is found, control is transferred to the section of
4582
                                                 ; code according to the table.
4583
                                                 ;
4584
                                                 ; At 'EXEC', r8 should point to the string, r9 should point to
4585
                                                 ; the character table, and r10 should point to the execution
4586
                                                 ; table. At 'DIRECT', r8 should point to the string, r9 and
4587
                                                 ; r10 will be set up to point to TAB1 and TAB1_1, which are
4588
                                                 ; the tables of all direct and statement commands.
4589
                                                 ;
4590
                                                 ; A '.' in the string will terminate the test and the partial
4591
                                                 ; match will be considered as a match, e.g. 'P.', 'PR.','PRI.',
4592
                                                 ; 'PRIN.', or 'PRINT' will all match 'PRINT'.
4593
                                                 ;
4594
                                                 ; There are two tables: the character table and the execution
4595
                                                 ; table. The character table consists of any number of text items.
4596
                                                 ; Each item is a string of characters with the last character's
4597
                                                 ; high bit set to one. The execution table holds a 32-bit
4598
                                                 ; execution addresses that correspond to each entry in the
4599
                                                 ; character table.
4600
                                                 ;
4601
                                                 ; The end of the character table is a 0 byte which corresponds
4602
                                                 ; to the default routine in the execution table, which is
4603
                                                 ; executed if none of the other table items are matched.
4604
                                                 ;
4605
                                                 ; Character-matching tables:
4606
 
4607 46 robfinch
FFFFFFFFFFFFE0EC                                 TAB1:
4608
FFFFFFFFFFFFE0E8 D453494CBE0079AA               db      "LIS",'T'+0x80        ; Direct commands
4609
FFFFFFFFFFFFE0F0 52D7454EC4414F4C               db      "RU",'N'+0x80
4610
FFFFFFFFFFFFE0FE                                 TAB2:
4611
FFFFFFFFFFFFE0F8 454EC5564153CE55               db      "NEX",'T'+0x80         ; Direct / statement
4612
FFFFFFFFFFFFE100 47C649D4454CD458               db      "GOT",'O'+0x80
4613
FFFFFFFFFFFFE108 C255534F47CF544F               db      "GOSU",'B'+0x80
4614
FFFFFFFFFFFFE110 4552CE5255544552               db      "RE",'M'+0x80
4615
FFFFFFFFFFFFE118 55504E49D24F46CD               db      "INPU",'T'+0x80
4616
FFFFFFFFFFFFE120 4F50D44E495250D4               db      "POKE",'C'+0x80
4617
FFFFFFFFFFFFE128 C8454B4F50C3454B               db      "POKE",'H'+0x80
4618
FFFFFFFFFFFFE130 4B4F50D7454B4F50               db      "POK",'E'+0x80
4619
FFFFFFFFFFFFE138 C55942D04F5453C5               db      "BY",'E'+0x80
4620
FFFFFFFFFFFFE140 4C43D34C43D35953            db  "CL",'R'+0x80
4621
FFFFFFFFFFFFE14E                                 TAB4:
4622
FFFFFFFFFFFFE148 455000C6434452D2               db      "PEEK",'C'+0x80        ;Functions
4623
FFFFFFFFFFFFE150 C84B454550C34B45               db      "PEEK",'H'+0x80        ;Functions
4624
FFFFFFFFFFFFE158 454550D74B454550               db      "PEE",'K'+0x80         ;Functions
4625
FFFFFFFFFFFFE160 53D34241C44E52CB               db      "SIZ",'E'+0x80
4626
FFFFFFFFFFFFE16F                                 TAB5:
4627
FFFFFFFFFFFFE168 5400D25355C55A49               db      "T",'O'+0x80           ;"TO" in "FOR"
4628
FFFFFFFFFFFFE172                                 TAB6:
4629
FFFFFFFFFFFFE177                                 TAB8:
4630
FFFFFFFFFFFFE170 3E00D045545300CF               db      '>','='+0x80           ;Relational operators
4631
FFFFFFFFFFFFE178 BCBD3CBDBEBE3CBD               db      '<'+0x80
4632
FFFFFFFFFFFFE181                                 TAB9:
4633
FFFFFFFFFFFFE185                                 TAB10:
4634
FFFFFFFFFFFFE180 00D24F00C44E4100            db  0
4635 43 robfinch
 
4636 46 robfinch
FFFFFFFFFFFFE188                                        .align  8
4637
 
4638 43 robfinch
                                                 ;* Execution address tables:
4639 46 robfinch
FFFFFFFFFFFFE188                                 TAB1_1:
4640
FFFFFFFFFFFFE188 FFFFFFFFFFFFE440               dw      LISTX                   ;Direct commands
4641
FFFFFFFFFFFFE190 FFFFFFFFFFFFE784               dw      LOAD
4642
FFFFFFFFFFFFE198 FFFFFFFFFFFFE38C               dw      NEW
4643
FFFFFFFFFFFFE1A0 FFFFFFFFFFFFE3A4               dw      RUN
4644
FFFFFFFFFFFFE1A8 FFFFFFFFFFFFE830               dw      SAVE
4645
FFFFFFFFFFFFE1B0                                 TAB2_1:
4646
FFFFFFFFFFFFE1B0 FFFFFFFFFFFFE610               dw      NEXT            ;       Direct / statement
4647
FFFFFFFFFFFFE1B8 FFFFFFFFFFFFE76C               dw      LET
4648
FFFFFFFFFFFFE1C0 FFFFFFFFFFFFE680               dw      IF
4649
FFFFFFFFFFFFE1C8 FFFFFFFFFFFFE3EC               dw      GOTO
4650
FFFFFFFFFFFFE1D0 FFFFFFFFFFFFE520               dw      GOSUB
4651
FFFFFFFFFFFFE1D8 FFFFFFFFFFFFE55C               dw      RETURN
4652
FFFFFFFFFFFFE1E0 FFFFFFFFFFFFE688               dw      IF2                     ; REM
4653
FFFFFFFFFFFFE1E8 FFFFFFFFFFFFE594               dw      FOR
4654
FFFFFFFFFFFFE1F0 FFFFFFFFFFFFE6B0               dw      INPUT
4655
FFFFFFFFFFFFE1F8 FFFFFFFFFFFFE488               dw      PRINT
4656
FFFFFFFFFFFFE200 FFFFFFFFFFFFE944               dw      POKEC
4657
FFFFFFFFFFFFE208 FFFFFFFFFFFFE970               dw      POKEH
4658
FFFFFFFFFFFFE210 FFFFFFFFFFFFE99C               dw      POKEW
4659
FFFFFFFFFFFFE218 FFFFFFFFFFFFE910               dw      POKE
4660
FFFFFFFFFFFFE220 FFFFFFFFFFFFE39C               dw      STOP
4661
FFFFFFFFFFFFE228 FFFFFFFFFFFFDF64               dw      GOBYE
4662
FFFFFFFFFFFFE230 FFFFFFFFFFFFE9C8               dw      SYSX
4663
FFFFFFFFFFFFE238 FFFFFFFFFFFFF690               dw      _cls
4664
FFFFFFFFFFFFE240 FFFFFFFFFFFFE40C               dw  _clr
4665
FFFFFFFFFFFFE248 FFFFFFFFFFFFF6A4               dw      _rdcf
4666
FFFFFFFFFFFFE250 FFFFFFFFFFFFE764               dw      DEFLT
4667
FFFFFFFFFFFFE258                                 TAB4_1:
4668
FFFFFFFFFFFFE258 FFFFFFFFFFFFEE44               dw  PEEKC
4669
FFFFFFFFFFFFE260 FFFFFFFFFFFFEE58               dw  PEEKH
4670
FFFFFFFFFFFFE268 FFFFFFFFFFFFEE6C               dw  PEEKW
4671
FFFFFFFFFFFFE270 FFFFFFFFFFFFEE34               dw      PEEK                    ;Functions
4672
FFFFFFFFFFFFE278 FFFFFFFFFFFFEE9C               dw      RND
4673
FFFFFFFFFFFFE280 FFFFFFFFFFFFEF34               dw      ABS
4674
FFFFFFFFFFFFE288 FFFFFFFFFFFFEF54               dw      SIZEX
4675
FFFFFFFFFFFFE290 FFFFFFFFFFFFEE80               dw  USRX
4676
FFFFFFFFFFFFE298 FFFFFFFFFFFFEC58               dw      XP40
4677
FFFFFFFFFFFFE2A0                                 TAB5_1
4678
FFFFFFFFFFFFE2A0 FFFFFFFFFFFFE5AC               dw      FR1                     ;"TO" in "FOR"
4679
FFFFFFFFFFFFE2A8 FFFFFFFFFFFFF024               dw      QWHAT
4680
FFFFFFFFFFFFE2B0                                 TAB6_1
4681
FFFFFFFFFFFFE2B0 FFFFFFFFFFFFE5C0               dw      FR2                     ;"STEP" in "FOR"
4682
FFFFFFFFFFFFE2B8 FFFFFFFFFFFFE5C8               dw      FR3
4683
FFFFFFFFFFFFE2C0                                 TAB8_1
4684
FFFFFFFFFFFFE2C0 FFFFFFFFFFFFEAD8               dw      XP11    ;>=             Relational operators
4685
FFFFFFFFFFFFE2C8 FFFFFFFFFFFFEAE8               dw      XP12    ;<>
4686
FFFFFFFFFFFFE2D0 FFFFFFFFFFFFEAF8               dw      XP13    ;>
4687
FFFFFFFFFFFFE2D8 FFFFFFFFFFFFEB18               dw      XP15    ;=
4688
FFFFFFFFFFFFE2E0 FFFFFFFFFFFFEB08               dw      XP14    ;<=
4689
FFFFFFFFFFFFE2E8 FFFFFFFFFFFFEB28               dw      XP16    ;<
4690
FFFFFFFFFFFFE2F0 FFFFFFFFFFFFEB50               dw      XP17
4691
FFFFFFFFFFFFE2F8                                 TAB9_1
4692
FFFFFFFFFFFFE2F8 FFFFFFFFFFFFEA44            dw  XP_AND
4693
FFFFFFFFFFFFE300 FFFFFFFFFFFFEA54            dw  XP_ANDX
4694
FFFFFFFFFFFFE308                                 TAB10_1
4695
FFFFFFFFFFFFE308 FFFFFFFFFFFFEA0C            dw  XP_OR
4696
FFFFFFFFFFFFE310 FFFFFFFFFFFFEA1C            dw  XP_ORX
4697 43 robfinch
 
4698 46 robfinch
FFFFFFFFFFFFE318                                        .align  4
4699 43 robfinch
 
4700 27 robfinch
                                                 ;*
4701 43 robfinch
                                                 ; r3 = match flag (trashed)
4702
                                                 ; r9 = text table
4703
                                                 ; r10 = exec table
4704
                                                 ; r11 = trashed
4705 46 robfinch
FFFFFFFFFFFFE318                                 DIRECT:
4706
FFFFFFFFFFFFE318        9A04E0EC                        lea             r9,TAB1
4707
FFFFFFFFFFFFE31C        9A056188                        lea             r10,TAB1_1
4708
FFFFFFFFFFFFE320                                 EXEC:
4709
FFFFFFFFFFFFE320        03F58009                        mov             r11,lr          ; save link reg
4710
FFFFFFFFFFFFE324        31FFFD55                        call    IGNBLK          ; ignore leading blanks
4711
FFFFFFFFFFFFE328        02BF8009                        mov             lr,r11          ; restore link reg
4712
FFFFFFFFFFFFE32C        02858009                        mov             r11,r8          ; save the pointer
4713
FFFFFFFFFFFFE330        E0C00000                        setlo   r3,#0           ; clear match flag
4714
FFFFFFFFFFFFE334                                 EXLP:
4715
FFFFFFFFFFFFE334        4A808000                        lbu             r1,[r8]         ; get the program character
4716
FFFFFFFFFFFFE338        0A840001                        addui   r8,r8,#1
4717
FFFFFFFFFFFFE33C        4A910000                        lbu             r2,[r9]         ; get the table character
4718
FFFFFFFFFFFFE340        BE200069                        bne             r2,r0,EXNGO             ; If end of table,
4719
FFFFFFFFFFFFE344        02B40009                        mov             r8,r11          ;       restore the text pointer and...
4720
FFFFFFFFFFFFE348        BE0001EA                        bra             EXGO            ;   execute the default.
4721
FFFFFFFFFFFFE34C                                 EXNGO:
4722
FFFFFFFFFFFFE34C        BE1181C8                        beq             r1,r3,EXGO      ; Else check for period... if so, execute
4723
FFFFFFFFFFFFE350        1421007F                        andi    r2,r2,#0x7f     ; ignore the table's high bit
4724
FFFFFFFFFFFFE354        BE208108                        beq             r2,r1,EXMAT;            is there a match?
4725
FFFFFFFFFFFFE358        0AA50008                        addui   r10,r10,#8      ;if not, try the next entry
4726
FFFFFFFFFFFFE35C        02B40009                        mov             r8,r11          ; reset the program pointer
4727
FFFFFFFFFFFFE360        E0C00000                        setlo   r3,#0           ; sorry, no match
4728
FFFFFFFFFFFFE364                                 EX1:
4729
FFFFFFFFFFFFE364        0A948001                        addui   r9,r9,#1
4730
FFFFFFFFFFFFE368        4090FFFF                        lb              r1,-1[r9]       ; get to the end of the entry
4731
FFFFFFFFFFFFE36C        BE107FC3                        bgt             r1,r0,EX1
4732
FFFFFFFFFFFFE370        BE007E2A                        bra             EXLP            ; back for more matching
4733
FFFFFFFFFFFFE374                                 EXMAT:
4734
FFFFFFFFFFFFE374        E0C0002E                        setlo   r3,#'.'         ; we've got a match so far
4735
FFFFFFFFFFFFE378        0A948001                        addui   r9,r9,#1
4736
FFFFFFFFFFFFE37C        4090FFFF                        lb              r1,-1[r9]       ; end of table entry?
4737
FFFFFFFFFFFFE380        BE107DA3                        bgt             r1,r0,EXLP              ; if not, go back for more
4738
FFFFFFFFFFFFE384                                 EXGO:
4739
FFFFFFFFFFFFE384        46A58000                        lw              r11,[r10]       ; execute the appropriate routine
4740
FFFFFFFFFFFFE388        34B00000                        jal             r0,[r11]
4741 43 robfinch
 
4742
                                                 ;    lb      r1,[r8]     ; get token from text space
4743
                                                 ;    bpl
4744
                                                 ;    and     r1,#0x7f
4745
                                                 ;    shl     r1,#2       ; * 4 - word offset
4746
                                                 ;    add     r1,r1,#TAB1_1
4747
                                                 ;    lw      r1,[r1]
4748
                                                 ;    jmp     [r1]
4749
 
4750
 
4751
                                                 ;******************************************************************
4752
                                                 ;
4753
                                                 ; What follows is the code to execute direct and statement
4754
                                                 ; commands. Control is transferred to these points via the command
4755
                                                 ; table lookup code of 'DIRECT' and 'EXEC' in the last section.
4756
                                                 ; After the command is executed, control is transferred to other
4757
                                                 ; sections as follows:
4758
                                                 ;
4759
                                                 ; For 'LISTX', 'NEW', and 'STOP': go back to the warm start point.
4760
                                                 ; For 'RUN': go execute the first stored line if any; else go
4761
                                                 ; back to the warm start point.
4762
                                                 ; For 'GOTO' and 'GOSUB': go execute the target line.
4763
                                                 ; For 'RETURN' and 'NEXT'; go back to saved return line.
4764
                                                 ; For all others: if 'CURRNT' is 0, go to warm start; else go
4765
                                                 ; execute next command. (This is done in 'FINISH'.)
4766
                                                 ;
4767
                                                 ;******************************************************************
4768
                                                 ;
4769
                                                 ; *** NEW *** STOP *** RUN (& friends) *** GOTO ***
4770
                                                 ;
4771
                                                 ; 'NEW' sets TXTUNF to point to TXTBGN
4772
                                                 ;
4773
                                                 ; 'STOP' goes back to WSTART
4774
                                                 ;
4775
                                                 ; 'RUN' finds the first stored line, stores its address
4776
                                                 ; in CURRNT, and starts executing it. Note that only those
4777
                                                 ; commands in TAB2 are legal for a stored program.
4778
                                                 ;
4779
                                                 ; There are 3 more entries in 'RUN':
4780
                                                 ; 'RUNNXL' finds next line, stores it's address and executes it.
4781
                                                 ; 'RUNTSL' stores the address of this line and executes it.
4782
                                                 ; 'RUNSML' continues the execution on same line.
4783
                                                 ;
4784
                                                 ; 'GOTO expr' evaluates the expression, finds the target
4785
                                                 ; line, and jumps to 'RUNTSL' to do it.
4786
                                                 ;
4787 46 robfinch
FFFFFFFFFFFFE38C                                 NEW:
4788
FFFFFFFFFFFFE38C        31FFFBFB                        call    ENDCHK
4789
FFFFFFFFFFFFE390        4600DF68                        lw              r1,TXTBGN
4790
FFFFFFFFFFFFE394        660090D0                        sw              r1,TXTUNF       ;       set the end pointer
4791
FFFFFFFFFFFFE398        31FFF905                        call    clearVars
4792 43 robfinch
 
4793 46 robfinch
FFFFFFFFFFFFE39C                                 STOP:
4794
FFFFFFFFFFFFE39C        31FFFBFB                        call    ENDCHK
4795
FFFFFFFFFFFFE3A0        BE00632A                        bra             WSTART          ; WSTART will reset the stack
4796 43 robfinch
 
4797 46 robfinch
FFFFFFFFFFFFE3A4                                 RUN:
4798
FFFFFFFFFFFFE3A4        31FFFBFB                        call    ENDCHK
4799
FFFFFFFFFFFFE3A8        46045F68                        lw              r8,TXTBGN       ;       set pointer to beginning
4800
FFFFFFFFFFFFE3AC        66041090                        sw              r8,CURRNT
4801
FFFFFFFFFFFFE3B0        31FFF905                        call    clearVars
4802 43 robfinch
 
4803 46 robfinch
FFFFFFFFFFFFE3B4                                 RUNNXL:                                        ; RUN 
4804
FFFFFFFFFFFFE3B4        46009090                        lw              r1,CURRNT       ; executing a program?
4805
FFFFFFFFFFFFE3B8        BE106268                        beq             r1,r0,WSTART    ; if not, we've finished a direct stat.
4806
FFFFFFFFFFFFE3BC        E0400000                        setlo   r1,#0       ; else find the next line number
4807
FFFFFFFFFFFFE3C0        02848009                        mov             r9,r8
4808
FFFFFFFFFFFFE3C4        31FFFC52                        call    FNDLNP          ; search for the next line
4809
FFFFFFFFFFFFE3C8        BE100069                        bne             r1,r0,RUNTSL
4810
FFFFFFFFFFFFE3CC        BE900049                        bne             r9,r0,RUNTSL
4811
FFFFFFFFFFFFE3D0        BE0061AA                        bra             WSTART          ; if we've fallen off the end, stop
4812 43 robfinch
 
4813 46 robfinch
FFFFFFFFFFFFE3D4                                 RUNTSL:                                        ; RUN 
4814
FFFFFFFFFFFFE3D4        66049090                        sw              r9,CURRNT       ; set CURRNT to point to the line no.
4815
FFFFFFFFFFFFE3D8        9A940002                        lea             r8,2[r9]        ; set the text pointer to
4816 43 robfinch
 
4817 46 robfinch
FFFFFFFFFFFFE3DC                                 RUNSML:                 ; RUN 
4818
FFFFFFFFFFFFE3DC        31FFFD77                        call    CHKIO           ; see if a control-C was pressed
4819
FFFFFFFFFFFFE3E0        9A04E0FE                        lea             r9,TAB2         ; find command in TAB2
4820
FFFFFFFFFFFFE3E4        9A0561B0                        lea             r10,TAB2_1
4821
FFFFFFFFFFFFE3E8        BE0079CA                        bra             EXEC            ; and execute it
4822 43 robfinch
 
4823 46 robfinch
FFFFFFFFFFFFE3EC                                 GOTO:
4824
FFFFFFFFFFFFE3EC        31FFFA7C                        call    OREXPR          ;evaluate the following expression
4825
FFFFFFFFFFFFE3F0        02128009                        mov     r5,r1
4826
FFFFFFFFFFFFE3F4        31FFFBFB                        call    ENDCHK          ;must find end of line
4827
FFFFFFFFFFFFE3F8        02508009                        mov     r1,r5
4828
FFFFFFFFFFFFE3FC        31FFFC4E                        call    FNDLN           ; find the target line
4829
FFFFFFFFFFFFE400        BE107EA9                        bne             r1,r0,RUNTSL            ; go do it
4830
FFFFFFFFFFFFE404        9A00F833                        lea             r1,msgBadGotoGosub
4831
FFFFFFFFFFFFE408        BE00610A                        bra             ERROR           ; no such line no.
4832 43 robfinch
 
4833 46 robfinch
FFFFFFFFFFFFE40C                                 _clr:
4834
FFFFFFFFFFFFE40C        31FFF905                     call    clearVars
4835
FFFFFFFFFFFFE410        BE00084A                     bra     FINISH
4836 43 robfinch
 
4837
                                                 ; Clear the variable area of memory
4838 46 robfinch
FFFFFFFFFFFFE414                                 clearVars:
4839
FFFFFFFFFFFFE414        0FEF0010                     subui   sp,sp,#16
4840
FFFFFFFFFFFFE418        67E30000                     sw         r6,[sp]
4841
FFFFFFFFFFFFE41C        67EF8008                     sw         lr,8[sp]
4842
FFFFFFFFFFFFE420        E1800800                     setlo   r6,#2048    ; number of words to clear
4843
FFFFFFFFFFFFE424        460090D8                     lw      r1,VARBGN
4844
FFFFFFFFFFFFE428                                 cv1:
4845
FFFFFFFFFFFFE428        66100000                     sw      r0,[r1]
4846
FFFFFFFFFFFFE42C        08108008                     add     r1,r1,#8
4847
FFFFFFFFFFFFE430        BE037FCF                     loop       r6,cv1
4848
FFFFFFFFFFFFE434        47EF8008                     lw         lr,8[sp]
4849
FFFFFFFFFFFFE438        47E30000                     lw         r6,[sp]
4850
FFFFFFFFFFFFE43C        37EF8010                     ret                #16
4851 43 robfinch
 
4852
 
4853
                                                 ;******************************************************************
4854
                                                 ; LIST
4855
                                                 ;
4856
                                                 ; LISTX has two forms:
4857
                                                 ; 'LIST' lists all saved lines
4858
                                                 ; 'LIST #' starts listing at the line #
4859
                                                 ; Control-S pauses the listing, control-C stops it.
4860
                                                 ;******************************************************************
4861
                                                 ;
4862 46 robfinch
FFFFFFFFFFFFE440                                 LISTX:
4863
FFFFFFFFFFFFE440        31FFFD3E                        call    TSTNUM          ; see if there's a line no.
4864
FFFFFFFFFFFFE444        02128009                        mov     r5,r1
4865
FFFFFFFFFFFFE448        31FFFBFB                        call    ENDCHK          ; if not, we get a zero
4866
FFFFFFFFFFFFE44C        02508009                        mov     r1,r5
4867
FFFFFFFFFFFFE450        31FFFC4E                        call    FNDLN           ; find this or next line
4868
FFFFFFFFFFFFE454                                 LS1:
4869
FFFFFFFFFFFFE454        BE100049                        bne             r1,r0,LS4
4870
FFFFFFFFFFFFE458        BE905D68                        beq             r9,r0,WSTART    ; warm start if we passed the end
4871
FFFFFFFFFFFFE45C                                 LS4:
4872
FFFFFFFFFFFFE45C        02908009                        mov             r1,r9
4873
FFFFFFFFFFFFE460        31FFFD1E                        call    PRTLN           ; print the line
4874
FFFFFFFFFFFFE464        02148009                        mov             r9,r1           ; set pointer for next
4875
FFFFFFFFFFFFE468        31FFFD77                        call    CHKIO           ; check for listing halt request
4876
FFFFFFFFFFFFE46C        BE100088                        beq             r1,r0,LS3
4877
FFFFFFFFFFFFE470        B2100313                        bnei    r1,#CTRLS,LS3   ; pause the listing?
4878
FFFFFFFFFFFFE474                                 LS2:
4879
FFFFFFFFFFFFE474        31FFFD77                        call    CHKIO           ; if so, wait for another keypress
4880
FFFFFFFFFFFFE478        BE107FE8                        beq             r1,r0,LS2
4881
FFFFFFFFFFFFE47C                                 LS3:
4882
FFFFFFFFFFFFE47C        E0400000                        setlo   r1,#0
4883
FFFFFFFFFFFFE480        31FFFC52                        call    FNDLNP          ; find the next line
4884
FFFFFFFFFFFFE484        BE007E8A                        bra             LS1
4885 43 robfinch
 
4886
 
4887
                                                 ;******************************************************************
4888
                                                 ; PRINT command is 'PRINT ....:' or 'PRINT ....'
4889
                                                 ; where '....' is a list of expressions, formats, back-arrows,
4890
                                                 ; and strings. These items a separated by commas.
4891
                                                 ;
4892
                                                 ; A format is a pound sign followed by a number.  It controls
4893
                                                 ; the number of spaces the value of an expression is going to
4894
                                                 ; be printed in.  It stays effective for the rest of the print
4895
                                                 ; command unless changed by another format.  If no format is
4896
                                                 ; specified, 11 positions will be used.
4897
                                                 ;
4898
                                                 ; A string is quoted in a pair of single- or double-quotes.
4899
                                                 ;
4900
                                                 ; An underline (back-arrow) means generate a  without a 
4901
                                                 ;
4902
                                                 ; A  is generated after the entire list has been printed
4903
                                                 ; or if the list is empty.  If the list ends with a semicolon,
4904
                                                 ; however, no  is generated.
4905
                                                 ;******************************************************************
4906
                                                 ;
4907 46 robfinch
FFFFFFFFFFFFE488                                 PRINT:
4908
FFFFFFFFFFFFE488        1602800B                        lw              r5,#11          ; D4 = number of print spaces
4909
FFFFFFFFFFFFE48C        E0C0003A                        setlo   r3,#':'
4910
FFFFFFFFFFFFE490        9A0264A0                        lea             r4,PR2
4911
FFFFFFFFFFFFE494        31FFFD30                        call    TSTC            ; if null list and ":"
4912
FFFFFFFFFFFFE498        31FFF135                        call    CRLF            ; give CR-LF and continue
4913
FFFFFFFFFFFFE49C        BE007A0A                        bra             RUNSML          ;               execution on the same line
4914
FFFFFFFFFFFFE4A0                                 PR2:
4915
FFFFFFFFFFFFE4A0        E0C0000D                        setlo   r3,#CR
4916
FFFFFFFFFFFFE4A4        9A0264B4                        lea             r4,PR0
4917
FFFFFFFFFFFFE4A8        31FFFD30                        call    TSTC            ;if null list and 
4918
FFFFFFFFFFFFE4AC        31FFF135                        call    CRLF            ;also give CR-LF and
4919
FFFFFFFFFFFFE4B0        BE00782A                        bra             RUNNXL          ;execute the next line
4920
FFFFFFFFFFFFE4B4                                 PR0:
4921
FFFFFFFFFFFFE4B4        E0C00023                        setlo   r3,#'#'
4922
FFFFFFFFFFFFE4B8        9A0264CC                        lea             r4,PR1
4923
FFFFFFFFFFFFE4BC        31FFFD30                        call    TSTC            ;else is it a format?
4924
FFFFFFFFFFFFE4C0        31FFFA7C                        call    OREXPR          ; yes, evaluate expression
4925
FFFFFFFFFFFFE4C4        04101409                        lw              r5,r1           ; and save it as print width
4926
FFFFFFFFFFFFE4C8        BE00012A                        bra             PR3             ; look for more to print
4927
FFFFFFFFFFFFE4CC                                 PR1:
4928
FFFFFFFFFFFFE4CC        E0C00024                        setlo   r3,#'$'
4929
FFFFFFFFFFFFE4D0        9A0264E4                        lea             r4,PR4
4930
FFFFFFFFFFFFE4D4        31FFFD30                        call    TSTC    ;       is character expression? (MRL)
4931
FFFFFFFFFFFFE4D8        31FFFA7C                        call    OREXPR  ;       yep. Evaluate expression (MRL)
4932
FFFFFFFFFFFFE4DC        31FFF7D5                        call    GOOUT   ;       print low byte (MRL)
4933
FFFFFFFFFFFFE4E0        BE00006A                        bra             PR3             ;look for more. (MRL)
4934
FFFFFFFFFFFFE4E4                                 PR4:
4935
FFFFFFFFFFFFE4E4        31FFFCA9                        call    QTSTG   ;       is it a string?
4936 43 robfinch
                                                        ; the following branch must occupy only two bytes!
4937 46 robfinch
FFFFFFFFFFFFE4E8        BE00010A                        bra             PR8             ;       if not, must be an expression
4938
FFFFFFFFFFFFE4EC                                 PR3:
4939
FFFFFFFFFFFFE4EC        E0C0002C                        setlo   r3,#','
4940
FFFFFFFFFFFFE4F0        9A026500                        lea             r4,PR6
4941
FFFFFFFFFFFFE4F4        31FFFD30                        call    TSTC    ;       if ",", go find next
4942
FFFFFFFFFFFFE4F8        31FFFBEC                        call    FIN             ;in the list.
4943
FFFFFFFFFFFFE4FC        BE007DCA                        bra             PR0
4944
FFFFFFFFFFFFE500                                 PR6:
4945
FFFFFFFFFFFFE500        31FFF135                        call    CRLF            ;list ends here
4946
FFFFFFFFFFFFE504        BE0000AA                        bra             FINISH
4947
FFFFFFFFFFFFE508                                 PR8:
4948
FFFFFFFFFFFFE508        31FFFA7C                        call    OREXPR          ; evaluate the expression
4949
FFFFFFFFFFFFE50C        04500809                        lw              r2,r5           ; set the width
4950
FFFFFFFFFFFFE510        31FFFCCC                        call    PRTNUM          ; print its value
4951
FFFFFFFFFFFFE514        BE007ECA                        bra             PR3                     ; more to print?
4952 43 robfinch
 
4953 46 robfinch
FFFFFFFFFFFFE518                                 FINISH:
4954
FFFFFFFFFFFFE518        31FFFBEC                        call    FIN             ; Check end of command
4955
FFFFFFFFFFFFE51C        33FFFC09                        jmp             QWHAT   ; print "What?" if wrong
4956 43 robfinch
 
4957
 
4958
                                                 ;*******************************************************************
4959
                                                 ;
4960
                                                 ; *** GOSUB *** & RETURN ***
4961
                                                 ;
4962
                                                 ; 'GOSUB expr:' or 'GOSUB expr' is like the 'GOTO' command,
4963
                                                 ; except that the current text pointer, stack pointer, etc. are
4964
                                                 ; saved so that execution can be continued after the subroutine
4965
                                                 ; 'RETURN's.  In order that 'GOSUB' can be nested (and even
4966
                                                 ; recursive), the save area must be stacked.  The stack pointer
4967
                                                 ; is saved in 'STKGOS'.  The old 'STKGOS' is saved on the stack.
4968
                                                 ; If we are in the main routine, 'STKGOS' is zero (this was done
4969
                                                 ; in the initialization section of the interpreter), but we still
4970
                                                 ; save it as a flag for no further 'RETURN's.
4971
                                                 ;******************************************************************
4972
                                                 ;
4973 46 robfinch
FFFFFFFFFFFFE520                                 GOSUB:
4974
FFFFFFFFFFFFE520        31FFFC80                        call    PUSHA           ; save the current 'FOR' parameters
4975
FFFFFFFFFFFFE524        31FFFA7C                        call    OREXPR          ; get line number
4976
FFFFFFFFFFFFE528        31FFFC4E                        call    FNDLN           ; find the target line
4977
FFFFFFFFFFFFE52C        BE100069                        bne             r1,r0,gosub1
4978
FFFFFFFFFFFFE530        9A00F833                        lea             r1,msgBadGotoGosub
4979
FFFFFFFFFFFFE534        BE0057AA                        bra             ERROR           ; if not there, say "How?"
4980
FFFFFFFFFFFFE538                                 gosub1:
4981
FFFFFFFFFFFFE538        0DEF0018                        sub             sp,sp,#24
4982
FFFFFFFFFFFFE53C        67E40000                        sw              r8,[sp]         ; save text pointer
4983
FFFFFFFFFFFFE540        46009090                        lw              r1,CURRNT
4984
FFFFFFFFFFFFE544        67E08008                        sw              r1,8[sp]        ; found it, save old 'CURRNT'...
4985
FFFFFFFFFFFFE548        46009098                        lw              r1,STKGOS
4986
FFFFFFFFFFFFE54C        67E08010                        sw              r1,16[sp]       ; and 'STKGOS'
4987
FFFFFFFFFFFFE550        660010A8                        sw              r0,LOPVAR       ; load new values
4988
FFFFFFFFFFFFE554        660F1098                        sw              sp,STKGOS
4989
FFFFFFFFFFFFE558        BE0073EA                        bra             RUNTSL
4990 43 robfinch
 
4991
 
4992
                                                 ;******************************************************************
4993
                                                 ; 'RETURN' undoes everything that 'GOSUB' did, and thus
4994
                                                 ; returns the execution to the command after the most recent
4995
                                                 ; 'GOSUB'.  If 'STKGOS' is zero, it indicates that we never had
4996
                                                 ; a 'GOSUB' and is thus an error.
4997
                                                 ;******************************************************************
4998
                                                 ;
4999 46 robfinch
FFFFFFFFFFFFE55C                                 RETURN:
5000
FFFFFFFFFFFFE55C        31FFFBFB                        call    ENDCHK          ; there should be just a 
5001
FFFFFFFFFFFFE560        46009098                        lw              r1,STKGOS       ; get old stack pointer
5002
FFFFFFFFFFFFE564        BE100069                        bne             r1,r0,return1
5003
FFFFFFFFFFFFE568        9A00F850                        lea             r1,msgRetWoGosub
5004
FFFFFFFFFFFFE56C        BE0055EA                        bra             ERROR           ; if zero, it doesn't exist
5005
FFFFFFFFFFFFE570                                 return1:
5006
FFFFFFFFFFFFE570        021F0009                        mov             sp,r1           ; else restore it
5007
FFFFFFFFFFFFE574        47E08010                        lw              r1,16[sp]
5008
FFFFFFFFFFFFE578        66009098                        sw              r1,STKGOS       ; and the old 'STKGOS'
5009
FFFFFFFFFFFFE57C        47E08008                        lw              r1,8[sp]
5010
FFFFFFFFFFFFE580        66009090                        sw              r1,CURRNT       ; and the old 'CURRNT'
5011
FFFFFFFFFFFFE584        47E40000                        lw              r8,[sp]         ; and the old text pointer
5012
FFFFFFFFFFFFE588        09EF0018                        add             sp,sp,#24
5013
FFFFFFFFFFFFE58C        31FFFC73                        call    POPA            ;and the old 'FOR' parameters
5014
FFFFFFFFFFFFE590        BE007C4A                        bra             FINISH          ;and we are back home
5015 43 robfinch
 
5016
                                                 ;******************************************************************
5017
                                                 ; *** FOR *** & NEXT ***
5018
                                                 ;
5019
                                                 ; 'FOR' has two forms:
5020
                                                 ; 'FOR var=exp1 TO exp2 STEP exp1' and 'FOR var=exp1 TO exp2'
5021
                                                 ; The second form means the same thing as the first form with a
5022
                                                 ; STEP of positive 1.  The interpreter will find the variable 'var'
5023
                                                 ; and set its value to the current value of 'exp1'.  It also
5024
                                                 ; evaluates 'exp2' and 'exp1' and saves all these together with
5025
                                                 ; the text pointer, etc. in the 'FOR' save area, which consists of
5026
                                                 ; 'LOPVAR', 'LOPINC', 'LOPLMT', 'LOPLN', and 'LOPPT'.  If there is
5027
                                                 ; already something in the save area (indicated by a non-zero
5028
                                                 ; 'LOPVAR'), then the old save area is saved on the stack before
5029
                                                 ; the new values are stored.  The interpreter will then dig in the
5030
                                                 ; stack and find out if this same variable was used in another
5031
                                                 ; currently active 'FOR' loop.  If that is the case, then the old
5032
                                                 ; 'FOR' loop is deactivated. (i.e. purged from the stack)
5033
                                                 ;******************************************************************
5034
                                                 ;
5035 46 robfinch
FFFFFFFFFFFFE594                                 FOR:
5036
FFFFFFFFFFFFE594        31FFFC80                        call    PUSHA           ; save the old 'FOR' save area
5037
FFFFFFFFFFFFE598        31FFFBDA                        call    SETVAL          ; set the control variable
5038
FFFFFFFFFFFFE59C        660090A8                        sw              r1,LOPVAR       ; save its address
5039
FFFFFFFFFFFFE5A0        9A04E16F                        lea             r9,TAB5
5040
FFFFFFFFFFFFE5A4        9A0562A0                        lea             r10,TAB5_1; use 'EXEC' to test for 'TO'
5041
FFFFFFFFFFFFE5A8        33FFF8C8                        jmp             EXEC
5042
FFFFFFFFFFFFE5AC                                 FR1:
5043
FFFFFFFFFFFFE5AC        31FFFA7C                        call    OREXPR          ; evaluate the limit
5044
FFFFFFFFFFFFE5B0        660090B8                        sw              r1,LOPLMT       ; save that
5045
FFFFFFFFFFFFE5B4        9A04E172                        lea             r9,TAB6
5046
FFFFFFFFFFFFE5B8        9A0562B0                        lea             r10,TAB6_1      ; use 'EXEC' to test for the word 'STEP
5047
FFFFFFFFFFFFE5BC        33FFF8C8                        jmp             EXEC
5048
FFFFFFFFFFFFE5C0                                 FR2:
5049
FFFFFFFFFFFFE5C0        31FFFA7C                        call    OREXPR          ; found it, get the step value
5050
FFFFFFFFFFFFE5C4        BE00004A                        bra             FR4
5051
FFFFFFFFFFFFE5C8                                 FR3:
5052
FFFFFFFFFFFFE5C8        E0400001                        setlo   r1,#1           ; not found, step defaults to 1
5053
FFFFFFFFFFFFE5CC                                 FR4:
5054
FFFFFFFFFFFFE5CC        660090B0                        sw              r1,LOPINC       ; save that too
5055
FFFFFFFFFFFFE5D0                                 FR5:
5056
FFFFFFFFFFFFE5D0        46011090                        lw              r2,CURRNT
5057
FFFFFFFFFFFFE5D4        660110C0                        sw              r2,LOPLN        ; save address of current line number
5058
FFFFFFFFFFFFE5D8        660410C8                        sw              r8,LOPPT        ; and text pointer
5059
FFFFFFFFFFFFE5DC        05E00C09                        lw              r3,sp           ; dig into the stack to find 'LOPVAR'
5060
FFFFFFFFFFFFE5E0        460310A8                        lw              r6,LOPVAR
5061
FFFFFFFFFFFFE5E4        BE00004A                        bra             FR7
5062
FFFFFFFFFFFFE5E8                                 FR6:
5063
FFFFFFFFFFFFE5E8        0A318028                        addui   r3,r3,#40       ; look at next stack frame
5064
FFFFFFFFFFFFE5EC                                 FR7:
5065
FFFFFFFFFFFFE5EC        46310000                        lw              r2,[r3]         ; is it zero?
5066
FFFFFFFFFFFFE5F0        BE2000E8                        beq             r2,r0,FR8       ; if so, we're done
5067
FFFFFFFFFFFFE5F4        BE237FA9                        bne             r2,r6,FR6       ; same as current LOPVAR? nope, look some more
5068 43 robfinch
 
5069 46 robfinch
FFFFFFFFFFFFE5F8        04300409                     lw      r1,r3       ; Else remove 5 long words from...
5070
FFFFFFFFFFFFE5FC        0A310028                        addui   r2,r3,#40   ; inside the stack.
5071
FFFFFFFFFFFFE600        05E00C09                        lw              r3,sp
5072
FFFFFFFFFFFFE604        31FFFC71                        call    MVDOWN
5073
FFFFFFFFFFFFE608        09EF0028                        add             sp,sp,#40       ; set the SP 5 long words up
5074
FFFFFFFFFFFFE60C                                 FR8:
5075
FFFFFFFFFFFFE60C        BE00786A                     bra            FINISH              ; and continue execution
5076 43 robfinch
 
5077
 
5078
                                                 ;******************************************************************
5079
                                                 ; 'NEXT var' serves as the logical (not necessarily physical) end
5080
                                                 ; of the 'FOR' loop.  The control variable 'var' is checked with
5081
                                                 ; the 'LOPVAR'.  If they are not the same, the interpreter digs in
5082
                                                 ; the stack to find the right one and purges all those that didn't
5083
                                                 ; match.  Either way, it then adds the 'STEP' to that variable and
5084
                                                 ; checks the result with against the limit value.  If it is within
5085
                                                 ; the limit, control loops back to the command following the
5086
                                                 ; 'FOR'.  If it's outside the limit, the save area is purged and
5087
                                                 ; execution continues.
5088
                                                 ;******************************************************************
5089
                                                 ;
5090 46 robfinch
FFFFFFFFFFFFE610                                 NEXT:
5091
FFFFFFFFFFFFE610        E0400000                        setlo   r1,#0           ; don't allocate it
5092
FFFFFFFFFFFFE614        31FFFB2E                        call    TSTV            ; get address of variable
5093
FFFFFFFFFFFFE618        BE100069                        bne             r1,r0,NX4
5094
FFFFFFFFFFFFE61C        9A00F80F                        lea             r1,msgNextVar
5095
FFFFFFFFFFFFE620        BE00504A                        bra             ERROR           ; if no variable, say "What?"
5096
FFFFFFFFFFFFE624                                 NX4:
5097
FFFFFFFFFFFFE624        02148009                        mov             r9,r1           ; save variable's address
5098
FFFFFFFFFFFFE628                                 NX0:
5099
FFFFFFFFFFFFE628        460090A8                        lw              r1,LOPVAR       ; If 'LOPVAR' is zero, we never...
5100
FFFFFFFFFFFFE62C        BE100069                        bne             r1,r0,NX5   ; had a FOR loop
5101
FFFFFFFFFFFFE630        9A00F7FC                        lea             r1,msgNextFor
5102
FFFFFFFFFFFFE634        BE004FAA                        bra             ERROR
5103
FFFFFFFFFFFFE638                                 NX5:
5104
FFFFFFFFFFFFE638        BE148068                        beq             r1,r9,NX2       ; else we check them OK, they agree
5105
FFFFFFFFFFFFE63C        31FFFC73                        call    POPA            ; nope, let's see the next frame
5106
FFFFFFFFFFFFE640        BE007F4A                        bra             NX0
5107
FFFFFFFFFFFFE644                                 NX2:
5108
FFFFFFFFFFFFE644        46908000                        lw              r1,[r9]         ; get control variable's value
5109
FFFFFFFFFFFFE648        460110B0                        lw              r2,LOPINC
5110
FFFFFFFFFFFFE64C        04110403                        addu    r1,r1,r2        ; add in loop increment
5111 43 robfinch
                                                 ;      BVS.L   QHOW            say "How?" for 32-bit overflow
5112 46 robfinch
FFFFFFFFFFFFE650        66908000                        sw              r1,[r9]         ; save control variable's new value
5113
FFFFFFFFFFFFE654        460190B8                        lw              r3,LOPLMT       ; get loop's limit value
5114
FFFFFFFFFFFFE658        BE200063                        bgt             r2,r0,NX1       ; check loop increment, branch if loop increment is positive
5115
FFFFFFFFFFFFE65C        BE1180E0                        blt             r1,r3,NXPurge   ; test against limit
5116
FFFFFFFFFFFFE660        BE00004A                        bra     NX3
5117
FFFFFFFFFFFFE664                                 NX1:
5118
FFFFFFFFFFFFE664        BE1180A3                        bgt             r1,r3,NXPurge
5119
FFFFFFFFFFFFE668                                 NX3:
5120
FFFFFFFFFFFFE668        460410C0                        lw              r8,LOPLN        ; Within limit, go back to the...
5121
FFFFFFFFFFFFE66C        66041090                        sw              r8,CURRNT
5122
FFFFFFFFFFFFE670        460410C8                        lw              r8,LOPPT        ; saved 'CURRNT' and text pointer.
5123
FFFFFFFFFFFFE674        BE00752A                        bra             FINISH
5124
FFFFFFFFFFFFE678                                 NXPurge:
5125
FFFFFFFFFFFFE678        31FFFC73                     call    POPA        ; purge this loop
5126
FFFFFFFFFFFFE67C        BE0074EA                     bra     FINISH
5127 43 robfinch
 
5128
 
5129
                                                 ;******************************************************************
5130
                                                 ; *** REM *** IF *** INPUT *** LET (& DEFLT) ***
5131
                                                 ;
5132
                                                 ; 'REM' can be followed by anything and is ignored by the
5133
                                                 ; interpreter.
5134
                                                 ;
5135
                                                 ;REM
5136
                                                 ;    br            IF2             ; skip the rest of the line
5137
                                                 ; 'IF' is followed by an expression, as a condition and one or
5138
                                                 ; more commands (including other 'IF's) separated by colons.
5139
                                                 ; Note that the word 'THEN' is not used.  The interpreter evaluates
5140
                                                 ; the expression.  If it is non-zero, execution continues.  If it
5141
                                                 ; is zero, the commands that follow are ignored and execution
5142
                                                 ; continues on the next line.
5143
                                                 ;******************************************************************
5144
                                                 ;
5145 46 robfinch
FFFFFFFFFFFFE680                                 IF:
5146
FFFFFFFFFFFFE680        31FFFA7C                     call       OREXPR          ; evaluate the expression
5147
FFFFFFFFFFFFE684                                 IF1:
5148
FFFFFFFFFFFFE684        BE106AC9                     bne            r1,r0,RUNSML                ; is it zero? if not, continue
5149
FFFFFFFFFFFFE688                                 IF2:
5150
FFFFFFFFFFFFE688        02848009                     mov                r9,r8           ; set lookup pointer
5151
FFFFFFFFFFFFE68C        E0400000                        setlo   r1,#0           ; find line #0 (impossible)
5152
FFFFFFFFFFFFE690        31FFFC63                        call    FNDSKP          ; if so, skip the rest of the line
5153
FFFFFFFFFFFFE694        BE104B83                        bgt             r1,r0,WSTART    ; if no next line, do a warm start
5154
FFFFFFFFFFFFE698                                 IF3:
5155
FFFFFFFFFFFFE698        BE0069EA                        bra             RUNTSL          ; run the next line
5156 43 robfinch
 
5157
 
5158
                                                 ;******************************************************************
5159
                                                 ; INPUT is called first and establishes a stack frame
5160 46 robfinch
FFFFFFFFFFFFE69C                                 INPERR:
5161
FFFFFFFFFFFFE69C        460F10A0                        lw              sp,STKINP       ; restore the old stack pointer
5162
FFFFFFFFFFFFE6A0        47E40010                        lw              r8,16[sp]
5163
FFFFFFFFFFFFE6A4        66041090                        sw              r8,CURRNT       ; and old 'CURRNT'
5164
FFFFFFFFFFFFE6A8        47E40008                        lw              r8,8[sp]        ; and old text pointer
5165
FFFFFFFFFFFFE6AC        0BEF0028                        addui   sp,sp,#40       ; fall through will subtract 40
5166 43 robfinch
 
5167
                                                 ; 'INPUT' is like the 'PRINT' command, and is followed by a list
5168
                                                 ; of items.  If the item is a string in single or double quotes,
5169
                                                 ; or is an underline (back arrow), it has the same effect as in
5170
                                                 ; 'PRINT'.  If an item is a variable, this variable name is
5171
                                                 ; printed out followed by a colon, then the interpreter waits for
5172
                                                 ; an expression to be typed in.  The variable is then set to the
5173
                                                 ; value of this expression.  If the variable is preceeded by a
5174
                                                 ; string (again in single or double quotes), the string will be
5175
                                                 ; displayed followed by a colon.  The interpreter the waits for an
5176
                                                 ; expression to be entered and sets the variable equal to the
5177
                                                 ; expression's value.  If the input expression is invalid, the
5178
                                                 ; interpreter will print "What?", "How?", or "Sorry" and reprint
5179
                                                 ; the prompt and redo the input.  The execution will not terminate
5180
                                                 ; unless you press control-C.  This is handled in 'INPERR'.
5181
                                                 ;
5182 46 robfinch
FFFFFFFFFFFFE6B0                                 INPUT:
5183
FFFFFFFFFFFFE6B0        0FEF0028                        subui   sp,sp,#40       ; allocate stack frame
5184
FFFFFFFFFFFFE6B4        67E28020                        sw      r5,32[sp]
5185
FFFFFFFFFFFFE6B8                                 IP6:
5186
FFFFFFFFFFFFE6B8        67E40000                        sw              r8,[sp]         ; save in case of error
5187
FFFFFFFFFFFFE6BC        31FFFCA9                        call    QTSTG           ; is next item a string?
5188
FFFFFFFFFFFFE6C0        BE0000CA                        bra             IP2                     ; nope - this branch must take only two bytes
5189
FFFFFFFFFFFFE6C4        E0400001                        setlo   r1,#1           ; allocate var
5190
FFFFFFFFFFFFE6C8        31FFFB2E                        call    TSTV            ; yes, but is it followed by a variable?
5191
FFFFFFFFFFFFE6CC        BE1003E8                        beq     r1,r0,IP4   ; if not, brnch
5192
FFFFFFFFFFFFE6D0        02150009                        mov             r10,r1          ; put away the variable's address
5193
FFFFFFFFFFFFE6D4        BE0001AA                        bra             IP3                     ; if so, input to variable
5194
FFFFFFFFFFFFE6D8                                 IP2:
5195
FFFFFFFFFFFFE6D8        67E40008                        sw              r8,8[sp]        ; save for 'PRTSTG'
5196
FFFFFFFFFFFFE6DC        E0400001                        setlo   r1,#1
5197
FFFFFFFFFFFFE6E0        31FFFB2E                        call    TSTV            ; must be a variable now
5198
FFFFFFFFFFFFE6E4        BE100069                        bne             r1,r0,IP7
5199
FFFFFFFFFFFFE6E8        9A00F7DF                        lea             r1,msgInputVar
5200
FFFFFFFFFFFFE6EC        BE0049EA                        bra             ERROR           ; "What?" it isn't?
5201
FFFFFFFFFFFFE6F0                                 IP7:
5202
FFFFFFFFFFFFE6F0        02150009                        mov             r10,r1          ; put away the variable's address
5203
FFFFFFFFFFFFE6F4        40828000                        lb              r5,[r8]         ; get ready for 'PRTSTG' by null terminating
5204
FFFFFFFFFFFFE6F8        60800000                        sb              r0,[r8]
5205
FFFFFFFFFFFFE6FC        47E08008                        lw              r1,8[sp]        ; get back text pointer
5206
FFFFFFFFFFFFE700        31FFFC93                        call    PRTSTG          ; print string as prompt
5207
FFFFFFFFFFFFE704        60828000                        sb              r5,[r8]         ; un-null terminate
5208
FFFFFFFFFFFFE708                                 IP3
5209
FFFFFFFFFFFFE708        67E40008                        sw              r8,8[sp]        ; save in case of error
5210
FFFFFFFFFFFFE70C        46009090                        lw              r1,CURRNT
5211
FFFFFFFFFFFFE710        67E08010                        sw              r1,16[sp]       ; also save 'CURRNT'
5212
FFFFFFFFFFFFE714        E07FFFFF                        setlo   r1,#-1
5213
FFFFFFFFFFFFE718        66009090                        sw              r1,CURRNT       ; flag that we are in INPUT
5214
FFFFFFFFFFFFE71C        660F10A0                        sw              sp,STKINP       ; save the stack pointer too
5215
FFFFFFFFFFFFE720        67E50018                        sw              r10,24[sp]      ; save the variable address
5216
FFFFFFFFFFFFE724        E040003A                        setlo   r1,#':'         ; print a colon first
5217
FFFFFFFFFFFFE728        31FFFC1A                        call    GETLN           ; then get an input line
5218
FFFFFFFFFFFFE72C        9A04111B                        lea             r8,BUFFER       ; point to the buffer
5219
FFFFFFFFFFFFE730        31FFFA7C                        call    OREXPR          ; evaluate the input
5220
FFFFFFFFFFFFE734        47E50018                        lw              r10,24[sp]      ; restore the variable address
5221
FFFFFFFFFFFFE738        66A08000                        sw              r1,[r10]        ; save value in variable
5222
FFFFFFFFFFFFE73C        47E08010                        lw              r1,16[sp]       ; restore old 'CURRNT'
5223
FFFFFFFFFFFFE740        66009090                        sw              r1,CURRNT
5224
FFFFFFFFFFFFE744        47E40008                        lw              r8,8[sp]        ; and the old text pointer
5225
FFFFFFFFFFFFE748                                 IP4:
5226
FFFFFFFFFFFFE748        E0C0002C                        setlo   r3,#','
5227
FFFFFFFFFFFFE74C        9A026758                        lea             r4,IP5          ; is the next thing a comma?
5228
FFFFFFFFFFFFE750        31FFFD30                        call    TSTC
5229
FFFFFFFFFFFFE754        BE007B2A                        bra             IP6                     ; yes, more items
5230
FFFFFFFFFFFFE758                                 IP5:
5231
FFFFFFFFFFFFE758        47E28020                     lw      r5,32[sp]
5232
FFFFFFFFFFFFE75C        09EF0028                        add             sp,sp,#40       ; clean up the stack
5233
FFFFFFFFFFFFE760        33FFF946                        jmp             FINISH
5234 43 robfinch
 
5235
 
5236 46 robfinch
FFFFFFFFFFFFE764                                 DEFLT:
5237
FFFFFFFFFFFFE764        40808000                     lb      r1,[r8]
5238
FFFFFFFFFFFFE768        B01F6C0D                        beq         r1,#CR,FINISH           ; empty line is OK else it is 'LET'
5239 43 robfinch
 
5240
 
5241
                                                 ;******************************************************************
5242
                                                 ; 'LET' is followed by a list of items separated by commas.
5243
                                                 ; Each item consists of a variable, an equals sign, and an
5244
                                                 ; expression.  The interpreter evaluates the expression and sets
5245
                                                 ; the variable to that value.  The interpreter will also handle
5246
                                                 ; 'LET' commands without the word 'LET'.  This is done by 'DEFLT'.
5247
                                                 ;******************************************************************
5248
                                                 ;
5249 46 robfinch
FFFFFFFFFFFFE76C                                 LET:
5250
FFFFFFFFFFFFE76C        31FFFBDA                     call       SETVAL          ; do the assignment
5251
FFFFFFFFFFFFE770        E0C0002C                     setlo      r3,#','
5252
FFFFFFFFFFFFE774        9A026518                     lea                r4,FINISH
5253
FFFFFFFFFFFFE778        31FFFD30                        call    TSTC            ; check for more 'LET' items
5254
FFFFFFFFFFFFE77C        BE007F8A                        bra         LET
5255
FFFFFFFFFFFFE780                                 LT1:
5256
FFFFFFFFFFFFE780        BE006CCA                     bra            FINISH              ; until we are finished.
5257 43 robfinch
 
5258
 
5259
                                                 ;******************************************************************
5260
                                                 ; *** LOAD *** & SAVE ***
5261
                                                 ;
5262
                                                 ; These two commands transfer a program to/from an auxiliary
5263
                                                 ; device such as a cassette, another computer, etc.  The program
5264
                                                 ; is converted to an easily-stored format: each line starts with
5265
                                                 ; a colon, the line no. as 4 hex digits, and the rest of the line.
5266
                                                 ; At the end, a line starting with an '@' sign is sent.  This
5267
                                                 ; format can be read back with a minimum of processing time by
5268
                                                 ; the Butterfly.
5269
                                                 ;******************************************************************
5270
                                                 ;
5271 46 robfinch
FFFFFFFFFFFFE784                                 LOAD
5272
FFFFFFFFFFFFE784        46045F68                        lw              r8,TXTBGN       ; set pointer to start of prog. area
5273
FFFFFFFFFFFFE788        E040000D                        setlo   r1,#CR          ; For a CP/M host, tell it we're ready...
5274
FFFFFFFFFFFFE78C        31FFF7D7                        call    GOAUXO          ; by sending a CR to finish PIP command.
5275
FFFFFFFFFFFFE790                                 LOD1:
5276
FFFFFFFFFFFFE790        31FFF7D8                        call    GOAUXI          ; look for start of line
5277
FFFFFFFFFFFFE794        BE107FE2                        ble             r1,r0,LOD1
5278
FFFFFFFFFFFFE798        B0100E40                        beq             r1,#'@',LODEND  ; end of program?
5279
FFFFFFFFFFFFE79C        B0100D1A                        beq     r1,#0x1A,LODEND ; or EOF marker
5280
FFFFFFFFFFFFE7A0        B21FFC3A                        bne             r1,#':',LOD1    ; if not, is it start of line? if not, wait for it
5281
FFFFFFFFFFFFE7A4        31FFF9F6                        call    GCHAR           ; get line number
5282
FFFFFFFFFFFFE7A8        60808000                        sb              r1,[r8]         ; store it
5283
FFFFFFFFFFFFE7AC        06109001                        shrui   r1,r1,#8
5284
FFFFFFFFFFFFE7B0        60808001                        sb              r1,1[r8]
5285
FFFFFFFFFFFFE7B4        0A840002                        addui   r8,r8,#2
5286
FFFFFFFFFFFFE7B8                                 LOD2:
5287
FFFFFFFFFFFFE7B8        31FFF7D8                        call    GOAUXI          ; get another text char.
5288
FFFFFFFFFFFFE7BC        BE107FE2                        ble             r1,r0,LOD2
5289
FFFFFFFFFFFFE7C0        60808000                        sb              r1,[r8]
5290
FFFFFFFFFFFFE7C4        0A840001                        addui   r8,r8,#1        ; store it
5291
FFFFFFFFFFFFE7C8        B21FFC0D                        bne             r1,#CR,LOD2             ; is it the end of the line? if not, go back for more
5292
FFFFFFFFFFFFE7CC        BE007E2A                        bra             LOD1            ; if so, start a new line
5293
FFFFFFFFFFFFE7D0                                 LODEND:
5294
FFFFFFFFFFFFE7D0        660410D0                        sw              r8,TXTUNF       ; set end-of program pointer
5295
FFFFFFFFFFFFE7D4        BE00418A                        bra             WSTART          ; back to direct mode
5296 43 robfinch
 
5297
 
5298
                                                 ; get character from input (16 bit value)
5299 46 robfinch
FFFFFFFFFFFFE7D8                                 GCHAR:
5300
FFFFFFFFFFFFE7D8        0FEF0018                        subui   sp,sp,#24
5301
FFFFFFFFFFFFE7DC        67E28000                        sw              r5,[sp]
5302
FFFFFFFFFFFFE7E0        67E30008                        sw              r6,8[sp]
5303
FFFFFFFFFFFFE7E4        67EF8010                        sw              lr,16[sp]
5304
FFFFFFFFFFFFE7E8        E1800003                        setlo   r6,#3       ; repeat four times
5305
FFFFFFFFFFFFE7EC        E1400000                        setlo   r5,#0
5306
FFFFFFFFFFFFE7F0                                 GCHAR1:
5307
FFFFFFFFFFFFE7F0        31FFF7D8                        call    GOAUXI          ; get a char
5308
FFFFFFFFFFFFE7F4        BE107FE2                        ble             r1,r0,GCHAR1
5309
FFFFFFFFFFFFE7F8        31FFFA07                        call    asciiToHex
5310
FFFFFFFFFFFFE7FC        06528800                        shli    r5,r5,#4
5311
FFFFFFFFFFFFE800        04509409                        or              r5,r5,r1
5312
FFFFFFFFFFFFE804        BE037F6F                        loop    r6,GCHAR1
5313
FFFFFFFFFFFFE808        02508009                        mov             r1,r5
5314
FFFFFFFFFFFFE80C        47EF8010                        lw              lr,16[sp]
5315
FFFFFFFFFFFFE810        47E30008                        lw              r6,8[sp]
5316
FFFFFFFFFFFFE814        47E28000                        lw              r5,[sp]
5317
FFFFFFFFFFFFE818        37EF8018                        ret             #24
5318 43 robfinch
 
5319
 
5320
                                                 ; convert an ascii char to hex code
5321
                                                 ; input
5322
                                                 ;      r1 = char to convert
5323
 
5324 46 robfinch
FFFFFFFFFFFFE81C                                 asciiToHex:
5325
FFFFFFFFFFFFE81C        A4100239                        blei    r1,#'9',a2h1    ; less than '9'
5326
FFFFFFFFFFFFE820        0E108007                        subui   r1,r1,#7        ; shift 'A' to '9'+1
5327
FFFFFFFFFFFFE824                                 a2h1:
5328
FFFFFFFFFFFFE824        0E108030                        subui   r1,r1,#'0'      ;
5329
FFFFFFFFFFFFE828        1410800F                        andi    r1,r1,#15       ; make sure a nybble
5330
FFFFFFFFFFFFE82C        37EF8000                        ret
5331 43 robfinch
 
5332
 
5333
 
5334 46 robfinch
FFFFFFFFFFFFE830                                 SAVE:
5335
FFFFFFFFFFFFE830        46045F68                        lw              r8,TXTBGN       ;set pointer to start of prog. area
5336
FFFFFFFFFFFFE834        460490D0                        lw              r9,TXTUNF       ;set pointer to end of prog. area
5337
FFFFFFFFFFFFE838                                 SAVE1:
5338
FFFFFFFFFFFFE838        31FFFA23                        call    AUXOCRLF    ; send out a CR & LF (CP/M likes this)
5339
FFFFFFFFFFFFE83C        BE8481C5                        bgeu    r8,r9,SAVEND    ; are we finished?
5340
FFFFFFFFFFFFE840        E040003A                        setlo   r1,#':'         ; if not, start a line
5341
FFFFFFFFFFFFE844        31FFF7D7                        call    GOAUXO
5342
FFFFFFFFFFFFE848        4A808000                        lbu             r1,[r8]         ; get line number
5343
FFFFFFFFFFFFE84C        4A810001                        lbu             r2,1[r8]
5344
FFFFFFFFFFFFE850        06211000                        shli    r2,r2,#8
5345
FFFFFFFFFFFFE854        04110409                        or              r1,r1,r2
5346
FFFFFFFFFFFFE858        0A840002                        addui   r8,r8,#2
5347
FFFFFFFFFFFFE85C        31FFFA2B                        call    PWORD       ; output line number as 4-digit hex
5348
FFFFFFFFFFFFE860                                 SAVE2:
5349
FFFFFFFFFFFFE860        40808000                        lb              r1,[r8]         ; get a text char.
5350
FFFFFFFFFFFFE864        0A840001                        addui   r8,r8,#1
5351
FFFFFFFFFFFFE868        B01FF40D                        beqi    r1,#CR,SAVE1            ; is it the end of the line? if so, send CR & LF and start new line
5352
FFFFFFFFFFFFE86C        31FFF7D7                        call    GOAUXO          ; send it out
5353
FFFFFFFFFFFFE870        BE007F8A                        bra             SAVE2           ; go back for more text
5354
FFFFFFFFFFFFE874                                 SAVEND:
5355
FFFFFFFFFFFFE874        E0400040                        setlo   r1,#'@'         ; send end-of-program indicator
5356
FFFFFFFFFFFFE878        31FFF7D7                        call    GOAUXO
5357
FFFFFFFFFFFFE87C        31FFFA23                        call    AUXOCRLF    ; followed by a CR & LF
5358
FFFFFFFFFFFFE880        E040001A                        setlo   r1,#0x1A        ; and a control-Z to end the CP/M file
5359
FFFFFFFFFFFFE884        31FFF7D7                        call    GOAUXO
5360
FFFFFFFFFFFFE888        BE003BEA                        bra             WSTART          ; then go do a warm start
5361 43 robfinch
 
5362
 
5363
                                                 ; output a CR LF sequence to auxillary output
5364
                                                 ; Registers Affected
5365
                                                 ;   r3 = LF
5366 46 robfinch
FFFFFFFFFFFFE88C                                 AUXOCRLF:
5367
FFFFFFFFFFFFE88C        0FEF0008                     subui   sp,sp,#8
5368
FFFFFFFFFFFFE890        67EF8000                     sw      lr,[sp]
5369
FFFFFFFFFFFFE894        E040000D                     setlo   r1,#CR
5370
FFFFFFFFFFFFE898        31FFF7D7                     call    GOAUXO
5371
FFFFFFFFFFFFE89C        E040000A                     setlo   r1,#LF
5372
FFFFFFFFFFFFE8A0        31FFF7D7                     call    GOAUXO
5373
FFFFFFFFFFFFE8A4        47EF8000                     lw      lr,[sp]
5374
FFFFFFFFFFFFE8A8        37EF8008                     ret                #8
5375 43 robfinch
 
5376
 
5377
                                                 ; output a word in hex format
5378
                                                 ; tricky because of the need to reverse the order of the chars
5379 46 robfinch
FFFFFFFFFFFFE8AC                                 PWORD:
5380
FFFFFFFFFFFFE8AC        0DEF0010                        sub             sp,sp,#16
5381
FFFFFFFFFFFFE8B0        67EF8000                        sw              lr,[sp]
5382
FFFFFFFFFFFFE8B4        67E28008                        sw              r5,8[sp]
5383
FFFFFFFFFFFFE8B8        9A02910F                        lea             r5,NUMWKA+15
5384
FFFFFFFFFFFFE8BC        02120009                        mov             r4,r1           ; r4 = value
5385
FFFFFFFFFFFFE8C0                                 pword1:
5386
FFFFFFFFFFFFE8C0        02408009                     mov     r1,r4          ; r1 = value
5387
FFFFFFFFFFFFE8C4        06420801                     shrui      r4,r4,#4        ; shift over to next nybble
5388
FFFFFFFFFFFFE8C8        31FFFA3F                     call    toAsciiHex  ; convert LS nybble to ascii hex
5389
FFFFFFFFFFFFE8CC        60508000                     sb      r1,[r5]     ; save in work area
5390
FFFFFFFFFFFFE8D0        0E528001                     subui   r5,r5,#1
5391
FFFFFFFFFFFFE8D4        12509100                     cmpui   r1,r5,#NUMWKA
5392
FFFFFFFFFFFFE8D8        BE107F41                     bge     r1,r0,pword1
5393
FFFFFFFFFFFFE8DC                                 pword2:
5394
FFFFFFFFFFFFE8DC        0A528001                     addui   r5,r5,#1
5395
FFFFFFFFFFFFE8E0        40508000                     lb      r1,[r5]     ; get char to output
5396
FFFFFFFFFFFFE8E4        31FFF7D7                        call    GOAUXO          ; send it
5397
FFFFFFFFFFFFE8E8        1250910F                        cmpui   r1,r5,#NUMWKA+15
5398
FFFFFFFFFFFFE8EC        BE107F80                        blt     r1,r0,pword2
5399
FFFFFFFFFFFFE8F0        47E28008                        lw              r5,8[sp]
5400
FFFFFFFFFFFFE8F4        47EF8000                        lw              lr,[sp]
5401
FFFFFFFFFFFFE8F8        37EF8010                        ret             #16
5402 43 robfinch
 
5403
 
5404
                                                 ; convert nybble in r2 to ascii hex char2
5405
                                                 ; r2 = character to convert
5406
 
5407 46 robfinch
FFFFFFFFFFFFE8FC                                 toAsciiHex:
5408
FFFFFFFFFFFFE8FC        1410800F                        andi    r1,r1,#15       ; make sure it's a nybble
5409
FFFFFFFFFFFFE900        A010020A                        blti    r1,#10,tah1     ; > 10 ?
5410
FFFFFFFFFFFFE904        08108007                        addi    r1,r1,#7        ; bump it up to the letter 'A'
5411
FFFFFFFFFFFFE908                                 tah1:
5412
FFFFFFFFFFFFE908        0A108030                        addui   r1,r1,#'0'      ; bump up to ascii '0'
5413
FFFFFFFFFFFFE90C        37EF8000                        ret
5414 43 robfinch
 
5415
 
5416
 
5417
                                                 ;******************************************************************
5418
                                                 ; *** POKE *** & SYSX ***
5419
                                                 ;
5420
                                                 ; 'POKE expr1,expr2' stores the byte from 'expr2' into the memory
5421
                                                 ; address specified by 'expr1'.
5422
                                                 ;
5423
                                                 ; 'SYSX expr' jumps to the machine language subroutine whose
5424
                                                 ; starting address is specified by 'expr'.  The subroutine can use
5425
                                                 ; all registers but must leave the stack the way it found it.
5426
                                                 ; The subroutine returns to the interpreter by executing an RET.
5427
                                                 ;******************************************************************
5428
                                                 ;
5429 46 robfinch
FFFFFFFFFFFFE910                                 POKE:
5430
FFFFFFFFFFFFE910        0FEF0008                        subui   sp,sp,#8
5431
FFFFFFFFFFFFE914        31FFFA7C                        call    OREXPR          ; get the memory address
5432
FFFFFFFFFFFFE918        E0C0002C                        setlo   r3,#','
5433
FFFFFFFFFFFFE91C        9A02693C                        lea             r4,PKER         ; it must be followed by a comma
5434
FFFFFFFFFFFFE920        31FFFD30                        call    TSTC            ; it must be followed by a comma
5435
FFFFFFFFFFFFE924        67E08000                        sw              r1,[sp]     ; save the address
5436
FFFFFFFFFFFFE928        31FFFA7C                        call    OREXPR          ; get the byte to be POKE'd
5437
FFFFFFFFFFFFE92C        47E10000                        lw              r2,[sp]     ; get the address back
5438
FFFFFFFFFFFFE930        60208000                        sb              r1,[r2]         ; store the byte in memory
5439
FFFFFFFFFFFFE934        0BEF0008                        addui   sp,sp,#8
5440
FFFFFFFFFFFFE938        BE005F0A                        bra             FINISH
5441
FFFFFFFFFFFFE93C                                 PKER:
5442
FFFFFFFFFFFFE93C        9A00F778                        lea             r1,msgComma
5443
FFFFFFFFFFFFE940        BE00374A                        bra             ERROR           ; if no comma, say "What?"
5444 43 robfinch
 
5445 46 robfinch
FFFFFFFFFFFFE944                                 POKEC:
5446
FFFFFFFFFFFFE944        0FEF0008                        subui   sp,sp,#8
5447
FFFFFFFFFFFFE948        31FFFA7C                        call    OREXPR          ; get the memory address
5448
FFFFFFFFFFFFE94C        E0C0002C                        setlo   r3,#','
5449
FFFFFFFFFFFFE950        9A02693C                        lea             r4,PKER         ; it must be followed by a comma
5450
FFFFFFFFFFFFE954        31FFFD30                        call    TSTC            ; it must be followed by a comma
5451
FFFFFFFFFFFFE958        67E08000                        sw              r1,[sp]     ; save the address
5452
FFFFFFFFFFFFE95C        31FFFA7C                        call    OREXPR          ; get the byte to be POKE'd
5453
FFFFFFFFFFFFE960        47E10000                        lw              r2,[sp]     ; get the address back
5454
FFFFFFFFFFFFE964        62208000                        sc              r1,[r2]         ; store the char in memory
5455
FFFFFFFFFFFFE968        0BEF0008                        addui   sp,sp,#8
5456
FFFFFFFFFFFFE96C        33FFF946                        jmp             FINISH
5457 43 robfinch
 
5458 46 robfinch
FFFFFFFFFFFFE970                                 POKEH:
5459
FFFFFFFFFFFFE970        0FEF0008                        subui   sp,sp,#8
5460
FFFFFFFFFFFFE974        31FFFA7C                        call    OREXPR          ; get the memory address
5461
FFFFFFFFFFFFE978        E0C0002C                        setlo   r3,#','
5462
FFFFFFFFFFFFE97C        9A02693C                        lea             r4,PKER         ; it must be followed by a comma
5463
FFFFFFFFFFFFE980        31FFFD30                        call    TSTC
5464
FFFFFFFFFFFFE984        67E08000                        sw              r1,[sp]     ; save the address
5465
FFFFFFFFFFFFE988        31FFFA7C                        call    OREXPR          ; get the byte to be POKE'd
5466
FFFFFFFFFFFFE98C        47E10000                        lw              r2,[sp]     ; get the address back
5467
FFFFFFFFFFFFE990        64208000                        sh              r1,[r2]         ; store the word in memory
5468
FFFFFFFFFFFFE994        0BEF0008                        addui   sp,sp,#8
5469
FFFFFFFFFFFFE998        33FFF946                        jmp             FINISH
5470 43 robfinch
 
5471 46 robfinch
FFFFFFFFFFFFE99C                                 POKEW:
5472
FFFFFFFFFFFFE99C        0FEF0008                        subui   sp,sp,#8
5473
FFFFFFFFFFFFE9A0        31FFFA7C                        call    OREXPR          ; get the memory address
5474
FFFFFFFFFFFFE9A4        E0C0002C                        setlo   r3,#','
5475
FFFFFFFFFFFFE9A8        9A02693C                        lea             r4,PKER         ; it must be followed by a comma
5476
FFFFFFFFFFFFE9AC        31FFFD30                        call    TSTC
5477
FFFFFFFFFFFFE9B0        67E08000                        sw              r1,[sp]     ; save the address
5478
FFFFFFFFFFFFE9B4        31FFFA7C                        call    OREXPR          ; get the word to be POKE'd
5479
FFFFFFFFFFFFE9B8        47E10000                        lw              r2,[sp]     ; get the address back
5480
FFFFFFFFFFFFE9BC        66208000                        sw              r1,[r2]         ; store the word in memory
5481
FFFFFFFFFFFFE9C0        0BEF0008                        addui   sp,sp,#8
5482
FFFFFFFFFFFFE9C4        33FFF946                        jmp             FINISH
5483 43 robfinch
 
5484 46 robfinch
FFFFFFFFFFFFE9C8                                 SYSX:
5485
FFFFFFFFFFFFE9C8        0FEF0008                        subui   sp,sp,#8
5486
FFFFFFFFFFFFE9CC        31FFFA7C                        call    OREXPR          ; get the subroutine's address
5487
FFFFFFFFFFFFE9D0        BE100069                        bne             r1,r0,sysx1     ; make sure we got a valid address
5488
FFFFFFFFFFFFE9D4        9A00F7CD                        lea             r1,msgSYSBad
5489
FFFFFFFFFFFFE9D8        BE00328A                        bra             ERROR
5490
FFFFFFFFFFFFE9DC                                 sysx1:
5491
FFFFFFFFFFFFE9DC        67E40000                        sw              r8,[sp]     ; save the text pointer
5492
FFFFFFFFFFFFE9E0        341F8000                        jal             r31,[r1]        ; jump to the subroutine
5493
FFFFFFFFFFFFE9E4        47E40000                        lw              r8,[sp]     ; restore the text pointer
5494
FFFFFFFFFFFFE9E8        0BEF0008                        addui   sp,sp,#8
5495
FFFFFFFFFFFFE9EC        BE00596A                        bra             FINISH
5496 43 robfinch
 
5497
                                                 ;******************************************************************
5498
                                                 ; *** EXPR ***
5499
                                                 ;
5500
                                                 ; 'EXPR' evaluates arithmetical or logical expressions.
5501
                                                 ; ::=  OR  ...
5502
                                                 ; ::= AND  ...
5503
                                                 ; ::=
5504
                                                 ;         
5505
                                                 ; where  is one of the operators in TAB8 and the result
5506
                                                 ; of these operations is 1 if true and 0 if false.
5507
                                                 ; ::=(+ or -)(+ or -)(...
5508
                                                 ; where () are optional and (... are optional repeats.
5509
                                                 ; ::=( <* or /> )(...
5510
                                                 ; ::=
5511
                                                 ;          
5512
                                                 ;          ()
5513
                                                 ;  is recursive so that the variable '@' can have an 
5514
                                                 ; as an index, functions can have an  as arguments, and
5515
                                                 ;  can be an  in parenthesis.
5516
                                                 ;
5517
 
5518
                                                 ; ::= OR  ...
5519
                                                 ;
5520 46 robfinch
FFFFFFFFFFFFE9F0                                 OREXPR:
5521
FFFFFFFFFFFFE9F0        0FEF0010                        subui   sp,sp,#16
5522
FFFFFFFFFFFFE9F4        67EF8000                        sw              lr,[sp]
5523
FFFFFFFFFFFFE9F8        31FFFA8A                        call    ANDEXPR         ; get first 
5524
FFFFFFFFFFFFE9FC                                 XP_OR1:
5525
FFFFFFFFFFFFE9FC        67E08004                        sw              r1,4[sp]        ; save  value
5526
FFFFFFFFFFFFEA00        9A04E185                        lea             r9,TAB10        ; look up a logical operator
5527
FFFFFFFFFFFFEA04        9A056308                        lea             r10,TAB10_1
5528
FFFFFFFFFFFFEA08        33FFF8C8                        jmp             EXEC            ; go do it
5529
FFFFFFFFFFFFEA0C                                 XP_OR:
5530
FFFFFFFFFFFFEA0C        31FFFA8A                     call    ANDEXPR
5531
FFFFFFFFFFFFEA10        47E10008                     lw      r2,8[sp]
5532
FFFFFFFFFFFFEA14        04110409                     or      r1,r1,r2
5533
FFFFFFFFFFFFEA18        BE007F2A                     bra     XP_OR1
5534
FFFFFFFFFFFFEA1C                                 XP_ORX:
5535
FFFFFFFFFFFFEA1C        47E08008                        lw              r1,8[sp]
5536
FFFFFFFFFFFFEA20        47EF8000                     lw      lr,[sp]
5537
FFFFFFFFFFFFEA24        37EF8010                     ret                #16
5538 43 robfinch
 
5539
 
5540
                                                 ; ::= AND  ...
5541
                                                 ;
5542 46 robfinch
FFFFFFFFFFFFEA28                                 ANDEXPR:
5543
FFFFFFFFFFFFEA28        0FEF0010                        subui   sp,sp,#16
5544
FFFFFFFFFFFFEA2C        67EF8000                        sw              lr,[sp]
5545
FFFFFFFFFFFFEA30        31FFFAAF                        call    EXPR            ; get first 
5546
FFFFFFFFFFFFEA34                                 XP_AND1:
5547
FFFFFFFFFFFFEA34        67E08008                        sw              r1,8[sp]        ; save  value
5548
FFFFFFFFFFFFEA38        9A04E181                        lea             r9,TAB9         ; look up a logical operator
5549
FFFFFFFFFFFFEA3C        9A0562F8                        lea             r10,TAB9_1
5550
FFFFFFFFFFFFEA40        33FFF8C8                        jmp             EXEC            ; go do it
5551
FFFFFFFFFFFFEA44                                 XP_AND:
5552
FFFFFFFFFFFFEA44        31FFFAAF                     call    EXPR
5553
FFFFFFFFFFFFEA48        47E10008                     lw      r2,8[sp]
5554
FFFFFFFFFFFFEA4C        04110408                     and     r1,r1,r2
5555
FFFFFFFFFFFFEA50        BE007F2A                     bra     XP_AND1
5556
FFFFFFFFFFFFEA54                                 XP_ANDX:
5557
FFFFFFFFFFFFEA54        47E08008                        lw              r1,8[sp]
5558
FFFFFFFFFFFFEA58        47EF8000                     lw      lr,[sp]
5559
FFFFFFFFFFFFEA5C        37EF8010                     ret                #16
5560 43 robfinch
 
5561
 
5562
                                                 ; Determine if the character is a digit
5563
                                                 ;   Parameters
5564
                                                 ;       r1 = char to test
5565
                                                 ;   Returns
5566
                                                 ;       r1 = 1 if digit, otherwise 0
5567
                                                 ;
5568 46 robfinch
FFFFFFFFFFFFEA60                                 isDigit:
5569
FFFFFFFFFFFFEA60        A0100430                     blt     r1,#'0',isDigitFalse
5570
FFFFFFFFFFFFEA64        A6100339                     bgt     r1,#'9',isDigitFalse
5571
FFFFFFFFFFFFEA68        E0400001                     setlo   r1,#1
5572
FFFFFFFFFFFFEA6C        37EF8000                     ret
5573
FFFFFFFFFFFFEA70                                 isDigitFalse:
5574
FFFFFFFFFFFFEA70        E0400000                     setlo   r1,#0
5575
FFFFFFFFFFFFEA74        37EF8000                     ret
5576 43 robfinch
 
5577
 
5578
                                                 ; Determine if the character is a alphabetic
5579
                                                 ;   Parameters
5580
                                                 ;       r1 = char to test
5581
                                                 ;   Returns
5582
                                                 ;       r1 = 1 if alpha, otherwise 0
5583
                                                 ;
5584 46 robfinch
FFFFFFFFFFFFEA78                                 isAlpha:
5585
FFFFFFFFFFFFEA78        A0100641                     blt     r1,#'A',isAlphaFalse
5586
FFFFFFFFFFFFEA7C        A410035A                     ble     r1,#'Z',isAlphaTrue
5587
FFFFFFFFFFFFEA80        A0100461                     blt     r1,#'a',isAlphaFalse
5588
FFFFFFFFFFFFEA84        A610037A                     bgt     r1,#'z',isAlphaFalse
5589
FFFFFFFFFFFFEA88                                 isAlphaTrue:
5590
FFFFFFFFFFFFEA88        E0400001                     setlo   r1,#1
5591
FFFFFFFFFFFFEA8C        37EF8000                     ret
5592
FFFFFFFFFFFFEA90                                 isAlphaFalse:
5593
FFFFFFFFFFFFEA90        E0400000                     setlo   r1,#0
5594
FFFFFFFFFFFFEA94        37EF8000                     ret
5595 43 robfinch
 
5596
 
5597
                                                 ; Determine if the character is a alphanumeric
5598
                                                 ;   Parameters
5599
                                                 ;       r1 = char to test
5600
                                                 ;   Returns
5601
                                                 ;       r1 = 1 if alpha, otherwise 0
5602
                                                 ;
5603 46 robfinch
FFFFFFFFFFFFEA98                                 isAlnum:
5604
FFFFFFFFFFFFEA98        0FEF0008                     subui   sp,sp,#8
5605
FFFFFFFFFFFFEA9C        67EF8000                     sw      lr,[sp]
5606
FFFFFFFFFFFFEAA0        04100809                     or      r2,r1,r0           ; save test char
5607
FFFFFFFFFFFFEAA4        31FFFA98                     call    isDigit
5608
FFFFFFFFFFFFEAA8        BE100069                     bne                r1,r0,isDigitx  ; if it is a digit
5609
FFFFFFFFFFFFEAAC        04200409                     or      r1,r2,r0           ; get back test char
5610
FFFFFFFFFFFFEAB0        31FFFA9E                     call    isAlpha
5611
FFFFFFFFFFFFEAB4                                 isDigitx:
5612
FFFFFFFFFFFFEAB4        47EF8000                     lw      lr,[sp]
5613
FFFFFFFFFFFFEAB8        37EF8008                     ret                #8
5614 43 robfinch
 
5615
 
5616 46 robfinch
FFFFFFFFFFFFEABC                                 EXPR:
5617
FFFFFFFFFFFFEABC        0FEF0010                        subui   sp,sp,#16
5618
FFFFFFFFFFFFEAC0        67EF8000                        sw              lr,[sp]
5619
FFFFFFFFFFFFEAC4        31FFFADE                        call    EXPR2
5620
FFFFFFFFFFFFEAC8        67E08008                        sw              r1,8[sp]        ; save  value
5621
FFFFFFFFFFFFEACC        9A04E177                        lea             r9,TAB8         ; look up a relational operator
5622
FFFFFFFFFFFFEAD0        9A0562C0                        lea             r10,TAB8_1
5623
FFFFFFFFFFFFEAD4        33FFF8C8                        jmp             EXEC            ; go do it
5624
FFFFFFFFFFFFEAD8                                 XP11:
5625
FFFFFFFFFFFFEAD8        47E08008                        lw              r1,8[sp]
5626
FFFFFFFFFFFFEADC        31FFFAD7                        call    XP18    ; is it ">="?
5627
FFFFFFFFFFFFEAE0        BE208321                        bge             r2,r1,XPRT1     ; no, return r2=1
5628
FFFFFFFFFFFFEAE4        BE0002AA                        bra             XPRT0   ; else return r2=0
5629
FFFFFFFFFFFFEAE8                                 XP12:
5630
FFFFFFFFFFFFEAE8        47E08008                        lw              r1,8[sp]
5631
FFFFFFFFFFFFEAEC        31FFFAD7                        call    XP18    ; is it "<>"?
5632
FFFFFFFFFFFFEAF0        BE2082A9                        bne             r2,r1,XPRT1     ; no, return r2=1
5633
FFFFFFFFFFFFEAF4        BE00022A                        bra             XPRT0   ; else return r2=0
5634
FFFFFFFFFFFFEAF8                                 XP13:
5635
FFFFFFFFFFFFEAF8        47E08008                        lw              r1,8[sp]
5636
FFFFFFFFFFFFEAFC        31FFFAD7                        call    XP18    ; is it ">"?
5637
FFFFFFFFFFFFEB00        BE208223                        bgt             r2,r1,XPRT1     ; no, return r2=1
5638
FFFFFFFFFFFFEB04        BE0001AA                        bra             XPRT0   ; else return r2=0
5639
FFFFFFFFFFFFEB08                                 XP14:
5640
FFFFFFFFFFFFEB08        47E08008                        lw              r1,8[sp]
5641
FFFFFFFFFFFFEB0C        31FFFAD7                        call    XP18    ; is it "<="?
5642
FFFFFFFFFFFFEB10        BE2081A2                        ble             r2,r1,XPRT1     ; no, return r2=1
5643
FFFFFFFFFFFFEB14        BE00012A                        bra             XPRT0   ; else return r2=0
5644
FFFFFFFFFFFFEB18                                 XP15:
5645
FFFFFFFFFFFFEB18        47E08008                        lw              r1,8[sp]
5646
FFFFFFFFFFFFEB1C        31FFFAD7                        call    XP18    ; is it "="?
5647
FFFFFFFFFFFFEB20        BE208128                        beq             r2,r1,XPRT1     ; if not, return r2=1
5648
FFFFFFFFFFFFEB24        BE0000AA                        bra             XPRT0   ; else return r2=0
5649
FFFFFFFFFFFFEB28                                 XP16:
5650
FFFFFFFFFFFFEB28        47E08008                        lw              r1,8[sp]
5651
FFFFFFFFFFFFEB2C        31FFFAD7                        call    XP18    ; is it "<"?
5652
FFFFFFFFFFFFEB30        BE2080A0                        blt             r2,r1,XPRT1     ; if not, return r2=1
5653
FFFFFFFFFFFFEB34        BE00002A                        bra             XPRT0   ; else return r2=0
5654
FFFFFFFFFFFFEB38                                 XPRT0:
5655
FFFFFFFFFFFFEB38        47EF8000                        lw              lr,[sp]
5656
FFFFFFFFFFFFEB3C        E0400000                        setlo   r1,#0   ; return r1=0 (false)
5657
FFFFFFFFFFFFEB40        37EF8010                        ret             #16
5658
FFFFFFFFFFFFEB44                                 XPRT1:
5659
FFFFFFFFFFFFEB44        47EF8000                        lw              lr,[sp]
5660
FFFFFFFFFFFFEB48        E0400001                        setlo   r1,#1   ; return r1=1 (true)
5661
FFFFFFFFFFFFEB4C        37EF8010                        ret             #16
5662 43 robfinch
 
5663 46 robfinch
FFFFFFFFFFFFEB50                                 XP17:                          ; it's not a rel. operator
5664
FFFFFFFFFFFFEB50        47E08008                        lw              r1,8[sp]        ; return r2=
5665
FFFFFFFFFFFFEB54        47EF8000                        lw              lr,[sp]
5666
FFFFFFFFFFFFEB58        37EF8010                        ret             #16
5667 43 robfinch
 
5668 46 robfinch
FFFFFFFFFFFFEB5C                                 XP18:
5669
FFFFFFFFFFFFEB5C        0FEF0010                        subui   sp,sp,#16
5670
FFFFFFFFFFFFEB60        67EF8000                        sw              lr,[sp]
5671
FFFFFFFFFFFFEB64        67E08008                        sw              r1,8[sp]
5672
FFFFFFFFFFFFEB68        31FFFADE                        call    EXPR2           ; do a second 
5673
FFFFFFFFFFFFEB6C        47E10008                        lw              r2,8[sp]
5674
FFFFFFFFFFFFEB70        47EF8000                        lw              lr,[sp]
5675
FFFFFFFFFFFFEB74        37EF8010                        ret             #16
5676 43 robfinch
 
5677
                                                 ; ::=(+ or -)(+ or -)(...
5678
 
5679 46 robfinch
FFFFFFFFFFFFEB78                                 EXPR2:
5680
FFFFFFFFFFFFEB78        0FEF0010                        subui   sp,sp,#16
5681
FFFFFFFFFFFFEB7C        67EF8000                        sw              lr,[sp]
5682
FFFFFFFFFFFFEB80        E0C0002D                        setlo   r3,#'-'
5683
FFFFFFFFFFFFEB84        9A026B98                        lea             r4,XP21
5684
FFFFFFFFFFFFEB88        31FFFD30                        call    TSTC            ; negative sign?
5685
FFFFFFFFFFFFEB8C        E0400000                        setlo   r1,#0           ; yes, fake '0-'
5686
FFFFFFFFFFFFEB90        67E00008                        sw              r0,8[sp]
5687
FFFFFFFFFFFFEB94        BE00020A                        bra             XP26
5688
FFFFFFFFFFFFEB98                                 XP21:
5689
FFFFFFFFFFFFEB98        E0C0002B                        setlo   r3,#'+'
5690
FFFFFFFFFFFFEB9C        9A026BA4                        lea             r4,XP22
5691
FFFFFFFFFFFFEBA0        31FFFD30                        call    TSTC            ; positive sign? ignore it
5692
FFFFFFFFFFFFEBA4                                 XP22:
5693
FFFFFFFFFFFFEBA4        31FFFAFB                        call    EXPR3           ; first 
5694
FFFFFFFFFFFFEBA8                                 XP23:
5695
FFFFFFFFFFFFEBA8        67E08008                        sw              r1,8[sp]        ; yes, save the value
5696
FFFFFFFFFFFFEBAC        E0C0002B                        setlo   r3,#'+'
5697
FFFFFFFFFFFFEBB0        9A026BC8                        lea             r4,XP25
5698
FFFFFFFFFFFFEBB4        31FFFD30                        call    TSTC            ; add?
5699
FFFFFFFFFFFFEBB8        31FFFAFB                        call    EXPR3           ; get the second 
5700
FFFFFFFFFFFFEBBC                                 XP24:
5701
FFFFFFFFFFFFEBBC        47E10008                        lw              r2,8[sp]
5702
FFFFFFFFFFFFEBC0        04110402                        add             r1,r1,r2        ; add it to the first 
5703 43 robfinch
                                                 ;      BVS.L   QHOW            brnch if there's an overflow
5704 46 robfinch
FFFFFFFFFFFFEBC4        BE007F2A                        bra             XP23            ; else go back for more operations
5705
FFFFFFFFFFFFEBC8                                 XP25:
5706
FFFFFFFFFFFFEBC8        E0C0002D                        setlo   r3,#'-'
5707
FFFFFFFFFFFFEBCC        9A026BE0                        lea             r4,XP45
5708
FFFFFFFFFFFFEBD0        31FFFD30                        call    TSTC            ; subtract?
5709
FFFFFFFFFFFFEBD4                                 XP26:
5710
FFFFFFFFFFFFEBD4        31FFFAFB                        call    EXPR3           ; get second 
5711
FFFFFFFFFFFFEBD8        02108006                        neg             r1,r1           ; change its sign
5712
FFFFFFFFFFFFEBDC        BE007F0A                        bra             XP24            ; and do an addition
5713
FFFFFFFFFFFFEBE0                                 XP45:
5714
FFFFFFFFFFFFEBE0        47E08008                        lw              r1,8[sp]
5715
FFFFFFFFFFFFEBE4        47EF8000                        lw              lr,[sp]
5716
FFFFFFFFFFFFEBE8        37EF8010                        ret             #16
5717 43 robfinch
 
5718
 
5719
                                                 ; ::=( <* or /> )(...
5720
 
5721 46 robfinch
FFFFFFFFFFFFEBEC                                 EXPR3:
5722
FFFFFFFFFFFFEBEC        0FEF0010                        subui   sp,sp,#16
5723
FFFFFFFFFFFFEBF0        67EF8000                        sw              lr,[sp]
5724
FFFFFFFFFFFFEBF4        31FFFB11                        call    EXPR4           ; get first 
5725
FFFFFFFFFFFFEBF8                                 XP31:
5726
FFFFFFFFFFFFEBF8        67E08008                        sw              r1,8[sp]        ; yes, save that first result
5727
FFFFFFFFFFFFEBFC        E0C0002A                        setlo   r3,#'*'
5728
FFFFFFFFFFFFEC00        9A026C18                        lea             r4,XP34
5729
FFFFFFFFFFFFEC04        31FFFD30                        call    TSTC            ; multiply?
5730
FFFFFFFFFFFFEC08        31FFFB11                        call    EXPR4           ; get second 
5731
FFFFFFFFFFFFEC0C        47E10008                        lw              r2,8[sp]
5732
FFFFFFFFFFFFEC10        04110419                        muls    r1,r1,r2        ; multiply the two
5733
FFFFFFFFFFFFEC14        BE007F2A                        bra             XP31        ; then look for more terms
5734
FFFFFFFFFFFFEC18                                 XP34:
5735
FFFFFFFFFFFFEC18        E0C0002F                        setlo   r3,#'/'
5736
FFFFFFFFFFFFEC1C        9A026C38                        lea             r4,XP47
5737
FFFFFFFFFFFFEC20        31FFFD30                        call    TSTC            ; divide?
5738
FFFFFFFFFFFFEC24        31FFFB11                        call    EXPR4           ; get second 
5739
FFFFFFFFFFFFEC28        04100809                        or      r2,r1,r0
5740
FFFFFFFFFFFFEC2C        47E08008                        lw              r1,8[sp]
5741
FFFFFFFFFFFFEC30        0411041B                        divs    r1,r1,r2        ; do the division
5742
FFFFFFFFFFFFEC34        BE007E2A                        bra             XP31            ; go back for any more terms
5743
FFFFFFFFFFFFEC38                                 XP47:
5744
FFFFFFFFFFFFEC38        47E08008                        lw              r1,8[sp]
5745
FFFFFFFFFFFFEC3C        47EF8000                        lw              lr,[sp]
5746
FFFFFFFFFFFFEC40        37EF8010                        ret             #16
5747 43 robfinch
 
5748
 
5749
                                                 ; Functions are called through EXPR4
5750
                                                 ; ::=
5751
                                                 ;          
5752
                                                 ;          ()
5753
 
5754 46 robfinch
FFFFFFFFFFFFEC44                                 EXPR4:
5755
FFFFFFFFFFFFEC44        0FEF0018                     subui   sp,sp,#24
5756
FFFFFFFFFFFFEC48        67EF8000                     sw      lr,[sp]
5757
FFFFFFFFFFFFEC4C        9A04E14E                     lea                r9,TAB4         ; find possible function
5758
FFFFFFFFFFFFEC50        9A056258                     lea                r10,TAB4_1
5759
FFFFFFFFFFFFEC54        33FFF8C8                        jmp             EXEC        ; branch to function which does subsequent ret for EXPR4
5760
FFFFFFFFFFFFEC58                                 XP40:                   ; we get here if it wasn't a function
5761
FFFFFFFFFFFFEC58        E0400000                        setlo   r1,#0
5762
FFFFFFFFFFFFEC5C        31FFFB2E                        call    TSTV
5763
FFFFFFFFFFFFEC60        BE100088                        beq     r1,r0,XP41  ; nor a variable
5764
FFFFFFFFFFFFEC64        46108000                        lw              r1,[r1]         ; if a variable, return its value in r1
5765
FFFFFFFFFFFFEC68        47EF8000                        lw      lr,[sp]
5766
FFFFFFFFFFFFEC6C        37EF8018                        ret             #24
5767
FFFFFFFFFFFFEC70                                 XP41:
5768
FFFFFFFFFFFFEC70        31FFFD3E                        call    TSTNUM          ; or is it a number?
5769
FFFFFFFFFFFFEC74        BE200049                        bne             r2,r0,XP46      ; (if not, # of digits will be zero) if so, return it in r1
5770
FFFFFFFFFFFFEC78        31FFFB21                        call    PARN        ; check for (EXPR)
5771
FFFFFFFFFFFFEC7C                                 XP46:
5772
FFFFFFFFFFFFEC7C        47EF8000                        lw      lr,[sp]
5773
FFFFFFFFFFFFEC80        37EF8018                        ret             #24
5774 43 robfinch
 
5775
 
5776
                                                 ; Check for a parenthesized expression
5777 46 robfinch
FFFFFFFFFFFFEC84                                 PARN:
5778
FFFFFFFFFFFFEC84        0FEF0008                        subui   sp,sp,#8
5779
FFFFFFFFFFFFEC88        67EF8000                        sw              lr,[sp]
5780
FFFFFFFFFFFFEC8C        E0C00028                        setlo   r3,#'('
5781
FFFFFFFFFFFFEC90        9A026CB0                        lea             r4,XP43
5782
FFFFFFFFFFFFEC94        31FFFD30                        call    TSTC            ; else look for ( OREXPR )
5783
FFFFFFFFFFFFEC98        31FFFA7C                        call    OREXPR
5784
FFFFFFFFFFFFEC9C        E0C00029                        setlo   r3,#')'
5785
FFFFFFFFFFFFECA0        9A026CB0                        lea             r4,XP43
5786
FFFFFFFFFFFFECA4        31FFFD30                        call    TSTC
5787
FFFFFFFFFFFFECA8                                 XP42:
5788
FFFFFFFFFFFFECA8        47EF8000                        lw              lr,[sp]
5789
FFFFFFFFFFFFECAC        37EF8008                        ret             #8
5790
FFFFFFFFFFFFECB0                                 XP43:
5791
FFFFFFFFFFFFECB0        9A00F6F5                        lea             r1,msgWhat
5792
FFFFFFFFFFFFECB4        BE001BAA                        bra             ERROR
5793 43 robfinch
 
5794
 
5795
                                                 ; ===== Test for a valid variable name.  Returns Z=1 if not
5796
                                                 ;      found, else returns Z=0 and the address of the
5797
                                                 ;      variable in r1.
5798
                                                 ; Parameters
5799
                                                 ;      r1 = 1 = allocate if not found
5800
                                                 ; Returns
5801
                                                 ;      r1 = address of variable, zero if not found
5802
 
5803 46 robfinch
FFFFFFFFFFFFECB8                                 TSTV:
5804
FFFFFFFFFFFFECB8        0FEF0018                        subui   sp,sp,#24
5805
FFFFFFFFFFFFECBC        67EF8000                        sw              lr,[sp]
5806
FFFFFFFFFFFFECC0        67E28008                        sw              r5,8[sp]
5807
FFFFFFFFFFFFECC4        04101409                        or              r5,r1,r0        ; allocate flag
5808
FFFFFFFFFFFFECC8        31FFFD55                        call    IGNBLK
5809
FFFFFFFFFFFFECCC        4A808000                        lbu             r1,[r8]         ; look at the program text
5810
FFFFFFFFFFFFECD0        A0101740                        blt     r1,#'@',tstv_notfound   ; C=1: not a variable
5811
FFFFFFFFFFFFECD4        B2100F40                        bne             r1,#'@',TV1     ; brnch if not "@" array
5812
FFFFFFFFFFFFECD8        0A840001                        addui   r8,r8,#1        ; If it is, it should be
5813
FFFFFFFFFFFFECDC        31FFFB21                        call    PARN            ; followed by (EXPR) as its index.
5814
FFFFFFFFFFFFECE0        06108600                        shli    r1,r1,#3
5815 43 robfinch
                                                 ;      BCS.L   QHOW            say "How?" if index is too big
5816 46 robfinch
FFFFFFFFFFFFECE4        0FEF0018                        subui   sp,sp,#24
5817
FFFFFFFFFFFFECE8        67E08008                     sw      r1,8[sp]    ; save the index
5818
FFFFFFFFFFFFECEC        67EF8000                     sw         lr,[sp]
5819
FFFFFFFFFFFFECF0        31FFFBD5                        call    SIZEX           ; get amount of free memory
5820
FFFFFFFFFFFFECF4        47EF8000                        lw              lr,[sp]
5821
FFFFFFFFFFFFECF8        47E10008                        lw      r2,8[sp]    ; get back the index
5822
FFFFFFFFFFFFECFC        BE208044                        bltu    r2,r1,TV2       ; see if there's enough memory
5823
FFFFFFFFFFFFED00        33FFFC07                        jmp     QSORRY          ; if not, say "Sorry"
5824
FFFFFFFFFFFFED04                                 TV2:
5825
FFFFFFFFFFFFED04        9A0090D8                        lea             r1,VARBGN   ; put address of array element...
5826
FFFFFFFFFFFFED08        04110405                        subu    r1,r1,r2       ; into r1 (neg. offset is used)
5827
FFFFFFFFFFFFED0C        BE0000AA                        bra     TSTVRT
5828
FFFFFFFFFFFFED10                                 TV1:
5829
FFFFFFFFFFFFED10        31FFFB4F                     call    getVarName      ; get variable name
5830
FFFFFFFFFFFFED14        BE100068                     beq     r1,r0,TSTVRT    ; if not, return r1=0
5831
FFFFFFFFFFFFED18        02510009                     mov                r2,r5
5832
FFFFFFFFFFFFED1C        31FFFB75                     call    findVar     ; find or allocate
5833
FFFFFFFFFFFFED20                                 TSTVRT:
5834
FFFFFFFFFFFFED20        47E28008                        lw              r5,8[sp]
5835
FFFFFFFFFFFFED24        47EF8000                        lw              lr,[sp]
5836
FFFFFFFFFFFFED28        37EF8018                        ret             #24                     ; r1<>0 (found)
5837
FFFFFFFFFFFFED2C                                 tstv_notfound:
5838
FFFFFFFFFFFFED2C        47E28008                        lw              r5,8[sp]
5839
FFFFFFFFFFFFED30        47EF8000                     lw      lr,[sp]
5840
FFFFFFFFFFFFED34        E0400000                     setlo   r1,#0       ; r1=0 if not found
5841
FFFFFFFFFFFFED38        37EF8018                     ret                #24
5842 43 robfinch
 
5843
 
5844
                                                 ; Returns
5845
                                                 ;   r1 = 6 character variable name + type
5846
                                                 ;
5847 46 robfinch
FFFFFFFFFFFFED3C                                 getVarName:
5848
FFFFFFFFFFFFED3C        0FEF0018                     subui   sp,sp,#24
5849
FFFFFFFFFFFFED40        67EF8000                     sw      lr,[sp]
5850
FFFFFFFFFFFFED44        67E28010                     sw         r5,16[sp]
5851 43 robfinch
 
5852 46 robfinch
FFFFFFFFFFFFED48        40808000                     lb      r1,[r8]     ; get first character
5853
FFFFFFFFFFFFED4C        67E08008                     sw         r1,8[sp]        ; save off current name
5854
FFFFFFFFFFFFED50        31FFFA9E                     call    isAlpha
5855
FFFFFFFFFFFFED54        BE100388                     beq     r1,r0,gvn1
5856
FFFFFFFFFFFFED58        E1400005                     setlo   r5,#5       ; loop six more times
5857 43 robfinch
 
5858
                                                        ; check for second/third character
5859 46 robfinch
FFFFFFFFFFFFED5C                                 gvn4:
5860
FFFFFFFFFFFFED5C        0A840001                        addui   r8,r8,#1
5861
FFFFFFFFFFFFED60        40808000                        lb      r1,[r8]     ; do we have another char ?
5862
FFFFFFFFFFFFED64        31FFFAA6                        call    isAlnum
5863
FFFFFFFFFFFFED68        BE100168                        beq     r1,r0,gvn2  ; nope
5864
FFFFFFFFFFFFED6C        47E08008                        lw      r1,8[sp]    ; get varname
5865
FFFFFFFFFFFFED70        06109000                        shli    r1,r1,#8
5866
FFFFFFFFFFFFED74        40810000                        lb      r2,[r8]
5867
FFFFFFFFFFFFED78        04110409                        or      r1,r1,r2   ; add in new char
5868
FFFFFFFFFFFFED7C        67E08008                     sw      r1,8[sp]   ; save off name again
5869
FFFFFFFFFFFFED80        BE02FEEF                     loop       r5,gvn4
5870 43 robfinch
 
5871
                                                     ; now ignore extra variable name characters
5872 46 robfinch
FFFFFFFFFFFFED84                                 gvn6:
5873
FFFFFFFFFFFFED84        0A840001                     addui   r8,r8,#1
5874
FFFFFFFFFFFFED88        40808000                     lb      r1,[r8]
5875
FFFFFFFFFFFFED8C        31FFFAA6                     call    isAlnum
5876
FFFFFFFFFFFFED90        BE107FA9                     bne     r1,r0,gvn6 ; keep looping as long as we have identifier chars
5877 43 robfinch
 
5878
                                                     ; check for a variable type
5879 46 robfinch
FFFFFFFFFFFFED94                                 gvn2:
5880
FFFFFFFFFFFFED94        40808000                        lb              r1,[r8]
5881
FFFFFFFFFFFFED98        B0100425                     beq     r1,#'%',gvn3
5882
FFFFFFFFFFFFED9C        B0100324                     beq     r1,#'$',gvn3
5883
FFFFFFFFFFFFEDA0        E0400000                     setlo   r1,#0
5884
FFFFFFFFFFFFEDA4        0E840001                     subui   r8,r8,#1
5885 43 robfinch
 
5886
                                                     ; insert variable type indicator and return
5887 46 robfinch
FFFFFFFFFFFFEDA8                                 gvn3:
5888
FFFFFFFFFFFFEDA8        0A840001                     addui   r8,r8,#1
5889
FFFFFFFFFFFFEDAC        47E10008                     lw      r2,8[sp]
5890
FFFFFFFFFFFFEDB0        06211000                     shli       r2,r2,#8
5891
FFFFFFFFFFFFEDB4        04110409                     or      r1,r1,r2    ; add in variable type
5892
FFFFFFFFFFFFEDB8        47EF8000                     lw      lr,[sp]
5893
FFFFFFFFFFFFEDBC        47E28010                     lw         r5,16[sp]
5894
FFFFFFFFFFFFEDC0        37EF8018                     ret                #24                     ; return Z = 0, r1 = varname
5895 43 robfinch
 
5896
                                                     ; not a variable name
5897 46 robfinch
FFFFFFFFFFFFEDC4                                 gvn1:
5898
FFFFFFFFFFFFEDC4        47EF8000                     lw      lr,[sp]
5899
FFFFFFFFFFFFEDC8        47E28010                     lw         r5,16[sp]
5900
FFFFFFFFFFFFEDCC        E0400000                     setlo   r1,#0       ; return Z = 1 if not a varname
5901
FFFFFFFFFFFFEDD0        37EF8018                     ret                #24
5902 43 robfinch
 
5903
 
5904
                                                 ; Find variable
5905
                                                 ;   r1 = varname
5906
                                                 ;      r2 = allocate flag
5907
                                                 ; Returns
5908
                                                 ;   r1 = variable address, Z =0 if found / allocated, Z=1 if not found
5909
 
5910 46 robfinch
FFFFFFFFFFFFEDD4                                 findVar:
5911
FFFFFFFFFFFFEDD4        0FEF0010                     subui   sp,sp,#16
5912
FFFFFFFFFFFFEDD8        67EF8000                     sw      lr,[sp]
5913
FFFFFFFFFFFFEDDC        67E38008                     sw      r7,8[sp]
5914
FFFFFFFFFFFFEDE0        460190D8                     lw      r3,VARBGN
5915
FFFFFFFFFFFFEDE4                                 fv4:
5916
FFFFFFFFFFFFEDE4        46338000                     lw      r7,[r3]     ; get varname / type
5917
FFFFFFFFFFFFEDE8        BE700108                     beq     r7,r0,fv3   ; no more vars ?
5918
FFFFFFFFFFFFEDEC        BE138128                     beq     r1,r7,fv1  ; match ?
5919
FFFFFFFFFFFFEDF0        08318008                     add     r3,r3,#8    ; move to next var
5920
FFFFFFFFFFFFEDF4        460390F8                     lw      r7,STKBOT
5921
FFFFFFFFFFFFEDF8        BE33FF60                     blt     r3,r7,fv4   ; loop back to look at next var
5922 43 robfinch
 
5923
                                                     ; variable not found
5924
                                                     ; no more memory
5925 46 robfinch
FFFFFFFFFFFFEDFC        E07FF748                     setlo      r1,#
5926
FFFFFFFFFFFFEE00        F04FFFFF                     sethi      r1,#>msgVarSpace
5927
FFFFFFFFFFFFEE04        BE00112A                     bra     ERROR
5928 43 robfinch
                                                 ;    lw      lr,[sp]
5929
                                                 ;    lw      r7,4[sp]
5930
                                                 ;    add     sp,sp,#8
5931
                                                 ;    lw      r1,#0
5932
                                                 ;    ret
5933
 
5934
                                                     ; variable not found
5935
                                                     ; allocate new ?
5936 46 robfinch
FFFFFFFFFFFFEE08                                 fv3:
5937
FFFFFFFFFFFFEE08        BE2000C8                        beq             r2,r0,fv2
5938
FFFFFFFFFFFFEE0C        66308000                     sw      r1,[r3]     ; save varname / type
5939 43 robfinch
                                                     ; found variable
5940
                                                     ; return address
5941 46 robfinch
FFFFFFFFFFFFEE10                                 fv1:
5942
FFFFFFFFFFFFEE10        0A308008                     addui   r1,r3,#8
5943
FFFFFFFFFFFFEE14        47EF8000                     lw      lr,[sp]
5944
FFFFFFFFFFFFEE18        47E38008                     lw      r7,8[sp]
5945
FFFFFFFFFFFFEE1C        37EF8010                     ret                #16    ; Z = 0, r1 = address
5946 43 robfinch
 
5947
                                                     ; didn't find var and not allocating
5948 46 robfinch
FFFFFFFFFFFFEE20                                 fv2:
5949
FFFFFFFFFFFFEE20        47EF8000                     lw      lr,[sp]
5950
FFFFFFFFFFFFEE24        47E38008                     lw      r7,8[sp]
5951
FFFFFFFFFFFFEE28        0BEF0010                     addui   sp,sp,#16   ; Z = 0, r1 = address
5952
FFFFFFFFFFFFEE2C        E0400000                        setlo   r1,#0           ; Z = 1, r1 = 0
5953
FFFFFFFFFFFFEE30        37EF8000                     ret
5954 43 robfinch
 
5955
 
5956
                                                 ; ===== Multiplies the 32 bit values in r1 and r2, returning
5957
                                                 ;      the 32 bit result in r1.
5958
                                                 ;
5959
 
5960
                                                 ; ===== Divide the 32 bit value in r2 by the 32 bit value in r3.
5961
                                                 ;      Returns the 32 bit quotient in r1, remainder in r2
5962
                                                 ;
5963
                                                 ; r2 = a
5964
                                                 ; r3 = b
5965
                                                 ; r6 = remainder
5966
                                                 ; r7 = iteration count
5967
                                                 ; r8 = sign
5968
                                                 ;
5969
 
5970
                                                 ; q = a / b
5971
                                                 ; a = r1
5972
                                                 ; b = r2
5973
                                                 ; q = r2
5974
 
5975
 
5976
                                                 ; ===== The PEEK function returns the byte stored at the address
5977
                                                 ;      contained in the following expression.
5978
                                                 ;
5979 46 robfinch
FFFFFFFFFFFFEE34                                 PEEK:
5980
FFFFFFFFFFFFEE34        31FFFB21                        call    PARN            ; get the memory address
5981
FFFFFFFFFFFFEE38        4A108000                        lbu             r1,[r1]         ; get the addressed byte
5982
FFFFFFFFFFFFEE3C        47EF8000                        lw              lr,[sp]         ; and return it
5983
FFFFFFFFFFFFEE40        37EF8018                        ret             #24
5984 43 robfinch
 
5985
                                                 ; ===== The PEEK function returns the byte stored at the address
5986
                                                 ;      contained in the following expression.
5987
                                                 ;
5988 46 robfinch
FFFFFFFFFFFFEE44                                 PEEKC:
5989
FFFFFFFFFFFFEE44        31FFFB21                        call    PARN            ; get the memory address
5990
FFFFFFFFFFFFEE48        1410FFFE                        andi    r1,r1,#-2       ; align to char address
5991
FFFFFFFFFFFFEE4C        4C108000                        lcu             r1,[r1]         ; get the addressed char
5992
FFFFFFFFFFFFEE50        47EF8000                        lw              lr,[sp]         ; and return it
5993
FFFFFFFFFFFFEE54        37EF8018                        ret             #24
5994 43 robfinch
 
5995
                                                 ; ===== The PEEK function returns the byte stored at the address
5996
                                                 ;      contained in the following expression.
5997
                                                 ;
5998 46 robfinch
FFFFFFFFFFFFEE58                                 PEEKH:
5999
FFFFFFFFFFFFEE58        31FFFB21                        call    PARN            ; get the memory address
6000
FFFFFFFFFFFFEE5C        1410FFFC                        andi    r1,r1,#-4       ; align to half-word address
6001
FFFFFFFFFFFFEE60        4E108000                        lhu             r1,[r1]         ; get the addressed char
6002
FFFFFFFFFFFFEE64        47EF8000                        lw              lr,[sp]         ; and return it
6003
FFFFFFFFFFFFEE68        37EF8018                        ret             #24
6004 43 robfinch
 
6005
                                                 ; ===== The PEEK function returns the byte stored at the address
6006
                                                 ;      contained in the following expression.
6007
                                                 ;
6008 46 robfinch
FFFFFFFFFFFFEE6C                                 PEEKW:
6009
FFFFFFFFFFFFEE6C        31FFFB21                        call    PARN            ; get the memory address
6010
FFFFFFFFFFFFEE70        1410FFF8                        andi    r1,r1,#-8               ; align to word address
6011
FFFFFFFFFFFFEE74        46108000                        lw              r1,[r1]         ; get the addressed word
6012
FFFFFFFFFFFFEE78        47EF8000                        lw              lr,[sp]         ; and return it
6013
FFFFFFFFFFFFEE7C        37EF8018                        ret             #24
6014 43 robfinch
 
6015
                                                 ; user function call
6016
                                                 ; call the user function with argument in r1
6017 46 robfinch
FFFFFFFFFFFFEE80                                 USRX:
6018
FFFFFFFFFFFFEE80        31FFFB21                        call    PARN            ; get expression value
6019
FFFFFFFFFFFFEE84        67E40008                        sw              r8,8[sp]        ; save the text pointer
6020
FFFFFFFFFFFFEE88        46011028                        lw      r2,usrJmp   ; get usr vector
6021
FFFFFFFFFFFFEE8C        342F8000                        jal             r31,[r2]        ; jump to the subroutine
6022
FFFFFFFFFFFFEE90        47E40008                        lw              r8,8[sp]        ; restore the text pointer
6023
FFFFFFFFFFFFEE94        47EF8000                        lw              lr,[sp]
6024
FFFFFFFFFFFFEE98        37EF8018                        ret             #24
6025 43 robfinch
 
6026
 
6027
                                                 ; ===== The RND function returns a random number from 1 to
6028
                                                 ;      the value of the following expression in D0.
6029
                                                 ;
6030 46 robfinch
FFFFFFFFFFFFEE9C                                 RND:
6031
FFFFFFFFFFFFEE9C        31FFFB21                        call    PARN            ; get the upper limit
6032
FFFFFFFFFFFFEEA0        BE100168                        beq             r1,r0,rnd2      ; it must be positive and non-zero
6033
FFFFFFFFFFFFEEA4        BE100100                        blt             r1,r0,rnd1
6034
FFFFFFFFFFFFEEA8        04100809                        lw              r2,r1
6035
FFFFFFFFFFFFEEAC        00000050                        gran                            ; generate a random number
6036
FFFFFFFFFFFFEEB0        020088A8                        mfspr   r1,rand         ; get the number
6037
FFFFFFFFFFFFEEB4        31FFFBB7                        call    modu4           ; RND(n)=MOD(number,n)+1
6038
FFFFFFFFFFFFEEB8        0A108001                        addui   r1,r1,#1
6039
FFFFFFFFFFFFEEBC        47EF8000                        lw              lr,[sp]
6040
FFFFFFFFFFFFEEC0        37EF8018                        ret             #24
6041
FFFFFFFFFFFFEEC4                                 rnd1:
6042
FFFFFFFFFFFFEEC4        9A00F7B9                        lea             r1,msgRNDBad
6043
FFFFFFFFFFFFEEC8        BE000B0A                        bra             ERROR
6044
FFFFFFFFFFFFEECC                                 rnd2:
6045
FFFFFFFFFFFFEECC        00000050                        gran
6046
FFFFFFFFFFFFEED0        020088A8                        mfspr   r1,rand
6047
FFFFFFFFFFFFEED4        47EF8000                        lw              lr,[sp]
6048
FFFFFFFFFFFFEED8        37EF8018                        ret             #24
6049 43 robfinch
 
6050
 
6051
                                                 ; r = a mod b
6052
                                                 ; a = r1
6053
                                                 ; b = r2
6054
                                                 ; r = r6
6055 46 robfinch
FFFFFFFFFFFFEEDC                                 modu4:
6056
FFFFFFFFFFFFEEDC        0FEF0020                        subui   sp,sp,#32
6057
FFFFFFFFFFFFEEE0        67E18000                        sw              r3,[sp]
6058
FFFFFFFFFFFFEEE4        67E28008                        sw              r5,8[sp]
6059
FFFFFFFFFFFFEEE8        67E30010                        sw              r6,16[sp]
6060
FFFFFFFFFFFFEEEC        67E38018                        sw              r7,24[sp]
6061
FFFFFFFFFFFFEEF0        1603803F                        lw      r7,#63          ; n = 64
6062
FFFFFFFFFFFFEEF4        0452940A                        xor             r5,r5,r5        ; w = 0
6063
FFFFFFFFFFFFEEF8        0463180A                        xor             r6,r6,r6        ; r = 0
6064
FFFFFFFFFFFFEEFC                                 mod2:
6065
FFFFFFFFFFFFEEFC        06108202                        roli    r1,r1,#1        ; a <<= 1
6066
FFFFFFFFFFFFEF00        14118001                        andi    r3,r1,#1
6067
FFFFFFFFFFFFEF04        06630200                        shli    r6,r6,#1        ; r <<= 1
6068
FFFFFFFFFFFFEF08        04619809                        or              r6,r6,r3
6069
FFFFFFFFFFFFEF0C        1410FFFE                        andi    r1,r1,#-2
6070
FFFFFFFFFFFFEF10        BE230047                        bgtu    r2,r6,mod1      ; b < r ?
6071
FFFFFFFFFFFFEF14        04611805                        subu    r6,r6,r2        ; r -= b
6072
FFFFFFFFFFFFEF18                                 mod1:
6073
FFFFFFFFFFFFEF18        BE03FF2F                     loop       r7,mod2         ; n--
6074
FFFFFFFFFFFFEF1C        02608009                        mov             r1,r6
6075
FFFFFFFFFFFFEF20        47E18000                        lw              r3,[sp]
6076
FFFFFFFFFFFFEF24        47E28008                        lw              r5,8[sp]
6077
FFFFFFFFFFFFEF28        47E30010                        lw              r6,16[sp]
6078
FFFFFFFFFFFFEF2C        47E38018                        lw              r7,24[sp]
6079
FFFFFFFFFFFFEF30        37EF8020                        ret             #32
6080 43 robfinch
 
6081
 
6082
                                                 ; ===== The ABS function returns an absolute value in r2.
6083
                                                 ;
6084 46 robfinch
FFFFFFFFFFFFEF34                                 ABS:
6085
FFFFFFFFFFFFEF34        31FFFB21                        call    PARN            ; get the following expr.'s value
6086
FFFFFFFFFFFFEF38        02108007                        abs             r1,r1
6087
FFFFFFFFFFFFEF3C        47EF8000                        lw              lr,[sp]
6088
FFFFFFFFFFFFEF40        37EF8018                        ret             #24
6089 43 robfinch
 
6090
                                                 ; ===== The SGN function returns the sign in r1. +1,0, or -1
6091
                                                 ;
6092 46 robfinch
FFFFFFFFFFFFEF44                                 SGN:
6093
FFFFFFFFFFFFEF44        31FFFB21                        call    PARN            ; get the following expr.'s value
6094
FFFFFFFFFFFFEF48        02108008                        sgn             r1,r1
6095
FFFFFFFFFFFFEF4C        47EF8000                        lw              lr,[sp]
6096
FFFFFFFFFFFFEF50        37EF8018                        ret             #24
6097 43 robfinch
 
6098
                                                 ; ===== The SIZE function returns the size of free memory in r1.
6099
                                                 ;
6100 46 robfinch
FFFFFFFFFFFFEF54                                 SIZEX:
6101
FFFFFFFFFFFFEF54        460090D8                        lw              r1,VARBGN       ; get the number of free bytes...
6102
FFFFFFFFFFFFEF58        460110D0                        lw              r2,TXTUNF       ; between 'TXTUNF' and 'VARBGN'
6103
FFFFFFFFFFFFEF5C        04110405                        subu    r1,r1,r2
6104
FFFFFFFFFFFFEF60        47EF8000                        lw              lr,[sp]
6105
FFFFFFFFFFFFEF64        37EF8018                        ret             #24                     ; return the number in r2
6106 43 robfinch
 
6107
 
6108
                                                 ;******************************************************************
6109
                                                 ;
6110
                                                 ; *** SETVAL *** FIN *** ENDCHK *** ERROR (& friends) ***
6111
                                                 ;
6112
                                                 ; 'SETVAL' expects a variable, followed by an equal sign and then
6113
                                                 ; an expression.  It evaluates the expression and sets the variable
6114
                                                 ; to that value.
6115
                                                 ;
6116
                                                 ; 'FIN' checks the end of a command.  If it ended with ":",
6117
                                                 ; execution continues. If it ended with a CR, it finds the
6118
                                                 ; the next line and continues from there.
6119
                                                 ;
6120
                                                 ; 'ENDCHK' checks if a command is ended with a CR. This is
6121
                                                 ; required in certain commands, such as GOTO, RETURN, STOP, etc.
6122
                                                 ;
6123
                                                 ; 'ERROR' prints the string pointed to by r1. It then prints the
6124
                                                 ; line pointed to by CURRNT with a "?" inserted at where the
6125
                                                 ; old text pointer (should be on top of the stack) points to.
6126
                                                 ; Execution of Tiny BASIC is stopped and a warm start is done.
6127
                                                 ; If CURRNT is zero (indicating a direct command), the direct
6128
                                                 ; command is not printed. If CURRNT is -1 (indicating
6129
                                                 ; 'INPUT' command in progress), the input line is not printed
6130
                                                 ; and execution is not terminated but continues at 'INPERR'.
6131
                                                 ;
6132
                                                 ; Related to 'ERROR' are the following:
6133
                                                 ; 'QWHAT' saves text pointer on stack and gets "What?" message.
6134
                                                 ; 'AWHAT' just gets the "What?" message and jumps to 'ERROR'.
6135
                                                 ; 'QSORRY' and 'ASORRY' do the same kind of thing.
6136
                                                 ; 'QHOW' and 'AHOW' also do this for "How?".
6137
                                                 ;
6138
 
6139
                                                 ; returns
6140
                                                 ; r2 = variable's address
6141
                                                 ;
6142 46 robfinch
FFFFFFFFFFFFEF68                                 SETVAL:
6143
FFFFFFFFFFFFEF68        0FEF0010                     subui   sp,sp,#16
6144
FFFFFFFFFFFFEF6C        67EF8000                     sw      lr,[sp]
6145
FFFFFFFFFFFFEF70        E0400001                     setlo      r1,#1           ; allocate var
6146
FFFFFFFFFFFFEF74        31FFFB2E                     call       TSTV            ; variable name?
6147
FFFFFFFFFFFFEF78        BE100069                     bne                r1,r0,sv2
6148
FFFFFFFFFFFFEF7C        9A00F7A2                        lea             r1,msgVar
6149
FFFFFFFFFFFFEF80        BE00054A                        bra             ERROR
6150
FFFFFFFFFFFFEF84                                 sv2:
6151
FFFFFFFFFFFFEF84        67E08008                        sw      r1,8[sp]    ; save the variable's address
6152
FFFFFFFFFFFFEF88        E0C0003D                        setlo   r3,#'='
6153
FFFFFFFFFFFFEF8C        9A026FAC                        lea             r4,SV1
6154
FFFFFFFFFFFFEF90        31FFFD30                        call    TSTC            ; get past the "=" sign
6155
FFFFFFFFFFFFEF94        31FFFA7C                        call    OREXPR          ; evaluate the expression
6156
FFFFFFFFFFFFEF98        47E10008                        lw      r2,8[sp]    ; get back the variable's address
6157
FFFFFFFFFFFFEF9C        66208000                        sw      r1,[r2]     ; and save value in the variable
6158
FFFFFFFFFFFFEFA0        04200409                        lw              r1,r2           ; return r1 = variable address
6159
FFFFFFFFFFFFEFA4        47EF8000                        lw      lr,[sp]
6160
FFFFFFFFFFFFEFA8        37EF8010                        ret             #16
6161
FFFFFFFFFFFFEFAC                                 SV1:
6162
FFFFFFFFFFFFEFAC        BE0003CA                     bra            QWHAT               ; if no "=" sign
6163 43 robfinch
 
6164
 
6165 46 robfinch
FFFFFFFFFFFFEFB0                                 FIN:
6166
FFFFFFFFFFFFEFB0        0FEF0008                        subui   sp,sp,#8
6167
FFFFFFFFFFFFEFB4        67EF8000                        sw              lr,[sp]
6168
FFFFFFFFFFFFEFB8        E0C0003A                        setlo   r3,#':'
6169
FFFFFFFFFFFFEFBC        9A026FCC                        lea             r4,FI1
6170
FFFFFFFFFFFFEFC0        31FFFD30                        call    TSTC            ; *** FIN ***
6171
FFFFFFFFFFFFEFC4        0BEF0008                        addui   sp,sp,#8        ; if ":", discard return address
6172
FFFFFFFFFFFFEFC8        BE0020AA                        bra             RUNSML          ; continue on the same line
6173
FFFFFFFFFFFFEFCC                                 FI1:
6174
FFFFFFFFFFFFEFCC        E0C0000D                        setlo   r3,#CR
6175
FFFFFFFFFFFFEFD0        9A026FE4                        lea             r4,FI2
6176
FFFFFFFFFFFFEFD4        31FFFD30                        call    TSTC            ; not ":", is it a CR?
6177
FFFFFFFFFFFFEFD8        47EF8000                        lw              lr,[sp] ; else return to the caller
6178
FFFFFFFFFFFFEFDC        0BEF0008                        addui   sp,sp,#8        ; yes, purge return address
6179
FFFFFFFFFFFFEFE0        BE001EAA                        bra             RUNNXL          ; execute the next line
6180
FFFFFFFFFFFFEFE4                                 FI2:
6181
FFFFFFFFFFFFEFE4        47EF8000                        lw              lr,[sp] ; else return to the caller
6182
FFFFFFFFFFFFEFE8        37EF8008                        ret             #8
6183 43 robfinch
 
6184
 
6185
                                                 ; Check that there is nothing else on the line
6186
                                                 ; Registers Affected
6187
                                                 ;   r1
6188
                                                 ;
6189 46 robfinch
FFFFFFFFFFFFEFEC                                 ENDCHK:
6190
FFFFFFFFFFFFEFEC        0FEF0008                        subui   sp,sp,#8
6191
FFFFFFFFFFFFEFF0        67EF8000                        sw              lr,[sp]
6192
FFFFFFFFFFFFEFF4        31FFFD55                        call    IGNBLK
6193
FFFFFFFFFFFFEFF8        40808000                        lb              r1,[r8]
6194
FFFFFFFFFFFFEFFC        B010040D                        beq             r1,#CR,ec1      ; does it end with a CR?
6195
FFFFFFFFFFFFF000        E07FF87C                        setlo   r1,#
6196
FFFFFFFFFFFFF004        F04FFFFF                        sethi   r1,#>msgExtraChars
6197
FFFFFFFFFFFFF008        33FFFC0A                        jmp             ERROR
6198
FFFFFFFFFFFFF00C                                 ec1:
6199
FFFFFFFFFFFFF00C        47EF8000                        lw              lr,[sp]
6200
FFFFFFFFFFFFF010        37EF8008                        ret             #8
6201 43 robfinch
 
6202
 
6203 46 robfinch
FFFFFFFFFFFFF014                                 TOOBIG:
6204
FFFFFFFFFFFFF014        9A00F867                        lea             r1,msgTooBig
6205
FFFFFFFFFFFFF018        BE00008A                        bra             ERROR
6206
FFFFFFFFFFFFF01C                                 QSORRY:
6207
FFFFFFFFFFFFF01C        9A00F6FD                     lea                r1,SRYMSG
6208
FFFFFFFFFFFFF020        BE00004A                        bra         ERROR
6209
FFFFFFFFFFFFF024                                 QWHAT:
6210
FFFFFFFFFFFFF024        9A00F6F5                        lea             r1,msgWhat
6211
FFFFFFFFFFFFF028                                 ERROR:
6212
FFFFFFFFFFFFF028        31FFFD81                        call    PRMESG          ; display the error message
6213
FFFFFFFFFFFFF02C        46009090                        lw              r1,CURRNT       ; get the current line number
6214
FFFFFFFFFFFFF030        BE107EA8                        beq             r1,r0,WSTART    ; if zero, do a warm start
6215
FFFFFFFFFFFFF034        B01D9AFF                        beq             r1,#-1,INPERR           ; is the line no. pointer = -1? if so, redo input
6216
FFFFFFFFFFFFF038        40828000                        lb              r5,[r8]         ; save the char. pointed to
6217
FFFFFFFFFFFFF03C        60800000                        sb              r0,[r8]         ; put a zero where the error is
6218
FFFFFFFFFFFFF040        46009090                        lw              r1,CURRNT       ; point to start of current line
6219
FFFFFFFFFFFFF044        31FFFD1E                        call    PRTLN           ; display the line in error up to the 0
6220
FFFFFFFFFFFFF048        04101809                        or      r6,r1,r0    ; save off end pointer
6221
FFFFFFFFFFFFF04C        60828000                        sb              r5,[r8]         ; restore the character
6222
FFFFFFFFFFFFF050        E040003F                        setlo   r1,#'?'         ; display a "?"
6223
FFFFFFFFFFFFF054        31FFF7D5                        call    GOOUT
6224
FFFFFFFFFFFFF058        E0800000                        setlo   r2,#0       ; stop char = 0
6225
FFFFFFFFFFFFF05C        0E608001                        subui   r1,r6,#1        ; point back to the error char.
6226
FFFFFFFFFFFFF060        31FFFC93                        call    PRTSTG          ; display the rest of the line
6227
FFFFFFFFFFFFF064        33FFF801                        jmp         WSTART              ; and do a warm start
6228 43 robfinch
 
6229
                                                 ;******************************************************************
6230
                                                 ;
6231
                                                 ; *** GETLN *** FNDLN (& friends) ***
6232
                                                 ;
6233
                                                 ; 'GETLN' reads in input line into 'BUFFER'. It first prompts with
6234
                                                 ; the character in r3 (given by the caller), then it fills the
6235
                                                 ; buffer and echos. It ignores LF's but still echos
6236
                                                 ; them back. Control-H is used to delete the last character
6237
                                                 ; entered (if there is one), and control-X is used to delete the
6238
                                                 ; whole line and start over again. CR signals the end of a line,
6239
                                                 ; and causes 'GETLN' to return.
6240
                                                 ;
6241
                                                 ;
6242 46 robfinch
FFFFFFFFFFFFF068                                 GETLN:
6243
FFFFFFFFFFFFF068        0FEF0010                        subui   sp,sp,#16
6244
FFFFFFFFFFFFF06C        67EF8000                        sw              lr,[sp]
6245
FFFFFFFFFFFFF070        67E28008                        sw              r5,8[sp]
6246
FFFFFFFFFFFFF074        31FFF7D5                        call    GOOUT           ; display the prompt
6247
FFFFFFFFFFFFF078        E0400001                        setlo   r1,#1           ; turn on cursor flash
6248
FFFFFFFFFFFFF07C        60009052                        sb              r1,cursFlash
6249
FFFFFFFFFFFFF080        E0400020                        setlo   r1,#' '         ; and a space
6250
FFFFFFFFFFFFF084        31FFF7D5                        call    GOOUT
6251
FFFFFFFFFFFFF088        E200111B                        setlo   r8,#
6252
FFFFFFFFFFFFF08C        F2000000                        sethi   r8,#>BUFFER
6253
FFFFFFFFFFFFF090                                 GL1:
6254
FFFFFFFFFFFFF090        31FFFD77                        call    CHKIO           ; check keyboard
6255
FFFFFFFFFFFFF094        BE107FE8                        beq             r1,r0,GL1       ; wait for a char. to come in
6256
FFFFFFFFFFFFF098        B0100B08                        beq             r1,#CTRLH,GL3   ; delete last character? if so
6257
FFFFFFFFFFFFF09C        B0101418                        beq             r1,#CTRLX,GL4   ; delete the whole line?
6258
FFFFFFFFFFFFF0A0        B010020D                        beq             r1,#CR,GL2      ; accept a CR
6259
FFFFFFFFFFFFF0A4        A81FFB20                        bltu    r1,#' ',GL1     ; if other control char., discard it
6260
FFFFFFFFFFFFF0A8                                 GL2:
6261
FFFFFFFFFFFFF0A8        60808000                        sb              r1,[r8]         ; save the char.
6262
FFFFFFFFFFFFF0AC        08840001                        add             r8,r8,#1
6263
FFFFFFFFFFFFF0B0        31FFF7D5                        call    GOOUT           ; echo the char back out
6264
FFFFFFFFFFFFF0B4        4080FFFF                        lb      r1,-1[r8]   ; get char back (GOOUT destroys r1)
6265
FFFFFFFFFFFFF0B8        B010190D                        beq             r1,#CR,GL7      ; if it's a CR, end the line
6266
FFFFFFFFFFFFF0BC        1280916A                        cmpui   r1,r8,#BUFFER+BUFLEN-1  ; any more room?
6267
FFFFFFFFFFFFF0C0        BE107E80                        blt             r1,r0,GL1       ; yes: get some more, else delete last char.
6268
FFFFFFFFFFFFF0C4                                 GL3:
6269
FFFFFFFFFFFFF0C4        E0400008                        setlo   r1,#CTRLH       ; delete a char. if possible
6270
FFFFFFFFFFFFF0C8        31FFF7D5                        call    GOOUT
6271
FFFFFFFFFFFFF0CC        E0400020                        setlo   r1,#' '
6272
FFFFFFFFFFFFF0D0        31FFF7D5                        call    GOOUT
6273
FFFFFFFFFFFFF0D4        1280911B                        cmpui   r1,r8,#BUFFER   ; any char.'s left?
6274
FFFFFFFFFFFFF0D8        BE107DC2                        ble             r1,r0,GL1               ; if not
6275
FFFFFFFFFFFFF0DC        E0400008                        setlo   r1,#CTRLH       ; if so, finish the BS-space-BS sequence
6276
FFFFFFFFFFFFF0E0        31FFF7D5                        call    GOOUT
6277
FFFFFFFFFFFFF0E4        0C840001                        sub             r8,r8,#1        ; decrement the text pointer
6278
FFFFFFFFFFFFF0E8        BE007D4A                        bra             GL1                     ; back for more
6279
FFFFFFFFFFFFF0EC                                 GL4:
6280
FFFFFFFFFFFFF0EC        04800409                        or              r1,r8,r0                ; delete the whole line
6281
FFFFFFFFFFFFF0F0        0E12911B                        subui   r5,r1,#BUFFER   ; figure out how many backspaces we need
6282
FFFFFFFFFFFFF0F4        BE500108                        beq             r5,r0,GL6               ; if none needed, brnch
6283
FFFFFFFFFFFFF0F8                                 GL5:
6284
FFFFFFFFFFFFF0F8        E0400008                        setlo   r1,#CTRLH       ; and display BS-space-BS sequences
6285
FFFFFFFFFFFFF0FC        31FFF7D5                        call    GOOUT
6286
FFFFFFFFFFFFF100        E0400020                        setlo   r1,#' '
6287
FFFFFFFFFFFFF104        31FFF7D5                        call    GOOUT
6288
FFFFFFFFFFFFF108        E0400008                        setlo   r1,#CTRLH
6289
FFFFFFFFFFFFF10C        31FFF7D5                        call    GOOUT
6290
FFFFFFFFFFFFF110        BE02FF4F                        loop    r5,GL5
6291
FFFFFFFFFFFFF114                                 GL6:
6292
FFFFFFFFFFFFF114        9A04111B                        lea             r8,BUFFER       ; reinitialize the text pointer
6293
FFFFFFFFFFFFF118        BE007BCA                        bra             GL1                     ; and go back for more
6294
FFFFFFFFFFFFF11C                                 GL7:
6295
FFFFFFFFFFFFF11C        E0400000                        setlo   r1,#0           ; turn off cursor flash
6296
FFFFFFFFFFFFF120        60009052                        sb              r1,cursFlash
6297
FFFFFFFFFFFFF124        E040000A                        setlo   r1,#LF          ; echo a LF for the CR
6298
FFFFFFFFFFFFF128        31FFF7D5                        call    GOOUT
6299
FFFFFFFFFFFFF12C        47EF8000                        lw              lr,[sp]
6300
FFFFFFFFFFFFF130        47E28008                        lw              r5,8[sp]
6301
FFFFFFFFFFFFF134        37EF8010                        ret             #16
6302 43 robfinch
 
6303
 
6304
                                                 ; 'FNDLN' finds a line with a given line no. (in r1) in the
6305
                                                 ; text save area.  r9 is used as the text pointer. If the line
6306
                                                 ; is found, r9 will point to the beginning of that line
6307
                                                 ; (i.e. the high byte of the line no.), and flags are Z.
6308
                                                 ; If that line is not there and a line with a higher line no.
6309
                                                 ; is found, r9 points there and flags are NC & NZ. If we reached
6310
                                                 ; the end of the text save area and cannot find the line, flags
6311
                                                 ; are C & NZ.
6312
                                                 ; Z=1 if line found
6313
                                                 ; N=1 if end of text save area
6314
                                                 ; Z=0 & N=0 if higher line found
6315
                                                 ; r0 = 1       <= line is found
6316
                                                 ;      r9 = pointer to line
6317
                                                 ; r0 = 0    <= line is not found
6318
                                                 ;      r9 = zero, if end of text area
6319
                                                 ;      r9 = otherwise higher line number
6320
                                                 ;
6321
                                                 ; 'FNDLN' will initialize r9 to the beginning of the text save
6322
                                                 ; area to start the search. Some other entries of this routine
6323
                                                 ; will not initialize r9 and do the search.
6324
                                                 ; 'FNDLNP' will start with r9 and search for the line no.
6325
                                                 ; 'FNDNXT' will bump r9 by 2, find a CR and then start search.
6326
                                                 ; 'FNDSKP' uses r9 to find a CR, and then starts the search.
6327
                                                 ; return Z=1 if line is found, r9 = pointer to line
6328
                                                 ;
6329
                                                 ; Parameters
6330
                                                 ;      r1 = line number to find
6331
                                                 ;
6332 46 robfinch
FFFFFFFFFFFFF138                                 FNDLN:
6333
FFFFFFFFFFFFF138        AC1003FF                        bleui   r1,#0xFFFF,fl1  ; line no. must be < 65535
6334
FFFFFFFFFFFFF13C        9A00F78C                        lea             r1,msgLineRange
6335
FFFFFFFFFFFFF140        BE00774A                        bra             ERROR
6336
FFFFFFFFFFFFF144                                 fl1:
6337
FFFFFFFFFFFFF144        4604DF68                        lw              r9,TXTBGN       ; init. the text save pointer
6338 43 robfinch
 
6339 46 robfinch
FFFFFFFFFFFFF148                                 FNDLNP:
6340
FFFFFFFFFFFFF148        460510D0                        lw              r10,TXTUNF      ; check if we passed the end
6341
FFFFFFFFFFFFF14C        0EA50001                        subui   r10,r10,#1
6342
FFFFFFFFFFFFF150        BE950127                        bgtu    r9,r10,FNDRET1          ; if so, return with r9=0,r1=0
6343
FFFFFFFFFFFFF154        4A918000                        lbu             r3,[r9]         ; get low order byte of line number
6344
FFFFFFFFFFFFF158        4A910001                        lbu             r2,1[r9]        ; get high order byte
6345
FFFFFFFFFFFFF15C        06211000                        shli    r2,r2,#8
6346
FFFFFFFFFFFFF160        04218809                        or              r2,r2,r3        ; build whole line number
6347
FFFFFFFFFFFFF164        BE110127                        bgtu    r1,r2,FNDNXT    ; is this the line we want? no, not there yet
6348
FFFFFFFFFFFFF168        BE1100C8                        beq             r1,r2,FNDRET2
6349
FFFFFFFFFFFFF16C                                 FNDRET:
6350
FFFFFFFFFFFFF16C        0410840A                        xor             r1,r1,r1        ; line not found, but r9=next line pointer
6351
FFFFFFFFFFFFF170        37EF8000                        ret                     ; return the cond. codes
6352
FFFFFFFFFFFFF174                                 FNDRET1:
6353
FFFFFFFFFFFFF174        0494A40A                        xor             r9,r9,r9        ; no higher line
6354
FFFFFFFFFFFFF178        0410840A                        xor             r1,r1,r1        ; line not found
6355
FFFFFFFFFFFFF17C        37EF8000                        ret
6356
FFFFFFFFFFFFF180                                 FNDRET2:
6357
FFFFFFFFFFFFF180        E0400001                        setlo   r1,#1           ; line found
6358
FFFFFFFFFFFFF184        37EF8000                        ret
6359 43 robfinch
 
6360 46 robfinch
FFFFFFFFFFFFF188                                 FNDNXT:
6361
FFFFFFFFFFFFF188        0A948002                        addui   r9,r9,#2        ; find the next line
6362 43 robfinch
 
6363 46 robfinch
FFFFFFFFFFFFF18C                                 FNDSKP:
6364
FFFFFFFFFFFFF18C        4A910000                        lbu             r2,[r9]
6365
FFFFFFFFFFFFF190        0A948001                        addui   r9,r9,#1
6366
FFFFFFFFFFFFF194        B22FFE0D                        bnei    r2,#CR,FNDSKP           ; try to find a CR, keep looking
6367
FFFFFFFFFFFFF198        BE007D8A                        bra             FNDLNP          ; check if end of text
6368 43 robfinch
 
6369
 
6370
                                                 ;******************************************************************
6371
                                                 ; 'MVUP' moves a block up from where r1 points to where r2 points
6372
                                                 ; until r1=r3
6373
                                                 ;
6374 46 robfinch
FFFFFFFFFFFFF19C                                 MVUP1:
6375
FFFFFFFFFFFFF19C        40120000                        lb              r4,[r1]
6376
FFFFFFFFFFFFF1A0        60220000                        sb              r4,[r2]
6377
FFFFFFFFFFFFF1A4        08108001                        add             r1,r1,#1
6378
FFFFFFFFFFFFF1A8        08210001                        add             r2,r2,#1
6379
FFFFFFFFFFFFF1AC                                 MVUP:
6380
FFFFFFFFFFFFF1AC        BE11FF89                        bne             r1,r3,MVUP1
6381
FFFFFFFFFFFFF1B0                                 MVRET:
6382
FFFFFFFFFFFFF1B0        37EF8000                        ret
6383 43 robfinch
 
6384
 
6385
                                                 ; 'MVDOWN' moves a block down from where r1 points to where r2
6386
                                                 ; points until r1=r3
6387
                                                 ;
6388 46 robfinch
FFFFFFFFFFFFF1B4                                 MVDOWN1:
6389
FFFFFFFFFFFFF1B4        0C108001                        sub             r1,r1,#1
6390
FFFFFFFFFFFFF1B8        0C210001                        sub             r2,r2,#1
6391
FFFFFFFFFFFFF1BC        40120000                        lb              r4,[r1]
6392
FFFFFFFFFFFFF1C0        60220000                        sb              r4,[r2]
6393
FFFFFFFFFFFFF1C4                                 MVDOWN:
6394
FFFFFFFFFFFFF1C4        BE11FF89                        bne             r1,r3,MVDOWN1
6395
FFFFFFFFFFFFF1C8        37EF8000                        ret
6396 43 robfinch
 
6397
 
6398
                                                 ; 'POPA' restores the 'FOR' loop variable save area from the stack
6399
                                                 ;
6400
                                                 ; 'PUSHA' stacks for 'FOR' loop variable save area onto the stack
6401
                                                 ;
6402
                                                 ; Note: a single zero word is stored on the stack in the
6403
                                                 ; case that no FOR loops need to be saved. This needs to be
6404
                                                 ; done because PUSHA / POPA is called all the time.
6405
 
6406 46 robfinch
FFFFFFFFFFFFF1CC                                 POPA:
6407
FFFFFFFFFFFFF1CC        47E08000                        lw              r1,[sp]         ; restore LOPVAR, but zero means no more
6408
FFFFFFFFFFFFF1D0        660090A8                        sw              r1,LOPVAR
6409
FFFFFFFFFFFFF1D4        BE100148                        beq             r1,r0,PP1
6410
FFFFFFFFFFFFF1D8        47E08020                        lw              r1,32[sp]       ; if not zero, restore the rest
6411
FFFFFFFFFFFFF1DC        660090C8                        sw              r1,LOPPT
6412
FFFFFFFFFFFFF1E0        47E08018                        lw              r1,24[sp]
6413
FFFFFFFFFFFFF1E4        660090C0                        sw              r1,LOPLN
6414
FFFFFFFFFFFFF1E8        47E08010                        lw              r1,16[sp]
6415
FFFFFFFFFFFFF1EC        660090B8                        sw              r1,LOPLMT
6416
FFFFFFFFFFFFF1F0        47E08008                        lw              r1,8[sp]
6417
FFFFFFFFFFFFF1F4        660090B0                        sw              r1,LOPINC
6418
FFFFFFFFFFFFF1F8        37EF8028                        ret             #40
6419
FFFFFFFFFFFFF1FC                                 PP1:
6420
FFFFFFFFFFFFF1FC        37EF8008                        ret             #8
6421 43 robfinch
 
6422
 
6423 46 robfinch
FFFFFFFFFFFFF200                                 PUSHA:
6424
FFFFFFFFFFFFF200        460090F8                        lw              r1,STKBOT       ; Are we running out of stack room?
6425
FFFFFFFFFFFFF204        0A108028                        addui   r1,r1,#40       ; we might need this many bytes
6426
FFFFFFFFFFFFF208        BFE0F0A4                        bltu    sp,r1,QSORRY    ; out of stack space
6427
FFFFFFFFFFFFF20C        460090A8                        lw              r1,LOPVAR       ; save loop variables
6428
FFFFFFFFFFFFF210        BE100188                        beq             r1,r0,PU1       ; if LOPVAR is zero, that's all
6429
FFFFFFFFFFFFF214        0FEF0028                        subui   sp,sp,#40
6430
FFFFFFFFFFFFF218        67E08000                        sw              r1,[sp]
6431
FFFFFFFFFFFFF21C        460090C8                        lw              r1,LOPPT
6432
FFFFFFFFFFFFF220        67E08020                        sw              r1,32[sp]       ; else save all the others
6433
FFFFFFFFFFFFF224        460090C0                        lw              r1,LOPLN
6434
FFFFFFFFFFFFF228        67E08018                        sw              r1,24[sp]
6435
FFFFFFFFFFFFF22C        460090B8                        lw              r1,LOPLMT
6436
FFFFFFFFFFFFF230        67E08010                        sw              r1,16[sp]
6437
FFFFFFFFFFFFF234        460090B0                        lw              r1,LOPINC
6438
FFFFFFFFFFFFF238        67E08008                        sw              r1,8[sp]
6439
FFFFFFFFFFFFF23C        37EF8000                        ret
6440
FFFFFFFFFFFFF240                                 PU1:
6441
FFFFFFFFFFFFF240        0FEF0008                        subui   sp,sp,#8
6442
FFFFFFFFFFFFF244        67E08000                        sw              r1,[sp]
6443
FFFFFFFFFFFFF248        37EF8000                        ret
6444 43 robfinch
 
6445
 
6446
                                                 ;******************************************************************
6447
                                                 ;
6448
                                                 ; *** PRTSTG *** QTSTG *** PRTNUM *** PRTLN ***
6449
                                                 ;
6450
                                                 ; 'PRTSTG' prints a string pointed to by r3. It stops printing
6451
                                                 ; and returns to the caller when either a CR is printed or when
6452
                                                 ; the next byte is the same as what was passed in r4 by the
6453
                                                 ; caller.
6454
                                                 ;
6455
                                                 ; 'QTSTG' looks for an underline (back-arrow on some systems),
6456
                                                 ; single-quote, or double-quote.  If none of these are found, returns
6457
                                                 ; to the caller.  If underline, outputs a CR without a LF.  If single
6458
                                                 ; or double quote, prints the quoted string and demands a matching
6459
                                                 ; end quote.  After the printing, the next i-word of the caller is
6460
                                                 ; skipped over (usually a branch instruction).
6461
                                                 ;
6462
                                                 ; 'PRTNUM' prints the 32 bit number in r3, leading blanks are added if
6463
                                                 ; needed to pad the number of spaces to the number in r4.
6464
                                                 ; However, if the number of digits is larger than the no. in
6465
                                                 ; r4, all digits are printed anyway. Negative sign is also
6466
                                                 ; printed and counted in, positive sign is not.
6467
                                                 ;
6468
                                                 ; 'PRTLN' prints the saved text line pointed to by r3
6469
                                                 ; with line no. and all.
6470
                                                 ;
6471
 
6472
                                                 ; r1 = pointer to string
6473
                                                 ; r2 = stop character
6474
                                                 ; return r1 = pointer to end of line + 1
6475
 
6476 46 robfinch
FFFFFFFFFFFFF24C                                 PRTSTG:
6477
FFFFFFFFFFFFF24C        0FEF0020                     subui   sp,sp,#32
6478
FFFFFFFFFFFFF250        67E28000                     sw         r5,[sp]
6479
FFFFFFFFFFFFF254        67E28008                     sw         r5,8[sp]
6480
FFFFFFFFFFFFF258        67E38010                     sw         r7,16[sp]
6481
FFFFFFFFFFFFF25C        67EF8018                     sw         lr,24[sp]
6482
FFFFFFFFFFFFF260        02128009                     mov     r5,r1       ; r5 = pointer
6483
FFFFFFFFFFFFF264        02230009                     mov     r6,r2       ; r6 = stop char
6484
FFFFFFFFFFFFF268                                 PS1:
6485
FFFFFFFFFFFFF268        4A538000                     lbu     r7,[r5]     ; get a text character
6486
FFFFFFFFFFFFF26C        0A528001                     addui   r5,r5,#1
6487
FFFFFFFFFFFFF270        BE7300C8                        beq         r7,r6,PRTRET                ; same as stop character? if so, return
6488
FFFFFFFFFFFFF274        02708009                        mov     r1,r7
6489
FFFFFFFFFFFFF278        31FFF7D5                        call    GOOUT           ; display the char.
6490
FFFFFFFFFFFFF27C        B27FFB0D                        bnei    r7,#CR,PS1  ; is it a C.R.? no, go back for more
6491
FFFFFFFFFFFFF280        E040000A                        setlo   r1,#LF      ; yes, add a L.F.
6492
FFFFFFFFFFFFF284        31FFF7D5                        call    GOOUT
6493
FFFFFFFFFFFFF288                                 PRTRET:
6494
FFFFFFFFFFFFF288        02710009                     mov     r2,r7       ; return r2 = stop char
6495
FFFFFFFFFFFFF28C        02508009                        mov             r1,r5           ; return r1 = line pointer
6496
FFFFFFFFFFFFF290        47EF8018                     lw         lr,24[sp]
6497
FFFFFFFFFFFFF294        47E38010                     lw         r7,16[sp]
6498
FFFFFFFFFFFFF298        47E28008                     lw         r5,8[sp]
6499
FFFFFFFFFFFFF29C        47E28000                     lw         r5,[sp]
6500
FFFFFFFFFFFFF2A0        37EF8020                     ret                #32             ; then return
6501 43 robfinch
 
6502
 
6503 46 robfinch
FFFFFFFFFFFFF2A4                                 QTSTG:
6504
FFFFFFFFFFFFF2A4        0FEF0008                        subui   sp,sp,#8
6505
FFFFFFFFFFFFF2A8        67EF8000                        sw              lr,[sp]
6506
FFFFFFFFFFFFF2AC        E0C00022                        setlo   r3,#'"'
6507
FFFFFFFFFFFFF2B0        9A0272D4                        lea             r4,QT3
6508
FFFFFFFFFFFFF2B4        31FFFD30                        call    TSTC            ; *** QTSTG ***
6509
FFFFFFFFFFFFF2B8        E0800022                        setlo   r2,#'"'         ; it is a "
6510
FFFFFFFFFFFFF2BC                                 QT1:
6511
FFFFFFFFFFFFF2BC        04800409                        or              r1,r8,r0
6512
FFFFFFFFFFFFF2C0        31FFFC93                        call    PRTSTG          ; print until another
6513
FFFFFFFFFFFFF2C4        04102009                        lw              r8,r1
6514
FFFFFFFFFFFFF2C8        B2200D0A                        bne             r2,#LF,QT2      ; was last one a CR?
6515
FFFFFFFFFFFFF2CC        0BEF0008                        addui   sp,sp,#8
6516
FFFFFFFFFFFFF2D0        BE00072A                        bra             RUNNXL          ; if so, run next line
6517
FFFFFFFFFFFFF2D4                                 QT3:
6518
FFFFFFFFFFFFF2D4        E0C00027                        setlo   r3,#''''
6519
FFFFFFFFFFFFF2D8        9A0272E8                        lea             r4,QT4
6520
FFFFFFFFFFFFF2DC        31FFFD30                        call    TSTC            ; is it a single quote?
6521
FFFFFFFFFFFFF2E0        E0800027                        setlo   r2,#''''        ; if so, do same as above
6522
FFFFFFFFFFFFF2E4        BE007ECA                        bra             QT1
6523
FFFFFFFFFFFFF2E8                                 QT4:
6524
FFFFFFFFFFFFF2E8        E0C0005F                        setlo   r3,#'_'
6525
FFFFFFFFFFFFF2EC        9A027308                        lea             r4,QT5
6526
FFFFFFFFFFFFF2F0        31FFFD30                        call    TSTC            ; is it an underline?
6527
FFFFFFFFFFFFF2F4        E040000D                        setlo   r1,#CR          ; if so, output a CR without LF
6528
FFFFFFFFFFFFF2F8        31FFF7D5                        call    GOOUT
6529
FFFFFFFFFFFFF2FC                                 QT2:
6530
FFFFFFFFFFFFF2FC        47EF8000                        lw              lr,[sp]
6531
FFFFFFFFFFFFF300        0BEF0008                        addui   sp,sp,#8
6532
FFFFFFFFFFFFF304        35F00004                        jal             r0,4[lr]                ; skip over next i-word when returning
6533
FFFFFFFFFFFFF308                                 QT5:                                           ; not " ' or _
6534
FFFFFFFFFFFFF308        47EF8000                        lw              lr,[sp]
6535
FFFFFFFFFFFFF30C        37EF8008                        ret             #8
6536 43 robfinch
 
6537
 
6538
                                                 ; Output a CR LF sequence
6539
                                                 ;
6540 46 robfinch
FFFFFFFFFFFFF310                                 prCRLF:
6541
FFFFFFFFFFFFF310        0FEF0008                        subui   sp,sp,#8
6542
FFFFFFFFFFFFF314        67EF8000                        sw              lr,[sp]
6543
FFFFFFFFFFFFF318        E040000D                        setlo   r1,#CR
6544
FFFFFFFFFFFFF31C        31FFF7D5                        call    GOOUT
6545
FFFFFFFFFFFFF320        E040000A                        setlo   r1,#LF
6546
FFFFFFFFFFFFF324        31FFF7D5                        call    GOOUT
6547
FFFFFFFFFFFFF328        47EF8000                        lw              lr,[sp]
6548
FFFFFFFFFFFFF32C        37EF8008                        ret             #8
6549 43 robfinch
 
6550
 
6551
                                                 ; r1 = number to print
6552
                                                 ; r2 = number of digits
6553
                                                 ; Register Usage
6554
                                                 ;      r5 = number of padding spaces
6555 46 robfinch
FFFFFFFFFFFFF330                                 PRTNUM:
6556
FFFFFFFFFFFFF330        0FEF0028                        subui   sp,sp,#40
6557
FFFFFFFFFFFFF334        67E18000                        sw              r3,[sp]
6558
FFFFFFFFFFFFF338        67E28008                        sw              r5,8[sp]
6559
FFFFFFFFFFFFF33C        67E30010                        sw              r6,16[sp]
6560
FFFFFFFFFFFFF340        67E38018                        sw              r7,24[sp]
6561
FFFFFFFFFFFFF344        67EF8020                        sw              lr,32[sp]
6562
FFFFFFFFFFFFF348        9A039100                        lea             r7,NUMWKA       ; r7 = pointer to numeric work area
6563
FFFFFFFFFFFFF34C        02130009                        mov             r6,r1           ; save number for later
6564
FFFFFFFFFFFFF350        02228009                        mov             r5,r2           ; r5 = min number of chars
6565
FFFFFFFFFFFFF354        BE100063                        bgt             r1,r0,PN2       ; is it negative? if not
6566
FFFFFFFFFFFFF358        02108006                        neg             r1,r1           ; else make it positive
6567
FFFFFFFFFFFFF35C        0E528001                        subui   r5,r5,#1        ; one less for width count
6568
FFFFFFFFFFFFF360                                 PN2:
6569
FFFFFFFFFFFFF360        1601800A                        lw              r3,#10
6570
FFFFFFFFFFFFF364                                 PN1:
6571
FFFFFFFFFFFFF364        0411881C                        modu    r2,r1,r3        ; r2 = r1 mod 10
6572
FFFFFFFFFFFFF368        1E10800A                        divui   r1,r1,#10       ; r1 /= 10 divide by 10
6573
FFFFFFFFFFFFF36C        0A210030                        addui   r2,r2,#'0'      ; convert remainder to ascii
6574
FFFFFFFFFFFFF370        60710000                        sb              r2,[r7]         ; and store in buffer
6575
FFFFFFFFFFFFF374        0A738001                        addui   r7,r7,#1
6576
FFFFFFFFFFFFF378        0E528001                        subui   r5,r5,#1        ; decrement width
6577
FFFFFFFFFFFFF37C        BE107F49                        bne             r1,r0,PN1
6578
FFFFFFFFFFFFF380                                 PN6:
6579
FFFFFFFFFFFFF380        BE500082                        ble             r5,r0,PN4       ; test pad count, skip padding if not needed
6580
FFFFFFFFFFFFF384                                 PN3:
6581
FFFFFFFFFFFFF384        E0400020                        setlo   r1,#' '         ; display the required leading spaces
6582
FFFFFFFFFFFFF388        31FFF7D5                        call    GOOUT
6583
FFFFFFFFFFFFF38C        BE02FFCF                        loop    r5,PN3
6584
FFFFFFFFFFFFF390                                 PN4:
6585
FFFFFFFFFFFFF390        BE600061                        bge             r6,r0,PN5       ; is number negative?
6586
FFFFFFFFFFFFF394        E040002D                        setlo   r1,#'-'         ; if so, display the sign
6587
FFFFFFFFFFFFF398        31FFF7D5                        call    GOOUT
6588
FFFFFFFFFFFFF39C                                 PN5:
6589
FFFFFFFFFFFFF39C        0E738001                        subui   r7,r7,#1
6590
FFFFFFFFFFFFF3A0        40708000                        lb              r1,[r7]         ; now unstack the digits and display
6591
FFFFFFFFFFFFF3A4        31FFF7D5                        call    GOOUT
6592
FFFFFFFFFFFFF3A8        12709100                        cmpui   r1,r7,#NUMWKA
6593
FFFFFFFFFFFFF3AC        BE107F87                        bgtu    r1,r0,PN5
6594
FFFFFFFFFFFFF3B0                                 PNRET:
6595
FFFFFFFFFFFFF3B0        47EF8020                        lw              lr,32[sp]
6596
FFFFFFFFFFFFF3B4        47E38018                        lw              r7,24[sp]
6597
FFFFFFFFFFFFF3B8        47E30010                        lw              r6,16[sp]
6598
FFFFFFFFFFFFF3BC        47E28008                        lw              r5,8[sp]
6599
FFFFFFFFFFFFF3C0        47E18000                        lw              r3,[sp]
6600
FFFFFFFFFFFFF3C4        37EF8028                        ret             #40
6601 43 robfinch
 
6602
 
6603
                                                 ; r1 = number to print
6604
                                                 ; r2 = number of digits
6605 46 robfinch
FFFFFFFFFFFFF3C8                                 PRTHEXNUM:
6606
FFFFFFFFFFFFF3C8        0FEF0028                        subui   sp,sp,#40
6607
FFFFFFFFFFFFF3CC        67E28000                        sw              r5,[sp]
6608
FFFFFFFFFFFFF3D0        67E30008                        sw              r6,8[sp]
6609
FFFFFFFFFFFFF3D4        67E38010                        sw              r7,16[sp]
6610
FFFFFFFFFFFFF3D8        67E40018                        sw              r8,24[sp]
6611
FFFFFFFFFFFFF3DC        67EF8020                        sw              lr,32[sp]
6612
FFFFFFFFFFFFF3E0        9A039100                        lea             r7,NUMWKA       ; r7 = pointer to numeric work area
6613
FFFFFFFFFFFFF3E4        04101809                        or              r6,r1,r0        ; save number for later
6614
FFFFFFFFFFFFF3E8        E1400014                        setlo   r5,#20          ; r5 = min number of chars
6615
FFFFFFFFFFFFF3EC        02120009                        mov             r4,r1
6616
FFFFFFFFFFFFF3F0        BE400083                        bgt             r4,r0,PHN1              ; is it negative? if not
6617
FFFFFFFFFFFFF3F4        02420006                        neg             r4,r4                   ; else make it positive
6618
FFFFFFFFFFFFF3F8        0E528001                        subui   r5,r5,#1        ; one less for width count
6619
FFFFFFFFFFFFF3FC        E2000014                        setlo   r8,#20          ; maximum of 10 digits
6620
FFFFFFFFFFFFF400                                 PHN1:
6621
FFFFFFFFFFFFF400        02408009                        mov             r1,r4
6622
FFFFFFFFFFFFF404        1410800F                        andi    r1,r1,#15
6623
FFFFFFFFFFFFF408        A010030A                        blt             r1,#10,PHN7
6624
FFFFFFFFFFFFF40C        0A108037                        addui   r1,r1,#'A'-10
6625
FFFFFFFFFFFFF410        BE00004A                        bra             PHN8
6626
FFFFFFFFFFFFF414                                 PHN7:
6627
FFFFFFFFFFFFF414        08108030                        add             r1,r1,#'0'              ; convert remainder to ascii
6628
FFFFFFFFFFFFF418                                 PHN8:
6629
FFFFFFFFFFFFF418        60708000                        sb              r1,[r7]         ; and store in buffer
6630
FFFFFFFFFFFFF41C        0A738001                        addui   r7,r7,#1
6631
FFFFFFFFFFFFF420        0E528001                        subui   r5,r5,#1        ; decrement width
6632
FFFFFFFFFFFFF424        06420801                        shrui   r4,r4,#4
6633
FFFFFFFFFFFFF428        BE400048                        beq             r4,r0,PHN6                      ; is it zero yet ?
6634
FFFFFFFFFFFFF42C        BE047EAF                        loop    r8,PHN1         ; safety
6635
FFFFFFFFFFFFF430                                 PHN6:  ; test pad count
6636
FFFFFFFFFFFFF430        BE500082                        ble             r5,r0,PHN4      ; skip padding if not needed
6637
FFFFFFFFFFFFF434                                 PHN3:
6638
FFFFFFFFFFFFF434        E0400020                        setlo   r1,#' '         ; display the required leading spaces
6639
FFFFFFFFFFFFF438        31FFF7D5                        call    GOOUT
6640
FFFFFFFFFFFFF43C        BE02FFCF                        loop    r5,PHN3
6641
FFFFFFFFFFFFF440                                 PHN4:
6642
FFFFFFFFFFFFF440        BE600063                        bgt             r6,r0,PHN5      ; is number negative?
6643
FFFFFFFFFFFFF444        E040002D                        setlo   r1,#'-'         ; if so, display the sign
6644
FFFFFFFFFFFFF448        31FFF7D5                        call    GOOUT
6645
FFFFFFFFFFFFF44C                                 PHN5:
6646
FFFFFFFFFFFFF44C        0E738001                        subui   r7,r7,#1
6647
FFFFFFFFFFFFF450        40708000                        lb              r1,[r7]         ; now unstack the digits and display
6648
FFFFFFFFFFFFF454        31FFF7D5                        call    GOOUT
6649
FFFFFFFFFFFFF458        12709100                        cmpui   r1,r7,#NUMWKA
6650
FFFFFFFFFFFFF45C        BE107F83                        bgt             r1,r0,PHN5
6651
FFFFFFFFFFFFF460                                 PHNRET:
6652
FFFFFFFFFFFFF460        47EF8020                        lw              lr,32[sp]
6653
FFFFFFFFFFFFF464        47E40018                        lw              r8,24[sp]
6654
FFFFFFFFFFFFF468        47E38010                        lw              r7,16[sp]
6655
FFFFFFFFFFFFF46C        47E30008                        lw              r6,8[sp]
6656
FFFFFFFFFFFFF470        47E28000                        lw              r5,[sp]
6657
FFFFFFFFFFFFF474        37EF8028                        ret             #40
6658 43 robfinch
 
6659
 
6660
                                                 ; r1 = pointer to line
6661
                                                 ; returns r1 = pointer to end of line + 1
6662 46 robfinch
FFFFFFFFFFFFF478                                 PRTLN:
6663
FFFFFFFFFFFFF478        0FEF0010                     subui   sp,sp,#16
6664
FFFFFFFFFFFFF47C        67E28000                     sw         r5,[sp]
6665
FFFFFFFFFFFFF480        67EF8008                     sw         lr,8[sp]
6666
FFFFFFFFFFFFF484        08128002                     addi    r5,r1,#2
6667
FFFFFFFFFFFFF488        4A50FFFE                     lbu                r1,-2[r5]       ; get the binary line number
6668
FFFFFFFFFFFFF48C        4A517FFF                     lbu                r2,-1[r5]
6669
FFFFFFFFFFFFF490        06211000                     shli       r2,r2,#8
6670
FFFFFFFFFFFFF494        04110409                     or         r1,r1,r2
6671
FFFFFFFFFFFFF498        E0800000                     setlo   r2,#0       ; display a 0 or more digit line no.
6672
FFFFFFFFFFFFF49C        31FFFCCC                        call    PRTNUM
6673
FFFFFFFFFFFFF4A0        E0400020                        setlo   r1,#' '     ; followed by a blank
6674
FFFFFFFFFFFFF4A4        31FFF7D5                        call    GOOUT
6675
FFFFFFFFFFFFF4A8        E0800000                        setlo   r2,#0       ; stop char. is a zero
6676
FFFFFFFFFFFFF4AC        04500409                        or      r1,r5,r0
6677
FFFFFFFFFFFFF4B0        31FFFC93                        call    PRTSTG          ; display the rest of the line
6678
FFFFFFFFFFFFF4B4        47EF8008                        lw              lr,8[sp]
6679
FFFFFFFFFFFFF4B8        47E28000                        lw              r5,[sp]
6680
FFFFFFFFFFFFF4BC        37EF8010                        ret             #16
6681 43 robfinch
 
6682
 
6683
                                                 ; ===== Test text byte following the call to this subroutine. If it
6684
                                                 ;      equals the byte pointed to by r8, return to the code following
6685
                                                 ;      the call. If they are not equal, brnch to the point
6686
                                                 ;      indicated in r4.
6687
                                                 ;
6688
                                                 ; Registers Affected
6689
                                                 ;   r3,r8
6690
                                                 ; Returns
6691
                                                 ;      r8 = updated text pointer
6692
                                                 ;
6693 46 robfinch
FFFFFFFFFFFFF4C0                                 TSTC
6694
FFFFFFFFFFFFF4C0        0FEF0010                        subui   sp,sp,#16
6695
FFFFFFFFFFFFF4C4        67EF8000                        sw              lr,[sp]
6696
FFFFFFFFFFFFF4C8        67E08008                        sw              r1,8[sp]
6697
FFFFFFFFFFFFF4CC        31FFFD55                        call    IGNBLK          ; ignore leading blanks
6698
FFFFFFFFFFFFF4D0        40808000                        lb              r1,[r8]
6699
FFFFFFFFFFFFF4D4        BE3080A8                        beq             r3,r1,TC1       ; is it = to what r8 points to? if so
6700
FFFFFFFFFFFFF4D8        47E08008                        lw              r1,8[sp]
6701
FFFFFFFFFFFFF4DC        47EF8000                        lw              lr,[sp]
6702
FFFFFFFFFFFFF4E0        0BEF0010                        addui   sp,sp,#16
6703
FFFFFFFFFFFFF4E4        34400000                        jal             r0,[r4]         ; jump to the routine
6704
FFFFFFFFFFFFF4E8                                 TC1:
6705
FFFFFFFFFFFFF4E8        0A840001                        addui   r8,r8,#1        ; if equal, bump text pointer
6706
FFFFFFFFFFFFF4EC        47E08008                        lw              r1,8[sp]
6707
FFFFFFFFFFFFF4F0        47EF8000                        lw              lr,[sp]
6708
FFFFFFFFFFFFF4F4        37EF8010                        ret             #16
6709 43 robfinch
 
6710
                                                 ; ===== See if the text pointed to by r8 is a number. If so,
6711
                                                 ;      return the number in r2 and the number of digits in r3,
6712
                                                 ;      else return zero in r2 and r3.
6713
                                                 ; Registers Affected
6714
                                                 ;   r1,r2,r3,r4
6715
                                                 ; Returns
6716
                                                 ;      r1 = number
6717
                                                 ;      r2 = number of digits in number
6718
                                                 ;      r8 = updated text pointer
6719
                                                 ;
6720 46 robfinch
FFFFFFFFFFFFF4F8                                 TSTNUM:
6721
FFFFFFFFFFFFF4F8        0FEF0008                        subui   sp,sp,#8
6722
FFFFFFFFFFFFF4FC        67EF8000                        sw              lr,[sp]
6723
FFFFFFFFFFFFF500        31FFFD55                        call    IGNBLK          ; skip over blanks
6724
FFFFFFFFFFFFF504        E0400000                        setlo   r1,#0           ; initialize return parameters
6725
FFFFFFFFFFFFF508        E0800000                        setlo   r2,#0
6726
FFFFFFFFFFFFF50C                                 TN1:
6727
FFFFFFFFFFFFF50C        40818000                        lb              r3,[r8]
6728
FFFFFFFFFFFFF510        A8300F30                        bltui   r3,#'0',TSNMRET ; is it less than zero?
6729
FFFFFFFFFFFFF514        AE300E39                        bgtui   r3,#'9',TSNMRET ; is it greater than nine?
6730
FFFFFFFFFFFFF518        E6BFFFFF                ; SETLO
6731
FFFFFFFFFFFFF51C        EEBFFFFF                ; SETMID
6732
FFFFFFFFFFFFF520        F6807FFF                ; SETHI
6733
FFFFFFFFFFFFF524        040D1009                        lw              r4,#0x07FFFFFF_FFFFFFFF
6734
FFFFFFFFFFFFF528        BE120066                        bleu    r1,r4,TN2       ; see if there's room for new digit
6735
FFFFFFFFFFFFF52C        9A00F721                        lea             r1,msgNumTooBig
6736
FFFFFFFFFFFFF530        BE0057CA                        bra             ERROR           ; if not, we've overflowd
6737
FFFFFFFFFFFFF534                                 TN2:
6738
FFFFFFFFFFFFF534        1A10800A                        mului   r1,r1,#10       ; quickly multiply result by 10
6739
FFFFFFFFFFFFF538        0A840001                        addui   r8,r8,#1        ; adjust text pointer
6740
FFFFFFFFFFFFF53C        1431800F                        andi    r3,r3,#0x0F     ; add in the new digit
6741
FFFFFFFFFFFFF540        04118403                        addu    r1,r1,r3
6742
FFFFFFFFFFFFF544        0A210001                        addui   r2,r2,#1        ; increment the no. of digits
6743
FFFFFFFFFFFFF548        BE007E2A                        bra             TN1
6744
FFFFFFFFFFFFF54C                                 TSNMRET:
6745
FFFFFFFFFFFFF54C        47EF8000                        lw              lr,[sp]
6746
FFFFFFFFFFFFF550        37EF8008                        ret             #8
6747 43 robfinch
 
6748
 
6749
                                                 ;===== Skip over blanks in the text pointed to by r8.
6750
                                                 ;
6751
                                                 ; Registers Affected:
6752
                                                 ;      r8
6753
                                                 ; Returns
6754
                                                 ;      r8 = pointer updateded past any spaces or tabs
6755
                                                 ;
6756 46 robfinch
FFFFFFFFFFFFF554                                 IGNBLK:
6757
FFFFFFFFFFFFF554        0FEF0008                        subui   sp,sp,#8
6758
FFFFFFFFFFFFF558        67E08000                        sw              r1,[sp]
6759
FFFFFFFFFFFFF55C                                 IGB2:
6760
FFFFFFFFFFFFF55C        40808000                        lb              r1,[r8]                 ; get char
6761
FFFFFFFFFFFFF560        B0100220                        beqi    r1,#' ',IGB1    ; see if it's a space
6762
FFFFFFFFFFFFF564        B2100300                        bnei    r1,#'\t',IGBRET ; or a tab
6763
FFFFFFFFFFFFF568                                 IGB1:
6764
FFFFFFFFFFFFF568        0A840001                        addui   r8,r8,#1                ; increment the text pointer
6765
FFFFFFFFFFFFF56C        BE007F8A                        bra             IGB2
6766
FFFFFFFFFFFFF570                                 IGBRET:
6767
FFFFFFFFFFFFF570        47E08000                        lw              r1,[sp]
6768
FFFFFFFFFFFFF574        37EF8008                        ret             #8
6769 43 robfinch
 
6770
 
6771
                                                 ; ===== Convert the line of text in the input buffer to upper
6772
                                                 ;      case (except for stuff between quotes).
6773
                                                 ;
6774
                                                 ; Registers Affected
6775
                                                 ;   r1,r3
6776
                                                 ; Returns
6777
                                                 ;      r8 = pointing to end of text in buffer
6778
                                                 ;
6779 46 robfinch
FFFFFFFFFFFFF578                                 TOUPBUF:
6780
FFFFFFFFFFFFF578        0FEF0008                        subui   sp,sp,#8
6781
FFFFFFFFFFFFF57C        67EF8000                        sw              lr,[sp]
6782
FFFFFFFFFFFFF580        9A04111B                        lea             r8,BUFFER       ; set up text pointer
6783
FFFFFFFFFFFFF584        E0C00000                        setlo   r3,#0           ; clear quote flag
6784
FFFFFFFFFFFFF588                                 TOUPB1:
6785
FFFFFFFFFFFFF588        40808000                        lb              r1,[r8]         ; get the next text char.
6786
FFFFFFFFFFFFF58C        0A840001                        addui   r8,r8,#1
6787
FFFFFFFFFFFFF590        B0100D0D                        beqi    r1,#CR,TOUPBRT          ; is it end of line?
6788
FFFFFFFFFFFFF594        B0100622                        beqi    r1,#'"',DOQUO   ; a double quote?
6789
FFFFFFFFFFFFF598        B0100527                        beqi    r1,#'''',DOQUO  ; or a single quote?
6790
FFFFFFFFFFFFF59C        BE307F69                        bne             r3,r0,TOUPB1    ; inside quotes?
6791
FFFFFFFFFFFFF5A0        31FFFD73                        call    toUpper         ; convert to upper case
6792
FFFFFFFFFFFFF5A4        6080FFFF                        sb              r1,-1[r8]       ; store it
6793
FFFFFFFFFFFFF5A8        BE007F0A                        bra             TOUPB1          ; and go back for more
6794
FFFFFFFFFFFFF5AC                                 DOQUO:
6795
FFFFFFFFFFFFF5AC        BE300069                        bne             r3,r0,DOQUO1; are we inside quotes?
6796
FFFFFFFFFFFFF5B0        02118009                        mov             r3,r1           ; if not, toggle inside-quotes flag
6797
FFFFFFFFFFFFF5B4        BE007EAA                        bra             TOUPB1
6798
FFFFFFFFFFFFF5B8                                 DOQUO1:
6799
FFFFFFFFFFFFF5B8        BE30FE89                        bne             r3,r1,TOUPB1            ; make sure we're ending proper quote
6800
FFFFFFFFFFFFF5BC        E0C00000                        setlo   r3,#0           ; else clear quote flag
6801
FFFFFFFFFFFFF5C0        BE007E4A                        bra             TOUPB1
6802
FFFFFFFFFFFFF5C4                                 TOUPBRT:
6803
FFFFFFFFFFFFF5C4        47EF8000                        lw              lr,[sp]
6804
FFFFFFFFFFFFF5C8        37EF8008                        ret             #8
6805 43 robfinch
 
6806
 
6807
                                                 ; ===== Convert the character in r1 to upper case
6808
                                                 ;
6809 46 robfinch
FFFFFFFFFFFFF5CC                                 toUpper
6810
FFFFFFFFFFFFF5CC        A0100361                        blti    r1,#'a',TOUPRET ; is it < 'a'?
6811
FFFFFFFFFFFFF5D0        A610027A                        bgti    r1,#'z',TOUPRET ; or > 'z'?
6812
FFFFFFFFFFFFF5D4        0E108020                        subui   r1,r1,#32       ; if not, make it upper case
6813
FFFFFFFFFFFFF5D8                                 TOUPRET
6814
FFFFFFFFFFFFF5D8        37EF8000                        ret
6815 43 robfinch
 
6816
 
6817
                                                 ; 'CHKIO' checks the input. If there's no input, it will return
6818
                                                 ; to the caller with the r1=0. If there is input, the input byte is in r1.
6819
                                                 ; However, if a control-C is read, 'CHKIO' will warm-start BASIC and will
6820
                                                 ; not return to the caller.
6821
                                                 ;
6822 46 robfinch
FFFFFFFFFFFFF5DC                                 CHKIO:
6823
FFFFFFFFFFFFF5DC        0FEF0008                        subui   sp,sp,#8        ; save link reg
6824
FFFFFFFFFFFFF5E0        67EF8000                        sw              lr,[sp]
6825
FFFFFFFFFFFFF5E4        31FFF7D6                        call    GOIN            ; get input if possible
6826
FFFFFFFFFFFFF5E8        B01003FF                        beqi    r1,#-1,CHKRET2          ; if Zero, no input
6827
FFFFFFFFFFFFF5EC        B2100303                        bnei    r1,#CTRLC,CHKRET        ; is it control-C?
6828
FFFFFFFFFFFFF5F0        33FFF801                        jmp             WSTART          ; if so, do a warm start
6829
FFFFFFFFFFFFF5F4                                 CHKRET2:
6830
FFFFFFFFFFFFF5F4        0410840A                        xor             r1,r1,r1
6831
FFFFFFFFFFFFF5F8                                 CHKRET:
6832
FFFFFFFFFFFFF5F8        47EF8000                        lw              lr,[sp]         ;r1=0
6833
FFFFFFFFFFFFF5FC        37EF8008                        ret             #8
6834 43 robfinch
 
6835
 
6836
                                                 ; ===== Display a CR-LF sequence
6837
                                                 ;
6838 46 robfinch
FFFFFFFFFFFFF600                                 CRLF:
6839
FFFFFFFFFFFFF600        E07FF703                        setlo   r1,CLMSG
6840 43 robfinch
 
6841
 
6842
                                                 ; ===== Display a zero-ended string pointed to by register r1
6843
                                                 ; Registers Affected
6844
                                                 ;   r1,r2,r4
6845
                                                 ;
6846 46 robfinch
FFFFFFFFFFFFF604                                 PRMESG:
6847
FFFFFFFFFFFFF604        0FEF0010                        subui   sp,sp,#16
6848
FFFFFFFFFFFFF608        67E28000                        sw              r5,[sp]
6849
FFFFFFFFFFFFF60C        67EF8008                        sw              lr,8[sp]
6850
FFFFFFFFFFFFF610        02128009                        mov     r5,r1       ; r5 = pointer to message
6851
FFFFFFFFFFFFF614                                 PRMESG1:
6852
FFFFFFFFFFFFF614        0A528001                        addui   r5,r5,#1
6853
FFFFFFFFFFFFF618        4A50FFFF                        lbu             r1,-1[r5]       ;       get the char.
6854
FFFFFFFFFFFFF61C        BE100068                        beq             r1,r0,PRMRET
6855
FFFFFFFFFFFFF620        31FFF7D5                        call    GOOUT           ;else display it trashes r4
6856
FFFFFFFFFFFFF624        BE007F8A                        bra             PRMESG1
6857
FFFFFFFFFFFFF628                                 PRMRET:
6858
FFFFFFFFFFFFF628        02508009                        mov             r1,r5
6859
FFFFFFFFFFFFF62C        47EF8008                        lw              lr,8[sp]
6860
FFFFFFFFFFFFF630        47E28000                        lw              r5,[sp]
6861
FFFFFFFFFFFFF634        37EF8010                        ret             #16
6862 43 robfinch
 
6863
 
6864
                                                 ; ===== Display a zero-ended string pointed to by register r1
6865
                                                 ; Registers Affected
6866
                                                 ;   r1,r2,r3
6867
                                                 ;
6868 46 robfinch
FFFFFFFFFFFFF638                                 PRMESGAUX:
6869
FFFFFFFFFFFFF638        0FEF0010                        subui   sp,sp,#16
6870
FFFFFFFFFFFFF63C        67E28000                        sw              r5,[sp]
6871
FFFFFFFFFFFFF640        67EF8008                        sw              lr,8[sp]
6872
FFFFFFFFFFFFF644        02128009                        mov     r5,r1       ; r3 = pointer
6873
FFFFFFFFFFFFF648                                 PRMESGA1:
6874
FFFFFFFFFFFFF648        0A528001                        addui   r5,r5,#1
6875
FFFFFFFFFFFFF64C        4050FFFF                        lb              r1,-1[r5]       ;       get the char.
6876
FFFFFFFFFFFFF650        BE100068                        beq             r1,r0,PRMRETA
6877
FFFFFFFFFFFFF654        31FFF7D7                        call    GOAUXO          ;else display it
6878
FFFFFFFFFFFFF658        BE007F8A                        bra             PRMESGA1
6879
FFFFFFFFFFFFF65C                                 PRMRETA:
6880
FFFFFFFFFFFFF65C        02508009                        mov             r1,r5
6881
FFFFFFFFFFFFF660        47EF8008                        lw              lr,8[sp]
6882
FFFFFFFFFFFFF664        47E28000                        lw              r5,[sp]
6883
FFFFFFFFFFFFF668        37EF8010                        ret             #16
6884 43 robfinch
 
6885
                                                 ;*****************************************************
6886
                                                 ; The following routines are the only ones that need *
6887
                                                 ; to be changed for a different I/O environment.     *
6888
                                                 ;*****************************************************
6889
 
6890
 
6891
                                                 ; ===== Output character to the console (Port 1) from register r1
6892
                                                 ;      (Preserves all registers.)
6893
                                                 ;
6894 46 robfinch
FFFFFFFFFFFFF66C                                 OUTC:
6895
FFFFFFFFFFFFF66C        33FFF07F                        jmp             DisplayChar
6896 43 robfinch
 
6897
 
6898 46 robfinch
                                                 ; ===== Input a character from the console into register R1 (or
6899 43 robfinch
                                                 ;      return Zero status if there's no character available).
6900
                                                 ;
6901 46 robfinch
FFFFFFFFFFFFF670                                 INC:
6902
FFFFFFFFFFFFF670        33FFEF07                        jmp             KeybdGetChar
6903 43 robfinch
 
6904
 
6905
                                                 ;*
6906
                                                 ;* ===== Input a character from the host into register r1 (or
6907 27 robfinch
                                                 ;*     return Zero status if there's no character available).
6908
                                                 ;*
6909 46 robfinch
FFFFFFFFFFFFF674                                 AUXIN:
6910
FFFFFFFFFFFFF674        31FFEDA4                        call    SerialGetChar
6911
FFFFFFFFFFFFF678        B01003FF                        beqi    r1,#-1,AXIRET_ZERO
6912
FFFFFFFFFFFFF67C        1410807F                        andi    r1,r1,#0x7f             ;zero out the high bit
6913
FFFFFFFFFFFFF680                                 AXIRET:
6914
FFFFFFFFFFFFF680        37EF8000                        ret
6915
FFFFFFFFFFFFF684                                 AXIRET_ZERO:
6916
FFFFFFFFFFFFF684        0410840A                        xor             r1,r1,r1
6917
FFFFFFFFFFFFF688        37EF8000                        ret
6918 27 robfinch
 
6919 43 robfinch
                                                 ; ===== Output character to the host (Port 2) from register r1
6920
                                                 ;      (Preserves all registers.)
6921
                                                 ;
6922 46 robfinch
FFFFFFFFFFFFF68C                                 AUXOUT
6923
FFFFFFFFFFFFF68C        33FFED5C                        jmp             SerialPutChar   ; call boot rom routine
6924 43 robfinch
 
6925
 
6926 46 robfinch
FFFFFFFFFFFFF690                                 _cls
6927
FFFFFFFFFFFFF690        31FFF011                        call    clearScreen
6928
FFFFFFFFFFFFF694        BE00742A                        bra             FINISH
6929 43 robfinch
 
6930 46 robfinch
FFFFFFFFFFFFF698                                 _wait10
6931
FFFFFFFFFFFFF698        37EF8000                        ret
6932
FFFFFFFFFFFFF69C                                 _getATAStatus
6933
FFFFFFFFFFFFF69C        37EF8000                        ret
6934
FFFFFFFFFFFFF6A0                                 _waitCFNotBusy
6935
FFFFFFFFFFFFF6A0        37EF8000                        ret
6936
FFFFFFFFFFFFF6A4                                 _rdcf
6937
FFFFFFFFFFFFF6A4        BE0073AA                        br              FINISH
6938
FFFFFFFFFFFFF6A8                                 rdcf6
6939
FFFFFFFFFFFFF6A8        BE004C0A                        br              ERROR
6940 43 robfinch
 
6941
 
6942
                                                 ; ===== Return to the resident monitor, operating system, etc.
6943
                                                 ;
6944 46 robfinch
FFFFFFFFFFFFF6AC                                 BYEBYE:
6945
FFFFFFFFFFFFF6AC        460F1088                        lw              sp,OSSP
6946
FFFFFFFFFFFFF6B0        47EF8000                     lw      lr,[sp]
6947
FFFFFFFFFFFFF6B4        37EF8008                        ret             #8
6948 43 robfinch
 
6949
                                                 ;      MOVE.B  #228,D7         return to Tutor
6950
                                                 ;      TRAP    #14
6951
 
6952 46 robfinch
FFFFFFFFFFFFF6B8 726F747061520A0D        msgInit db     CR,LF,"Raptor64 Tiny BASIC v1.0",CR,LF,"(C) 2013  Robert Finch",CR,LF,LF,0
6953
FFFFFFFFFFFFF6C0 20796E6954203436
6954
FFFFFFFFFFFFF6C8 3176204349534142
6955
FFFFFFFFFFFFF6D0 202943280A0D302E
6956
FFFFFFFFFFFFF6D8 6F52202033313032
6957
FFFFFFFFFFFFF6E0 6E69462074726562
6958
FFFFFFFFFFFFF6E8 0A0D000A0A0D6863        OKMSG  db      CR,LF,"OK",CR,LF,0
6959
FFFFFFFFFFFFF6F0 616857000A0D4B4F        msgWhat        db      "What?",CR,LF,0
6960
FFFFFFFFFFFFF6F8 726F53000A0D3F74        SRYMSG db      "Sorry."
6961
FFFFFFFFFFFFF700 6F43000A0D2E7972        msgReadError   db      "Compact FLASH read error",CR,LF,0
6962
FFFFFFFFFFFFF708 4C4620746361706D
6963
FFFFFFFFFFFFF710 6461657220485341
6964
FFFFFFFFFFFFF718 0A0D726F72726520
6965
FFFFFFFFFFFFF720 207265626D754E00        msgNumTooBig   db      "Number is too big",CR,LF,0
6966
FFFFFFFFFFFFF728 62206F6F74207369
6967
FFFFFFFFFFFFF730 766944000A0D6769        msgDivZero             db      "Division by zero",CR,LF,0
6968
FFFFFFFFFFFFF738 7962206E6F697369
6969
FFFFFFFFFFFFF740 000A0D6F72657A20
6970
FFFFFFFFFFFFF748 7620666F2074754F        msgVarSpace     db  "Out of variable space",CR,LF,0
6971
FFFFFFFFFFFFF750 20656C6261697261
6972
FFFFFFFFFFFFF758 000A0D6563617073
6973
FFFFFFFFFFFFF760 6620736574796220        msgBytesFree   db      " bytes free",CR,LF,0
6974
FFFFFFFFFFFFF768 0A0D000A0D656572        msgReady               db      CR,LF,"Ready",CR,LF,0
6975
FFFFFFFFFFFFF770 000A0D7964616552
6976
FFFFFFFFFFFFF778 6E69746365707845        msgComma               db      "Expecting a comma",CR,LF,0
6977
FFFFFFFFFFFFF780 6D6D6F6320612067
6978
FFFFFFFFFFFFF788 656E694C000A0D61        msgLineRange   db      "Line number too big",CR,LF,0
6979
FFFFFFFFFFFFF790 207265626D756E20
6980
FFFFFFFFFFFFF798 0D676962206F6F74
6981
FFFFFFFFFFFFF7A0 746365707845000A        msgVar                 db      "Expecting a variable",CR,LF,0
6982
FFFFFFFFFFFFF7A8 6176206120676E69
6983
FFFFFFFFFFFFF7B0 0A0D656C62616972
6984
FFFFFFFFFFFFF7B8 64616220444E5200        msgRNDBad              db      "RND bad parameter",CR,LF,0
6985
FFFFFFFFFFFFF7C0 74656D6172617020
6986
FFFFFFFFFFFFF7C8 535953000A0D7265        msgSYSBad              db      "SYS bad address",CR,LF,0
6987
FFFFFFFFFFFFF7D0 6464612064616220
6988
FFFFFFFFFFFFF7D8 49000A0D73736572        msgInputVar            db      "INPUT expecting a variable",CR,LF,0
6989
FFFFFFFFFFFFF7E0 707865205455504E
6990
FFFFFFFFFFFFF7E8 6120676E69746365
6991
FFFFFFFFFFFFF7F0 6C62616972617620
6992
FFFFFFFFFFFFF7F8 5458454E000A0D65        msgNextFor             db      "NEXT without FOR",CR,LF,0
6993
FFFFFFFFFFFFF800 74756F6874697720
6994
FFFFFFFFFFFFF808 4E000A0D524F4620        msgNextVar             db      "NEXT expecting a defined variable",CR,LF,0
6995
FFFFFFFFFFFFF810 6570786520545845
6996
FFFFFFFFFFFFF818 206120676E697463
6997
FFFFFFFFFFFFF820 2064656E69666564
6998
FFFFFFFFFFFFF828 656C626169726176
6999
FFFFFFFFFFFFF830 2F4F544F47000A0D        msgBadGotoGosub        db      "GOTO/GOSUB bad line number",CR,LF,0
7000
FFFFFFFFFFFFF838 6162204255534F47
7001
FFFFFFFFFFFFF840 6E20656E696C2064
7002
FFFFFFFFFFFFF848 000A0D7265626D75
7003
FFFFFFFFFFFFF850 77204E5255544552        msgRetWoGosub   db     "RETURN without GOSUB",CR,LF,0
7004
FFFFFFFFFFFFF858 472074756F687469
7005
FFFFFFFFFFFFF860 50000A0D4255534F        msgTooBig              db      "Program is too big",CR,LF,0
7006
FFFFFFFFFFFFF868 69206D6172676F72
7007
FFFFFFFFFFFFF870 6962206F6F742073
7008
FFFFFFFFFFFFF878 72747845000A0D67        msgExtraChars  db      "Extra characters on line ignored",CR,LF,0
7009
FFFFFFFFFFFFF880 6361726168632061
7010
FFFFFFFFFFFFF888 206E6F2073726574
7011
FFFFFFFFFFFFF890 6E676920656E696C
7012 43 robfinch
 
7013 46 robfinch
FFFFFFFFFFFFF898 00000A0D6465726F               align   8
7014
FFFFFFFFFFFFF8A0                                        align   8
7015 43 robfinch
                                                 LSTROM equ     *               ; end of possible ROM area
7016
                                                 ;      END
7017
 
7018 27 robfinch
                                                 ;*
7019
                                                 ;* ===== Return to the resident monitor, operating system, etc.
7020
                                                 ;*
7021 46 robfinch
FFFFFFFFFFFFF8A0                                 BYEBYE:
7022
FFFFFFFFFFFFF8A0        33FFF20A                        jmp             Monitor
7023 27 robfinch
                                                 ;    MOVE.B    #228,D7         ;return to Tutor
7024
                                                 ;      TRAP    #14
7025
 
7026
                                                 ;==============================================================================
7027 10 robfinch
                                                 ; Checkerboard RAM tester
7028
                                                 ;==============================================================================
7029
                                                 ;
7030 46 robfinch
FFFFFFFFFFFFF8A4                                        code
7031
FFFFFFFFFFFFF8A0 0000000033FFF20A               align   16
7032
FFFFFFFFFFFFF8A8 0000000000000000
7033
FFFFFFFFFFFFF8B0                                        align   16
7034
FFFFFFFFFFFFF8B0                                 ramtest:
7035
FFFFFFFFFFFFF8B0        04002009                        or              r8,r0,r0                ; r8 = 0
7036
FFFFFFFFFFFFF8B4        E6AA5555                ; SETLO
7037
FFFFFFFFFFFFF8B8        EE9556AA                ; SETMID
7038
FFFFFFFFFFFFF8BC        F68AAAA5                ; SETHI
7039
FFFFFFFFFFFFF8C0        040D0409                        ori             r1,r0,#0xAAAA5555AAAA5555       ; checkerboard pattern
7040
FFFFFFFFFFFFF8C4                                 ramtest2:
7041
FFFFFFFFFFFFF8C4        66808000                        sw              r1,[r8]                 ; save the checkerboard to memory
7042
FFFFFFFFFFFFF8C8        46810000                        lw              r2,[r8]                 ; read it back
7043
FFFFFFFFFFFFF8CC        04110C06                        cmp             r3,r1,r2                ; is it the same ?
7044
FFFFFFFFFFFFF8D0        BE3000C9                        bne     r3,r0,ramtest1
7045
FFFFFFFFFFFFF8D4        0A840008                        addui   r8,r8,#8                ; increment RAM pointer
7046
FFFFFFFFFFFFF8D8        E6800000                ; SETLO
7047
FFFFFFFFFFFFF8DC        EE800010                ; SETMID
7048
FFFFFFFFFFFFF8E0        048D0C06                        cmpi    r3,r8,#0x0000_0000_0400_0000
7049
FFFFFFFFFFFFF8E4        BE307F00                        blt             r3,r0,ramtest2
7050
FFFFFFFFFFFFF8E8                                 ramtest1:
7051
FFFFFFFFFFFFF8E8        04802809                        or              r10,r8,r0               ; r10 = max ram address
7052 10 robfinch
                                                        ; readback the checkerboard pattern
7053 46 robfinch
FFFFFFFFFFFFF8EC        04002009                        or              r8,r0,r0                ; r8 = 0
7054
FFFFFFFFFFFFF8F0                                 ramtest4:
7055
FFFFFFFFFFFFF8F0        46810000                        lw              r2,[r8]
7056
FFFFFFFFFFFFF8F4        E6AA5555                ; SETLO
7057
FFFFFFFFFFFFF8F8        EE9556AA                ; SETMID
7058
FFFFFFFFFFFFF8FC        F68AAAA5                ; SETHI
7059
FFFFFFFFFFFFF900        042D0C06                        cmpi    r3,r2,#0xAAAA5555AAAA5555
7060
FFFFFFFFFFFFF904        BE3000C9                        bne             r3,r0,ramtest3
7061
FFFFFFFFFFFFF908        08840008                        addi    r8,r8,#8
7062
FFFFFFFFFFFFF90C        E6800000                ; SETLO
7063
FFFFFFFFFFFFF910        EE800004                ; SETMID
7064
FFFFFFFFFFFFF914        048D0C06                        cmpi    r3,r8,#0x0000_0000_0100_0000
7065
FFFFFFFFFFFFF918        BE307EC0                        blt     r3,r0,ramtest4
7066
FFFFFFFFFFFFF91C                                 ramtest3:
7067
FFFFFFFFFFFFF91C        BE850389                        bne             r8,r10,ramtest8 ; check for equal maximum address
7068 10 robfinch
 
7069
                                                        ; perform ramtest again with inverted checkerboard
7070 46 robfinch
FFFFFFFFFFFFF920        04002009                        or              r8,r0,r0                ; r8 = 0
7071
FFFFFFFFFFFFF924        E695AAAA                ; SETLO
7072
FFFFFFFFFFFFF928        EEAAA955                ; SETMID
7073
FFFFFFFFFFFFF92C        F685555A                ; SETHI
7074
FFFFFFFFFFFFF930        040D0409                        ori             r1,r0,#0x5555AAAA5555AAAA
7075
FFFFFFFFFFFFF934                                 ramtest5:
7076
FFFFFFFFFFFFF934        66808000                        sw              r1,[r8]
7077
FFFFFFFFFFFFF938        46810000                        lw              r2,[r8]
7078
FFFFFFFFFFFFF93C        04110C06                        cmp             r3,r1,r2
7079
FFFFFFFFFFFFF940        BE3000C9                        bne             r3,r0,ramtest6
7080
FFFFFFFFFFFFF944        08840008                        addi    r8,r8,#8
7081
FFFFFFFFFFFFF948        E6800000                ; SETLO
7082
FFFFFFFFFFFFF94C        EE800004                ; SETMID
7083
FFFFFFFFFFFFF950        048D0C06                        cmpi    r3,r8,#0x0000_0000_0100_0000
7084
FFFFFFFFFFFFF954        BE307F00                        blt             r3,r0,ramtest5
7085
FFFFFFFFFFFFF958                                 ramtest6:
7086
FFFFFFFFFFFFF958        04802C09                        or              r11,r8,r0               ; r11 = max ram address
7087 10 robfinch
                                                        ; readback checkerboard
7088 46 robfinch
FFFFFFFFFFFFF95C        04002009                        or              r8,r0,r0
7089
FFFFFFFFFFFFF960                                 ramtest7:
7090
FFFFFFFFFFFFF960        46810000                        lw              r2,[r8]
7091
FFFFFFFFFFFFF964        E695AAAA                ; SETLO
7092
FFFFFFFFFFFFF968        EEAAA955                ; SETMID
7093
FFFFFFFFFFFFF96C        F685555A                ; SETHI
7094
FFFFFFFFFFFFF970        042D0C06                        cmpi    r3,r2,#0x5555AAAA5555AAAA
7095
FFFFFFFFFFFFF974        BE3000C9                        bne             r3,r0,ramtest8
7096
FFFFFFFFFFFFF978        08840008                        addi    r8,r8,#8
7097
FFFFFFFFFFFFF97C        E6800000                ; SETLO
7098
FFFFFFFFFFFFF980        EE800004                ; SETMID
7099
FFFFFFFFFFFFF984        048D0C06                        cmpi    r3,r8,#0x0000_0000_0100_0000
7100
FFFFFFFFFFFFF988        BE307EC0                        blt             r3,r0,ramtest7
7101
FFFFFFFFFFFFF98C                                 ramtest8:
7102
FFFFFFFFFFFFF98C        BE858048                        beq             r8,r11,ramtest9
7103
FFFFFFFFFFFFF990        0485A014                        min             r8,r8,r11
7104
FFFFFFFFFFFFF994                                 ramtest9:
7105
FFFFFFFFFFFFF994        BE850048                        beq             r8,r10,ramtest10
7106
FFFFFFFFFFFFF998        04852014                        min             r8,r8,r10
7107
FFFFFFFFFFFFF99C                                 ramtest10:
7108
FFFFFFFFFFFFF99C        66040400                        sw              r8,0x00000400   ;memend
7109
FFFFFFFFFFFFF9A0        37EF8000                        ret
7110 27 robfinch
 
7111
                                                 ;-------------------------------------------
7112
                                                 ;-------------------------------------------
7113 43 robfinch
                                                 ;
7114 46 robfinch
FFFFFFFFFFFFF9A4                                 iberr_rout:
7115
FFFFFFFFFFFFF9A4        9A00FA3B                        lea             r1,msgiberr
7116
FFFFFFFFFFFFF9A8        31FFF122                        call    DisplayString
7117
FFFFFFFFFFFFF9AC        020085E8                        mfspr   r1,EPC
7118
FFFFFFFFFFFFF9B0        31FFF169                        call    DisplayWord
7119
FFFFFFFFFFFFF9B4        00000028                        wait
7120
FFFFFFFFFFFFF9B8        33FFEC0B                        jmp             start
7121
FFFFFFFFFFFFF9BC                                 dberr_rout:
7122
FFFFFFFFFFFFF9BC        E6A00100                ; SETLO
7123
FFFFFFFFFFFFF9C0        EE800400                ; SETMID
7124
FFFFFFFFFFFFF9C4        040D7809                        lw              sp,#0x100200100
7125
FFFFFFFFFFFFF9C8        9A00FA20                        lea             r1,msgdberr
7126
FFFFFFFFFFFFF9CC        31FFF122                        call    DisplayString
7127
FFFFFFFFFFFFF9D0        02008628                        mfspr   r1,ERRADR
7128
FFFFFFFFFFFFF9D4        31FFF169                        call    DisplayWord
7129
FFFFFFFFFFFFF9D8        9A00FA34                        lea             r1,msgEPC
7130
FFFFFFFFFFFFF9DC        31FFF122                        call    DisplayString
7131
FFFFFFFFFFFFF9E0        020085E8                        mfspr   r1,EPC
7132
FFFFFFFFFFFFF9E4        31FFF169                        call    DisplayWord
7133
FFFFFFFFFFFFF9E8        31FFFD80                        call    CRLF
7134
FFFFFFFFFFFFF9EC        1601001F                        lw              r2,#31
7135
FFFFFFFFFFFFF9F0                                 dberr1:
7136
FFFFFFFFFFFFF9F0        02200FA9                        mtspr   PCHI,r2
7137
FFFFFFFFFFFFF9F4        DE000000                        nop
7138
FFFFFFFFFFFFF9F8        DE000000                        nop
7139
FFFFFFFFFFFFF9FC        DE000000                        nop
7140
FFFFFFFFFFFFFA00        02008FE8                        mfspr   r1,PCHISTORIC
7141
FFFFFFFFFFFFFA04        31FFF169                        call    DisplayWord
7142
FFFFFFFFFFFFFA08        31FFFD80                        call    CRLF
7143
FFFFFFFFFFFFFA0C        BE017F2F                        loop    r2,dberr1
7144
FFFFFFFFFFFFFA10        00000028                        wait
7145
FFFFFFFFFFFFFA14        33FFEC0B                        jmp             start
7146
FFFFFFFFFFFFFA18 0000000000000000               .align  16
7147
FFFFFFFFFFFFFA20                                        .align  16
7148
FFFFFFFFFFFFFA20                                 msgdberr:
7149
FFFFFFFFFFFFFA20 7375622061746144               db      "Data bus error at: ",0
7150
FFFFFFFFFFFFFA28 6120726F72726520
7151
FFFFFFFFFFFFFA34                                 msgEPC:
7152
FFFFFFFFFFFFFA30 4350452000203A74               db      " EPC: ",0
7153
FFFFFFFFFFFFFA3B                                 msgiberr:
7154
FFFFFFFFFFFFFA38 662072724500203A               db      "Err fetching instruction at: ",0
7155
FFFFFFFFFFFFFA40 20676E6968637465
7156
FFFFFFFFFFFFFA48 7463757274736E69
7157
FFFFFFFFFFFFFA50 203A7461206E6F69
7158
FFFFFFFFFFFFFA5C                                        .align  4
7159 27 robfinch
 
7160 43 robfinch
                                                 ;------------------------------------------------------------------------------
7161
                                                 ; IRQ routine
7162 46 robfinch
                                                 ;
7163
                                                 ; Interrupts are automatically disabled at the time of the interrupt in order
7164
                                                 ; to prevent nested interrupts from occuring. Interrupts are re-enabled by
7165
                                                 ; the IRET instruction at the end of the interrupt routine. If the interrupt
7166
                                                 ; turns out to not match a hardware interrupt, then a software context
7167
                                                 ; switching interrupt is assumed.
7168
                                                 ;
7169
                                                 ; This routine uses it's own private interrupt stack; the stack of the
7170
                                                 ; interrupted context is not used at all. A couple of working registers are
7171
                                                 ; saved off not on the stack. We can get away with this because nested
7172
                                                 ; interrupts are not allowed.
7173 43 robfinch
                                                 ;------------------------------------------------------------------------------
7174
                                                 ;
7175 46 robfinch
FFFFFFFFFFFFFA5C                                 irqrout:
7176
FFFFFFFFFFFFFA5C        660F1460                        sw              sp,sp_save                              ; use our own private stack for interrupt processing
7177
FFFFFFFFFFFFFA60        660F9468                        sw              lr,lr_save                              ; so, save off the sp and working registers
7178
FFFFFFFFFFFFFA64        660D1480                        sw              r26,r26_save
7179
FFFFFFFFFFFFFA68        66009470                        sw              r1,r1_save
7180
FFFFFFFFFFFFFA6C        66011478                        sw              r2,r2_save
7181
 
7182
FFFFFFFFFFFFFA70        E6801000                ; SETLO
7183
FFFFFFFFFFFFFA74        EE800400                ; SETMID
7184
FFFFFFFFFFFFFA78        040D7809                        lw              sp,#0x1_00001000                ; the second two kbytes
7185
FFFFFFFFFFFFFA7C        E69C0FF0                ; SETLO
7186
FFFFFFFFFFFFFA80        EE800003                ; SETMID
7187
FFFFFFFFFFFFFA84        6A0D0421                        inch    r1,PIC                                  ; r1= which IRQ line is active
7188
 
7189
                                                 ; Dispatch fork, in order of required timeliness
7190
 
7191
FFFFFFFFFFFFFA88        B0100D02                        beqi    r1,#2,irq1000Hz
7192
FFFFFFFFFFFFFA8C        B0101903                        beqi    r1,#3,irq100Hz
7193
FFFFFFFFFFFFFA90        B0102008                        beqi    r1,#8,irqSerial
7194
FFFFFFFFFFFFFA94        B010220D                        beqi    r1,#13,irqRaster
7195
FFFFFFFFFFFFFA98        B010240F                        beqi    r1,#15,irqKeybd
7196
FFFFFFFFFFFFFA9C        B0102601                        beqi    r1,#1,irqColdStart              ; CTRL-ALT-DEL interrupt
7197
 
7198
                                                 ; Here, none of the hardware interrupts were active so
7199
                                                 ; assume software context switch interrupt
7200
                                                 ;
7201
FFFFFFFFFFFFFAA0        460F1460                        lw              sp,sp_save
7202
FFFFFFFFFFFFFAA4        460F9468                        lw              lr,lr_save
7203
FFFFFFFFFFFFFAA8        460D1480                        lw              r26,r26_save
7204
FFFFFFFFFFFFFAAC        46009470                        lw              r1,r1_save
7205
FFFFFFFFFFFFFAB0        46011478                        lw              r2,r2_save
7206
FFFFFFFFFFFFFAB4        0000000F                        iepp
7207
FFFFFFFFFFFFFAB8        01900020                        iret
7208 43 robfinch
 
7209
                                                 ; 1000 Hz interrupt
7210 46 robfinch
                                                 ; This IRQ must be fast, so it's placed inline. It's also the first
7211
                                                 ; IRQ checked for in the interrupt dispatch.
7212 43 robfinch
                                                 ; Increments the millisecond counter, and switches to the next context
7213
                                                 ;
7214 46 robfinch
FFFFFFFFFFFFFABC                                 irq1000Hz:
7215
FFFFFFFFFFFFFABC        E69CFFFD                ; SETLO
7216
FFFFFFFFFFFFFAC0        EE800003                ; SETMID
7217
FFFFFFFFFFFFFAC4        6A0D0028                        outb    r0,0xDCFFFD                             ; acknowledge interrupt
7218
FFFFFFFFFFFFFAC8        46009400                        lw              r1,Milliseconds                 ; increment milliseconds count
7219
FFFFFFFFFFFFFACC        0A108001                        addui   r1,r1,#1
7220
FFFFFFFFFFFFFAD0        66009400                        sw              r1,Milliseconds
7221
FFFFFFFFFFFFFAD4        460F1460                        lw              sp,sp_save
7222
FFFFFFFFFFFFFAD8        460F9468                        lw              lr,lr_save
7223
FFFFFFFFFFFFFADC        460D1480                        lw              r26,r26_save
7224
FFFFFFFFFFFFFAE0        46009470                        lw              r1,r1_save
7225
FFFFFFFFFFFFFAE4        46011478                        lw              r2,r2_save
7226
FFFFFFFFFFFFFAE8        0000000F                        iepp                                                    ; move to the next context
7227
FFFFFFFFFFFFFAEC        01900020                        iret                                                    ; return to the next context
7228 43 robfinch
 
7229
                                                 ; 100 Hz interrupt
7230
                                                 ; This IRQ could have some work to do, including flashing a cursor. So
7231
                                                 ; we call a subroutine.
7232
                                                 ;
7233 46 robfinch
FFFFFFFFFFFFFAF0                                 irq100Hz:
7234
FFFFFFFFFFFFFAF0        4600B000                        lw              r1,p100IRQvec
7235 43 robfinch
                                                 ;      jal             lr,[r1]
7236 46 robfinch
FFFFFFFFFFFFFAF4        31FFEF73                        call    Pulse100
7237
FFFFFFFFFFFFFAF8                                 irqret:
7238
FFFFFFFFFFFFFAF8        460F1460                        lw              sp,sp_save
7239
FFFFFFFFFFFFFAFC        460F9468                        lw              lr,lr_save
7240
FFFFFFFFFFFFFB00        460D1480                        lw              r26,r26_save
7241
FFFFFFFFFFFFFB04        46009470                        lw              r1,r1_save
7242
FFFFFFFFFFFFFB08        46011478                        lw              r2,r2_save
7243
FFFFFFFFFFFFFB0C        01900020                        iret
7244 43 robfinch
 
7245 46 robfinch
FFFFFFFFFFFFFB10                                 irqSerial:
7246
FFFFFFFFFFFFFB10        4600B010                        lw              r1,serialIRQvec
7247
FFFFFFFFFFFFFB14        341F8000                        jal             lr,[r1]
7248
FFFFFFFFFFFFFB18        BE007F0A                        bra             irqret
7249 43 robfinch
 
7250 46 robfinch
FFFFFFFFFFFFFB1C                                 irqRaster:
7251
FFFFFFFFFFFFFB1C        4600B018                        lw              r1,rasterIRQvec
7252 43 robfinch
                                                 ;      jal             lr,[r1]
7253 46 robfinch
FFFFFFFFFFFFFB20        31FFF46B                        call    RasterIRQfn
7254
FFFFFFFFFFFFFB24        BE007EAA                        bra             irqret
7255 43 robfinch
 
7256 46 robfinch
FFFFFFFFFFFFFB28                                 irqKeybd:
7257
FFFFFFFFFFFFFB28        4600B008                        lw              r1,keybdIRQvec
7258
FFFFFFFFFFFFFB2C        31FFEEF0                        call    KeybdIRQ
7259 43 robfinch
                                                 ;      jal             lr,[r1]
7260 46 robfinch
FFFFFFFFFFFFFB30        BE007E4A                        bra             irqret
7261 43 robfinch
 
7262 46 robfinch
FFFFFFFFFFFFFB34                                 irqColdStart:
7263
FFFFFFFFFFFFFB34        33FFEC0B                        jmp             ColdStart
7264 43 robfinch
 
7265 46 robfinch
                                                 ;------------------------------------------------------------------------------
7266 27 robfinch
                                                 ; NMI routine
7267 46 robfinch
                                                 ;
7268
                                                 ; The NMI line is tied to the parity error signal. But also any non-initialized
7269
                                                 ; interrupts get sent here.
7270
                                                 ;------------------------------------------------------------------------------
7271
                                                 ;
7272
FFFFFFFFFFFFFB38                                 nmirout:
7273
FFFFFFFFFFFFFB38        660F1460                        sw              sp,sp_save
7274
FFFFFFFFFFFFFB3C        66009470                        sw              r1,r1_save
7275
FFFFFFFFFFFFFB40        660D1480                        sw              r26,r26_save
7276
FFFFFFFFFFFFFB44        E6801000                ; SETLO
7277
FFFFFFFFFFFFFB48        EE800400                ; SETMID
7278
FFFFFFFFFFFFFB4C        040D7809                        lw              sp,#0x100001000
7279
FFFFFFFFFFFFFB50        E69CFFFE                ; SETLO
7280
FFFFFFFFFFFFFB54        EE800003                ; SETMID
7281
FFFFFFFFFFFFFB58        6A0D0028                        outb    r0,0xDCFFFE             ; acknowledge interrupt
7282
FFFFFFFFFFFFFB5C        9A00FB80                        lea             r1,msgPerr
7283
FFFFFFFFFFFFFB60        31FFF122                        call    DisplayString
7284
FFFFFFFFFFFFFB64        02008868                        mfspr   r1,IPC
7285
FFFFFFFFFFFFFB68        31FFF169                        call    DisplayWord
7286
FFFFFFFFFFFFFB6C        31FFFD80                        call    CRLF
7287
FFFFFFFFFFFFFB70        460F1460                        lw              sp,sp_save
7288
FFFFFFFFFFFFFB74        46009470                        lw              r1,r1_save
7289
FFFFFFFFFFFFFB78        460D1480                        lw              r26,r26_save
7290
FFFFFFFFFFFFFB7C        01900020                        iret
7291
 
7292
FFFFFFFFFFFFFB80                                 msgPerr:
7293
FFFFFFFFFFFFFB80 6520797469726150               db      "Parity error at: ",0
7294
FFFFFFFFFFFFFB88 3A746120726F7272
7295
 
7296
 
7297 27 robfinch
                                                 ;-------------------------------------------
7298 46 robfinch
                                                 ; Unimplemented instructions end up here
7299
                                                 ;-------------------------------------------
7300
FFFFFFFFFFFFFB94                                        .align 4
7301
FFFFFFFFFFFFFB94                                 ui_irout:
7302
FFFFFFFFFFFFFB94        0FEF0008                        subui   sp,sp,#8
7303
FFFFFFFFFFFFFB98        67E08000                        sw              r1,[sp]
7304
FFFFFFFFFFFFFB9C        9A00FBC0                        lea             r1,msgUnimp
7305
FFFFFFFFFFFFFBA0        31FFF122                        call    DisplayString
7306
FFFFFFFFFFFFFBA4        02008868                        mfspr   r1,IPC
7307
FFFFFFFFFFFFFBA8        31FFF169                        call    DisplayWord
7308
FFFFFFFFFFFFFBAC        31FFFD80                        call    CRLF
7309
FFFFFFFFFFFFFBB0        47E08000                        lw              r1,[sp]
7310
FFFFFFFFFFFFFBB4        0BEF0008                        addui   sp,sp,#8
7311
                                                        ; hang the context
7312
FFFFFFFFFFFFFBB8                                 ui_irout1:
7313
FFFFFFFFFFFFFBB8        BE00000A                        bra             ui_irout1
7314
FFFFFFFFFFFFFBBC        01900020                        iret
7315 27 robfinch
 
7316 46 robfinch
FFFFFFFFFFFFFBC0                                 msgUnimp:
7317
FFFFFFFFFFFFFBC0 6D656C706D696E55               db      "Unimplemented instruction at: ",0
7318
FFFFFFFFFFFFFBC8 6E69206465746E65
7319
FFFFFFFFFFFFFBD0 6F69746375727473
7320
 
7321 27 robfinch
                                                 ;-------------------------------------------
7322
                                                 ; Handle miss on Data TLB
7323
                                                 ;-------------------------------------------
7324 46 robfinch
FFFFFFFFFFFFFBD8 0000203A7461206E               .align  4
7325
FFFFFFFFFFFFFBE0                                        .align  4
7326
FFFFFFFFFFFFFBE0                                 DTLBHandler:
7327
FFFFFFFFFFFFFBE0        E6BF0000                ; SETLO
7328
FFFFFFFFFFFFFBE4        6A0D0413                        sw              r1,0xFFFF_FFFF_FFFF_0000
7329
FFFFFFFFFFFFFBE8        E6BF0008                ; SETLO
7330
FFFFFFFFFFFFFBEC        6A0D0813                        sw              r2,0xFFFF_FFFF_FFFF_0008
7331
FFFFFFFFFFFFFBF0                                 dh1:
7332
FFFFFFFFFFFFFBF0        02008034                        omgi    r1,#0           ; try open mutex gate #0 (TLB protector)
7333
FFFFFFFFFFFFFBF4        BE107FE9                        bne             r1,r0,dh1       ; spinlock if gate is closed
7334
FFFFFFFFFFFFFBF8        02008128                        mfspr   r1,PTA          ; get the page table address
7335
FFFFFFFFFFFFFBFC        02010228                        mfspr   r2,BadVAddr     ; get the bad virtual address
7336
FFFFFFFFFFFFFC00        022002E9                        mtspr   TLBVirtPage,r2  ; which virtual address to update
7337
FFFFFFFFFFFFFC04        06211A01                        shrui   r2,r2,#13       ; turn va into index
7338
FFFFFFFFFFFFFC08        04110403                        addu    r1,r1,r2
7339
FFFFFFFFFFFFFC0C        46110000                        lw              r2,[r1]         ; get the physical address from the table
7340
FFFFFFFFFFFFFC10        14210000                        and             r2,r2,#FFFF_FFFF_FFFF_E000      ; mask off lower bits
7341
FFFFFFFFFFFFFC14        022002A9                        mtspr   TLBPhysPage0,r2 ;
7342
FFFFFFFFFFFFFC18        46110008                        lw              r2,8[r1]        ; get the physical address from the table
7343
FFFFFFFFFFFFFC1C        14210000                        and             r2,r2,#FFFF_FFFF_FFFF_E000      ; mask off lower bits
7344
FFFFFFFFFFFFFC20        022002E9                        mtspr   TLBPhysPage1,r2 ;
7345
FFFFFFFFFFFFFC24        02000034                        tlbwr                           ; update a random entry in the TLB
7346
FFFFFFFFFFFFFC28        02000035                        cmgi    #0                      ; close the mutex gate
7347
FFFFFFFFFFFFFC2C        E6BF0000                ; SETLO
7348
FFFFFFFFFFFFFC30        6A0D0403                        lw              r1,0xFFFF_FFFF_FFFF_0000
7349
FFFFFFFFFFFFFC34        E6BF0008                ; SETLO
7350
FFFFFFFFFFFFFC38        6A0D0803                        lw              r2,0xFFFF_FFFF_FFFF_0008
7351
FFFFFFFFFFFFFC3C        01900020                        iret
7352
FFFFFFFFFFFFFC40                                        .align  32
7353 43 robfinch
 
7354
FFFFFFFFFFFFFFB0                                        org             0xFFFF_FFFF_FFFF_FFB0
7355 46 robfinch
FFFFFFFFFFFFFFB0        33FFFEF8                        jmp             DTLBHandler
7356 43 robfinch
FFFFFFFFFFFFFFB4        DE000000                        nop
7357
FFFFFFFFFFFFFFB8        DE000000                        nop
7358
FFFFFFFFFFFFFFC0                                        org             0xFFFF_FFFF_FFFF_FFC0
7359 46 robfinch
FFFFFFFFFFFFFFC0        33FFFEF8                        jmp             DTLBHandler
7360 43 robfinch
FFFFFFFFFFFFFFC4        DE000000                        nop
7361
FFFFFFFFFFFFFFC8        DE000000                        nop
7362
 
7363
FFFFFFFFFFFFFFE0                                        org     0xFFFF_FFFF_FFFF_FFE0
7364 46 robfinch
FFFFFFFFFFFFFFE0 0000000000000000               dw              0                ;
7365
FFFFFFFFFFFFFFE8 0000000000000000               dw              0                ;
7366 10 robfinch
 
7367 46 robfinch
                                                 ; RST vector
7368 43 robfinch
FFFFFFFFFFFFFFF0                                        org             0xFFFF_FFFF_FFFF_FFF0
7369 46 robfinch
FFFFFFFFFFFFFFF0        33FFEC0B                        jmp             start
7370 10 robfinch
 
7371 46 robfinch
                                                 ; ROM checksum goes here
7372 27 robfinch
 
7373 46 robfinch
FFFFFFFFFFFFFFF8                                        org             0xFFFF_FFFF_FFFF_FFF8
7374
FFFFFFFFFFFFFFF8 0000000000000000               dw              0
7375 27 robfinch
 
7376 43 robfinch
0000000000000000        00000000
7377 46 robfinch
0000000000000004        00000000
7378 27 robfinch
 
7379
 
7380
Symbol Table:
7381
==========================================================
7382
Name                   Typ  Segment     Address/Value
7383
----------------------------------------------------------
7384
CR                      C       constant        000000000000000D
7385
LF                      C       constant        000000000000000A
7386
TAB                     C       constant        0000000000000009
7387
CTRLC                   C       constant        0000000000000003
7388
CTRLH                   C       constant        0000000000000008
7389 46 robfinch
CTRLI                   C       constant        0000000000000009
7390
CTRLJ                   C       constant        000000000000000A
7391
CTRLK                   C       constant        000000000000000B
7392
CTRLM                   C       constant        000000000000000D
7393 27 robfinch
CTRLS                   C       constant        0000000000000013
7394
CTRLX                   C       constant        0000000000000018
7395 43 robfinch
XON                     C       constant        0000000000000011
7396
XOFF                    C       constant        0000000000000013
7397 46 robfinch
EX_IRQ                  C       constant        00000000000001C1
7398 43 robfinch
DATA_PRESENT            C       constant        0000000000000001
7399
XMIT_NOT_FULL           C       constant        0000000000000020
7400
BUFLEN                  C       constant        0000000000000050
7401
STACKTOP0               C       constant        FFFFFFFFFFFEFFF8
7402
STACKTOP1               C       constant        FFFFFFFFFFFEFBF8
7403
STACKTOP2               C       constant        FFFFFFFFFFFEF7F8
7404
STACKTOP3               C       constant        FFFFFFFFFFFEF3F8
7405
STACKTOP4               C       constant        FFFFFFFFFFFEEFF8
7406
STACKTOP5               C       constant        FFFFFFFFFFFEEBF8
7407
STACKTOP6               C       constant        FFFFFFFFFFFEE7F8
7408
STACKTOP7               C       constant        FFFFFFFFFFFEE3F8
7409
STACKTOP8               C       constant        FFFFFFFFFFFEDFF8
7410
STACKTOP9               C       constant        FFFFFFFFFFFEDBF8
7411
STACKTOP10              C       constant        FFFFFFFFFFFED7F8
7412
STACKTOP11              C       constant        FFFFFFFFFFFED3F8
7413
STACKTOP12              C       constant        FFFFFFFFFFFECFF8
7414
STACKTOP13              C       constant        FFFFFFFFFFFECBF8
7415
STACKTOP14              C       constant        FFFFFFFFFFFEC7F8
7416
STACKTOP15              C       constant        FFFFFFFFFFFEC3F8
7417
TCBSize                 C       constant        0000000000000200
7418
TCBBase                 C       constant        0000000100000000
7419
TCBr1                   C       constant        0000000000000000
7420
TCBr2                   C       constant        0000000000000008
7421
TCBr3                   C       constant        0000000000000010
7422
TCBr4                   C       constant        0000000000000018
7423
TCBr5                   C       constant        0000000000000020
7424
TCBr6                   C       constant        0000000000000028
7425
TCBr7                   C       constant        0000000000000030
7426
TCBr8                   C       constant        0000000000000038
7427
TCBr9                   C       constant        0000000000000040
7428
TCBr10                  C       constant        0000000000000048
7429
TCBr11                  C       constant        0000000000000050
7430
TCBr12                  C       constant        0000000000000058
7431
TCBr13                  C       constant        0000000000000060
7432
TCBr14                  C       constant        0000000000000068
7433
TCBr15                  C       constant        0000000000000070
7434
TCBr16                  C       constant        0000000000000078
7435
TCBr17                  C       constant        0000000000000080
7436
TCBr18                  C       constant        0000000000000088
7437
TCBr19                  C       constant        0000000000000090
7438
TCBr20                  C       constant        0000000000000098
7439
TCBr21                  C       constant        00000000000000A0
7440
TCBr22                  C       constant        00000000000000A8
7441
TCBr23                  C       constant        00000000000000B0
7442
TCBr24                  C       constant        00000000000000B8
7443
TCBr25                  C       constant        00000000000000C0
7444
TCBr26                  C       constant        00000000000000C8
7445
TCBr27                  C       constant        00000000000000D0
7446
TCBr28                  C       constant        00000000000000D8
7447
TCBr29                  C       constant        00000000000000E0
7448
TCBr30                  C       constant        00000000000000E8
7449
TCBr31                  C       constant        00000000000000F0
7450 46 robfinch
SCREENGATE              C       constant        0000000000000000
7451
KEYBDGATE               C       constant        0000000000000001
7452
VIDEOGATE               C       constant        0000000000000002
7453
CARDGATE                C       constant        0000000000000003
7454 43 robfinch
warmStart               C       constant        0000000000001020
7455
usrJmp                  C       constant        0000000000001028
7456
TickIRQAddr             C       constant        0000000000001030
7457
TaskBlock               C       constant        0000000000001038
7458
Milliseconds            C       constant        0000000000001400
7459
Lastloc                 C       constant        0000000000001408
7460 46 robfinch
CharColor               C       constant        0000000000001410
7461 43 robfinch
ScreenColor             C       constant        0000000000001414
7462 46 robfinch
CursorRow               C       constant        0000000000001417
7463 43 robfinch
CursorCol               C       constant        0000000000001418
7464
CursorFlash             C       constant        000000000000141A
7465
KeybdEcho               C       constant        000000000000141C
7466
KeybdBuffer             C       constant        0000000000001440
7467
KeybdHead               C       constant        0000000000001450
7468
KeybdTail               C       constant        0000000000001451
7469 46 robfinch
sp_save                 C       constant        0000000000001460
7470
lr_save                 C       constant        0000000000001468
7471
r1_save                 C       constant        0000000000001470
7472
r2_save                 C       constant        0000000000001478
7473
r26_save                C       constant        0000000000001480
7474 43 robfinch
Score                   C       constant        0000000000001500
7475
Manpos                  C       constant        0000000000001508
7476
MissileActive           C       constant        0000000000001510
7477
MissileX                C       constant        0000000000001512
7478
MissileY                C       constant        0000000000001514
7479
InvadersRow1            C       constant        0000000000001520
7480
InvadersRow2            C       constant        0000000000001530
7481
InvadersRow3            C       constant        0000000000001540
7482
InvadersRow4            C       constant        0000000000001550
7483
InvadersRow5            C       constant        0000000000001560
7484
InvadersColpos          C       constant        0000000000001570
7485
InvadersRowpos          C       constant        0000000000001571
7486
Uart_rxfifo             C       constant        0000000000001600
7487
Uart_rxhead             C       constant        0000000000001800
7488
Uart_rxtail             C       constant        0000000000001802
7489
Uart_ms                 C       constant        0000000000001808
7490
Uart_rxrts              C       constant        0000000000001809
7491
Uart_rxdtr              C       constant        000000000000180A
7492
Uart_rxxon              C       constant        000000000000180B
7493
Uart_rxflow             C       constant        000000000000180C
7494
Uart_fon                C       constant        000000000000180E
7495
Uart_foff               C       constant        0000000000001810
7496
Uart_txrts              C       constant        0000000000001812
7497
Uart_txdtr              C       constant        0000000000001813
7498
Uart_txxon              C       constant        0000000000001814
7499
Uart_txxonoff           C       constant        0000000000001815
7500
TaskList                C       constant        0000000000002000
7501
ReadyList1              C       constant        0000000000002000
7502
ReadyList2              C       constant        0000000000002020
7503
ReadyList3              C       constant        0000000000002040
7504
ReadyList4              C       constant        0000000000002060
7505
ReadyList5              C       constant        0000000000002080
7506
ReadyNdx1               C       constant        00000000000020A0
7507
ReadyNdx2               C       constant        00000000000020A1
7508
ReadyNdx3               C       constant        00000000000020A2
7509
ReadyNdx4               C       constant        00000000000020A3
7510
ReadyNdx5               C       constant        00000000000020A4
7511
RunningTCB              C       constant        00000000000020A6
7512
NextToRunTCB            C       constant        00000000000020A8
7513
r1save                  C       constant        00000000000020B0
7514
r2save                  C       constant        00000000000020B8
7515
AXCstart                C       constant        00000000000020C0
7516 46 robfinch
ctx0start               C       constant        00000000000020D0
7517
ctx1start               C       constant        00000000000020D8
7518
ctx2start               C       constant        00000000000020E0
7519
ctx3start               C       constant        00000000000020E8
7520
ctx4start               C       constant        00000000000020F0
7521
ctx5start               C       constant        00000000000020F8
7522
ctx6start               C       constant        0000000000002100
7523
ctx7start               C       constant        0000000000002108
7524
ctx8start               C       constant        0000000000002110
7525
ctx9start               C       constant        0000000000002118
7526
ctx10start              C       constant        0000000000002120
7527
ctx11start              C       constant        0000000000002128
7528
ctx12start              C       constant        0000000000002130
7529
ctx13start              C       constant        0000000000002138
7530
ctx14start              C       constant        0000000000002140
7531
ctx15start              C       constant        0000000000002148
7532
sp_saves                C       constant        0000000000002200
7533
sp_saves_end            C       constant        0000000000002280
7534 43 robfinch
p100IRQvec              C       constant        0000000000003000
7535
keybdIRQvec             C       constant        0000000000003008
7536
serialIRQvec            C       constant        0000000000003010
7537
rasterIRQvec            C       constant        0000000000003018
7538 46 robfinch
startSector             C       constant        00000000000030F8
7539
BPB                     C       constant        0000000000003100
7540 43 robfinch
TEXTSCR                 C       constant        0000000000D00000
7541
COLORSCR                C       constant        0000000000D10000
7542
TEXTREG                 C       constant        0000000000DA0000
7543 27 robfinch
TEXT_COLS               C       constant        0000000000000000
7544
TEXT_ROWS               C       constant        0000000000000002
7545
TEXT_CURPOS             C       constant        0000000000000016
7546 43 robfinch
KEYBD                   C       constant        0000000000DC0000
7547
KEYBDCLR                C       constant        0000000000DC0002
7548
UART                    C       constant        0000000000DC0A00
7549
UART_LS                 C       constant        0000000000DC0A01
7550
UART_IS                 C       constant        0000000000DC0A03
7551
UART_IE                 C       constant        0000000000DC0A04
7552
UART_MC                 C       constant        0000000000DC0A06
7553
DATETIME                C       constant        0000000000DC0400
7554 46 robfinch
SPIMASTER               C       constant        0000000000DC0500
7555
SPI_MASTER_VERSION_REG  C       constant        0000000000000000
7556
SPI_MASTER_CONTROL_REG  C       constant        0000000000000001
7557
SPI_TRANS_TYPE_REG      C       constant        0000000000000002
7558
SPI_TRANS_CTRL_REG      C       constant        0000000000000003
7559
SPI_TRANS_STATUS_REG    C       constant        0000000000000004
7560
SPI_TRANS_ERROR_REG     C       constant        0000000000000005
7561
SPI_DIRECT_ACCESS_DATA_REG      C       constant        0000000000000006
7562
SPI_SD_ADDR_7_0_REG     C       constant        0000000000000007
7563
SPI_SD_ADDR_15_8_REG    C       constant        0000000000000008
7564
SPI_SD_ADDR_23_16_REG   C       constant        0000000000000009
7565
SPI_SD_ADDR_31_24_REG   C       constant        000000000000000A
7566
SPI_RX_FIFO_DATA_REG    C       constant        0000000000000010
7567
SPI_RX_FIFO_DATA_COUNT_MSB      C       constant        0000000000000012
7568
SPI_RX_FIFO_DATA_COUNT_LSB      C       constant        0000000000000013
7569
SPI_RX_FIFO_CTRL_REG    C       constant        0000000000000014
7570
SPI_TX_FIFO_DATA_REG    C       constant        0000000000000020
7571
SPI_TX_FIFO_CTRL_REG    C       constant        0000000000000024
7572
SPI_INIT_SD             C       constant        0000000000000001
7573
SPI_TRANS_START         C       constant        0000000000000001
7574
SPI_TRANS_BUSY          C       constant        0000000000000001
7575
SPI_INIT_NO_ERROR       C       constant        0000000000000000
7576
SPI_READ_NO_ERROR       C       constant        0000000000000000
7577
RW_READ_SD_BLOCK        C       constant        0000000000000002
7578
RW_WRITE_SD_BLOCK       C       constant        0000000000000003
7579 43 robfinch
PIC                     C       constant        0000000000DC0FF0
7580
PIC_IE                  C       constant        0000000000DC0FF2
7581
PSG                     C       constant        0000000000D50000
7582
PSGFREQ0                C       constant        0000000000D50000
7583
PSGPW0                  C       constant        0000000000D50002
7584
PSGCTRL0                C       constant        0000000000D50004
7585
PSGADSR0                C       constant        0000000000D50006
7586
SPRRAM                  C       constant        0000000000D80000
7587
AC97                    C       constant        0000000000DC1000
7588 46 robfinch
TMP                     C       constant        0000000000DC0300
7589 43 robfinch
LED                     C       constant        0000000000DC0600
7590 46 robfinch
ETHMAC                  C       constant        0000000000DC2000
7591
CONFIGREC               C       constant        0000000000DCFFFF
7592
MIIMODER                C       constant        0000000000000028
7593
MIIADDRESS              C       constant        0000000000000030
7594 43 robfinch
GACCEL                  C       constant        0000000000DAE000
7595
RASTERIRQ               C       constant        0000000000DA0100
7596 27 robfinch
BOOT_STACK              C       constant        FFFFFFFFFFFEFFF8
7597 43 robfinch
SPRITEREGS              C       constant        0000000000DAD000
7598 27 robfinch
BITMAPSCR               C       constant        0000000100200000
7599 46 robfinch
BOOTJMP                 C       constant        0000000100800204
7600 27 robfinch
txempty                 C       constant        0000000000000040
7601
rxfull                  C       constant        0000000000000001
7602 46 robfinch
txtWidth                L       bss             0000000000001048
7603
txtHeight               L       bss             0000000000001049
7604
cursx                   L       bss             000000000000104A
7605
cursy                   L       bss             000000000000104B
7606
pos                     L       bss             000000000000104C
7607
dh                      L       bss             000000000000104C
7608
 
7609
charToPrint             L       bss             000000000000104C
7610
fgColor                 L       bss             000000000000104E
7611
bkColor                 L       bss             0000000000001051
7612
cursFlash               L       bss             0000000000001052
7613
lineLinkTbl             L       bss             0000000000001053
7614
typef                   L       bss             0000000000001085
7615 43 robfinch
OSSP                    L       bss             0000000000001088
7616
CURRNT                  L       bss             0000000000001090
7617
STKGOS                  L       bss             0000000000001098
7618
STKINP                  L       bss             00000000000010A0
7619
LOPVAR                  L       bss             00000000000010A8
7620
LOPINC                  L       bss             00000000000010B0
7621
LOPLMT                  L       bss             00000000000010B8
7622
LOPLN                   L       bss             00000000000010C0
7623
LOPPT                   L       bss             00000000000010C8
7624
TXTUNF                  L       bss             00000000000010D0
7625
VARBGN                  L       bss             00000000000010D8
7626
IVARBGN                 L       bss             00000000000010E0
7627
SVARBGN                 L       bss             00000000000010E8
7628
FVARBGN                 L       bss             00000000000010F0
7629
STKBOT                  L       bss             00000000000010F8
7630
NUMWKA                  L       bss             0000000000001100
7631
BUFFER                  L       bss             000000000000111B
7632
TXT                     C       constant        0000000100600000
7633 46 robfinch
start                   L       code            FFFFFFFFFFFFB02C
7634
ColdStart               L       code            FFFFFFFFFFFFB02C
7635
ict1                    L       code            FFFFFFFFFFFFB084
7636
ctxstart3               L       code            FFFFFFFFFFFFB214
7637
ctxstart2               L       code            FFFFFFFFFFFFB224
7638
ctxstart                L       code            FFFFFFFFFFFFB228
7639
ctxstart1               L       code            FFFFFFFFFFFFB3FC
7640
csj5                    L       code            FFFFFFFFFFFFB240
7641
skip5                   L       code            FFFFFFFFFFFFB2E4
7642
skip4                   L       code            FFFFFFFFFFFFB2FC
7643
dcokay                  L       code            FFFFFFFFFFFFB330
7644
skip1                   L       code            FFFFFFFFFFFFB368
7645
skip2                   L       code            FFFFFFFFFFFFB3B0
7646
skip3                   L       code            FFFFFFFFFFFFB3D8
7647
skip_spi_read           L       code            FFFFFFFFFFFFB3F0
7648
j4                      L       code            FFFFFFFFFFFFB3F4
7649
ctx12                   L       code            FFFFFFFFFFFFB410
7650
context1disp            L       code            FFFFFFFFFFFFB428
7651
ctx11                   L       code            FFFFFFFFFFFFB448
7652
HelloWorld              L       code            FFFFFFFFFFFFB460
7653
j3                      L       code            FFFFFFFFFFFFB478
7654
j2                      L       code            FFFFFFFFFFFFB48C
7655
MSG                     L       code            FFFFFFFFFFFFB4A0
7656
MSGSTART                L       code            FFFFFFFFFFFFB4AD
7657
PICInit                 L       code            FFFFFFFFFFFFB4D0
7658
PICret                  L       code            FFFFFFFFFFFFB4EC
7659
SerialInit              L       code            FFFFFFFFFFFFB4F0
7660
SerialGetCharDirect     L       code            FFFFFFFFFFFFB534
7661
sgc1                    L       code            FFFFFFFFFFFFCDC0
7662
SerialCheckForCharDirect        L       code            FFFFFFFFFFFFB558
7663
SerialPutChar           L       code            FFFFFFFFFFFFB570
7664
spcb1                   L       code            FFFFFFFFFFFFB5D0
7665
spcb3                   L       code            FFFFFFFFFFFFB5B0
7666
spcabort                L       code            FFFFFFFFFFFFB658
7667
spcb2                   L       code            FFFFFFFFFFFFB600
7668
spcb4                   L       code            FFFFFFFFFFFFB5E0
7669
spcb5                   L       code            FFFFFFFFFFFFB61C
7670
spcb6                   L       code            FFFFFFFFFFFFB608
7671
spcb8                   L       code            FFFFFFFFFFFFB624
7672
spcb7                   L       code            FFFFFFFFFFFFB64C
7673
CharsInRxBuf            L       code            FFFFFFFFFFFFB66C
7674
cirxb1                  L       code            FFFFFFFFFFFFB68C
7675
SerialGetChar           L       code            FFFFFFFFFFFFB690
7676
sgcfifo1                L       code            FFFFFFFFFFFFB750
7677
sgcfifo2                L       code            FFFFFFFFFFFFB73C
7678
sgcfifo3                L       code            FFFFFFFFFFFFB700
7679
sgcfifo4                L       code            FFFFFFFFFFFFB724
7680
sgcfifo5                L       code            FFFFFFFFFFFFB73C
7681
SerialIRQ               L       code            FFFFFFFFFFFFB768
7682
sirq1                   L       code            FFFFFFFFFFFFB7A0
7683
srxirq                  L       code            FFFFFFFFFFFFB7C8
7684
stxirq                  L       code            FFFFFFFFFFFFB7C4
7685
smsirq                  L       code            FFFFFFFFFFFFB7B8
7686
srxirq1                 L       code            FFFFFFFFFFFFB7C8
7687
srxirq3                 L       code            FFFFFFFFFFFFB7F8
7688
srxirq2                 L       code            FFFFFFFFFFFFB7EC
7689
srxirq5                 L       code            FFFFFFFFFFFFB814
7690
srxirq8                 L       code            FFFFFFFFFFFFB8A4
7691
srxirq6                 L       code            FFFFFFFFFFFFB868
7692
srxirq7                 L       code            FFFFFFFFFFFFB88C
7693
VideoSC                 L       code            FFFFFFFFFFFFB8A8
7694
Video1                  L       code            FFFFFFFFFFFFB8D0
7695
Video_x02               L       code            FFFFFFFFFFFFB90C
7696
Video_x03               L       code            FFFFFFFFFFFFB91C
7697
Video_x06               L       code            FFFFFFFFFFFFB928
7698
Video_x09               L       code            FFFFFFFFFFFFB930
7699
Video_x0A               L       code            FFFFFFFFFFFFB944
7700
Video_x0C               L       code            FFFFFFFFFFFFB954
7701
Video_x0D               L       code            FFFFFFFFFFFFB98C
7702
Video_x14               L       code            FFFFFFFFFFFFB9E0
7703
Video_x15               L       code            FFFFFFFFFFFFB9EC
7704
Video_x16               L       code            FFFFFFFFFFFFB9FC
7705
Video_x17               L       code            FFFFFFFFFFFFBA08
7706
Video_x1A               L       code            FFFFFFFFFFFFBA14
7707
VideoRet                L       code            FFFFFFFFFFFFBA20
7708
Video_x09a              L       code            FFFFFFFFFFFFB938
7709
Video_x0Aa              L       code            FFFFFFFFFFFFB948
7710
vxd1                    L       code            FFFFFFFFFFFFB9C0
7711
SDCARDSC                L       code            FFFFFFFFFFFFBA38
7712
SDC_1                   L       code            FFFFFFFFFFFFBA60
7713
SDC_x00                 L       code            FFFFFFFFFFFFBA78
7714
SDC_x01                 L       code            FFFFFFFFFFFFBA80
7715
SDC_x02                 L       code            FFFFFFFFFFFFBA90
7716
SDCRet                  L       code            FFFFFFFFFFFFBA90
7717
RTCSC                   L       code            FFFFFFFFFFFFBAA8
7718
RTC_x00                 L       code            FFFFFFFFFFFFBAD8
7719
RTC_x01                 L       code            FFFFFFFFFFFFBAE0
7720
RTCRet                  L       code            FFFFFFFFFFFFBB00
7721
KeybdSC                 L       code            FFFFFFFFFFFFBB14
7722
kbdsc5                  L       code            FFFFFFFFFFFFBB3C
7723
kbd_x00                 L       code            FFFFFFFFFFFFBB60
7724
kbd_x01                 L       code            FFFFFFFFFFFFBB68
7725
kbd_x02                 L       code            FFFFFFFFFFFFBB74
7726
kbd_x03                 L       code            FFFFFFFFFFFFBB7C
7727
kbd_x04                 L       code            FFFFFFFFFFFFBB84
7728
kbd_x05                 L       code            FFFFFFFFFFFFBB8C
7729
kbdscRet                L       code            FFFFFFFFFFFFBB94
7730
KeybdInit               L       code            FFFFFFFFFFFFBBAC
7731
KeybdIRQ                L       code            FFFFFFFFFFFFBBC0
7732
KeybdIRQa               L       code            FFFFFFFFFFFFBBD0
7733
KeybdIRQb               L       code            FFFFFFFFFFFFBBF8
7734
KeybdIRQc               L       code            FFFFFFFFFFFFBC0C
7735
SetKeyboardEcho         L       code            FFFFFFFFFFFFBC14
7736
KeybdGetChar            L       code            FFFFFFFFFFFFBC1C
7737
nochar                  L       code            FFFFFFFFFFFFBC60
7738
kgc3                    L       code            FFFFFFFFFFFFBC64
7739
kgc2                    L       code            FFFFFFFFFFFFBC58
7740
KeybdCheckForKey        L       code            FFFFFFFFFFFFBC70
7741
KeybdCheckForKeyDirect  L       code            FFFFFFFFFFFFBC80
7742
KeybdGetCharDirect      L       code            FFFFFFFFFFFFBC94
7743
kgc1                    L       code            FFFFFFFFFFFFBCA4
7744
gk1                     L       code            FFFFFFFFFFFFBCDC
7745
gk2                     L       code            FFFFFFFFFFFFBCD8
7746
tmp_init                L       code            FFFFFFFFFFFFBCE8
7747
tmp_init4               L       code            FFFFFFFFFFFFBCF4
7748
tmp_init5               L       code            FFFFFFFFFFFFBD0C
7749
tmp_init1               L       code            FFFFFFFFFFFFBD20
7750
tmp_init2               L       code            FFFFFFFFFFFFBD30
7751
tmp_init3               L       code            FFFFFFFFFFFFBD48
7752
tmp_read                L       code            FFFFFFFFFFFFBD4C
7753
tmp_read1               L       code            FFFFFFFFFFFFBD68
7754
tmp_read3               L       code            FFFFFFFFFFFFBD80
7755
tmp_read2               L       code            FFFFFFFFFFFFBD90
7756
tmp_read4               L       code            FFFFFFFFFFFFBDA8
7757
Pulse100                L       code            FFFFFFFFFFFFBDCC
7758
p1001                   L       code            FFFFFFFFFFFFBE00
7759
SelectNextToRunTCB      L       code            FFFFFFFFFFFFBE08
7760
SwitchTask              L       code            FFFFFFFFFFFFBE10
7761
swtsk1                  L       code            FFFFFFFFFFFFBE30
7762
FlashCursor             L       code            FFFFFFFFFFFFBF60
7763
flshcrsr2               L       code            FFFFFFFFFFFFBFBC
7764
flshcrsr3               L       code            FFFFFFFFFFFFBF94
7765
flshcrsr1               L       code            FFFFFFFFFFFFBFA8
7766
CursorOff               L       code            FFFFFFFFFFFFBFC8
7767
CursorOn                L       code            FFFFFFFFFFFFBFDC
7768
ClearBmpScreen          L       code            FFFFFFFFFFFFBFF0
7769
csj4                    L       code            FFFFFFFFFFFFC08C
7770
ClearScreen             L       code            FFFFFFFFFFFFC044
7771
ScrollUp                L       code            FFFFFFFFFFFFC0B8
7772
scrup1                  L       code            FFFFFFFFFFFFC0F8
7773
BlankLine               L       code            FFFFFFFFFFFFC138
7774
blnkln1                 L       code            FFFFFFFFFFFFC170
7775
AsciiToScreen           L       code            FFFFFFFFFFFFC18C
7776
atoscr1                 L       code            FFFFFFFFFFFFC1A4
7777
ScreenToAscii           L       code            FFFFFFFFFFFFC1AC
7778
stasc1                  L       code            FFFFFFFFFFFFC1B8
7779
CalcScreenLoc           L       code            FFFFFFFFFFFFC1BC
7780
DisplayChar             L       code            FFFFFFFFFFFFC1FC
7781
dccr                    L       code            FFFFFFFFFFFFC21C
7782
dcx7                    L       code            FFFFFFFFFFFFC248
7783
dcx6                    L       code            FFFFFFFFFFFFC260
7784
dccr1                   L       code            FFFFFFFFFFFFC224
7785
dcx8                    L       code            FFFFFFFFFFFFC290
7786
dccu1                   L       code            FFFFFFFFFFFFC268
7787
dcx9                    L       code            FFFFFFFFFFFFC2C0
7788
dccl1                   L       code            FFFFFFFFFFFFC298
7789
dcx10                   L       code            FFFFFFFFFFFFC2F0
7790
dccd1                   L       code            FFFFFFFFFFFFC2C8
7791
dcx11                   L       code            FFFFFFFFFFFFC324
7792
dcx12                   L       code            FFFFFFFFFFFFC31C
7793
dcx13                   L       code            FFFFFFFFFFFFC358
7794
dcx5                    L       code            FFFFFFFFFFFFC378
7795
dcx3                    L       code            FFFFFFFFFFFFC3AC
7796
dcx4                    L       code            FFFFFFFFFFFFC3E0
7797
dclf                    L       code            FFFFFFFFFFFFC3DC
7798
IncCursorPos            L       code            FFFFFFFFFFFFC3FC
7799
icc1                    L       code            FFFFFFFFFFFFC470
7800
icr1                    L       code            FFFFFFFFFFFFC448
7801
IncCursorRow            L       code            FFFFFFFFFFFFC434
7802
DisplayString           L       code            FFFFFFFFFFFFC488
7803
dspj1                   L       code            FFFFFFFFFFFFC49C
7804
dsret                   L       code            FFFFFFFFFFFFC4B0
7805
DisplayStringCRLF       L       code            FFFFFFFFFFFFC4C0
7806
CRLF                    L       code            FFFFFFFFFFFFF600
7807
DisplayNum              L       code            FFFFFFFFFFFFC4FC
7808
DisplayNybble           L       code            FFFFFFFFFFFFC500
7809
dispnyb1                L       code            FFFFFFFFFFFFC51C
7810
DisplayByte             L       code            FFFFFFFFFFFFC52C
7811
DisplayCharr            L       code            FFFFFFFFFFFFC554
7812
DisplayHalf             L       code            FFFFFFFFFFFFC57C
7813
DisplayWord             L       code            FFFFFFFFFFFFC5A4
7814
dspwd1                  L       code            FFFFFFFFFFFFC5B8
7815
DisplayMemB             L       code            FFFFFFFFFFFFC5D4
7816
dspmem1                 L       code            FFFFFFFFFFFFC5F8
7817
DisplayMemC             L       code            FFFFFFFFFFFFC624
7818
dspmemc1                L       code            FFFFFFFFFFFFC648
7819
DisplayMemW             L       code            FFFFFFFFFFFFC674
7820
BinToBCD                L       code            FFFFFFFFFFFFC6B4
7821
bta1                    L       code            FFFFFFFFFFFFC6D8
7822
BCDToAscii              L       code            FFFFFFFFFFFFC730
7823
bta2                    L       code            FFFFFFFFFFFFC748
7824
BinToStr                L       code            FFFFFFFFFFFFC78C
7825
btos3                   L       code            FFFFFFFFFFFFC7C0
7826
btos1                   L       code            FFFFFFFFFFFFC7C4
7827
btos2                   L       code            FFFFFFFFFFFFC7F4
7828
Monitor                 L       code            FFFFFFFFFFFFC828
7829
PromptLn                L       code            FFFFFFFFFFFFC834
7830
Prompt3                 L       code            FFFFFFFFFFFFC840
7831
Prompt1                 L       code            FFFFFFFFFFFFC854
7832
Prompt2                 L       code            FFFFFFFFFFFFC87C
7833
Editmem                 L       code            FFFFFFFFFFFFCA24
7834
Dumpmem                 L       code            FFFFFFFFFFFFCA70
7835
Fillmem                 L       code            FFFFFFFFFFFFCAD4
7836
Prompt7                 L       code            FFFFFFFFFFFFC888
7837
Prompt4                 L       code            FFFFFFFFFFFFC890
7838
ExecuteCode             L       code            FFFFFFFFFFFFCA4C
7839
Prompt9                 L       code            FFFFFFFFFFFFC89C
7840
Prompt10                L       code            FFFFFFFFFFFFC8AC
7841
TestCLS                 L       code            FFFFFFFFFFFFC8DC
7842
Prompt12                L       code            FFFFFFFFFFFFC8B8
7843
Prompt13                L       code            FFFFFFFFFFFFC8C0
7844
Prompt14                L       code            FFFFFFFFFFFFC8C8
7845
Prompt15                L       code            FFFFFFFFFFFFC8D0
7846
RandomLinesCall         L       code            FFFFFFFFFFFFC8D4
7847
HelpMsg                 L       code            FFFFFFFFFFFFC910
7848
ignBlanks               L       code            FFFFFFFFFFFFCA00
7849
ignBlanks1              L       code            FFFFFFFFFFFFCA08
7850
edtmem1                 L       code            FFFFFFFFFFFFCA34
7851
LoadSector              L       code            FFFFFFFFFFFFCA5C
7852
Dumpmem2                L       code            FFFFFFFFFFFFCAA0
7853
DumpmemW                L       code            FFFFFFFFFFFFCAC4
7854
DumpmemC                L       code            FFFFFFFFFFFFCAB8
7855
DumpmemB                L       code            FFFFFFFFFFFFCAAC
7856
FillmemC                L       code            FFFFFFFFFFFFCB20
7857
FillmemH                L       code            FFFFFFFFFFFFCB30
7858
FillmemW                L       code            FFFFFFFFFFFFCB40
7859
FillmemB                L       code            FFFFFFFFFFFFCB10
7860
GetHexNumber            L       code            FFFFFFFFFFFFCB50
7861
gthxn2                  L       code            FFFFFFFFFFFFCB68
7862
gthxn1                  L       code            FFFFFFFFFFFFCB8C
7863
AsciiToHexNybble        L       code            FFFFFFFFFFFFCBA0
7864
gthx3                   L       code            FFFFFFFFFFFFCBD8
7865
gthx5                   L       code            FFFFFFFFFFFFCBB0
7866
gthx6                   L       code            FFFFFFFFFFFFCBC4
7867
LoadS19                 L       code            FFFFFFFFFFFFCBE0
7868
ProcessRec              L       code            FFFFFFFFFFFFCBEC
7869
NextRec                 L       code            FFFFFFFFFFFFCBE4
7870
ProcessS1               L       code            FFFFFFFFFFFFCCA4
7871
ProcessS2               L       code            FFFFFFFFFFFFCCAC
7872
ProcessS3               L       code            FFFFFFFFFFFFCCB4
7873
ProcessS7               L       code            FFFFFFFFFFFFCCBC
7874
ProcessS8               L       code            FFFFFFFFFFFFCCC8
7875
ProcessS9               L       code            FFFFFFFFFFFFCCD4
7876
pcssxa                  L       code            FFFFFFFFFFFFCC4C
7877
pcss1a                  L       code            FFFFFFFFFFFFCC54
7878
S19Get16BitAddress      L       code            FFFFFFFFFFFFCCE0
7879
S1932b                  L       code            FFFFFFFFFFFFCD64
7880
S19Get24BitAddress      L       code            FFFFFFFFFFFFCCF8
7881
S1932a                  L       code            FFFFFFFFFFFFCD44
7882
S19Get32BitAddress      L       code            FFFFFFFFFFFFCD10
7883
sGetChar                L       code            FFFFFFFFFFFFCDA8
7884
sgc2                    L       code            FFFFFFFFFFFFCDB0
7885
RandomLines             L       code            FFFFFFFFFFFFCDD0
7886
rl5                     L       code            FFFFFFFFFFFFCDE4
7887
rl1                     L       code            FFFFFFFFFFFFCDF8
7888
rl2                     L       code            FFFFFFFFFFFFCE14
7889
rl3                     L       code            FFFFFFFFFFFFCE30
7890
rl4                     L       code            FFFFFFFFFFFFCE4C
7891
rl8                     L       code            FFFFFFFFFFFFCE78
7892
rl7                     L       code            FFFFFFFFFFFFCE8C
7893
RandomizeSprram         L       code            FFFFFFFFFFFFCE9C
7894
rsr1                    L       code            FFFFFFFFFFFFCEAC
7895
SetupAC97               L       code            FFFFFFFFFFFFCEC4
7896
sac974                  L       code            FFFFFFFFFFFFCED0
7897
sac971                  L       code            FFFFFFFFFFFFCEDC
7898
sac973                  L       code            FFFFFFFFFFFFCF08
7899
sac972                  L       code            FFFFFFFFFFFFCF48
7900
sac975                  L       code            FFFFFFFFFFFFCF60
7901
Beep                    L       code            FFFFFFFFFFFFCF6C
7902
beep1                   L       code            FFFFFFFFFFFFCFE4
7903
beep2                   L       code            FFFFFFFFFFFFD014
7904
Piano                   L       code            FFFFFFFFFFFFD044
7905
playnt                  L       code            FFFFFFFFFFFFD054
7906
playnt1a                L       code            FFFFFFFFFFFFD07C
7907
playnt1b                L       code            FFFFFFFFFFFFD088
7908
playnt1c                L       code            FFFFFFFFFFFFD094
7909
playnt1d                L       code            FFFFFFFFFFFFD0A0
7910
playnt1e                L       code            FFFFFFFFFFFFD0AC
7911
playnt1f                L       code            FFFFFFFFFFFFD0B8
7912
playnt1g                L       code            FFFFFFFFFFFFD0C4
7913
Tone                    L       code            FFFFFFFFFFFFD0D0
7914
tone1                   L       code            FFFFFFFFFFFFD110
7915
tone2                   L       code            FFFFFFFFFFFFD12C
7916
SetupRasterIRQ          L       code            FFFFFFFFFFFFD14C
7917
RasterIRQfn             L       code            FFFFFFFFFFFFD1AC
7918
rirq1                   L       code            FFFFFFFFFFFFD1DC
7919
rirq2                   L       code            FFFFFFFFFFFFD1DC
7920
rirq3                   L       code            FFFFFFFFFFFFD1DC
7921
rirq4                   L       code            FFFFFFFFFFFFD1DC
7922
rirq5                   L       code            FFFFFFFFFFFFD1DC
7923
rirq6                   L       code            FFFFFFFFFFFFD1DC
7924
rirq7                   L       code            FFFFFFFFFFFFD1DC
7925
rirq8                   L       code            FFFFFFFFFFFFD1DC
7926
DisplayDatetime         L       code            FFFFFFFFFFFFD248
7927
InitializeGame          L       code            FFFFFFFFFFFFD2C4
7928
DrawScore               L       code            FFFFFFFFFFFFD2EC
7929
DrawMissile             L       code            FFFFFFFFFFFFD31C
7930
MissileOff              L       code            FFFFFFFFFFFFD378
7931
DrawMan                 L       code            FFFFFFFFFFFFD3A0
7932
DrawInvader             L       code            FFFFFFFFFFFFD3EC
7933
DrawInvaders            L       code            FFFFFFFFFFFFD40C
7934
dinv1                   L       code            FFFFFFFFFFFFD494
7935
DrawBombs               L       code            FFFFFFFFFFFFD49C
7936
Invaders                L       code            FFFFFFFFFFFFD4A0
7937
InvadersLoop            L       code            FFFFFFFFFFFFD4AC
7938
TestMoveMan             L       code            FFFFFFFFFFFFD4C0
7939
MoveManRight            L       code            FFFFFFFFFFFFD4D4
7940
MoveManLeft             L       code            FFFFFFFFFFFFD4EC
7941
FireMissile             L       code            FFFFFFFFFFFFD500
7942
Invaders1               L       code            FFFFFFFFFFFFD524
7943
InvadersEnd             L       code            FFFFFFFFFFFFD52C
7944
spi_init                L       code            FFFFFFFFFFFFD538
7945
spi_init1               L       code            FFFFFFFFFFFFD568
7946
spi_error               L       code            FFFFFFFFFFFFD594
7947
spi_init_exit           L       code            FFFFFFFFFFFFD5A4
7948
spi_read_sector         L       code            FFFFFFFFFFFFD5B4
7949
spi_read_sect1          L       code            FFFFFFFFFFFFD614
7950
spi_read_error          L       code            FFFFFFFFFFFFD64C
7951
spi_read_sect2          L       code            FFFFFFFFFFFFD634
7952
spi_read_ret            L       code            FFFFFFFFFFFFD65C
7953
spi_read_boot           L       code            FFFFFFFFFFFFD674
7954
spi_read_boot1          L       code            FFFFFFFFFFFFD694
7955
spi_read_boot2          L       code            FFFFFFFFFFFFD6DC
7956
spi_read_boot3          L       code            FFFFFFFFFFFFD6D0
7957
spi_read_boot4          L       code            FFFFFFFFFFFFD714
7958
msgFoundEB              L       code            FFFFFFFFFFFFD728
7959
loadFAT                 L       code            FFFFFFFFFFFFD73C
7960
loadFAT1                L       code            FFFFFFFFFFFFD780
7961
loadRootDirectory       L       code            FFFFFFFFFFFFD79C
7962
loadRootDir1            L       code            FFFFFFFFFFFFD800
7963
loadBootFile            L       code            FFFFFFFFFFFFD814
7964
loadBootFileTmp         L       code            FFFFFFFFFFFFD8A8
7965
loadBootFile4           L       code            FFFFFFFFFFFFD870
7966
loadBootFile5           L       code            FFFFFFFFFFFFD890
7967
loadBootFile3           L       code            FFFFFFFFFFFFD888
7968
loadBootFile1           L       code            FFFFFFFFFFFFD8C8
7969
loadBootFile2           L       code            FFFFFFFFFFFFD914
7970
msgJumpingToBoot        L       code            FFFFFFFFFFFFD920
7971
msgNotBootable          L       code            FFFFFFFFFFFFD930
7972
spi_init_ok_msg         L       code            FFFFFFFFFFFFD946
7973
spi_init_error_msg      L       code            FFFFFFFFFFFFD960
7974
spi_boot_error_msg      L       code            FFFFFFFFFFFFD98B
7975
spi_read_error_msg      L       code            FFFFFFFFFFFFD99E
7976
my_MAC1                 C       constant        0000000000000000
7977
my_MAC2                 C       constant        00000000000000FF
7978
my_MAC3                 C       constant        00000000000000EE
7979
my_MAC4                 C       constant        00000000000000F0
7980
my_MAC5                 C       constant        00000000000000DA
7981
my_MAC6                 C       constant        0000000000000042
7982
.bss                    L       code            FFFFFFFFFFFFD9B4
7983
eth_unique_id           L       code            FFFFFFFFFFFFD9B4
7984
.code                   L       code            FFFFFFFFFFFFD9BC
7985
eth_init                L       code            FFFFFFFFFFFFD9BC
7986
eth_request_packet      L       code            FFFFFFFFFFFFD9F4
7987
eth1                    L       code            FFFFFFFFFFFFDA24
7988
eth20                   L       code            FFFFFFFFFFFFDA4C
7989
eth_interpret_packet    L       code            FFFFFFFFFFFFDA70
7990
eth2                    L       code            FFFFFFFFFFFFDA9C
7991
eth5                    L       code            FFFFFFFFFFFFDA90
7992
eth3                    L       code            FFFFFFFFFFFFDACC
7993
eth4                    L       code            FFFFFFFFFFFFDAB4
7994
eth6                    L       code            FFFFFFFFFFFFDAC0
7995
eth7                    L       code            FFFFFFFFFFFFDACC
7996
eth_send_packet         L       code            FFFFFFFFFFFFDADC
7997
eth8                    L       code            FFFFFFFFFFFFDAF4
7998
eth_build_packet        L       code            FFFFFFFFFFFFDB24
7999
eth16                   L       code            FFFFFFFFFFFFDBEC
8000
eth_checksum            L       code            FFFFFFFFFFFFDC38
8001
eth15                   L       code            FFFFFFFFFFFFDC58
8002
eth14                   L       code            FFFFFFFFFFFFDC80
8003
eth_verifyIP            L       code            FFFFFFFFFFFFDCB0
8004
eth11                   L       code            FFFFFFFFFFFFDD0C
8005
eth12                   L       code            FFFFFFFFFFFFDCF4
8006
eth13                   L       code            FFFFFFFFFFFFDCF8
8007
eth_main                L       code            FFFFFFFFFFFFDD3C
8008
eth_loop                L       code            FFFFFFFFFFFFDD40
8009
eth10                   L       code            FFFFFFFFFFFFDDF8
8010
GOSTART                 L       code            FFFFFFFFFFFFDF4C
8011
GOWARM                  L       code            FFFFFFFFFFFFDF50
8012
GOOUT                   L       code            FFFFFFFFFFFFDF54
8013
GOIN                    L       code            FFFFFFFFFFFFDF58
8014
GOAUXO                  L       code            FFFFFFFFFFFFDF5C
8015
GOAUXI                  L       code            FFFFFFFFFFFFDF60
8016
GOBYE                   L       code            FFFFFFFFFFFFDF64
8017
TXTBGN                  L       code            FFFFFFFFFFFFDF68
8018
ENDMEM                  L       code            FFFFFFFFFFFFDF70
8019
CSTART                  L       code            FFFFFFFFFFFFDF80
8020
WSTART                  L       code            FFFFFFFFFFFFE004
8021
ST3                     L       code            FFFFFFFFFFFFE01C
8022
DIRECT                  L       code            FFFFFFFFFFFFE318
8023
ST2                     L       code            FFFFFFFFFFFFE048
8024
ERROR                   L       code            FFFFFFFFFFFFF028
8025
ST4                     L       code            FFFFFFFFFFFFE09C
8026
ST7                     L       code            FFFFFFFFFFFFE078
8027
ST6                     L       code            FFFFFFFFFFFFE094
8028
ST5                     L       code            FFFFFFFFFFFFE0C4
8029
TAB1                    L       code            FFFFFFFFFFFFE0EC
8030
TAB2                    L       code            FFFFFFFFFFFFE0FE
8031
TAB4                    L       code            FFFFFFFFFFFFE14E
8032
TAB5                    L       code            FFFFFFFFFFFFE16F
8033
TAB6                    L       code            FFFFFFFFFFFFE172
8034
TAB8                    L       code            FFFFFFFFFFFFE177
8035
TAB9                    L       code            FFFFFFFFFFFFE181
8036
TAB10                   L       code            FFFFFFFFFFFFE185
8037
TAB1_1                  L       code            FFFFFFFFFFFFE188
8038
TAB2_1                  L       code            FFFFFFFFFFFFE1B0
8039
TAB4_1                  L       code            FFFFFFFFFFFFE258
8040
TAB5_1                  L       code            FFFFFFFFFFFFE2A0
8041
TAB6_1                  L       code            FFFFFFFFFFFFE2B0
8042
TAB8_1                  L       code            FFFFFFFFFFFFE2C0
8043
TAB9_1                  L       code            FFFFFFFFFFFFE2F8
8044
TAB10_1                 L       code            FFFFFFFFFFFFE308
8045
EXEC                    L       code            FFFFFFFFFFFFE320
8046
EXLP                    L       code            FFFFFFFFFFFFE334
8047
EXNGO                   L       code            FFFFFFFFFFFFE34C
8048
EXGO                    L       code            FFFFFFFFFFFFE384
8049
EXMAT                   L       code            FFFFFFFFFFFFE374
8050
EX1                     L       code            FFFFFFFFFFFFE364
8051
NEW                     L       code            FFFFFFFFFFFFE38C
8052
STOP                    L       code            FFFFFFFFFFFFE39C
8053
RUN                     L       code            FFFFFFFFFFFFE3A4
8054
RUNNXL                  L       code            FFFFFFFFFFFFE3B4
8055
RUNTSL                  L       code            FFFFFFFFFFFFE3D4
8056
RUNSML                  L       code            FFFFFFFFFFFFE3DC
8057
GOTO                    L       code            FFFFFFFFFFFFE3EC
8058
_clr                    L       code            FFFFFFFFFFFFE40C
8059
FINISH                  L       code            FFFFFFFFFFFFE518
8060
clearVars               L       code            FFFFFFFFFFFFE414
8061
cv1                     L       code            FFFFFFFFFFFFE428
8062
LISTX                   L       code            FFFFFFFFFFFFE440
8063
LS1                     L       code            FFFFFFFFFFFFE454
8064
LS4                     L       code            FFFFFFFFFFFFE45C
8065
LS3                     L       code            FFFFFFFFFFFFE47C
8066
LS2                     L       code            FFFFFFFFFFFFE474
8067
PRINT                   L       code            FFFFFFFFFFFFE488
8068
PR2                     L       code            FFFFFFFFFFFFE4A0
8069
PR0                     L       code            FFFFFFFFFFFFE4B4
8070
PR3                     L       code            FFFFFFFFFFFFE4EC
8071
PR1                     L       code            FFFFFFFFFFFFE4CC
8072
PR4                     L       code            FFFFFFFFFFFFE4E4
8073
PR8                     L       code            FFFFFFFFFFFFE508
8074
PR6                     L       code            FFFFFFFFFFFFE500
8075
GOSUB                   L       code            FFFFFFFFFFFFE520
8076
gosub1                  L       code            FFFFFFFFFFFFE538
8077
RETURN                  L       code            FFFFFFFFFFFFE55C
8078
return1                 L       code            FFFFFFFFFFFFE570
8079
FOR                     L       code            FFFFFFFFFFFFE594
8080
FR1                     L       code            FFFFFFFFFFFFE5AC
8081
FR2                     L       code            FFFFFFFFFFFFE5C0
8082
FR4                     L       code            FFFFFFFFFFFFE5CC
8083
FR3                     L       code            FFFFFFFFFFFFE5C8
8084
FR5                     L       code            FFFFFFFFFFFFE5D0
8085
FR7                     L       code            FFFFFFFFFFFFE5EC
8086
FR6                     L       code            FFFFFFFFFFFFE5E8
8087
FR8                     L       code            FFFFFFFFFFFFE60C
8088
NEXT                    L       code            FFFFFFFFFFFFE610
8089
NX4                     L       code            FFFFFFFFFFFFE624
8090
NX0                     L       code            FFFFFFFFFFFFE628
8091
NX5                     L       code            FFFFFFFFFFFFE638
8092
NX2                     L       code            FFFFFFFFFFFFE644
8093
NX1                     L       code            FFFFFFFFFFFFE664
8094
NXPurge                 L       code            FFFFFFFFFFFFE678
8095
NX3                     L       code            FFFFFFFFFFFFE668
8096
IF                      L       code            FFFFFFFFFFFFE680
8097
IF1                     L       code            FFFFFFFFFFFFE684
8098
IF2                     L       code            FFFFFFFFFFFFE688
8099
IF3                     L       code            FFFFFFFFFFFFE698
8100
INPERR                  L       code            FFFFFFFFFFFFE69C
8101
INPUT                   L       code            FFFFFFFFFFFFE6B0
8102
IP6                     L       code            FFFFFFFFFFFFE6B8
8103
IP2                     L       code            FFFFFFFFFFFFE6D8
8104
IP4                     L       code            FFFFFFFFFFFFE748
8105
IP3                     L       code            FFFFFFFFFFFFE708
8106
IP7                     L       code            FFFFFFFFFFFFE6F0
8107
IP5                     L       code            FFFFFFFFFFFFE758
8108
DEFLT                   L       code            FFFFFFFFFFFFE764
8109
LET                     L       code            FFFFFFFFFFFFE76C
8110
LT1                     L       code            FFFFFFFFFFFFE780
8111
LOAD                    L       code            FFFFFFFFFFFFE784
8112
LOD1                    L       code            FFFFFFFFFFFFE790
8113
LODEND                  L       code            FFFFFFFFFFFFE7D0
8114
LOD2                    L       code            FFFFFFFFFFFFE7B8
8115
GCHAR                   L       code            FFFFFFFFFFFFE7D8
8116
GCHAR1                  L       code            FFFFFFFFFFFFE7F0
8117
asciiToHex              L       code            FFFFFFFFFFFFE81C
8118
a2h1                    L       code            FFFFFFFFFFFFE824
8119
SAVE                    L       code            FFFFFFFFFFFFE830
8120
SAVE1                   L       code            FFFFFFFFFFFFE838
8121
SAVEND                  L       code            FFFFFFFFFFFFE874
8122
SAVE2                   L       code            FFFFFFFFFFFFE860
8123
AUXOCRLF                L       code            FFFFFFFFFFFFE88C
8124
PWORD                   L       code            FFFFFFFFFFFFE8AC
8125
pword1                  L       code            FFFFFFFFFFFFE8C0
8126
pword2                  L       code            FFFFFFFFFFFFE8DC
8127
toAsciiHex              L       code            FFFFFFFFFFFFE8FC
8128
tah1                    L       code            FFFFFFFFFFFFE908
8129
POKE                    L       code            FFFFFFFFFFFFE910
8130
PKER                    L       code            FFFFFFFFFFFFE93C
8131
POKEC                   L       code            FFFFFFFFFFFFE944
8132
POKEH                   L       code            FFFFFFFFFFFFE970
8133
POKEW                   L       code            FFFFFFFFFFFFE99C
8134
SYSX                    L       code            FFFFFFFFFFFFE9C8
8135
sysx1                   L       code            FFFFFFFFFFFFE9DC
8136
OREXPR                  L       code            FFFFFFFFFFFFE9F0
8137
XP_OR1                  L       code            FFFFFFFFFFFFE9FC
8138
XP_OR                   L       code            FFFFFFFFFFFFEA0C
8139
XP_ORX                  L       code            FFFFFFFFFFFFEA1C
8140
ANDEXPR                 L       code            FFFFFFFFFFFFEA28
8141
XP_AND1                 L       code            FFFFFFFFFFFFEA34
8142
XP_AND                  L       code            FFFFFFFFFFFFEA44
8143
XP_ANDX                 L       code            FFFFFFFFFFFFEA54
8144
isDigit                 L       code            FFFFFFFFFFFFEA60
8145
isDigitFalse            L       code            FFFFFFFFFFFFEA70
8146
isAlpha                 L       code            FFFFFFFFFFFFEA78
8147
isAlphaFalse            L       code            FFFFFFFFFFFFEA90
8148
isAlphaTrue             L       code            FFFFFFFFFFFFEA88
8149
isAlnum                 L       code            FFFFFFFFFFFFEA98
8150
isDigitx                L       code            FFFFFFFFFFFFEAB4
8151
EXPR                    L       code            FFFFFFFFFFFFEABC
8152
XP11                    L       code            FFFFFFFFFFFFEAD8
8153
XPRT1                   L       code            FFFFFFFFFFFFEB44
8154
XPRT0                   L       code            FFFFFFFFFFFFEB38
8155
XP12                    L       code            FFFFFFFFFFFFEAE8
8156
XP13                    L       code            FFFFFFFFFFFFEAF8
8157
XP14                    L       code            FFFFFFFFFFFFEB08
8158
XP15                    L       code            FFFFFFFFFFFFEB18
8159
XP16                    L       code            FFFFFFFFFFFFEB28
8160
XP17                    L       code            FFFFFFFFFFFFEB50
8161
XP18                    L       code            FFFFFFFFFFFFEB5C
8162
EXPR2                   L       code            FFFFFFFFFFFFEB78
8163
XP26                    L       code            FFFFFFFFFFFFEBD4
8164
XP21                    L       code            FFFFFFFFFFFFEB98
8165
XP22                    L       code            FFFFFFFFFFFFEBA4
8166
XP23                    L       code            FFFFFFFFFFFFEBA8
8167
XP24                    L       code            FFFFFFFFFFFFEBBC
8168
XP25                    L       code            FFFFFFFFFFFFEBC8
8169
XP45                    L       code            FFFFFFFFFFFFEBE0
8170
EXPR3                   L       code            FFFFFFFFFFFFEBEC
8171
XP31                    L       code            FFFFFFFFFFFFEBF8
8172
XP34                    L       code            FFFFFFFFFFFFEC18
8173
XP47                    L       code            FFFFFFFFFFFFEC38
8174
EXPR4                   L       code            FFFFFFFFFFFFEC44
8175
XP40                    L       code            FFFFFFFFFFFFEC58
8176
XP41                    L       code            FFFFFFFFFFFFEC70
8177
XP46                    L       code            FFFFFFFFFFFFEC7C
8178
PARN                    L       code            FFFFFFFFFFFFEC84
8179
XP42                    L       code            FFFFFFFFFFFFECA8
8180
XP43                    L       code            FFFFFFFFFFFFECB0
8181
TSTV                    L       code            FFFFFFFFFFFFECB8
8182
tstv_notfound           L       code            FFFFFFFFFFFFED2C
8183
TV1                     L       code            FFFFFFFFFFFFED10
8184
TV2                     L       code            FFFFFFFFFFFFED04
8185
TSTVRT                  L       code            FFFFFFFFFFFFED20
8186
getVarName              L       code            FFFFFFFFFFFFED3C
8187
gvn1                    L       code            FFFFFFFFFFFFEDC4
8188
gvn4                    L       code            FFFFFFFFFFFFED5C
8189
gvn2                    L       code            FFFFFFFFFFFFED94
8190
gvn6                    L       code            FFFFFFFFFFFFED84
8191
gvn3                    L       code            FFFFFFFFFFFFEDA8
8192
findVar                 L       code            FFFFFFFFFFFFEDD4
8193
fv4                     L       code            FFFFFFFFFFFFEDE4
8194
fv3                     L       code            FFFFFFFFFFFFEE08
8195
fv1                     L       code            FFFFFFFFFFFFEE10
8196
fv2                     L       code            FFFFFFFFFFFFEE20
8197
PEEK                    L       code            FFFFFFFFFFFFEE34
8198
PEEKC                   L       code            FFFFFFFFFFFFEE44
8199
PEEKH                   L       code            FFFFFFFFFFFFEE58
8200
PEEKW                   L       code            FFFFFFFFFFFFEE6C
8201
USRX                    L       code            FFFFFFFFFFFFEE80
8202
RND                     L       code            FFFFFFFFFFFFEE9C
8203
rnd2                    L       code            FFFFFFFFFFFFEECC
8204
rnd1                    L       code            FFFFFFFFFFFFEEC4
8205
modu4                   L       code            FFFFFFFFFFFFEEDC
8206
mod2                    L       code            FFFFFFFFFFFFEEFC
8207
mod1                    L       code            FFFFFFFFFFFFEF18
8208
ABS                     L       code            FFFFFFFFFFFFEF34
8209
SGN                     L       code            FFFFFFFFFFFFEF44
8210
SIZEX                   L       code            FFFFFFFFFFFFEF54
8211
SETVAL                  L       code            FFFFFFFFFFFFEF68
8212
sv2                     L       code            FFFFFFFFFFFFEF84
8213
SV1                     L       code            FFFFFFFFFFFFEFAC
8214
QWHAT                   L       code            FFFFFFFFFFFFF024
8215
FIN                     L       code            FFFFFFFFFFFFEFB0
8216
FI1                     L       code            FFFFFFFFFFFFEFCC
8217
FI2                     L       code            FFFFFFFFFFFFEFE4
8218
ENDCHK                  L       code            FFFFFFFFFFFFEFEC
8219
ec1                     L       code            FFFFFFFFFFFFF00C
8220
TOOBIG                  L       code            FFFFFFFFFFFFF014
8221
QSORRY                  L       code            FFFFFFFFFFFFF01C
8222
GETLN                   L       code            FFFFFFFFFFFFF068
8223
GL1                     L       code            FFFFFFFFFFFFF090
8224
GL3                     L       code            FFFFFFFFFFFFF0C4
8225
GL4                     L       code            FFFFFFFFFFFFF0EC
8226
GL2                     L       code            FFFFFFFFFFFFF0A8
8227
GL7                     L       code            FFFFFFFFFFFFF11C
8228
GL6                     L       code            FFFFFFFFFFFFF114
8229
GL5                     L       code            FFFFFFFFFFFFF0F8
8230
FNDLN                   L       code            FFFFFFFFFFFFF138
8231
fl1                     L       code            FFFFFFFFFFFFF144
8232
FNDLNP                  L       code            FFFFFFFFFFFFF148
8233
FNDRET1                 L       code            FFFFFFFFFFFFF174
8234
FNDNXT                  L       code            FFFFFFFFFFFFF188
8235
FNDRET2                 L       code            FFFFFFFFFFFFF180
8236
FNDRET                  L       code            FFFFFFFFFFFFF16C
8237
FNDSKP                  L       code            FFFFFFFFFFFFF18C
8238
MVUP1                   L       code            FFFFFFFFFFFFF19C
8239
MVUP                    L       code            FFFFFFFFFFFFF1AC
8240
MVRET                   L       code            FFFFFFFFFFFFF1B0
8241
MVDOWN1                 L       code            FFFFFFFFFFFFF1B4
8242
MVDOWN                  L       code            FFFFFFFFFFFFF1C4
8243
POPA                    L       code            FFFFFFFFFFFFF1CC
8244
PP1                     L       code            FFFFFFFFFFFFF1FC
8245
PUSHA                   L       code            FFFFFFFFFFFFF200
8246
PU1                     L       code            FFFFFFFFFFFFF240
8247
PRTSTG                  L       code            FFFFFFFFFFFFF24C
8248
PS1                     L       code            FFFFFFFFFFFFF268
8249
PRTRET                  L       code            FFFFFFFFFFFFF288
8250
QTSTG                   L       code            FFFFFFFFFFFFF2A4
8251
QT1                     L       code            FFFFFFFFFFFFF2BC
8252
QT2                     L       code            FFFFFFFFFFFFF2FC
8253
QT3                     L       code            FFFFFFFFFFFFF2D4
8254
QT4                     L       code            FFFFFFFFFFFFF2E8
8255
QT5                     L       code            FFFFFFFFFFFFF308
8256
prCRLF                  L       code            FFFFFFFFFFFFF310
8257
PRTNUM                  L       code            FFFFFFFFFFFFF330
8258
PN2                     L       code            FFFFFFFFFFFFF360
8259
PN1                     L       code            FFFFFFFFFFFFF364
8260
PN6                     L       code            FFFFFFFFFFFFF380
8261
PN4                     L       code            FFFFFFFFFFFFF390
8262
PN3                     L       code            FFFFFFFFFFFFF384
8263
PN5                     L       code            FFFFFFFFFFFFF39C
8264
PNRET                   L       code            FFFFFFFFFFFFF3B0
8265
PRTHEXNUM               L       code            FFFFFFFFFFFFF3C8
8266
PHN1                    L       code            FFFFFFFFFFFFF400
8267
PHN7                    L       code            FFFFFFFFFFFFF414
8268
PHN8                    L       code            FFFFFFFFFFFFF418
8269
PHN6                    L       code            FFFFFFFFFFFFF430
8270
PHN4                    L       code            FFFFFFFFFFFFF440
8271
PHN3                    L       code            FFFFFFFFFFFFF434
8272
PHN5                    L       code            FFFFFFFFFFFFF44C
8273
PHNRET                  L       code            FFFFFFFFFFFFF460
8274
PRTLN                   L       code            FFFFFFFFFFFFF478
8275
TSTC                    L       code            FFFFFFFFFFFFF4C0
8276
TC1                     L       code            FFFFFFFFFFFFF4E8
8277
TSTNUM                  L       code            FFFFFFFFFFFFF4F8
8278
TN1                     L       code            FFFFFFFFFFFFF50C
8279
TSNMRET                 L       code            FFFFFFFFFFFFF54C
8280
TN2                     L       code            FFFFFFFFFFFFF534
8281
IGNBLK                  L       code            FFFFFFFFFFFFF554
8282
IGB2                    L       code            FFFFFFFFFFFFF55C
8283
IGB1                    L       code            FFFFFFFFFFFFF568
8284
IGBRET                  L       code            FFFFFFFFFFFFF570
8285
TOUPBUF                 L       code            FFFFFFFFFFFFF578
8286
TOUPB1                  L       code            FFFFFFFFFFFFF588
8287
TOUPBRT                 L       code            FFFFFFFFFFFFF5C4
8288
DOQUO                   L       code            FFFFFFFFFFFFF5AC
8289
DOQUO1                  L       code            FFFFFFFFFFFFF5B8
8290
toUpper                 L       code            FFFFFFFFFFFFF5CC
8291
TOUPRET                 L       code            FFFFFFFFFFFFF5D8
8292
CHKIO                   L       code            FFFFFFFFFFFFF5DC
8293
CHKRET2                 L       code            FFFFFFFFFFFFF5F4
8294
CHKRET                  L       code            FFFFFFFFFFFFF5F8
8295
PRMESG                  L       code            FFFFFFFFFFFFF604
8296
PRMESG1                 L       code            FFFFFFFFFFFFF614
8297
PRMRET                  L       code            FFFFFFFFFFFFF628
8298
PRMESGAUX               L       code            FFFFFFFFFFFFF638
8299
PRMESGA1                L       code            FFFFFFFFFFFFF648
8300
PRMRETA                 L       code            FFFFFFFFFFFFF65C
8301
OUTC                    L       code            FFFFFFFFFFFFF66C
8302
INC                     L       code            FFFFFFFFFFFFF670
8303
AUXIN                   L       code            FFFFFFFFFFFFF674
8304
AXIRET_ZERO             L       code            FFFFFFFFFFFFF684
8305
AXIRET                  L       code            FFFFFFFFFFFFF680
8306
AUXOUT                  L       code            FFFFFFFFFFFFF68C
8307
_cls                    L       code            FFFFFFFFFFFFF690
8308
_wait10                 L       code            FFFFFFFFFFFFF698
8309
_getATAStatus           L       code            FFFFFFFFFFFFF69C
8310
_waitCFNotBusy          L       code            FFFFFFFFFFFFF6A0
8311
_rdcf                   L       code            FFFFFFFFFFFFF6A4
8312
rdcf6                   L       code            FFFFFFFFFFFFF6A8
8313
BYEBYE                  L       code            FFFFFFFFFFFFF8A0
8314
msgInit                 L       code            FFFFFFFFFFFFF6B8
8315
OKMSG                   L       code            FFFFFFFFFFFFF6EE
8316
msgWhat                 L       code            FFFFFFFFFFFFF6F5
8317
SRYMSG                  L       code            FFFFFFFFFFFFF6FD
8318
CLMSG                   L       code            FFFFFFFFFFFFF703
8319
msgReadError            L       code            FFFFFFFFFFFFF706
8320
msgNumTooBig            L       code            FFFFFFFFFFFFF721
8321
msgDivZero              L       code            FFFFFFFFFFFFF735
8322
msgVarSpace             L       code            FFFFFFFFFFFFF748
8323
msgBytesFree            L       code            FFFFFFFFFFFFF760
8324
msgReady                L       code            FFFFFFFFFFFFF76E
8325
msgComma                L       code            FFFFFFFFFFFFF778
8326
msgLineRange            L       code            FFFFFFFFFFFFF78C
8327
msgVar                  L       code            FFFFFFFFFFFFF7A2
8328
msgRNDBad               L       code            FFFFFFFFFFFFF7B9
8329
msgSYSBad               L       code            FFFFFFFFFFFFF7CD
8330
msgInputVar             L       code            FFFFFFFFFFFFF7DF
8331
msgNextFor              L       code            FFFFFFFFFFFFF7FC
8332
msgNextVar              L       code            FFFFFFFFFFFFF80F
8333
msgBadGotoGosub         L       code            FFFFFFFFFFFFF833
8334
msgRetWoGosub           L       code            FFFFFFFFFFFFF850
8335
msgTooBig               L       code            FFFFFFFFFFFFF867
8336
msgExtraChars           L       code            FFFFFFFFFFFFF87C
8337 27 robfinch
LSTROM                  C       constant        0000000000000000
8338 46 robfinch
ramtest                 L       code            FFFFFFFFFFFFF8B0
8339
ramtest2                L       code            FFFFFFFFFFFFF8C4
8340
ramtest1                L       code            FFFFFFFFFFFFF8E8
8341
ramtest4                L       code            FFFFFFFFFFFFF8F0
8342
ramtest3                L       code            FFFFFFFFFFFFF91C
8343
ramtest8                L       code            FFFFFFFFFFFFF98C
8344
ramtest5                L       code            FFFFFFFFFFFFF934
8345
ramtest6                L       code            FFFFFFFFFFFFF958
8346
ramtest7                L       code            FFFFFFFFFFFFF960
8347
ramtest9                L       code            FFFFFFFFFFFFF994
8348
ramtest10               L       code            FFFFFFFFFFFFF99C
8349
iberr_rout              L       code            FFFFFFFFFFFFF9A4
8350
dberr_rout              L       code            FFFFFFFFFFFFF9BC
8351
dberr1                  L       code            FFFFFFFFFFFFF9F0
8352
msgdberr                L       code            FFFFFFFFFFFFFA20
8353
msgEPC                  L       code            FFFFFFFFFFFFFA34
8354
msgiberr                L       code            FFFFFFFFFFFFFA3B
8355
irqrout                 L       code            FFFFFFFFFFFFFA5C
8356
irq1000Hz               L       code            FFFFFFFFFFFFFABC
8357
irq100Hz                L       code            FFFFFFFFFFFFFAF0
8358
irqSerial               L       code            FFFFFFFFFFFFFB10
8359
irqRaster               L       code            FFFFFFFFFFFFFB1C
8360
irqKeybd                L       code            FFFFFFFFFFFFFB28
8361
irqColdStart            L       code            FFFFFFFFFFFFFB34
8362
irqret                  L       code            FFFFFFFFFFFFFAF8
8363
nmirout                 L       code            FFFFFFFFFFFFFB38
8364
msgPerr                 L       code            FFFFFFFFFFFFFB80
8365
ui_irout                L       code            FFFFFFFFFFFFFB94
8366
ui_irout1               L       code            FFFFFFFFFFFFFBB8
8367
msgUnimp                L       code            FFFFFFFFFFFFFBC0
8368
DTLBHandler             L       code            FFFFFFFFFFFFFBE0
8369
dh1                     L       code            FFFFFFFFFFFFFBF0

powered by: WebSVN 2.1.0

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