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
|