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