URL
https://opencores.org/ocsvn/raptor64/raptor64/trunk
Subversion Repositories raptor64
[/] [raptor64/] [trunk/] [software/] [sample code/] [bootrom.lst] - Rev 53
Go to most recent revision | Compare with Previous | Blame | View Log
; ============================================================================
; __
; \\__/ o\ (C) 2012-2013 Robert Finch, Stratford
; \ __ / All rights reserved.
; \/_// robfinch<remove>@opencores.org
; ||
;
;
; This source file is free software: you can redistribute it and/or modify
; it under the terms of the GNU Lesser General Public License as published
; by the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This source file is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
;
; ============================================================================
;
CR EQU 0x0D ;ASCII equates
LF EQU 0x0A
TAB EQU 0x09
CTRLC EQU 0x03
CTRLH EQU 0x08
CTRLI EQU 0x09
CTRLJ EQU 0x0A
CTRLK EQU 0x0B
CTRLM EQU 0x0D
CTRLS EQU 0x13
CTRLX EQU 0x18
XON EQU 0x11
XOFF EQU 0x13
EX_IRQ EQU 449
DATA_PRESENT EQU 0x01 ; there is data preset at the serial port bc_uart3
XMIT_NOT_FULL EQU 0x20
BUFLEN EQU 80 ; length of keyboard input buffer
; Initial stack tops for contexts
; Each context gets 1k from the special 16k startup stack memory
;
STACKTOP0 EQU 0xFFFF_FFFF_FFFE_FFF8
STACKTOP1 EQU 0xFFFF_FFFF_FFFE_FBF8
STACKTOP2 EQU 0xFFFF_FFFF_FFFE_F7F8
STACKTOP3 EQU 0xFFFF_FFFF_FFFE_F3F8
STACKTOP4 EQU 0xFFFF_FFFF_FFFE_EFF8
STACKTOP5 EQU 0xFFFF_FFFF_FFFE_EBF8
STACKTOP6 EQU 0xFFFF_FFFF_FFFE_E7F8
STACKTOP7 EQU 0xFFFF_FFFF_FFFE_E3F8
STACKTOP8 EQU 0xFFFF_FFFF_FFFE_DFF8
STACKTOP9 EQU 0xFFFF_FFFF_FFFE_DBF8
STACKTOP10 EQU 0xFFFF_FFFF_FFFE_D7F8
STACKTOP11 EQU 0xFFFF_FFFF_FFFE_D3F8
STACKTOP12 EQU 0xFFFF_FFFF_FFFE_CFF8
STACKTOP13 EQU 0xFFFF_FFFF_FFFE_CBF8
STACKTOP14 EQU 0xFFFF_FFFF_FFFE_C7F8
STACKTOP15 EQU 0xFFFF_FFFF_FFFE_C3F8
; BOOT ROM routines
TCBSize EQU 0x200 ; 512 bytes per TCB
TCBBase EQU 0x00000001_00000000 ; TCB pages
TCBr1 EQU 0x00
TCBr2 EQU 0x08
TCBr3 EQU 0x10
TCBr4 EQU 0x18
TCBr5 EQU 0x20
TCBr6 EQU 0x28
TCBr7 EQU 0x30
TCBr8 EQU 0x38
TCBr9 EQU 0x40
TCBr10 EQU 0x48
TCBr11 EQU 0x50
TCBr12 EQU 0x58
TCBr13 EQU 0x60
TCBr14 EQU 0x68
TCBr15 EQU 0x70
TCBr16 EQU 0x78
TCBr17 EQU 0x80
TCBr18 EQU 0x88
TCBr19 EQU 0x90
TCBr20 EQU 0x98
TCBr21 EQU 0xA0
TCBr22 EQU 0xA8
TCBr23 EQU 0xB0
TCBr24 EQU 0xB8
TCBr25 EQU 0xC0
TCBr26 EQU 0xC8
TCBr27 EQU 0xD0
TCBr28 EQU 0xD8
TCBr29 EQU 0xE0
TCBr30 EQU 0xE8
TCBr31 EQU 0xF0
SCREENGATE EQU 0x00
KEYBDGATE EQU 0x01
VIDEOGATE EQU 0x02
CARDGATE EQU 0x03
warmStart EQU 0x1020
usrJmp EQU 0x1028
TickIRQAddr EQU 0x1030
TaskBlock EQU 0x1038
Milliseconds EQU 0x1400
Lastloc EQU 0x1408
CharColor EQU 0x1410
ScreenColor EQU 0x1414
CursorRow EQU 0x1417
CursorCol EQU 0x1418
CursorFlash EQU 0x141A
KeybdEcho EQU 0x141C
KeybdBuffer EQU 0x1440
KeybdHead EQU 0x1450
KeybdTail EQU 0x1451
sp_save EQU 0x1460
lr_save EQU 0x1468
r1_save EQU 0x1470
r2_save EQU 0x1478
r26_save EQU 0x1480
Score EQU 0x1500
Manpos EQU 0x1508
MissileActive EQU 0x1510
MissileX EQU 0x1512
MissileY EQU 0x1514
InvadersRow1 EQU 0x1520
InvadersRow2 EQU 0x1530
InvadersRow3 EQU 0x1540
InvadersRow4 EQU 0x1550
InvadersRow5 EQU 0x1560
InvadersColpos EQU 0x1570
InvadersRowpos EQU 0x1571
Uart_rxfifo EQU 0x1600
Uart_rxhead EQU 0x1800
Uart_rxtail EQU 0x1802
Uart_ms EQU 0x1808
Uart_rxrts EQU 0x1809
Uart_rxdtr EQU 0x180A
Uart_rxxon EQU 0x180B
Uart_rxflow EQU 0x180C
Uart_fon EQU 0x180E
Uart_foff EQU 0x1810
Uart_txrts EQU 0x1812
Uart_txdtr EQU 0x1813
Uart_txxon EQU 0x1814
Uart_txxonoff EQU 0x1815
TaskList EQU 0x2000
ReadyList1 EQU 0x2000
ReadyList2 EQU 0x2020
ReadyList3 EQU 0x2040
ReadyList4 EQU 0x2060
ReadyList5 EQU 0x2080
ReadyNdx1 EQU 0x20A0
ReadyNdx2 EQU 0x20A1
ReadyNdx3 EQU 0x20A2
ReadyNdx4 EQU 0x20A3
ReadyNdx5 EQU 0x20A4
RunningTCB EQU 0x20A6
NextToRunTCB EQU 0x20A8
r1save EQU 0x20B0
r2save EQU 0x20B8
AXCstart EQU 0x20C0
; Context startup address table
;
ctx0start EQU 0x20D0
ctx1start EQU 0x20D8
ctx2start EQU 0x20E0
ctx3start EQU 0x20E8
ctx4start EQU 0x20F0
ctx5start EQU 0x20F8
ctx6start EQU 0x2100
ctx7start EQU 0x2108
ctx8start EQU 0x2110
ctx9start EQU 0x2118
ctx10start EQU 0x2120
ctx11start EQU 0x2128
ctx12start EQU 0x2130
ctx13start EQU 0x2138
ctx14start EQU 0x2140
ctx15start EQU 0x2148
sp_saves EQU 0x2200
sp_saves_end EQU 0x2280
p100IRQvec EQU 0x3000
keybdIRQvec EQU 0x3008
serialIRQvec EQU 0x3010
rasterIRQvec EQU 0x3018
startSector EQU 0x30F8
BPB EQU 0x3100
TEXTSCR EQU 0xD0_0000
COLORSCR EQU 0xD1_0000
TEXTREG EQU 0xDA_0000
TEXT_COLS EQU 0x0
TEXT_ROWS EQU 0x2
TEXT_CURPOS EQU 0x16
KEYBD EQU 0xDC_0000
KEYBDCLR EQU 0xDC_0002
UART EQU 0xDC_0A00
UART_LS EQU 0xDC_0A01
UART_MS EQU 0xDC_0A02
UART_IS EQU 0xDC_0A03
UART_IE EQU 0xDC_0A04
UART_MC EQU 0xDC_0A06
DATETIME EQU 0xDC_0400
SPIMASTER EQU 0xDC_0500
SPI_MASTER_VERSION_REG EQU 0x00
SPI_MASTER_CONTROL_REG EQU 0x01
SPI_TRANS_TYPE_REG EQU 0x02
SPI_TRANS_CTRL_REG EQU 0x03
SPI_TRANS_STATUS_REG EQU 0x04
SPI_TRANS_ERROR_REG EQU 0x05
SPI_DIRECT_ACCESS_DATA_REG EQU 0x06
SPI_SD_ADDR_7_0_REG EQU 0x07
SPI_SD_ADDR_15_8_REG EQU 0x08
SPI_SD_ADDR_23_16_REG EQU 0x09
SPI_SD_ADDR_31_24_REG EQU 0x0a
SPI_RX_FIFO_DATA_REG EQU 0x10
SPI_RX_FIFO_DATA_COUNT_MSB EQU 0x12
SPI_RX_FIFO_DATA_COUNT_LSB EQU 0x13
SPI_RX_FIFO_CTRL_REG EQU 0x14
SPI_TX_FIFO_DATA_REG EQU 0x20
SPI_TX_FIFO_CTRL_REG EQU 0x24
SPI_INIT_SD EQU 0x01
SPI_TRANS_START EQU 0x01
SPI_TRANS_BUSY EQU 0x01
SPI_INIT_NO_ERROR EQU 0x00
SPI_READ_NO_ERROR EQU 0x00
RW_READ_SD_BLOCK EQU 0x02
RW_WRITE_SD_BLOCK EQU 0x03
PIC EQU 0xDC_0FF0
PIC_IE EQU 0xDC_0FF2
PSG EQU 0xD5_0000
PSGFREQ0 EQU 0xD5_0000
PSGPW0 EQU 0xD5_0002
PSGCTRL0 EQU 0xD5_0004
PSGADSR0 EQU 0xD5_0006
SPRRAM EQU 0xD8_0000
AC97 EQU 0xDC_1000
TMP EQU 0xDC_0300
LED EQU 0xDC_0600
ETHMAC EQU 0xDC_2000
CONFIGREC EQU 0xDC_FFFF
MIIMODER EQU 0x28
MIIADDRESS EQU 0x30
GACCEL EQU 0xDA_E000
RASTERIRQ EQU 0xDA_0100
BOOT_STACK EQU 0xFFFF_FFFF_FFFE_FFF8
SPRITEREGS EQU 0xDA_D000
BITMAPSCR EQU 0x00000001_00200000
BOOTJMP EQU 0x100800204
txempty EQU 0x40
rxfull EQU 0x01
;
; Internal variables follow:
;
0000000100600000 bss
0000000000001048 org 0x1048
0000000000000000 pos dh 0 ; text screen position
1050 0000000000000000 lineLinkTbl fill.b 47,0 ; screen line link table
1058 0000000000000000
1060 0000000000000000
1068 0000000000000000
1070 0000000000000000
1078 0000000000000000
0000000000001088 align 8
0000000000001088 0000000000000001 OSSP dw 1 ; OS value of sp
0000000000001090 0000000000000001 CURRNT dw 1 ; Current line pointer
0000000000001098 0000000000000001 STKGOS dw 1 ; Saves stack pointer in 'GOSUB'
00000000000010A0 0000000000000001 STKINP dw 1 ; Saves stack pointer during 'INPUT'
00000000000010A8 0000000000000001 LOPVAR dw 1 ; 'FOR' loop save area
00000000000010B0 0000000000000001 LOPINC dw 1 ; increment
00000000000010B8 0000000000000001 LOPLMT dw 1 ; limit
00000000000010C0 0000000000000001 LOPLN dw 1 ; line number
00000000000010C8 0000000000000001 LOPPT dw 1 ; text pointer
00000000000010D0 0000000000000001 TXTUNF dw 1 ; points to unfilled text area
00000000000010D8 0000000000000001 VARBGN dw 1 ; points to variable area
00000000000010E0 0000000000000001 IVARBGN dw 1 ; points to integer variable area
00000000000010E8 0000000000000001 SVARBGN dw 1 ; points to string variable area
00000000000010F0 0000000000000001 FVARBGN dw 1 ; points to float variable area
00000000000010F8 0000000000000001 STKBOT dw 1 ; holds lower limit for stack growth
1100 0000000000000000 NUMWKA fill.b 24,0 ; numeric work area
1108 0000000000000000
1110 0000000000000000
1118 0000000000000000 BUFFER fill.b BUFLEN,0x00 ; Keyboard input buffer
1120 0000000000000000
1128 0000000000000000
1130 0000000000000000
1138 0000000000000000
1140 0000000000000000
1148 0000000000000000
1150 0000000000000000
1158 0000000000000000
1160 0000000000000000
000000000000116E bss
0000000100600000 org 0x1_00600000
TXT equ 0x1_00600000 ; Beginning of program area
; org 0x070
; iret
; nop
; nop
; nop
; nop
; nop
; nop
; nop
;
0000000000000000 code
FFFFFFFFFFFFB000 org 0xFFFF_FFFF_FFFF_B000
; jump table
;
FFFFFFFFFFFFB000 33FFEDA4 jmp SerialGetChar
FFFFFFFFFFFFB004 33FFED5C jmp SerialPutChar
FFFFFFFFFFFFB008 33FFEF05 jmp SetKeyboardEcho
FFFFFFFFFFFFB00C 33FFEF1C jmp KeybdCheckForKey
FFFFFFFFFFFFB010 33FFEF07 jmp KeybdGetChar
FFFFFFFFFFFFB014 33FFF07F jmp DisplayChar
FFFFFFFFFFFFB018 33FFF122 jmp DisplayString
FFFFFFFFFFFFB01C 33FFF13F jmp DisplayNum
FFFFFFFFFFFFB020 33FFF06F jmp CalcScreenLoc
FFFFFFFFFFFFB024 33FFF011 jmp ClearScreen
FFFFFFFFFFFFB028 33FFF169 jmp DisplayWord
FFFFFFFFFFFFB02C start:
; lea MSGRAM,a1
; jsr DisplayString
FFFFFFFFFFFFB02C ColdStart:
FFFFFFFFFFFFB02C 0000000B icache_off ; turn on the ICache
FFFFFFFFFFFFB030 0000000D dcache_off ; turn on the DCache
; Make sure semaphores are available by closing the gates.
; We don't know what power up state is.
FFFFFFFFFFFFB034 02000075 cmgi #KEYBDGATE
FFFFFFFFFFFFB038 020000B5 cmgi #VIDEOGATE
; Initialize the context startup address table with NULL
FFFFFFFFFFFFB03C 0410840A xor r1,r1,r1
FFFFFFFFFFFFB040 6600A0D0 sw r1,ctx0start
FFFFFFFFFFFFB044 6600A0D8 sw r1,ctx1start
FFFFFFFFFFFFB048 6600A0E0 sw r1,ctx2start
FFFFFFFFFFFFB04C 6600A0E8 sw r1,ctx3start
FFFFFFFFFFFFB050 6600A0F0 sw r1,ctx4start
FFFFFFFFFFFFB054 6600A0F8 sw r1,ctx5start
FFFFFFFFFFFFB058 6600A100 sw r1,ctx6start
FFFFFFFFFFFFB05C 6600A108 sw r1,ctx7start
FFFFFFFFFFFFB060 6600A110 sw r1,ctx8start
FFFFFFFFFFFFB064 6600A118 sw r1,ctx9start
FFFFFFFFFFFFB068 6600A120 sw r1,ctx10start
FFFFFFFFFFFFB06C 6600A128 sw r1,ctx11start
FFFFFFFFFFFFB070 6600A130 sw r1,ctx12start
FFFFFFFFFFFFB074 6600A138 sw r1,ctx13start
FFFFFFFFFFFFB078 6600A140 sw r1,ctx14start
FFFFFFFFFFFFB07C 6600A148 sw r1,ctx15start
; Initialize the context schedule with all contexts treated equally
; There are only 16 contexts, but 256 schedule slots. Each context is
; given 16 slots distributed evenly throughout the execution pattern
; table.
;
FFFFFFFFFFFFB080 0410840A xor r1,r1,r1 ; r1 = 0
FFFFFFFFFFFFB084 ict1:
FFFFFFFFFFFFB084 0410803A mtep r1,r1 ; only the low order four bits of r1 will move to the pattern table
FFFFFFFFFFFFB088 0A108001 addui r1,r1,#1
FFFFFFFFFFFFB08C 101100FF cmpi r2,r1,#255
FFFFFFFFFFFFB090 BE207FA9 bne r2,r0,ict1
; Point the interrupt return address register of the context to the
; context startup code. The context will start up when an interrupt return
; occurs.
;
; We cannot use a loop for this. Fortunately there's only 16 contexts.
;
FFFFFFFFFFFFB094 E6BFB228 ; SETLO
FFFFFFFFFFFFB098 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB09C 03900869 mtspr IPC,r25
FFFFFFFFFFFFB0A0 E6BEFFF8 ; SETLO
FFFFFFFFFFFFB0A4 6A0D782D lea r30,STACKTOP0
FFFFFFFFFFFFB0A8 0000000F iepp
FFFFFFFFFFFFB0AC E6BFB228 ; SETLO
FFFFFFFFFFFFB0B0 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0B4 03900869 mtspr IPC,r25
FFFFFFFFFFFFB0B8 E6BEFBF8 ; SETLO
FFFFFFFFFFFFB0BC 6A0D782D lea r30,STACKTOP1
FFFFFFFFFFFFB0C0 0000000F iepp
FFFFFFFFFFFFB0C4 E6BFB228 ; SETLO
FFFFFFFFFFFFB0C8 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0CC 03900869 mtspr IPC,r25
FFFFFFFFFFFFB0D0 E6BEF7F8 ; SETLO
FFFFFFFFFFFFB0D4 6A0D782D lea r30,STACKTOP2
FFFFFFFFFFFFB0D8 0000000F iepp
FFFFFFFFFFFFB0DC E6BFB228 ; SETLO
FFFFFFFFFFFFB0E0 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0E4 03900869 mtspr IPC,r25
FFFFFFFFFFFFB0E8 E6BEF3F8 ; SETLO
FFFFFFFFFFFFB0EC 6A0D782D lea r30,STACKTOP3
FFFFFFFFFFFFB0F0 0000000F iepp
FFFFFFFFFFFFB0F4 E6BFB228 ; SETLO
FFFFFFFFFFFFB0F8 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0FC 03900869 mtspr IPC,r25
FFFFFFFFFFFFB100 E6BEEFF8 ; SETLO
FFFFFFFFFFFFB104 6A0D782D lea r30,STACKTOP4
FFFFFFFFFFFFB108 0000000F iepp
FFFFFFFFFFFFB10C E6BFB228 ; SETLO
FFFFFFFFFFFFB110 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB114 03900869 mtspr IPC,r25
FFFFFFFFFFFFB118 E6BEEBF8 ; SETLO
FFFFFFFFFFFFB11C 6A0D782D lea r30,STACKTOP5
FFFFFFFFFFFFB120 0000000F iepp
FFFFFFFFFFFFB124 E6BFB228 ; SETLO
FFFFFFFFFFFFB128 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB12C 03900869 mtspr IPC,r25
FFFFFFFFFFFFB130 E6BEE7F8 ; SETLO
FFFFFFFFFFFFB134 6A0D782D lea r30,STACKTOP6
FFFFFFFFFFFFB138 0000000F iepp
FFFFFFFFFFFFB13C E6BFB228 ; SETLO
FFFFFFFFFFFFB140 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB144 03900869 mtspr IPC,r25
FFFFFFFFFFFFB148 E6BEE3F8 ; SETLO
FFFFFFFFFFFFB14C 6A0D782D lea r30,STACKTOP7
FFFFFFFFFFFFB150 0000000F iepp
FFFFFFFFFFFFB154 E6BFB228 ; SETLO
FFFFFFFFFFFFB158 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB15C 03900869 mtspr IPC,r25
FFFFFFFFFFFFB160 E6BEDFF8 ; SETLO
FFFFFFFFFFFFB164 6A0D782D lea r30,STACKTOP8
FFFFFFFFFFFFB168 0000000F iepp
FFFFFFFFFFFFB16C E6BFB228 ; SETLO
FFFFFFFFFFFFB170 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB174 03900869 mtspr IPC,r25
FFFFFFFFFFFFB178 E6BEDBF8 ; SETLO
FFFFFFFFFFFFB17C 6A0D782D lea r30,STACKTOP9
FFFFFFFFFFFFB180 0000000F iepp
FFFFFFFFFFFFB184 E6BFB228 ; SETLO
FFFFFFFFFFFFB188 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB18C 03900869 mtspr IPC,r25
FFFFFFFFFFFFB190 E6BED7F8 ; SETLO
FFFFFFFFFFFFB194 6A0D782D lea r30,STACKTOP10
FFFFFFFFFFFFB198 0000000F iepp
FFFFFFFFFFFFB19C E6BFB228 ; SETLO
FFFFFFFFFFFFB1A0 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1A4 03900869 mtspr IPC,r25
FFFFFFFFFFFFB1A8 E6BED3F8 ; SETLO
FFFFFFFFFFFFB1AC 6A0D782D lea r30,STACKTOP11
FFFFFFFFFFFFB1B0 0000000F iepp
FFFFFFFFFFFFB1B4 E6BFB228 ; SETLO
FFFFFFFFFFFFB1B8 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1BC 03900869 mtspr IPC,r25
FFFFFFFFFFFFB1C0 E6BECFF8 ; SETLO
FFFFFFFFFFFFB1C4 6A0D782D lea r30,STACKTOP12
FFFFFFFFFFFFB1C8 0000000F iepp
FFFFFFFFFFFFB1CC E6BFB228 ; SETLO
FFFFFFFFFFFFB1D0 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1D4 03900869 mtspr IPC,r25
FFFFFFFFFFFFB1D8 E6BECBF8 ; SETLO
FFFFFFFFFFFFB1DC 6A0D782D lea r30,STACKTOP13
FFFFFFFFFFFFB1E0 0000000F iepp
FFFFFFFFFFFFB1E4 E6BFB228 ; SETLO
FFFFFFFFFFFFB1E8 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1EC 03900869 mtspr IPC,r25
FFFFFFFFFFFFB1F0 E6BEC7F8 ; SETLO
FFFFFFFFFFFFB1F4 6A0D782D lea r30,STACKTOP14
FFFFFFFFFFFFB1F8 0000000F iepp
FFFFFFFFFFFFB1FC E6BFB228 ; SETLO
FFFFFFFFFFFFB200 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB204 03900869 mtspr IPC,r25
FFFFFFFFFFFFB208 E6BEC3F8 ; SETLO
FFFFFFFFFFFFB20C 6A0D782D lea r30,STACKTOP15
FFFFFFFFFFFFB210 0000000F iepp
; Ensure that context zero is the active context
;
FFFFFFFFFFFFB214 ctxstart3:
FFFFFFFFFFFFB214 02008568 mfspr r1,AXC
FFFFFFFFFFFFB218 BE100068 beq r1,r0,ctxstart2
FFFFFFFFFFFFB21C 0000000F iepp
FFFFFFFFFFFFB220 BE007FAA bra ctxstart3
FFFFFFFFFFFFB224 ctxstart2:
FFFFFFFFFFFFB224 6000A0C0 sb r1,AXCstart ; save off the startup context which should be context zero
; Entry point for context startup
;
; Avoid repeating all the system initialization when a context starts up by testing whether
; or not the context is the starting context.
;
FFFFFFFFFFFFB228 ctxstart:
FFFFFFFFFFFFB228 02008568 mfspr r1,AXC
FFFFFFFFFFFFB22C 4A0120C0 lbu r2,AXCstart
FFFFFFFFFFFFB230 BE110E69 bne r1,r2,ctxstart1
;
; set system vectors
; TBA defaults to zero on reset
;
FFFFFFFFFFFFB234 E0C00000 setlo r3,#0
FFFFFFFFFFFFB238 E08001FF setlo r2,#511
FFFFFFFFFFFFB23C 9A00FB38 lea r1,nmirout
FFFFFFFFFFFFB240 csj5:
FFFFFFFFFFFFB240 66308000 sw r1,[r3]
FFFFFFFFFFFFB244 0A318008 addui r3,r3,#8
FFFFFFFFFFFFB248 BE017FCF loop r2,csj5
FFFFFFFFFFFFB24C E6BFB8A8 ; SETLO
FFFFFFFFFFFFB250 6A0D042D lea r1,VideoSC ; Video BIOS vector
FFFFFFFFFFFFB254 66008CD0 sw r1,0xCD0
FFFFFFFFFFFFB258 9A008000 lea r1,SCCARDSC ; SD Card BIOS vector
FFFFFFFFFFFFB25C 66008CE8 sw r1,0xCE8
FFFFFFFFFFFFB260 E6BFBAA8 ; SETLO
FFFFFFFFFFFFB264 6A0D042D lea r1,RTCSC ; Real time clock vector
FFFFFFFFFFFFB268 66008D00 sw r1,0xD00
FFFFFFFFFFFFB26C E6BFBB14 ; SETLO
FFFFFFFFFFFFB270 6A0D042D lea r1,KeybdSC ; keyboard BIOS vector
FFFFFFFFFFFFB274 66008D08 sw r1,0xD08
FFFFFFFFFFFFB278 9A00FA5C lea r1,irqrout
FFFFFFFFFFFFB27C 66008E08 sw r1,0xE08 ; set IRQ vector
FFFFFFFFFFFFB280 9A00FB94 lea r1,ui_irout
FFFFFFFFFFFFB284 66008F78 sw r1,0xF78 ; set unimplemented instruction vector
FFFFFFFFFFFFB288 9A00F9BC lea r1,dberr_rout
FFFFFFFFFFFFB28C 66008FE0 sw r1,0xFE0 ; set Bus error vector
FFFFFFFFFFFFB290 9A00F9A4 lea r1,iberr_rout
FFFFFFFFFFFFB294 66008FE8 sw r1,0xFE8 ; set Bus error vector
FFFFFFFFFFFFB298 9A00FB38 lea r1,nmirout
FFFFFFFFFFFFB29C 66008FF0 sw r1,0xFF0 ; set NMI vector
; set system interrupt hook vectors
FFFFFFFFFFFFB2A0 E6BFBBC0 ; SETLO
FFFFFFFFFFFFB2A4 6A0D042D lea r1,KeybdIRQ
FFFFFFFFFFFFB2A8 6600B008 sw r1,keybdIRQvec
FFFFFFFFFFFFB2AC E6BFBDCC ; SETLO
FFFFFFFFFFFFB2B0 6A0D042D lea r1,Pulse100
FFFFFFFFFFFFB2B4 6600B000 sw r1,p100IRQvec
FFFFFFFFFFFFB2B8 E6BFB768 ; SETLO
FFFFFFFFFFFFB2BC 6A0D042D lea r1,SerialIRQ
FFFFFFFFFFFFB2C0 6600B010 sw r1,serialIRQvec
FFFFFFFFFFFFB2C4 9A00D1AC lea r1,RasterIRQfn
FFFFFFFFFFFFB2C8 6600B018 sw r1,rasterIRQvec
;-------------------------------
; Initialize I/O devices
;-------------------------------
FFFFFFFFFFFFB2CC E69CFFFF ; SETLO
FFFFFFFFFFFFB2D0 EE800003 ; SETMID
FFFFFFFFFFFFB2D4 6A0D0424 inbu r1,CONFIGREC
FFFFFFFFFFFFB2D8 2A108824 bfext r1,r1,#4,#4
FFFFFFFFFFFFB2DC BE100048 beq r1,r0,skip5
FFFFFFFFFFFFB2E0 31FFEF3A call tmp_init
FFFFFFFFFFFFB2E4 skip5:
FFFFFFFFFFFFB2E4 E69CFFFF ; SETLO
FFFFFFFFFFFFB2E8 EE800003 ; SETMID
FFFFFFFFFFFFB2EC 6A0D0424 inbu r1,CONFIGREC
FFFFFFFFFFFFB2F0 2A108A2C bfext r1,r1,#5,#5
FFFFFFFFFFFFB2F4 BE100048 beq r1,r0,skip4
FFFFFFFFFFFFB2F8 31FFED3C call SerialInit
FFFFFFFFFFFFB2FC skip4:
FFFFFFFFFFFFB2FC 31FFEEEB call KeybdInit
FFFFFFFFFFFFB300 31FFED34 call PICInit
FFFFFFFFFFFFB304 31FFF453 call SetupRasterIRQ
FFFFFFFFFFFFB308 00000040 cli ; enable interrupts
; call HelloWorld
FFFFFFFFFFFFB30C E0C000CE setlo r3,#0xCE ; blue on blue
FFFFFFFFFFFFB310 62019414 sc r3,ScreenColor
FFFFFFFFFFFFB314 62019410 sc r3,CharColor
FFFFFFFFFFFFB318 42019414 lc r3,0x1414
FFFFFFFFFFFFB31C E0C00020 setlo r3,#32
FFFFFFFFFFFFB320 62019416 sc r3,0x1416 ; we do a store, then a load through the dcache
FFFFFFFFFFFFB324 42011416 lc r2,0x1416 ;
FFFFFFFFFFFFB328 BE218048 beq r2,r3,dcokay
FFFFFFFFFFFFB32C 0000000D dcache_off ; data cache failed
FFFFFFFFFFFFB330 dcokay:
FFFFFFFFFFFFB330 620020A8 sc r0,NextToRunTCB
FFFFFFFFFFFFB334 620020A6 sc r0,RunningTCB
FFFFFFFFFFFFB338 16008002 lw r1,#2 ; get rid of startup keyboard glitchs by trying to get a character
FFFFFFFFFFFFB33C 0181D097 syscall #417
FFFFFFFFFFFFB340 16008002 lw r1,#2 ; get rid of startup keyboard glitchs by trying to get a character
FFFFFFFFFFFFB344 0181D097 syscall #417
; wait for screen to be available
FFFFFFFFFFFFB348 31FFF011 call ClearScreen
FFFFFFFFFFFFB34C 31FFEFFC call ClearBmpScreen
; Test whether or not the sprite controller is present. Skip
; Initialization if it isn't.
FFFFFFFFFFFFB350 E69CFFFF ; SETLO
FFFFFFFFFFFFB354 EE800003 ; SETMID
FFFFFFFFFFFFB358 6A0D0420 inb r1,CONFIGREC
FFFFFFFFFFFFB35C 2A108004 bfext r1,r1,#0,#0
FFFFFFFFFFFFB360 BE100048 beq r1,r0,skip1
FFFFFFFFFFFFB364 31FFF3A7 call RandomizeSprram
FFFFFFFFFFFFB368 skip1:
FFFFFFFFFFFFB368 60001417 sb r0,CursorRow
FFFFFFFFFFFFB36C 60001418 sb r0,CursorCol
FFFFFFFFFFFFB370 16008001 lw r1,#1
FFFFFFFFFFFFB374 6000941A sb r1,CursorFlash
FFFFFFFFFFFFB378 E6BFB4AD ; SETLO
FFFFFFFFFFFFB37C 6A0D042D lea r1,MSGSTART
FFFFFFFFFFFFB380 31FFF130 call DisplayStringCRLF
; Test whether or not sound generator is present
; skip initialization and beep if not present
FFFFFFFFFFFFB384 E69CFFFF ; SETLO
FFFFFFFFFFFFB388 EE800003 ; SETMID
FFFFFFFFFFFFB38C 6A0D0420 inb r1,CONFIGREC
FFFFFFFFFFFFB390 2A108414 bfext r1,r1,#2,#2
FFFFFFFFFFFFB394 BE1000E8 beq r1,r0,skip2
FFFFFFFFFFFFB398 31FFF3B1 call SetupAC97 ; and Beep
FFFFFFFFFFFFB39C 16008004 lw r1,#4
FFFFFFFFFFFFB3A0 E69C0600 ; SETLO
FFFFFFFFFFFFB3A4 EE800003 ; SETMID
FFFFFFFFFFFFB3A8 6A0D0428 outb r1,LED
FFFFFFFFFFFFB3AC 31FFF3DB call Beep
FFFFFFFFFFFFB3B0 skip2:
FFFFFFFFFFFFB3B0 E6BFB428 ; SETLO
FFFFFFFFFFFFB3B4 6A0D042D lea r1,context1disp ; start a display
FFFFFFFFFFFFB3B8 6600A0D8 sw r1,ctx1start
; Startup Ethernet access ?
;
FFFFFFFFFFFFB3BC E69CFFFF ; SETLO
FFFFFFFFFFFFB3C0 EE800003 ; SETMID
FFFFFFFFFFFFB3C4 6A0D0420 inb r1,CONFIGREC
FFFFFFFFFFFFB3C8 2A10820C bfext r1,r1,#1,#1
FFFFFFFFFFFFB3CC BE100068 beq r1,r0,skip3
FFFFFFFFFFFFB3D0 9A00DD3C lea r1,eth_main
FFFFFFFFFFFFB3D4 6600A0E0 sw r1,ctx2start
FFFFFFFFFFFFB3D8 skip3:
FFFFFFFFFFFFB3D8 9A00CDD0 lea r1,RandomLines
FFFFFFFFFFFFB3DC 6600A0E8 sw r1,ctx3start
FFFFFFFFFFFFB3E0 31FFF54E call spi_init
FFFFFFFFFFFFB3E4 BE100069 bne r1,r0,skip_spi_read
FFFFFFFFFFFFB3E8 31FFF59D call spi_read_boot
FFFFFFFFFFFFB3EC 31FFF605 call loadBootFile
FFFFFFFFFFFFB3F0 skip_spi_read:
FFFFFFFFFFFFB3F0 33FFF20A jmp Monitor
FFFFFFFFFFFFB3F4 j4:
FFFFFFFFFFFFB3F4 33FFF20A jmp Monitor
FFFFFFFFFFFFB3F8 BE007FEA bra j4
; The contexts wait for a context startup address to be placed in the
; startup table. Once an address is in the table, a call to the context
; code will be made. The default is a NULL pointer, which
; causes the context to loop around back to here while waiting for a
; code to run.
;
FFFFFFFFFFFFB3FC ctxstart1:
FFFFFFFFFFFFB3FC 9A00A0D0 lea r1,ctx0start ; r1 = context start table base
FFFFFFFFFFFFB400 02010568 mfspr r2,AXC ; r2 = index into start table
FFFFFFFFFFFFB404 6A110703 lw r1,[r1+r2*8] ; r1 = context start address
FFFFFFFFFFFFB408 BE100048 beq r1,r0,ctx12
FFFFFFFFFFFFB40C 341F8000 jal lr,[r1] ; perform a call to the context code
; We might as well move to the next context, since there's nothing
; to do. This can be accomplished by tirggering a IRQ interrupt.
; We can't just increment the excution pattern pointer, because that
; would only switch the register set and not the program counter.
; An interrupt saves the program counter, and restores it from the
; IPC context register.
;
FFFFFFFFFFFFB410 ctx12:
FFFFFFFFFFFFB410 00000040 sei ; causes a priv violation. don't allow interrupts during syscall
FFFFFFFFFFFFB414 DE000000 nop ; wait for sei to take effect
FFFFFFFFFFFFB418 DE000000 nop
FFFFFFFFFFFFB41C DE000000 nop
FFFFFFFFFFFFB420 0181E097 syscall #EX_IRQ
FFFFFFFFFFFFB424 BE007ECA bra ctxstart1
; call ramtest
FFFFFFFFFFFFB428 context1disp:
; once we've started, clear the start vector so that the context
; isn't continuously restarted.
;
FFFFFFFFFFFFB428 660020D8 sw r0,ctx1start
FFFFFFFFFFFFB42C E6900000 ; SETLO
FFFFFFFFFFFFB430 EE800003 ; SETMID
FFFFFFFFFFFFB434 6A0D0C2D lea r3,TEXTSCR
FFFFFFFFFFFFB438 16008056 lw r1,#'V'
FFFFFFFFFFFFB43C 1601014A lw r2,#330
FFFFFFFFFFFFB440 1602002F lw r4,#47
FFFFFFFFFFFFB444 31FFF063 call AsciiToScreen
FFFFFFFFFFFFB448 ctx11:
FFFFFFFFFFFFB448 6A310421 inch r1,[r3+r2]
FFFFFFFFFFFFB44C 0A108001 addui r1,r1,#1
FFFFFFFFFFFFB450 6A310429 outc r1,[r3+r2]
FFFFFFFFFFFFB454 0A2100A8 addui r2,r2,#168
FFFFFFFFFFFFB458 BE027F8F loop r4,ctx11
FFFFFFFFFFFFB45C BE007E6A bra context1disp
;-----------------------------------------
; Hello World!
;-----------------------------------------
FFFFFFFFFFFFB460 HelloWorld:
FFFFFFFFFFFFB460 0FEF0018 subui r30,r30,#24
FFFFFFFFFFFFB464 67E08000 sw r1,[sp]
FFFFFFFFFFFFB468 67E10008 sw r2,8[sp]
FFFFFFFFFFFFB46C 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFB470 E6BFB4A0 ; SETLO
FFFFFFFFFFFFB474 6A0D082D lea r2,MSG
FFFFFFFFFFFFB478 j3:
FFFFFFFFFFFFB478 40208000 lb r1,[r2]
FFFFFFFFFFFFB47C BE100088 beq r1,r0,j2
FFFFFFFFFFFFB480 31FFED5C call SerialPutChar
FFFFFFFFFFFFB484 0A210001 addui r2,r2,#1
FFFFFFFFFFFFB488 BE007F8A bra j3
FFFFFFFFFFFFB48C j2:
FFFFFFFFFFFFB48C 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFB490 67E10008 sw r2,8[sp]
FFFFFFFFFFFFB494 67E08000 sw r1,[sp]
FFFFFFFFFFFFB498 37EF8018 ret #24
FFFFFFFFFFFFB498 0000000037EF8018 align 16
FFFFFFFFFFFFB4A0 align 16
FFFFFFFFFFFFB4A0 MSG:
FFFFFFFFFFFFB4A0 6F57206F6C6C6548 db "Hello World!",0
FFFFFFFFFFFFB4AD MSGSTART:
FFFFFFFFFFFFB4A8 7061520021646C72 db "Raptor64 system starting....",0
FFFFFFFFFFFFB4B0 7973203436726F74
FFFFFFFFFFFFB4B8 617473206D657473
FFFFFFFFFFFFB4C0 2E2E2E676E697472
FFFFFFFFFFFFB4C8 000000000000002E align 16
FFFFFFFFFFFFB4D0 align 16
;----------------------------------------------------------
; Initialize programmable interrupt controller (PIC)
; 0 = nmi (parity error)
; 1 = keyboard reset
; 2 = 1000Hz pulse (context switcher)
; 3 = 100Hz pulse (cursor flash)
; 4 = ethmac
; 8 = uart
; 13 = raster interrupt
; 15 = keyboard char
;----------------------------------------------------------
FFFFFFFFFFFFB4D0 PICInit:
FFFFFFFFFFFFB4D0 E6BFB4EC ; SETLO
FFFFFFFFFFFFB4D4 6A0D042D lea r1,PICret
FFFFFFFFFFFFB4D8 66009030 sw r1,TickIRQAddr
; enable: raster irq,
FFFFFFFFFFFFB4DC E07F800F setlo r1,#0x800F ; enable nmi,kbd_rst,and kbd_irq
; A10F enable serial IRQ
FFFFFFFFFFFFB4E0 E69C0FF2 ; SETLO
FFFFFFFFFFFFB4E4 EE800003 ; SETMID
FFFFFFFFFFFFB4E8 6A0D0429 outc r1,PIC_IE
FFFFFFFFFFFFB4EC PICret:
FFFFFFFFFFFFB4EC 37EF8000 ret
;==============================================================================
; Serial port
;==============================================================================
;-----------------------------------------
; Initialize the serial port
;-----------------------------------------
;
FFFFFFFFFFFFB4F0 SerialInit:
FFFFFFFFFFFFB4F0 62001800 sc r0,Uart_rxhead ; reset buffer indexes
FFFFFFFFFFFFB4F4 62001802 sc r0,Uart_rxtail
FFFFFFFFFFFFB4F8 E04001F0 setlo r1,#0x1f0
FFFFFFFFFFFFB4FC 62009810 sc r1,Uart_foff ; set threshold for XOFF
FFFFFFFFFFFFB500 E0400010 setlo r1,#0x010
FFFFFFFFFFFFB504 6200980E sc r1,Uart_fon ; set threshold for XON
FFFFFFFFFFFFB508 E0400001 setlo r1,#1
FFFFFFFFFFFFB50C E69C0A04 ; SETLO
FFFFFFFFFFFFB510 EE800003 ; SETMID
FFFFFFFFFFFFB514 6A0D0428 outb r1,UART_IE ; enable receive interrupt only
FFFFFFFFFFFFB518 60001809 sb r0,Uart_rxrts ; no RTS/CTS signals available
FFFFFFFFFFFFB51C 60001812 sb r0,Uart_txrts ; no RTS/CTS signals available
FFFFFFFFFFFFB520 60001813 sb r0,Uart_txdtr ; no DTR signals available
FFFFFFFFFFFFB524 6000180A sb r0,Uart_rxdtr ; no DTR signals available
FFFFFFFFFFFFB528 E0400001 setlo r1,#1
FFFFFFFFFFFFB52C 60009814 sb r1,Uart_txxon ; for now
FFFFFFFFFFFFB530 37EF8000 ret
;---------------------------------------------------------------------------------
; Get character directly from serial port. Blocks until a character is available.
;---------------------------------------------------------------------------------
;
FFFFFFFFFFFFB534 SerialGetCharDirect:
FFFFFFFFFFFFB534 sgc1:
FFFFFFFFFFFFB534 E69C0A01 ; SETLO
FFFFFFFFFFFFB538 EE800003 ; SETMID
FFFFFFFFFFFFB53C 6A0D0420 inb r1,UART_LS ; uart status
FFFFFFFFFFFFB540 14108001 andi r1,r1,#rxfull ; is there a char available ?
FFFFFFFFFFFFB544 BE107F88 beq r1,r0,sgc1
FFFFFFFFFFFFB548 E69C0A00 ; SETLO
FFFFFFFFFFFFB54C EE800003 ; SETMID
FFFFFFFFFFFFB550 6A0D0420 inb r1,UART
FFFFFFFFFFFFB554 37EF8000 ret
;------------------------------------------------
; Check for a character at the serial port
; returns r1 = 1 if char available, 0 otherwise
;------------------------------------------------
;
FFFFFFFFFFFFB558 SerialCheckForCharDirect:
FFFFFFFFFFFFB558 E69C0A01 ; SETLO
FFFFFFFFFFFFB55C EE800003 ; SETMID
FFFFFFFFFFFFB560 6A0D0420 inb r1,UART_LS ; uart status
FFFFFFFFFFFFB564 14108001 andi r1,r1,#rxfull ; is there a char available ?
FFFFFFFFFFFFB568 04100439 sne r1,r1,r0
FFFFFFFFFFFFB56C 37EF8000 ret
;-----------------------------------------
; Put character to serial port
; r1 = char to put
;-----------------------------------------
;
FFFFFFFFFFFFB570 SerialPutChar:
FFFFFFFFFFFFB570 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFB574 67E10000 sw r2,[sp]
FFFFFFFFFFFFB578 67E18008 sw r3,8[sp]
FFFFFFFFFFFFB57C 67E20010 sw r4,16[sp]
FFFFFFFFFFFFB580 67E28018 sw r5,24[sp]
FFFFFFFFFFFFB584 E69C0A06 ; SETLO
FFFFFFFFFFFFB588 EE800003 ; SETMID
FFFFFFFFFFFFB58C 6A0D0820 inb r2,UART_MC
FFFFFFFFFFFFB590 16210003 ori r2,r2,#3 ; assert DTR / RTS
FFFFFFFFFFFFB594 E69C0A06 ; SETLO
FFFFFFFFFFFFB598 EE800003 ; SETMID
FFFFFFFFFFFFB59C 6A0D0828 outb r2,UART_MC
FFFFFFFFFFFFB5A0 40011812 lb r2,Uart_txrts
FFFFFFFFFFFFB5A4 BE200168 beq r2,r0,spcb1
FFFFFFFFFFFFB5A8 46021400 lw r4,Milliseconds
FFFFFFFFFFFFB5AC E0C00064 setlo r3,#100 ; delay count (1 s)
FFFFFFFFFFFFB5B0 spcb3:
FFFFFFFFFFFFB5B0 80011808 inb r2,UART_MS
FFFFFFFFFFFFB5B4 1421000A andi r2,r2,#10 ; is CTS asserted ?
FFFFFFFFFFFFB5B8 BE2000C9 bne r2,r0,spcb1
FFFFFFFFFFFFB5BC 46029400 lw r5,Milliseconds
FFFFFFFFFFFFB5C0 BE42FF88 beq r4,r5,spcb3
FFFFFFFFFFFFB5C4 02520009 mov r4,r5
FFFFFFFFFFFFB5C8 BE01FF4F loop r3,spcb3
FFFFFFFFFFFFB5CC BE00046A bra spcabort
FFFFFFFFFFFFB5D0 spcb1:
FFFFFFFFFFFFB5D0 40011813 lb r2,Uart_txdtr
FFFFFFFFFFFFB5D4 BE200168 beq r2,r0,spcb2
FFFFFFFFFFFFB5D8 46021400 lw r4,Milliseconds
FFFFFFFFFFFFB5DC E0C00064 setlo r3,#100 ; delay count
FFFFFFFFFFFFB5E0 spcb4:
FFFFFFFFFFFFB5E0 80011808 inb r2,UART_MS
FFFFFFFFFFFFB5E4 14210014 andi r2,r2,#20 ; is DSR asserted ?
FFFFFFFFFFFFB5E8 BE2000C9 bne r2,r0,spcb2
FFFFFFFFFFFFB5EC 46029400 lw r5,Milliseconds
FFFFFFFFFFFFB5F0 BE42FF88 beq r4,r5,spcb4
FFFFFFFFFFFFB5F4 02520009 mov r4,r5
FFFFFFFFFFFFB5F8 BE01FF4F loop r3,spcb4
FFFFFFFFFFFFB5FC BE0002EA bra spcabort
FFFFFFFFFFFFB600 spcb2:
FFFFFFFFFFFFB600 40011814 lb r2,Uart_txxon
FFFFFFFFFFFFB604 BE2000C8 beq r2,r0,spcb5
FFFFFFFFFFFFB608 spcb6:
FFFFFFFFFFFFB608 40011815 lb r2,Uart_txxonoff
FFFFFFFFFFFFB60C BE200088 beq r2,r0,spcb5
FFFFFFFFFFFFB610 80021808 inb r4,UART_MS
FFFFFFFFFFFFB614 14420080 andi r4,r4,#0x80 ; DCD ?
FFFFFFFFFFFFB618 BE407F89 bne r4,r0,spcb6
FFFFFFFFFFFFB61C spcb5:
FFFFFFFFFFFFB61C 46021400 lw r4,Milliseconds
FFFFFFFFFFFFB620 E0C00064 setlo r3,#100 ; wait up to 1s
FFFFFFFFFFFFB624 spcb8:
FFFFFFFFFFFFB624 E69C0A01 ; SETLO
FFFFFFFFFFFFB628 EE800003 ; SETMID
FFFFFFFFFFFFB62C 6A0D0820 inb r2,UART_LS
FFFFFFFFFFFFB630 14210020 andi r2,r2,#0x20 ; tx not full ?
FFFFFFFFFFFFB634 BE2000C9 bne r2,r0,spcb7
FFFFFFFFFFFFB638 46029400 lw r5,Milliseconds
FFFFFFFFFFFFB63C BE42FF48 beq r4,r5,spcb8
FFFFFFFFFFFFB640 02520009 mov r4,r5
FFFFFFFFFFFFB644 BE01FF0F loop r3,spcb8
FFFFFFFFFFFFB648 BE00008A bra spcabort
FFFFFFFFFFFFB64C spcb7:
FFFFFFFFFFFFB64C E69C0A00 ; SETLO
FFFFFFFFFFFFB650 EE800003 ; SETMID
FFFFFFFFFFFFB654 6A0D0428 outb r1,UART
FFFFFFFFFFFFB658 spcabort:
FFFFFFFFFFFFB658 47E10000 lw r2,[sp]
FFFFFFFFFFFFB65C 47E18008 lw r3,8[sp]
FFFFFFFFFFFFB660 47E20010 lw r4,16[sp]
FFFFFFFFFFFFB664 47E28018 lw r5,24[sp]
FFFFFFFFFFFFB668 37EF8020 ret #32
;-------------------------------------------------
; Compute number of characters in recieve buffer.
; r4 = number of chars
;-------------------------------------------------
FFFFFFFFFFFFB66C CharsInRxBuf:
FFFFFFFFFFFFB66C 42021800 lc r4,Uart_rxhead
FFFFFFFFFFFFB670 42011802 lc r2,Uart_rxtail
FFFFFFFFFFFFB674 04411005 subu r4,r4,r2
FFFFFFFFFFFFB678 BE4000A3 bgt r4,r0,cirxb1
FFFFFFFFFFFFB67C E1000200 setlo r4,#0x200
FFFFFFFFFFFFB680 04411003 addu r4,r4,r2
FFFFFFFFFFFFB684 42011800 lc r2,Uart_rxhead
FFFFFFFFFFFFB688 04411005 subu r4,r4,r2
FFFFFFFFFFFFB68C cirxb1:
FFFFFFFFFFFFB68C 37EF8000 ret
;----------------------------------------------
; Get character from rx fifo
; If the fifo is empty enough then send an XON
;----------------------------------------------
;
FFFFFFFFFFFFB690 SerialGetChar:
FFFFFFFFFFFFB690 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFB694 67E10000 sw r2,[sp]
FFFFFFFFFFFFB698 67E18008 sw r3,8[sp]
FFFFFFFFFFFFB69C 67E20010 sw r4,16[sp]
FFFFFFFFFFFFB6A0 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFB6A4 42019800 lc r3,Uart_rxhead
FFFFFFFFFFFFB6A8 42011802 lc r2,Uart_rxtail
FFFFFFFFFFFFB6AC BE218528 beq r2,r3,sgcfifo1 ; is there a char available ?
FFFFFFFFFFFFB6B0 9A019600 lea r3,Uart_rxfifo
FFFFFFFFFFFFB6B4 6A218400 lb r1,[r2+r3] ; get the char from the fifo into r1
FFFFFFFFFFFFB6B8 0A210001 addui r2,r2,#1 ; increment the fifo pointer
FFFFFFFFFFFFB6BC 142101FF andi r2,r2,#0x1ff
FFFFFFFFFFFFB6C0 62011802 sc r2,Uart_rxtail
FFFFFFFFFFFFB6C4 4001180C lb r2,Uart_rxflow ; using flow control ?
FFFFFFFFFFFFB6C8 BE2003A8 beq r2,r0,sgcfifo2
FFFFFFFFFFFFB6CC 4201980E lc r3,Uart_fon ; enough space in Rx buffer ?
FFFFFFFFFFFFB6D0 31FFED9B call CharsInRxBuf
FFFFFFFFFFFFB6D4 BE418343 bgt r4,r3,sgcfifo2
FFFFFFFFFFFFB6D8 6000180C sb r0,Uart_rxflow ; flow off
FFFFFFFFFFFFB6DC 40021809 lb r4,Uart_rxrts
FFFFFFFFFFFFB6E0 BE400108 beq r4,r0,sgcfifo3
FFFFFFFFFFFFB6E4 E69C0A06 ; SETLO
FFFFFFFFFFFFB6E8 EE800003 ; SETMID
FFFFFFFFFFFFB6EC 6A0D1020 inb r4,UART_MC ; set rts bit in MC
FFFFFFFFFFFFB6F0 16420002 ori r4,r4,#2
FFFFFFFFFFFFB6F4 E69C0A06 ; SETLO
FFFFFFFFFFFFB6F8 EE800003 ; SETMID
FFFFFFFFFFFFB6FC 6A0D1028 outb r4,UART_MC
FFFFFFFFFFFFB700 sgcfifo3:
FFFFFFFFFFFFB700 4002180A lb r4,Uart_rxdtr
FFFFFFFFFFFFB704 BE400108 beq r4,r0,sgcfifo4
FFFFFFFFFFFFB708 E69C0A06 ; SETLO
FFFFFFFFFFFFB70C EE800003 ; SETMID
FFFFFFFFFFFFB710 6A0D1020 inb r4,UART_MC ; set DTR
FFFFFFFFFFFFB714 16420001 ori r4,r4,#1
FFFFFFFFFFFFB718 E69C0A06 ; SETLO
FFFFFFFFFFFFB71C EE800003 ; SETMID
FFFFFFFFFFFFB720 6A0D1028 outb r4,UART_MC
FFFFFFFFFFFFB724 sgcfifo4:
FFFFFFFFFFFFB724 4002180B lb r4,Uart_rxxon
FFFFFFFFFFFFB728 BE4000A8 beq r4,r0,sgcfifo5
FFFFFFFFFFFFB72C E1000011 setlo r4,#XON
FFFFFFFFFFFFB730 E69C0A00 ; SETLO
FFFFFFFFFFFFB734 EE800003 ; SETMID
FFFFFFFFFFFFB738 6A0D1028 outb r4,UART
FFFFFFFFFFFFB73C sgcfifo5:
FFFFFFFFFFFFB73C sgcfifo2: ; return with char in r1
FFFFFFFFFFFFB73C 47E10000 lw r2,[sp]
FFFFFFFFFFFFB740 47E18008 lw r3,8[sp]
FFFFFFFFFFFFB744 47E20010 lw r4,16[sp]
FFFFFFFFFFFFB748 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFB74C 37EF8020 ret #32
FFFFFFFFFFFFB750 sgcfifo1:
FFFFFFFFFFFFB750 E07FFFFF setlo r1,#-1 ; no char available
FFFFFFFFFFFFB754 47E10000 lw r2,[sp]
FFFFFFFFFFFFB758 47E18008 lw r3,8[sp]
FFFFFFFFFFFFB75C 47E20010 lw r4,16[sp]
FFFFFFFFFFFFB760 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFB764 37EF8020 ret #32
;-----------------------------------------
; Serial port IRQ
;-----------------------------------------
;
FFFFFFFFFFFFB768 SerialIRQ:
FFFFFFFFFFFFB768 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFB76C 67E08000 sw r1,[sp]
FFFFFFFFFFFFB770 67E10008 sw r2,8[sp]
FFFFFFFFFFFFB774 67E18010 sw r3,16[sp]
FFFFFFFFFFFFB778 67E20018 sw r4,24[sp]
FFFFFFFFFFFFB77C 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFB780 E69C0A03 ; SETLO
FFFFFFFFFFFFB784 EE800003 ; SETMID
FFFFFFFFFFFFB788 6A0D0420 inb r1,UART_IS ; get interrupt status
FFFFFFFFFFFFB78C BE1000A1 bge r1,r0,sirq1
FFFFFFFFFFFFB790 1410807F andi r1,r1,#0x7f ; switch on interrupt type
FFFFFFFFFFFFB794 B0100D04 beqi r1,#4,srxirq
FFFFFFFFFFFFB798 B0100B0C beqi r1,#0xC,stxirq
FFFFFFFFFFFFB79C B0100710 beqi r1,#0x10,smsirq
FFFFFFFFFFFFB7A0 sirq1:
FFFFFFFFFFFFB7A0 47E08000 lw r1,[sp]
FFFFFFFFFFFFB7A4 47E10008 lw r2,8[sp]
FFFFFFFFFFFFB7A8 47E18010 lw r3,16[sp]
FFFFFFFFFFFFB7AC 47E20018 lw r4,24[sp]
FFFFFFFFFFFFB7B0 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFB7B4 37EF8028 ret #40
; Get the modem status and record it
FFFFFFFFFFFFB7B8 smsirq:
FFFFFFFFFFFFB7B8 80009808 inb r1,UART_MS
FFFFFFFFFFFFB7BC 60009808 sb r1,Uart_ms
FFFFFFFFFFFFB7C0 BE007F0A bra sirq1
FFFFFFFFFFFFB7C4 stxirq:
FFFFFFFFFFFFB7C4 BE007EEA bra sirq1
; Get a character from the uart and store it in the rx fifo
FFFFFFFFFFFFB7C8 srxirq:
FFFFFFFFFFFFB7C8 srxirq1:
FFFFFFFFFFFFB7C8 E69C0A00 ; SETLO
FFFFFFFFFFFFB7CC EE800003 ; SETMID
FFFFFFFFFFFFB7D0 6A0D0420 inb r1,UART ; get the char (clears interrupt)
FFFFFFFFFFFFB7D4 40011814 lb r2,Uart_txxon
FFFFFFFFFFFFB7D8 BE200108 beq r2,r0,srxirq3
FFFFFFFFFFFFB7DC B2100413 bnei r1,#XOFF,srxirq2
FFFFFFFFFFFFB7E0 E0400001 setlo r1,#1
FFFFFFFFFFFFB7E4 60009815 sb r1,Uart_txxonoff
FFFFFFFFFFFFB7E8 BE00016A bra srxirq5
FFFFFFFFFFFFB7EC srxirq2:
FFFFFFFFFFFFB7EC B2100311 bnei r1,#XON,srxirq3
FFFFFFFFFFFFB7F0 60001815 sb r0,Uart_txxonoff
FFFFFFFFFFFFB7F4 BE00010A bra srxirq5
FFFFFFFFFFFFB7F8 srxirq3:
FFFFFFFFFFFFB7F8 60001815 sb r0,Uart_txxonoff
FFFFFFFFFFFFB7FC 42011800 lc r2,Uart_rxhead
FFFFFFFFFFFFB800 9A019600 lea r3,Uart_rxfifo
FFFFFFFFFFFFB804 6A310410 sb r1,[r3+r2] ; store in buffer
FFFFFFFFFFFFB808 0A210001 addui r2,r2,#1
FFFFFFFFFFFFB80C 142101FF andi r2,r2,#0x1ff
FFFFFFFFFFFFB810 62011800 sc r2,Uart_rxhead
FFFFFFFFFFFFB814 srxirq5:
FFFFFFFFFFFFB814 E69C0A01 ; SETLO
FFFFFFFFFFFFB818 EE800003 ; SETMID
FFFFFFFFFFFFB81C 6A0D0420 inb r1,UART_LS ; check for another ready character
FFFFFFFFFFFFB820 14108001 andi r1,r1,#rxfull
FFFFFFFFFFFFB824 BE107D29 bne r1,r0,srxirq1
FFFFFFFFFFFFB828 4000980C lb r1,Uart_rxflow ; are we using flow controls?
FFFFFFFFFFFFB82C BE1003C9 bne r1,r0,srxirq8
FFFFFFFFFFFFB830 31FFED9B call CharsInRxBuf
FFFFFFFFFFFFB834 42009810 lc r1,Uart_foff
FFFFFFFFFFFFB838 BE408360 blt r4,r1,srxirq8
FFFFFFFFFFFFB83C E0400001 setlo r1,#1
FFFFFFFFFFFFB840 6000980C sb r1,Uart_rxflow
FFFFFFFFFFFFB844 40009809 lb r1,Uart_rxrts
FFFFFFFFFFFFB848 BE100108 beq r1,r0,srxirq6
FFFFFFFFFFFFB84C E69C0A06 ; SETLO
FFFFFFFFFFFFB850 EE800003 ; SETMID
FFFFFFFFFFFFB854 6A0D0420 inb r1,UART_MC
FFFFFFFFFFFFB858 141080FD andi r1,r1,#0xFD ; turn off RTS
FFFFFFFFFFFFB85C E69C0A06 ; SETLO
FFFFFFFFFFFFB860 EE800003 ; SETMID
FFFFFFFFFFFFB864 6A0D0428 outb r1,UART_MC
FFFFFFFFFFFFB868 srxirq6:
FFFFFFFFFFFFB868 4000980A lb r1,Uart_rxdtr
FFFFFFFFFFFFB86C BE100108 beq r1,r0,srxirq7
FFFFFFFFFFFFB870 E69C0A06 ; SETLO
FFFFFFFFFFFFB874 EE800003 ; SETMID
FFFFFFFFFFFFB878 6A0D0420 inb r1,UART_MC
FFFFFFFFFFFFB87C 141080FE andi r1,r1,#0xFE ; turn off DTR
FFFFFFFFFFFFB880 E69C0A06 ; SETLO
FFFFFFFFFFFFB884 EE800003 ; SETMID
FFFFFFFFFFFFB888 6A0D0428 outb r1,UART_MC
FFFFFFFFFFFFB88C srxirq7:
FFFFFFFFFFFFB88C 4000980B lb r1,Uart_rxxon
FFFFFFFFFFFFB890 BE1000A8 beq r1,r0,srxirq8
FFFFFFFFFFFFB894 E0400013 setlo r1,#XOFF
FFFFFFFFFFFFB898 E69C0A00 ; SETLO
FFFFFFFFFFFFB89C EE800003 ; SETMID
FFFFFFFFFFFFB8A0 6A0D0428 outb r1,UART
FFFFFFFFFFFFB8A4 srxirq8:
FFFFFFFFFFFFB8A4 BE0077EA bra sirq1
;==============================================================================
; Video BIOS
; Video interrupt #410
;
; Function in R1
; 0x02 = Set Cursor Position r2 = row, r3 = col
; 0x03 = Get Cursor position returns r1 = row, r2 = col
; 0x06 = Scroll screen up
; 0x09 = Display character+attribute, r2=char, r3=attrib, r4=#times
; 0x0A = Display character, r2 = char, r3 = # times
; 0x0C = Display Pixel r2 = x, r3 = y, r4 = color
; 0x0D = Get pixel r2 = x, r3 = y
; 0x14 = Display String r2 = pointer to string
; 0x15 = Display number r2 = number, r3 = # digits
; 0x16 = Display String + CRLF r2 = pointer to string
; 0x17 = Display Word r2 as hex = word
; 0x18 = Display Half word as hex r2 = half word
; 0x19 = Display Charr char in hex r2 = char
; 0x1A = Display Byte in hex r2 = byte
;==============================================================================
;
FFFFFFFFFFFFB8A8 VideoSC:
FFFFFFFFFFFFB8A8 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFB8AC 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFB8B0 67AF2200 sw sp,sp_saves[r26] ; save sp in save area
FFFFFFFFFFFFB8B4 07AD1006 shlui r26,r26,#8 ; 2k for stack
FFFFFFFFFFFFB8B8 03AF0009 mov sp,r26
FFFFFFFFFFFFB8BC E6808000 ; SETLO
FFFFFFFFFFFFB8C0 EE800400 ; SETMID
FFFFFFFFFFFFB8C4 05ED7803 addui sp,sp,#0x100008000 ; base stacks address
FFFFFFFFFFFFB8C8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFB8CC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFB8D0 Video1:
FFFFFFFFFFFFB8D0 020F80B4 omgi lr,#VIDEOGATE
FFFFFFFFFFFFB8D4 BFF07FE9 bne lr,r0,Video1
FFFFFFFFFFFFB8D8 B0100D02 beqi r1,#0x02,Video_x02
FFFFFFFFFFFFB8DC B0101003 beqi r1,#0x03,Video_x03
FFFFFFFFFFFFB8E0 B0101206 beqi r1,#0x06,Video_x06
FFFFFFFFFFFFB8E4 B0101309 beqi r1,#0x09,Video_x09
FFFFFFFFFFFFB8E8 B010170A beqi r1,#0x0A,Video_x0A
FFFFFFFFFFFFB8EC B0101A0C beqi r1,#0x0C,Video_x0C
FFFFFFFFFFFFB8F0 B010270C beqi r1,#0x0C,Video_x0D
FFFFFFFFFFFFB8F4 B0103B14 beqi r1,#0x14,Video_x14
FFFFFFFFFFFFB8F8 B0103D15 beqi r1,#0x15,Video_x15
FFFFFFFFFFFFB8FC B0104016 beqi r1,#0x16,Video_x16
FFFFFFFFFFFFB900 B0104217 beqi r1,#0x17,Video_x17
FFFFFFFFFFFFB904 B010441A beqi r1,#0x1A,Video_x1A
FFFFFFFFFFFFB908 BE0008CA bra VideoRet
FFFFFFFFFFFFB90C Video_x02:
FFFFFFFFFFFFB90C 60011417 sb r2,CursorRow
FFFFFFFFFFFFB910 60019418 sb r3,CursorCol
FFFFFFFFFFFFB914 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFB918 BE00084A bra VideoRet
FFFFFFFFFFFFB91C Video_x03:
FFFFFFFFFFFFB91C 4A009417 lbu r1,CursorRow
FFFFFFFFFFFFB920 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFB924 BE0007EA bra VideoRet
FFFFFFFFFFFFB928 Video_x06:
FFFFFFFFFFFFB928 31FFF02E call ScrollUp
FFFFFFFFFFFFB92C BE0007AA bra VideoRet
FFFFFFFFFFFFB930 Video_x09:
FFFFFFFFFFFFB930 62019410 sc r3,CharColor
FFFFFFFFFFFFB934 02208009 mov r1,r2
FFFFFFFFFFFFB938 Video_x09a:
FFFFFFFFFFFFB938 31FFF07F call DisplayChar
FFFFFFFFFFFFB93C BE027FEF loop r4,Video_x09a
FFFFFFFFFFFFB940 BE00070A bra VideoRet
FFFFFFFFFFFFB944 Video_x0A:
FFFFFFFFFFFFB944 02208009 mov r1,r2
FFFFFFFFFFFFB948 Video_x0Aa:
FFFFFFFFFFFFB948 31FFF07F call DisplayChar
FFFFFFFFFFFFB94C BE01FFEF loop r3,Video_x0Aa
FFFFFFFFFFFFB950 BE00068A bra VideoRet
FFFFFFFFFFFFB954 Video_x0C:
FFFFFFFFFFFFB954 E69AE008 ; SETLO
FFFFFFFFFFFFB958 EE800003 ; SETMID
FFFFFFFFFFFFB95C 6A0D0812 sh r2,GACCEL+8 ; x0
FFFFFFFFFFFFB960 E69AE00C ; SETLO
FFFFFFFFFFFFB964 EE800003 ; SETMID
FFFFFFFFFFFFB968 6A0D0C12 sh r3,GACCEL+12 ; y0
FFFFFFFFFFFFB96C E69AE000 ; SETLO
FFFFFFFFFFFFB970 EE800003 ; SETMID
FFFFFFFFFFFFB974 6A0D1012 sh r4,GACCEL+0 ; color
FFFFFFFFFFFFB978 16008001 lw r1,#1
FFFFFFFFFFFFB97C E69AE03C ; SETLO
FFFFFFFFFFFFB980 EE800003 ; SETMID
FFFFFFFFFFFFB984 6A0D0412 sh r1,GACCEL+60 ; DRAW PIXEL command
FFFFFFFFFFFFB988 BE0004CA bra VideoRet
FFFFFFFFFFFFB98C Video_x0D:
FFFFFFFFFFFFB98C E69AE008 ; SETLO
FFFFFFFFFFFFB990 EE800003 ; SETMID
FFFFFFFFFFFFB994 6A0D0812 sh r2,GACCEL+8 ; x0
FFFFFFFFFFFFB998 E69AE00C ; SETLO
FFFFFFFFFFFFB99C EE800003 ; SETMID
FFFFFFFFFFFFB9A0 6A0D0C12 sh r3,GACCEL+12 ; y0
FFFFFFFFFFFFB9A4 16008008 lw r1,#8
FFFFFFFFFFFFB9A8 E69AE03C ; SETLO
FFFFFFFFFFFFB9AC EE800003 ; SETMID
FFFFFFFFFFFFB9B0 6A0D0412 sh r1,GACCEL+60 ; GET PIXEL command
FFFFFFFFFFFFB9B4 DE000000 nop ; let command start
FFFFFFFFFFFFB9B8 DE000000 nop
FFFFFFFFFFFFB9BC DE000000 nop
FFFFFFFFFFFFB9C0 vxd1:
FFFFFFFFFFFFB9C0 E69AE038 ; SETLO
FFFFFFFFFFFFB9C4 EE800003 ; SETMID
FFFFFFFFFFFFB9C8 6A0D0407 lhu r1,GACCEL+56 ; wait for state = IDLE
FFFFFFFFFFFFB9CC BE107FA9 bne r1,r0,vxd1
FFFFFFFFFFFFB9D0 E69AE034 ; SETLO
FFFFFFFFFFFFB9D4 EE800003 ; SETMID
FFFFFFFFFFFFB9D8 6A0D0407 lhu r1,GACCEL+52
FFFFFFFFFFFFB9DC BE00022A bra VideoRet
FFFFFFFFFFFFB9E0 Video_x14:
FFFFFFFFFFFFB9E0 02208009 mov r1,r2
FFFFFFFFFFFFB9E4 31FFF122 call DisplayString
FFFFFFFFFFFFB9E8 BE0001CA bra VideoRet
FFFFFFFFFFFFB9EC Video_x15:
FFFFFFFFFFFFB9EC 02208009 mov r1,r2
FFFFFFFFFFFFB9F0 02310009 mov r2,r3
FFFFFFFFFFFFB9F4 31FFF13F call DisplayNum
FFFFFFFFFFFFB9F8 BE00014A bra VideoRet
FFFFFFFFFFFFB9FC Video_x16:
FFFFFFFFFFFFB9FC 02208009 mov r1,r2
FFFFFFFFFFFFBA00 31FFF130 call DisplayStringCRLF
FFFFFFFFFFFFBA04 BE0000EA bra VideoRet
FFFFFFFFFFFFBA08 Video_x17:
FFFFFFFFFFFFBA08 02208009 mov r1,r2
FFFFFFFFFFFFBA0C 31FFF169 call DisplayWord
FFFFFFFFFFFFBA10 BE00008A bra VideoRet
FFFFFFFFFFFFBA14 Video_x1A:
FFFFFFFFFFFFBA14 02208009 mov r1,r2
FFFFFFFFFFFFBA18 31FFF14B call DisplayByte
FFFFFFFFFFFFBA1C BE00002A bra VideoRet
FFFFFFFFFFFFBA20 VideoRet:
FFFFFFFFFFFFBA20 020000B5 cmgi #VIDEOGATE
FFFFFFFFFFFFBA24 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBA28 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBA2C 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBA30 47AF2200 lw sp,sp_saves[r26] ; get back the stack
FFFFFFFFFFFFBA34 01800021 eret
;==============================================================================
; BIOS interrupt #413
; 0x00 initialize
; 0x01 read sector r2 = sector #, r3 = pointer to buffer
; 0x02 write sector
;==============================================================================
;
FFFFFFFFFFFFBA38 SDCARDSC:
FFFFFFFFFFFFBA38 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBA3C 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBA40 67AF2200 sw sp,sp_saves[r26] ; save sp in save area
FFFFFFFFFFFFBA44 07AD1006 shlui r26,r26,#8 ; 2k for stack
FFFFFFFFFFFFBA48 03AF0009 mov sp,r26
FFFFFFFFFFFFBA4C E6808000 ; SETLO
FFFFFFFFFFFFBA50 EE800400 ; SETMID
FFFFFFFFFFFFBA54 05ED7803 addui sp,sp,#0x100008000 ; base stacks address
FFFFFFFFFFFFBA58 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBA5C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFBA60 SDC_1:
FFFFFFFFFFFFBA60 020F80F4 omgi lr,#CARDGATE
FFFFFFFFFFFFBA64 BFF07FE9 bne lr,r0,SDC_1
FFFFFFFFFFFFBA68 B0100400 beqi r1,#0,SDC_x00
FFFFFFFFFFFFBA6C B0100501 beqi r1,#1,SDC_x01
FFFFFFFFFFFFBA70 B0100802 beqi r1,#2,SDC_x02
FFFFFFFFFFFFBA74 BE0000EA bra SDCRet
FFFFFFFFFFFFBA78 SDC_x00:
FFFFFFFFFFFFBA78 31FFF54E call spi_init
FFFFFFFFFFFFBA7C BE0000AA bra SDCRet
FFFFFFFFFFFFBA80 SDC_x01:
FFFFFFFFFFFFBA80 02208009 mov r1,r2
FFFFFFFFFFFFBA84 02310009 mov r2,r3
FFFFFFFFFFFFBA88 31FFF56D call spi_read_sector
FFFFFFFFFFFFBA8C BE00002A bra SDCRet
FFFFFFFFFFFFBA90 SDC_x02:
FFFFFFFFFFFFBA90 SDCRet:
FFFFFFFFFFFFBA90 020000F5 cmgi #CARDGATE
FFFFFFFFFFFFBA94 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBA98 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBA9C 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBAA0 47AF2200 lw sp,sp_saves[r26] ; get back the stack
FFFFFFFFFFFFBAA4 01800021 eret
;==============================================================================
; Real time clock BIOS
; BIOS interrupt #416
;
; Function
; 0x00 = get system tick
; 0x01 = get date/time
; 0x02 = set date/time
;==============================================================================
;
FFFFFFFFFFFFBAA8 RTCSC:
FFFFFFFFFFFFBAA8 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBAAC 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBAB0 67AF2200 sw sp,sp_saves[r26] ; save sp in save area
FFFFFFFFFFFFBAB4 07AD1006 shlui r26,r26,#8 ; 2k for stack
FFFFFFFFFFFFBAB8 03AF0009 mov sp,r26
FFFFFFFFFFFFBABC E6808000 ; SETLO
FFFFFFFFFFFFBAC0 EE800400 ; SETMID
FFFFFFFFFFFFBAC4 05ED7803 addui sp,sp,#0x100008000 ; base stacks address
FFFFFFFFFFFFBAC8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBACC 67EF8000 sw lr,[sp]
;
FFFFFFFFFFFFBAD0 B0100200 beqi r1,#0x00,RTC_x00
FFFFFFFFFFFFBAD4 B0100301 beqi r1,#0x01,RTC_x01
FFFFFFFFFFFFBAD8 RTC_x00:
FFFFFFFFFFFFBAD8 020085A8 mfspr r1,TICK
FFFFFFFFFFFFBADC BE00012A bra RTCRet
FFFFFFFFFFFFBAE0 RTC_x01:
FFFFFFFFFFFFBAE0 E69C0418 ; SETLO
FFFFFFFFFFFFBAE4 EE800003 ; SETMID
FFFFFFFFFFFFBAE8 6A0D002B outw r0,DATETIME+24 ; trigger a snapshot
FFFFFFFFFFFFBAEC DE000000 nop
FFFFFFFFFFFFBAF0 E69C0400 ; SETLO
FFFFFFFFFFFFBAF4 EE800003 ; SETMID
FFFFFFFFFFFFBAF8 6A0D0423 inw r1,DATETIME ; get the snapshotted date and time
FFFFFFFFFFFFBAFC BE00002A bra RTCRet
FFFFFFFFFFFFBB00 RTCRet:
FFFFFFFFFFFFBB00 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBB04 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBB08 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBB0C 47AF2200 lw sp,sp_saves[r26] ; get back the stack
FFFFFFFFFFFFBB10 01800021 eret
;==============================================================================
; Keyboard BIOS
; BIOS interrupt #417
;
; Function in R1
; 0x00 = initialize keyboard
; 0x01 = set keyboard echo
; 0x02 = get keyboard character from buffer
; 0x03 = check for key available in buffer
; 0x04 = check for key directly at keyboard port
; 0x05 = get keyboard character directly from keyboard port (blocks)
;==============================================================================
;
FFFFFFFFFFFFBB14 KeybdSC:
FFFFFFFFFFFFBB14 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBB18 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBB1C 67AF2200 sw sp,sp_saves[r26] ; save sp in save area
FFFFFFFFFFFFBB20 07AD1006 shlui r26,r26,#8 ; 2k for stack
FFFFFFFFFFFFBB24 03AF0009 mov sp,r26
FFFFFFFFFFFFBB28 E6808000 ; SETLO
FFFFFFFFFFFFBB2C EE800400 ; SETMID
FFFFFFFFFFFFBB30 05ED7803 addui sp,sp,#0x100008000 ; base stacks address
FFFFFFFFFFFFBB34 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBB38 67EF8000 sw lr,[sp]
FFFFFFFFFFFFBB3C kbdsc5:
FFFFFFFFFFFFBB3C 020F8074 omgi lr,#KEYBDGATE
FFFFFFFFFFFFBB40 BFF07FE9 bne lr,r0,kbdsc5
FFFFFFFFFFFFBB44 B0100700 beqi r1,#0,kbd_x00
FFFFFFFFFFFFBB48 B0100801 beqi r1,#1,kbd_x01
FFFFFFFFFFFFBB4C B0100A02 beqi r1,#2,kbd_x02
FFFFFFFFFFFFBB50 B0100B03 beqi r1,#3,kbd_x03
FFFFFFFFFFFFBB54 B0100C04 beqi r1,#4,kbd_x04
FFFFFFFFFFFFBB58 B0100D05 beqi r1,#5,kbd_x05
FFFFFFFFFFFFBB5C BE0001CA bra kbdscRet
FFFFFFFFFFFFBB60 kbd_x00:
FFFFFFFFFFFFBB60 31FFEEEB call KeybdInit
FFFFFFFFFFFFBB64 BE00018A bra kbdscRet
FFFFFFFFFFFFBB68 kbd_x01:
FFFFFFFFFFFFBB68 02208009 mov r1,r2
FFFFFFFFFFFFBB6C 31FFEF05 call SetKeyboardEcho
FFFFFFFFFFFFBB70 BE00012A bra kbdscRet
FFFFFFFFFFFFBB74 kbd_x02:
FFFFFFFFFFFFBB74 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFBB78 BE0000EA bra kbdscRet
FFFFFFFFFFFFBB7C kbd_x03:
FFFFFFFFFFFFBB7C 31FFEF1C call KeybdCheckForKey
FFFFFFFFFFFFBB80 BE0000AA bra kbdscRet
FFFFFFFFFFFFBB84 kbd_x04:
FFFFFFFFFFFFBB84 31FFEF20 call KeybdCheckForKeyDirect
FFFFFFFFFFFFBB88 BE00006A bra kbdscRet
FFFFFFFFFFFFBB8C kbd_x05:
FFFFFFFFFFFFBB8C 31FFEF25 call KeybdGetCharDirect
FFFFFFFFFFFFBB90 BE00002A bra kbdscRet
FFFFFFFFFFFFBB94 kbdscRet:
FFFFFFFFFFFFBB94 02000075 cmgi #KEYBDGATE
FFFFFFFFFFFFBB98 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBB9C 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBBA0 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBBA4 47AF2200 lw sp,sp_saves[r26] ; get back the stack
FFFFFFFFFFFFBBA8 01800021 eret
;------------------------------------------------------------------------------
; Initialize keyboard
;------------------------------------------------------------------------------
FFFFFFFFFFFFBBAC KeybdInit:
FFFFFFFFFFFFBBAC 60001450 sb r0,KeybdHead
FFFFFFFFFFFFBBB0 60001451 sb r0,KeybdTail
FFFFFFFFFFFFBBB4 E0400001 setlo r1,#1 ; turn on keyboard echo
FFFFFFFFFFFFBBB8 6000941C sb r1,KeybdEcho
FFFFFFFFFFFFBBBC 37EF8000 ret
;------------------------------------------------------------------------------
; Normal keyboard interrupt, the lowest priority interrupt in the system.
; Grab the character from the keyboard device and store it in a buffer.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBBC0 KeybdIRQ:
FFFFFFFFFFFFBBC0 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBBC4 67E10000 sw r2,[sp]
FFFFFFFFFFFFBBC8 4A009450 lbu r1,KeybdHead
FFFFFFFFFFFFBBCC 1410800F andi r1,r1,#0x0f ; r1 = index into buffer
FFFFFFFFFFFFBBD0 KeybdIRQa:
FFFFFFFFFFFFBBD0 E69C0000 ; SETLO
FFFFFFFFFFFFBBD4 EE800003 ; SETMID
FFFFFFFFFFFFBBD8 6A0D0821 inch r2,KEYBD ; get keyboard character
FFFFFFFFFFFFBBDC E69C0002 ; SETLO
FFFFFFFFFFFFBBE0 EE800003 ; SETMID
FFFFFFFFFFFFBBE4 6A0D0029 outc r0,KEYBD+2 ; clear keyboard strobe (turns off the IRQ)
FFFFFFFFFFFFBBE8 60111440 sb r2,KeybdBuffer[r1] ; store character in buffer
FFFFFFFFFFFFBBEC 0A108001 addui r1,r1,#1 ; increment head index
FFFFFFFFFFFFBBF0 1410800F andi r1,r1,#0x0f
FFFFFFFFFFFFBBF4 60009450 sb r1,KeybdHead
FFFFFFFFFFFFBBF8 KeybdIRQb:
FFFFFFFFFFFFBBF8 4A011451 lbu r2,KeybdTail ; check to see if we've collided
FFFFFFFFFFFFBBFC BE110089 bne r1,r2,KeybdIRQc ; with the tail
FFFFFFFFFFFFBC00 0A210001 addui r2,r2,#1 ; if so, increment the tail index
FFFFFFFFFFFFBC04 1421000F andi r2,r2,#0x0f ; the oldest character will be lost
FFFFFFFFFFFFBC08 60011451 sb r2,KeybdTail
FFFFFFFFFFFFBC0C KeybdIRQc:
FFFFFFFFFFFFBC0C 47E10000 lw r2,[sp]
FFFFFFFFFFFFBC10 37EF8008 ret #8
;------------------------------------------------------------------------------
; r1 0=echo off, non-zero = echo on
;------------------------------------------------------------------------------
FFFFFFFFFFFFBC14 SetKeyboardEcho:
FFFFFFFFFFFFBC14 6000941C sb r1,KeybdEcho
FFFFFFFFFFFFBC18 37EF8000 ret
;-----------------------------------------
; Get character from keyboard buffer
;-----------------------------------------
FFFFFFFFFFFFBC1C KeybdGetChar:
FFFFFFFFFFFFBC1C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFBC20 67E10000 sw r2,[sp]
FFFFFFFFFFFFBC24 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFBC28 4A011451 lbu r2,KeybdTail
FFFFFFFFFFFFBC2C 4A009450 lbu r1,KeybdHead
FFFFFFFFFFFFBC30 BE110188 beq r1,r2,nochar
FFFFFFFFFFFFBC34 4A209440 lbu r1,KeybdBuffer[r2]
FFFFFFFFFFFFBC38 0A210001 addui r2,r2,#1
FFFFFFFFFFFFBC3C 1421000F andi r2,r2,#0x0f
FFFFFFFFFFFFBC40 60011451 sb r2,KeybdTail
FFFFFFFFFFFFBC44 4001141C lb r2,KeybdEcho
FFFFFFFFFFFFBC48 BE2000E8 beq r2,r0,kgc3
FFFFFFFFFFFFBC4C B210030D bnei r1,#CR,kgc2
FFFFFFFFFFFFBC50 31FFFD80 call CRLF ; convert CR keystroke into CRLF
FFFFFFFFFFFFBC54 BE00008A bra kgc3
FFFFFFFFFFFFBC58 kgc2:
FFFFFFFFFFFFBC58 31FFF07F call DisplayChar
FFFFFFFFFFFFBC5C BE00004A bra kgc3
FFFFFFFFFFFFBC60 nochar:
FFFFFFFFFFFFBC60 E07FFFFF setlo r1,#-1
FFFFFFFFFFFFBC64 kgc3:
FFFFFFFFFFFFBC64 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFBC68 47E10000 lw r2,[sp]
FFFFFFFFFFFFBC6C 37EF8010 ret #16
;------------------------------------------------------------------------------
; Check if there is a keyboard character available in the keyboard buffer.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBC70 KeybdCheckForKey:
FFFFFFFFFFFFBC70 4A009451 lbu r1,KeybdTail
FFFFFFFFFFFFBC74 4A011450 lbu r2,KeybdHead
FFFFFFFFFFFFBC78 04110439 sne r1,r1,r2
FFFFFFFFFFFFBC7C 37EF8000 ret
;------------------------------------------------------------------------------
; Check if there is a keyboard character available. If so return true (1)
; otherwise return false (0) in r1.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBC80 KeybdCheckForKeyDirect:
FFFFFFFFFFFFBC80 E69C0000 ; SETLO
FFFFFFFFFFFFBC84 EE800003 ; SETMID
FFFFFFFFFFFFBC88 6A0D0421 inch r1,KEYBD
FFFFFFFFFFFFBC8C 04100430 slt r1,r1,r0
FFFFFFFFFFFFBC90 37EF8000 ret
;------------------------------------------------------------------------------
; Get character directly from keyboard. This routine blocks until a key is
; available.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBC94 KeybdGetCharDirect:
FFFFFFFFFFFFBC94 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFBC98 67E10000 sw r2,[sp]
FFFFFFFFFFFFBC9C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFBCA0 E09C0000 setlo r2,KEYBD
FFFFFFFFFFFFBCA4 kgc1:
FFFFFFFFFFFFBCA4 E69C0000 ; SETLO
FFFFFFFFFFFFBCA8 EE800003 ; SETMID
FFFFFFFFFFFFBCAC 6A0D0421 inch r1,KEYBD
FFFFFFFFFFFFBCB0 BE107FA1 bge r1,r0,kgc1
FFFFFFFFFFFFBCB4 E69C0002 ; SETLO
FFFFFFFFFFFFBCB8 EE800003 ; SETMID
FFFFFFFFFFFFBCBC 6A0D0029 outc r0,KEYBD+2 ; clear keyboard strobe
FFFFFFFFFFFFBCC0 141080FF andi r1,r1,#0xff ; remove strobe bit
FFFFFFFFFFFFBCC4 4001141C lb r2,KeybdEcho ; is keyboard echo on ?
FFFFFFFFFFFFBCC8 BE2000A8 beq r2,r0,gk1
FFFFFFFFFFFFBCCC B210030D bnei r1,#'\r',gk2 ; convert CR keystroke into CRLF
FFFFFFFFFFFFBCD0 31FFFD80 call CRLF
FFFFFFFFFFFFBCD4 BE00004A bra gk1
FFFFFFFFFFFFBCD8 gk2:
FFFFFFFFFFFFBCD8 31FFF07F call DisplayChar
FFFFFFFFFFFFBCDC gk1:
FFFFFFFFFFFFBCDC 47E10000 lw r2,[sp]
FFFFFFFFFFFFBCE0 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFBCE4 37EF8010 ret #16
;==============================================================================
;==============================================================================
FFFFFFFFFFFFBCE8 tmp_init:
; wait for the rst1626 to go low
FFFFFFFFFFFFBCE8 E6989680 ; SETLO
FFFFFFFFFFFFBCEC EE800002 ; SETMID
FFFFFFFFFFFFBCF0 040D0809 lw r2,#10000000 ; retry for up to several seconds
FFFFFFFFFFFFBCF4 tmp_init4:
FFFFFFFFFFFFBCF4 BE2000C8 beq r2,r0,tmp_init5
FFFFFFFFFFFFBCF8 0E210001 subui r2,r2,#1
FFFFFFFFFFFFBCFC E69C0302 ; SETLO
FFFFFFFFFFFFBD00 EE800003 ; SETMID
FFFFFFFFFFFFBD04 6A0D0421 inch r1,TMP+2 ; read the status reg
FFFFFFFFFFFFBD08 BE107F60 blt r1,r0,tmp_init4
FFFFFFFFFFFFBD0C tmp_init5:
FFFFFFFFFFFFBD0C 16008051 lw r1,#0x51 ; Start temperature conversion
FFFFFFFFFFFFBD10 E69C0300 ; SETLO
FFFFFFFFFFFFBD14 EE800003 ; SETMID
FFFFFFFFFFFFBD18 6A0D0429 outc r1,TMP
; wait a bit for the trigger to take effect
FFFFFFFFFFFFBD1C 160089C4 lw r1,#2500
FFFFFFFFFFFFBD20 tmp_init1:
FFFFFFFFFFFFBD20 BE00800F loop r1,tmp_init1
; wait for the rst1626 to go low
FFFFFFFFFFFFBD24 E6989680 ; SETLO
FFFFFFFFFFFFBD28 EE800002 ; SETMID
FFFFFFFFFFFFBD2C 040D0809 lw r2,#10000000 ; retry for up to several seconds
FFFFFFFFFFFFBD30 tmp_init2:
FFFFFFFFFFFFBD30 BE2000C8 beq r2,r0,tmp_init3
FFFFFFFFFFFFBD34 0E210001 subui r2,r2,#1
FFFFFFFFFFFFBD38 E69C0302 ; SETLO
FFFFFFFFFFFFBD3C EE800003 ; SETMID
FFFFFFFFFFFFBD40 6A0D0421 inch r1,TMP+2 ; read the status reg
FFFFFFFFFFFFBD44 BE107F60 blt r1,r0,tmp_init2
FFFFFFFFFFFFBD48 tmp_init3:
FFFFFFFFFFFFBD48 37EF8000 ret
FFFFFFFFFFFFBD4C tmp_read:
FFFFFFFFFFFFBD4C 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFBD50 67EF8000 sw lr,[sp]
FFFFFFFFFFFFBD54 67E08008 sw r1,8[sp]
FFFFFFFFFFFFBD58 67E10010 sw r2,16[sp]
FFFFFFFFFFFFBD5C E6BD7840 ; SETLO
FFFFFFFFFFFFBD60 EE800005 ; SETMID
FFFFFFFFFFFFBD64 040D0409 lw r1,#25000000 ; wait about 1 second or so
FFFFFFFFFFFFBD68 tmp_read1:
FFFFFFFFFFFFBD68 BE00800F loop r1,tmp_read1
FFFFFFFFFFFFBD6C 160080AC lw r1,#0xAC ; issue read temperature conversion
FFFFFFFFFFFFBD70 E69C0300 ; SETLO
FFFFFFFFFFFFBD74 EE800003 ; SETMID
FFFFFFFFFFFFBD78 6A0D0429 outc r1,TMP
; wait a bit for the trigger to take effect
FFFFFFFFFFFFBD7C 160089C4 lw r1,#2500
FFFFFFFFFFFFBD80 tmp_read3:
FFFFFFFFFFFFBD80 BE00800F loop r1,tmp_read3
; wait for the rst1626 to go low
FFFFFFFFFFFFBD84 E6989680 ; SETLO
FFFFFFFFFFFFBD88 EE800002 ; SETMID
FFFFFFFFFFFFBD8C 040D0809 lw r2,#10000000
FFFFFFFFFFFFBD90 tmp_read2:
FFFFFFFFFFFFBD90 E69C0302 ; SETLO
FFFFFFFFFFFFBD94 EE800003 ; SETMID
FFFFFFFFFFFFBD98 6A0D0421 inch r1,TMP+2 ; read the status reg
FFFFFFFFFFFFBD9C BE200068 beq r2,r0,tmp_read4
FFFFFFFFFFFFBDA0 0E210001 subui r2,r2,#1
FFFFFFFFFFFFBDA4 BE107F60 blt r1,r0,tmp_read2
FFFFFFFFFFFFBDA8 tmp_read4:
FFFFFFFFFFFFBDA8 E69C0302 ; SETLO
FFFFFFFFFFFFBDAC EE800003 ; SETMID
FFFFFFFFFFFFBDB0 6A0D0421 inch r1,TMP+2 ; read the temperature
FFFFFFFFFFFFBDB4 16010005 lw r2,#5 ; five digits
FFFFFFFFFFFFBDB8 31FFF13F call DisplayNum
FFFFFFFFFFFFBDBC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBDC0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFBDC4 47E10010 lw r2,16[sp]
FFFFFFFFFFFFBDC8 37EF8018 ret #24
;==============================================================================
;==============================================================================
;------------------------------------------------------------------------------
; 100 Hz interrupt
; - takes care of "flashing" the cursor
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBDCC Pulse100:
FFFFFFFFFFFFBDCC 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBDD0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFBDD4 E6900000 ; SETLO
FFFFFFFFFFFFBDD8 EE800003 ; SETMID
FFFFFFFFFFFFBDDC 6A0D082D lea r2,TEXTSCR
FFFFFFFFFFFFBDE0 8220814E inch r1,334[r2]
FFFFFFFFFFFFBDE4 0A108001 addui r1,r1,#1
FFFFFFFFFFFFBDE8 9220814E outc r1,334[r2]
; call DisplayDatetime
FFFFFFFFFFFFBDEC 31FFEF82 call SelectNextToRunTCB
FFFFFFFFFFFFBDF0 31FFEF84 call SwitchTask
FFFFFFFFFFFFBDF4 E69CFFFC ; SETLO
FFFFFFFFFFFFBDF8 EE800003 ; SETMID
FFFFFFFFFFFFBDFC 6A0D0028 outb r0,0xDCFFFC ; clear interrupt
; lw r1,TickIRQAddr
; jal r31,[r1]
; lw r1,Milliseconds
; andi r1,r1,#0x0f
; bnei r1,#5,p1001
; call FlashCursor
FFFFFFFFFFFFBE00 p1001:
FFFFFFFFFFFFBE00 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBE04 37EF8008 ret #8
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
FFFFFFFFFFFFBE08 SelectNextToRunTCB:
FFFFFFFFFFFFBE08 620020A8 sc r0,NextToRunTCB
FFFFFFFFFFFFBE0C 37EF8000 ret
;------------------------------------------------------------------------------
; Switch from the RunningTCB to the NextToRunTCB
;------------------------------------------------------------------------------
FFFFFFFFFFFFBE10 SwitchTask:
FFFFFFFFFFFFBE10 6600A0B0 sw r1,r1save
FFFFFFFFFFFFBE14 660120B8 sw r2,r2save
FFFFFFFFFFFFBE18 4C00A0A8 lcu r1,NextToRunTCB
FFFFFFFFFFFFBE1C 4C0120A6 lcu r2,RunningTCB
FFFFFFFFFFFFBE20 BE110089 bne r1,r2,swtsk1 ; are we already running this TCB ?
FFFFFFFFFFFFBE24 4600A0B0 lw r1,r1save
FFFFFFFFFFFFBE28 460120B8 lw r2,r2save
FFFFFFFFFFFFBE2C 37EF8000 ret
FFFFFFFFFFFFBE30 swtsk1:
FFFFFFFFFFFFBE30 142101FF andi r2,r2,#0x1ff ; max 512 TCB's
FFFFFFFFFFFFBE34 1A210200 mului r2,r2,#TCBSize
FFFFFFFFFFFFBE38 E6800000 ; SETLO
FFFFFFFFFFFFBE3C EE800400 ; SETMID
FFFFFFFFFFFFBE40 042D0803 addui r2,r2,#TCBBase
FFFFFFFFFFFFBE44 4600A0B0 lw r1,r1save ; get back r1
FFFFFFFFFFFFBE48 66208000 sw r1,TCBr1[r2]
FFFFFFFFFFFFBE4C 4600A0B8 lw r1,r2save ; get back r2
FFFFFFFFFFFFBE50 66208008 sw r1,TCBr2[r2]
FFFFFFFFFFFFBE54 66218010 sw r3,TCBr3[r2]
FFFFFFFFFFFFBE58 66220018 sw r4,TCBr4[r2]
FFFFFFFFFFFFBE5C 66228020 sw r5,TCBr5[r2]
FFFFFFFFFFFFBE60 66230028 sw r6,TCBr6[r2]
FFFFFFFFFFFFBE64 66238030 sw r7,TCBr7[r2]
FFFFFFFFFFFFBE68 66240038 sw r8,TCBr8[r2]
FFFFFFFFFFFFBE6C 66248040 sw r9,TCBr9[r2]
FFFFFFFFFFFFBE70 66250048 sw r10,TCBr10[r2]
FFFFFFFFFFFFBE74 66258050 sw r11,TCBr11[r2]
FFFFFFFFFFFFBE78 66260058 sw r12,TCBr12[r2]
FFFFFFFFFFFFBE7C 66268060 sw r13,TCBr13[r2]
FFFFFFFFFFFFBE80 66270068 sw r14,TCBr14[r2]
FFFFFFFFFFFFBE84 66278070 sw r15,TCBr15[r2]
FFFFFFFFFFFFBE88 66280078 sw r16,TCBr16[r2]
FFFFFFFFFFFFBE8C 66288080 sw r17,TCBr17[r2]
FFFFFFFFFFFFBE90 66290088 sw r18,TCBr18[r2]
FFFFFFFFFFFFBE94 66298090 sw r19,TCBr19[r2]
FFFFFFFFFFFFBE98 662A0098 sw r20,TCBr20[r2]
FFFFFFFFFFFFBE9C 662A80A0 sw r21,TCBr21[r2]
FFFFFFFFFFFFBEA0 662B00A8 sw r22,TCBr22[r2]
FFFFFFFFFFFFBEA4 662B80B0 sw r23,TCBr23[r2]
FFFFFFFFFFFFBEA8 662C00B8 sw r24,TCBr24[r2]
FFFFFFFFFFFFBEAC 662C80C0 sw r25,TCBr25[r2]
FFFFFFFFFFFFBEB0 662D00C8 sw r26,TCBr26[r2]
FFFFFFFFFFFFBEB4 662D80D0 sw r27,TCBr27[r2]
FFFFFFFFFFFFBEB8 662E00D8 sw r28,TCBr28[r2]
FFFFFFFFFFFFBEBC 662E80E0 sw r29,TCBr29[r2]
FFFFFFFFFFFFBEC0 662F00E8 sw r30,TCBr30[r2]
FFFFFFFFFFFFBEC4 662F80F0 sw r31,TCBr31[r2]
FFFFFFFFFFFFBEC8 4C0120A8 lcu r2,NextToRunTCB
FFFFFFFFFFFFBECC 620120A6 sc r2,RunningTCB
FFFFFFFFFFFFBED0 1A210200 mului r2,r2,#TCBSize
FFFFFFFFFFFFBED4 E6800000 ; SETLO
FFFFFFFFFFFFBED8 EE800400 ; SETMID
FFFFFFFFFFFFBEDC 042D0803 addui r2,r2,#TCBBase
FFFFFFFFFFFFBEE0 46208000 lw r1,TCBr1[r2]
FFFFFFFFFFFFBEE4 46218010 lw r3,TCBr3[r2]
FFFFFFFFFFFFBEE8 46220018 lw r4,TCBr4[r2]
FFFFFFFFFFFFBEEC 46228020 lw r5,TCBr5[r2]
FFFFFFFFFFFFBEF0 46230028 lw r6,TCBr6[r2]
FFFFFFFFFFFFBEF4 46238030 lw r7,TCBr7[r2]
FFFFFFFFFFFFBEF8 46240038 lw r8,TCBr8[r2]
FFFFFFFFFFFFBEFC 46248040 lw r9,TCBr9[r2]
FFFFFFFFFFFFBF00 46250048 lw r10,TCBr10[r2]
FFFFFFFFFFFFBF04 46258050 lw r11,TCBr11[r2]
FFFFFFFFFFFFBF08 46260058 lw r12,TCBr12[r2]
FFFFFFFFFFFFBF0C 46268060 lw r13,TCBr13[r2]
FFFFFFFFFFFFBF10 46270068 lw r14,TCBr14[r2]
FFFFFFFFFFFFBF14 46278070 lw r15,TCBr15[r2]
FFFFFFFFFFFFBF18 46280078 lw r16,TCBr16[r2]
FFFFFFFFFFFFBF1C 46288080 lw r17,TCBr17[r2]
FFFFFFFFFFFFBF20 46290088 lw r18,TCBr18[r2]
FFFFFFFFFFFFBF24 46298090 lw r19,TCBr19[r2]
FFFFFFFFFFFFBF28 462A0098 lw r20,TCBr20[r2]
FFFFFFFFFFFFBF2C 462A80A0 lw r21,TCBr21[r2]
FFFFFFFFFFFFBF30 462B00A8 lw r22,TCBr22[r2]
FFFFFFFFFFFFBF34 462B80B0 lw r23,TCBr23[r2]
FFFFFFFFFFFFBF38 462C00B8 lw r24,TCBr24[r2]
FFFFFFFFFFFFBF3C 462C80C0 lw r25,TCBr25[r2]
FFFFFFFFFFFFBF40 462D00C8 lw r26,TCBr26[r2]
FFFFFFFFFFFFBF44 462D80D0 lw r27,TCBr27[r2]
FFFFFFFFFFFFBF48 462E00D8 lw r28,TCBr28[r2]
FFFFFFFFFFFFBF4C 462E80E0 lw r29,TCBr29[r2]
FFFFFFFFFFFFBF50 462F00E8 lw r30,TCBr30[r2]
FFFFFFFFFFFFBF54 462F80F0 lw r31,TCBr31[r2]
FFFFFFFFFFFFBF58 46210008 lw r2,TCBr2[r2]
FFFFFFFFFFFFBF5C 37EF8000 ret
;------------------------------------------------------------------------------
; Flash Cursor
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBF60 FlashCursor:
FFFFFFFFFFFFBF60 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBF64 67E08000 sw r1,[sp]
FFFFFFFFFFFFBF68 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBF6C 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBF70 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBF74 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFBF78 E6810000 ; SETLO
FFFFFFFFFFFFBF7C 041D0403 addui r1,r1,#0x10000
FFFFFFFFFFFFBF80 4001141A lb r2,CursorFlash
FFFFFFFFFFFFBF84 BE2001C8 beq r2,r0,flshcrsr2
; causes screen colors to flip around
FFFFFFFFFFFFBF88 82110000 inch r2,[r1]
FFFFFFFFFFFFBF8C 0A210001 addui r2,r2,#1
FFFFFFFFFFFFBF90 92110000 outc r2,[r1]
FFFFFFFFFFFFBF94 flshcrsr3:
FFFFFFFFFFFFBF94 46011408 lw r2,Lastloc
FFFFFFFFFFFFBF98 BE110088 beq r1,r2,flshcrsr1
; restore the screen colors of the previous cursor location
FFFFFFFFFFFFBF9C 42019414 lc r3,ScreenColor
FFFFFFFFFFFFBFA0 92218000 outc r3,[r2]
FFFFFFFFFFFFBFA4 66009408 sw r1,Lastloc
FFFFFFFFFFFFBFA8 flshcrsr1:
FFFFFFFFFFFFBFA8 47E08000 lw r1,[sp]
FFFFFFFFFFFFBFAC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBFB0 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBFB4 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFBFB8 37EF8020 ret #32
FFFFFFFFFFFFBFBC flshcrsr2:
FFFFFFFFFFFFBFBC 42019414 lc r3,ScreenColor
FFFFFFFFFFFFBFC0 92118000 outc r3,[r1]
FFFFFFFFFFFFBFC4 BE007E8A bra flshcrsr3
FFFFFFFFFFFFBFC8 CursorOff:
FFFFFFFFFFFFBFC8 160080A0 lw r1,#0xA0
FFFFFFFFFFFFBFCC E69A0010 ; SETLO
FFFFFFFFFFFFBFD0 EE800003 ; SETMID
FFFFFFFFFFFFBFD4 6A0D0429 outc r1,TEXTREG+16 ; turn off cursor
FFFFFFFFFFFFBFD8 37EF8000 ret
FFFFFFFFFFFFBFDC CursorOn:
FFFFFFFFFFFFBFDC 160080E0 lw r1,#0xE0
FFFFFFFFFFFFBFE0 E69A0010 ; SETLO
FFFFFFFFFFFFBFE4 EE800003 ; SETMID
FFFFFFFFFFFFBFE8 6A0D0429 outc r1,TEXTREG+16 ; turn on cursor
FFFFFFFFFFFFBFEC 37EF8000 ret
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
FFFFFFFFFFFFBFF0 ClearBmpScreen:
FFFFFFFFFFFFBFF0 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFBFF4 67E08000 sw r1,[sp]
FFFFFFFFFFFFBFF8 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBFFC 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC000 E68FFC00 ; SETLO
FFFFFFFFFFFFC004 040D0809 lw r2,#1364*768
FFFFFFFFFFFFC008 06210601 shrui r2,r2,#3 ; r2 = # words to clear
FFFFFFFFFFFFC00C E6A92929 ; SETLO
FFFFFFFFFFFFC010 EEA4A4A4 ; SETMID
FFFFFFFFFFFFC014 F6829292 ; SETHI
FFFFFFFFFFFFC018 6A0D042D lea r1,0x2929292929292929 ; r1 = color for eight pixels
FFFFFFFFFFFFC01C E6A00000 ; SETLO
FFFFFFFFFFFFC020 EE800400 ; SETMID
FFFFFFFFFFFFC024 6A0D0C2D lea r3,BITMAPSCR ; r3 = screen address
FFFFFFFFFFFFC028 csj4:
FFFFFFFFFFFFC028 66308000 sw r1,[r3] ; store pixel data
FFFFFFFFFFFFC02C 0A318008 addui r3,r3,#8 ; advance screen address by eight
FFFFFFFFFFFFC030 BE017FCF loop r2,csj4 ; decrement pixel count and loop back
FFFFFFFFFFFFC034 47E08000 lw r1,[sp]
FFFFFFFFFFFFC038 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC03C 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC040 37EF8018 ret #24
;------------------------------------------------------------------------------
; Clear the screen and the screen color memory
; We clear the screen to give a visual indication that the system
; is working at all.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC044 ClearScreen:
FFFFFFFFFFFFC044 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFC048 67E08000 sw r1,[sp]
FFFFFFFFFFFFC04C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC050 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC054 67E20018 sw r4,24[sp]
FFFFFFFFFFFFC058 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFC05C E69A0000 ; SETLO
FFFFFFFFFFFFC060 EE800003 ; SETMID
FFFFFFFFFFFFC064 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFC068 82308000 inch r1,TEXT_COLS[r3] ; calc number to clear
FFFFFFFFFFFFC06C 82310002 inch r2,TEXT_ROWS[r3]
FFFFFFFFFFFFC070 04110818 mulu r2,r1,r2 ; r2 = # chars to clear
FFFFFFFFFFFFC074 E0400020 setlo r1,#32 ; space char
FFFFFFFFFFFFC078 42021414 lc r4,ScreenColor
FFFFFFFFFFFFC07C 31FFF063 call AsciiToScreen
FFFFFFFFFFFFC080 E6900000 ; SETLO
FFFFFFFFFFFFC084 EE800003 ; SETMID
FFFFFFFFFFFFC088 6A0D0C2D lea r3,TEXTSCR ; text screen address
FFFFFFFFFFFFC08C csj4:
FFFFFFFFFFFFC08C 92308000 outc r1,[r3]
FFFFFFFFFFFFC090 E6810000 ; SETLO
FFFFFFFFFFFFC094 6A3D1029 outc r4,0x10000[r3] ; color screen is 0x10000 higher
FFFFFFFFFFFFC098 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC09C BE017F8F loop r2,csj4
FFFFFFFFFFFFC0A0 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFC0A4 47E20018 lw r4,24[sp]
FFFFFFFFFFFFC0A8 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC0AC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC0B0 47E08000 lw r1,[sp]
FFFFFFFFFFFFC0B4 37EF8028 ret #40
;------------------------------------------------------------------------------
; Scroll text on the screen upwards
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC0B8 ScrollUp:
FFFFFFFFFFFFC0B8 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFC0BC 67E08000 sw r1,[sp]
FFFFFFFFFFFFC0C0 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC0C4 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC0C8 67E20018 sw r4,24[sp]
FFFFFFFFFFFFC0CC 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFC0D0 E69A0000 ; SETLO
FFFFFFFFFFFFC0D4 EE800003 ; SETMID
FFFFFFFFFFFFC0D8 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFC0DC 82308000 inch r1,TEXT_COLS[r3] ; r1 = # text columns
FFFFFFFFFFFFC0E0 82310002 inch r2,TEXT_ROWS[r3]
FFFFFFFFFFFFC0E4 04110818 mulu r2,r1,r2 ; calc number of chars to scroll
FFFFFFFFFFFFC0E8 04208805 subu r2,r2,r1 ; one less row
FFFFFFFFFFFFC0EC E6900000 ; SETLO
FFFFFFFFFFFFC0F0 EE800003 ; SETMID
FFFFFFFFFFFFC0F4 6A0D0C2D lea r3,TEXTSCR
FFFFFFFFFFFFC0F8 scrup1:
FFFFFFFFFFFFC0F8 6A309121 inch r4,[r3+r1*2] ; indexed addressing example
FFFFFFFFFFFFC0FC 92320000 outc r4,[r3]
FFFFFFFFFFFFC100 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC104 BE017FAF loop r2,scrup1
FFFFFFFFFFFFC108 E69A0000 ; SETLO
FFFFFFFFFFFFC10C EE800003 ; SETMID
FFFFFFFFFFFFC110 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFC114 82308002 inch r1,TEXT_ROWS[r3]
FFFFFFFFFFFFC118 0E108001 subui r1,r1,#1
FFFFFFFFFFFFC11C 31FFF04E call BlankLine
FFFFFFFFFFFFC120 47E08000 lw r1,[sp]
FFFFFFFFFFFFC124 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC128 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC12C 47E20018 lw r4,24[sp]
FFFFFFFFFFFFC130 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFC134 37EF8028 ret #40
;------------------------------------------------------------------------------
; Blank out a line on the display
; line number to blank is in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC138 BlankLine:
FFFFFFFFFFFFC138 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC13C 67E08000 sw r1,[sp]
FFFFFFFFFFFFC140 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC144 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC148 E69A0000 ; SETLO
FFFFFFFFFFFFC14C EE800003 ; SETMID
FFFFFFFFFFFFC150 6A0D0C2D lea r3,TEXTREG ; r3 = text register address
FFFFFFFFFFFFC154 82310000 inch r2,TEXT_COLS[r3] ; r2 = # chars to blank out
FFFFFFFFFFFFC158 04208C18 mulu r3,r2,r1
FFFFFFFFFFFFC15C 06318200 shli r3,r3,#1
FFFFFFFFFFFFC160 E6900000 ; SETLO
FFFFFFFFFFFFC164 EE800003 ; SETMID
FFFFFFFFFFFFC168 043D0C03 addui r3,r3,#TEXTSCR ; r3 = screen address
FFFFFFFFFFFFC16C E0400020 setlo r1,#' '
FFFFFFFFFFFFC170 blnkln1:
FFFFFFFFFFFFC170 92308000 outc r1,[r3]
FFFFFFFFFFFFC174 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC178 BE017FCF loop r2,blnkln1
FFFFFFFFFFFFC17C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC180 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC184 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC188 37EF8018 ret #24
;------------------------------------------------------------------------------
; Convert ASCII character to screen display character.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC18C AsciiToScreen:
FFFFFFFFFFFFC18C 141080FF andi r1,r1,#0x00ff
FFFFFFFFFFFFC190 A8100541 bltui r1,#'A',atoscr1
FFFFFFFFFFFFC194 AC10045A bleui r1,#'Z',atoscr1
FFFFFFFFFFFFC198 AE10037A bgtui r1,#'z',atoscr1
FFFFFFFFFFFFC19C A8100261 bltui r1,#'a',atoscr1
FFFFFFFFFFFFC1A0 0E108060 subui r1,r1,#0x60
FFFFFFFFFFFFC1A4 atoscr1:
FFFFFFFFFFFFC1A4 16108100 ori r1,r1,#0x100
FFFFFFFFFFFFC1A8 37EF8000 ret
;------------------------------------------------------------------------------
; Convert screen character to ascii character
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC1AC ScreenToAscii:
FFFFFFFFFFFFC1AC 141080FF andi r1,r1,#0xff
FFFFFFFFFFFFC1B0 AE10021A bgtui r1,#26,stasc1
FFFFFFFFFFFFC1B4 0A10803C addui r1,r1,#60
FFFFFFFFFFFFC1B8 stasc1:
FFFFFFFFFFFFC1B8 37EF8000 ret
;------------------------------------------------------------------------------
; Calculate screen memory location from CursorRow,CursorCol.
; Also refreshes the cursor location.
; Destroys r1,r2,r3
; r1 = screen location
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC1BC CalcScreenLoc:
FFFFFFFFFFFFC1BC 4A009417 lbu r1,CursorRow
FFFFFFFFFFFFC1C0 1410807F andi r1,r1,#0x7f
FFFFFFFFFFFFC1C4 E69A0000 ; SETLO
FFFFFFFFFFFFC1C8 EE800003 ; SETMID
FFFFFFFFFFFFC1CC 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFC1D0 82310000 inch r2,TEXT_COLS[r3]
FFFFFFFFFFFFC1D4 04208818 mulu r2,r2,r1
FFFFFFFFFFFFC1D8 4A009418 lbu r1,CursorCol
FFFFFFFFFFFFC1DC 1410807F andi r1,r1,#0x7f
FFFFFFFFFFFFC1E0 04208803 addu r2,r2,r1
FFFFFFFFFFFFC1E4 92310016 outc r2,TEXT_CURPOS[r3]
FFFFFFFFFFFFC1E8 06210206 shlui r2,r2,#1
FFFFFFFFFFFFC1EC E6900000 ; SETLO
FFFFFFFFFFFFC1F0 EE800003 ; SETMID
FFFFFFFFFFFFC1F4 042D0403 addui r1,r2,#TEXTSCR ; r1 = screen location
FFFFFFFFFFFFC1F8 37EF8000 ret
;------------------------------------------------------------------------------
; Display a character on the screen
; d1.b = char to display
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC1FC DisplayChar:
FFFFFFFFFFFFC1FC B210080D bnei r1,#'\r',dccr ; carriage return ?
FFFFFFFFFFFFC200 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC204 67E08000 sw r1,[sp]
FFFFFFFFFFFFC208 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC20C 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC210 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC214 60001418 sb r0,CursorCol ; just set cursor column to zero on a CR
FFFFFFFFFFFFC218 BE00018A bra dcx7
FFFFFFFFFFFFC21C dccr:
; beqi r1,#CTRLK,dccr1
FFFFFFFFFFFFC21C E6800091 ; SETLO
FFFFFFFFFFFFC220 BE1D0209 bnei r1,#0x91,dcx6 ; cursor right ?
FFFFFFFFFFFFC224 dccr1:
FFFFFFFFFFFFC224 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC228 67E08000 sw r1,[sp]
FFFFFFFFFFFFC22C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC230 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC234 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC238 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFC23C B0200338 beqi r2,#56,dcx7
FFFFFFFFFFFFC240 0A210001 addui r2,r2,#1
FFFFFFFFFFFFC244 60011418 sb r2,CursorCol
FFFFFFFFFFFFC248 dcx7:
FFFFFFFFFFFFC248 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFC24C 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFC250 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC254 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC258 47E08000 lw r1,[sp]
FFFFFFFFFFFFC25C 37EF8020 ret #32
FFFFFFFFFFFFC260 dcx6:
; beqi r1,#CTRLI,dccu1
FFFFFFFFFFFFC260 E6800090 ; SETLO
FFFFFFFFFFFFC264 BE1D0169 bnei r1,#0x90,dcx8 ; cursor up ?
FFFFFFFFFFFFC268 dccu1:
FFFFFFFFFFFFC268 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC26C 67E08000 sw r1,[sp]
FFFFFFFFFFFFC270 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC274 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC278 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC27C 4A011417 lbu r2,CursorRow
FFFFFFFFFFFFC280 B02FF200 beqi r2,#0,dcx7
FFFFFFFFFFFFC284 0E210001 subui r2,r2,#1
FFFFFFFFFFFFC288 60011417 sb r2,CursorRow
FFFFFFFFFFFFC28C BE007DEA bra dcx7
FFFFFFFFFFFFC290 dcx8:
; beqi r1,#CTRLJ,dccl1
FFFFFFFFFFFFC290 E6800093 ; SETLO
FFFFFFFFFFFFC294 BE1D0169 bnei r1,#0x93,dcx9 ; cursor left ?
FFFFFFFFFFFFC298 dccl1:
FFFFFFFFFFFFC298 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC29C 67E08000 sw r1,[sp]
FFFFFFFFFFFFC2A0 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC2A4 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC2A8 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC2AC 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFC2B0 B02FE600 beqi r2,#0,dcx7
FFFFFFFFFFFFC2B4 0E210001 subui r2,r2,#1
FFFFFFFFFFFFC2B8 60011418 sb r2,CursorCol
FFFFFFFFFFFFC2BC BE007C6A bra dcx7
FFFFFFFFFFFFC2C0 dcx9:
; beqi r1,#CTRLM,dccd1
FFFFFFFFFFFFC2C0 E6800092 ; SETLO
FFFFFFFFFFFFC2C4 BE1D0169 bnei r1,#0x92,dcx10 ; cursor down ?
FFFFFFFFFFFFC2C8 dccd1:
FFFFFFFFFFFFC2C8 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC2CC 67E08000 sw r1,[sp]
FFFFFFFFFFFFC2D0 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC2D4 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC2D8 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC2DC 4A011417 lbu r2,CursorRow
FFFFFFFFFFFFC2E0 B02FDA1E beqi r2,#30,dcx7
FFFFFFFFFFFFC2E4 0A210001 addui r2,r2,#1
FFFFFFFFFFFFC2E8 60011417 sb r2,CursorRow
FFFFFFFFFFFFC2EC BE007AEA bra dcx7
FFFFFFFFFFFFC2F0 dcx10:
FFFFFFFFFFFFC2F0 E6800094 ; SETLO
FFFFFFFFFFFFC2F4 BE1D0189 bnei r1,#0x94,dcx11 ; cursor home ?
FFFFFFFFFFFFC2F8 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC2FC 67E08000 sw r1,[sp]
FFFFFFFFFFFFC300 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC304 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC308 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC30C 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFC310 BE200068 beq r2,r0,dcx12
FFFFFFFFFFFFC314 60001418 sb r0,CursorCol
FFFFFFFFFFFFC318 BE00798A bra dcx7
FFFFFFFFFFFFC31C dcx12:
FFFFFFFFFFFFC31C 60001417 sb r0,CursorRow
FFFFFFFFFFFFC320 BE00794A bra dcx7
FFFFFFFFFFFFC324 dcx11:
FFFFFFFFFFFFC324 0FEF0030 subui sp,sp,#48
FFFFFFFFFFFFC328 67E08000 sw r1,[sp]
FFFFFFFFFFFFC32C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC330 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC334 67E20018 sw r4,24[sp]
FFFFFFFFFFFFC338 67E28020 sw r5,32[sp]
FFFFFFFFFFFFC33C 67EF8028 sw lr,40[sp]
FFFFFFFFFFFFC340 E6800099 ; SETLO
FFFFFFFFFFFFC344 BE1D00A9 bnei r1,#0x99,dcx13 ; delete ?
FFFFFFFFFFFFC348 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFC34C 02118009 mov r3,r1 ; r3 = screen location
FFFFFFFFFFFFC350 4A009418 lbu r1,CursorCol ; r1 = cursor column
FFFFFFFFFFFFC354 BE00012A bra dcx5
FFFFFFFFFFFFC358 dcx13:
FFFFFFFFFFFFC358 B2101508 bnei r1,#CTRLH,dcx3 ; backspace ?
FFFFFFFFFFFFC35C 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFC360 BE200408 beq r2,r0,dcx4
FFFFFFFFFFFFC364 0E210001 subui r2,r2,#1
FFFFFFFFFFFFC368 60011418 sb r2,CursorCol
FFFFFFFFFFFFC36C 31FFF06F call CalcScreenLoc ; a0 = screen location
FFFFFFFFFFFFC370 02118009 mov r3,r1 ; r3 = screen location
FFFFFFFFFFFFC374 4A009418 lbu r1,CursorCol
FFFFFFFFFFFFC378 dcx5:
FFFFFFFFFFFFC378 82310002 inch r2,2[r3]
FFFFFFFFFFFFC37C 92310000 outc r2,[r3]
FFFFFFFFFFFFC380 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC384 0A108001 addui r1,r1,#1
FFFFFFFFFFFFC388 E69A0000 ; SETLO
FFFFFFFFFFFFC38C EE800003 ; SETMID
FFFFFFFFFFFFC390 6A0D102D lea r4,TEXTREG
FFFFFFFFFFFFC394 82428000 inch r5,TEXT_COLS[r4]
FFFFFFFFFFFFC398 BE12FF04 bltu r1,r5,dcx5
FFFFFFFFFFFFC39C E0400020 setlo r1,#' '
FFFFFFFFFFFFC3A0 31FFF063 call AsciiToScreen
FFFFFFFFFFFFC3A4 9230FFFE outc r1,-2[r3]
FFFFFFFFFFFFC3A8 BE0001CA bra dcx4
FFFFFFFFFFFFC3AC dcx3:
FFFFFFFFFFFFC3AC B0100C0A beqi r1,#'\n',dclf ; linefeed ?
FFFFFFFFFFFFC3B0 02120009 mov r4,r1 ; save r1 in r4
FFFFFFFFFFFFC3B4 31FFF06F call CalcScreenLoc ; r1 = screen location
FFFFFFFFFFFFC3B8 02118009 mov r3,r1 ; r3 = screen location
FFFFFFFFFFFFC3BC 02408009 mov r1,r4 ; restore r1
FFFFFFFFFFFFC3C0 31FFF063 call AsciiToScreen ; convert ascii char to screen char
FFFFFFFFFFFFC3C4 92308000 outc r1,[r3]
FFFFFFFFFFFFC3C8 42009410 lc r1,CharColor
FFFFFFFFFFFFC3CC E6810000 ; SETLO
FFFFFFFFFFFFC3D0 6A3D0429 outc r1,0x10000[r3]
FFFFFFFFFFFFC3D4 31FFF0FF call IncCursorPos
FFFFFFFFFFFFC3D8 BE00004A bra dcx4
FFFFFFFFFFFFC3DC dclf:
FFFFFFFFFFFFC3DC 31FFF10D call IncCursorRow
FFFFFFFFFFFFC3E0 dcx4:
FFFFFFFFFFFFC3E0 47EF8028 lw lr,40[sp]
FFFFFFFFFFFFC3E4 47E28020 lw r5,32[sp]
FFFFFFFFFFFFC3E8 47E20018 lw r4,24[sp]
FFFFFFFFFFFFC3EC 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC3F0 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC3F4 47E08000 lw r1,[sp]
FFFFFFFFFFFFC3F8 37EF8030 ret #48
;------------------------------------------------------------------------------
; Increment the cursor position, scroll the screen if needed.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC3FC IncCursorPos:
FFFFFFFFFFFFC3FC 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC400 67E08000 sw r1,[sp]
FFFFFFFFFFFFC404 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC408 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC40C 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC410 4A009418 lbu r1,CursorCol
FFFFFFFFFFFFC414 0A108001 addui r1,r1,#1
FFFFFFFFFFFFC418 60009418 sb r1,CursorCol
FFFFFFFFFFFFC41C E69A0000 ; SETLO
FFFFFFFFFFFFC420 EE800003 ; SETMID
FFFFFFFFFFFFC424 6A0D0821 inch r2,TEXTREG+TEXT_COLS
FFFFFFFFFFFFC428 BE110246 bleu r1,r2,icc1
FFFFFFFFFFFFC42C 60001418 sb r0,CursorCol ; column = 0
FFFFFFFFFFFFC430 BE0000CA bra icr1
FFFFFFFFFFFFC434 IncCursorRow:
FFFFFFFFFFFFC434 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC438 67E08000 sw r1,[sp]
FFFFFFFFFFFFC43C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC440 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC444 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC448 icr1:
FFFFFFFFFFFFC448 4A009417 lbu r1,CursorRow
FFFFFFFFFFFFC44C 0A108001 addui r1,r1,#1
FFFFFFFFFFFFC450 60009417 sb r1,CursorRow
FFFFFFFFFFFFC454 E69A0002 ; SETLO
FFFFFFFFFFFFC458 EE800003 ; SETMID
FFFFFFFFFFFFC45C 6A0D0821 inch r2,TEXTREG+TEXT_ROWS
FFFFFFFFFFFFC460 BE110086 bleu r1,r2,icc1
FFFFFFFFFFFFC464 0E210001 subui r2,r2,#1 ; backup the cursor row, we are scrolling up
FFFFFFFFFFFFC468 60011417 sb r2,CursorRow
FFFFFFFFFFFFC46C 31FFF02E call ScrollUp
FFFFFFFFFFFFC470 icc1:
FFFFFFFFFFFFC470 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFC474 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFC478 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC47C 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC480 47E08000 lw r1,[sp]
FFFFFFFFFFFFC484 37EF8020 ret #32
;------------------------------------------------------------------------------
; Display a string on the screen.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC488 DisplayString:
FFFFFFFFFFFFC488 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC48C 67E08000 sw r1,[sp]
FFFFFFFFFFFFC490 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC494 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC498 02110009 mov r2,r1 ; r2 = pointer to string
FFFFFFFFFFFFC49C dspj1:
FFFFFFFFFFFFC49C 4A208000 lbu r1,[r2] ; move string char into r1
FFFFFFFFFFFFC4A0 0A210001 addui r2,r2,#1 ; increment pointer
FFFFFFFFFFFFC4A4 BE100068 beq r1,r0,dsret ; is it end of string ?
FFFFFFFFFFFFC4A8 31FFF07F call DisplayChar ; display character
FFFFFFFFFFFFC4AC BE007F8A bra dspj1 ; go back for next character
FFFFFFFFFFFFC4B0 dsret:
FFFFFFFFFFFFC4B0 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC4B4 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC4B8 47E08000 lw r1,[sp]
FFFFFFFFFFFFC4BC 37EF8018 ret #24
FFFFFFFFFFFFC4C0 DisplayStringCRLF:
FFFFFFFFFFFFC4C0 0FEF0008 subui r30,r30,#8
FFFFFFFFFFFFC4C4 67EF8000 sw r31,[r30]
FFFFFFFFFFFFC4C8 31FFF122 call DisplayString
FFFFFFFFFFFFC4CC 47EF8000 lw r31,[r30]
FFFFFFFFFFFFC4D0 0BEF0008 addui r30,r30,#8
FFFFFFFFFFFFC4D4 CRLF:
FFFFFFFFFFFFC4D4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC4D8 67E08000 sw r1,[sp]
FFFFFFFFFFFFC4DC 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC4E0 E040000D setlo r1,#'\r'
FFFFFFFFFFFFC4E4 31FFF07F call DisplayChar
FFFFFFFFFFFFC4E8 E040000A setlo r1,#'\n'
FFFFFFFFFFFFC4EC 31FFF07F call DisplayChar
FFFFFFFFFFFFC4F0 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC4F4 47E08000 lw r1,[sp]
FFFFFFFFFFFFC4F8 37EF8010 ret #16
; Call the Tiny BASIC routine to display a number
;
FFFFFFFFFFFFC4FC DisplayNum:
FFFFFFFFFFFFC4FC 33FFFCCC jmp PRTNUM
;------------------------------------------------------------------------------
; Display nybble in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC500 DisplayNybble:
FFFFFFFFFFFFC500 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC504 67E08000 sw r1,[sp]
FFFFFFFFFFFFC508 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC50C 1410800F andi r1,r1,#0x0F
FFFFFFFFFFFFC510 0A108030 addui r1,r1,#'0'
FFFFFFFFFFFFC514 AC100239 bleui r1,#'9',dispnyb1
FFFFFFFFFFFFC518 0A108007 addui r1,r1,#7
FFFFFFFFFFFFC51C dispnyb1:
FFFFFFFFFFFFC51C 31FFF07F call DisplayChar
FFFFFFFFFFFFC520 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC524 47E08000 lw r1,[sp]
FFFFFFFFFFFFC528 37EF8010 ret #16
;------------------------------------------------------------------------------
; Display the byte in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC52C DisplayByte:
FFFFFFFFFFFFC52C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC530 67E08000 sw r1,[sp]
FFFFFFFFFFFFC534 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC538 06108804 rori r1,r1,#4
FFFFFFFFFFFFC53C 31FFF140 call DisplayNybble
FFFFFFFFFFFFC540 06108802 roli r1,r1,#4
FFFFFFFFFFFFC544 31FFF140 call DisplayNybble
FFFFFFFFFFFFC548 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC54C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC550 37EF8010 ret #16
;------------------------------------------------------------------------------
; Display the char in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC554 DisplayCharr:
FFFFFFFFFFFFC554 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC558 67E08000 sw r1,[sp]
FFFFFFFFFFFFC55C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC560 06109004 rori r1,r1,#8
FFFFFFFFFFFFC564 31FFF14B call DisplayByte
FFFFFFFFFFFFC568 06109002 roli r1,r1,#8
FFFFFFFFFFFFC56C 31FFF14B call DisplayByte
FFFFFFFFFFFFC570 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC574 47E08000 lw r1,[sp]
FFFFFFFFFFFFC578 37EF8010 ret #16
;------------------------------------------------------------------------------
; Display the half-word in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC57C DisplayHalf:
FFFFFFFFFFFFC57C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC580 67E08000 sw r1,[sp]
FFFFFFFFFFFFC584 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC588 0610A004 rori r1,r1,#16
FFFFFFFFFFFFC58C 31FFF155 call DisplayCharr
FFFFFFFFFFFFC590 0610A002 roli r1,r1,#16
FFFFFFFFFFFFC594 31FFF155 call DisplayCharr
FFFFFFFFFFFFC598 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC59C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC5A0 37EF8010 ret #16
;------------------------------------------------------------------------------
; Display the 64 bit word in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC5A4 DisplayWord:
FFFFFFFFFFFFC5A4 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC5A8 67E08000 sw r1,[sp]
FFFFFFFFFFFFC5AC 67E18008 sw r3,8[sp]
FFFFFFFFFFFFC5B0 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC5B4 E0C00007 setlo r3,#7
FFFFFFFFFFFFC5B8 dspwd1:
FFFFFFFFFFFFC5B8 06109002 roli r1,r1,#8
FFFFFFFFFFFFC5BC 31FFF14B call DisplayByte
FFFFFFFFFFFFC5C0 BE01FFCF loop r3,dspwd1
FFFFFFFFFFFFC5C4 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC5C8 47E18008 lw r3,8[sp]
FFFFFFFFFFFFC5CC 47E08000 lw r1,[sp]
FFFFFFFFFFFFC5D0 37EF8018 ret #24
;------------------------------------------------------------------------------
; Display memory pointed to by r2.
; destroys r1,r3
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC5D4 DisplayMemB:
FFFFFFFFFFFFC5D4 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC5D8 67E08000 sw r1,[sp]
FFFFFFFFFFFFC5DC 67E18008 sw r3,8[sp]
FFFFFFFFFFFFC5E0 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC5E4 E040003A setlo r1,#':'
FFFFFFFFFFFFC5E8 31FFF07F call DisplayChar
FFFFFFFFFFFFC5EC 02208009 mov r1,r2
FFFFFFFFFFFFC5F0 31FFF169 call DisplayWord
FFFFFFFFFFFFC5F4 E0C00007 setlo r3,#7
FFFFFFFFFFFFC5F8 dspmem1:
FFFFFFFFFFFFC5F8 E0400020 setlo r1,#' '
FFFFFFFFFFFFC5FC 31FFF07F call DisplayChar
FFFFFFFFFFFFC600 4A208000 lbu r1,[r2]
FFFFFFFFFFFFC604 31FFF14B call DisplayByte
FFFFFFFFFFFFC608 0A210001 addui r2,r2,#1
FFFFFFFFFFFFC60C BE01FF6F loop r3,dspmem1
FFFFFFFFFFFFC610 31FFF135 call CRLF
FFFFFFFFFFFFC614 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC618 47E18008 lw r3,8[sp]
FFFFFFFFFFFFC61C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC620 37EF8018 ret #24
FFFFFFFFFFFFC624 DisplayMemC:
FFFFFFFFFFFFC624 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC628 67E08000 sw r1,[sp]
FFFFFFFFFFFFC62C 67E18008 sw r3,8[sp]
FFFFFFFFFFFFC630 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC634 E040003A setlo r1,#':'
FFFFFFFFFFFFC638 31FFF07F call DisplayChar
FFFFFFFFFFFFC63C 02208009 mov r1,r2
FFFFFFFFFFFFC640 31FFF169 call DisplayWord
FFFFFFFFFFFFC644 E0C00003 setlo r3,#3
FFFFFFFFFFFFC648 dspmemc1:
FFFFFFFFFFFFC648 E0400020 setlo r1,#' '
FFFFFFFFFFFFC64C 31FFF07F call DisplayChar
FFFFFFFFFFFFC650 4C208000 lcu r1,[r2]
FFFFFFFFFFFFC654 31FFF155 call DisplayCharr
FFFFFFFFFFFFC658 0A210002 addui r2,r2,#2
FFFFFFFFFFFFC65C BE01FF6F loop r3,dspmemc1
FFFFFFFFFFFFC660 31FFF135 call CRLF
FFFFFFFFFFFFC664 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC668 47E18008 lw r3,8[sp]
FFFFFFFFFFFFC66C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC670 37EF8018 ret #24
FFFFFFFFFFFFC674 DisplayMemW:
FFFFFFFFFFFFC674 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC678 67E08000 sw r1,[sp]
FFFFFFFFFFFFC67C 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC680 E040003A setlo r1,#':'
FFFFFFFFFFFFC684 31FFF07F call DisplayChar
FFFFFFFFFFFFC688 02208009 mov r1,r2
FFFFFFFFFFFFC68C 31FFF169 call DisplayWord
FFFFFFFFFFFFC690 E0400020 setlo r1,#' '
FFFFFFFFFFFFC694 31FFF07F call DisplayChar
FFFFFFFFFFFFC698 46208000 lw r1,[r2]
FFFFFFFFFFFFC69C 31FFF169 call DisplayWord
FFFFFFFFFFFFC6A0 0A210008 addui r2,r2,#8
FFFFFFFFFFFFC6A4 31FFF135 call CRLF
FFFFFFFFFFFFC6A8 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC6AC 47E08000 lw r1,[sp]
FFFFFFFFFFFFC6B0 37EF8018 ret #24
;------------------------------------------------------------------------------
; Converts binary number in r1 into BCD number in r2 and r1.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC6B4 BinToBCD:
FFFFFFFFFFFFC6B4 0FEF0030 subui sp,sp,#48
FFFFFFFFFFFFC6B8 67E18000 sw r3,[sp]
FFFFFFFFFFFFC6BC 67E20008 sw r4,8[sp]
FFFFFFFFFFFFC6C0 67E28010 sw r5,16[sp]
FFFFFFFFFFFFC6C4 67E30018 sw r6,24[sp]
FFFFFFFFFFFFC6C8 67E38020 sw r7,32[sp]
FFFFFFFFFFFFC6CC 67E40028 sw r8,40[sp]
FFFFFFFFFFFFC6D0 E080000A setlo r2,#10
FFFFFFFFFFFFC6D4 E2000013 setlo r8,#19 ; number of digits to produce - 1
FFFFFFFFFFFFC6D8 bta1:
FFFFFFFFFFFFC6D8 04110C1C modu r3,r1,r2
FFFFFFFFFFFFC6DC 0631F800 shli r3,r3,#60 ; shift result to uppermost bits
FFFFFFFFFFFFC6E0 0653F800 shli r7,r5,#60 ; copy low order nybble of r5 to r4 topmost nybble
FFFFFFFFFFFFC6E4 06420801 shrui r4,r4,#4
FFFFFFFFFFFFC6E8 04439009 or r4,r4,r7
FFFFFFFFFFFFC6EC 06528801 shrui r5,r5,#4
FFFFFFFFFFFFC6F0 04519409 or r5,r5,r3 ; copy new bcd digit into uppermost bits of r5
FFFFFFFFFFFFC6F4 1E108000 divui r1,r1,r2 ; r1=r1/10
FFFFFFFFFFFFC6F8 BE047F0F loop r8,bta1
FFFFFFFFFFFFC6FC 06426001 shrui r4,r4,#48 ; right align number in register
FFFFFFFFFFFFC700 06532000 shli r6,r5,#16
FFFFFFFFFFFFC704 04431009 or r4,r4,r6 ; copy bits into r4
FFFFFFFFFFFFC708 0652E001 shrui r5,r5,#48
FFFFFFFFFFFFC70C 02408009 mov r1,r4
FFFFFFFFFFFFC710 02510009 mov r2,r5
FFFFFFFFFFFFC714 47E18000 lw r3,[sp]
FFFFFFFFFFFFC718 47E20008 lw r4,8[sp]
FFFFFFFFFFFFC71C 47E28010 lw r5,16[sp]
FFFFFFFFFFFFC720 47E30018 lw r6,24[sp]
FFFFFFFFFFFFC724 47E38020 lw r7,32[sp]
FFFFFFFFFFFFC728 47E40028 lw r8,40[sp]
FFFFFFFFFFFFC72C 37EF8030 ret #48
;------------------------------------------------------------------------------
; Converts BCD number in r1 into Ascii number in r2 and r1.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC730 BCDToAscii:
FFFFFFFFFFFFC730 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC734 67E18000 sw r3,[sp]
FFFFFFFFFFFFC738 67E20008 sw r4,8[sp]
FFFFFFFFFFFFC73C 67E28010 sw r5,16[sp]
FFFFFFFFFFFFC740 67E40018 sw r8,24[sp]
FFFFFFFFFFFFC744 E200000F setlo r8,#15
FFFFFFFFFFFFC748 bta2:
FFFFFFFFFFFFC748 1411000F andi r2,r1,#0x0F
FFFFFFFFFFFFC74C 16210030 ori r2,r2,#0x30
FFFFFFFFFFFFC750 06217000 shli r2,r2,#56
FFFFFFFFFFFFC754 06421001 shrui r4,r4,#8
FFFFFFFFFFFFC758 0632F000 shli r5,r3,#56
FFFFFFFFFFFFC75C 04429009 or r4,r4,r5
FFFFFFFFFFFFC760 06319001 shrui r3,r3,#8
FFFFFFFFFFFFC764 04310C09 or r3,r3,r2
FFFFFFFFFFFFC768 06108801 shrui r1,r1,#4
FFFFFFFFFFFFC76C BE047EEF loop r8,bta2
FFFFFFFFFFFFC770 02408009 mov r1,r4
FFFFFFFFFFFFC774 02310009 mov r2,r3
FFFFFFFFFFFFC778 47E18000 lw r3,[sp]
FFFFFFFFFFFFC77C 47E20008 lw r4,8[sp]
FFFFFFFFFFFFC780 47E28010 lw r5,16[sp]
FFFFFFFFFFFFC784 47E40018 lw r8,24[sp]
FFFFFFFFFFFFC788 37EF8020 ret #32
;------------------------------------------------------------------------------
; Convert a binary number into a 20 character ascii string.
; r1 = number to convert
; r2 = address of string buffer
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC78C BinToStr:
FFFFFFFFFFFFC78C 0FEF0038 subui sp,sp,#56
FFFFFFFFFFFFC790 67E18000 sw r3,[sp]
FFFFFFFFFFFFC794 67E38008 sw r7,8[sp]
FFFFFFFFFFFFC798 67E40010 sw r8,16[sp]
FFFFFFFFFFFFC79C 67E48018 sw r9,24[sp]
FFFFFFFFFFFFC7A0 67E50020 sw r10,32[sp]
FFFFFFFFFFFFC7A4 67E58028 sw r11,40[sp]
FFFFFFFFFFFFC7A8 67EF8030 sw lr,48[sp]
FFFFFFFFFFFFC7AC 02258009 mov r11,r2
FFFFFFFFFFFFC7B0 31FFF1AD call BinToBCD
FFFFFFFFFFFFC7B4 02250009 mov r10,r2 ; save off r2
FFFFFFFFFFFFC7B8 31FFF1CC call BCDToAscii
FFFFFFFFFFFFC7BC E2400001 setlo r9,#1
FFFFFFFFFFFFC7C0 btos3:
FFFFFFFFFFFFC7C0 E2000007 setlo r8,#7
FFFFFFFFFFFFC7C4 btos1:
FFFFFFFFFFFFC7C4 06938600 shli r7,r9,#3
FFFFFFFFFFFFC7C8 0A738000 addui r7,r7,r8
FFFFFFFFFFFFC7CC 0A738004 addui r7,r7,#4
FFFFFFFFFFFFC7D0 141180FF andi r3,r1,#0xff
FFFFFFFFFFFFC7D4 6A758C10 sb r3,[r7+r11]
FFFFFFFFFFFFC7D8 06109001 shrui r1,r1,#8
FFFFFFFFFFFFC7DC BE047F4F loop r8,btos1
FFFFFFFFFFFFC7E0 02208009 mov r1,r2
FFFFFFFFFFFFC7E4 BE04FEEF loop r9,btos3
; the last four digits
FFFFFFFFFFFFC7E8 02A08009 mov r1,r10 ; get back r2
FFFFFFFFFFFFC7EC 31FFF1CC call BCDToAscii
FFFFFFFFFFFFC7F0 E2000003 setlo r8,#3
FFFFFFFFFFFFC7F4 btos2:
FFFFFFFFFFFFC7F4 141180FF andi r3,r1,#0xff
FFFFFFFFFFFFC7F8 6A858C10 sb r3,[r8+r11]
FFFFFFFFFFFFC7FC 06109001 shrui r1,r1,#8
FFFFFFFFFFFFC800 BE047FAF loop r8,btos2
FFFFFFFFFFFFC804 60B00014 sb r0,20[r11] ; null terminate
FFFFFFFFFFFFC808 47E18000 lw r3,[sp]
FFFFFFFFFFFFC80C 47E38008 lw r7,8[sp]
FFFFFFFFFFFFC810 47E40010 lw r8,16[sp]
FFFFFFFFFFFFC814 47E48018 lw r9,24[sp]
FFFFFFFFFFFFC818 47E50020 lw r10,32[sp]
FFFFFFFFFFFFC81C 47E58028 lw r11,40[sp]
FFFFFFFFFFFFC820 47EF8030 lw lr,48[sp]
FFFFFFFFFFFFC824 37EF8038 ret #56
;==============================================================================
; System Monitor Program
;==============================================================================
;
FFFFFFFFFFFFC828 Monitor:
FFFFFFFFFFFFC828 E6BEFFF8 ; SETLO
FFFFFFFFFFFFC82C 6A0D782D lea sp,STACKTOP0 ; top of stack; reset the stack pointer
FFFFFFFFFFFFC830 6000141C sb r0,KeybdEcho ; turn off keyboard echo
FFFFFFFFFFFFC834 PromptLn:
FFFFFFFFFFFFC834 31FFF135 call CRLF
FFFFFFFFFFFFC838 E0400024 setlo r1,#'$'
FFFFFFFFFFFFC83C 31FFF07F call DisplayChar
; Get characters until a CR is keyed
;
FFFFFFFFFFFFC840 Prompt3:
; lw r1,#2 ; get keyboard character
; syscall #417
FFFFFFFFFFFFC840 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFC844 B01FFFFF beqi r1,#-1,Prompt3 ; wait for a character
FFFFFFFFFFFFC848 B010030D beqi r1,#CR,Prompt1
FFFFFFFFFFFFC84C 31FFF07F call DisplayChar
FFFFFFFFFFFFC850 BE007F8A bra Prompt3
; Process the screen line that the CR was keyed on
;
FFFFFFFFFFFFC854 Prompt1:
FFFFFFFFFFFFC854 60001418 sb r0,CursorCol ; go back to the start of the line
FFFFFFFFFFFFC858 31FFF06F call CalcScreenLoc ; r1 = screen memory location
FFFFFFFFFFFFC85C 02118009 mov r3,r1
FFFFFFFFFFFFC860 82308000 inch r1,[r3]
FFFFFFFFFFFFC864 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC868 31FFF06B call ScreenToAscii
FFFFFFFFFFFFC86C B2100424 bnei r1,#'$',Prompt2 ; skip over '$' prompt character
FFFFFFFFFFFFC870 82308000 inch r1,[r3]
FFFFFFFFFFFFC874 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC878 31FFF06B call ScreenToAscii
; Dispatch based on command character
;
FFFFFFFFFFFFC87C Prompt2:
FFFFFFFFFFFFC87C B0106A3A beqi r1,#':',Editmem ; $: - edit memory
FFFFFFFFFFFFC880 B0107C44 beqi r1,#'D',Dumpmem ; $D - dump memory
FFFFFFFFFFFFC884 B0109446 beqi r1,#'F',Fillmem ; $F - fill memory
FFFFFFFFFFFFC888 Prompt7:
FFFFFFFFFFFFC888 B2100242 bnei r1,#'B',Prompt4 ; $B - start tiny basic
FFFFFFFFFFFFC88C 33FFF7E0 jmp CSTART
FFFFFFFFFFFFC890 Prompt4:
FFFFFFFFFFFFC890 B0106F4A beqi r1,#'J',ExecuteCode ; $J - execute code
FFFFFFFFFFFFC894 B210024C bnei r1,#'L',Prompt9 ; $L - load S19 file
FFFFFFFFFFFFC898 33FFF297 jmp LoadSector
FFFFFFFFFFFFC89C Prompt9:
FFFFFFFFFFFFC89C B210043F bnei r1,#'?',Prompt10 ; $? - display help
FFFFFFFFFFFFC8A0 9A00C910 lea r1,HelpMsg
FFFFFFFFFFFFC8A4 31FFF122 call DisplayString
FFFFFFFFFFFFC8A8 33FFF20A jmp Monitor
FFFFFFFFFFFFC8AC Prompt10:
FFFFFFFFFFFFC8AC B0100C43 beqi r1,#'C',TestCLS ; $C - clear screen
FFFFFFFFFFFFC8B0 B2100252 bnei r1,#'R',Prompt12
FFFFFFFFFFFFC8B4 33FFF235 jmp RandomLinesCall
FFFFFFFFFFFFC8B8 Prompt12:
FFFFFFFFFFFFC8B8 B2100249 bnei r1,#'I',Prompt13
FFFFFFFFFFFFC8BC 33FFF528 jmp Invaders
FFFFFFFFFFFFC8C0 Prompt13:
FFFFFFFFFFFFC8C0 B2100250 bnei r1,#'P',Prompt14
FFFFFFFFFFFFC8C4 33FFF411 jmp Piano
FFFFFFFFFFFFC8C8 Prompt14:
FFFFFFFFFFFFC8C8 B2100254 bnei r1,#'T',Prompt15
FFFFFFFFFFFFC8CC 31FFEF53 call tmp_read
FFFFFFFFFFFFC8D0 Prompt15:
FFFFFFFFFFFFC8D0 33FFF20A jmp Monitor
FFFFFFFFFFFFC8D4 RandomLinesCall:
FFFFFFFFFFFFC8D4 31FFF374 call RandomLines
FFFFFFFFFFFFC8D8 33FFF20A jmp Monitor
FFFFFFFFFFFFC8DC TestCLS:
FFFFFFFFFFFFC8DC 82308000 inch r1,[r3]
FFFFFFFFFFFFC8E0 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC8E4 31FFF06B call ScreenToAscii
FFFFFFFFFFFFC8E8 B21FD04C bnei r1,#'L',Monitor
FFFFFFFFFFFFC8EC 82308000 inch r1,[r3]
FFFFFFFFFFFFC8F0 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC8F4 31FFF06B call ScreenToAscii
FFFFFFFFFFFFC8F8 B21FCC53 bnei r1,#'S',Monitor
FFFFFFFFFFFFC8FC 31FFF011 call ClearScreen
FFFFFFFFFFFFC900 60001418 sb r0,CursorCol
FFFFFFFFFFFFC904 60001417 sb r0,CursorRow
FFFFFFFFFFFFC908 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFC90C 33FFF20A jmp Monitor
FFFFFFFFFFFFC910 HelpMsg:
FFFFFFFFFFFFC910 70736944203D203F db "? = Display help",CR,LF
FFFFFFFFFFFFC918 706C65682079616C
FFFFFFFFFFFFC920 203D20534C430A0D db "CLS = clear screen",CR,LF
FFFFFFFFFFFFC928 6373207261656C63
FFFFFFFFFFFFC930 203A0A0D6E656572 db ": = Edit memory bytes",CR,LF
FFFFFFFFFFFFC938 6D2074696445203D
FFFFFFFFFFFFC940 79622079726F6D65
FFFFFFFFFFFFC948 3D204C0A0D736574 db "L = Load S19 file",CR,LF
FFFFFFFFFFFFC950 31532064616F4C20
FFFFFFFFFFFFC958 0A0D656C69662039
FFFFFFFFFFFFC960 7C487C437C425B44 db "D[B|C|H|W] = Dump memory",CR,LF
FFFFFFFFFFFFC968 6D7544203D205D57
FFFFFFFFFFFFC970 79726F6D656D2070
FFFFFFFFFFFFC978 7C437C425B460A0D db "F[B|C|H|W] = Fill memory",CR,LF
FFFFFFFFFFFFC980 46203D205D577C48
FFFFFFFFFFFFC988 6F6D656D206C6C69
FFFFFFFFFFFFC990 203D20420A0D7972 db "B = start tiny basic",CR,LF
FFFFFFFFFFFFC998 6974207472617473
FFFFFFFFFFFFC9A0 636973616220796E
FFFFFFFFFFFFC9A8 754A203D204A0A0D db "J = Jump to code",CR,LF
FFFFFFFFFFFFC9B0 6F63206F7420706D
FFFFFFFFFFFFC9B8 203D20490A0D6564 db "I = Invaders",CR,LF
FFFFFFFFFFFFC9C0 7372656461766E49
FFFFFFFFFFFFC9C8 6152203D20520A0D db "R = Random lines",CR,LF
FFFFFFFFFFFFC9D0 6E696C206D6F646E
FFFFFFFFFFFFC9D8 203D20540A0D7365 db "T = get temperature",CR,LF
FFFFFFFFFFFFC9E0 706D657420746567
FFFFFFFFFFFFC9E8 0D65727574617265
FFFFFFFFFFFFC9F0 616950203D20500A db "P = Piano",CR,LF,0
FFFFFFFFFFFFC9F8 000000000A0D6F6E align 4
FFFFFFFFFFFFCA00 align 4
;------------------------------------------------------------------------------
; Ignore blanks in the input
; r3 = text pointer
; r1 destroyed
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFCA00 ignBlanks:
FFFFFFFFFFFFCA00 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCA04 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCA08 ignBlanks1:
FFFFFFFFFFFFCA08 82308000 inch r1,[r3]
FFFFFFFFFFFFCA0C 0A318002 addui r3,r3,#2
FFFFFFFFFFFFCA10 31FFF06B call ScreenToAscii
FFFFFFFFFFFFCA14 B01FFD20 beqi r1,#' ',ignBlanks1
FFFFFFFFFFFFCA18 0E318002 subui r3,r3,#2
FFFFFFFFFFFFCA1C 47EF8000 lw r31,[sp]
FFFFFFFFFFFFCA20 37EF8008 ret #8
;------------------------------------------------------------------------------
; Edit memory byte(s).
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFCA24 EditMem:
FFFFFFFFFFFFCA24 31FFF280 call ignBlanks
FFFFFFFFFFFFCA28 31FFF2D4 call GetHexNumber
FFFFFFFFFFFFCA2C 04101409 or r5,r1,r0
FFFFFFFFFFFFCA30 E1000007 setlo r4,#7
FFFFFFFFFFFFCA34 edtmem1:
FFFFFFFFFFFFCA34 31FFF280 call ignBlanks
FFFFFFFFFFFFCA38 31FFF2D4 call GetHexNumber
FFFFFFFFFFFFCA3C 60508000 sb r1,[r5]
FFFFFFFFFFFFCA40 0A528001 addui r5,r5,#1
FFFFFFFFFFFFCA44 BE027F8F loop r4,edtmem1
FFFFFFFFFFFFCA48 33FFF20A jmp Monitor
;------------------------------------------------------------------------------
; Execute code at the specified address.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFCA4C ExecuteCode:
FFFFFFFFFFFFCA4C 31FFF280 call ignBlanks
FFFFFFFFFFFFCA50 31FFF2D4 call GetHexNumber
FFFFFFFFFFFFCA54 341F8000 jal r31,[r1]
FFFFFFFFFFFFCA58 33FFF20A jmp Monitor
FFFFFFFFFFFFCA5C LoadSector:
FFFFFFFFFFFFCA5C 31FFF280 call ignBlanks
FFFFFFFFFFFFCA60 31FFF2D4 call GetHexNumber
FFFFFFFFFFFFCA64 16013800 lw r2,#0x3800
FFFFFFFFFFFFCA68 31FFF56D call spi_read_sector
FFFFFFFFFFFFCA6C 33FFF20A jmp Monitor
;------------------------------------------------------------------------------
; Do a memory dump of the requested location.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFCA70 DumpMem:
FFFFFFFFFFFFCA70 82308000 inch r1,[r3]
FFFFFFFFFFFFCA74 0A318002 addui r3,r3,#2
FFFFFFFFFFFFCA78 31FFF06B call ScreenToAscii
FFFFFFFFFFFFCA7C 02130009 mov r6,r1 ; r6 = fill type character
FFFFFFFFFFFFCA80 31FFF280 call ignBlanks
FFFFFFFFFFFFCA84 31FFF2D4 call GetHexNumber ; get start address of dump
FFFFFFFFFFFFCA88 02110009 mov r2,r1
FFFFFFFFFFFFCA8C 31FFF280 call ignBlanks
FFFFFFFFFFFFCA90 31FFF2D4 call GetHexNumber ; get number of bytes to dump
FFFFFFFFFFFFCA94 06108601 shrui r1,r1,#3 ; 1/8 as many dump rows
FFFFFFFFFFFFCA98 B2100200 bnei r1,#0,Dumpmem2
FFFFFFFFFFFFCA9C 16008001 lw r1,#1 ; dump at least one row
FFFFFFFFFFFFCAA0 Dumpmem2:
FFFFFFFFFFFFCAA0 31FFF135 call CRLF
FFFFFFFFFFFFCAA4 B0600857 beqi r6,#'W',DumpmemW
; beqi r6,#'H',DumpmemH
FFFFFFFFFFFFCAA8 B0600443 beqi r6,#'C',DumpmemC
FFFFFFFFFFFFCAAC DumpmemB:
FFFFFFFFFFFFCAAC 31FFF175 call DisplayMemB
FFFFFFFFFFFFCAB0 BE00FFEF loop r1,DumpmemB
FFFFFFFFFFFFCAB4 33FFF20A jmp Monitor
FFFFFFFFFFFFCAB8 DumpmemC:
FFFFFFFFFFFFCAB8 31FFF189 call DisplayMemC
FFFFFFFFFFFFCABC BE00FFEF loop r1,DumpmemC
FFFFFFFFFFFFCAC0 33FFF20A jmp Monitor
FFFFFFFFFFFFCAC4 DumpmemW:
FFFFFFFFFFFFCAC4 31FFF19D call DisplayMemW
FFFFFFFFFFFFCAC8 BE00FFEF loop r1,DumpmemW
FFFFFFFFFFFFCACC 33FFF20A jmp Monitor
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
FFFFFFFFFFFFCAD0 BE006ACA bra Monitor
FFFFFFFFFFFFCAD4 Fillmem:
FFFFFFFFFFFFCAD4 82308000 inch r1,[r3]
FFFFFFFFFFFFCAD8 0A318002 addui r3,r3,#2
FFFFFFFFFFFFCADC 31FFF06B call ScreenToAscii
FFFFFFFFFFFFCAE0 02130009 mov r6,r1 ; r6 = fill type character
FFFFFFFFFFFFCAE4 31FFF280 call ignBlanks
FFFFFFFFFFFFCAE8 31FFF2D4 call GetHexNumber ; get start address of dump
FFFFFFFFFFFFCAEC 02110009 mov r2,r1
FFFFFFFFFFFFCAF0 31FFF280 call ignBlanks
FFFFFFFFFFFFCAF4 31FFF2D4 call GetHexNumber ; get number of bytes to fill
FFFFFFFFFFFFCAF8 02128009 mov r5,r1
FFFFFFFFFFFFCAFC 31FFF280 call ignBlanks
FFFFFFFFFFFFCB00 31FFF2D4 call GetHexNumber ; get the fill byte
FFFFFFFFFFFFCB04 B0600743 beqi r6,#'C',FillmemC
FFFFFFFFFFFFCB08 B0600A48 beqi r6,#'H',FillmemH
FFFFFFFFFFFFCB0C B0600D57 beqi r6,#'W',FillmemW
FFFFFFFFFFFFCB10 FillmemB:
FFFFFFFFFFFFCB10 60208000 sb r1,[r2]
FFFFFFFFFFFFCB14 0A210001 addui r2,r2,#1
FFFFFFFFFFFFCB18 BE02FFCF loop r5,FillmemB
FFFFFFFFFFFFCB1C 33FFF20A jmp Monitor
FFFFFFFFFFFFCB20 FillmemC:
FFFFFFFFFFFFCB20 62208000 sc r1,[r2]
FFFFFFFFFFFFCB24 0A210002 addui r2,r2,#2
FFFFFFFFFFFFCB28 BE02FFCF loop r5,FillmemC
FFFFFFFFFFFFCB2C 33FFF20A jmp Monitor
FFFFFFFFFFFFCB30 FillmemH:
FFFFFFFFFFFFCB30 64208000 sh r1,[r2]
FFFFFFFFFFFFCB34 0A210004 addui r2,r2,#4
FFFFFFFFFFFFCB38 BE02FFCF loop r5,FillmemH
FFFFFFFFFFFFCB3C 33FFF20A jmp Monitor
FFFFFFFFFFFFCB40 FillmemW:
FFFFFFFFFFFFCB40 66208000 sw r1,[r2]
FFFFFFFFFFFFCB44 0A210008 addui r2,r2,#8
FFFFFFFFFFFFCB48 BE02FFCF loop r5,FillmemW
FFFFFFFFFFFFCB4C 33FFF20A jmp Monitor
;------------------------------------------------------------------------------
; Get a hexidecimal number. Maximum of sixteen digits.
; R3 = text pointer (updated)
; R1 = hex number
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFCB50 GetHexNumber:
FFFFFFFFFFFFCB50 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFCB54 67E10000 sw r2,[sp]
FFFFFFFFFFFFCB58 67E20008 sw r4,8[sp]
FFFFFFFFFFFFCB5C 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFCB60 E0800000 setlo r2,#0
FFFFFFFFFFFFCB64 E100000F setlo r4,#15
FFFFFFFFFFFFCB68 gthxn2:
FFFFFFFFFFFFCB68 82308000 inch r1,[r3]
FFFFFFFFFFFFCB6C 0A318002 addui r3,r3,#2
FFFFFFFFFFFFCB70 31FFF06B call ScreenToAscii
FFFFFFFFFFFFCB74 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCB78 B01005FF beqi r1,#-1,gthxn1
FFFFFFFFFFFFCB7C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCB80 1410800F andi r1,r1,#0x0f
FFFFFFFFFFFFCB84 04208809 or r2,r2,r1
FFFFFFFFFFFFCB88 BE027F0F loop r4,gthxn2
FFFFFFFFFFFFCB8C gthxn1:
FFFFFFFFFFFFCB8C 02208009 mov r1,r2
FFFFFFFFFFFFCB90 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFCB94 47E20008 lw r4,8[sp]
FFFFFFFFFFFFCB98 47E10000 lw r2,[sp]
FFFFFFFFFFFFCB9C 37EF8018 ret #24
;------------------------------------------------------------------------------
; Convert ASCII character in the range '0' to '9', 'a' to 'f' or 'A' to 'F'
; to a hex nybble.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFCBA0 AsciiToHexNybble:
FFFFFFFFFFFFCBA0 A8100E30 bltui r1,#'0',gthx3
FFFFFFFFFFFFCBA4 AE100339 bgtui r1,#'9',gthx5
FFFFFFFFFFFFCBA8 0E108030 subui r1,r1,#'0'
FFFFFFFFFFFFCBAC 37EF8000 ret
FFFFFFFFFFFFCBB0 gthx5:
FFFFFFFFFFFFCBB0 A8100A41 bltui r1,#'A',gthx3
FFFFFFFFFFFFCBB4 AE100446 bgtui r1,#'F',gthx6
FFFFFFFFFFFFCBB8 0E108041 subui r1,r1,#'A'
FFFFFFFFFFFFCBBC 0A10800A addui r1,r1,#10
FFFFFFFFFFFFCBC0 37EF8000 ret
FFFFFFFFFFFFCBC4 gthx6:
FFFFFFFFFFFFCBC4 A8100561 bltui r1,#'a',gthx3
FFFFFFFFFFFFCBC8 AE100466 bgtui r1,#'f',gthx3
FFFFFFFFFFFFCBCC 0E108061 subui r1,r1,#'a'
FFFFFFFFFFFFCBD0 0A10800A addui r1,r1,#10
FFFFFFFFFFFFCBD4 37EF8000 ret
FFFFFFFFFFFFCBD8 gthx3:
FFFFFFFFFFFFCBD8 E07FFFFF setlo r1,#-1 ; not a hex number
FFFFFFFFFFFFCBDC 37EF8000 ret
;==============================================================================
; Load an S19 format file
;==============================================================================
;
FFFFFFFFFFFFCBE0 LoadS19:
FFFFFFFFFFFFCBE0 BE00006A bra ProcessRec
FFFFFFFFFFFFCBE4 NextRec:
FFFFFFFFFFFFCBE4 31FFF36A call sGetChar
FFFFFFFFFFFFCBE8 B21FFF0A bne r1,#LF,NextRec
FFFFFFFFFFFFCBEC ProcessRec:
FFFFFFFFFFFFCBEC 31FFF36A call sGetChar
FFFFFFFFFFFFCBF0 B01F0E1A beqi r1,#26,Monitor ; CTRL-Z ?
FFFFFFFFFFFFCBF4 B21FFC53 bnei r1,#'S',NextRec
FFFFFFFFFFFFCBF8 31FFF36A call sGetChar
FFFFFFFFFFFFCBFC A01FFA30 blt r1,#'0',NextRec
FFFFFFFFFFFFCC00 A61FF939 bgt r1,#'9',NextRec
FFFFFFFFFFFFCC04 04101009 or r4,r1,r0 ; r4 = record type
FFFFFFFFFFFFCC08 31FFF36A call sGetChar
FFFFFFFFFFFFCC0C 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC10 04100809 or r2,r1,r0
FFFFFFFFFFFFCC14 31FFF36A call sGetChar
FFFFFFFFFFFFCC18 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC1C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC20 04208809 or r2,r2,r1 ; r2 = byte count
FFFFFFFFFFFFCC24 04208C09 or r3,r2,r1 ; r3 = byte count
FFFFFFFFFFFFCC28 B04FEF30 beqi r4,#'0',NextRec ; manufacturer ID record, ignore
FFFFFFFFFFFFCC2C B0401E31 beqi r4,#'1',ProcessS1
FFFFFFFFFFFFCC30 B0401F32 beqi r4,#'2',ProcessS2
FFFFFFFFFFFFCC34 B0402033 beqi r4,#'3',ProcessS3
FFFFFFFFFFFFCC38 B04FEB35 beqi r4,#'5',NextRec ; record count record, ignore
FFFFFFFFFFFFCC3C B0402037 beqi r4,#'7',ProcessS7
FFFFFFFFFFFFCC40 B0402238 beqi r4,#'8',ProcessS8
FFFFFFFFFFFFCC44 B0402439 beqi r4,#'9',ProcessS9
FFFFFFFFFFFFCC48 BE007CEA bra NextRec
FFFFFFFFFFFFCC4C pcssxa:
FFFFFFFFFFFFCC4C 143180FF andi r3,r3,#0xff
FFFFFFFFFFFFCC50 0E318001 subui r3,r3,#1 ; one less for loop
FFFFFFFFFFFFCC54 pcss1a:
FFFFFFFFFFFFCC54 31FFF36A call sGetChar
FFFFFFFFFFFFCC58 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC5C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC60 04208809 or r2,r2,r1
FFFFFFFFFFFFCC64 31FFF36A call sGetChar
FFFFFFFFFFFFCC68 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC6C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC70 04208809 or r2,r2,r1
FFFFFFFFFFFFCC74 60510000 sb r2,[r5]
FFFFFFFFFFFFCC78 0A528001 addui r5,r5,#1
FFFFFFFFFFFFCC7C BE01FECF loop r3,pcss1a
; Get the checksum byte
FFFFFFFFFFFFCC80 31FFF36A call sGetChar
FFFFFFFFFFFFCC84 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC88 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC8C 04208809 or r2,r2,r1
FFFFFFFFFFFFCC90 31FFF36A call sGetChar
FFFFFFFFFFFFCC94 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC98 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC9C 04208809 or r2,r2,r1
FFFFFFFFFFFFCCA0 BE007A2A bra NextRec
FFFFFFFFFFFFCCA4 ProcessS1:
FFFFFFFFFFFFCCA4 31FFF338 call S19Get16BitAddress
FFFFFFFFFFFFCCA8 BE007D2A bra pcssxa
FFFFFFFFFFFFCCAC ProcessS2:
FFFFFFFFFFFFCCAC 31FFF33E call S19Get24BitAddress
FFFFFFFFFFFFCCB0 BE007CEA bra pcssxa
FFFFFFFFFFFFCCB4 ProcessS3:
FFFFFFFFFFFFCCB4 31FFF344 call S19Get32BitAddress
FFFFFFFFFFFFCCB8 BE007CAA bra pcssxa
FFFFFFFFFFFFCCBC ProcessS7:
FFFFFFFFFFFFCCBC 31FFF344 call S19Get32BitAddress
FFFFFFFFFFFFCCC0 66028000 sw r5,S19StartAddress
FFFFFFFFFFFFCCC4 BE005B2A bra Monitor
FFFFFFFFFFFFCCC8 ProcessS8:
FFFFFFFFFFFFCCC8 31FFF33E call S19Get24BitAddress
FFFFFFFFFFFFCCCC 66028000 sw r5,S19StartAddress
FFFFFFFFFFFFCCD0 BE005ACA bra Monitor
FFFFFFFFFFFFCCD4 ProcessS9:
FFFFFFFFFFFFCCD4 31FFF338 call S19Get16BitAddress
FFFFFFFFFFFFCCD8 66028000 sw r5,S19StartAddress
FFFFFFFFFFFFCCDC 33FFF20A jmp Monitor
FFFFFFFFFFFFCCE0 S19Get16BitAddress:
FFFFFFFFFFFFCCE0 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCCE4 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCCE8 31FFF36A call sGetChar
FFFFFFFFFFFFCCEC 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCCF0 04100809 or r2,r1,r0
FFFFFFFFFFFFCCF4 BE00038A bra S1932b
FFFFFFFFFFFFCCF8 S19Get24BitAddress:
FFFFFFFFFFFFCCF8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCCFC 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCD00 31FFF36A call sGetChar
FFFFFFFFFFFFCD04 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD08 04100809 or r2,r1,r0
FFFFFFFFFFFFCD0C BE0001CA bra S1932a
FFFFFFFFFFFFCD10 S19Get32BitAddress:
FFFFFFFFFFFFCD10 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCD14 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCD18 31FFF36A call sGetChar
FFFFFFFFFFFFCD1C 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD20 04100809 or r2,r1,r0
FFFFFFFFFFFFCD24 31FFF36A call sGetChar
FFFFFFFFFFFFCD28 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD2C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD30 04110809 or r2,r1,r2
FFFFFFFFFFFFCD34 31FFF36A call sGetChar
FFFFFFFFFFFFCD38 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD3C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD40 04208809 or r2,r2,r1
FFFFFFFFFFFFCD44 S1932a:
FFFFFFFFFFFFCD44 31FFF36A call sGetChar
FFFFFFFFFFFFCD48 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD4C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD50 04208809 or r2,r2,r1
FFFFFFFFFFFFCD54 31FFF36A call sGetChar
FFFFFFFFFFFFCD58 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD5C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD60 04208809 or r2,r2,r1
FFFFFFFFFFFFCD64 S1932b:
FFFFFFFFFFFFCD64 31FFF36A call sGetChar
FFFFFFFFFFFFCD68 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD6C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD70 04208809 or r2,r2,r1
FFFFFFFFFFFFCD74 31FFF36A call sGetChar
FFFFFFFFFFFFCD78 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD7C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD80 04208809 or r2,r2,r1
FFFFFFFFFFFFCD84 31FFF36A call sGetChar
FFFFFFFFFFFFCD88 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD8C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD90 04208809 or r2,r2,r1
FFFFFFFFFFFFCD94 0442100A xor r4,r4,r4
FFFFFFFFFFFFCD98 04201409 or r5,r2,r0
FFFFFFFFFFFFCD9C 47EF8000 lw r31,[sp]
FFFFFFFFFFFFCDA0 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFCDA4 37EF8000 ret
;------------------------------------------------------------------------------
; Get a character from auxillary input, checking the keyboard status for a
; CTRL-C
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFCDA8 sGetChar:
FFFFFFFFFFFFCDA8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCDAC 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCDB0 sgc2:
FFFFFFFFFFFFCDB0 31FFEF1C call KeybdCheckForKey
FFFFFFFFFFFFCDB4 BE103C08 beq r1,r0,sgc1
FFFFFFFFFFFFCDB8 31FFEF07 call KeybdGetchar
FFFFFFFFFFFFCDBC B01E9B00 beqi r1,#CRTLC,Monitor
FFFFFFFFFFFFCDC0 sgc1:
FFFFFFFFFFFFCDC0 31FFFD9D call AUXIN
FFFFFFFFFFFFCDC4 BE107F62 ble r1,r0,sgc2
FFFFFFFFFFFFCDC8 47EF8000 lw r31,[sp]
FFFFFFFFFFFFCDCC 37EF8008 ret #8
;--------------------------------------------------------------------------
; Draw random lines on the bitmap screen.
;--------------------------------------------------------------------------
;
FFFFFFFFFFFFCDD0 RandomLines:
FFFFFFFFFFFFCDD0 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFCDD4 67E08000 sw r1,[sp]
FFFFFFFFFFFFCDD8 67E18008 sw r3,8[sp]
FFFFFFFFFFFFCDDC 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFCDE0 660020E8 sw r0,ctx3start ; prevent restarting context over and over again
FFFFFFFFFFFFCDE4 rl5:
FFFFFFFFFFFFCDE4 00000050 gran
FFFFFFFFFFFFCDE8 020088A8 mfspr r1,rand ; select a random color
FFFFFFFFFFFFCDEC E69AE000 ; SETLO
FFFFFFFFFFFFCDF0 EE800003 ; SETMID
FFFFFFFFFFFFCDF4 6A0D042A outh r1,GACCEL
FFFFFFFFFFFFCDF8 rl1: ; random X0
FFFFFFFFFFFFCDF8 00000050 gran
FFFFFFFFFFFFCDFC 020088A8 mfspr r1,rand
FFFFFFFFFFFFCE00 16018554 lw r3,#1364
FFFFFFFFFFFFCE04 0411841C modu r1,r1,r3
FFFFFFFFFFFFCE08 E69AE008 ; SETLO
FFFFFFFFFFFFCE0C EE800003 ; SETMID
FFFFFFFFFFFFCE10 6A0D042A outh r1,GACCEL+8
FFFFFFFFFFFFCE14 rl2: ; random X1
FFFFFFFFFFFFCE14 00000050 gran
FFFFFFFFFFFFCE18 020088A8 mfspr r1,rand
FFFFFFFFFFFFCE1C 16018554 lw r3,#1364
FFFFFFFFFFFFCE20 0411841C modu r1,r1,r3
FFFFFFFFFFFFCE24 E69AE010 ; SETLO
FFFFFFFFFFFFCE28 EE800003 ; SETMID
FFFFFFFFFFFFCE2C 6A0D042A outh r1,GACCEL+16
FFFFFFFFFFFFCE30 rl3: ; random Y0
FFFFFFFFFFFFCE30 00000050 gran
FFFFFFFFFFFFCE34 020088A8 mfspr r1,rand
FFFFFFFFFFFFCE38 16018300 lw r3,#768
FFFFFFFFFFFFCE3C 0411841C modu r1,r1,r3
FFFFFFFFFFFFCE40 E69AE00C ; SETLO
FFFFFFFFFFFFCE44 EE800003 ; SETMID
FFFFFFFFFFFFCE48 6A0D042A outh r1,GACCEL+12
FFFFFFFFFFFFCE4C rl4: ; random Y1
FFFFFFFFFFFFCE4C 00000050 gran
FFFFFFFFFFFFCE50 020088A8 mfspr r1,rand
FFFFFFFFFFFFCE54 16018300 lw r3,#768
FFFFFFFFFFFFCE58 0411841C modu r1,r1,r3
FFFFFFFFFFFFCE5C E69AE014 ; SETLO
FFFFFFFFFFFFCE60 EE800003 ; SETMID
FFFFFFFFFFFFCE64 6A0D042A outh r1,GACCEL+20
FFFFFFFFFFFFCE68 E0400002 setlo r1,#2 ; draw line command
FFFFFFFFFFFFCE6C E69AE03C ; SETLO
FFFFFFFFFFFFCE70 EE800003 ; SETMID
FFFFFFFFFFFFCE74 6A0D042A outh r1,GACCEL+60
FFFFFFFFFFFFCE78 rl8:
; call KeybdGetChar
; beqi r1,#CTRLC,rl7
FFFFFFFFFFFFCE78 E69AE038 ; SETLO
FFFFFFFFFFFFCE7C EE800003 ; SETMID
FFFFFFFFFFFFCE80 6A0D0421 inch r1,GACCEL+56 ; ensure controller is in IDLE state
FFFFFFFFFFFFCE84 BE107FA9 bne r1,r0,rl8
FFFFFFFFFFFFCE88 BE007AEA bra rl5
FFFFFFFFFFFFCE8C rl7:
FFFFFFFFFFFFCE8C 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFCE90 47E18008 lw r3,8[sp]
FFFFFFFFFFFFCE94 47E08000 lw r1,[sp]
FFFFFFFFFFFFCE98 37EF8018 ret #24
;--------------------------------------------------------------------------
; Initialize sprite image caches with random data.
;--------------------------------------------------------------------------
FFFFFFFFFFFFCE9C RandomizeSprram:
FFFFFFFFFFFFCE9C E6980000 ; SETLO
FFFFFFFFFFFFCEA0 EE800003 ; SETMID
FFFFFFFFFFFFCEA4 6A0D082D lea r2,SPRRAM
FFFFFFFFFFFFCEA8 E10037FF setlo r4,#14335 ; number of chars to initialize
FFFFFFFFFFFFCEAC rsr1:
FFFFFFFFFFFFCEAC 00000050 gran
FFFFFFFFFFFFCEB0 020088A8 mfspr r1,rand
FFFFFFFFFFFFCEB4 92208000 outc r1,[r2]
FFFFFFFFFFFFCEB8 0A210002 addui r2,r2,#2
FFFFFFFFFFFFCEBC BE027F8F loop r4,rsr1
FFFFFFFFFFFFCEC0 37EF8000 ret
;--------------------------------------------------------------------------
; Setup the AC97/LM4550 audio controller. Check keyboard for a CTRL-C
; interrupt which may be necessary if the audio controller isn't
; responding.
;--------------------------------------------------------------------------
;
FFFFFFFFFFFFCEC4 SetupAC97:
FFFFFFFFFFFFCEC4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFCEC8 67E08000 sw r1,[sp]
FFFFFFFFFFFFCECC 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFCED0 sac974:
FFFFFFFFFFFFCED0 E69C1026 ; SETLO
FFFFFFFFFFFFCED4 EE800003 ; SETMID
FFFFFFFFFFFFCED8 6A0D0029 outc r0,AC97+0x26 ; trigger a read of register 26 (status reg)
FFFFFFFFFFFFCEDC sac971: ; wait for status to register 0xF (all ready)
FFFFFFFFFFFFCEDC 31FFEF07 call KeybdGetChar ; see if we needed to CTRL-C
FFFFFFFFFFFFCEE0 B0100A03 beqi r1,#CTRLC,sac973
FFFFFFFFFFFFCEE4 E69C1068 ; SETLO
FFFFFFFFFFFFCEE8 EE800003 ; SETMID
FFFFFFFFFFFFCEEC 6A0D0421 inch r1,AC97+0x68 ; wait for dirty bit to clear
FFFFFFFFFFFFCEF0 BE107F69 bne r1,r0,sac971
FFFFFFFFFFFFCEF4 E69C1026 ; SETLO
FFFFFFFFFFFFCEF8 EE800003 ; SETMID
FFFFFFFFFFFFCEFC 6A0D0421 inch r1,AC97+0x26 ; check status at reg h26, wait for
FFFFFFFFFFFFCF00 1410800F andi r1,r1,#0x0F ; analogue to be ready
FFFFFFFFFFFFCF04 B21FF30F bnei r1,#0x0F,sac974
FFFFFFFFFFFFCF08 sac973:
FFFFFFFFFFFFCF08 E69C1002 ; SETLO
FFFFFFFFFFFFCF0C EE800003 ; SETMID
FFFFFFFFFFFFCF10 6A0D0029 outc r0,AC97+2 ; master volume, 0db attenuation, mute off
FFFFFFFFFFFFCF14 E69C1004 ; SETLO
FFFFFFFFFFFFCF18 EE800003 ; SETMID
FFFFFFFFFFFFCF1C 6A0D0029 outc r0,AC97+4 ; headphone volume, 0db attenuation, mute off
FFFFFFFFFFFFCF20 E69C1018 ; SETLO
FFFFFFFFFFFFCF24 EE800003 ; SETMID
FFFFFFFFFFFFCF28 6A0D0029 outc r0,AC97+0x18 ; PCM gain (mixer) mute off, no attenuation
FFFFFFFFFFFFCF2C E69C100A ; SETLO
FFFFFFFFFFFFCF30 EE800003 ; SETMID
FFFFFFFFFFFFCF34 6A0D0029 outc r0,AC97+0x0A ; mute PC beep
FFFFFFFFFFFFCF38 E07F8000 setlo r1,#0x8000 ; bypass 3D sound
FFFFFFFFFFFFCF3C E69C1020 ; SETLO
FFFFFFFFFFFFCF40 EE800003 ; SETMID
FFFFFFFFFFFFCF44 6A0D0429 outc r1,AC97+0x20
FFFFFFFFFFFFCF48 sac972:
FFFFFFFFFFFFCF48 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFCF4C B0100503 beqi r1,#CTRLC,sac975
FFFFFFFFFFFFCF50 E69C1068 ; SETLO
FFFFFFFFFFFFCF54 EE800003 ; SETMID
FFFFFFFFFFFFCF58 6A0D0421 inch r1,AC97+0x68 ; wait for dirty bits to clear
FFFFFFFFFFFFCF5C BE107F69 bne r1,r0,sac972 ; wait a while for the settings to take effect
FFFFFFFFFFFFCF60 sac975:
FFFFFFFFFFFFCF60 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFCF64 47E08000 lw r1,[sp]
FFFFFFFFFFFFCF68 37EF8010 ret #16
;--------------------------------------------------------------------------
; Sound a 800 Hz beep
;--------------------------------------------------------------------------
;
FFFFFFFFFFFFCF6C Beep:
FFFFFFFFFFFFCF6C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFCF70 67E08000 sw r1,[sp]
FFFFFFFFFFFFCF74 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFCF78 E0400008 setlo r1,#8
FFFFFFFFFFFFCF7C E69C0600 ; SETLO
FFFFFFFFFFFFCF80 EE800003 ; SETMID
FFFFFFFFFFFFCF84 6A0D0428 outb r1,LED
FFFFFFFFFFFFCF88 1600800F ori r1,r0,#15 ; master volume to max
FFFFFFFFFFFFCF8C E6950080 ; SETLO
FFFFFFFFFFFFCF90 EE800003 ; SETMID
FFFFFFFFFFFFCF94 6A0D0429 outc r1,PSG+128
FFFFFFFFFFFFCF98 1600B46E ori r1,r0,#13422 ; 800Hz
FFFFFFFFFFFFCF9C E6950000 ; SETLO
FFFFFFFFFFFFCFA0 EE800003 ; SETMID
FFFFFFFFFFFFCFA4 6A0D0429 outc r1,PSGFREQ0
FFFFFFFFFFFFCFA8 E0400009 setlo r1,#9
FFFFFFFFFFFFCFAC E69C0600 ; SETLO
FFFFFFFFFFFFCFB0 EE800003 ; SETMID
FFFFFFFFFFFFCFB4 6A0D0428 outb r1,LED
; decay (16.384 ms)2
; attack (8.192 ms)1
; release (1.024 s)A
; sustain level C
FFFFFFFFFFFFCFB8 E07FCA12 setlo r1,#0xCA12
FFFFFFFFFFFFCFBC E6950006 ; SETLO
FFFFFFFFFFFFCFC0 EE800003 ; SETMID
FFFFFFFFFFFFCFC4 6A0D0429 outc r1,PSGADSR0
FFFFFFFFFFFFCFC8 16009104 ori r1,r0,#0x1104 ; gate, output enable, triangle waveform
FFFFFFFFFFFFCFCC E6950004 ; SETLO
FFFFFFFFFFFFCFD0 EE800003 ; SETMID
FFFFFFFFFFFFCFD4 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFCFD8 E6A625A0 ; SETLO
FFFFFFFFFFFFCFDC EE800000 ; SETMID
FFFFFFFFFFFFCFE0 040D0409 ori r1,r0,#2500000 ; delay about 1s
FFFFFFFFFFFFCFE4 beep1:
FFFFFFFFFFFFCFE4 BE00800F loop r1,beep1
FFFFFFFFFFFFCFE8 E040000D setlo r1,#13
FFFFFFFFFFFFCFEC E69C0600 ; SETLO
FFFFFFFFFFFFCFF0 EE800003 ; SETMID
FFFFFFFFFFFFCFF4 6A0D0428 outb r1,LED
FFFFFFFFFFFFCFF8 16008104 ori r1,r0,#0x0104 ; gate off, output enable, triangle waveform
FFFFFFFFFFFFCFFC E6950004 ; SETLO
FFFFFFFFFFFFD000 EE800003 ; SETMID
FFFFFFFFFFFFD004 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD008 E6A625A0 ; SETLO
FFFFFFFFFFFFD00C EE800000 ; SETMID
FFFFFFFFFFFFD010 040D0409 ori r1,r0,#2500000 ; delay about 1s
FFFFFFFFFFFFD014 beep2:
FFFFFFFFFFFFD014 BE00800F loop r1,beep2
FFFFFFFFFFFFD018 E0400010 setlo r1,#16
FFFFFFFFFFFFD01C E69C0600 ; SETLO
FFFFFFFFFFFFD020 EE800003 ; SETMID
FFFFFFFFFFFFD024 6A0D0428 outb r1,LED
FFFFFFFFFFFFD028 16008000 ori r1,r0,#0x0000 ; gate off, output enable off, no waveform
FFFFFFFFFFFFD02C E6950004 ; SETLO
FFFFFFFFFFFFD030 EE800003 ; SETMID
FFFFFFFFFFFFD034 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD038 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFD03C 47E08000 lw r1,[sp]
FFFFFFFFFFFFD040 37EF8010 ret #16
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;
FFFFFFFFFFFFD044 Piano:
FFFFFFFFFFFFD044 1600800F ori r1,r0,#15 ; master volume to max
FFFFFFFFFFFFD048 E6950080 ; SETLO
FFFFFFFFFFFFD04C EE800003 ; SETMID
FFFFFFFFFFFFD050 6A0D0429 outc r1,PSG+128
FFFFFFFFFFFFD054 playnt:
FFFFFFFFFFFFD054 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFD058 B01DF403 beqi r1,#CTRLC,Monitor
FFFFFFFFFFFFD05C B0100861 beqi r1,#'a',playnt1a
FFFFFFFFFFFFD060 B0100A62 beqi r1,#'b',playnt1b
FFFFFFFFFFFFD064 B0100C63 beqi r1,#'c',playnt1c
FFFFFFFFFFFFD068 B0100E64 beqi r1,#'d',playnt1d
FFFFFFFFFFFFD06C B0101065 beqi r1,#'e',playnt1e
FFFFFFFFFFFFD070 B0101266 beqi r1,#'f',playnt1f
FFFFFFFFFFFFD074 B0101467 beqi r1,#'g',playnt1g
FFFFFFFFFFFFD078 BE007EEA bra playnt
FFFFFFFFFFFFD07C playnt1a:
FFFFFFFFFFFFD07C E0401C31 setlo r1,#7217
FFFFFFFFFFFFD080 31FFF434 call Tone
FFFFFFFFFFFFD084 BE007E8A bra playnt
FFFFFFFFFFFFD088 playnt1b:
FFFFFFFFFFFFD088 E0401FA5 setlo r1,#8101
FFFFFFFFFFFFD08C 31FFF434 call Tone
FFFFFFFFFFFFD090 BE007E2A bra playnt
FFFFFFFFFFFFD094 playnt1c:
FFFFFFFFFFFFD094 E04010C3 setlo r1,#4291
FFFFFFFFFFFFD098 31FFF434 call Tone
FFFFFFFFFFFFD09C BE007DCA bra playnt
FFFFFFFFFFFFD0A0 playnt1d:
FFFFFFFFFFFFD0A0 E04012D1 setlo r1,#4817
FFFFFFFFFFFFD0A4 31FFF434 call Tone
FFFFFFFFFFFFD0A8 BE007D6A bra playnt
FFFFFFFFFFFFD0AC playnt1e:
FFFFFFFFFFFFD0AC E040151F setlo r1,#5407
FFFFFFFFFFFFD0B0 31FFF434 call Tone
FFFFFFFFFFFFD0B4 BE007D0A bra playnt
FFFFFFFFFFFFD0B8 playnt1f:
FFFFFFFFFFFFD0B8 E0401660 setlo r1,#5728
FFFFFFFFFFFFD0BC 31FFF434 call Tone
FFFFFFFFFFFFD0C0 BE007CAA bra playnt
FFFFFFFFFFFFD0C4 playnt1g:
FFFFFFFFFFFFD0C4 E040191E setlo r1,#6430
FFFFFFFFFFFFD0C8 31FFF434 call Tone
FFFFFFFFFFFFD0CC BE007C4A bra playnt
FFFFFFFFFFFFD0D0 Tone:
FFFFFFFFFFFFD0D0 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD0D4 67E08000 sw r1,[sp]
FFFFFFFFFFFFD0D8 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFD0DC E6950000 ; SETLO
FFFFFFFFFFFFD0E0 EE800003 ; SETMID
FFFFFFFFFFFFD0E4 6A0D0429 outc r1,PSGFREQ0
; decay (16.384 ms)2
; attack (8.192 ms)1
; release (1.024 s)A
; sustain level C
FFFFFFFFFFFFD0E8 E07FCA12 setlo r1,#0xCA12
FFFFFFFFFFFFD0EC E6950006 ; SETLO
FFFFFFFFFFFFD0F0 EE800003 ; SETMID
FFFFFFFFFFFFD0F4 6A0D0429 outc r1,PSGADSR0
FFFFFFFFFFFFD0F8 16009104 ori r1,r0,#0x1104 ; gate, output enable, triangle waveform
FFFFFFFFFFFFD0FC E6950004 ; SETLO
FFFFFFFFFFFFD100 EE800003 ; SETMID
FFFFFFFFFFFFD104 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD108 E683D090 ; SETLO
FFFFFFFFFFFFD10C 040D0409 ori r1,r0,#250000 ; delay about 10ms
FFFFFFFFFFFFD110 tone1:
FFFFFFFFFFFFD110 BE00800F loop r1,tone1
FFFFFFFFFFFFD114 16008104 ori r1,r0,#0x0104 ; gate off, output enable, triangle waveform
FFFFFFFFFFFFD118 E6950004 ; SETLO
FFFFFFFFFFFFD11C EE800003 ; SETMID
FFFFFFFFFFFFD120 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD124 E683D090 ; SETLO
FFFFFFFFFFFFD128 040D0409 ori r1,r0,#250000 ; delay about 10ms
FFFFFFFFFFFFD12C tone2:
FFFFFFFFFFFFD12C BE00800F loop r1,tone2
FFFFFFFFFFFFD130 16008000 ori r1,r0,#0x0000 ; gate off, output enable off, no waveform
FFFFFFFFFFFFD134 E6950004 ; SETLO
FFFFFFFFFFFFD138 EE800003 ; SETMID
FFFFFFFFFFFFD13C 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD140 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFD144 47E08000 lw r1,[sp]
FFFFFFFFFFFFD148 37EF8010 ret #16
;==============================================================================
;==============================================================================
FFFFFFFFFFFFD14C SetupRasterIRQ:
FFFFFFFFFFFFD14C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD150 67E08000 sw r1,[sp]
FFFFFFFFFFFFD154 E04000C8 setlo r1,#200
FFFFFFFFFFFFD158 E69A0100 ; SETLO
FFFFFFFFFFFFD15C EE800003 ; SETMID
FFFFFFFFFFFFD160 6A0D0429 outc r1,RASTERIRQ
FFFFFFFFFFFFD164 E04000F0 setlo r1,#240
FFFFFFFFFFFFD168 E69A0102 ; SETLO
FFFFFFFFFFFFD16C EE800003 ; SETMID
FFFFFFFFFFFFD170 6A0D0429 outc r1,RASTERIRQ+2
FFFFFFFFFFFFD174 E0400118 setlo r1,#280
FFFFFFFFFFFFD178 E69A0104 ; SETLO
FFFFFFFFFFFFD17C EE800003 ; SETMID
FFFFFFFFFFFFD180 6A0D0429 outc r1,RASTERIRQ+4
FFFFFFFFFFFFD184 E0400140 setlo r1,#320
FFFFFFFFFFFFD188 E69A0106 ; SETLO
FFFFFFFFFFFFD18C EE800003 ; SETMID
FFFFFFFFFFFFD190 6A0D0429 outc r1,RASTERIRQ+6
FFFFFFFFFFFFD194 E0400168 setlo r1,#360
FFFFFFFFFFFFD198 E69A0108 ; SETLO
FFFFFFFFFFFFD19C EE800003 ; SETMID
FFFFFFFFFFFFD1A0 6A0D0429 outc r1,RASTERIRQ+8
FFFFFFFFFFFFD1A4 47E08000 lw r1,[sp]
FFFFFFFFFFFFD1A8 37EF8008 ret #8
FFFFFFFFFFFFD1AC RasterIRQfn:
FFFFFFFFFFFFD1AC E69A011E ; SETLO
FFFFFFFFFFFFD1B0 EE800003 ; SETMID
FFFFFFFFFFFFD1B4 6A0D0421 inch r1,RASTERIRQ+30 ; get the raster compare register # (clears IRQ)
FFFFFFFFFFFFD1B8 B0100901 beqi r1,#1,rirq1
FFFFFFFFFFFFD1BC B0100802 beqi r1,#2,rirq2
FFFFFFFFFFFFD1C0 B0100703 beqi r1,#3,rirq3
FFFFFFFFFFFFD1C4 B0100604 beqi r1,#4,rirq4
FFFFFFFFFFFFD1C8 B0100505 beqi r1,#5,rirq5
FFFFFFFFFFFFD1CC B0100406 beqi r1,#6,rirq6
FFFFFFFFFFFFD1D0 B0100307 beqi r1,#7,rirq7
FFFFFFFFFFFFD1D4 B0100208 beqi r1,#8,rirq8
FFFFFFFFFFFFD1D8 37EF8000 ret
FFFFFFFFFFFFD1DC rirq1:
FFFFFFFFFFFFD1DC rirq2:
FFFFFFFFFFFFD1DC rirq3:
FFFFFFFFFFFFD1DC rirq4:
FFFFFFFFFFFFD1DC rirq5:
FFFFFFFFFFFFD1DC rirq6:
FFFFFFFFFFFFD1DC rirq7:
FFFFFFFFFFFFD1DC rirq8:
FFFFFFFFFFFFD1DC 1A108028 mului r1,r1,#40
FFFFFFFFFFFFD1E0 0A1080CC addui r1,r1,#204
FFFFFFFFFFFFD1E4 E69AD002 ; SETLO
FFFFFFFFFFFFD1E8 EE800003 ; SETMID
FFFFFFFFFFFFD1EC 6A0D0429 outc r1,SPRITEREGS+2
FFFFFFFFFFFFD1F0 E69AD012 ; SETLO
FFFFFFFFFFFFD1F4 EE800003 ; SETMID
FFFFFFFFFFFFD1F8 6A0D0429 outc r1,SPRITEREGS+18
FFFFFFFFFFFFD1FC E69AD022 ; SETLO
FFFFFFFFFFFFD200 EE800003 ; SETMID
FFFFFFFFFFFFD204 6A0D0429 outc r1,SPRITEREGS+34
FFFFFFFFFFFFD208 E69AD032 ; SETLO
FFFFFFFFFFFFD20C EE800003 ; SETMID
FFFFFFFFFFFFD210 6A0D0429 outc r1,SPRITEREGS+50
FFFFFFFFFFFFD214 E69AD042 ; SETLO
FFFFFFFFFFFFD218 EE800003 ; SETMID
FFFFFFFFFFFFD21C 6A0D0429 outc r1,SPRITEREGS+66
FFFFFFFFFFFFD220 E69AD052 ; SETLO
FFFFFFFFFFFFD224 EE800003 ; SETMID
FFFFFFFFFFFFD228 6A0D0429 outc r1,SPRITEREGS+82
FFFFFFFFFFFFD22C E69AD062 ; SETLO
FFFFFFFFFFFFD230 EE800003 ; SETMID
FFFFFFFFFFFFD234 6A0D0429 outc r1,SPRITEREGS+98
FFFFFFFFFFFFD238 E69AD072 ; SETLO
FFFFFFFFFFFFD23C EE800003 ; SETMID
FFFFFFFFFFFFD240 6A0D0429 outc r1,SPRITEREGS+114
FFFFFFFFFFFFD244 37EF8000 ret
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
FFFFFFFFFFFFD248 DisplayDatetime:
FFFFFFFFFFFFD248 0FEF0030 subui sp,sp,#48
FFFFFFFFFFFFD24C 67E08000 sw r1,[sp]
FFFFFFFFFFFFD250 67E10008 sw r2,8[sp]
FFFFFFFFFFFFD254 67E18010 sw r3,16[sp]
FFFFFFFFFFFFD258 67E20018 sw r4,24[sp]
FFFFFFFFFFFFD25C 67E28020 sw r5,32[sp]
FFFFFFFFFFFFD260 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFD264 31FFEFF2 call CursorOff
FFFFFFFFFFFFD268 16008003 lw r1,#3 ; get cursor position
FFFFFFFFFFFFD26C 0181CD17 syscall #410
FFFFFFFFFFFFD270 02120009 mov r4,r1 ; r4 = row
FFFFFFFFFFFFD274 02228009 mov r5,r2 ; r5 = col
FFFFFFFFFFFFD278 16008002 lw r1,#2 ; set cursor position
FFFFFFFFFFFFD27C 1601002E lw r2,#46 ; move cursor down to last display line
FFFFFFFFFFFFD280 16018040 lw r3,#64
FFFFFFFFFFFFD284 0181CD17 syscall #410
FFFFFFFFFFFFD288 16008001 lw r1,#1 ; get the snapshotted date and time
FFFFFFFFFFFFD28C 0181D017 syscall #416
FFFFFFFFFFFFD290 31FFF169 call DisplayWord ; display on screen
FFFFFFFFFFFFD294 16008002 lw r1,#2 ; restore cursor position
FFFFFFFFFFFFD298 02410009 mov r2,r4 ; r2 = row
FFFFFFFFFFFFD29C 02518009 mov r3,r5 ; r3 = col
FFFFFFFFFFFFD2A0 0181CD17 syscall #410
FFFFFFFFFFFFD2A4 31FFEFF7 call CursorOn
FFFFFFFFFFFFD2A8 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFD2AC 47E18010 lw r3,16[sp]
FFFFFFFFFFFFD2B0 47E10008 lw r2,8[sp]
FFFFFFFFFFFFD2B4 47E08000 lw r1,[sp]
FFFFFFFFFFFFD2B8 47E20018 lw r4,24[sp]
FFFFFFFFFFFFD2BC 47E28020 lw r5,32[sp]
FFFFFFFFFFFFD2C0 37EF8030 ret #48
;==============================================================================
;==============================================================================
FFFFFFFFFFFFD2C4 InitializeGame:
FFFFFFFFFFFFD2C4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD2C8 27F40000004 sm [sp],r3/lr
FFFFFFFFFFFFD2CC E0C00140 setlo r3,#320
FFFFFFFFFFFFD2D0 62019508 sc r3,Manpos
FFFFFFFFFFFFD2D4 62001500 sc r0,Score
FFFFFFFFFFFFD2D8 60001510 sb r0,MissileActive
FFFFFFFFFFFFD2DC 62001512 sc r0,MissileX
FFFFFFFFFFFFD2E0 62001514 sc r0,MissileY
FFFFFFFFFFFFD2E4 27740000004 lm [sp],r3/lr
FFFFFFFFFFFFD2E8 37EF8010 ret #16
FFFFFFFFFFFFD2EC DrawScore:
FFFFFFFFFFFFD2EC 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFD2F0 27F40000005 sm [sp],r1/r3/lr
FFFFFFFFFFFFD2F4 E0C00001 setlo r3,#1
FFFFFFFFFFFFD2F8 60019417 sb r3,CursorRow
FFFFFFFFFFFFD2FC E0C00028 setlo r3,#40
FFFFFFFFFFFFD300 60019418 sb r3,CursorCol
FFFFFFFFFFFFD304 40009500 lb r1,Score
FFFFFFFFFFFFD308 31FFF14B call DisplayByte
FFFFFFFFFFFFD30C 40009501 lb r1,Score+1
FFFFFFFFFFFFD310 31FFF14B call DisplayByte
FFFFFFFFFFFFD314 27740000005 lm [sp],r1/r3/lr
FFFFFFFFFFFFD318 37EF8018 ret #24
FFFFFFFFFFFFD31C DrawMissile:
FFFFFFFFFFFFD31C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD320 27F40000001 sm [sp],r1/lr
FFFFFFFFFFFFD324 42009514 lc r1,MissileY
FFFFFFFFFFFFD328 AC101402 bleu r1,#2,MissileOff
FFFFFFFFFFFFD32C 42009512 lc r1,MissileX
FFFFFFFFFFFFD330 06108601 shrui r1,r1,#3
FFFFFFFFFFFFD334 60009418 sb r1,CursorCol
FFFFFFFFFFFFD338 42009514 lc r1,MissileY
FFFFFFFFFFFFD33C 60009417 sb r1,CursorRow
FFFFFFFFFFFFD340 0E108001 subui r1,r1,#1
FFFFFFFFFFFFD344 62009514 sc r1,MissileY
FFFFFFFFFFFFD348 E040005E setlo r1,#'^'
FFFFFFFFFFFFD34C 31FFF07F call DisplayChar
FFFFFFFFFFFFD350 40009418 lb r1,CursorCol
FFFFFFFFFFFFD354 0E108001 subui r1,r1,#1
FFFFFFFFFFFFD358 60009418 sb r1,CursorCol
FFFFFFFFFFFFD35C 40009417 lb r1,CursorRow
FFFFFFFFFFFFD360 0E108001 subui r1,r1,#1
FFFFFFFFFFFFD364 60009417 sb r1,CursorRow
FFFFFFFFFFFFD368 E0400020 setlo r1,#' '
FFFFFFFFFFFFD36C 31FFF07F call DisplayChar
FFFFFFFFFFFFD370 27740000001 lm [sp],r1/lr
FFFFFFFFFFFFD374 37EF8010 ret #16
FFFFFFFFFFFFD378 MissileOff:
FFFFFFFFFFFFD378 60001510 sb r0,MissileActive
FFFFFFFFFFFFD37C 42009512 lc r1,MissileX
FFFFFFFFFFFFD380 06108601 shrui r1,r1,#3
FFFFFFFFFFFFD384 60009418 sb r1,CursorCol
FFFFFFFFFFFFD388 42009514 lc r1,MissileY
FFFFFFFFFFFFD38C 60009417 sb r1,CursorRow
FFFFFFFFFFFFD390 E0400020 setlo r1,#' '
FFFFFFFFFFFFD394 31FFF07F call DisplayChar
FFFFFFFFFFFFD398 27740000001 lm [sp],r1/lr
FFFFFFFFFFFFD39C 37EF8010 ret #16
FFFFFFFFFFFFD3A0 DrawMan:
FFFFFFFFFFFFD3A0 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFD3A4 27F40000005 sm [sp],r1/r3/lr
FFFFFFFFFFFFD3A8 E0C0002E setlo r3,#46
FFFFFFFFFFFFD3AC 60019417 sb r3,CursorRow
FFFFFFFFFFFFD3B0 42019508 lc r3,Manpos
FFFFFFFFFFFFD3B4 06318601 shrui r3,r3,#3
FFFFFFFFFFFFD3B8 60019418 sb r3,CursorCol
FFFFFFFFFFFFD3BC E0400020 setlo r1,#' '
FFFFFFFFFFFFD3C0 31FFF07F call DisplayChar
FFFFFFFFFFFFD3C4 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD3C8 31FFF07F call DisplayChar
FFFFFFFFFFFFD3CC E0400041 setlo r1,#'A'
FFFFFFFFFFFFD3D0 31FFF07F call DisplayChar
FFFFFFFFFFFFD3D4 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD3D8 31FFF07F call DisplayChar
FFFFFFFFFFFFD3DC E0400020 setlo r1,#' '
FFFFFFFFFFFFD3E0 31FFF07F call DisplayChar
FFFFFFFFFFFFD3E4 27740000005 lm [sp],r1/r3/lr
FFFFFFFFFFFFD3E8 37EF8018 ret #24
FFFFFFFFFFFFD3EC DrawInvader:
FFFFFFFFFFFFD3EC 46018000 lw r3,InvaderPos
FFFFFFFFFFFFD3F0 160080E9 lw r1,#233
FFFFFFFFFFFFD3F4 62308000 sc r1,[r3]
FFFFFFFFFFFFD3F8 160080F2 lw r1,#242
FFFFFFFFFFFFD3FC 62308001 sc r1,1[r3]
FFFFFFFFFFFFD400 160080DF lw r1,#223
FFFFFFFFFFFFD404 62308002 sc r1,2[r3]
FFFFFFFFFFFFD408 37EF8000 ret
FFFFFFFFFFFFD40C DrawInvaders:
FFFFFFFFFFFFD40C 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFD410 27F4000000F sm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFD414 42009520 lc r1,InvadersRow1
FFFFFFFFFFFFD418 42021570 lc r4,InvadersColpos
FFFFFFFFFFFFD41C 14110001 andi r2,r1,#1
FFFFFFFFFFFFD420 BE2003A8 beq r2,r0,dinv1
FFFFFFFFFFFFD424 40019571 lb r3,InvadersRowpos
FFFFFFFFFFFFD428 60019417 sb r3,CursorRow
FFFFFFFFFFFFD42C 60021418 sb r4,CursorCol
FFFFFFFFFFFFD430 E0400020 setlo r1,#' '
FFFFFFFFFFFFD434 31FFF14B call DisplayByte
FFFFFFFFFFFFD438 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD43C 31FFF14B call DisplayByte
FFFFFFFFFFFFD440 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD444 31FFF14B call DisplayByte
FFFFFFFFFFFFD448 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD44C 31FFF14B call DisplayByte
FFFFFFFFFFFFD450 E0400020 setlo r1,#' '
FFFFFFFFFFFFD454 31FFF14B call DisplayByte
FFFFFFFFFFFFD458 40009417 lb r1,CursorRow
FFFFFFFFFFFFD45C 0A108001 addui r1,r1,#1
FFFFFFFFFFFFD460 60009417 sb r1,CursorRow
FFFFFFFFFFFFD464 40009418 lb r1,CursorCol
FFFFFFFFFFFFD468 0E108005 subui r1,r1,#5
FFFFFFFFFFFFD46C E0400020 setlo r1,#' '
FFFFFFFFFFFFD470 31FFF14B call DisplayByte
FFFFFFFFFFFFD474 E0400058 setlo r1,#'X'
FFFFFFFFFFFFD478 31FFF14B call DisplayByte
FFFFFFFFFFFFD47C E0400020 setlo r1,#' '
FFFFFFFFFFFFD480 31FFF14B call DisplayByte
FFFFFFFFFFFFD484 E0400058 setlo r1,#'X'
FFFFFFFFFFFFD488 31FFF14B call DisplayByte
FFFFFFFFFFFFD48C E0400020 setlo r1,#' '
FFFFFFFFFFFFD490 31FFF14B call DisplayByte
FFFFFFFFFFFFD494 dinv1:
FFFFFFFFFFFFD494 2774000000F lm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFD498 37EF8028 ret #40
FFFFFFFFFFFFD49C DrawBombs:
FFFFFFFFFFFFD49C 37EF8000 ret
FFFFFFFFFFFFD4A0 Invaders:
FFFFFFFFFFFFD4A0 FFFFFFFFFFFF0000 subui sp,#240
FFFFFFFFFFFFD4A4 27F4000000F sm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFD4A8 31FFF4B1 call InitializeGame
FFFFFFFFFFFFD4AC InvadersLoop:
FFFFFFFFFFFFD4AC 31FFF4BB call DrawScore
FFFFFFFFFFFFD4B0 31FFF503 call DrawInvaders
FFFFFFFFFFFFD4B4 31FFF527 call DrawBombs
FFFFFFFFFFFFD4B8 31FFF4C7 call DrawMissile
FFFFFFFFFFFFD4BC 31FFF4E8 call DrawMan
FFFFFFFFFFFFD4C0 TestMoveMan:
FFFFFFFFFFFFD4C0 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFD4C4 B010046B beqi r1,#'k',MoveManRight
FFFFFFFFFFFFD4C8 B010096A beqi r1,#'j',MoveManLeft
FFFFFFFFFFFFD4CC B0100D20 beqi r1,#' ',FireMissile
FFFFFFFFFFFFD4D0 BE0002AA bra Invaders1
FFFFFFFFFFFFD4D4 MoveManRight:
FFFFFFFFFFFFD4D4 42011508 lc r2,Manpos
FFFFFFFFFFFFD4D8 E6800280 ; SETLO
FFFFFFFFFFFFD4DC BE2D0247 bgtu r2,#640,Invaders1
FFFFFFFFFFFFD4E0 0A210008 addui r2,r2,#8
FFFFFFFFFFFFD4E4 62011508 sc r2,Manpos
FFFFFFFFFFFFD4E8 BE0001EA bra Invaders1
FFFFFFFFFFFFD4EC MoveManLeft:
FFFFFFFFFFFFD4EC 42011508 lc r2,Manpos
FFFFFFFFFFFFD4F0 BE2001A2 ble r2,r0,Invaders1
FFFFFFFFFFFFD4F4 0E210008 subui r2,r2,#8
FFFFFFFFFFFFD4F8 62011508 sc r2,Manpos
FFFFFFFFFFFFD4FC BE00014A bra Invaders1
FFFFFFFFFFFFD500 FireMissile:
FFFFFFFFFFFFD500 40011510 lb r2,MissileActive
FFFFFFFFFFFFD504 BE200109 bne r2,r0,Invaders1
FFFFFFFFFFFFD508 E0800001 setlo r2,#1
FFFFFFFFFFFFD50C 60011510 sb r2,MissileActive
FFFFFFFFFFFFD510 42011508 lc r2,Manpos
FFFFFFFFFFFFD514 62011512 sc r2,MissileX
FFFFFFFFFFFFD518 E080002E setlo r2,#46
FFFFFFFFFFFFD51C 62011514 sc r2,MissileY
FFFFFFFFFFFFD520 BE00002A bra Invaders1
FFFFFFFFFFFFD524 Invaders1:
FFFFFFFFFFFFD524 B0100203 beqi r1,#CTRLC,InvadersEnd
FFFFFFFFFFFFD528 BE007C2A bra InvadersLoop
FFFFFFFFFFFFD52C InvadersEnd:
FFFFFFFFFFFFD52C 2774000000F lm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFD530 0BEF00F0 addui sp,sp,#240
FFFFFFFFFFFFD534 BE0017AA bra Monitor
;==============================================================================
;==============================================================================
;
; Initialize the SD card
; Returns
; r = 0 if successful, 1 otherwise
;
FFFFFFFFFFFFD538 spi_init:
FFFFFFFFFFFFD538 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFD53C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD540 67E10008 sw r2,8[sp]
FFFFFFFFFFFFD544 67E18010 sw r3,16[sp]
FFFFFFFFFFFFD548 E69C0500 ; SETLO
FFFFFFFFFFFFD54C EE800003 ; SETMID
FFFFFFFFFFFFD550 6A0D0C2D lea r3,SPIMASTER
FFFFFFFFFFFFD554 16008001 lw r1,#SPI_INIT_SD
FFFFFFFFFFFFD558 90308002 outb r1,SPI_TRANS_TYPE_REG[r3]
FFFFFFFFFFFFD55C 16008001 lw r1,#SPI_TRANS_START
FFFFFFFFFFFFD560 90308003 outb r1,SPI_TRANS_CTRL_REG[r3]
FFFFFFFFFFFFD564 DE000000 nop
FFFFFFFFFFFFD568 spi_init1:
FFFFFFFFFFFFD568 80308004 inb r1,SPI_TRANS_STATUS_REG[r3]
FFFFFFFFFFFFD56C 02110009 mov r2,r1 ; note: some time needs to be wasted
FFFFFFFFFFFFD570 02208009 mov r1,r2 ; between status reads.
FFFFFFFFFFFFD574 B01FFD01 beqi r1,#SPI_TRANS_BUSY,spi_init1
FFFFFFFFFFFFD578 80308005 inb r1,SPI_TRANS_ERROR_REG[r3]
FFFFFFFFFFFFD57C 2A108204 bfext r1,r1,#1,#0
FFFFFFFFFFFFD580 B2100500 bne r1,#SPI_INIT_NO_ERROR,spi_error
FFFFFFFFFFFFD584 9A00D946 lea r1,spi_init_ok_msg
FFFFFFFFFFFFD588 31FFF122 call DisplayString
FFFFFFFFFFFFD58C 0410840A xor r1,r1,r1
FFFFFFFFFFFFD590 BE0000AA bra spi_init_exit
FFFFFFFFFFFFD594 spi_error:
FFFFFFFFFFFFD594 31FFF14B call DisplayByte
FFFFFFFFFFFFD598 9A00D960 lea r1,spi_init_error_msg
FFFFFFFFFFFFD59C 31FFF122 call DisplayString
FFFFFFFFFFFFD5A0 16008001 lw r1,#1
FFFFFFFFFFFFD5A4 spi_init_exit:
FFFFFFFFFFFFD5A4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD5A8 47E10008 lw r2,8[sp]
FFFFFFFFFFFFD5AC 47E18010 lw r3,16[sp]
FFFFFFFFFFFFD5B0 37EF8018 ret #24
; SPI read sector
;
; r1= sector number to read
; r2= address to place read data
; Returns:
; r1 = 0 if successful
;
FFFFFFFFFFFFD5B4 spi_read_sector:
FFFFFFFFFFFFD5B4 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFD5B8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD5BC 67E28008 sw r5,8[sp]
FFFFFFFFFFFFD5C0 67E10010 sw r2,16[sp]
FFFFFFFFFFFFD5C4 67E18018 sw r3,24[sp]
FFFFFFFFFFFFD5C8 67E20020 sw r4,32[sp]
FFFFFFFFFFFFD5CC E69C0500 ; SETLO
FFFFFFFFFFFFD5D0 EE800003 ; SETMID
FFFFFFFFFFFFD5D4 6A0D0C2D lea r3,SPIMASTER
; spi master wants a byte address, so we multiply the sector number
; by 512.
FFFFFFFFFFFFD5D8 06109206 shlui r1,r1,#9
FFFFFFFFFFFFD5DC 90308007 outb r1,SPI_SD_ADDR_7_0_REG[r3]
FFFFFFFFFFFFD5E0 06109001 shrui r1,r1,#8
FFFFFFFFFFFFD5E4 90308008 outb r1,SPI_SD_ADDR_15_8_REG[r3]
FFFFFFFFFFFFD5E8 06109001 shrui r1,r1,#8
FFFFFFFFFFFFD5EC 90308009 outb r1,SPI_SD_ADDR_23_16_REG[r3]
FFFFFFFFFFFFD5F0 06109001 shrui r1,r1,#8
FFFFFFFFFFFFD5F4 9030800A outb r1,SPI_SD_ADDR_31_24_REG[r3]
; Force the reciever fifo to be empty, in case a prior error leaves it
; in an unknown state.
FFFFFFFFFFFFD5F8 16008001 lw r1,#1
FFFFFFFFFFFFD5FC 90308014 outb r1,SPI_RX_FIFO_CTRL_REG[r3]
FFFFFFFFFFFFD600 16008002 lw r1,#RW_READ_SD_BLOCK
FFFFFFFFFFFFD604 90308002 outb r1,SPI_TRANS_TYPE_REG[r3]
FFFFFFFFFFFFD608 16008001 lw r1,#SPI_TRANS_START
FFFFFFFFFFFFD60C 90308003 outb r1,SPI_TRANS_CTRL_REG[r3]
FFFFFFFFFFFFD610 DE000000 nop
FFFFFFFFFFFFD614 spi_read_sect1:
FFFFFFFFFFFFD614 80308004 inb r1,SPI_TRANS_STATUS_REG[r3]
FFFFFFFFFFFFD618 02120009 mov r4,r1 ; just a delay between consecutive status reg reads
FFFFFFFFFFFFD61C 02408009 mov r1,r4
FFFFFFFFFFFFD620 B01FFD01 beqi r1,#SPI_TRANS_BUSY,spi_read_sect1
FFFFFFFFFFFFD624 80308005 inb r1,SPI_TRANS_ERROR_REG[r3]
FFFFFFFFFFFFD628 2A108614 bfext r1,r1,#3,#2
FFFFFFFFFFFFD62C B2100800 bnei r1,#SPI_READ_NO_ERROR,spi_read_error
FFFFFFFFFFFFD630 16020200 lw r4,#512 ; read 512 bytes from fifo
FFFFFFFFFFFFD634 spi_read_sect2:
FFFFFFFFFFFFD634 80308010 inb r1,SPI_RX_FIFO_DATA_REG[r3]
FFFFFFFFFFFFD638 60208000 sb r1,[r2]
FFFFFFFFFFFFD63C 0A210001 addui r2,r2,#1
FFFFFFFFFFFFD640 BE027FAF loop r4,spi_read_sect2
FFFFFFFFFFFFD644 0410840A xor r1,r1,r1
FFFFFFFFFFFFD648 BE0000AA bra spi_read_ret
FFFFFFFFFFFFD64C spi_read_error:
FFFFFFFFFFFFD64C 31FFF14B call DisplayByte
FFFFFFFFFFFFD650 9A00D99E lea r1,spi_read_error_msg
FFFFFFFFFFFFD654 31FFF122 call DisplayString
FFFFFFFFFFFFD658 16008001 lw r1,#1
FFFFFFFFFFFFD65C spi_read_ret:
FFFFFFFFFFFFD65C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD660 47E28008 lw r5,8[sp]
FFFFFFFFFFFFD664 47E10010 lw r2,16[sp]
FFFFFFFFFFFFD668 47E18018 lw r3,24[sp]
FFFFFFFFFFFFD66C 47E20020 lw r4,32[sp]
FFFFFFFFFFFFD670 37EF8028 ret #40
; Read the boot sector from the disk.
; Must find it first by looking for the signature bytes 'EB' and '55AA'.
;
FFFFFFFFFFFFD674 spi_read_boot:
FFFFFFFFFFFFD674 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFD678 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD67C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFD680 67E18010 sw r3,16[sp]
FFFFFFFFFFFFD684 67E28018 sw r5,24[sp]
FFFFFFFFFFFFD688 660030F8 sw r0,startSector ; default starting sector
FFFFFFFFFFFFD68C 160181F4 lw r3,#500 ;1934720 ; number of sectors to read (up to 1GB)
FFFFFFFFFFFFD690 16028000 lw r5,#0 ; r5 = starting address
FFFFFFFFFFFFD694 spi_read_boot1:
FFFFFFFFFFFFD694 02508009 mov r1,r5 ; r1 = sector number
FFFFFFFFFFFFD698 16010008 lw r2,#8 ; eight digits
FFFFFFFFFFFFD69C 60001418 sb r0,CursorCol
FFFFFFFFFFFFD6A0 31FFF13F call DisplayNum ; Display the sector number being checked
FFFFFFFFFFFFD6A4 02508009 mov r1,r5 ; r1 = sector number
FFFFFFFFFFFFD6A8 E6800000 ; SETLO
FFFFFFFFFFFFD6AC EE800402 ; SETMID
FFFFFFFFFFFFD6B0 040D0809 lw r2,#0x100800000 ; r2 = target address
FFFFFFFFFFFFD6B4 31FFF56D call spi_read_sector
; The following displays the contents of the sector
; lw r1,#0x10
; lw r2,#0x3800
;spi_read_boot5:
; call DisplayMemB
; loop r1,spi_read_boot5
FFFFFFFFFFFFD6B8 0A528001 addui r5,r5,#1 ; move to next sector
FFFFFFFFFFFFD6BC E6800000 ; SETLO
FFFFFFFFFFFFD6C0 EE800402 ; SETMID
FFFFFFFFFFFFD6C4 6A0D0405 lbu r1,0x100800000
FFFFFFFFFFFFD6C8 121100EB cmpui r2,r1,#0xEB
FFFFFFFFFFFFD6CC BE200088 beq r2,r0,spi_read_boot2
FFFFFFFFFFFFD6D0 spi_read_boot3:
FFFFFFFFFFFFD6D0 BE01FE2F loop r3,spi_read_boot1
FFFFFFFFFFFFD6D4 16008001 lw r1,#1 ; r1 = 1 for error
FFFFFFFFFFFFD6D8 BE0001EA bra spi_read_boot4
FFFFFFFFFFFFD6DC spi_read_boot2:
FFFFFFFFFFFFD6DC 9A00D728 lea r1,msgFoundEB
FFFFFFFFFFFFD6E0 31FFF122 call DisplayString
FFFFFFFFFFFFD6E4 E68001FE ; SETLO
FFFFFFFFFFFFD6E8 EE800402 ; SETMID
FFFFFFFFFFFFD6EC 6A0D0405 lbu r1,0x1008001FE ; check for 0x55AA signature
FFFFFFFFFFFFD6F0 B21FF855 bnei r1,#0x55,spi_read_boot3
FFFFFFFFFFFFD6F4 E68001FF ; SETLO
FFFFFFFFFFFFD6F8 EE800402 ; SETMID
FFFFFFFFFFFFD6FC 6A0D0405 lbu r1,0x1008001FF
FFFFFFFFFFFFD700 E68000AA ; SETLO
FFFFFFFFFFFFD704 BE1D7E69 bnei r1,#0xAA,spi_read_boot3
FFFFFFFFFFFFD708 0E508001 subui r1,r5,#1
FFFFFFFFFFFFD70C 6600B0F8 sw r1,startSector
FFFFFFFFFFFFD710 0410840A xor r1,r1,r1 ; r1 = 0, for okay status
FFFFFFFFFFFFD714 spi_read_boot4:
FFFFFFFFFFFFD714 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD718 47E10008 lw r2,8[sp]
FFFFFFFFFFFFD71C 47E18010 lw r3,16[sp]
FFFFFFFFFFFFD720 47E28018 lw r5,24[sp]
FFFFFFFFFFFFD724 37EF8020 ret #32
FFFFFFFFFFFFD728 msgFoundEB:
FFFFFFFFFFFFD728 424520646E756F46 db "Found EB code.",CR,LF,0
FFFFFFFFFFFFD730 0A0D2E65646F6320
FFFFFFFFFFFFD73C .align 4
; Load the FAT tables into memory
;
FFFFFFFFFFFFD73C loadFAT:
FFFFFFFFFFFFD73C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD740 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD744 E6800016 ; SETLO
FFFFFFFFFFFFD748 EE800402 ; SETMID
FFFFFFFFFFFFD74C 6A0D0C06 lcu r3,0x100800016 ; sectors per FAT
FFFFFFFFFFFFD750 E6800010 ; SETLO
FFFFFFFFFFFFD754 EE800402 ; SETMID
FFFFFFFFFFFFD758 6A0D0805 lbu r2,0x100800010 ; number of FATs
FFFFFFFFFFFFD75C 04310C18 mulu r3,r3,r2 ; offset
FFFFFFFFFFFFD760 E6800200 ; SETLO
FFFFFFFFFFFFD764 EE800402 ; SETMID
FFFFFFFFFFFFD768 6A0D082D lea r2,0x100800200 ; where to place FAT
FFFFFFFFFFFFD76C E680000E ; SETLO
FFFFFFFFFFFFD770 EE800402 ; SETMID
FFFFFFFFFFFFD774 6A0D1406 lcu r5,0x10080000E ; r5 = # reserved sectors before FAT
FFFFFFFFFFFFD778 460330F8 lw r6,startSector
FFFFFFFFFFFFD77C 04531403 addu r5,r5,r6
FFFFFFFFFFFFD780 loadFAT1:
FFFFFFFFFFFFD780 02508009 mov r1,r5 ; r1 = sector #
FFFFFFFFFFFFD784 31FFF56D call spi_read_sector
FFFFFFFFFFFFD788 0A528001 addui r5,r5,#1
FFFFFFFFFFFFD78C 0A210200 addui r2,r2,#512 ; advance 512 bytes
FFFFFFFFFFFFD790 BE01FF8F loop r3,loadFAT1
FFFFFFFFFFFFD794 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD798 37EF8008 ret #8
; Load the root directory from disk
; r2 = where to place root directory in memory
;
FFFFFFFFFFFFD79C loadRootDirectory:
FFFFFFFFFFFFD79C E6800016 ; SETLO
FFFFFFFFFFFFD7A0 EE800402 ; SETMID
FFFFFFFFFFFFD7A4 6A0D0C06 lcu r3,0x100800016 ; sectors per FAT
FFFFFFFFFFFFD7A8 E6800010 ; SETLO
FFFFFFFFFFFFD7AC EE800402 ; SETMID
FFFFFFFFFFFFD7B0 6A0D1005 lbu r4,0x100800010 ; number of FATs
FFFFFFFFFFFFD7B4 04320C18 mulu r3,r3,r4 ; offset
FFFFFFFFFFFFD7B8 E680000E ; SETLO
FFFFFFFFFFFFD7BC EE800402 ; SETMID
FFFFFFFFFFFFD7C0 6A0D1006 lcu r4,0x10080000E ; r2 = # reserved sectors before FAT
FFFFFFFFFFFFD7C4 04320C03 addu r3,r3,r4 ; r3 = root directory sector number
FFFFFFFFFFFFD7C8 460330F8 lw r6,startSector
FFFFFFFFFFFFD7CC 04331403 addu r5,r3,r6 ; r5 = root directory sector number
; we have to use two byte loads here because the number is at an unaligned data address
FFFFFFFFFFFFD7D0 E6800011 ; SETLO
FFFFFFFFFFFFD7D4 EE800402 ; SETMID
FFFFFFFFFFFFD7D8 6A0D1C05 lbu r7,0x100800011 ; r7 <= number of root directory entries
FFFFFFFFFFFFD7DC E6800012 ; SETLO
FFFFFFFFFFFFD7E0 EE800402 ; SETMID
FFFFFFFFFFFFD7E4 6A0D2005 lbu r8,0x100800012
FFFFFFFFFFFFD7E8 06841006 shlui r8,r8,#8
FFFFFFFFFFFFD7EC 04741C09 or r7,r7,r8
FFFFFFFFFFFFD7F0 02740009 mov r8,r7 ; r8 = number of root directory entries
FFFFFFFFFFFFD7F4 06738A06 shlui r7,r7,#5 ; r7 *=32 = size of root directory table (bytes)
FFFFFFFFFFFFD7F8 06739201 shrui r7,r7,#9 ; r7 /= 512 = number of sectors in root directory
FFFFFFFFFFFFD7FC 02718009 mov r3,r7
FFFFFFFFFFFFD800 loadRootDir1:
FFFFFFFFFFFFD800 02508009 mov r1,r5
FFFFFFFFFFFFD804 31FFF56D call spi_read_sector
FFFFFFFFFFFFD808 0A528001 addui r5,r5,#1
FFFFFFFFFFFFD80C 0A210200 addui r2,r2,#512
FFFFFFFFFFFFD810 BE01FF8F loop r3,loadRootDir1
FFFFFFFFFFFFD814 loadBootFile:
; For now we cheat and just go directly to sector 512.
FFFFFFFFFFFFD814 BE0004AA bra loadBootFileTmp
FFFFFFFFFFFFD818 E6800016 ; SETLO
FFFFFFFFFFFFD81C EE800402 ; SETMID
FFFFFFFFFFFFD820 6A0D0C06 lcu r3,0x100800016 ; sectors per FAT
FFFFFFFFFFFFD824 E6800010 ; SETLO
FFFFFFFFFFFFD828 EE800402 ; SETMID
FFFFFFFFFFFFD82C 6A0D0805 lbu r2,0x100800010 ; number of FATs
FFFFFFFFFFFFD830 04310C18 mulu r3,r3,r2 ; offset
FFFFFFFFFFFFD834 E680000E ; SETLO
FFFFFFFFFFFFD838 EE800402 ; SETMID
FFFFFFFFFFFFD83C 6A0D0806 lcu r2,0x10080000E ; r2 = # reserved sectors before FAT
FFFFFFFFFFFFD840 04310C03 addu r3,r3,r2 ; r3 = root directory sector number
; we have to use two byte loads here because the number is at an unaligned data address
FFFFFFFFFFFFD844 E6800011 ; SETLO
FFFFFFFFFFFFD848 EE800402 ; SETMID
FFFFFFFFFFFFD84C 6A0D1C05 lbu r7,0x100800011 ; r7 <= number of root directory entries
FFFFFFFFFFFFD850 E6800012 ; SETLO
FFFFFFFFFFFFD854 EE800402 ; SETMID
FFFFFFFFFFFFD858 6A0D2005 lbu r8,0x100800012
FFFFFFFFFFFFD85C 06841006 shlui r8,r8,#8
FFFFFFFFFFFFD860 04741C09 or r7,r7,r8
FFFFFFFFFFFFD864 02740009 mov r8,r7 ; r8 = number of root directory entries
FFFFFFFFFFFFD868 06738A06 shlui r7,r7,#5 ; r7 *=32 = size of root directory table (bytes)
FFFFFFFFFFFFD86C 06739201 shrui r7,r7,#9 ; r7 /= 512 = number of sectors in root directory
; now we need to fetch the sectors of the root directory and put them somewhere in
; memory
;
FFFFFFFFFFFFD870 loadBootFile4:
FFFFFFFFFFFFD870 46308000 lw r1,[r3] ; get filename
FFFFFFFFFFFFD874 E68F4F42 ; SETLO
FFFFFFFFFFFFD878 EEA51951 ; SETMID
FFFFFFFFFFFFD87C F68454C4 ; SETHI
FFFFFFFFFFFFD880 041D0407 cmpui r1,r1,#0x454C4946544F4F42 ; "BOOTFILE"
FFFFFFFFFFFFD884 BE100068 beq r1,r0,loadBootFile5
FFFFFFFFFFFFD888 loadBootFile3:
FFFFFFFFFFFFD888 0A318020 addui r3,r3,#32 ; move to next directory entry
FFFFFFFFFFFFD88C BE03FF2F loop r7,loadBootFile4
; boot file not found
; here we found the file in the directory
;
FFFFFFFFFFFFD890 loadBootFile5:
FFFFFFFFFFFFD890 4C31001A lcu r2,0x1a[r3] ; get starting cluster
FFFFFFFFFFFFD894 E6800011 ; SETLO
FFFFFFFFFFFFD898 EE800402 ; SETMID
FFFFFFFFFFFFD89C 6A0D1C06 lcu r7,0x100800011 ; r7 = number of root directory entries
FFFFFFFFFFFFD8A0 06738A06 shlui r7,r7,#5 ; r7 *=32 = size of root directory table (bytes)
FFFFFFFFFFFFD8A4 06739201 shrui r7,r7,#9 ; r7 /= 512 = number of sectors in root directory
FFFFFFFFFFFFD8A8 loadBootFileTmp:
; We load the number of sectors per cluster, then load a single cluster of the file.
; This is 16kib
FFFFFFFFFFFFD8A8 E680000D ; SETLO
FFFFFFFFFFFFD8AC EE800402 ; SETMID
FFFFFFFFFFFFD8B0 6A0D0C05 lbu r3,0x10080000D ; sectors per cluster
FFFFFFFFFFFFD8B4 E6800200 ; SETLO
FFFFFFFFFFFFD8B8 EE800402 ; SETMID
FFFFFFFFFFFFD8BC 6A0D082D lea r2,0x100800200 ; where to place FAT in memory
FFFFFFFFFFFFD8C0 4602B0F8 lw r5,startSector ; r5=start sector of disk
FFFFFFFFFFFFD8C4 0A528200 addui r5,r5,#512 ; r5= sector 512
FFFFFFFFFFFFD8C8 loadBootFile1:
FFFFFFFFFFFFD8C8 02508009 mov r1,r5 ; r1=sector to read
FFFFFFFFFFFFD8CC 31FFF56D call spi_read_sector
FFFFFFFFFFFFD8D0 0A528001 addui r5,r5,#1 ; r5 = next sector
FFFFFFFFFFFFD8D4 0A210200 addui r2,r2,#512
FFFFFFFFFFFFD8D8 BE01FF8F loop r3,loadBootFile1
FFFFFFFFFFFFD8DC E6800200 ; SETLO
FFFFFFFFFFFFD8E0 EE800402 ; SETMID
FFFFFFFFFFFFD8E4 6A0D0407 lhu r1,0x100800200 ; make sure it's bootable
FFFFFFFFFFFFD8E8 E68F4F42 ; SETLO
FFFFFFFFFFFFD8EC EE800151 ; SETMID
FFFFFFFFFFFFD8F0 BE1D0129 bnei r1,#0x544F4F42,loadBootFile2
FFFFFFFFFFFFD8F4 16008016 lw r1,#0x16
FFFFFFFFFFFFD8F8 9A00D920 lea r1,msgJumpingToBoot
FFFFFFFFFFFFD8FC 31FFF122 call DisplayString
FFFFFFFFFFFFD900 E6800204 ; SETLO
FFFFFFFFFFFFD904 EE800402 ; SETMID
FFFFFFFFFFFFD908 040D0409 lw r1,#0x100800204
FFFFFFFFFFFFD90C 341F8000 jal lr,[r1]
FFFFFFFFFFFFD910 33FFF20A jmp Monitor
FFFFFFFFFFFFD914 loadBootFile2:
FFFFFFFFFFFFD914 9A00D930 lea r1,msgNotBootable
FFFFFFFFFFFFD918 31FFF122 call DisplayString
FFFFFFFFFFFFD91C 33FFF20A jmp Monitor
FFFFFFFFFFFFD920 msgJumpingToBoot:
FFFFFFFFFFFFD920 20676E69706D754A db "Jumping to boot",0
FFFFFFFFFFFFD928 00746F6F62206F74
FFFFFFFFFFFFD930 msgNotBootable:
FFFFFFFFFFFFD930 2064726163204453 db "SD card not bootable.",0
FFFFFFFFFFFFD938 746F6F6220746F6E
FFFFFFFFFFFFD946 spi_init_ok_msg:
FFFFFFFFFFFFD940 4453002E656C6261 db "SD card initialized okay.",0
FFFFFFFFFFFFD948 6E69206472616320
FFFFFFFFFFFFD950 657A696C61697469
FFFFFFFFFFFFD958 002E79616B6F2064
FFFFFFFFFFFFD960 spi_init_error_msg:
FFFFFFFFFFFFD960 20726F727265203A db ": error occurred initializing the SD card.",0
FFFFFFFFFFFFD968 646572727563636F
FFFFFFFFFFFFD970 6C616974696E6920
FFFFFFFFFFFFD978 687420676E697A69
FFFFFFFFFFFFD980 7261632044532065
FFFFFFFFFFFFD98B spi_boot_error_msg:
FFFFFFFFFFFFD988 6163204453002E64 db "SD card boot error",0
FFFFFFFFFFFFD990 20746F6F62206472
FFFFFFFFFFFFD99E spi_read_error_msg:
FFFFFFFFFFFFD998 445300726F727265 db "SD card read error",0
FFFFFFFFFFFFD9A0 6572206472616320
FFFFFFFFFFFFD9A8 726F727265206461
FFFFFFFFFFFFD9B4 .align 4
;==============================================================================
; Ethernet
;==============================================================================
my_MAC1 EQU 0x00
my_MAC2 EQU 0xFF
my_MAC3 EQU 0xEE
my_MAC4 EQU 0xF0
my_MAC5 EQU 0xDA
my_MAC6 EQU 0x42
FFFFFFFFFFFFD9B4 .bss
FFFFFFFFFFFFD9B4 0000000000000000 eth_unique_id dw 0
FFFFFFFFFFFFD9BC .code
; Initialize the ethmac controller.
; Supply a MAC address, set MD clock
;
FFFFFFFFFFFFD9BC eth_init:
FFFFFFFFFFFFD9BC E69C2000 ; SETLO
FFFFFFFFFFFFD9C0 EE800003 ; SETMID
FFFFFFFFFFFFD9C4 6A0D0C2D lea r3,ETHMAC
FFFFFFFFFFFFD9C8 16008064 lw r1,#0x64 ; 100
FFFFFFFFFFFFD9CC 64308028 sh r1,MIIMODER[r3]
FFFFFFFFFFFFD9D0 16008007 lw r1,#7 ; PHY address
FFFFFFFFFFFFD9D4 64308030 sh r1,MIIADDRESS[r3]
FFFFFFFFFFFFD9D8 E6B0DA42 ; SETLO
FFFFFFFFFFFFD9DC EEBFFFBB ; SETMID
FFFFFFFFFFFFD9E0 040D0409 lw r1,#0xEEF0DA42
FFFFFFFFFFFFD9E4 64308040 sh r1,0x40[r3] ; MAC0
FFFFFFFFFFFFD9E8 160080FF lw r1,#0x00FF
FFFFFFFFFFFFD9EC 64308044 sh r1,0x44[r3] ; MAC1
FFFFFFFFFFFFD9F0 37EF8000 ret
; Request a packet and display on screen
; r1 = address where to put packet
;
FFFFFFFFFFFFD9F4 eth_request_packet:
FFFFFFFFFFFFD9F4 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFD9F8 67E18000 sw r3,[sp]
FFFFFFFFFFFFD9FC 67E10008 sw r2,8[sp]
FFFFFFFFFFFFDA00 67E20010 sw r4,16[sp]
FFFFFFFFFFFFDA04 E69C2000 ; SETLO
FFFFFFFFFFFFDA08 EE800003 ; SETMID
FFFFFFFFFFFFDA0C 6A0D0C2D lea r3,ETHMAC
FFFFFFFFFFFFDA10 16010004 lw r2,#4 ; clear rx interrupt
FFFFFFFFFFFFDA14 64310004 sh r2,4[r3]
FFFFFFFFFFFFDA18 64308604 sh r1,0x604[r3] ; storage address
FFFFFFFFFFFFDA1C 16016000 lw r2,#0xe000 ; enable interrupt
FFFFFFFFFFFFDA20 64310600 sh r2,0x600[r3]
FFFFFFFFFFFFDA24 eth1:
FFFFFFFFFFFFDA24 DE000000 nop
FFFFFFFFFFFFDA28 84310004 inh r2,4[r3]
FFFFFFFFFFFFDA2C 2A210414 bfext r2,r2,#2,#2 ; get bit #2
FFFFFFFFFFFFDA30 BE207FA8 beq r2,r0,eth1
FFFFFFFFFFFFDA34 84310600 inh r2,0x600[r3] ; get from descriptor
FFFFFFFFFFFFDA38 06212001 shrui r2,r2,#16
FFFFFFFFFFFFDA3C 16018000 lw r3,#0
FFFFFFFFFFFFDA40 E6901D88 ; SETLO
FFFFFFFFFFFFDA44 EE800003 ; SETMID
FFFFFFFFFFFFDA48 6A0D102D lea r4,TEXTSCR+7560 ; second last line of screen
FFFFFFFFFFFFDA4C eth20:
FFFFFFFFFFFFDA4C 6A118805 lbu r2,[r1+r3] ; get byte
FFFFFFFFFFFFDA50 6A418911 sc r2,[r4+r3*2] ; store to screen
FFFFFFFFFFFFDA54 0A318001 addui r3,r3,#1
FFFFFFFFFFFFDA58 12310053 cmpui r2,r3,#83
FFFFFFFFFFFFDA5C BE207F89 bne r2,r0,eth20
FFFFFFFFFFFFDA60 47E18000 lw r3,[sp]
FFFFFFFFFFFFDA64 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDA68 47E20010 lw r4,16[sp]
FFFFFFFFFFFFDA6C 37EF8018 ret #24
; r1 = packet address
;
FFFFFFFFFFFFDA70 eth_interpret_packet:
FFFFFFFFFFFFDA70 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDA74 67E18000 sw r3,[sp]
FFFFFFFFFFFFDA78 67E10008 sw r2,8[sp]
FFFFFFFFFFFFDA7C 4A11000C lbu r2,12[r1]
FFFFFFFFFFFFDA80 4A11800D lbu r3,13[r1]
FFFFFFFFFFFFDA84 B2200608 bnei r2,#8,eth2 ; 0x806 ?
FFFFFFFFFFFFDA88 B2300506 bnei r3,#6,eth2
FFFFFFFFFFFFDA8C 16008002 lw r1,#2 ; return r1 = 2 for ARP
FFFFFFFFFFFFDA90 eth5:
FFFFFFFFFFFFDA90 47E18000 lw r3,[sp]
FFFFFFFFFFFFDA94 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDA98 37EF8010 ret #16
FFFFFFFFFFFFDA9C eth2:
FFFFFFFFFFFFDA9C B2200C08 bnei r2,#8,eth3 ; 0x800 ?
FFFFFFFFFFFFDAA0 B2300B00 bnei r3,#0,eth3
FFFFFFFFFFFFDAA4 4A110017 lbu r2,23[r1]
FFFFFFFFFFFFDAA8 B2200301 bnei r2,#1,eth4
FFFFFFFFFFFFDAAC 16008001 lw r1,#1
FFFFFFFFFFFFDAB0 BE007F0A bra eth5 ; return 1 ICMP
FFFFFFFFFFFFDAB4 eth4:
FFFFFFFFFFFFDAB4 B2200311 bnei r2,#0x11,eth6
FFFFFFFFFFFFDAB8 16008003 lw r1,#3 ; return 3 for UDP
FFFFFFFFFFFFDABC BE007EAA bra eth5
FFFFFFFFFFFFDAC0 eth6:
FFFFFFFFFFFFDAC0 B2200306 bnei r2,#6,eth7
FFFFFFFFFFFFDAC4 16008004 lw r1,#4 ; return 4 for TCP
FFFFFFFFFFFFDAC8 BE007E4A bra eth5
FFFFFFFFFFFFDACC eth7:
FFFFFFFFFFFFDACC eth3:
FFFFFFFFFFFFDACC 0410840A xor r1,r1,r1 ; return zero for unknown
FFFFFFFFFFFFDAD0 47E18000 lw r3,[sp]
FFFFFFFFFFFFDAD4 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDAD8 37EF8010 ret #16
; r1 = address of packet to send
; r2 = packet length
;
FFFFFFFFFFFFDADC eth_send_packet:
FFFFFFFFFFFFDADC 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDAE0 67E18000 sw r3,[sp]
FFFFFFFFFFFFDAE4 67E20008 sw r4,8[sp]
FFFFFFFFFFFFDAE8 E69C2000 ; SETLO
FFFFFFFFFFFFDAEC EE800003 ; SETMID
FFFFFFFFFFFFDAF0 6A0D0C2D lea r3,ETHMAC
; wait for tx buffer to be clear
FFFFFFFFFFFFDAF4 eth8:
FFFFFFFFFFFFDAF4 84320400 inh r4,0x400[r3]
FFFFFFFFFFFFDAF8 2A421E7C bfext r4,r4,#15,#15
FFFFFFFFFFFFDAFC B04FFE01 beqi r4,#1,eth8
FFFFFFFFFFFFDB00 16020001 lw r4,#1 ; clear tx interrupt
FFFFFFFFFFFFDB04 64320004 sh r4,4[r3]
; set address
FFFFFFFFFFFFDB08 64308404 sh r1,0x404[r3]
; set the packet length field and enable interrupts
FFFFFFFFFFFFDB0C 06212006 shlui r2,r2,#16
FFFFFFFFFFFFDB10 16217000 ori r2,r2,#0xF000
FFFFFFFFFFFFDB14 64310400 sh r2,0x400[r3]
FFFFFFFFFFFFDB18 47E20008 lw r4,8[sp]
FFFFFFFFFFFFDB1C 47E18000 lw r3,[sp]
FFFFFFFFFFFFDB20 37EF8010 ret #16
; Only for IP type packets (not ARP)
; r1 = rx buffer address
; r2 = swap flag
; Returns:
; r1 = data start index
;
FFFFFFFFFFFFDB24 eth_build_packet:
FFFFFFFFFFFFDB24 0FEF0040 subui sp,sp,#64
FFFFFFFFFFFFDB28 67E18000 sw r3,[sp]
FFFFFFFFFFFFDB2C 67E20008 sw r4,8[sp]
FFFFFFFFFFFFDB30 67E28010 sw r5,16[sp]
FFFFFFFFFFFFDB34 67E30018 sw r6,24[sp]
FFFFFFFFFFFFDB38 67E38020 sw r7,32[sp]
FFFFFFFFFFFFDB3C 67E40028 sw r8,40[sp]
FFFFFFFFFFFFDB40 67E48030 sw r9,48[sp]
FFFFFFFFFFFFDB44 67E50038 sw r10,56[sp]
FFFFFFFFFFFFDB48 4A118006 lbu r3,6[r1]
FFFFFFFFFFFFDB4C 4A120007 lbu r4,7[r1]
FFFFFFFFFFFFDB50 4A128008 lbu r5,8[r1]
FFFFFFFFFFFFDB54 4A130009 lbu r6,9[r1]
FFFFFFFFFFFFDB58 4A13800A lbu r7,10[r1]
FFFFFFFFFFFFDB5C 4A14000B lbu r8,11[r1]
; write to destination header
FFFFFFFFFFFFDB60 60118000 sb r3,[r1]
FFFFFFFFFFFFDB64 60120001 sb r4,1[r1]
FFFFFFFFFFFFDB68 60128002 sb r5,2[r1]
FFFFFFFFFFFFDB6C 60130003 sb r6,3[r1]
FFFFFFFFFFFFDB70 60138004 sb r7,4[r1]
FFFFFFFFFFFFDB74 60140005 sb r8,5[r1]
; write to source header
FFFFFFFFFFFFDB78 16018000 lw r3,#my_MAC1
FFFFFFFFFFFFDB7C 60118006 sb r3,6[r1]
FFFFFFFFFFFFDB80 160180FF lw r3,#my_MAC2
FFFFFFFFFFFFDB84 60118007 sb r3,7[r1]
FFFFFFFFFFFFDB88 160180EE lw r3,#my_MAC3
FFFFFFFFFFFFDB8C 60118008 sb r3,8[r1]
FFFFFFFFFFFFDB90 160180F0 lw r3,#my_MAC4
FFFFFFFFFFFFDB94 60118009 sb r3,9[r1]
FFFFFFFFFFFFDB98 160180DA lw r3,#my_MAC5
FFFFFFFFFFFFDB9C 6011800A sb r3,10[r1]
FFFFFFFFFFFFDBA0 16018042 lw r3,#my_MAC6
FFFFFFFFFFFFDBA4 6011800B sb r3,11[r1]
FFFFFFFFFFFFDBA8 B2201101 bnei r2,#1,eth16 // if (swap)
FFFFFFFFFFFFDBAC 4A11801A lbu r3,26[r1]
FFFFFFFFFFFFDBB0 4A12001B lbu r4,27[r1]
FFFFFFFFFFFFDBB4 4A12801C lbu r5,28[r1]
FFFFFFFFFFFFDBB8 4A13001D lbu r6,29[r1]
; read destination
FFFFFFFFFFFFDBBC 4A13801E lbu r7,30[r1]
FFFFFFFFFFFFDBC0 4A14001F lbu r8,31[r1]
FFFFFFFFFFFFDBC4 4A148020 lbu r9,32[r1]
FFFFFFFFFFFFDBC8 4A150021 lbu r10,33[r1]
; write to sender
FFFFFFFFFFFFDBCC 6013801A sb r7,26[r1]
FFFFFFFFFFFFDBD0 6014001B sb r8,27[r1]
FFFFFFFFFFFFDBD4 6014801C sb r9,28[r1]
FFFFFFFFFFFFDBD8 6015001D sb r10,29[r1]
; write destination
FFFFFFFFFFFFDBDC 6011801E sb r3,30[r1]
FFFFFFFFFFFFDBE0 6012001F sb r4,31[r1]
FFFFFFFFFFFFDBE4 60128020 sb r5,32[r1]
FFFFFFFFFFFFDBE8 60130021 sb r6,33[r1]
FFFFFFFFFFFFDBEC eth16:
FFFFFFFFFFFFDBEC 4601D9B4 lw r3,eth_unique_id
FFFFFFFFFFFFDBF0 0A318001 addui r3,r3,#1
FFFFFFFFFFFFDBF4 6601D9B4 sw r3,eth_unique_id
FFFFFFFFFFFFDBF8 60118013 sb r3,19[r1]
FFFFFFFFFFFFDBFC 06319001 shrui r3,r3,#8
FFFFFFFFFFFFDC00 60118012 sb r3,18[r1]
FFFFFFFFFFFFDC04 4A11800E lbu r3,14[r1]
FFFFFFFFFFFFDC08 1431800F andi r3,r3,#0xF
FFFFFFFFFFFFDC0C 06318406 shlui r3,r3,#2 ; *4
FFFFFFFFFFFFDC10 0A30800E addui r1,r3,#14 ; return datastart in r1
FFFFFFFFFFFFDC14 47E18000 lw r3,[sp]
FFFFFFFFFFFFDC18 47E20008 lw r4,8[sp]
FFFFFFFFFFFFDC1C 47E28010 lw r5,16[sp]
FFFFFFFFFFFFDC20 47E30018 lw r6,24[sp]
FFFFFFFFFFFFDC24 47E38020 lw r7,32[sp]
FFFFFFFFFFFFDC28 47E40028 lw r8,40[sp]
FFFFFFFFFFFFDC2C 47E48030 lw r9,48[sp]
FFFFFFFFFFFFDC30 47E50038 lw r10,56[sp]
FFFFFFFFFFFFDC34 37EF8040 ret #64
; Compute IPv4 checksum of header
; r1 = packet address
; r2 = data start
;
FFFFFFFFFFFFDC38 eth_checksum:
FFFFFFFFFFFFDC38 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFDC3C 67E18000 sw r3,[sp]
FFFFFFFFFFFFDC40 67E20008 sw r4,8[sp]
FFFFFFFFFFFFDC44 67E28010 sw r5,16[sp]
; set checksum to zero
FFFFFFFFFFFFDC48 60100018 sb r0,24[r1]
FFFFFFFFFFFFDC4C 60100019 sb r0,25[r1]
FFFFFFFFFFFFDC50 04318C0A xor r3,r3,r3 ; r3 = sum = zero
FFFFFFFFFFFFDC54 1602000E lw r4,#14
FFFFFFFFFFFFDC58 eth15:
FFFFFFFFFFFFDC58 02228009 mov r5,r2
FFFFFFFFFFFFDC5C 0E528001 subui r5,r5,#1 ; r5 = datastart - 1
FFFFFFFFFFFFDC60 BE428101 bge r4,r5,eth14
FFFFFFFFFFFFDC64 6A121405 lbu r5,[r1+r4] ; shi = [rx_addr+i]
FFFFFFFFFFFFDC68 6A121845 lbu r6,1[r1+r4] ; slo = [rx_addr+i+1]
FFFFFFFFFFFFDC6C 06529006 shlui r5,r5,#8
FFFFFFFFFFFFDC70 04531409 or r5,r5,r6 ; shilo
FFFFFFFFFFFFDC74 04328C03 addu r3,r3,r5 ; sum = sum + shilo
FFFFFFFFFFFFDC78 0A420002 addui r4,r4,#2 ; i = i + 2
FFFFFFFFFFFFDC7C BE007EEA bra eth15
FFFFFFFFFFFFDC80 eth14:
FFFFFFFFFFFFDC80 02328009 mov r5,r3 ; r5 = sum
FFFFFFFFFFFFDC84 1431FFFF andi r3,r3,#0xffff
FFFFFFFFFFFFDC88 0652A001 shrui r5,r5,#16
FFFFFFFFFFFFDC8C 04328C03 addu r3,r3,r5
FFFFFFFFFFFFDC90 02318004 com r3,r3
FFFFFFFFFFFFDC94 60118019 sb r3,25[r1] ; low byte
FFFFFFFFFFFFDC98 06319001 shrui r3,r3,#8
FFFFFFFFFFFFDC9C 60118018 sb r3,24[r1] ; high byte
FFFFFFFFFFFFDCA0 67E18000 sw r3,[sp]
FFFFFFFFFFFFDCA4 67E20008 sw r4,8[sp]
FFFFFFFFFFFFDCA8 67E28010 sw r5,16[sp]
FFFFFFFFFFFFDCAC 37EF8018 ret #24
; r1 = packet address
; returns r1 = 1 if this IP
;
FFFFFFFFFFFFDCB0 eth_verifyIP:
FFFFFFFFFFFFDCB0 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFDCB4 67E10000 sw r2,[sp]
FFFFFFFFFFFFDCB8 67E18008 sw r3,8[sp]
FFFFFFFFFFFFDCBC 67E20010 sw r4,16[sp]
FFFFFFFFFFFFDCC0 67E28018 sw r5,24[sp]
FFFFFFFFFFFFDCC4 4A11001E lbu r2,30[r1]
FFFFFFFFFFFFDCC8 4A11801F lbu r3,31[r1]
FFFFFFFFFFFFDCCC 4A120020 lbu r4,32[r1]
FFFFFFFFFFFFDCD0 4A128021 lbu r5,33[r1]
; Check for general broadcast
FFFFFFFFFFFFDCD4 E68000FF ; SETLO
FFFFFFFFFFFFDCD8 BE2D01A9 bnei r2,#0xFF,eth11
FFFFFFFFFFFFDCDC E68000FF ; SETLO
FFFFFFFFFFFFDCE0 BE3D0169 bnei r3,#0xFF,eth11
FFFFFFFFFFFFDCE4 E68000FF ; SETLO
FFFFFFFFFFFFDCE8 BE4D0129 bnei r4,#0xFF,eth11
FFFFFFFFFFFFDCEC E68000FF ; SETLO
FFFFFFFFFFFFDCF0 BE5D00E9 bnei r5,#0xFF,eth11
FFFFFFFFFFFFDCF4 eth12:
FFFFFFFFFFFFDCF4 16008001 lw r1,#1
FFFFFFFFFFFFDCF8 eth13:
FFFFFFFFFFFFDCF8 47E10000 lw r2,[sp]
FFFFFFFFFFFFDCFC 47E18008 lw r3,8[sp]
FFFFFFFFFFFFDD00 47E20010 lw r4,16[sp]
FFFFFFFFFFFFDD04 47E28018 lw r5,24[sp]
FFFFFFFFFFFFDD08 37EF8020 ret #32
FFFFFFFFFFFFDD0C eth11:
FFFFFFFFFFFFDD0C 02208009 mov r1,r2
FFFFFFFFFFFFDD10 06109006 shlui r1,r1,#8
FFFFFFFFFFFFDD14 04118409 or r1,r1,r3
FFFFFFFFFFFFDD18 06109006 shlui r1,r1,#8
FFFFFFFFFFFFDD1C 04120409 or r1,r1,r4
FFFFFFFFFFFFDD20 06109006 shlui r1,r1,#8
FFFFFFFFFFFFDD24 04128409 or r1,r1,r5
FFFFFFFFFFFFDD28 E6A8012A ; SETLO
FFFFFFFFFFFFDD2C EEBFFF02 ; SETMID
FFFFFFFFFFFFDD30 BE1D7E28 beqi r1,#0xC0A8012A,eth12
FFFFFFFFFFFFDD34 0410840A xor r1,r1,r1
FFFFFFFFFFFFDD38 BE007E0A bra eth13
FFFFFFFFFFFFDD3C eth_main:
FFFFFFFFFFFFDD3C 31FFF66F call eth_init
FFFFFFFFFFFFDD40 eth_loop:
FFFFFFFFFFFFDD40 0410840A xor r1,r1,r1
FFFFFFFFFFFFDD44 E6800000 ; SETLO
FFFFFFFFFFFFDD48 EE800400 ; SETMID
FFFFFFFFFFFFDD4C 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDD50 31FFF67D call eth_request_packet
FFFFFFFFFFFFDD54 31FFF69C call eth_interpret_packet ; r1 = packet type
FFFFFFFFFFFFDD58 B2102801 bnei r1,#1,eth10
FFFFFFFFFFFFDD5C 02110009 mov r2,r1 ; save off r1, r2 = packet type
FFFFFFFFFFFFDD60 E6800000 ; SETLO
FFFFFFFFFFFFDD64 EE800400 ; SETMID
FFFFFFFFFFFFDD68 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDD6C 31FFF72C call eth_verifyIP
FFFFFFFFFFFFDD70 02118009 mov r3,r1
FFFFFFFFFFFFDD74 02208009 mov r1,r2 ; r1 = packet type again
FFFFFFFFFFFFDD78 B2302001 bnei r3,#1,eth10
FFFFFFFFFFFFDD7C E6800000 ; SETLO
FFFFFFFFFFFFDD80 EE800400 ; SETMID
FFFFFFFFFFFFDD84 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDD88 16010001 lw r2,#1
FFFFFFFFFFFFDD8C 31FFF6C9 call eth_build_packet
FFFFFFFFFFFFDD90 02118009 mov r3,r1 ; r3 = icmpstart
FFFFFFFFFFFFDD94 E6800000 ; SETLO
FFFFFFFFFFFFDD98 EE800400 ; SETMID
FFFFFFFFFFFFDD9C 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDDA0 6A118010 sb r0,[r1+r3] ; [rx_addr+icmpstart] = 0
FFFFFFFFFFFFDDA4 4A110011 lbu r2,17[r1]
FFFFFFFFFFFFDDA8 0A21000E addui r2,r2,#14 ; r2 = len
FFFFFFFFFFFFDDAC 02230009 mov r6,r2 ; r6 = len
FFFFFFFFFFFFDDB0 6A119085 lbu r4,2[r1+r3] ; shi
FFFFFFFFFFFFDDB4 6A1194C5 lbu r5,3[r1+r3] ; slo
FFFFFFFFFFFFDDB8 06421006 shlui r4,r4,#8
FFFFFFFFFFFFDDBC 04429009 or r4,r4,r5 ; sum = {shi,slo};
FFFFFFFFFFFFDDC0 02420004 com r4,r4 ; sum = ~sum
FFFFFFFFFFFFDDC4 0E420800 subui r4,r4,#0x800 ; sum = sum - 0x800
FFFFFFFFFFFFDDC8 02420004 com r4,r4 ; sum = ~sum
FFFFFFFFFFFFDDCC 6A1190D0 sb r4,3[r1+r3]
FFFFFFFFFFFFDDD0 06421001 shrui r4,r4,#8
FFFFFFFFFFFFDDD4 6A119090 sb r4,2[r1+r3]
FFFFFFFFFFFFDDD8 02310009 mov r2,r3
FFFFFFFFFFFFDDDC 31FFF70E call eth_checksum
FFFFFFFFFFFFDDE0 E6800000 ; SETLO
FFFFFFFFFFFFDDE4 EE800400 ; SETMID
FFFFFFFFFFFFDDE8 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDDEC 02610009 mov r2,r6
FFFFFFFFFFFFDDF0 31FFF6B7 call eth_send_packet
FFFFFFFFFFFFDDF4 33FFF750 jmp eth_loop
FFFFFFFFFFFFDDF8 eth10:
; r2 = rx_addr
FFFFFFFFFFFFDDF8 B21FD202 bnei r1,#2,eth_loop ; Do we have ARP ?
; xor r2,r2,r2 ; memory address zero
FFFFFFFFFFFFDDFC E6B5E100 ; SETLO
FFFFFFFFFFFFDE00 EE800017 ; SETMID
FFFFFFFFFFFFDE04 040D0809 lw r2,#1_00000000
; get the opcode
FFFFFFFFFFFFDE08 4A268015 lbu r13,21[r2]
FFFFFFFFFFFFDE0C B2DFCD01 bnei r13,#1,eth_loop ; ARP request
; get destination IP address
FFFFFFFFFFFFDE10 4A248026 lbu r9,38[r2]
FFFFFFFFFFFFDE14 4A250027 lbu r10,39[r2]
FFFFFFFFFFFFDE18 4A258028 lbu r11,40[r2]
FFFFFFFFFFFFDE1C 4A260029 lbu r12,41[r2]
; set r15 = destination IP
FFFFFFFFFFFFDE20 02978009 mov r15,r9
FFFFFFFFFFFFDE24 06F79006 shlui r15,r15,#8
FFFFFFFFFFFFDE28 04F53C09 or r15,r15,r10
FFFFFFFFFFFFDE2C 06F79006 shlui r15,r15,#8
FFFFFFFFFFFFDE30 04F5BC09 or r15,r15,r11
FFFFFFFFFFFFDE34 06F79006 shlui r15,r15,#8
FFFFFFFFFFFFDE38 04F63C09 or r15,r15,r12
; Is it our IP ?
FFFFFFFFFFFFDE3C E6A8012A ; SETLO
FFFFFFFFFFFFDE40 EEBFFF02 ; SETMID
FFFFFFFFFFFFDE44 BEFD77E9 bnei r15,#0xC0A8012A,eth_loop; //192.168.1.42
; get source IP address
FFFFFFFFFFFFDE48 4A22801C lbu r5,28[r2]
FFFFFFFFFFFFDE4C 4A23001D lbu r6,29[r2]
FFFFFFFFFFFFDE50 4A23801E lbu r7,30[r2]
FFFFFFFFFFFFDE54 4A24001F lbu r8,31[r2]
; set r14 = source IP
FFFFFFFFFFFFDE58 02570009 mov r14,r5
FFFFFFFFFFFFDE5C 06E71006 shlui r14,r14,#8
FFFFFFFFFFFFDE60 04E33809 or r14,r14,r6
FFFFFFFFFFFFDE64 06E71006 shlui r14,r14,#8
FFFFFFFFFFFFDE68 04E3B809 or r14,r14,r7
FFFFFFFFFFFFDE6C 06E71006 shlui r14,r14,#8
FFFFFFFFFFFFDE70 04E43809 or r14,r14,r8
; Get the source MAC address
FFFFFFFFFFFFDE74 4A280016 lbu r16,22[r2]
FFFFFFFFFFFFDE78 4A288017 lbu r17,23[r2]
FFFFFFFFFFFFDE7C 4A290018 lbu r18,24[r2]
FFFFFFFFFFFFDE80 4A298019 lbu r19,25[r2]
FFFFFFFFFFFFDE84 4A2A001A lbu r20,26[r2]
FFFFFFFFFFFFDE88 4A2A801B lbu r21,27[r2]
; write to destination header
FFFFFFFFFFFFDE8C 60280000 sb r16,[r2]
FFFFFFFFFFFFDE90 60288001 sb r17,1[r2]
FFFFFFFFFFFFDE94 60290002 sb r18,2[r2]
FFFFFFFFFFFFDE98 60298003 sb r19,3[r2]
FFFFFFFFFFFFDE9C 602A0004 sb r20,4[r2]
FFFFFFFFFFFFDEA0 602A8005 sb r21,5[r2]
; and write to ARP destination
FFFFFFFFFFFFDEA4 60280020 sb r16,32[r2]
FFFFFFFFFFFFDEA8 60288021 sb r17,33[r2]
FFFFFFFFFFFFDEAC 60290022 sb r18,34[r2]
FFFFFFFFFFFFDEB0 60298023 sb r19,35[r2]
FFFFFFFFFFFFDEB4 602A0024 sb r20,36[r2]
FFFFFFFFFFFFDEB8 602A8025 sb r21,37[r2]
; write to source header
; stbc #0x00,6[r2]
; stbc #0xFF,7[r2]
; stbc #0xEE,8[r2]
; stbc #0xF0,9[r2]
; stbc #0xDA,10[r2]
; stbc #0x42,11[r2]
FFFFFFFFFFFFDEBC 60200006 sb r0,6[r2]
FFFFFFFFFFFFDEC0 160080FF lw r1,#0xFF
FFFFFFFFFFFFDEC4 60208007 sb r1,7[r2]
FFFFFFFFFFFFDEC8 160080EE lw r1,#0xEE
FFFFFFFFFFFFDECC 60208008 sb r1,8[r2]
FFFFFFFFFFFFDED0 160080F0 lw r1,#0xF0
FFFFFFFFFFFFDED4 60208009 sb r1,9[r2]
FFFFFFFFFFFFDED8 160080DA lw r1,#0xDA
FFFFFFFFFFFFDEDC 6020800A sb r1,10[r2]
FFFFFFFFFFFFDEE0 16008042 lw r1,#0x42
FFFFFFFFFFFFDEE4 6020800B sb r1,11[r2]
; write to ARP source
; stbc #0x00,22[r2]
; stbc #0xFF,23[r2]
; stbc #0xEE,24[r2]
; stbc #0xF0,25[r2]
; stbc #0xDA,26[r2]
; stbc #0x42,27[r2]
FFFFFFFFFFFFDEE8 60200016 sb r0,22[r2]
FFFFFFFFFFFFDEEC 160080FF lw r1,#0xFF
FFFFFFFFFFFFDEF0 60208017 sb r1,23[r2]
FFFFFFFFFFFFDEF4 160080EE lw r1,#0xEE
FFFFFFFFFFFFDEF8 60208018 sb r1,24[r2]
FFFFFFFFFFFFDEFC 160080F0 lw r1,#0xF0
FFFFFFFFFFFFDF00 60208019 sb r1,25[r2]
FFFFFFFFFFFFDF04 160080DA lw r1,#0xDA
FFFFFFFFFFFFDF08 6020801A sb r1,26[r2]
FFFFFFFFFFFFDF0C 16008042 lw r1,#0x42
FFFFFFFFFFFFDF10 6020801B sb r1,27[r2]
; swap sender / destination IP
; write sender
FFFFFFFFFFFFDF14 6024801C sb r9,28[r2]
FFFFFFFFFFFFDF18 6025001D sb r10,29[r2]
FFFFFFFFFFFFDF1C 6025801E sb r11,30[r2]
FFFFFFFFFFFFDF20 6026001F sb r12,31[r2]
; write destination
FFFFFFFFFFFFDF24 60228026 sb r5,38[r2]
FFFFFFFFFFFFDF28 60230027 sb r6,39[r2]
FFFFFFFFFFFFDF2C 60238028 sb r7,40[r2]
FFFFFFFFFFFFDF30 60240029 sb r8,41[r2]
; change request to reply
; stbc #2,21[r2]
FFFFFFFFFFFFDF34 16008002 lw r1,#2
FFFFFFFFFFFFDF38 60208015 sb r1,21[r2]
FFFFFFFFFFFFDF3C 02208009 mov r1,r2 ; r1 = packet address
FFFFFFFFFFFFDF40 1601002A lw r2,#0x2A ; r2 = packet length
FFFFFFFFFFFFDF44 31FFF6B7 call eth_send_packet
FFFFFFFFFFFFDF48 33FFF750 jmp eth_loop
;==============================================================================
;==============================================================================
;****************************************************************;
; ;
; Tiny BASIC for the Raptor64 ;
; ;
; Derived from a 68000 derivative of Palo Alto Tiny BASIC as ;
; published in the May 1976 issue of Dr. Dobb's Journal. ;
; Adapted to the 68000 by: ;
; Gordon brndly ;
; 12147 - 51 Street ;
; Edmonton AB T5W 3G8 ;
; Canada ;
; (updated mailing address for 1996) ;
; ;
; Adapted to the Raptor64 by: ;
; Robert Finch ;
; Ontario, Canada ;
; robfinch<remove>@opencores.org ;
;****************************************************************;
; Copyright (C) 2012 by Robert Finch. This program may be ;
; freely distributed for personal use only. All commercial ;
; rights are reserved. ;
;****************************************************************;
;
; Register Usage
; r8 = text pointer (global usage)
; r3,r4 = inputs parameters to subroutines
; r2 = return value
;
;* Vers. 1.0 1984/7/17 - Original version by Gordon brndly
;* 1.1 1984/12/9 - Addition of '0x' print term by Marvin Lipford
;* 1.2 1985/4/9 - Bug fix in multiply routine by Rick Murray
;
; Standard jump table. You can change these addresses if you are
; customizing this interpreter for a different environment.
;
FFFFFFFFFFFFDF4C GOSTART:
FFFFFFFFFFFFDF4C 33FFF7E0 jmp CSTART ; Cold Start entry point
FFFFFFFFFFFFDF50 GOWARM:
FFFFFFFFFFFFDF50 33FFF801 jmp WSTART ; Warm Start entry point
FFFFFFFFFFFFDF54 GOOUT:
FFFFFFFFFFFFDF54 33FFFD9B jmp OUTC ; Jump to character-out routine
FFFFFFFFFFFFDF58 GOIN:
FFFFFFFFFFFFDF58 33FFFD9C jmp INC ;Jump to character-in routine
FFFFFFFFFFFFDF5C GOAUXO:
FFFFFFFFFFFFDF5C 33FFFDA3 jmp AUXOUT ; Jump to auxiliary-out routine
FFFFFFFFFFFFDF60 GOAUXI:
FFFFFFFFFFFFDF60 33FFFD9D jmp AUXIN ; Jump to auxiliary-in routine
FFFFFFFFFFFFDF64 GOBYE:
FFFFFFFFFFFFDF64 33FFFE28 jmp BYEBYE ; Jump to monitor, DOS, etc.
;
; Modifiable system constants:
;
FFFFFFFFFFFFDF68 align 8
FFFFFFFFFFFFDF68 0000000010060000 TXTBGN dw 0x000000001_00600000 ;TXT ;beginning of program memory
FFFFFFFFFFFFDF70 00000000107FFFF8 ENDMEM dw 0x000000001_07FFFFF8 ; end of available memory
;
; The main interpreter starts here:
;
; Usage
; r1 = temp
; r8 = text buffer pointer
; r12 = end of text in text buffer
;
FFFFFFFFFFFFDF78 0000000000000000 align 16
FFFFFFFFFFFFDF80 align 16
FFFFFFFFFFFFDF80 CSTART:
; First save off the link register and OS sp value
FFFFFFFFFFFFDF80 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFDF84 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDF88 660F1088 sw sp,OSSP
FFFFFFFFFFFFDF8C 460F5F70 lw sp,ENDMEM ; initialize stack pointer
FFFFFFFFFFFFDF90 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFDF94 67EF8000 sw lr,[sp] ; save off return address
FFFFFFFFFFFFDF98 60001417 sb r0,CursorRow ; set screen output
FFFFFFFFFFFFDF9C 60001418 sb r0,CursorCol
FFFFFFFFFFFFDFA0 6000141A sb r0,CursorFlash
FFFFFFFFFFFFDFA4 6400104C sh r0,pos
FFFFFFFFFFFFDFA8 E6800020 ; SETLO
FFFFFFFFFFFFDFAC EE800040 ; SETMID
FFFFFFFFFFFFDFB0 040D0809 lw r2,#0x10000020 ; black chars, yellow background
; sh r2,charToPrint
FFFFFFFFFFFFDFB4 31FFF011 call ClearScreen
FFFFFFFFFFFFDFB8 9A00F6B8 lea r1,msgInit ; tell who we are
; call PRMESGAUX
FFFFFFFFFFFFDFBC 9A00F6B8 lea r1,msgInit ; tell who we are
FFFFFFFFFFFFDFC0 31FFFD81 call PRMESG
FFFFFFFFFFFFDFC4 4600DF68 lw r1,TXTBGN ; init. end-of-program pointer
FFFFFFFFFFFFDFC8 660090D0 sw r1,TXTUNF
FFFFFFFFFFFFDFCC 4600DF70 lw r1,ENDMEM ; get address of end of memory
FFFFFFFFFFFFDFD0 0E109000 subui r1,r1,#4096 ; reserve 4K for the stack
FFFFFFFFFFFFDFD4 660090F8 sw r1,STKBOT
FFFFFFFFFFFFDFD8 E6804000 ; SETLO
FFFFFFFFFFFFDFDC 041D0405 subui r1,r1,#16384 ; 1000 vars
FFFFFFFFFFFFDFE0 660090D8 sw r1,VARBGN
FFFFFFFFFFFFDFE4 31FFF905 call clearVars ; clear the variable area
FFFFFFFFFFFFDFE8 460090D8 lw r1,VARBGN ; calculate number of bytes free
FFFFFFFFFFFFDFEC 460190D0 lw r3,TXTUNF
FFFFFFFFFFFFDFF0 04118405 subu r1,r1,r3
FFFFFFFFFFFFDFF4 E0800000 setlo r2,#0
FFFFFFFFFFFFDFF8 31FFFCCC call PRTNUM
FFFFFFFFFFFFDFFC 9A00F760 lea r1,msgBytesFree
FFFFFFFFFFFFE000 31FFFD81 call PRMESG
FFFFFFFFFFFFE004 WSTART:
FFFFFFFFFFFFE004 660010A8 sw r0,LOPVAR ; initialize internal variables
FFFFFFFFFFFFE008 66001098 sw r0,STKGOS
FFFFFFFFFFFFE00C 66001090 sw r0,CURRNT ; current line number pointer = 0
FFFFFFFFFFFFE010 460F5F70 lw sp,ENDMEM ; init S.P. again, just in case
FFFFFFFFFFFFE014 9A00F76E lea r1,msgReady ; display "Ready"
FFFFFFFFFFFFE018 31FFFD81 call PRMESG
FFFFFFFFFFFFE01C ST3:
FFFFFFFFFFFFE01C E040003E setlo r1,#'>' ; Prompt with a '>' and
FFFFFFFFFFFFE020 31FFFC1A call GETLN ; read a line.
FFFFFFFFFFFFE024 31FFFD5E call TOUPBUF ; convert to upper case
FFFFFFFFFFFFE028 02860009 mov r12,r8 ; save pointer to end of line
FFFFFFFFFFFFE02C 9A04111B lea r8,BUFFER ; point to the beginning of line
FFFFFFFFFFFFE030 31FFFD3E call TSTNUM ; is there a number there?
FFFFFFFFFFFFE034 31FFFD55 call IGNBLK ; skip trailing blanks
; does line no. exist? (or nonzero?)
FFFFFFFFFFFFE038 BE101708 beq r1,r0,DIRECT ; if not, it's a direct statement
FFFFFFFFFFFFE03C AC1003FF bleu r1,#0xFFFF,ST2 ; see if line no. is <= 16 bits
FFFFFFFFFFFFE040 9A00F78C lea r1,msgLineRange ; if not, we've overflowed
FFFFFFFFFFFFE044 BE007F2A bra ERROR
FFFFFFFFFFFFE048 ST2:
; ugliness - store a character at potentially an
; odd address (unaligned).
FFFFFFFFFFFFE048 02110009 mov r2,r1 ; r2 = line number
FFFFFFFFFFFFE04C 60817FFE sb r2,-2[r8]
FFFFFFFFFFFFE050 06211001 shrui r2,r2,#8
FFFFFFFFFFFFE054 60817FFF sb r2,-1[r8] ; store the binary line no.
FFFFFFFFFFFFE058 0E840002 subui r8,r8,#2
FFFFFFFFFFFFE05C 31FFFC4E call FNDLN ; find this line in save area
FFFFFFFFFFFFE060 02968009 mov r13,r9 ; save possible line pointer
FFFFFFFFFFFFE064 BE1001C8 beq r1,r0,ST4 ; if not found, insert
; here we found the line, so we're replacing the line
; in the text area
; first step - delete the line
FFFFFFFFFFFFE068 E0400000 setlo r1,#0
FFFFFFFFFFFFE06C 31FFFC62 call FNDNXT ; find the next line (into r9)
FFFFFFFFFFFFE070 BE100049 bne r1,r0,ST7
FFFFFFFFFFFFE074 BE900108 beq r9,r0,ST6 ; no more lines
FFFFFFFFFFFFE078 ST7:
FFFFFFFFFFFFE078 02908009 mov r1,r9 ; r1 = pointer to next line
FFFFFFFFFFFFE07C 02D10009 mov r2,r13 ; pointer to line to be deleted
FFFFFFFFFFFFE080 460190D0 lw r3,TXTUNF ; points to top of save area
FFFFFFFFFFFFE084 31FFFC6B call MVUP ; move up to delete
FFFFFFFFFFFFE088 660110D0 sw r2,TXTUNF ; update the end pointer
; we moved the lines of text after the line being
; deleted down, so the pointer to the next line
; needs to be reset
FFFFFFFFFFFFE08C 02D48009 mov r9,r13
FFFFFFFFFFFFE090 BE00006A bra ST4
; here there were no more lines, so just move the
; end of text pointer down
FFFFFFFFFFFFE094 ST6:
FFFFFFFFFFFFE094 660690D0 sw r13,TXTUNF
FFFFFFFFFFFFE098 02D48009 mov r9,r13
FFFFFFFFFFFFE09C ST4:
; here we're inserting because the line wasn't found
; or it was deleted from the text area
FFFFFFFFFFFFE09C 02C08009 mov r1,r12 ; calculate the length of new line
FFFFFFFFFFFFE0A0 04140404 sub r1,r1,r8
FFFFFFFFFFFFE0A4 A41FDE03 blei r1,#3,ST3 ; is it just a line no. & CR? if so, it was just a delete
FFFFFFFFFFFFE0A8 460590D0 lw r11,TXTUNF ; compute new end of text
FFFFFFFFFFFFE0AC 02B50009 mov r10,r11 ; r10 = old TXTUNF
FFFFFFFFFFFFE0B0 04B0AC02 add r11,r11,r1 ; r11 = new top of TXTUNF (r1=line length)
FFFFFFFFFFFFE0B4 460090D8 lw r1,VARBGN ; see if there's enough room
FFFFFFFFFFFFE0B8 BEB08064 bltu r11,r1,ST5
FFFFFFFFFFFFE0BC 9A00F867 lea r1,msgTooBig ; if not, say so
FFFFFFFFFFFFE0C0 33FFFC0A jmp ERROR
; open a space in the text area
FFFFFFFFFFFFE0C4 ST5:
FFFFFFFFFFFFE0C4 660590D0 sw r11,TXTUNF ; if so, store new end position
FFFFFFFFFFFFE0C8 02A08009 mov r1,r10 ; points to old end of text
FFFFFFFFFFFFE0CC 02B10009 mov r2,r11 ; points to new end of text
FFFFFFFFFFFFE0D0 02918009 mov r3,r9 ; points to start of line after insert line
FFFFFFFFFFFFE0D4 31FFFC71 call MVDOWN ; move things out of the way
; copy line into text space
FFFFFFFFFFFFE0D8 02808009 mov r1,r8 ; set up to do the insertion; move from buffer
FFFFFFFFFFFFE0DC 02D10009 mov r2,r13 ; to vacated space
FFFFFFFFFFFFE0E0 02C18009 mov r3,r12 ; until end of buffer
FFFFFFFFFFFFE0E4 31FFFC6B call MVUP ; do it
FFFFFFFFFFFFE0E8 BE0079AA bra ST3 ; go back and get another line
;******************************************************************
;
; *** Tables *** DIRECT *** EXEC ***
;
; This section of the code tests a string against a table. When
; a match is found, control is transferred to the section of
; code according to the table.
;
; At 'EXEC', r8 should point to the string, r9 should point to
; the character table, and r10 should point to the execution
; table. At 'DIRECT', r8 should point to the string, r9 and
; r10 will be set up to point to TAB1 and TAB1_1, which are
; the tables of all direct and statement commands.
;
; A '.' in the string will terminate the test and the partial
; match will be considered as a match, e.g. 'P.', 'PR.','PRI.',
; 'PRIN.', or 'PRINT' will all match 'PRINT'.
;
; There are two tables: the character table and the execution
; table. The character table consists of any number of text items.
; Each item is a string of characters with the last character's
; high bit set to one. The execution table holds a 32-bit
; execution addresses that correspond to each entry in the
; character table.
;
; The end of the character table is a 0 byte which corresponds
; to the default routine in the execution table, which is
; executed if none of the other table items are matched.
;
; Character-matching tables:
FFFFFFFFFFFFE0EC TAB1:
FFFFFFFFFFFFE0E8 D453494CBE0079AA db "LIS",'T'+0x80 ; Direct commands
FFFFFFFFFFFFE0F0 52D7454EC4414F4C db "RU",'N'+0x80
FFFFFFFFFFFFE0FE TAB2:
FFFFFFFFFFFFE0F8 454EC5564153CE55 db "NEX",'T'+0x80 ; Direct / statement
FFFFFFFFFFFFE100 47C649D4454CD458 db "GOT",'O'+0x80
FFFFFFFFFFFFE108 C255534F47CF544F db "GOSU",'B'+0x80
FFFFFFFFFFFFE110 4552CE5255544552 db "RE",'M'+0x80
FFFFFFFFFFFFE118 55504E49D24F46CD db "INPU",'T'+0x80
FFFFFFFFFFFFE120 4F50D44E495250D4 db "POKE",'C'+0x80
FFFFFFFFFFFFE128 C8454B4F50C3454B db "POKE",'H'+0x80
FFFFFFFFFFFFE130 4B4F50D7454B4F50 db "POK",'E'+0x80
FFFFFFFFFFFFE138 C55942D04F5453C5 db "BY",'E'+0x80
FFFFFFFFFFFFE140 4C43D34C43D35953 db "CL",'R'+0x80
FFFFFFFFFFFFE14E TAB4:
FFFFFFFFFFFFE148 455000C6434452D2 db "PEEK",'C'+0x80 ;Functions
FFFFFFFFFFFFE150 C84B454550C34B45 db "PEEK",'H'+0x80 ;Functions
FFFFFFFFFFFFE158 454550D74B454550 db "PEE",'K'+0x80 ;Functions
FFFFFFFFFFFFE160 53D34241C44E52CB db "SIZ",'E'+0x80
FFFFFFFFFFFFE16F TAB5:
FFFFFFFFFFFFE168 5400D25355C55A49 db "T",'O'+0x80 ;"TO" in "FOR"
FFFFFFFFFFFFE172 TAB6:
FFFFFFFFFFFFE177 TAB8:
FFFFFFFFFFFFE170 3E00D045545300CF db '>','='+0x80 ;Relational operators
FFFFFFFFFFFFE178 BCBD3CBDBEBE3CBD db '<'+0x80
FFFFFFFFFFFFE181 TAB9:
FFFFFFFFFFFFE185 TAB10:
FFFFFFFFFFFFE180 00D24F00C44E4100 db 0
FFFFFFFFFFFFE188 .align 8
;* Execution address tables:
FFFFFFFFFFFFE188 TAB1_1:
FFFFFFFFFFFFE188 FFFFFFFFFFFFE440 dw LISTX ;Direct commands
FFFFFFFFFFFFE190 FFFFFFFFFFFFE784 dw LOAD
FFFFFFFFFFFFE198 FFFFFFFFFFFFE38C dw NEW
FFFFFFFFFFFFE1A0 FFFFFFFFFFFFE3A4 dw RUN
FFFFFFFFFFFFE1A8 FFFFFFFFFFFFE830 dw SAVE
FFFFFFFFFFFFE1B0 TAB2_1:
FFFFFFFFFFFFE1B0 FFFFFFFFFFFFE610 dw NEXT ; Direct / statement
FFFFFFFFFFFFE1B8 FFFFFFFFFFFFE76C dw LET
FFFFFFFFFFFFE1C0 FFFFFFFFFFFFE680 dw IF
FFFFFFFFFFFFE1C8 FFFFFFFFFFFFE3EC dw GOTO
FFFFFFFFFFFFE1D0 FFFFFFFFFFFFE520 dw GOSUB
FFFFFFFFFFFFE1D8 FFFFFFFFFFFFE55C dw RETURN
FFFFFFFFFFFFE1E0 FFFFFFFFFFFFE688 dw IF2 ; REM
FFFFFFFFFFFFE1E8 FFFFFFFFFFFFE594 dw FOR
FFFFFFFFFFFFE1F0 FFFFFFFFFFFFE6B0 dw INPUT
FFFFFFFFFFFFE1F8 FFFFFFFFFFFFE488 dw PRINT
FFFFFFFFFFFFE200 FFFFFFFFFFFFE944 dw POKEC
FFFFFFFFFFFFE208 FFFFFFFFFFFFE970 dw POKEH
FFFFFFFFFFFFE210 FFFFFFFFFFFFE99C dw POKEW
FFFFFFFFFFFFE218 FFFFFFFFFFFFE910 dw POKE
FFFFFFFFFFFFE220 FFFFFFFFFFFFE39C dw STOP
FFFFFFFFFFFFE228 FFFFFFFFFFFFDF64 dw GOBYE
FFFFFFFFFFFFE230 FFFFFFFFFFFFE9C8 dw SYSX
FFFFFFFFFFFFE238 FFFFFFFFFFFFF690 dw _cls
FFFFFFFFFFFFE240 FFFFFFFFFFFFE40C dw _clr
FFFFFFFFFFFFE248 FFFFFFFFFFFFF6A4 dw _rdcf
FFFFFFFFFFFFE250 FFFFFFFFFFFFE764 dw DEFLT
FFFFFFFFFFFFE258 TAB4_1:
FFFFFFFFFFFFE258 FFFFFFFFFFFFEE44 dw PEEKC
FFFFFFFFFFFFE260 FFFFFFFFFFFFEE58 dw PEEKH
FFFFFFFFFFFFE268 FFFFFFFFFFFFEE6C dw PEEKW
FFFFFFFFFFFFE270 FFFFFFFFFFFFEE34 dw PEEK ;Functions
FFFFFFFFFFFFE278 FFFFFFFFFFFFEE9C dw RND
FFFFFFFFFFFFE280 FFFFFFFFFFFFEF34 dw ABS
FFFFFFFFFFFFE288 FFFFFFFFFFFFEF54 dw SIZEX
FFFFFFFFFFFFE290 FFFFFFFFFFFFEE80 dw USRX
FFFFFFFFFFFFE298 FFFFFFFFFFFFEC58 dw XP40
FFFFFFFFFFFFE2A0 TAB5_1
FFFFFFFFFFFFE2A0 FFFFFFFFFFFFE5AC dw FR1 ;"TO" in "FOR"
FFFFFFFFFFFFE2A8 FFFFFFFFFFFFF024 dw QWHAT
FFFFFFFFFFFFE2B0 TAB6_1
FFFFFFFFFFFFE2B0 FFFFFFFFFFFFE5C0 dw FR2 ;"STEP" in "FOR"
FFFFFFFFFFFFE2B8 FFFFFFFFFFFFE5C8 dw FR3
FFFFFFFFFFFFE2C0 TAB8_1
FFFFFFFFFFFFE2C0 FFFFFFFFFFFFEAD8 dw XP11 ;>= Relational operators
FFFFFFFFFFFFE2C8 FFFFFFFFFFFFEAE8 dw XP12 ;<>
FFFFFFFFFFFFE2D0 FFFFFFFFFFFFEAF8 dw XP13 ;>
FFFFFFFFFFFFE2D8 FFFFFFFFFFFFEB18 dw XP15 ;=
FFFFFFFFFFFFE2E0 FFFFFFFFFFFFEB08 dw XP14 ;<=
FFFFFFFFFFFFE2E8 FFFFFFFFFFFFEB28 dw XP16 ;<
FFFFFFFFFFFFE2F0 FFFFFFFFFFFFEB50 dw XP17
FFFFFFFFFFFFE2F8 TAB9_1
FFFFFFFFFFFFE2F8 FFFFFFFFFFFFEA44 dw XP_AND
FFFFFFFFFFFFE300 FFFFFFFFFFFFEA54 dw XP_ANDX
FFFFFFFFFFFFE308 TAB10_1
FFFFFFFFFFFFE308 FFFFFFFFFFFFEA0C dw XP_OR
FFFFFFFFFFFFE310 FFFFFFFFFFFFEA1C dw XP_ORX
FFFFFFFFFFFFE318 .align 4
;*
; r3 = match flag (trashed)
; r9 = text table
; r10 = exec table
; r11 = trashed
FFFFFFFFFFFFE318 DIRECT:
FFFFFFFFFFFFE318 9A04E0EC lea r9,TAB1
FFFFFFFFFFFFE31C 9A056188 lea r10,TAB1_1
FFFFFFFFFFFFE320 EXEC:
FFFFFFFFFFFFE320 03F58009 mov r11,lr ; save link reg
FFFFFFFFFFFFE324 31FFFD55 call IGNBLK ; ignore leading blanks
FFFFFFFFFFFFE328 02BF8009 mov lr,r11 ; restore link reg
FFFFFFFFFFFFE32C 02858009 mov r11,r8 ; save the pointer
FFFFFFFFFFFFE330 E0C00000 setlo r3,#0 ; clear match flag
FFFFFFFFFFFFE334 EXLP:
FFFFFFFFFFFFE334 4A808000 lbu r1,[r8] ; get the program character
FFFFFFFFFFFFE338 0A840001 addui r8,r8,#1
FFFFFFFFFFFFE33C 4A910000 lbu r2,[r9] ; get the table character
FFFFFFFFFFFFE340 BE200069 bne r2,r0,EXNGO ; If end of table,
FFFFFFFFFFFFE344 02B40009 mov r8,r11 ; restore the text pointer and...
FFFFFFFFFFFFE348 BE0001EA bra EXGO ; execute the default.
FFFFFFFFFFFFE34C EXNGO:
FFFFFFFFFFFFE34C BE1181C8 beq r1,r3,EXGO ; Else check for period... if so, execute
FFFFFFFFFFFFE350 1421007F andi r2,r2,#0x7f ; ignore the table's high bit
FFFFFFFFFFFFE354 BE208108 beq r2,r1,EXMAT; is there a match?
FFFFFFFFFFFFE358 0AA50008 addui r10,r10,#8 ;if not, try the next entry
FFFFFFFFFFFFE35C 02B40009 mov r8,r11 ; reset the program pointer
FFFFFFFFFFFFE360 E0C00000 setlo r3,#0 ; sorry, no match
FFFFFFFFFFFFE364 EX1:
FFFFFFFFFFFFE364 0A948001 addui r9,r9,#1
FFFFFFFFFFFFE368 4090FFFF lb r1,-1[r9] ; get to the end of the entry
FFFFFFFFFFFFE36C BE107FC3 bgt r1,r0,EX1
FFFFFFFFFFFFE370 BE007E2A bra EXLP ; back for more matching
FFFFFFFFFFFFE374 EXMAT:
FFFFFFFFFFFFE374 E0C0002E setlo r3,#'.' ; we've got a match so far
FFFFFFFFFFFFE378 0A948001 addui r9,r9,#1
FFFFFFFFFFFFE37C 4090FFFF lb r1,-1[r9] ; end of table entry?
FFFFFFFFFFFFE380 BE107DA3 bgt r1,r0,EXLP ; if not, go back for more
FFFFFFFFFFFFE384 EXGO:
FFFFFFFFFFFFE384 46A58000 lw r11,[r10] ; execute the appropriate routine
FFFFFFFFFFFFE388 34B00000 jal r0,[r11]
; lb r1,[r8] ; get token from text space
; bpl
; and r1,#0x7f
; shl r1,#2 ; * 4 - word offset
; add r1,r1,#TAB1_1
; lw r1,[r1]
; jmp [r1]
;******************************************************************
;
; What follows is the code to execute direct and statement
; commands. Control is transferred to these points via the command
; table lookup code of 'DIRECT' and 'EXEC' in the last section.
; After the command is executed, control is transferred to other
; sections as follows:
;
; For 'LISTX', 'NEW', and 'STOP': go back to the warm start point.
; For 'RUN': go execute the first stored line if any; else go
; back to the warm start point.
; For 'GOTO' and 'GOSUB': go execute the target line.
; For 'RETURN' and 'NEXT'; go back to saved return line.
; For all others: if 'CURRNT' is 0, go to warm start; else go
; execute next command. (This is done in 'FINISH'.)
;
;******************************************************************
;
; *** NEW *** STOP *** RUN (& friends) *** GOTO ***
;
; 'NEW<CR>' sets TXTUNF to point to TXTBGN
;
; 'STOP<CR>' goes back to WSTART
;
; 'RUN<CR>' finds the first stored line, stores its address
; in CURRNT, and starts executing it. Note that only those
; commands in TAB2 are legal for a stored program.
;
; There are 3 more entries in 'RUN':
; 'RUNNXL' finds next line, stores it's address and executes it.
; 'RUNTSL' stores the address of this line and executes it.
; 'RUNSML' continues the execution on same line.
;
; 'GOTO expr<CR>' evaluates the expression, finds the target
; line, and jumps to 'RUNTSL' to do it.
;
FFFFFFFFFFFFE38C NEW:
FFFFFFFFFFFFE38C 31FFFBFB call ENDCHK
FFFFFFFFFFFFE390 4600DF68 lw r1,TXTBGN
FFFFFFFFFFFFE394 660090D0 sw r1,TXTUNF ; set the end pointer
FFFFFFFFFFFFE398 31FFF905 call clearVars
FFFFFFFFFFFFE39C STOP:
FFFFFFFFFFFFE39C 31FFFBFB call ENDCHK
FFFFFFFFFFFFE3A0 BE00632A bra WSTART ; WSTART will reset the stack
FFFFFFFFFFFFE3A4 RUN:
FFFFFFFFFFFFE3A4 31FFFBFB call ENDCHK
FFFFFFFFFFFFE3A8 46045F68 lw r8,TXTBGN ; set pointer to beginning
FFFFFFFFFFFFE3AC 66041090 sw r8,CURRNT
FFFFFFFFFFFFE3B0 31FFF905 call clearVars
FFFFFFFFFFFFE3B4 RUNNXL: ; RUN <next line>
FFFFFFFFFFFFE3B4 46009090 lw r1,CURRNT ; executing a program?
FFFFFFFFFFFFE3B8 BE106268 beq r1,r0,WSTART ; if not, we've finished a direct stat.
FFFFFFFFFFFFE3BC E0400000 setlo r1,#0 ; else find the next line number
FFFFFFFFFFFFE3C0 02848009 mov r9,r8
FFFFFFFFFFFFE3C4 31FFFC52 call FNDLNP ; search for the next line
FFFFFFFFFFFFE3C8 BE100069 bne r1,r0,RUNTSL
FFFFFFFFFFFFE3CC BE900049 bne r9,r0,RUNTSL
FFFFFFFFFFFFE3D0 BE0061AA bra WSTART ; if we've fallen off the end, stop
FFFFFFFFFFFFE3D4 RUNTSL: ; RUN <this line>
FFFFFFFFFFFFE3D4 66049090 sw r9,CURRNT ; set CURRNT to point to the line no.
FFFFFFFFFFFFE3D8 9A940002 lea r8,2[r9] ; set the text pointer to
FFFFFFFFFFFFE3DC RUNSML: ; RUN <same line>
FFFFFFFFFFFFE3DC 31FFFD77 call CHKIO ; see if a control-C was pressed
FFFFFFFFFFFFE3E0 9A04E0FE lea r9,TAB2 ; find command in TAB2
FFFFFFFFFFFFE3E4 9A0561B0 lea r10,TAB2_1
FFFFFFFFFFFFE3E8 BE0079CA bra EXEC ; and execute it
FFFFFFFFFFFFE3EC GOTO:
FFFFFFFFFFFFE3EC 31FFFA7C call OREXPR ;evaluate the following expression
FFFFFFFFFFFFE3F0 02128009 mov r5,r1
FFFFFFFFFFFFE3F4 31FFFBFB call ENDCHK ;must find end of line
FFFFFFFFFFFFE3F8 02508009 mov r1,r5
FFFFFFFFFFFFE3FC 31FFFC4E call FNDLN ; find the target line
FFFFFFFFFFFFE400 BE107EA9 bne r1,r0,RUNTSL ; go do it
FFFFFFFFFFFFE404 9A00F833 lea r1,msgBadGotoGosub
FFFFFFFFFFFFE408 BE00610A bra ERROR ; no such line no.
FFFFFFFFFFFFE40C _clr:
FFFFFFFFFFFFE40C 31FFF905 call clearVars
FFFFFFFFFFFFE410 BE00084A bra FINISH
; Clear the variable area of memory
FFFFFFFFFFFFE414 clearVars:
FFFFFFFFFFFFE414 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFE418 67E30000 sw r6,[sp]
FFFFFFFFFFFFE41C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFE420 E1800800 setlo r6,#2048 ; number of words to clear
FFFFFFFFFFFFE424 460090D8 lw r1,VARBGN
FFFFFFFFFFFFE428 cv1:
FFFFFFFFFFFFE428 66100000 sw r0,[r1]
FFFFFFFFFFFFE42C 08108008 add r1,r1,#8
FFFFFFFFFFFFE430 BE037FCF loop r6,cv1
FFFFFFFFFFFFE434 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFE438 47E30000 lw r6,[sp]
FFFFFFFFFFFFE43C 37EF8010 ret #16
;******************************************************************
; LIST
;
; LISTX has two forms:
; 'LIST<CR>' lists all saved lines
; 'LIST #<CR>' starts listing at the line #
; Control-S pauses the listing, control-C stops it.
;******************************************************************
;
FFFFFFFFFFFFE440 LISTX:
FFFFFFFFFFFFE440 31FFFD3E call TSTNUM ; see if there's a line no.
FFFFFFFFFFFFE444 02128009 mov r5,r1
FFFFFFFFFFFFE448 31FFFBFB call ENDCHK ; if not, we get a zero
FFFFFFFFFFFFE44C 02508009 mov r1,r5
FFFFFFFFFFFFE450 31FFFC4E call FNDLN ; find this or next line
FFFFFFFFFFFFE454 LS1:
FFFFFFFFFFFFE454 BE100049 bne r1,r0,LS4
FFFFFFFFFFFFE458 BE905D68 beq r9,r0,WSTART ; warm start if we passed the end
FFFFFFFFFFFFE45C LS4:
FFFFFFFFFFFFE45C 02908009 mov r1,r9
FFFFFFFFFFFFE460 31FFFD1E call PRTLN ; print the line
FFFFFFFFFFFFE464 02148009 mov r9,r1 ; set pointer for next
FFFFFFFFFFFFE468 31FFFD77 call CHKIO ; check for listing halt request
FFFFFFFFFFFFE46C BE100088 beq r1,r0,LS3
FFFFFFFFFFFFE470 B2100313 bnei r1,#CTRLS,LS3 ; pause the listing?
FFFFFFFFFFFFE474 LS2:
FFFFFFFFFFFFE474 31FFFD77 call CHKIO ; if so, wait for another keypress
FFFFFFFFFFFFE478 BE107FE8 beq r1,r0,LS2
FFFFFFFFFFFFE47C LS3:
FFFFFFFFFFFFE47C E0400000 setlo r1,#0
FFFFFFFFFFFFE480 31FFFC52 call FNDLNP ; find the next line
FFFFFFFFFFFFE484 BE007E8A bra LS1
;******************************************************************
; PRINT command is 'PRINT ....:' or 'PRINT ....<CR>'
; where '....' is a list of expressions, formats, back-arrows,
; and strings. These items a separated by commas.
;
; A format is a pound sign followed by a number. It controls
; the number of spaces the value of an expression is going to
; be printed in. It stays effective for the rest of the print
; command unless changed by another format. If no format is
; specified, 11 positions will be used.
;
; A string is quoted in a pair of single- or double-quotes.
;
; An underline (back-arrow) means generate a <CR> without a <LF>
;
; A <CR LF> is generated after the entire list has been printed
; or if the list is empty. If the list ends with a semicolon,
; however, no <CR LF> is generated.
;******************************************************************
;
FFFFFFFFFFFFE488 PRINT:
FFFFFFFFFFFFE488 1602800B lw r5,#11 ; D4 = number of print spaces
FFFFFFFFFFFFE48C E0C0003A setlo r3,#':'
FFFFFFFFFFFFE490 9A0264A0 lea r4,PR2
FFFFFFFFFFFFE494 31FFFD30 call TSTC ; if null list and ":"
FFFFFFFFFFFFE498 31FFF135 call CRLF ; give CR-LF and continue
FFFFFFFFFFFFE49C BE007A0A bra RUNSML ; execution on the same line
FFFFFFFFFFFFE4A0 PR2:
FFFFFFFFFFFFE4A0 E0C0000D setlo r3,#CR
FFFFFFFFFFFFE4A4 9A0264B4 lea r4,PR0
FFFFFFFFFFFFE4A8 31FFFD30 call TSTC ;if null list and <CR>
FFFFFFFFFFFFE4AC 31FFF135 call CRLF ;also give CR-LF and
FFFFFFFFFFFFE4B0 BE00782A bra RUNNXL ;execute the next line
FFFFFFFFFFFFE4B4 PR0:
FFFFFFFFFFFFE4B4 E0C00023 setlo r3,#'#'
FFFFFFFFFFFFE4B8 9A0264CC lea r4,PR1
FFFFFFFFFFFFE4BC 31FFFD30 call TSTC ;else is it a format?
FFFFFFFFFFFFE4C0 31FFFA7C call OREXPR ; yes, evaluate expression
FFFFFFFFFFFFE4C4 04101409 lw r5,r1 ; and save it as print width
FFFFFFFFFFFFE4C8 BE00012A bra PR3 ; look for more to print
FFFFFFFFFFFFE4CC PR1:
FFFFFFFFFFFFE4CC E0C00024 setlo r3,#'$'
FFFFFFFFFFFFE4D0 9A0264E4 lea r4,PR4
FFFFFFFFFFFFE4D4 31FFFD30 call TSTC ; is character expression? (MRL)
FFFFFFFFFFFFE4D8 31FFFA7C call OREXPR ; yep. Evaluate expression (MRL)
FFFFFFFFFFFFE4DC 31FFF7D5 call GOOUT ; print low byte (MRL)
FFFFFFFFFFFFE4E0 BE00006A bra PR3 ;look for more. (MRL)
FFFFFFFFFFFFE4E4 PR4:
FFFFFFFFFFFFE4E4 31FFFCA9 call QTSTG ; is it a string?
; the following branch must occupy only two bytes!
FFFFFFFFFFFFE4E8 BE00010A bra PR8 ; if not, must be an expression
FFFFFFFFFFFFE4EC PR3:
FFFFFFFFFFFFE4EC E0C0002C setlo r3,#','
FFFFFFFFFFFFE4F0 9A026500 lea r4,PR6
FFFFFFFFFFFFE4F4 31FFFD30 call TSTC ; if ",", go find next
FFFFFFFFFFFFE4F8 31FFFBEC call FIN ;in the list.
FFFFFFFFFFFFE4FC BE007DCA bra PR0
FFFFFFFFFFFFE500 PR6:
FFFFFFFFFFFFE500 31FFF135 call CRLF ;list ends here
FFFFFFFFFFFFE504 BE0000AA bra FINISH
FFFFFFFFFFFFE508 PR8:
FFFFFFFFFFFFE508 31FFFA7C call OREXPR ; evaluate the expression
FFFFFFFFFFFFE50C 04500809 lw r2,r5 ; set the width
FFFFFFFFFFFFE510 31FFFCCC call PRTNUM ; print its value
FFFFFFFFFFFFE514 BE007ECA bra PR3 ; more to print?
FFFFFFFFFFFFE518 FINISH:
FFFFFFFFFFFFE518 31FFFBEC call FIN ; Check end of command
FFFFFFFFFFFFE51C 33FFFC09 jmp QWHAT ; print "What?" if wrong
;*******************************************************************
;
; *** GOSUB *** & RETURN ***
;
; 'GOSUB expr:' or 'GOSUB expr<CR>' is like the 'GOTO' command,
; except that the current text pointer, stack pointer, etc. are
; saved so that execution can be continued after the subroutine
; 'RETURN's. In order that 'GOSUB' can be nested (and even
; recursive), the save area must be stacked. The stack pointer
; is saved in 'STKGOS'. The old 'STKGOS' is saved on the stack.
; If we are in the main routine, 'STKGOS' is zero (this was done
; in the initialization section of the interpreter), but we still
; save it as a flag for no further 'RETURN's.
;******************************************************************
;
FFFFFFFFFFFFE520 GOSUB:
FFFFFFFFFFFFE520 31FFFC80 call PUSHA ; save the current 'FOR' parameters
FFFFFFFFFFFFE524 31FFFA7C call OREXPR ; get line number
FFFFFFFFFFFFE528 31FFFC4E call FNDLN ; find the target line
FFFFFFFFFFFFE52C BE100069 bne r1,r0,gosub1
FFFFFFFFFFFFE530 9A00F833 lea r1,msgBadGotoGosub
FFFFFFFFFFFFE534 BE0057AA bra ERROR ; if not there, say "How?"
FFFFFFFFFFFFE538 gosub1:
FFFFFFFFFFFFE538 0DEF0018 sub sp,sp,#24
FFFFFFFFFFFFE53C 67E40000 sw r8,[sp] ; save text pointer
FFFFFFFFFFFFE540 46009090 lw r1,CURRNT
FFFFFFFFFFFFE544 67E08008 sw r1,8[sp] ; found it, save old 'CURRNT'...
FFFFFFFFFFFFE548 46009098 lw r1,STKGOS
FFFFFFFFFFFFE54C 67E08010 sw r1,16[sp] ; and 'STKGOS'
FFFFFFFFFFFFE550 660010A8 sw r0,LOPVAR ; load new values
FFFFFFFFFFFFE554 660F1098 sw sp,STKGOS
FFFFFFFFFFFFE558 BE0073EA bra RUNTSL
;******************************************************************
; 'RETURN<CR>' undoes everything that 'GOSUB' did, and thus
; returns the execution to the command after the most recent
; 'GOSUB'. If 'STKGOS' is zero, it indicates that we never had
; a 'GOSUB' and is thus an error.
;******************************************************************
;
FFFFFFFFFFFFE55C RETURN:
FFFFFFFFFFFFE55C 31FFFBFB call ENDCHK ; there should be just a <CR>
FFFFFFFFFFFFE560 46009098 lw r1,STKGOS ; get old stack pointer
FFFFFFFFFFFFE564 BE100069 bne r1,r0,return1
FFFFFFFFFFFFE568 9A00F850 lea r1,msgRetWoGosub
FFFFFFFFFFFFE56C BE0055EA bra ERROR ; if zero, it doesn't exist
FFFFFFFFFFFFE570 return1:
FFFFFFFFFFFFE570 021F0009 mov sp,r1 ; else restore it
FFFFFFFFFFFFE574 47E08010 lw r1,16[sp]
FFFFFFFFFFFFE578 66009098 sw r1,STKGOS ; and the old 'STKGOS'
FFFFFFFFFFFFE57C 47E08008 lw r1,8[sp]
FFFFFFFFFFFFE580 66009090 sw r1,CURRNT ; and the old 'CURRNT'
FFFFFFFFFFFFE584 47E40000 lw r8,[sp] ; and the old text pointer
FFFFFFFFFFFFE588 09EF0018 add sp,sp,#24
FFFFFFFFFFFFE58C 31FFFC73 call POPA ;and the old 'FOR' parameters
FFFFFFFFFFFFE590 BE007C4A bra FINISH ;and we are back home
;******************************************************************
; *** FOR *** & NEXT ***
;
; 'FOR' has two forms:
; 'FOR var=exp1 TO exp2 STEP exp1' and 'FOR var=exp1 TO exp2'
; The second form means the same thing as the first form with a
; STEP of positive 1. The interpreter will find the variable 'var'
; and set its value to the current value of 'exp1'. It also
; evaluates 'exp2' and 'exp1' and saves all these together with
; the text pointer, etc. in the 'FOR' save area, which consists of
; 'LOPVAR', 'LOPINC', 'LOPLMT', 'LOPLN', and 'LOPPT'. If there is
; already something in the save area (indicated by a non-zero
; 'LOPVAR'), then the old save area is saved on the stack before
; the new values are stored. The interpreter will then dig in the
; stack and find out if this same variable was used in another
; currently active 'FOR' loop. If that is the case, then the old
; 'FOR' loop is deactivated. (i.e. purged from the stack)
;******************************************************************
;
FFFFFFFFFFFFE594 FOR:
FFFFFFFFFFFFE594 31FFFC80 call PUSHA ; save the old 'FOR' save area
FFFFFFFFFFFFE598 31FFFBDA call SETVAL ; set the control variable
FFFFFFFFFFFFE59C 660090A8 sw r1,LOPVAR ; save its address
FFFFFFFFFFFFE5A0 9A04E16F lea r9,TAB5
FFFFFFFFFFFFE5A4 9A0562A0 lea r10,TAB5_1; use 'EXEC' to test for 'TO'
FFFFFFFFFFFFE5A8 33FFF8C8 jmp EXEC
FFFFFFFFFFFFE5AC FR1:
FFFFFFFFFFFFE5AC 31FFFA7C call OREXPR ; evaluate the limit
FFFFFFFFFFFFE5B0 660090B8 sw r1,LOPLMT ; save that
FFFFFFFFFFFFE5B4 9A04E172 lea r9,TAB6
FFFFFFFFFFFFE5B8 9A0562B0 lea r10,TAB6_1 ; use 'EXEC' to test for the word 'STEP
FFFFFFFFFFFFE5BC 33FFF8C8 jmp EXEC
FFFFFFFFFFFFE5C0 FR2:
FFFFFFFFFFFFE5C0 31FFFA7C call OREXPR ; found it, get the step value
FFFFFFFFFFFFE5C4 BE00004A bra FR4
FFFFFFFFFFFFE5C8 FR3:
FFFFFFFFFFFFE5C8 E0400001 setlo r1,#1 ; not found, step defaults to 1
FFFFFFFFFFFFE5CC FR4:
FFFFFFFFFFFFE5CC 660090B0 sw r1,LOPINC ; save that too
FFFFFFFFFFFFE5D0 FR5:
FFFFFFFFFFFFE5D0 46011090 lw r2,CURRNT
FFFFFFFFFFFFE5D4 660110C0 sw r2,LOPLN ; save address of current line number
FFFFFFFFFFFFE5D8 660410C8 sw r8,LOPPT ; and text pointer
FFFFFFFFFFFFE5DC 05E00C09 lw r3,sp ; dig into the stack to find 'LOPVAR'
FFFFFFFFFFFFE5E0 460310A8 lw r6,LOPVAR
FFFFFFFFFFFFE5E4 BE00004A bra FR7
FFFFFFFFFFFFE5E8 FR6:
FFFFFFFFFFFFE5E8 0A318028 addui r3,r3,#40 ; look at next stack frame
FFFFFFFFFFFFE5EC FR7:
FFFFFFFFFFFFE5EC 46310000 lw r2,[r3] ; is it zero?
FFFFFFFFFFFFE5F0 BE2000E8 beq r2,r0,FR8 ; if so, we're done
FFFFFFFFFFFFE5F4 BE237FA9 bne r2,r6,FR6 ; same as current LOPVAR? nope, look some more
FFFFFFFFFFFFE5F8 04300409 lw r1,r3 ; Else remove 5 long words from...
FFFFFFFFFFFFE5FC 0A310028 addui r2,r3,#40 ; inside the stack.
FFFFFFFFFFFFE600 05E00C09 lw r3,sp
FFFFFFFFFFFFE604 31FFFC71 call MVDOWN
FFFFFFFFFFFFE608 09EF0028 add sp,sp,#40 ; set the SP 5 long words up
FFFFFFFFFFFFE60C FR8:
FFFFFFFFFFFFE60C BE00786A bra FINISH ; and continue execution
;******************************************************************
; 'NEXT var' serves as the logical (not necessarily physical) end
; of the 'FOR' loop. The control variable 'var' is checked with
; the 'LOPVAR'. If they are not the same, the interpreter digs in
; the stack to find the right one and purges all those that didn't
; match. Either way, it then adds the 'STEP' to that variable and
; checks the result with against the limit value. If it is within
; the limit, control loops back to the command following the
; 'FOR'. If it's outside the limit, the save area is purged and
; execution continues.
;******************************************************************
;
FFFFFFFFFFFFE610 NEXT:
FFFFFFFFFFFFE610 E0400000 setlo r1,#0 ; don't allocate it
FFFFFFFFFFFFE614 31FFFB2E call TSTV ; get address of variable
FFFFFFFFFFFFE618 BE100069 bne r1,r0,NX4
FFFFFFFFFFFFE61C 9A00F80F lea r1,msgNextVar
FFFFFFFFFFFFE620 BE00504A bra ERROR ; if no variable, say "What?"
FFFFFFFFFFFFE624 NX4:
FFFFFFFFFFFFE624 02148009 mov r9,r1 ; save variable's address
FFFFFFFFFFFFE628 NX0:
FFFFFFFFFFFFE628 460090A8 lw r1,LOPVAR ; If 'LOPVAR' is zero, we never...
FFFFFFFFFFFFE62C BE100069 bne r1,r0,NX5 ; had a FOR loop
FFFFFFFFFFFFE630 9A00F7FC lea r1,msgNextFor
FFFFFFFFFFFFE634 BE004FAA bra ERROR
FFFFFFFFFFFFE638 NX5:
FFFFFFFFFFFFE638 BE148068 beq r1,r9,NX2 ; else we check them OK, they agree
FFFFFFFFFFFFE63C 31FFFC73 call POPA ; nope, let's see the next frame
FFFFFFFFFFFFE640 BE007F4A bra NX0
FFFFFFFFFFFFE644 NX2:
FFFFFFFFFFFFE644 46908000 lw r1,[r9] ; get control variable's value
FFFFFFFFFFFFE648 460110B0 lw r2,LOPINC
FFFFFFFFFFFFE64C 04110403 addu r1,r1,r2 ; add in loop increment
; BVS.L QHOW say "How?" for 32-bit overflow
FFFFFFFFFFFFE650 66908000 sw r1,[r9] ; save control variable's new value
FFFFFFFFFFFFE654 460190B8 lw r3,LOPLMT ; get loop's limit value
FFFFFFFFFFFFE658 BE200063 bgt r2,r0,NX1 ; check loop increment, branch if loop increment is positive
FFFFFFFFFFFFE65C BE1180E0 blt r1,r3,NXPurge ; test against limit
FFFFFFFFFFFFE660 BE00004A bra NX3
FFFFFFFFFFFFE664 NX1:
FFFFFFFFFFFFE664 BE1180A3 bgt r1,r3,NXPurge
FFFFFFFFFFFFE668 NX3:
FFFFFFFFFFFFE668 460410C0 lw r8,LOPLN ; Within limit, go back to the...
FFFFFFFFFFFFE66C 66041090 sw r8,CURRNT
FFFFFFFFFFFFE670 460410C8 lw r8,LOPPT ; saved 'CURRNT' and text pointer.
FFFFFFFFFFFFE674 BE00752A bra FINISH
FFFFFFFFFFFFE678 NXPurge:
FFFFFFFFFFFFE678 31FFFC73 call POPA ; purge this loop
FFFFFFFFFFFFE67C BE0074EA bra FINISH
;******************************************************************
; *** REM *** IF *** INPUT *** LET (& DEFLT) ***
;
; 'REM' can be followed by anything and is ignored by the
; interpreter.
;
;REM
; br IF2 ; skip the rest of the line
; 'IF' is followed by an expression, as a condition and one or
; more commands (including other 'IF's) separated by colons.
; Note that the word 'THEN' is not used. The interpreter evaluates
; the expression. If it is non-zero, execution continues. If it
; is zero, the commands that follow are ignored and execution
; continues on the next line.
;******************************************************************
;
FFFFFFFFFFFFE680 IF:
FFFFFFFFFFFFE680 31FFFA7C call OREXPR ; evaluate the expression
FFFFFFFFFFFFE684 IF1:
FFFFFFFFFFFFE684 BE106AC9 bne r1,r0,RUNSML ; is it zero? if not, continue
FFFFFFFFFFFFE688 IF2:
FFFFFFFFFFFFE688 02848009 mov r9,r8 ; set lookup pointer
FFFFFFFFFFFFE68C E0400000 setlo r1,#0 ; find line #0 (impossible)
FFFFFFFFFFFFE690 31FFFC63 call FNDSKP ; if so, skip the rest of the line
FFFFFFFFFFFFE694 BE104B83 bgt r1,r0,WSTART ; if no next line, do a warm start
FFFFFFFFFFFFE698 IF3:
FFFFFFFFFFFFE698 BE0069EA bra RUNTSL ; run the next line
;******************************************************************
; INPUT is called first and establishes a stack frame
FFFFFFFFFFFFE69C INPERR:
FFFFFFFFFFFFE69C 460F10A0 lw sp,STKINP ; restore the old stack pointer
FFFFFFFFFFFFE6A0 47E40010 lw r8,16[sp]
FFFFFFFFFFFFE6A4 66041090 sw r8,CURRNT ; and old 'CURRNT'
FFFFFFFFFFFFE6A8 47E40008 lw r8,8[sp] ; and old text pointer
FFFFFFFFFFFFE6AC 0BEF0028 addui sp,sp,#40 ; fall through will subtract 40
; 'INPUT' is like the 'PRINT' command, and is followed by a list
; of items. If the item is a string in single or double quotes,
; or is an underline (back arrow), it has the same effect as in
; 'PRINT'. If an item is a variable, this variable name is
; printed out followed by a colon, then the interpreter waits for
; an expression to be typed in. The variable is then set to the
; value of this expression. If the variable is preceeded by a
; string (again in single or double quotes), the string will be
; displayed followed by a colon. The interpreter the waits for an
; expression to be entered and sets the variable equal to the
; expression's value. If the input expression is invalid, the
; interpreter will print "What?", "How?", or "Sorry" and reprint
; the prompt and redo the input. The execution will not terminate
; unless you press control-C. This is handled in 'INPERR'.
;
FFFFFFFFFFFFE6B0 INPUT:
FFFFFFFFFFFFE6B0 0FEF0028 subui sp,sp,#40 ; allocate stack frame
FFFFFFFFFFFFE6B4 67E28020 sw r5,32[sp]
FFFFFFFFFFFFE6B8 IP6:
FFFFFFFFFFFFE6B8 67E40000 sw r8,[sp] ; save in case of error
FFFFFFFFFFFFE6BC 31FFFCA9 call QTSTG ; is next item a string?
FFFFFFFFFFFFE6C0 BE0000CA bra IP2 ; nope - this branch must take only two bytes
FFFFFFFFFFFFE6C4 E0400001 setlo r1,#1 ; allocate var
FFFFFFFFFFFFE6C8 31FFFB2E call TSTV ; yes, but is it followed by a variable?
FFFFFFFFFFFFE6CC BE1003E8 beq r1,r0,IP4 ; if not, brnch
FFFFFFFFFFFFE6D0 02150009 mov r10,r1 ; put away the variable's address
FFFFFFFFFFFFE6D4 BE0001AA bra IP3 ; if so, input to variable
FFFFFFFFFFFFE6D8 IP2:
FFFFFFFFFFFFE6D8 67E40008 sw r8,8[sp] ; save for 'PRTSTG'
FFFFFFFFFFFFE6DC E0400001 setlo r1,#1
FFFFFFFFFFFFE6E0 31FFFB2E call TSTV ; must be a variable now
FFFFFFFFFFFFE6E4 BE100069 bne r1,r0,IP7
FFFFFFFFFFFFE6E8 9A00F7DF lea r1,msgInputVar
FFFFFFFFFFFFE6EC BE0049EA bra ERROR ; "What?" it isn't?
FFFFFFFFFFFFE6F0 IP7:
FFFFFFFFFFFFE6F0 02150009 mov r10,r1 ; put away the variable's address
FFFFFFFFFFFFE6F4 40828000 lb r5,[r8] ; get ready for 'PRTSTG' by null terminating
FFFFFFFFFFFFE6F8 60800000 sb r0,[r8]
FFFFFFFFFFFFE6FC 47E08008 lw r1,8[sp] ; get back text pointer
FFFFFFFFFFFFE700 31FFFC93 call PRTSTG ; print string as prompt
FFFFFFFFFFFFE704 60828000 sb r5,[r8] ; un-null terminate
FFFFFFFFFFFFE708 IP3
FFFFFFFFFFFFE708 67E40008 sw r8,8[sp] ; save in case of error
FFFFFFFFFFFFE70C 46009090 lw r1,CURRNT
FFFFFFFFFFFFE710 67E08010 sw r1,16[sp] ; also save 'CURRNT'
FFFFFFFFFFFFE714 E07FFFFF setlo r1,#-1
FFFFFFFFFFFFE718 66009090 sw r1,CURRNT ; flag that we are in INPUT
FFFFFFFFFFFFE71C 660F10A0 sw sp,STKINP ; save the stack pointer too
FFFFFFFFFFFFE720 67E50018 sw r10,24[sp] ; save the variable address
FFFFFFFFFFFFE724 E040003A setlo r1,#':' ; print a colon first
FFFFFFFFFFFFE728 31FFFC1A call GETLN ; then get an input line
FFFFFFFFFFFFE72C 9A04111B lea r8,BUFFER ; point to the buffer
FFFFFFFFFFFFE730 31FFFA7C call OREXPR ; evaluate the input
FFFFFFFFFFFFE734 47E50018 lw r10,24[sp] ; restore the variable address
FFFFFFFFFFFFE738 66A08000 sw r1,[r10] ; save value in variable
FFFFFFFFFFFFE73C 47E08010 lw r1,16[sp] ; restore old 'CURRNT'
FFFFFFFFFFFFE740 66009090 sw r1,CURRNT
FFFFFFFFFFFFE744 47E40008 lw r8,8[sp] ; and the old text pointer
FFFFFFFFFFFFE748 IP4:
FFFFFFFFFFFFE748 E0C0002C setlo r3,#','
FFFFFFFFFFFFE74C 9A026758 lea r4,IP5 ; is the next thing a comma?
FFFFFFFFFFFFE750 31FFFD30 call TSTC
FFFFFFFFFFFFE754 BE007B2A bra IP6 ; yes, more items
FFFFFFFFFFFFE758 IP5:
FFFFFFFFFFFFE758 47E28020 lw r5,32[sp]
FFFFFFFFFFFFE75C 09EF0028 add sp,sp,#40 ; clean up the stack
FFFFFFFFFFFFE760 33FFF946 jmp FINISH
FFFFFFFFFFFFE764 DEFLT:
FFFFFFFFFFFFE764 40808000 lb r1,[r8]
FFFFFFFFFFFFE768 B01F6C0D beq r1,#CR,FINISH ; empty line is OK else it is 'LET'
;******************************************************************
; 'LET' is followed by a list of items separated by commas.
; Each item consists of a variable, an equals sign, and an
; expression. The interpreter evaluates the expression and sets
; the variable to that value. The interpreter will also handle
; 'LET' commands without the word 'LET'. This is done by 'DEFLT'.
;******************************************************************
;
FFFFFFFFFFFFE76C LET:
FFFFFFFFFFFFE76C 31FFFBDA call SETVAL ; do the assignment
FFFFFFFFFFFFE770 E0C0002C setlo r3,#','
FFFFFFFFFFFFE774 9A026518 lea r4,FINISH
FFFFFFFFFFFFE778 31FFFD30 call TSTC ; check for more 'LET' items
FFFFFFFFFFFFE77C BE007F8A bra LET
FFFFFFFFFFFFE780 LT1:
FFFFFFFFFFFFE780 BE006CCA bra FINISH ; until we are finished.
;******************************************************************
; *** LOAD *** & SAVE ***
;
; These two commands transfer a program to/from an auxiliary
; device such as a cassette, another computer, etc. The program
; is converted to an easily-stored format: each line starts with
; a colon, the line no. as 4 hex digits, and the rest of the line.
; At the end, a line starting with an '@' sign is sent. This
; format can be read back with a minimum of processing time by
; the Butterfly.
;******************************************************************
;
FFFFFFFFFFFFE784 LOAD
FFFFFFFFFFFFE784 46045F68 lw r8,TXTBGN ; set pointer to start of prog. area
FFFFFFFFFFFFE788 E040000D setlo r1,#CR ; For a CP/M host, tell it we're ready...
FFFFFFFFFFFFE78C 31FFF7D7 call GOAUXO ; by sending a CR to finish PIP command.
FFFFFFFFFFFFE790 LOD1:
FFFFFFFFFFFFE790 31FFF7D8 call GOAUXI ; look for start of line
FFFFFFFFFFFFE794 BE107FE2 ble r1,r0,LOD1
FFFFFFFFFFFFE798 B0100E40 beq r1,#'@',LODEND ; end of program?
FFFFFFFFFFFFE79C B0100D1A beq r1,#0x1A,LODEND ; or EOF marker
FFFFFFFFFFFFE7A0 B21FFC3A bne r1,#':',LOD1 ; if not, is it start of line? if not, wait for it
FFFFFFFFFFFFE7A4 31FFF9F6 call GCHAR ; get line number
FFFFFFFFFFFFE7A8 60808000 sb r1,[r8] ; store it
FFFFFFFFFFFFE7AC 06109001 shrui r1,r1,#8
FFFFFFFFFFFFE7B0 60808001 sb r1,1[r8]
FFFFFFFFFFFFE7B4 0A840002 addui r8,r8,#2
FFFFFFFFFFFFE7B8 LOD2:
FFFFFFFFFFFFE7B8 31FFF7D8 call GOAUXI ; get another text char.
FFFFFFFFFFFFE7BC BE107FE2 ble r1,r0,LOD2
FFFFFFFFFFFFE7C0 60808000 sb r1,[r8]
FFFFFFFFFFFFE7C4 0A840001 addui r8,r8,#1 ; store it
FFFFFFFFFFFFE7C8 B21FFC0D bne r1,#CR,LOD2 ; is it the end of the line? if not, go back for more
FFFFFFFFFFFFE7CC BE007E2A bra LOD1 ; if so, start a new line
FFFFFFFFFFFFE7D0 LODEND:
FFFFFFFFFFFFE7D0 660410D0 sw r8,TXTUNF ; set end-of program pointer
FFFFFFFFFFFFE7D4 BE00418A bra WSTART ; back to direct mode
; get character from input (16 bit value)
FFFFFFFFFFFFE7D8 GCHAR:
FFFFFFFFFFFFE7D8 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFE7DC 67E28000 sw r5,[sp]
FFFFFFFFFFFFE7E0 67E30008 sw r6,8[sp]
FFFFFFFFFFFFE7E4 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFE7E8 E1800003 setlo r6,#3 ; repeat four times
FFFFFFFFFFFFE7EC E1400000 setlo r5,#0
FFFFFFFFFFFFE7F0 GCHAR1:
FFFFFFFFFFFFE7F0 31FFF7D8 call GOAUXI ; get a char
FFFFFFFFFFFFE7F4 BE107FE2 ble r1,r0,GCHAR1
FFFFFFFFFFFFE7F8 31FFFA07 call asciiToHex
FFFFFFFFFFFFE7FC 06528800 shli r5,r5,#4
FFFFFFFFFFFFE800 04509409 or r5,r5,r1
FFFFFFFFFFFFE804 BE037F6F loop r6,GCHAR1
FFFFFFFFFFFFE808 02508009 mov r1,r5
FFFFFFFFFFFFE80C 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFE810 47E30008 lw r6,8[sp]
FFFFFFFFFFFFE814 47E28000 lw r5,[sp]
FFFFFFFFFFFFE818 37EF8018 ret #24
; convert an ascii char to hex code
; input
; r1 = char to convert
FFFFFFFFFFFFE81C asciiToHex:
FFFFFFFFFFFFE81C A4100239 blei r1,#'9',a2h1 ; less than '9'
FFFFFFFFFFFFE820 0E108007 subui r1,r1,#7 ; shift 'A' to '9'+1
FFFFFFFFFFFFE824 a2h1:
FFFFFFFFFFFFE824 0E108030 subui r1,r1,#'0' ;
FFFFFFFFFFFFE828 1410800F andi r1,r1,#15 ; make sure a nybble
FFFFFFFFFFFFE82C 37EF8000 ret
FFFFFFFFFFFFE830 SAVE:
FFFFFFFFFFFFE830 46045F68 lw r8,TXTBGN ;set pointer to start of prog. area
FFFFFFFFFFFFE834 460490D0 lw r9,TXTUNF ;set pointer to end of prog. area
FFFFFFFFFFFFE838 SAVE1:
FFFFFFFFFFFFE838 31FFFA23 call AUXOCRLF ; send out a CR & LF (CP/M likes this)
FFFFFFFFFFFFE83C BE8481C5 bgeu r8,r9,SAVEND ; are we finished?
FFFFFFFFFFFFE840 E040003A setlo r1,#':' ; if not, start a line
FFFFFFFFFFFFE844 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE848 4A808000 lbu r1,[r8] ; get line number
FFFFFFFFFFFFE84C 4A810001 lbu r2,1[r8]
FFFFFFFFFFFFE850 06211000 shli r2,r2,#8
FFFFFFFFFFFFE854 04110409 or r1,r1,r2
FFFFFFFFFFFFE858 0A840002 addui r8,r8,#2
FFFFFFFFFFFFE85C 31FFFA2B call PWORD ; output line number as 4-digit hex
FFFFFFFFFFFFE860 SAVE2:
FFFFFFFFFFFFE860 40808000 lb r1,[r8] ; get a text char.
FFFFFFFFFFFFE864 0A840001 addui r8,r8,#1
FFFFFFFFFFFFE868 B01FF40D beqi r1,#CR,SAVE1 ; is it the end of the line? if so, send CR & LF and start new line
FFFFFFFFFFFFE86C 31FFF7D7 call GOAUXO ; send it out
FFFFFFFFFFFFE870 BE007F8A bra SAVE2 ; go back for more text
FFFFFFFFFFFFE874 SAVEND:
FFFFFFFFFFFFE874 E0400040 setlo r1,#'@' ; send end-of-program indicator
FFFFFFFFFFFFE878 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE87C 31FFFA23 call AUXOCRLF ; followed by a CR & LF
FFFFFFFFFFFFE880 E040001A setlo r1,#0x1A ; and a control-Z to end the CP/M file
FFFFFFFFFFFFE884 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE888 BE003BEA bra WSTART ; then go do a warm start
; output a CR LF sequence to auxillary output
; Registers Affected
; r3 = LF
FFFFFFFFFFFFE88C AUXOCRLF:
FFFFFFFFFFFFE88C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE890 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE894 E040000D setlo r1,#CR
FFFFFFFFFFFFE898 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE89C E040000A setlo r1,#LF
FFFFFFFFFFFFE8A0 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE8A4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE8A8 37EF8008 ret #8
; output a word in hex format
; tricky because of the need to reverse the order of the chars
FFFFFFFFFFFFE8AC PWORD:
FFFFFFFFFFFFE8AC 0DEF0010 sub sp,sp,#16
FFFFFFFFFFFFE8B0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE8B4 67E28008 sw r5,8[sp]
FFFFFFFFFFFFE8B8 9A02910F lea r5,NUMWKA+15
FFFFFFFFFFFFE8BC 02120009 mov r4,r1 ; r4 = value
FFFFFFFFFFFFE8C0 pword1:
FFFFFFFFFFFFE8C0 02408009 mov r1,r4 ; r1 = value
FFFFFFFFFFFFE8C4 06420801 shrui r4,r4,#4 ; shift over to next nybble
FFFFFFFFFFFFE8C8 31FFFA3F call toAsciiHex ; convert LS nybble to ascii hex
FFFFFFFFFFFFE8CC 60508000 sb r1,[r5] ; save in work area
FFFFFFFFFFFFE8D0 0E528001 subui r5,r5,#1
FFFFFFFFFFFFE8D4 12509100 cmpui r1,r5,#NUMWKA
FFFFFFFFFFFFE8D8 BE107F41 bge r1,r0,pword1
FFFFFFFFFFFFE8DC pword2:
FFFFFFFFFFFFE8DC 0A528001 addui r5,r5,#1
FFFFFFFFFFFFE8E0 40508000 lb r1,[r5] ; get char to output
FFFFFFFFFFFFE8E4 31FFF7D7 call GOAUXO ; send it
FFFFFFFFFFFFE8E8 1250910F cmpui r1,r5,#NUMWKA+15
FFFFFFFFFFFFE8EC BE107F80 blt r1,r0,pword2
FFFFFFFFFFFFE8F0 47E28008 lw r5,8[sp]
FFFFFFFFFFFFE8F4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE8F8 37EF8010 ret #16
; convert nybble in r2 to ascii hex char2
; r2 = character to convert
FFFFFFFFFFFFE8FC toAsciiHex:
FFFFFFFFFFFFE8FC 1410800F andi r1,r1,#15 ; make sure it's a nybble
FFFFFFFFFFFFE900 A010020A blti r1,#10,tah1 ; > 10 ?
FFFFFFFFFFFFE904 08108007 addi r1,r1,#7 ; bump it up to the letter 'A'
FFFFFFFFFFFFE908 tah1:
FFFFFFFFFFFFE908 0A108030 addui r1,r1,#'0' ; bump up to ascii '0'
FFFFFFFFFFFFE90C 37EF8000 ret
;******************************************************************
; *** POKE *** & SYSX ***
;
; 'POKE expr1,expr2' stores the byte from 'expr2' into the memory
; address specified by 'expr1'.
;
; 'SYSX expr' jumps to the machine language subroutine whose
; starting address is specified by 'expr'. The subroutine can use
; all registers but must leave the stack the way it found it.
; The subroutine returns to the interpreter by executing an RET.
;******************************************************************
;
FFFFFFFFFFFFE910 POKE:
FFFFFFFFFFFFE910 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE914 31FFFA7C call OREXPR ; get the memory address
FFFFFFFFFFFFE918 E0C0002C setlo r3,#','
FFFFFFFFFFFFE91C 9A02693C lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFE920 31FFFD30 call TSTC ; it must be followed by a comma
FFFFFFFFFFFFE924 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFE928 31FFFA7C call OREXPR ; get the byte to be POKE'd
FFFFFFFFFFFFE92C 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFE930 60208000 sb r1,[r2] ; store the byte in memory
FFFFFFFFFFFFE934 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE938 BE005F0A bra FINISH
FFFFFFFFFFFFE93C PKER:
FFFFFFFFFFFFE93C 9A00F778 lea r1,msgComma
FFFFFFFFFFFFE940 BE00374A bra ERROR ; if no comma, say "What?"
FFFFFFFFFFFFE944 POKEC:
FFFFFFFFFFFFE944 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE948 31FFFA7C call OREXPR ; get the memory address
FFFFFFFFFFFFE94C E0C0002C setlo r3,#','
FFFFFFFFFFFFE950 9A02693C lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFE954 31FFFD30 call TSTC ; it must be followed by a comma
FFFFFFFFFFFFE958 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFE95C 31FFFA7C call OREXPR ; get the byte to be POKE'd
FFFFFFFFFFFFE960 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFE964 62208000 sc r1,[r2] ; store the char in memory
FFFFFFFFFFFFE968 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE96C 33FFF946 jmp FINISH
FFFFFFFFFFFFE970 POKEH:
FFFFFFFFFFFFE970 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE974 31FFFA7C call OREXPR ; get the memory address
FFFFFFFFFFFFE978 E0C0002C setlo r3,#','
FFFFFFFFFFFFE97C 9A02693C lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFE980 31FFFD30 call TSTC
FFFFFFFFFFFFE984 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFE988 31FFFA7C call OREXPR ; get the byte to be POKE'd
FFFFFFFFFFFFE98C 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFE990 64208000 sh r1,[r2] ; store the word in memory
FFFFFFFFFFFFE994 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE998 33FFF946 jmp FINISH
FFFFFFFFFFFFE99C POKEW:
FFFFFFFFFFFFE99C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE9A0 31FFFA7C call OREXPR ; get the memory address
FFFFFFFFFFFFE9A4 E0C0002C setlo r3,#','
FFFFFFFFFFFFE9A8 9A02693C lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFE9AC 31FFFD30 call TSTC
FFFFFFFFFFFFE9B0 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFE9B4 31FFFA7C call OREXPR ; get the word to be POKE'd
FFFFFFFFFFFFE9B8 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFE9BC 66208000 sw r1,[r2] ; store the word in memory
FFFFFFFFFFFFE9C0 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE9C4 33FFF946 jmp FINISH
FFFFFFFFFFFFE9C8 SYSX:
FFFFFFFFFFFFE9C8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE9CC 31FFFA7C call OREXPR ; get the subroutine's address
FFFFFFFFFFFFE9D0 BE100069 bne r1,r0,sysx1 ; make sure we got a valid address
FFFFFFFFFFFFE9D4 9A00F7CD lea r1,msgSYSBad
FFFFFFFFFFFFE9D8 BE00328A bra ERROR
FFFFFFFFFFFFE9DC sysx1:
FFFFFFFFFFFFE9DC 67E40000 sw r8,[sp] ; save the text pointer
FFFFFFFFFFFFE9E0 341F8000 jal r31,[r1] ; jump to the subroutine
FFFFFFFFFFFFE9E4 47E40000 lw r8,[sp] ; restore the text pointer
FFFFFFFFFFFFE9E8 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE9EC BE00596A bra FINISH
;******************************************************************
; *** EXPR ***
;
; 'EXPR' evaluates arithmetical or logical expressions.
; <OREXPR>::= <ANDEXPR> OR <ANDEXPR> ...
; <ANDEXPR>::=<EXPR> AND <EXPR> ...
; <EXPR>::=<EXPR2>
; <EXPR2><rel.op.><EXPR2>
; where <rel.op.> is one of the operators in TAB8 and the result
; of these operations is 1 if true and 0 if false.
; <EXPR2>::=(+ or -)<EXPR3>(+ or -)<EXPR3>(...
; where () are optional and (... are optional repeats.
; <EXPR3>::=<EXPR4>( <* or /><EXPR4> )(...
; <EXPR4>::=<variable>
; <function>
; (<EXPR>)
; <EXPR> is recursive so that the variable '@' can have an <EXPR>
; as an index, functions can have an <EXPR> as arguments, and
; <EXPR4> can be an <EXPR> in parenthesis.
;
; <OREXPR>::=<ANDEXPR> OR <ANDEXPR> ...
;
FFFFFFFFFFFFE9F0 OREXPR:
FFFFFFFFFFFFE9F0 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFE9F4 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE9F8 31FFFA8A call ANDEXPR ; get first <ANDEXPR>
FFFFFFFFFFFFE9FC XP_OR1:
FFFFFFFFFFFFE9FC 67E08004 sw r1,4[sp] ; save <ANDEXPR> value
FFFFFFFFFFFFEA00 9A04E185 lea r9,TAB10 ; look up a logical operator
FFFFFFFFFFFFEA04 9A056308 lea r10,TAB10_1
FFFFFFFFFFFFEA08 33FFF8C8 jmp EXEC ; go do it
FFFFFFFFFFFFEA0C XP_OR:
FFFFFFFFFFFFEA0C 31FFFA8A call ANDEXPR
FFFFFFFFFFFFEA10 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEA14 04110409 or r1,r1,r2
FFFFFFFFFFFFEA18 BE007F2A bra XP_OR1
FFFFFFFFFFFFEA1C XP_ORX:
FFFFFFFFFFFFEA1C 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEA20 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEA24 37EF8010 ret #16
; <ANDEXPR>::=<EXPR> AND <EXPR> ...
;
FFFFFFFFFFFFEA28 ANDEXPR:
FFFFFFFFFFFFEA28 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEA2C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEA30 31FFFAAF call EXPR ; get first <EXPR>
FFFFFFFFFFFFEA34 XP_AND1:
FFFFFFFFFFFFEA34 67E08008 sw r1,8[sp] ; save <EXPR> value
FFFFFFFFFFFFEA38 9A04E181 lea r9,TAB9 ; look up a logical operator
FFFFFFFFFFFFEA3C 9A0562F8 lea r10,TAB9_1
FFFFFFFFFFFFEA40 33FFF8C8 jmp EXEC ; go do it
FFFFFFFFFFFFEA44 XP_AND:
FFFFFFFFFFFFEA44 31FFFAAF call EXPR
FFFFFFFFFFFFEA48 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEA4C 04110408 and r1,r1,r2
FFFFFFFFFFFFEA50 BE007F2A bra XP_AND1
FFFFFFFFFFFFEA54 XP_ANDX:
FFFFFFFFFFFFEA54 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEA58 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEA5C 37EF8010 ret #16
; Determine if the character is a digit
; Parameters
; r1 = char to test
; Returns
; r1 = 1 if digit, otherwise 0
;
FFFFFFFFFFFFEA60 isDigit:
FFFFFFFFFFFFEA60 A0100430 blt r1,#'0',isDigitFalse
FFFFFFFFFFFFEA64 A6100339 bgt r1,#'9',isDigitFalse
FFFFFFFFFFFFEA68 E0400001 setlo r1,#1
FFFFFFFFFFFFEA6C 37EF8000 ret
FFFFFFFFFFFFEA70 isDigitFalse:
FFFFFFFFFFFFEA70 E0400000 setlo r1,#0
FFFFFFFFFFFFEA74 37EF8000 ret
; Determine if the character is a alphabetic
; Parameters
; r1 = char to test
; Returns
; r1 = 1 if alpha, otherwise 0
;
FFFFFFFFFFFFEA78 isAlpha:
FFFFFFFFFFFFEA78 A0100641 blt r1,#'A',isAlphaFalse
FFFFFFFFFFFFEA7C A410035A ble r1,#'Z',isAlphaTrue
FFFFFFFFFFFFEA80 A0100461 blt r1,#'a',isAlphaFalse
FFFFFFFFFFFFEA84 A610037A bgt r1,#'z',isAlphaFalse
FFFFFFFFFFFFEA88 isAlphaTrue:
FFFFFFFFFFFFEA88 E0400001 setlo r1,#1
FFFFFFFFFFFFEA8C 37EF8000 ret
FFFFFFFFFFFFEA90 isAlphaFalse:
FFFFFFFFFFFFEA90 E0400000 setlo r1,#0
FFFFFFFFFFFFEA94 37EF8000 ret
; Determine if the character is a alphanumeric
; Parameters
; r1 = char to test
; Returns
; r1 = 1 if alpha, otherwise 0
;
FFFFFFFFFFFFEA98 isAlnum:
FFFFFFFFFFFFEA98 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFEA9C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEAA0 04100809 or r2,r1,r0 ; save test char
FFFFFFFFFFFFEAA4 31FFFA98 call isDigit
FFFFFFFFFFFFEAA8 BE100069 bne r1,r0,isDigitx ; if it is a digit
FFFFFFFFFFFFEAAC 04200409 or r1,r2,r0 ; get back test char
FFFFFFFFFFFFEAB0 31FFFA9E call isAlpha
FFFFFFFFFFFFEAB4 isDigitx:
FFFFFFFFFFFFEAB4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEAB8 37EF8008 ret #8
FFFFFFFFFFFFEABC EXPR:
FFFFFFFFFFFFEABC 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEAC0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEAC4 31FFFADE call EXPR2
FFFFFFFFFFFFEAC8 67E08008 sw r1,8[sp] ; save <EXPR2> value
FFFFFFFFFFFFEACC 9A04E177 lea r9,TAB8 ; look up a relational operator
FFFFFFFFFFFFEAD0 9A0562C0 lea r10,TAB8_1
FFFFFFFFFFFFEAD4 33FFF8C8 jmp EXEC ; go do it
FFFFFFFFFFFFEAD8 XP11:
FFFFFFFFFFFFEAD8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEADC 31FFFAD7 call XP18 ; is it ">="?
FFFFFFFFFFFFEAE0 BE208321 bge r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFEAE4 BE0002AA bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEAE8 XP12:
FFFFFFFFFFFFEAE8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEAEC 31FFFAD7 call XP18 ; is it "<>"?
FFFFFFFFFFFFEAF0 BE2082A9 bne r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFEAF4 BE00022A bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEAF8 XP13:
FFFFFFFFFFFFEAF8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEAFC 31FFFAD7 call XP18 ; is it ">"?
FFFFFFFFFFFFEB00 BE208223 bgt r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFEB04 BE0001AA bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEB08 XP14:
FFFFFFFFFFFFEB08 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEB0C 31FFFAD7 call XP18 ; is it "<="?
FFFFFFFFFFFFEB10 BE2081A2 ble r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFEB14 BE00012A bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEB18 XP15:
FFFFFFFFFFFFEB18 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEB1C 31FFFAD7 call XP18 ; is it "="?
FFFFFFFFFFFFEB20 BE208128 beq r2,r1,XPRT1 ; if not, return r2=1
FFFFFFFFFFFFEB24 BE0000AA bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEB28 XP16:
FFFFFFFFFFFFEB28 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEB2C 31FFFAD7 call XP18 ; is it "<"?
FFFFFFFFFFFFEB30 BE2080A0 blt r2,r1,XPRT1 ; if not, return r2=1
FFFFFFFFFFFFEB34 BE00002A bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEB38 XPRT0:
FFFFFFFFFFFFEB38 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEB3C E0400000 setlo r1,#0 ; return r1=0 (false)
FFFFFFFFFFFFEB40 37EF8010 ret #16
FFFFFFFFFFFFEB44 XPRT1:
FFFFFFFFFFFFEB44 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEB48 E0400001 setlo r1,#1 ; return r1=1 (true)
FFFFFFFFFFFFEB4C 37EF8010 ret #16
FFFFFFFFFFFFEB50 XP17: ; it's not a rel. operator
FFFFFFFFFFFFEB50 47E08008 lw r1,8[sp] ; return r2=<EXPR2>
FFFFFFFFFFFFEB54 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEB58 37EF8010 ret #16
FFFFFFFFFFFFEB5C XP18:
FFFFFFFFFFFFEB5C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEB60 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEB64 67E08008 sw r1,8[sp]
FFFFFFFFFFFFEB68 31FFFADE call EXPR2 ; do a second <EXPR2>
FFFFFFFFFFFFEB6C 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEB70 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEB74 37EF8010 ret #16
; <EXPR2>::=(+ or -)<EXPR3>(+ or -)<EXPR3>(...
FFFFFFFFFFFFEB78 EXPR2:
FFFFFFFFFFFFEB78 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEB7C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEB80 E0C0002D setlo r3,#'-'
FFFFFFFFFFFFEB84 9A026B98 lea r4,XP21
FFFFFFFFFFFFEB88 31FFFD30 call TSTC ; negative sign?
FFFFFFFFFFFFEB8C E0400000 setlo r1,#0 ; yes, fake '0-'
FFFFFFFFFFFFEB90 67E00008 sw r0,8[sp]
FFFFFFFFFFFFEB94 BE00020A bra XP26
FFFFFFFFFFFFEB98 XP21:
FFFFFFFFFFFFEB98 E0C0002B setlo r3,#'+'
FFFFFFFFFFFFEB9C 9A026BA4 lea r4,XP22
FFFFFFFFFFFFEBA0 31FFFD30 call TSTC ; positive sign? ignore it
FFFFFFFFFFFFEBA4 XP22:
FFFFFFFFFFFFEBA4 31FFFAFB call EXPR3 ; first <EXPR3>
FFFFFFFFFFFFEBA8 XP23:
FFFFFFFFFFFFEBA8 67E08008 sw r1,8[sp] ; yes, save the value
FFFFFFFFFFFFEBAC E0C0002B setlo r3,#'+'
FFFFFFFFFFFFEBB0 9A026BC8 lea r4,XP25
FFFFFFFFFFFFEBB4 31FFFD30 call TSTC ; add?
FFFFFFFFFFFFEBB8 31FFFAFB call EXPR3 ; get the second <EXPR3>
FFFFFFFFFFFFEBBC XP24:
FFFFFFFFFFFFEBBC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEBC0 04110402 add r1,r1,r2 ; add it to the first <EXPR3>
; BVS.L QHOW brnch if there's an overflow
FFFFFFFFFFFFEBC4 BE007F2A bra XP23 ; else go back for more operations
FFFFFFFFFFFFEBC8 XP25:
FFFFFFFFFFFFEBC8 E0C0002D setlo r3,#'-'
FFFFFFFFFFFFEBCC 9A026BE0 lea r4,XP45
FFFFFFFFFFFFEBD0 31FFFD30 call TSTC ; subtract?
FFFFFFFFFFFFEBD4 XP26:
FFFFFFFFFFFFEBD4 31FFFAFB call EXPR3 ; get second <EXPR3>
FFFFFFFFFFFFEBD8 02108006 neg r1,r1 ; change its sign
FFFFFFFFFFFFEBDC BE007F0A bra XP24 ; and do an addition
FFFFFFFFFFFFEBE0 XP45:
FFFFFFFFFFFFEBE0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEBE4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEBE8 37EF8010 ret #16
; <EXPR3>::=<EXPR4>( <* or /><EXPR4> )(...
FFFFFFFFFFFFEBEC EXPR3:
FFFFFFFFFFFFEBEC 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEBF0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEBF4 31FFFB11 call EXPR4 ; get first <EXPR4>
FFFFFFFFFFFFEBF8 XP31:
FFFFFFFFFFFFEBF8 67E08008 sw r1,8[sp] ; yes, save that first result
FFFFFFFFFFFFEBFC E0C0002A setlo r3,#'*'
FFFFFFFFFFFFEC00 9A026C18 lea r4,XP34
FFFFFFFFFFFFEC04 31FFFD30 call TSTC ; multiply?
FFFFFFFFFFFFEC08 31FFFB11 call EXPR4 ; get second <EXPR4>
FFFFFFFFFFFFEC0C 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEC10 04110419 muls r1,r1,r2 ; multiply the two
FFFFFFFFFFFFEC14 BE007F2A bra XP31 ; then look for more terms
FFFFFFFFFFFFEC18 XP34:
FFFFFFFFFFFFEC18 E0C0002F setlo r3,#'/'
FFFFFFFFFFFFEC1C 9A026C38 lea r4,XP47
FFFFFFFFFFFFEC20 31FFFD30 call TSTC ; divide?
FFFFFFFFFFFFEC24 31FFFB11 call EXPR4 ; get second <EXPR4>
FFFFFFFFFFFFEC28 04100809 or r2,r1,r0
FFFFFFFFFFFFEC2C 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEC30 0411041B divs r1,r1,r2 ; do the division
FFFFFFFFFFFFEC34 BE007E2A bra XP31 ; go back for any more terms
FFFFFFFFFFFFEC38 XP47:
FFFFFFFFFFFFEC38 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEC3C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEC40 37EF8010 ret #16
; Functions are called through EXPR4
; <EXPR4>::=<variable>
; <function>
; (<EXPR>)
FFFFFFFFFFFFEC44 EXPR4:
FFFFFFFFFFFFEC44 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFEC48 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEC4C 9A04E14E lea r9,TAB4 ; find possible function
FFFFFFFFFFFFEC50 9A056258 lea r10,TAB4_1
FFFFFFFFFFFFEC54 33FFF8C8 jmp EXEC ; branch to function which does subsequent ret for EXPR4
FFFFFFFFFFFFEC58 XP40: ; we get here if it wasn't a function
FFFFFFFFFFFFEC58 E0400000 setlo r1,#0
FFFFFFFFFFFFEC5C 31FFFB2E call TSTV
FFFFFFFFFFFFEC60 BE100088 beq r1,r0,XP41 ; nor a variable
FFFFFFFFFFFFEC64 46108000 lw r1,[r1] ; if a variable, return its value in r1
FFFFFFFFFFFFEC68 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEC6C 37EF8018 ret #24
FFFFFFFFFFFFEC70 XP41:
FFFFFFFFFFFFEC70 31FFFD3E call TSTNUM ; or is it a number?
FFFFFFFFFFFFEC74 BE200049 bne r2,r0,XP46 ; (if not, # of digits will be zero) if so, return it in r1
FFFFFFFFFFFFEC78 31FFFB21 call PARN ; check for (EXPR)
FFFFFFFFFFFFEC7C XP46:
FFFFFFFFFFFFEC7C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEC80 37EF8018 ret #24
; Check for a parenthesized expression
FFFFFFFFFFFFEC84 PARN:
FFFFFFFFFFFFEC84 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFEC88 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEC8C E0C00028 setlo r3,#'('
FFFFFFFFFFFFEC90 9A026CB0 lea r4,XP43
FFFFFFFFFFFFEC94 31FFFD30 call TSTC ; else look for ( OREXPR )
FFFFFFFFFFFFEC98 31FFFA7C call OREXPR
FFFFFFFFFFFFEC9C E0C00029 setlo r3,#')'
FFFFFFFFFFFFECA0 9A026CB0 lea r4,XP43
FFFFFFFFFFFFECA4 31FFFD30 call TSTC
FFFFFFFFFFFFECA8 XP42:
FFFFFFFFFFFFECA8 47EF8000 lw lr,[sp]
FFFFFFFFFFFFECAC 37EF8008 ret #8
FFFFFFFFFFFFECB0 XP43:
FFFFFFFFFFFFECB0 9A00F6F5 lea r1,msgWhat
FFFFFFFFFFFFECB4 BE001BAA bra ERROR
; ===== Test for a valid variable name. Returns Z=1 if not
; found, else returns Z=0 and the address of the
; variable in r1.
; Parameters
; r1 = 1 = allocate if not found
; Returns
; r1 = address of variable, zero if not found
FFFFFFFFFFFFECB8 TSTV:
FFFFFFFFFFFFECB8 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFECBC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFECC0 67E28008 sw r5,8[sp]
FFFFFFFFFFFFECC4 04101409 or r5,r1,r0 ; allocate flag
FFFFFFFFFFFFECC8 31FFFD55 call IGNBLK
FFFFFFFFFFFFECCC 4A808000 lbu r1,[r8] ; look at the program text
FFFFFFFFFFFFECD0 A0101740 blt r1,#'@',tstv_notfound ; C=1: not a variable
FFFFFFFFFFFFECD4 B2100F40 bne r1,#'@',TV1 ; brnch if not "@" array
FFFFFFFFFFFFECD8 0A840001 addui r8,r8,#1 ; If it is, it should be
FFFFFFFFFFFFECDC 31FFFB21 call PARN ; followed by (EXPR) as its index.
FFFFFFFFFFFFECE0 06108600 shli r1,r1,#3
; BCS.L QHOW say "How?" if index is too big
FFFFFFFFFFFFECE4 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFECE8 67E08008 sw r1,8[sp] ; save the index
FFFFFFFFFFFFECEC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFECF0 31FFFBD5 call SIZEX ; get amount of free memory
FFFFFFFFFFFFECF4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFECF8 47E10008 lw r2,8[sp] ; get back the index
FFFFFFFFFFFFECFC BE208044 bltu r2,r1,TV2 ; see if there's enough memory
FFFFFFFFFFFFED00 33FFFC07 jmp QSORRY ; if not, say "Sorry"
FFFFFFFFFFFFED04 TV2:
FFFFFFFFFFFFED04 9A0090D8 lea r1,VARBGN ; put address of array element...
FFFFFFFFFFFFED08 04110405 subu r1,r1,r2 ; into r1 (neg. offset is used)
FFFFFFFFFFFFED0C BE0000AA bra TSTVRT
FFFFFFFFFFFFED10 TV1:
FFFFFFFFFFFFED10 31FFFB4F call getVarName ; get variable name
FFFFFFFFFFFFED14 BE100068 beq r1,r0,TSTVRT ; if not, return r1=0
FFFFFFFFFFFFED18 02510009 mov r2,r5
FFFFFFFFFFFFED1C 31FFFB75 call findVar ; find or allocate
FFFFFFFFFFFFED20 TSTVRT:
FFFFFFFFFFFFED20 47E28008 lw r5,8[sp]
FFFFFFFFFFFFED24 47EF8000 lw lr,[sp]
FFFFFFFFFFFFED28 37EF8018 ret #24 ; r1<>0 (found)
FFFFFFFFFFFFED2C tstv_notfound:
FFFFFFFFFFFFED2C 47E28008 lw r5,8[sp]
FFFFFFFFFFFFED30 47EF8000 lw lr,[sp]
FFFFFFFFFFFFED34 E0400000 setlo r1,#0 ; r1=0 if not found
FFFFFFFFFFFFED38 37EF8018 ret #24
; Returns
; r1 = 6 character variable name + type
;
FFFFFFFFFFFFED3C getVarName:
FFFFFFFFFFFFED3C 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFED40 67EF8000 sw lr,[sp]
FFFFFFFFFFFFED44 67E28010 sw r5,16[sp]
FFFFFFFFFFFFED48 40808000 lb r1,[r8] ; get first character
FFFFFFFFFFFFED4C 67E08008 sw r1,8[sp] ; save off current name
FFFFFFFFFFFFED50 31FFFA9E call isAlpha
FFFFFFFFFFFFED54 BE100388 beq r1,r0,gvn1
FFFFFFFFFFFFED58 E1400005 setlo r5,#5 ; loop six more times
; check for second/third character
FFFFFFFFFFFFED5C gvn4:
FFFFFFFFFFFFED5C 0A840001 addui r8,r8,#1
FFFFFFFFFFFFED60 40808000 lb r1,[r8] ; do we have another char ?
FFFFFFFFFFFFED64 31FFFAA6 call isAlnum
FFFFFFFFFFFFED68 BE100168 beq r1,r0,gvn2 ; nope
FFFFFFFFFFFFED6C 47E08008 lw r1,8[sp] ; get varname
FFFFFFFFFFFFED70 06109000 shli r1,r1,#8
FFFFFFFFFFFFED74 40810000 lb r2,[r8]
FFFFFFFFFFFFED78 04110409 or r1,r1,r2 ; add in new char
FFFFFFFFFFFFED7C 67E08008 sw r1,8[sp] ; save off name again
FFFFFFFFFFFFED80 BE02FEEF loop r5,gvn4
; now ignore extra variable name characters
FFFFFFFFFFFFED84 gvn6:
FFFFFFFFFFFFED84 0A840001 addui r8,r8,#1
FFFFFFFFFFFFED88 40808000 lb r1,[r8]
FFFFFFFFFFFFED8C 31FFFAA6 call isAlnum
FFFFFFFFFFFFED90 BE107FA9 bne r1,r0,gvn6 ; keep looping as long as we have identifier chars
; check for a variable type
FFFFFFFFFFFFED94 gvn2:
FFFFFFFFFFFFED94 40808000 lb r1,[r8]
FFFFFFFFFFFFED98 B0100425 beq r1,#'%',gvn3
FFFFFFFFFFFFED9C B0100324 beq r1,#'$',gvn3
FFFFFFFFFFFFEDA0 E0400000 setlo r1,#0
FFFFFFFFFFFFEDA4 0E840001 subui r8,r8,#1
; insert variable type indicator and return
FFFFFFFFFFFFEDA8 gvn3:
FFFFFFFFFFFFEDA8 0A840001 addui r8,r8,#1
FFFFFFFFFFFFEDAC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEDB0 06211000 shli r2,r2,#8
FFFFFFFFFFFFEDB4 04110409 or r1,r1,r2 ; add in variable type
FFFFFFFFFFFFEDB8 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEDBC 47E28010 lw r5,16[sp]
FFFFFFFFFFFFEDC0 37EF8018 ret #24 ; return Z = 0, r1 = varname
; not a variable name
FFFFFFFFFFFFEDC4 gvn1:
FFFFFFFFFFFFEDC4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEDC8 47E28010 lw r5,16[sp]
FFFFFFFFFFFFEDCC E0400000 setlo r1,#0 ; return Z = 1 if not a varname
FFFFFFFFFFFFEDD0 37EF8018 ret #24
; Find variable
; r1 = varname
; r2 = allocate flag
; Returns
; r1 = variable address, Z =0 if found / allocated, Z=1 if not found
FFFFFFFFFFFFEDD4 findVar:
FFFFFFFFFFFFEDD4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEDD8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEDDC 67E38008 sw r7,8[sp]
FFFFFFFFFFFFEDE0 460190D8 lw r3,VARBGN
FFFFFFFFFFFFEDE4 fv4:
FFFFFFFFFFFFEDE4 46338000 lw r7,[r3] ; get varname / type
FFFFFFFFFFFFEDE8 BE700108 beq r7,r0,fv3 ; no more vars ?
FFFFFFFFFFFFEDEC BE138128 beq r1,r7,fv1 ; match ?
FFFFFFFFFFFFEDF0 08318008 add r3,r3,#8 ; move to next var
FFFFFFFFFFFFEDF4 460390F8 lw r7,STKBOT
FFFFFFFFFFFFEDF8 BE33FF60 blt r3,r7,fv4 ; loop back to look at next var
; variable not found
; no more memory
FFFFFFFFFFFFEDFC E07FF748 setlo r1,#<msgVarSpace
FFFFFFFFFFFFEE00 F04FFFFF sethi r1,#>msgVarSpace
FFFFFFFFFFFFEE04 BE00112A bra ERROR
; lw lr,[sp]
; lw r7,4[sp]
; add sp,sp,#8
; lw r1,#0
; ret
; variable not found
; allocate new ?
FFFFFFFFFFFFEE08 fv3:
FFFFFFFFFFFFEE08 BE2000C8 beq r2,r0,fv2
FFFFFFFFFFFFEE0C 66308000 sw r1,[r3] ; save varname / type
; found variable
; return address
FFFFFFFFFFFFEE10 fv1:
FFFFFFFFFFFFEE10 0A308008 addui r1,r3,#8
FFFFFFFFFFFFEE14 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEE18 47E38008 lw r7,8[sp]
FFFFFFFFFFFFEE1C 37EF8010 ret #16 ; Z = 0, r1 = address
; didn't find var and not allocating
FFFFFFFFFFFFEE20 fv2:
FFFFFFFFFFFFEE20 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEE24 47E38008 lw r7,8[sp]
FFFFFFFFFFFFEE28 0BEF0010 addui sp,sp,#16 ; Z = 0, r1 = address
FFFFFFFFFFFFEE2C E0400000 setlo r1,#0 ; Z = 1, r1 = 0
FFFFFFFFFFFFEE30 37EF8000 ret
; ===== Multiplies the 32 bit values in r1 and r2, returning
; the 32 bit result in r1.
;
; ===== Divide the 32 bit value in r2 by the 32 bit value in r3.
; Returns the 32 bit quotient in r1, remainder in r2
;
; r2 = a
; r3 = b
; r6 = remainder
; r7 = iteration count
; r8 = sign
;
; q = a / b
; a = r1
; b = r2
; q = r2
; ===== The PEEK function returns the byte stored at the address
; contained in the following expression.
;
FFFFFFFFFFFFEE34 PEEK:
FFFFFFFFFFFFEE34 31FFFB21 call PARN ; get the memory address
FFFFFFFFFFFFEE38 4A108000 lbu r1,[r1] ; get the addressed byte
FFFFFFFFFFFFEE3C 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFEE40 37EF8018 ret #24
; ===== The PEEK function returns the byte stored at the address
; contained in the following expression.
;
FFFFFFFFFFFFEE44 PEEKC:
FFFFFFFFFFFFEE44 31FFFB21 call PARN ; get the memory address
FFFFFFFFFFFFEE48 1410FFFE andi r1,r1,#-2 ; align to char address
FFFFFFFFFFFFEE4C 4C108000 lcu r1,[r1] ; get the addressed char
FFFFFFFFFFFFEE50 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFEE54 37EF8018 ret #24
; ===== The PEEK function returns the byte stored at the address
; contained in the following expression.
;
FFFFFFFFFFFFEE58 PEEKH:
FFFFFFFFFFFFEE58 31FFFB21 call PARN ; get the memory address
FFFFFFFFFFFFEE5C 1410FFFC andi r1,r1,#-4 ; align to half-word address
FFFFFFFFFFFFEE60 4E108000 lhu r1,[r1] ; get the addressed char
FFFFFFFFFFFFEE64 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFEE68 37EF8018 ret #24
; ===== The PEEK function returns the byte stored at the address
; contained in the following expression.
;
FFFFFFFFFFFFEE6C PEEKW:
FFFFFFFFFFFFEE6C 31FFFB21 call PARN ; get the memory address
FFFFFFFFFFFFEE70 1410FFF8 andi r1,r1,#-8 ; align to word address
FFFFFFFFFFFFEE74 46108000 lw r1,[r1] ; get the addressed word
FFFFFFFFFFFFEE78 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFEE7C 37EF8018 ret #24
; user function call
; call the user function with argument in r1
FFFFFFFFFFFFEE80 USRX:
FFFFFFFFFFFFEE80 31FFFB21 call PARN ; get expression value
FFFFFFFFFFFFEE84 67E40008 sw r8,8[sp] ; save the text pointer
FFFFFFFFFFFFEE88 46011028 lw r2,usrJmp ; get usr vector
FFFFFFFFFFFFEE8C 342F8000 jal r31,[r2] ; jump to the subroutine
FFFFFFFFFFFFEE90 47E40008 lw r8,8[sp] ; restore the text pointer
FFFFFFFFFFFFEE94 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEE98 37EF8018 ret #24
; ===== The RND function returns a random number from 1 to
; the value of the following expression in D0.
;
FFFFFFFFFFFFEE9C RND:
FFFFFFFFFFFFEE9C 31FFFB21 call PARN ; get the upper limit
FFFFFFFFFFFFEEA0 BE100168 beq r1,r0,rnd2 ; it must be positive and non-zero
FFFFFFFFFFFFEEA4 BE100100 blt r1,r0,rnd1
FFFFFFFFFFFFEEA8 04100809 lw r2,r1
FFFFFFFFFFFFEEAC 00000050 gran ; generate a random number
FFFFFFFFFFFFEEB0 020088A8 mfspr r1,rand ; get the number
FFFFFFFFFFFFEEB4 31FFFBB7 call modu4 ; RND(n)=MOD(number,n)+1
FFFFFFFFFFFFEEB8 0A108001 addui r1,r1,#1
FFFFFFFFFFFFEEBC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEEC0 37EF8018 ret #24
FFFFFFFFFFFFEEC4 rnd1:
FFFFFFFFFFFFEEC4 9A00F7B9 lea r1,msgRNDBad
FFFFFFFFFFFFEEC8 BE000B0A bra ERROR
FFFFFFFFFFFFEECC rnd2:
FFFFFFFFFFFFEECC 00000050 gran
FFFFFFFFFFFFEED0 020088A8 mfspr r1,rand
FFFFFFFFFFFFEED4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEED8 37EF8018 ret #24
; r = a mod b
; a = r1
; b = r2
; r = r6
FFFFFFFFFFFFEEDC modu4:
FFFFFFFFFFFFEEDC 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFEEE0 67E18000 sw r3,[sp]
FFFFFFFFFFFFEEE4 67E28008 sw r5,8[sp]
FFFFFFFFFFFFEEE8 67E30010 sw r6,16[sp]
FFFFFFFFFFFFEEEC 67E38018 sw r7,24[sp]
FFFFFFFFFFFFEEF0 1603803F lw r7,#63 ; n = 64
FFFFFFFFFFFFEEF4 0452940A xor r5,r5,r5 ; w = 0
FFFFFFFFFFFFEEF8 0463180A xor r6,r6,r6 ; r = 0
FFFFFFFFFFFFEEFC mod2:
FFFFFFFFFFFFEEFC 06108202 roli r1,r1,#1 ; a <<= 1
FFFFFFFFFFFFEF00 14118001 andi r3,r1,#1
FFFFFFFFFFFFEF04 06630200 shli r6,r6,#1 ; r <<= 1
FFFFFFFFFFFFEF08 04619809 or r6,r6,r3
FFFFFFFFFFFFEF0C 1410FFFE andi r1,r1,#-2
FFFFFFFFFFFFEF10 BE230047 bgtu r2,r6,mod1 ; b < r ?
FFFFFFFFFFFFEF14 04611805 subu r6,r6,r2 ; r -= b
FFFFFFFFFFFFEF18 mod1:
FFFFFFFFFFFFEF18 BE03FF2F loop r7,mod2 ; n--
FFFFFFFFFFFFEF1C 02608009 mov r1,r6
FFFFFFFFFFFFEF20 47E18000 lw r3,[sp]
FFFFFFFFFFFFEF24 47E28008 lw r5,8[sp]
FFFFFFFFFFFFEF28 47E30010 lw r6,16[sp]
FFFFFFFFFFFFEF2C 47E38018 lw r7,24[sp]
FFFFFFFFFFFFEF30 37EF8020 ret #32
; ===== The ABS function returns an absolute value in r2.
;
FFFFFFFFFFFFEF34 ABS:
FFFFFFFFFFFFEF34 31FFFB21 call PARN ; get the following expr.'s value
FFFFFFFFFFFFEF38 02108007 abs r1,r1
FFFFFFFFFFFFEF3C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEF40 37EF8018 ret #24
; ===== The SGN function returns the sign in r1. +1,0, or -1
;
FFFFFFFFFFFFEF44 SGN:
FFFFFFFFFFFFEF44 31FFFB21 call PARN ; get the following expr.'s value
FFFFFFFFFFFFEF48 02108008 sgn r1,r1
FFFFFFFFFFFFEF4C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEF50 37EF8018 ret #24
; ===== The SIZE function returns the size of free memory in r1.
;
FFFFFFFFFFFFEF54 SIZEX:
FFFFFFFFFFFFEF54 460090D8 lw r1,VARBGN ; get the number of free bytes...
FFFFFFFFFFFFEF58 460110D0 lw r2,TXTUNF ; between 'TXTUNF' and 'VARBGN'
FFFFFFFFFFFFEF5C 04110405 subu r1,r1,r2
FFFFFFFFFFFFEF60 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEF64 37EF8018 ret #24 ; return the number in r2
;******************************************************************
;
; *** SETVAL *** FIN *** ENDCHK *** ERROR (& friends) ***
;
; 'SETVAL' expects a variable, followed by an equal sign and then
; an expression. It evaluates the expression and sets the variable
; to that value.
;
; 'FIN' checks the end of a command. If it ended with ":",
; execution continues. If it ended with a CR, it finds the
; the next line and continues from there.
;
; 'ENDCHK' checks if a command is ended with a CR. This is
; required in certain commands, such as GOTO, RETURN, STOP, etc.
;
; 'ERROR' prints the string pointed to by r1. It then prints the
; line pointed to by CURRNT with a "?" inserted at where the
; old text pointer (should be on top of the stack) points to.
; Execution of Tiny BASIC is stopped and a warm start is done.
; If CURRNT is zero (indicating a direct command), the direct
; command is not printed. If CURRNT is -1 (indicating
; 'INPUT' command in progress), the input line is not printed
; and execution is not terminated but continues at 'INPERR'.
;
; Related to 'ERROR' are the following:
; 'QWHAT' saves text pointer on stack and gets "What?" message.
; 'AWHAT' just gets the "What?" message and jumps to 'ERROR'.
; 'QSORRY' and 'ASORRY' do the same kind of thing.
; 'QHOW' and 'AHOW' also do this for "How?".
;
; returns
; r2 = variable's address
;
FFFFFFFFFFFFEF68 SETVAL:
FFFFFFFFFFFFEF68 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEF6C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEF70 E0400001 setlo r1,#1 ; allocate var
FFFFFFFFFFFFEF74 31FFFB2E call TSTV ; variable name?
FFFFFFFFFFFFEF78 BE100069 bne r1,r0,sv2
FFFFFFFFFFFFEF7C 9A00F7A2 lea r1,msgVar
FFFFFFFFFFFFEF80 BE00054A bra ERROR
FFFFFFFFFFFFEF84 sv2:
FFFFFFFFFFFFEF84 67E08008 sw r1,8[sp] ; save the variable's address
FFFFFFFFFFFFEF88 E0C0003D setlo r3,#'='
FFFFFFFFFFFFEF8C 9A026FAC lea r4,SV1
FFFFFFFFFFFFEF90 31FFFD30 call TSTC ; get past the "=" sign
FFFFFFFFFFFFEF94 31FFFA7C call OREXPR ; evaluate the expression
FFFFFFFFFFFFEF98 47E10008 lw r2,8[sp] ; get back the variable's address
FFFFFFFFFFFFEF9C 66208000 sw r1,[r2] ; and save value in the variable
FFFFFFFFFFFFEFA0 04200409 lw r1,r2 ; return r1 = variable address
FFFFFFFFFFFFEFA4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEFA8 37EF8010 ret #16
FFFFFFFFFFFFEFAC SV1:
FFFFFFFFFFFFEFAC BE0003CA bra QWHAT ; if no "=" sign
FFFFFFFFFFFFEFB0 FIN:
FFFFFFFFFFFFEFB0 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFEFB4 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEFB8 E0C0003A setlo r3,#':'
FFFFFFFFFFFFEFBC 9A026FCC lea r4,FI1
FFFFFFFFFFFFEFC0 31FFFD30 call TSTC ; *** FIN ***
FFFFFFFFFFFFEFC4 0BEF0008 addui sp,sp,#8 ; if ":", discard return address
FFFFFFFFFFFFEFC8 BE0020AA bra RUNSML ; continue on the same line
FFFFFFFFFFFFEFCC FI1:
FFFFFFFFFFFFEFCC E0C0000D setlo r3,#CR
FFFFFFFFFFFFEFD0 9A026FE4 lea r4,FI2
FFFFFFFFFFFFEFD4 31FFFD30 call TSTC ; not ":", is it a CR?
FFFFFFFFFFFFEFD8 47EF8000 lw lr,[sp] ; else return to the caller
FFFFFFFFFFFFEFDC 0BEF0008 addui sp,sp,#8 ; yes, purge return address
FFFFFFFFFFFFEFE0 BE001EAA bra RUNNXL ; execute the next line
FFFFFFFFFFFFEFE4 FI2:
FFFFFFFFFFFFEFE4 47EF8000 lw lr,[sp] ; else return to the caller
FFFFFFFFFFFFEFE8 37EF8008 ret #8
; Check that there is nothing else on the line
; Registers Affected
; r1
;
FFFFFFFFFFFFEFEC ENDCHK:
FFFFFFFFFFFFEFEC 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFEFF0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEFF4 31FFFD55 call IGNBLK
FFFFFFFFFFFFEFF8 40808000 lb r1,[r8]
FFFFFFFFFFFFEFFC B010040D beq r1,#CR,ec1 ; does it end with a CR?
FFFFFFFFFFFFF000 E07FF87C setlo r1,#<msgExtraChars
FFFFFFFFFFFFF004 F04FFFFF sethi r1,#>msgExtraChars
FFFFFFFFFFFFF008 33FFFC0A jmp ERROR
FFFFFFFFFFFFF00C ec1:
FFFFFFFFFFFFF00C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF010 37EF8008 ret #8
FFFFFFFFFFFFF014 TOOBIG:
FFFFFFFFFFFFF014 9A00F867 lea r1,msgTooBig
FFFFFFFFFFFFF018 BE00008A bra ERROR
FFFFFFFFFFFFF01C QSORRY:
FFFFFFFFFFFFF01C 9A00F6FD lea r1,SRYMSG
FFFFFFFFFFFFF020 BE00004A bra ERROR
FFFFFFFFFFFFF024 QWHAT:
FFFFFFFFFFFFF024 9A00F6F5 lea r1,msgWhat
FFFFFFFFFFFFF028 ERROR:
FFFFFFFFFFFFF028 31FFFD81 call PRMESG ; display the error message
FFFFFFFFFFFFF02C 46009090 lw r1,CURRNT ; get the current line number
FFFFFFFFFFFFF030 BE107EA8 beq r1,r0,WSTART ; if zero, do a warm start
FFFFFFFFFFFFF034 B01D9AFF beq r1,#-1,INPERR ; is the line no. pointer = -1? if so, redo input
FFFFFFFFFFFFF038 40828000 lb r5,[r8] ; save the char. pointed to
FFFFFFFFFFFFF03C 60800000 sb r0,[r8] ; put a zero where the error is
FFFFFFFFFFFFF040 46009090 lw r1,CURRNT ; point to start of current line
FFFFFFFFFFFFF044 31FFFD1E call PRTLN ; display the line in error up to the 0
FFFFFFFFFFFFF048 04101809 or r6,r1,r0 ; save off end pointer
FFFFFFFFFFFFF04C 60828000 sb r5,[r8] ; restore the character
FFFFFFFFFFFFF050 E040003F setlo r1,#'?' ; display a "?"
FFFFFFFFFFFFF054 31FFF7D5 call GOOUT
FFFFFFFFFFFFF058 E0800000 setlo r2,#0 ; stop char = 0
FFFFFFFFFFFFF05C 0E608001 subui r1,r6,#1 ; point back to the error char.
FFFFFFFFFFFFF060 31FFFC93 call PRTSTG ; display the rest of the line
FFFFFFFFFFFFF064 33FFF801 jmp WSTART ; and do a warm start
;******************************************************************
;
; *** GETLN *** FNDLN (& friends) ***
;
; 'GETLN' reads in input line into 'BUFFER'. It first prompts with
; the character in r3 (given by the caller), then it fills the
; buffer and echos. It ignores LF's but still echos
; them back. Control-H is used to delete the last character
; entered (if there is one), and control-X is used to delete the
; whole line and start over again. CR signals the end of a line,
; and causes 'GETLN' to return.
;
;
FFFFFFFFFFFFF068 GETLN:
FFFFFFFFFFFFF068 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF06C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF070 67E28008 sw r5,8[sp]
FFFFFFFFFFFFF074 31FFF7D5 call GOOUT ; display the prompt
FFFFFFFFFFFFF078 E0400001 setlo r1,#1 ; turn on cursor flash
FFFFFFFFFFFFF07C 60009052 sb r1,cursFlash
FFFFFFFFFFFFF080 E0400020 setlo r1,#' ' ; and a space
FFFFFFFFFFFFF084 31FFF7D5 call GOOUT
FFFFFFFFFFFFF088 E200111B setlo r8,#<BUFFER ; r8 is the buffer pointer
FFFFFFFFFFFFF08C F2000000 sethi r8,#>BUFFER
FFFFFFFFFFFFF090 GL1:
FFFFFFFFFFFFF090 31FFFD77 call CHKIO ; check keyboard
FFFFFFFFFFFFF094 BE107FE8 beq r1,r0,GL1 ; wait for a char. to come in
FFFFFFFFFFFFF098 B0100B08 beq r1,#CTRLH,GL3 ; delete last character? if so
FFFFFFFFFFFFF09C B0101418 beq r1,#CTRLX,GL4 ; delete the whole line?
FFFFFFFFFFFFF0A0 B010020D beq r1,#CR,GL2 ; accept a CR
FFFFFFFFFFFFF0A4 A81FFB20 bltu r1,#' ',GL1 ; if other control char., discard it
FFFFFFFFFFFFF0A8 GL2:
FFFFFFFFFFFFF0A8 60808000 sb r1,[r8] ; save the char.
FFFFFFFFFFFFF0AC 08840001 add r8,r8,#1
FFFFFFFFFFFFF0B0 31FFF7D5 call GOOUT ; echo the char back out
FFFFFFFFFFFFF0B4 4080FFFF lb r1,-1[r8] ; get char back (GOOUT destroys r1)
FFFFFFFFFFFFF0B8 B010190D beq r1,#CR,GL7 ; if it's a CR, end the line
FFFFFFFFFFFFF0BC 1280916A cmpui r1,r8,#BUFFER+BUFLEN-1 ; any more room?
FFFFFFFFFFFFF0C0 BE107E80 blt r1,r0,GL1 ; yes: get some more, else delete last char.
FFFFFFFFFFFFF0C4 GL3:
FFFFFFFFFFFFF0C4 E0400008 setlo r1,#CTRLH ; delete a char. if possible
FFFFFFFFFFFFF0C8 31FFF7D5 call GOOUT
FFFFFFFFFFFFF0CC E0400020 setlo r1,#' '
FFFFFFFFFFFFF0D0 31FFF7D5 call GOOUT
FFFFFFFFFFFFF0D4 1280911B cmpui r1,r8,#BUFFER ; any char.'s left?
FFFFFFFFFFFFF0D8 BE107DC2 ble r1,r0,GL1 ; if not
FFFFFFFFFFFFF0DC E0400008 setlo r1,#CTRLH ; if so, finish the BS-space-BS sequence
FFFFFFFFFFFFF0E0 31FFF7D5 call GOOUT
FFFFFFFFFFFFF0E4 0C840001 sub r8,r8,#1 ; decrement the text pointer
FFFFFFFFFFFFF0E8 BE007D4A bra GL1 ; back for more
FFFFFFFFFFFFF0EC GL4:
FFFFFFFFFFFFF0EC 04800409 or r1,r8,r0 ; delete the whole line
FFFFFFFFFFFFF0F0 0E12911B subui r5,r1,#BUFFER ; figure out how many backspaces we need
FFFFFFFFFFFFF0F4 BE500108 beq r5,r0,GL6 ; if none needed, brnch
FFFFFFFFFFFFF0F8 GL5:
FFFFFFFFFFFFF0F8 E0400008 setlo r1,#CTRLH ; and display BS-space-BS sequences
FFFFFFFFFFFFF0FC 31FFF7D5 call GOOUT
FFFFFFFFFFFFF100 E0400020 setlo r1,#' '
FFFFFFFFFFFFF104 31FFF7D5 call GOOUT
FFFFFFFFFFFFF108 E0400008 setlo r1,#CTRLH
FFFFFFFFFFFFF10C 31FFF7D5 call GOOUT
FFFFFFFFFFFFF110 BE02FF4F loop r5,GL5
FFFFFFFFFFFFF114 GL6:
FFFFFFFFFFFFF114 9A04111B lea r8,BUFFER ; reinitialize the text pointer
FFFFFFFFFFFFF118 BE007BCA bra GL1 ; and go back for more
FFFFFFFFFFFFF11C GL7:
FFFFFFFFFFFFF11C E0400000 setlo r1,#0 ; turn off cursor flash
FFFFFFFFFFFFF120 60009052 sb r1,cursFlash
FFFFFFFFFFFFF124 E040000A setlo r1,#LF ; echo a LF for the CR
FFFFFFFFFFFFF128 31FFF7D5 call GOOUT
FFFFFFFFFFFFF12C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF130 47E28008 lw r5,8[sp]
FFFFFFFFFFFFF134 37EF8010 ret #16
; 'FNDLN' finds a line with a given line no. (in r1) in the
; text save area. r9 is used as the text pointer. If the line
; is found, r9 will point to the beginning of that line
; (i.e. the high byte of the line no.), and flags are Z.
; If that line is not there and a line with a higher line no.
; is found, r9 points there and flags are NC & NZ. If we reached
; the end of the text save area and cannot find the line, flags
; are C & NZ.
; Z=1 if line found
; N=1 if end of text save area
; Z=0 & N=0 if higher line found
; r0 = 1 <= line is found
; r9 = pointer to line
; r0 = 0 <= line is not found
; r9 = zero, if end of text area
; r9 = otherwise higher line number
;
; 'FNDLN' will initialize r9 to the beginning of the text save
; area to start the search. Some other entries of this routine
; will not initialize r9 and do the search.
; 'FNDLNP' will start with r9 and search for the line no.
; 'FNDNXT' will bump r9 by 2, find a CR and then start search.
; 'FNDSKP' uses r9 to find a CR, and then starts the search.
; return Z=1 if line is found, r9 = pointer to line
;
; Parameters
; r1 = line number to find
;
FFFFFFFFFFFFF138 FNDLN:
FFFFFFFFFFFFF138 AC1003FF bleui r1,#0xFFFF,fl1 ; line no. must be < 65535
FFFFFFFFFFFFF13C 9A00F78C lea r1,msgLineRange
FFFFFFFFFFFFF140 BE00774A bra ERROR
FFFFFFFFFFFFF144 fl1:
FFFFFFFFFFFFF144 4604DF68 lw r9,TXTBGN ; init. the text save pointer
FFFFFFFFFFFFF148 FNDLNP:
FFFFFFFFFFFFF148 460510D0 lw r10,TXTUNF ; check if we passed the end
FFFFFFFFFFFFF14C 0EA50001 subui r10,r10,#1
FFFFFFFFFFFFF150 BE950127 bgtu r9,r10,FNDRET1 ; if so, return with r9=0,r1=0
FFFFFFFFFFFFF154 4A918000 lbu r3,[r9] ; get low order byte of line number
FFFFFFFFFFFFF158 4A910001 lbu r2,1[r9] ; get high order byte
FFFFFFFFFFFFF15C 06211000 shli r2,r2,#8
FFFFFFFFFFFFF160 04218809 or r2,r2,r3 ; build whole line number
FFFFFFFFFFFFF164 BE110127 bgtu r1,r2,FNDNXT ; is this the line we want? no, not there yet
FFFFFFFFFFFFF168 BE1100C8 beq r1,r2,FNDRET2
FFFFFFFFFFFFF16C FNDRET:
FFFFFFFFFFFFF16C 0410840A xor r1,r1,r1 ; line not found, but r9=next line pointer
FFFFFFFFFFFFF170 37EF8000 ret ; return the cond. codes
FFFFFFFFFFFFF174 FNDRET1:
FFFFFFFFFFFFF174 0494A40A xor r9,r9,r9 ; no higher line
FFFFFFFFFFFFF178 0410840A xor r1,r1,r1 ; line not found
FFFFFFFFFFFFF17C 37EF8000 ret
FFFFFFFFFFFFF180 FNDRET2:
FFFFFFFFFFFFF180 E0400001 setlo r1,#1 ; line found
FFFFFFFFFFFFF184 37EF8000 ret
FFFFFFFFFFFFF188 FNDNXT:
FFFFFFFFFFFFF188 0A948002 addui r9,r9,#2 ; find the next line
FFFFFFFFFFFFF18C FNDSKP:
FFFFFFFFFFFFF18C 4A910000 lbu r2,[r9]
FFFFFFFFFFFFF190 0A948001 addui r9,r9,#1
FFFFFFFFFFFFF194 B22FFE0D bnei r2,#CR,FNDSKP ; try to find a CR, keep looking
FFFFFFFFFFFFF198 BE007D8A bra FNDLNP ; check if end of text
;******************************************************************
; 'MVUP' moves a block up from where r1 points to where r2 points
; until r1=r3
;
FFFFFFFFFFFFF19C MVUP1:
FFFFFFFFFFFFF19C 40120000 lb r4,[r1]
FFFFFFFFFFFFF1A0 60220000 sb r4,[r2]
FFFFFFFFFFFFF1A4 08108001 add r1,r1,#1
FFFFFFFFFFFFF1A8 08210001 add r2,r2,#1
FFFFFFFFFFFFF1AC MVUP:
FFFFFFFFFFFFF1AC BE11FF89 bne r1,r3,MVUP1
FFFFFFFFFFFFF1B0 MVRET:
FFFFFFFFFFFFF1B0 37EF8000 ret
; 'MVDOWN' moves a block down from where r1 points to where r2
; points until r1=r3
;
FFFFFFFFFFFFF1B4 MVDOWN1:
FFFFFFFFFFFFF1B4 0C108001 sub r1,r1,#1
FFFFFFFFFFFFF1B8 0C210001 sub r2,r2,#1
FFFFFFFFFFFFF1BC 40120000 lb r4,[r1]
FFFFFFFFFFFFF1C0 60220000 sb r4,[r2]
FFFFFFFFFFFFF1C4 MVDOWN:
FFFFFFFFFFFFF1C4 BE11FF89 bne r1,r3,MVDOWN1
FFFFFFFFFFFFF1C8 37EF8000 ret
; 'POPA' restores the 'FOR' loop variable save area from the stack
;
; 'PUSHA' stacks for 'FOR' loop variable save area onto the stack
;
; Note: a single zero word is stored on the stack in the
; case that no FOR loops need to be saved. This needs to be
; done because PUSHA / POPA is called all the time.
FFFFFFFFFFFFF1CC POPA:
FFFFFFFFFFFFF1CC 47E08000 lw r1,[sp] ; restore LOPVAR, but zero means no more
FFFFFFFFFFFFF1D0 660090A8 sw r1,LOPVAR
FFFFFFFFFFFFF1D4 BE100148 beq r1,r0,PP1
FFFFFFFFFFFFF1D8 47E08020 lw r1,32[sp] ; if not zero, restore the rest
FFFFFFFFFFFFF1DC 660090C8 sw r1,LOPPT
FFFFFFFFFFFFF1E0 47E08018 lw r1,24[sp]
FFFFFFFFFFFFF1E4 660090C0 sw r1,LOPLN
FFFFFFFFFFFFF1E8 47E08010 lw r1,16[sp]
FFFFFFFFFFFFF1EC 660090B8 sw r1,LOPLMT
FFFFFFFFFFFFF1F0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFF1F4 660090B0 sw r1,LOPINC
FFFFFFFFFFFFF1F8 37EF8028 ret #40
FFFFFFFFFFFFF1FC PP1:
FFFFFFFFFFFFF1FC 37EF8008 ret #8
FFFFFFFFFFFFF200 PUSHA:
FFFFFFFFFFFFF200 460090F8 lw r1,STKBOT ; Are we running out of stack room?
FFFFFFFFFFFFF204 0A108028 addui r1,r1,#40 ; we might need this many bytes
FFFFFFFFFFFFF208 BFE0F0A4 bltu sp,r1,QSORRY ; out of stack space
FFFFFFFFFFFFF20C 460090A8 lw r1,LOPVAR ; save loop variables
FFFFFFFFFFFFF210 BE100188 beq r1,r0,PU1 ; if LOPVAR is zero, that's all
FFFFFFFFFFFFF214 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFF218 67E08000 sw r1,[sp]
FFFFFFFFFFFFF21C 460090C8 lw r1,LOPPT
FFFFFFFFFFFFF220 67E08020 sw r1,32[sp] ; else save all the others
FFFFFFFFFFFFF224 460090C0 lw r1,LOPLN
FFFFFFFFFFFFF228 67E08018 sw r1,24[sp]
FFFFFFFFFFFFF22C 460090B8 lw r1,LOPLMT
FFFFFFFFFFFFF230 67E08010 sw r1,16[sp]
FFFFFFFFFFFFF234 460090B0 lw r1,LOPINC
FFFFFFFFFFFFF238 67E08008 sw r1,8[sp]
FFFFFFFFFFFFF23C 37EF8000 ret
FFFFFFFFFFFFF240 PU1:
FFFFFFFFFFFFF240 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF244 67E08000 sw r1,[sp]
FFFFFFFFFFFFF248 37EF8000 ret
;******************************************************************
;
; *** PRTSTG *** QTSTG *** PRTNUM *** PRTLN ***
;
; 'PRTSTG' prints a string pointed to by r3. It stops printing
; and returns to the caller when either a CR is printed or when
; the next byte is the same as what was passed in r4 by the
; caller.
;
; 'QTSTG' looks for an underline (back-arrow on some systems),
; single-quote, or double-quote. If none of these are found, returns
; to the caller. If underline, outputs a CR without a LF. If single
; or double quote, prints the quoted string and demands a matching
; end quote. After the printing, the next i-word of the caller is
; skipped over (usually a branch instruction).
;
; 'PRTNUM' prints the 32 bit number in r3, leading blanks are added if
; needed to pad the number of spaces to the number in r4.
; However, if the number of digits is larger than the no. in
; r4, all digits are printed anyway. Negative sign is also
; printed and counted in, positive sign is not.
;
; 'PRTLN' prints the saved text line pointed to by r3
; with line no. and all.
;
; r1 = pointer to string
; r2 = stop character
; return r1 = pointer to end of line + 1
FFFFFFFFFFFFF24C PRTSTG:
FFFFFFFFFFFFF24C 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFF250 67E28000 sw r5,[sp]
FFFFFFFFFFFFF254 67E28008 sw r5,8[sp]
FFFFFFFFFFFFF258 67E38010 sw r7,16[sp]
FFFFFFFFFFFFF25C 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFF260 02128009 mov r5,r1 ; r5 = pointer
FFFFFFFFFFFFF264 02230009 mov r6,r2 ; r6 = stop char
FFFFFFFFFFFFF268 PS1:
FFFFFFFFFFFFF268 4A538000 lbu r7,[r5] ; get a text character
FFFFFFFFFFFFF26C 0A528001 addui r5,r5,#1
FFFFFFFFFFFFF270 BE7300C8 beq r7,r6,PRTRET ; same as stop character? if so, return
FFFFFFFFFFFFF274 02708009 mov r1,r7
FFFFFFFFFFFFF278 31FFF7D5 call GOOUT ; display the char.
FFFFFFFFFFFFF27C B27FFB0D bnei r7,#CR,PS1 ; is it a C.R.? no, go back for more
FFFFFFFFFFFFF280 E040000A setlo r1,#LF ; yes, add a L.F.
FFFFFFFFFFFFF284 31FFF7D5 call GOOUT
FFFFFFFFFFFFF288 PRTRET:
FFFFFFFFFFFFF288 02710009 mov r2,r7 ; return r2 = stop char
FFFFFFFFFFFFF28C 02508009 mov r1,r5 ; return r1 = line pointer
FFFFFFFFFFFFF290 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFF294 47E38010 lw r7,16[sp]
FFFFFFFFFFFFF298 47E28008 lw r5,8[sp]
FFFFFFFFFFFFF29C 47E28000 lw r5,[sp]
FFFFFFFFFFFFF2A0 37EF8020 ret #32 ; then return
FFFFFFFFFFFFF2A4 QTSTG:
FFFFFFFFFFFFF2A4 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF2A8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF2AC E0C00022 setlo r3,#'"'
FFFFFFFFFFFFF2B0 9A0272D4 lea r4,QT3
FFFFFFFFFFFFF2B4 31FFFD30 call TSTC ; *** QTSTG ***
FFFFFFFFFFFFF2B8 E0800022 setlo r2,#'"' ; it is a "
FFFFFFFFFFFFF2BC QT1:
FFFFFFFFFFFFF2BC 04800409 or r1,r8,r0
FFFFFFFFFFFFF2C0 31FFFC93 call PRTSTG ; print until another
FFFFFFFFFFFFF2C4 04102009 lw r8,r1
FFFFFFFFFFFFF2C8 B2200D0A bne r2,#LF,QT2 ; was last one a CR?
FFFFFFFFFFFFF2CC 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFF2D0 BE00072A bra RUNNXL ; if so, run next line
FFFFFFFFFFFFF2D4 QT3:
FFFFFFFFFFFFF2D4 E0C00027 setlo r3,#''''
FFFFFFFFFFFFF2D8 9A0272E8 lea r4,QT4
FFFFFFFFFFFFF2DC 31FFFD30 call TSTC ; is it a single quote?
FFFFFFFFFFFFF2E0 E0800027 setlo r2,#'''' ; if so, do same as above
FFFFFFFFFFFFF2E4 BE007ECA bra QT1
FFFFFFFFFFFFF2E8 QT4:
FFFFFFFFFFFFF2E8 E0C0005F setlo r3,#'_'
FFFFFFFFFFFFF2EC 9A027308 lea r4,QT5
FFFFFFFFFFFFF2F0 31FFFD30 call TSTC ; is it an underline?
FFFFFFFFFFFFF2F4 E040000D setlo r1,#CR ; if so, output a CR without LF
FFFFFFFFFFFFF2F8 31FFF7D5 call GOOUT
FFFFFFFFFFFFF2FC QT2:
FFFFFFFFFFFFF2FC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF300 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFF304 35F00004 jal r0,4[lr] ; skip over next i-word when returning
FFFFFFFFFFFFF308 QT5: ; not " ' or _
FFFFFFFFFFFFF308 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF30C 37EF8008 ret #8
; Output a CR LF sequence
;
FFFFFFFFFFFFF310 prCRLF:
FFFFFFFFFFFFF310 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF314 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF318 E040000D setlo r1,#CR
FFFFFFFFFFFFF31C 31FFF7D5 call GOOUT
FFFFFFFFFFFFF320 E040000A setlo r1,#LF
FFFFFFFFFFFFF324 31FFF7D5 call GOOUT
FFFFFFFFFFFFF328 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF32C 37EF8008 ret #8
; r1 = number to print
; r2 = number of digits
; Register Usage
; r5 = number of padding spaces
FFFFFFFFFFFFF330 PRTNUM:
FFFFFFFFFFFFF330 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFF334 67E18000 sw r3,[sp]
FFFFFFFFFFFFF338 67E28008 sw r5,8[sp]
FFFFFFFFFFFFF33C 67E30010 sw r6,16[sp]
FFFFFFFFFFFFF340 67E38018 sw r7,24[sp]
FFFFFFFFFFFFF344 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFF348 9A039100 lea r7,NUMWKA ; r7 = pointer to numeric work area
FFFFFFFFFFFFF34C 02130009 mov r6,r1 ; save number for later
FFFFFFFFFFFFF350 02228009 mov r5,r2 ; r5 = min number of chars
FFFFFFFFFFFFF354 BE100063 bgt r1,r0,PN2 ; is it negative? if not
FFFFFFFFFFFFF358 02108006 neg r1,r1 ; else make it positive
FFFFFFFFFFFFF35C 0E528001 subui r5,r5,#1 ; one less for width count
FFFFFFFFFFFFF360 PN2:
FFFFFFFFFFFFF360 1601800A lw r3,#10
FFFFFFFFFFFFF364 PN1:
FFFFFFFFFFFFF364 0411881C modu r2,r1,r3 ; r2 = r1 mod 10
FFFFFFFFFFFFF368 1E10800A divui r1,r1,#10 ; r1 /= 10 divide by 10
FFFFFFFFFFFFF36C 0A210030 addui r2,r2,#'0' ; convert remainder to ascii
FFFFFFFFFFFFF370 60710000 sb r2,[r7] ; and store in buffer
FFFFFFFFFFFFF374 0A738001 addui r7,r7,#1
FFFFFFFFFFFFF378 0E528001 subui r5,r5,#1 ; decrement width
FFFFFFFFFFFFF37C BE107F49 bne r1,r0,PN1
FFFFFFFFFFFFF380 PN6:
FFFFFFFFFFFFF380 BE500082 ble r5,r0,PN4 ; test pad count, skip padding if not needed
FFFFFFFFFFFFF384 PN3:
FFFFFFFFFFFFF384 E0400020 setlo r1,#' ' ; display the required leading spaces
FFFFFFFFFFFFF388 31FFF7D5 call GOOUT
FFFFFFFFFFFFF38C BE02FFCF loop r5,PN3
FFFFFFFFFFFFF390 PN4:
FFFFFFFFFFFFF390 BE600061 bge r6,r0,PN5 ; is number negative?
FFFFFFFFFFFFF394 E040002D setlo r1,#'-' ; if so, display the sign
FFFFFFFFFFFFF398 31FFF7D5 call GOOUT
FFFFFFFFFFFFF39C PN5:
FFFFFFFFFFFFF39C 0E738001 subui r7,r7,#1
FFFFFFFFFFFFF3A0 40708000 lb r1,[r7] ; now unstack the digits and display
FFFFFFFFFFFFF3A4 31FFF7D5 call GOOUT
FFFFFFFFFFFFF3A8 12709100 cmpui r1,r7,#NUMWKA
FFFFFFFFFFFFF3AC BE107F87 bgtu r1,r0,PN5
FFFFFFFFFFFFF3B0 PNRET:
FFFFFFFFFFFFF3B0 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFF3B4 47E38018 lw r7,24[sp]
FFFFFFFFFFFFF3B8 47E30010 lw r6,16[sp]
FFFFFFFFFFFFF3BC 47E28008 lw r5,8[sp]
FFFFFFFFFFFFF3C0 47E18000 lw r3,[sp]
FFFFFFFFFFFFF3C4 37EF8028 ret #40
; r1 = number to print
; r2 = number of digits
FFFFFFFFFFFFF3C8 PRTHEXNUM:
FFFFFFFFFFFFF3C8 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFF3CC 67E28000 sw r5,[sp]
FFFFFFFFFFFFF3D0 67E30008 sw r6,8[sp]
FFFFFFFFFFFFF3D4 67E38010 sw r7,16[sp]
FFFFFFFFFFFFF3D8 67E40018 sw r8,24[sp]
FFFFFFFFFFFFF3DC 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFF3E0 9A039100 lea r7,NUMWKA ; r7 = pointer to numeric work area
FFFFFFFFFFFFF3E4 04101809 or r6,r1,r0 ; save number for later
FFFFFFFFFFFFF3E8 E1400014 setlo r5,#20 ; r5 = min number of chars
FFFFFFFFFFFFF3EC 02120009 mov r4,r1
FFFFFFFFFFFFF3F0 BE400083 bgt r4,r0,PHN1 ; is it negative? if not
FFFFFFFFFFFFF3F4 02420006 neg r4,r4 ; else make it positive
FFFFFFFFFFFFF3F8 0E528001 subui r5,r5,#1 ; one less for width count
FFFFFFFFFFFFF3FC E2000014 setlo r8,#20 ; maximum of 10 digits
FFFFFFFFFFFFF400 PHN1:
FFFFFFFFFFFFF400 02408009 mov r1,r4
FFFFFFFFFFFFF404 1410800F andi r1,r1,#15
FFFFFFFFFFFFF408 A010030A blt r1,#10,PHN7
FFFFFFFFFFFFF40C 0A108037 addui r1,r1,#'A'-10
FFFFFFFFFFFFF410 BE00004A bra PHN8
FFFFFFFFFFFFF414 PHN7:
FFFFFFFFFFFFF414 08108030 add r1,r1,#'0' ; convert remainder to ascii
FFFFFFFFFFFFF418 PHN8:
FFFFFFFFFFFFF418 60708000 sb r1,[r7] ; and store in buffer
FFFFFFFFFFFFF41C 0A738001 addui r7,r7,#1
FFFFFFFFFFFFF420 0E528001 subui r5,r5,#1 ; decrement width
FFFFFFFFFFFFF424 06420801 shrui r4,r4,#4
FFFFFFFFFFFFF428 BE400048 beq r4,r0,PHN6 ; is it zero yet ?
FFFFFFFFFFFFF42C BE047EAF loop r8,PHN1 ; safety
FFFFFFFFFFFFF430 PHN6: ; test pad count
FFFFFFFFFFFFF430 BE500082 ble r5,r0,PHN4 ; skip padding if not needed
FFFFFFFFFFFFF434 PHN3:
FFFFFFFFFFFFF434 E0400020 setlo r1,#' ' ; display the required leading spaces
FFFFFFFFFFFFF438 31FFF7D5 call GOOUT
FFFFFFFFFFFFF43C BE02FFCF loop r5,PHN3
FFFFFFFFFFFFF440 PHN4:
FFFFFFFFFFFFF440 BE600063 bgt r6,r0,PHN5 ; is number negative?
FFFFFFFFFFFFF444 E040002D setlo r1,#'-' ; if so, display the sign
FFFFFFFFFFFFF448 31FFF7D5 call GOOUT
FFFFFFFFFFFFF44C PHN5:
FFFFFFFFFFFFF44C 0E738001 subui r7,r7,#1
FFFFFFFFFFFFF450 40708000 lb r1,[r7] ; now unstack the digits and display
FFFFFFFFFFFFF454 31FFF7D5 call GOOUT
FFFFFFFFFFFFF458 12709100 cmpui r1,r7,#NUMWKA
FFFFFFFFFFFFF45C BE107F83 bgt r1,r0,PHN5
FFFFFFFFFFFFF460 PHNRET:
FFFFFFFFFFFFF460 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFF464 47E40018 lw r8,24[sp]
FFFFFFFFFFFFF468 47E38010 lw r7,16[sp]
FFFFFFFFFFFFF46C 47E30008 lw r6,8[sp]
FFFFFFFFFFFFF470 47E28000 lw r5,[sp]
FFFFFFFFFFFFF474 37EF8028 ret #40
; r1 = pointer to line
; returns r1 = pointer to end of line + 1
FFFFFFFFFFFFF478 PRTLN:
FFFFFFFFFFFFF478 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF47C 67E28000 sw r5,[sp]
FFFFFFFFFFFFF480 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFF484 08128002 addi r5,r1,#2
FFFFFFFFFFFFF488 4A50FFFE lbu r1,-2[r5] ; get the binary line number
FFFFFFFFFFFFF48C 4A517FFF lbu r2,-1[r5]
FFFFFFFFFFFFF490 06211000 shli r2,r2,#8
FFFFFFFFFFFFF494 04110409 or r1,r1,r2
FFFFFFFFFFFFF498 E0800000 setlo r2,#0 ; display a 0 or more digit line no.
FFFFFFFFFFFFF49C 31FFFCCC call PRTNUM
FFFFFFFFFFFFF4A0 E0400020 setlo r1,#' ' ; followed by a blank
FFFFFFFFFFFFF4A4 31FFF7D5 call GOOUT
FFFFFFFFFFFFF4A8 E0800000 setlo r2,#0 ; stop char. is a zero
FFFFFFFFFFFFF4AC 04500409 or r1,r5,r0
FFFFFFFFFFFFF4B0 31FFFC93 call PRTSTG ; display the rest of the line
FFFFFFFFFFFFF4B4 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFF4B8 47E28000 lw r5,[sp]
FFFFFFFFFFFFF4BC 37EF8010 ret #16
; ===== Test text byte following the call to this subroutine. If it
; equals the byte pointed to by r8, return to the code following
; the call. If they are not equal, brnch to the point
; indicated in r4.
;
; Registers Affected
; r3,r8
; Returns
; r8 = updated text pointer
;
FFFFFFFFFFFFF4C0 TSTC
FFFFFFFFFFFFF4C0 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF4C4 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF4C8 67E08008 sw r1,8[sp]
FFFFFFFFFFFFF4CC 31FFFD55 call IGNBLK ; ignore leading blanks
FFFFFFFFFFFFF4D0 40808000 lb r1,[r8]
FFFFFFFFFFFFF4D4 BE3080A8 beq r3,r1,TC1 ; is it = to what r8 points to? if so
FFFFFFFFFFFFF4D8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFF4DC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF4E0 0BEF0010 addui sp,sp,#16
FFFFFFFFFFFFF4E4 34400000 jal r0,[r4] ; jump to the routine
FFFFFFFFFFFFF4E8 TC1:
FFFFFFFFFFFFF4E8 0A840001 addui r8,r8,#1 ; if equal, bump text pointer
FFFFFFFFFFFFF4EC 47E08008 lw r1,8[sp]
FFFFFFFFFFFFF4F0 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF4F4 37EF8010 ret #16
; ===== See if the text pointed to by r8 is a number. If so,
; return the number in r2 and the number of digits in r3,
; else return zero in r2 and r3.
; Registers Affected
; r1,r2,r3,r4
; Returns
; r1 = number
; r2 = number of digits in number
; r8 = updated text pointer
;
FFFFFFFFFFFFF4F8 TSTNUM:
FFFFFFFFFFFFF4F8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF4FC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF500 31FFFD55 call IGNBLK ; skip over blanks
FFFFFFFFFFFFF504 E0400000 setlo r1,#0 ; initialize return parameters
FFFFFFFFFFFFF508 E0800000 setlo r2,#0
FFFFFFFFFFFFF50C TN1:
FFFFFFFFFFFFF50C 40818000 lb r3,[r8]
FFFFFFFFFFFFF510 A8300F30 bltui r3,#'0',TSNMRET ; is it less than zero?
FFFFFFFFFFFFF514 AE300E39 bgtui r3,#'9',TSNMRET ; is it greater than nine?
FFFFFFFFFFFFF518 E6BFFFFF ; SETLO
FFFFFFFFFFFFF51C EEBFFFFF ; SETMID
FFFFFFFFFFFFF520 F6807FFF ; SETHI
FFFFFFFFFFFFF524 040D1009 lw r4,#0x07FFFFFF_FFFFFFFF
FFFFFFFFFFFFF528 BE120066 bleu r1,r4,TN2 ; see if there's room for new digit
FFFFFFFFFFFFF52C 9A00F721 lea r1,msgNumTooBig
FFFFFFFFFFFFF530 BE0057CA bra ERROR ; if not, we've overflowd
FFFFFFFFFFFFF534 TN2:
FFFFFFFFFFFFF534 1A10800A mului r1,r1,#10 ; quickly multiply result by 10
FFFFFFFFFFFFF538 0A840001 addui r8,r8,#1 ; adjust text pointer
FFFFFFFFFFFFF53C 1431800F andi r3,r3,#0x0F ; add in the new digit
FFFFFFFFFFFFF540 04118403 addu r1,r1,r3
FFFFFFFFFFFFF544 0A210001 addui r2,r2,#1 ; increment the no. of digits
FFFFFFFFFFFFF548 BE007E2A bra TN1
FFFFFFFFFFFFF54C TSNMRET:
FFFFFFFFFFFFF54C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF550 37EF8008 ret #8
;===== Skip over blanks in the text pointed to by r8.
;
; Registers Affected:
; r8
; Returns
; r8 = pointer updateded past any spaces or tabs
;
FFFFFFFFFFFFF554 IGNBLK:
FFFFFFFFFFFFF554 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF558 67E08000 sw r1,[sp]
FFFFFFFFFFFFF55C IGB2:
FFFFFFFFFFFFF55C 40808000 lb r1,[r8] ; get char
FFFFFFFFFFFFF560 B0100220 beqi r1,#' ',IGB1 ; see if it's a space
FFFFFFFFFFFFF564 B2100300 bnei r1,#'\t',IGBRET ; or a tab
FFFFFFFFFFFFF568 IGB1:
FFFFFFFFFFFFF568 0A840001 addui r8,r8,#1 ; increment the text pointer
FFFFFFFFFFFFF56C BE007F8A bra IGB2
FFFFFFFFFFFFF570 IGBRET:
FFFFFFFFFFFFF570 47E08000 lw r1,[sp]
FFFFFFFFFFFFF574 37EF8008 ret #8
; ===== Convert the line of text in the input buffer to upper
; case (except for stuff between quotes).
;
; Registers Affected
; r1,r3
; Returns
; r8 = pointing to end of text in buffer
;
FFFFFFFFFFFFF578 TOUPBUF:
FFFFFFFFFFFFF578 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF57C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF580 9A04111B lea r8,BUFFER ; set up text pointer
FFFFFFFFFFFFF584 E0C00000 setlo r3,#0 ; clear quote flag
FFFFFFFFFFFFF588 TOUPB1:
FFFFFFFFFFFFF588 40808000 lb r1,[r8] ; get the next text char.
FFFFFFFFFFFFF58C 0A840001 addui r8,r8,#1
FFFFFFFFFFFFF590 B0100D0D beqi r1,#CR,TOUPBRT ; is it end of line?
FFFFFFFFFFFFF594 B0100622 beqi r1,#'"',DOQUO ; a double quote?
FFFFFFFFFFFFF598 B0100527 beqi r1,#'''',DOQUO ; or a single quote?
FFFFFFFFFFFFF59C BE307F69 bne r3,r0,TOUPB1 ; inside quotes?
FFFFFFFFFFFFF5A0 31FFFD73 call toUpper ; convert to upper case
FFFFFFFFFFFFF5A4 6080FFFF sb r1,-1[r8] ; store it
FFFFFFFFFFFFF5A8 BE007F0A bra TOUPB1 ; and go back for more
FFFFFFFFFFFFF5AC DOQUO:
FFFFFFFFFFFFF5AC BE300069 bne r3,r0,DOQUO1; are we inside quotes?
FFFFFFFFFFFFF5B0 02118009 mov r3,r1 ; if not, toggle inside-quotes flag
FFFFFFFFFFFFF5B4 BE007EAA bra TOUPB1
FFFFFFFFFFFFF5B8 DOQUO1:
FFFFFFFFFFFFF5B8 BE30FE89 bne r3,r1,TOUPB1 ; make sure we're ending proper quote
FFFFFFFFFFFFF5BC E0C00000 setlo r3,#0 ; else clear quote flag
FFFFFFFFFFFFF5C0 BE007E4A bra TOUPB1
FFFFFFFFFFFFF5C4 TOUPBRT:
FFFFFFFFFFFFF5C4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF5C8 37EF8008 ret #8
; ===== Convert the character in r1 to upper case
;
FFFFFFFFFFFFF5CC toUpper
FFFFFFFFFFFFF5CC A0100361 blti r1,#'a',TOUPRET ; is it < 'a'?
FFFFFFFFFFFFF5D0 A610027A bgti r1,#'z',TOUPRET ; or > 'z'?
FFFFFFFFFFFFF5D4 0E108020 subui r1,r1,#32 ; if not, make it upper case
FFFFFFFFFFFFF5D8 TOUPRET
FFFFFFFFFFFFF5D8 37EF8000 ret
; 'CHKIO' checks the input. If there's no input, it will return
; to the caller with the r1=0. If there is input, the input byte is in r1.
; However, if a control-C is read, 'CHKIO' will warm-start BASIC and will
; not return to the caller.
;
FFFFFFFFFFFFF5DC CHKIO:
FFFFFFFFFFFFF5DC 0FEF0008 subui sp,sp,#8 ; save link reg
FFFFFFFFFFFFF5E0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF5E4 31FFF7D6 call GOIN ; get input if possible
FFFFFFFFFFFFF5E8 B01003FF beqi r1,#-1,CHKRET2 ; if Zero, no input
FFFFFFFFFFFFF5EC B2100303 bnei r1,#CTRLC,CHKRET ; is it control-C?
FFFFFFFFFFFFF5F0 33FFF801 jmp WSTART ; if so, do a warm start
FFFFFFFFFFFFF5F4 CHKRET2:
FFFFFFFFFFFFF5F4 0410840A xor r1,r1,r1
FFFFFFFFFFFFF5F8 CHKRET:
FFFFFFFFFFFFF5F8 47EF8000 lw lr,[sp] ;r1=0
FFFFFFFFFFFFF5FC 37EF8008 ret #8
; ===== Display a CR-LF sequence
;
FFFFFFFFFFFFF600 CRLF:
FFFFFFFFFFFFF600 E07FF703 setlo r1,CLMSG
; ===== Display a zero-ended string pointed to by register r1
; Registers Affected
; r1,r2,r4
;
FFFFFFFFFFFFF604 PRMESG:
FFFFFFFFFFFFF604 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF608 67E28000 sw r5,[sp]
FFFFFFFFFFFFF60C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFF610 02128009 mov r5,r1 ; r5 = pointer to message
FFFFFFFFFFFFF614 PRMESG1:
FFFFFFFFFFFFF614 0A528001 addui r5,r5,#1
FFFFFFFFFFFFF618 4A50FFFF lbu r1,-1[r5] ; get the char.
FFFFFFFFFFFFF61C BE100068 beq r1,r0,PRMRET
FFFFFFFFFFFFF620 31FFF7D5 call GOOUT ;else display it trashes r4
FFFFFFFFFFFFF624 BE007F8A bra PRMESG1
FFFFFFFFFFFFF628 PRMRET:
FFFFFFFFFFFFF628 02508009 mov r1,r5
FFFFFFFFFFFFF62C 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFF630 47E28000 lw r5,[sp]
FFFFFFFFFFFFF634 37EF8010 ret #16
; ===== Display a zero-ended string pointed to by register r1
; Registers Affected
; r1,r2,r3
;
FFFFFFFFFFFFF638 PRMESGAUX:
FFFFFFFFFFFFF638 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF63C 67E28000 sw r5,[sp]
FFFFFFFFFFFFF640 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFF644 02128009 mov r5,r1 ; r3 = pointer
FFFFFFFFFFFFF648 PRMESGA1:
FFFFFFFFFFFFF648 0A528001 addui r5,r5,#1
FFFFFFFFFFFFF64C 4050FFFF lb r1,-1[r5] ; get the char.
FFFFFFFFFFFFF650 BE100068 beq r1,r0,PRMRETA
FFFFFFFFFFFFF654 31FFF7D7 call GOAUXO ;else display it
FFFFFFFFFFFFF658 BE007F8A bra PRMESGA1
FFFFFFFFFFFFF65C PRMRETA:
FFFFFFFFFFFFF65C 02508009 mov r1,r5
FFFFFFFFFFFFF660 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFF664 47E28000 lw r5,[sp]
FFFFFFFFFFFFF668 37EF8010 ret #16
;*****************************************************
; The following routines are the only ones that need *
; to be changed for a different I/O environment. *
;*****************************************************
; ===== Output character to the console (Port 1) from register r1
; (Preserves all registers.)
;
FFFFFFFFFFFFF66C OUTC:
FFFFFFFFFFFFF66C 33FFF07F jmp DisplayChar
; ===== Input a character from the console into register R1 (or
; return Zero status if there's no character available).
;
FFFFFFFFFFFFF670 INC:
FFFFFFFFFFFFF670 33FFEF07 jmp KeybdGetChar
;*
;* ===== Input a character from the host into register r1 (or
;* return Zero status if there's no character available).
;*
FFFFFFFFFFFFF674 AUXIN:
FFFFFFFFFFFFF674 31FFEDA4 call SerialGetChar
FFFFFFFFFFFFF678 B01003FF beqi r1,#-1,AXIRET_ZERO
FFFFFFFFFFFFF67C 1410807F andi r1,r1,#0x7f ;zero out the high bit
FFFFFFFFFFFFF680 AXIRET:
FFFFFFFFFFFFF680 37EF8000 ret
FFFFFFFFFFFFF684 AXIRET_ZERO:
FFFFFFFFFFFFF684 0410840A xor r1,r1,r1
FFFFFFFFFFFFF688 37EF8000 ret
; ===== Output character to the host (Port 2) from register r1
; (Preserves all registers.)
;
FFFFFFFFFFFFF68C AUXOUT
FFFFFFFFFFFFF68C 33FFED5C jmp SerialPutChar ; call boot rom routine
FFFFFFFFFFFFF690 _cls
FFFFFFFFFFFFF690 31FFF011 call clearScreen
FFFFFFFFFFFFF694 BE00742A bra FINISH
FFFFFFFFFFFFF698 _wait10
FFFFFFFFFFFFF698 37EF8000 ret
FFFFFFFFFFFFF69C _getATAStatus
FFFFFFFFFFFFF69C 37EF8000 ret
FFFFFFFFFFFFF6A0 _waitCFNotBusy
FFFFFFFFFFFFF6A0 37EF8000 ret
FFFFFFFFFFFFF6A4 _rdcf
FFFFFFFFFFFFF6A4 BE0073AA br FINISH
FFFFFFFFFFFFF6A8 rdcf6
FFFFFFFFFFFFF6A8 BE004C0A br ERROR
; ===== Return to the resident monitor, operating system, etc.
;
FFFFFFFFFFFFF6AC BYEBYE:
FFFFFFFFFFFFF6AC 460F1088 lw sp,OSSP
FFFFFFFFFFFFF6B0 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF6B4 37EF8008 ret #8
; MOVE.B #228,D7 return to Tutor
; TRAP #14
FFFFFFFFFFFFF6B8 726F747061520A0D msgInit db CR,LF,"Raptor64 Tiny BASIC v1.0",CR,LF,"(C) 2013 Robert Finch",CR,LF,LF,0
FFFFFFFFFFFFF6C0 20796E6954203436
FFFFFFFFFFFFF6C8 3176204349534142
FFFFFFFFFFFFF6D0 202943280A0D302E
FFFFFFFFFFFFF6D8 6F52202033313032
FFFFFFFFFFFFF6E0 6E69462074726562
FFFFFFFFFFFFF6E8 0A0D000A0A0D6863 OKMSG db CR,LF,"OK",CR,LF,0
FFFFFFFFFFFFF6F0 616857000A0D4B4F msgWhat db "What?",CR,LF,0
FFFFFFFFFFFFF6F8 726F53000A0D3F74 SRYMSG db "Sorry."
FFFFFFFFFFFFF700 6F43000A0D2E7972 msgReadError db "Compact FLASH read error",CR,LF,0
FFFFFFFFFFFFF708 4C4620746361706D
FFFFFFFFFFFFF710 6461657220485341
FFFFFFFFFFFFF718 0A0D726F72726520
FFFFFFFFFFFFF720 207265626D754E00 msgNumTooBig db "Number is too big",CR,LF,0
FFFFFFFFFFFFF728 62206F6F74207369
FFFFFFFFFFFFF730 766944000A0D6769 msgDivZero db "Division by zero",CR,LF,0
FFFFFFFFFFFFF738 7962206E6F697369
FFFFFFFFFFFFF740 000A0D6F72657A20
FFFFFFFFFFFFF748 7620666F2074754F msgVarSpace db "Out of variable space",CR,LF,0
FFFFFFFFFFFFF750 20656C6261697261
FFFFFFFFFFFFF758 000A0D6563617073
FFFFFFFFFFFFF760 6620736574796220 msgBytesFree db " bytes free",CR,LF,0
FFFFFFFFFFFFF768 0A0D000A0D656572 msgReady db CR,LF,"Ready",CR,LF,0
FFFFFFFFFFFFF770 000A0D7964616552
FFFFFFFFFFFFF778 6E69746365707845 msgComma db "Expecting a comma",CR,LF,0
FFFFFFFFFFFFF780 6D6D6F6320612067
FFFFFFFFFFFFF788 656E694C000A0D61 msgLineRange db "Line number too big",CR,LF,0
FFFFFFFFFFFFF790 207265626D756E20
FFFFFFFFFFFFF798 0D676962206F6F74
FFFFFFFFFFFFF7A0 746365707845000A msgVar db "Expecting a variable",CR,LF,0
FFFFFFFFFFFFF7A8 6176206120676E69
FFFFFFFFFFFFF7B0 0A0D656C62616972
FFFFFFFFFFFFF7B8 64616220444E5200 msgRNDBad db "RND bad parameter",CR,LF,0
FFFFFFFFFFFFF7C0 74656D6172617020
FFFFFFFFFFFFF7C8 535953000A0D7265 msgSYSBad db "SYS bad address",CR,LF,0
FFFFFFFFFFFFF7D0 6464612064616220
FFFFFFFFFFFFF7D8 49000A0D73736572 msgInputVar db "INPUT expecting a variable",CR,LF,0
FFFFFFFFFFFFF7E0 707865205455504E
FFFFFFFFFFFFF7E8 6120676E69746365
FFFFFFFFFFFFF7F0 6C62616972617620
FFFFFFFFFFFFF7F8 5458454E000A0D65 msgNextFor db "NEXT without FOR",CR,LF,0
FFFFFFFFFFFFF800 74756F6874697720
FFFFFFFFFFFFF808 4E000A0D524F4620 msgNextVar db "NEXT expecting a defined variable",CR,LF,0
FFFFFFFFFFFFF810 6570786520545845
FFFFFFFFFFFFF818 206120676E697463
FFFFFFFFFFFFF820 2064656E69666564
FFFFFFFFFFFFF828 656C626169726176
FFFFFFFFFFFFF830 2F4F544F47000A0D msgBadGotoGosub db "GOTO/GOSUB bad line number",CR,LF,0
FFFFFFFFFFFFF838 6162204255534F47
FFFFFFFFFFFFF840 6E20656E696C2064
FFFFFFFFFFFFF848 000A0D7265626D75
FFFFFFFFFFFFF850 77204E5255544552 msgRetWoGosub db "RETURN without GOSUB",CR,LF,0
FFFFFFFFFFFFF858 472074756F687469
FFFFFFFFFFFFF860 50000A0D4255534F msgTooBig db "Program is too big",CR,LF,0
FFFFFFFFFFFFF868 69206D6172676F72
FFFFFFFFFFFFF870 6962206F6F742073
FFFFFFFFFFFFF878 72747845000A0D67 msgExtraChars db "Extra characters on line ignored",CR,LF,0
FFFFFFFFFFFFF880 6361726168632061
FFFFFFFFFFFFF888 206E6F2073726574
FFFFFFFFFFFFF890 6E676920656E696C
FFFFFFFFFFFFF898 00000A0D6465726F align 8
FFFFFFFFFFFFF8A0 align 8
LSTROM equ * ; end of possible ROM area
; END
;*
;* ===== Return to the resident monitor, operating system, etc.
;*
FFFFFFFFFFFFF8A0 BYEBYE:
FFFFFFFFFFFFF8A0 33FFF20A jmp Monitor
; MOVE.B #228,D7 ;return to Tutor
; TRAP #14
;==============================================================================
; Checkerboard RAM tester
;==============================================================================
;
FFFFFFFFFFFFF8A4 code
FFFFFFFFFFFFF8A0 0000000033FFF20A align 16
FFFFFFFFFFFFF8A8 0000000000000000
FFFFFFFFFFFFF8B0 align 16
FFFFFFFFFFFFF8B0 ramtest:
FFFFFFFFFFFFF8B0 04002009 or r8,r0,r0 ; r8 = 0
FFFFFFFFFFFFF8B4 E6AA5555 ; SETLO
FFFFFFFFFFFFF8B8 EE9556AA ; SETMID
FFFFFFFFFFFFF8BC F68AAAA5 ; SETHI
FFFFFFFFFFFFF8C0 040D0409 ori r1,r0,#0xAAAA5555AAAA5555 ; checkerboard pattern
FFFFFFFFFFFFF8C4 ramtest2:
FFFFFFFFFFFFF8C4 66808000 sw r1,[r8] ; save the checkerboard to memory
FFFFFFFFFFFFF8C8 46810000 lw r2,[r8] ; read it back
FFFFFFFFFFFFF8CC 04110C06 cmp r3,r1,r2 ; is it the same ?
FFFFFFFFFFFFF8D0 BE3000C9 bne r3,r0,ramtest1
FFFFFFFFFFFFF8D4 0A840008 addui r8,r8,#8 ; increment RAM pointer
FFFFFFFFFFFFF8D8 E6800000 ; SETLO
FFFFFFFFFFFFF8DC EE800010 ; SETMID
FFFFFFFFFFFFF8E0 048D0C06 cmpi r3,r8,#0x0000_0000_0400_0000
FFFFFFFFFFFFF8E4 BE307F00 blt r3,r0,ramtest2
FFFFFFFFFFFFF8E8 ramtest1:
FFFFFFFFFFFFF8E8 04802809 or r10,r8,r0 ; r10 = max ram address
; readback the checkerboard pattern
FFFFFFFFFFFFF8EC 04002009 or r8,r0,r0 ; r8 = 0
FFFFFFFFFFFFF8F0 ramtest4:
FFFFFFFFFFFFF8F0 46810000 lw r2,[r8]
FFFFFFFFFFFFF8F4 E6AA5555 ; SETLO
FFFFFFFFFFFFF8F8 EE9556AA ; SETMID
FFFFFFFFFFFFF8FC F68AAAA5 ; SETHI
FFFFFFFFFFFFF900 042D0C06 cmpi r3,r2,#0xAAAA5555AAAA5555
FFFFFFFFFFFFF904 BE3000C9 bne r3,r0,ramtest3
FFFFFFFFFFFFF908 08840008 addi r8,r8,#8
FFFFFFFFFFFFF90C E6800000 ; SETLO
FFFFFFFFFFFFF910 EE800004 ; SETMID
FFFFFFFFFFFFF914 048D0C06 cmpi r3,r8,#0x0000_0000_0100_0000
FFFFFFFFFFFFF918 BE307EC0 blt r3,r0,ramtest4
FFFFFFFFFFFFF91C ramtest3:
FFFFFFFFFFFFF91C BE850389 bne r8,r10,ramtest8 ; check for equal maximum address
; perform ramtest again with inverted checkerboard
FFFFFFFFFFFFF920 04002009 or r8,r0,r0 ; r8 = 0
FFFFFFFFFFFFF924 E695AAAA ; SETLO
FFFFFFFFFFFFF928 EEAAA955 ; SETMID
FFFFFFFFFFFFF92C F685555A ; SETHI
FFFFFFFFFFFFF930 040D0409 ori r1,r0,#0x5555AAAA5555AAAA
FFFFFFFFFFFFF934 ramtest5:
FFFFFFFFFFFFF934 66808000 sw r1,[r8]
FFFFFFFFFFFFF938 46810000 lw r2,[r8]
FFFFFFFFFFFFF93C 04110C06 cmp r3,r1,r2
FFFFFFFFFFFFF940 BE3000C9 bne r3,r0,ramtest6
FFFFFFFFFFFFF944 08840008 addi r8,r8,#8
FFFFFFFFFFFFF948 E6800000 ; SETLO
FFFFFFFFFFFFF94C EE800004 ; SETMID
FFFFFFFFFFFFF950 048D0C06 cmpi r3,r8,#0x0000_0000_0100_0000
FFFFFFFFFFFFF954 BE307F00 blt r3,r0,ramtest5
FFFFFFFFFFFFF958 ramtest6:
FFFFFFFFFFFFF958 04802C09 or r11,r8,r0 ; r11 = max ram address
; readback checkerboard
FFFFFFFFFFFFF95C 04002009 or r8,r0,r0
FFFFFFFFFFFFF960 ramtest7:
FFFFFFFFFFFFF960 46810000 lw r2,[r8]
FFFFFFFFFFFFF964 E695AAAA ; SETLO
FFFFFFFFFFFFF968 EEAAA955 ; SETMID
FFFFFFFFFFFFF96C F685555A ; SETHI
FFFFFFFFFFFFF970 042D0C06 cmpi r3,r2,#0x5555AAAA5555AAAA
FFFFFFFFFFFFF974 BE3000C9 bne r3,r0,ramtest8
FFFFFFFFFFFFF978 08840008 addi r8,r8,#8
FFFFFFFFFFFFF97C E6800000 ; SETLO
FFFFFFFFFFFFF980 EE800004 ; SETMID
FFFFFFFFFFFFF984 048D0C06 cmpi r3,r8,#0x0000_0000_0100_0000
FFFFFFFFFFFFF988 BE307EC0 blt r3,r0,ramtest7
FFFFFFFFFFFFF98C ramtest8:
FFFFFFFFFFFFF98C BE858048 beq r8,r11,ramtest9
FFFFFFFFFFFFF990 0485A014 min r8,r8,r11
FFFFFFFFFFFFF994 ramtest9:
FFFFFFFFFFFFF994 BE850048 beq r8,r10,ramtest10
FFFFFFFFFFFFF998 04852014 min r8,r8,r10
FFFFFFFFFFFFF99C ramtest10:
FFFFFFFFFFFFF99C 66040400 sw r8,0x00000400 ;memend
FFFFFFFFFFFFF9A0 37EF8000 ret
;-------------------------------------------
;-------------------------------------------
;
FFFFFFFFFFFFF9A4 iberr_rout:
FFFFFFFFFFFFF9A4 9A00FA3B lea r1,msgiberr
FFFFFFFFFFFFF9A8 31FFF122 call DisplayString
FFFFFFFFFFFFF9AC 020085E8 mfspr r1,EPC
FFFFFFFFFFFFF9B0 31FFF169 call DisplayWord
FFFFFFFFFFFFF9B4 00000028 wait
FFFFFFFFFFFFF9B8 33FFEC0B jmp start
FFFFFFFFFFFFF9BC dberr_rout:
FFFFFFFFFFFFF9BC E6A00100 ; SETLO
FFFFFFFFFFFFF9C0 EE800400 ; SETMID
FFFFFFFFFFFFF9C4 040D7809 lw sp,#0x100200100
FFFFFFFFFFFFF9C8 9A00FA20 lea r1,msgdberr
FFFFFFFFFFFFF9CC 31FFF122 call DisplayString
FFFFFFFFFFFFF9D0 02008628 mfspr r1,ERRADR
FFFFFFFFFFFFF9D4 31FFF169 call DisplayWord
FFFFFFFFFFFFF9D8 9A00FA34 lea r1,msgEPC
FFFFFFFFFFFFF9DC 31FFF122 call DisplayString
FFFFFFFFFFFFF9E0 020085E8 mfspr r1,EPC
FFFFFFFFFFFFF9E4 31FFF169 call DisplayWord
FFFFFFFFFFFFF9E8 31FFFD80 call CRLF
FFFFFFFFFFFFF9EC 1601001F lw r2,#31
FFFFFFFFFFFFF9F0 dberr1:
FFFFFFFFFFFFF9F0 02200FA9 mtspr PCHI,r2
FFFFFFFFFFFFF9F4 DE000000 nop
FFFFFFFFFFFFF9F8 DE000000 nop
FFFFFFFFFFFFF9FC DE000000 nop
FFFFFFFFFFFFFA00 02008FE8 mfspr r1,PCHISTORIC
FFFFFFFFFFFFFA04 31FFF169 call DisplayWord
FFFFFFFFFFFFFA08 31FFFD80 call CRLF
FFFFFFFFFFFFFA0C BE017F2F loop r2,dberr1
FFFFFFFFFFFFFA10 00000028 wait
FFFFFFFFFFFFFA14 33FFEC0B jmp start
FFFFFFFFFFFFFA18 0000000000000000 .align 16
FFFFFFFFFFFFFA20 .align 16
FFFFFFFFFFFFFA20 msgdberr:
FFFFFFFFFFFFFA20 7375622061746144 db "Data bus error at: ",0
FFFFFFFFFFFFFA28 6120726F72726520
FFFFFFFFFFFFFA34 msgEPC:
FFFFFFFFFFFFFA30 4350452000203A74 db " EPC: ",0
FFFFFFFFFFFFFA3B msgiberr:
FFFFFFFFFFFFFA38 662072724500203A db "Err fetching instruction at: ",0
FFFFFFFFFFFFFA40 20676E6968637465
FFFFFFFFFFFFFA48 7463757274736E69
FFFFFFFFFFFFFA50 203A7461206E6F69
FFFFFFFFFFFFFA5C .align 4
;------------------------------------------------------------------------------
; IRQ routine
;
; Interrupts are automatically disabled at the time of the interrupt in order
; to prevent nested interrupts from occuring. Interrupts are re-enabled by
; the IRET instruction at the end of the interrupt routine. If the interrupt
; turns out to not match a hardware interrupt, then a software context
; switching interrupt is assumed.
;
; This routine uses it's own private interrupt stack; the stack of the
; interrupted context is not used at all. A couple of working registers are
; saved off not on the stack. We can get away with this because nested
; interrupts are not allowed.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFFA5C irqrout:
FFFFFFFFFFFFFA5C 660F1460 sw sp,sp_save ; use our own private stack for interrupt processing
FFFFFFFFFFFFFA60 660F9468 sw lr,lr_save ; so, save off the sp and working registers
FFFFFFFFFFFFFA64 660D1480 sw r26,r26_save
FFFFFFFFFFFFFA68 66009470 sw r1,r1_save
FFFFFFFFFFFFFA6C 66011478 sw r2,r2_save
FFFFFFFFFFFFFA70 E6801000 ; SETLO
FFFFFFFFFFFFFA74 EE800400 ; SETMID
FFFFFFFFFFFFFA78 040D7809 lw sp,#0x1_00001000 ; the second two kbytes
FFFFFFFFFFFFFA7C E69C0FF0 ; SETLO
FFFFFFFFFFFFFA80 EE800003 ; SETMID
FFFFFFFFFFFFFA84 6A0D0421 inch r1,PIC ; r1= which IRQ line is active
; Dispatch fork, in order of required timeliness
FFFFFFFFFFFFFA88 B0100D02 beqi r1,#2,irq1000Hz
FFFFFFFFFFFFFA8C B0101903 beqi r1,#3,irq100Hz
FFFFFFFFFFFFFA90 B0102008 beqi r1,#8,irqSerial
FFFFFFFFFFFFFA94 B010220D beqi r1,#13,irqRaster
FFFFFFFFFFFFFA98 B010240F beqi r1,#15,irqKeybd
FFFFFFFFFFFFFA9C B0102601 beqi r1,#1,irqColdStart ; CTRL-ALT-DEL interrupt
; Here, none of the hardware interrupts were active so
; assume software context switch interrupt
;
FFFFFFFFFFFFFAA0 460F1460 lw sp,sp_save
FFFFFFFFFFFFFAA4 460F9468 lw lr,lr_save
FFFFFFFFFFFFFAA8 460D1480 lw r26,r26_save
FFFFFFFFFFFFFAAC 46009470 lw r1,r1_save
FFFFFFFFFFFFFAB0 46011478 lw r2,r2_save
FFFFFFFFFFFFFAB4 0000000F iepp
FFFFFFFFFFFFFAB8 01900020 iret
; 1000 Hz interrupt
; This IRQ must be fast, so it's placed inline. It's also the first
; IRQ checked for in the interrupt dispatch.
; Increments the millisecond counter, and switches to the next context
;
FFFFFFFFFFFFFABC irq1000Hz:
FFFFFFFFFFFFFABC E69CFFFD ; SETLO
FFFFFFFFFFFFFAC0 EE800003 ; SETMID
FFFFFFFFFFFFFAC4 6A0D0028 outb r0,0xDCFFFD ; acknowledge interrupt
FFFFFFFFFFFFFAC8 46009400 lw r1,Milliseconds ; increment milliseconds count
FFFFFFFFFFFFFACC 0A108001 addui r1,r1,#1
FFFFFFFFFFFFFAD0 66009400 sw r1,Milliseconds
FFFFFFFFFFFFFAD4 460F1460 lw sp,sp_save
FFFFFFFFFFFFFAD8 460F9468 lw lr,lr_save
FFFFFFFFFFFFFADC 460D1480 lw r26,r26_save
FFFFFFFFFFFFFAE0 46009470 lw r1,r1_save
FFFFFFFFFFFFFAE4 46011478 lw r2,r2_save
FFFFFFFFFFFFFAE8 0000000F iepp ; move to the next context
FFFFFFFFFFFFFAEC 01900020 iret ; return to the next context
; 100 Hz interrupt
; This IRQ could have some work to do, including flashing a cursor. So
; we call a subroutine.
;
FFFFFFFFFFFFFAF0 irq100Hz:
FFFFFFFFFFFFFAF0 4600B000 lw r1,p100IRQvec
; jal lr,[r1]
FFFFFFFFFFFFFAF4 31FFEF73 call Pulse100
FFFFFFFFFFFFFAF8 irqret:
FFFFFFFFFFFFFAF8 460F1460 lw sp,sp_save
FFFFFFFFFFFFFAFC 460F9468 lw lr,lr_save
FFFFFFFFFFFFFB00 460D1480 lw r26,r26_save
FFFFFFFFFFFFFB04 46009470 lw r1,r1_save
FFFFFFFFFFFFFB08 46011478 lw r2,r2_save
FFFFFFFFFFFFFB0C 01900020 iret
FFFFFFFFFFFFFB10 irqSerial:
FFFFFFFFFFFFFB10 4600B010 lw r1,serialIRQvec
FFFFFFFFFFFFFB14 341F8000 jal lr,[r1]
FFFFFFFFFFFFFB18 BE007F0A bra irqret
FFFFFFFFFFFFFB1C irqRaster:
FFFFFFFFFFFFFB1C 4600B018 lw r1,rasterIRQvec
; jal lr,[r1]
FFFFFFFFFFFFFB20 31FFF46B call RasterIRQfn
FFFFFFFFFFFFFB24 BE007EAA bra irqret
FFFFFFFFFFFFFB28 irqKeybd:
FFFFFFFFFFFFFB28 4600B008 lw r1,keybdIRQvec
FFFFFFFFFFFFFB2C 31FFEEF0 call KeybdIRQ
; jal lr,[r1]
FFFFFFFFFFFFFB30 BE007E4A bra irqret
FFFFFFFFFFFFFB34 irqColdStart:
FFFFFFFFFFFFFB34 33FFEC0B jmp ColdStart
;------------------------------------------------------------------------------
; NMI routine
;
; The NMI line is tied to the parity error signal. But also any non-initialized
; interrupts get sent here.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFFB38 nmirout:
FFFFFFFFFFFFFB38 660F1460 sw sp,sp_save
FFFFFFFFFFFFFB3C 66009470 sw r1,r1_save
FFFFFFFFFFFFFB40 660D1480 sw r26,r26_save
FFFFFFFFFFFFFB44 E6801000 ; SETLO
FFFFFFFFFFFFFB48 EE800400 ; SETMID
FFFFFFFFFFFFFB4C 040D7809 lw sp,#0x100001000
FFFFFFFFFFFFFB50 E69CFFFE ; SETLO
FFFFFFFFFFFFFB54 EE800003 ; SETMID
FFFFFFFFFFFFFB58 6A0D0028 outb r0,0xDCFFFE ; acknowledge interrupt
FFFFFFFFFFFFFB5C 9A00FB80 lea r1,msgPerr
FFFFFFFFFFFFFB60 31FFF122 call DisplayString
FFFFFFFFFFFFFB64 02008868 mfspr r1,IPC
FFFFFFFFFFFFFB68 31FFF169 call DisplayWord
FFFFFFFFFFFFFB6C 31FFFD80 call CRLF
FFFFFFFFFFFFFB70 460F1460 lw sp,sp_save
FFFFFFFFFFFFFB74 46009470 lw r1,r1_save
FFFFFFFFFFFFFB78 460D1480 lw r26,r26_save
FFFFFFFFFFFFFB7C 01900020 iret
FFFFFFFFFFFFFB80 msgPerr:
FFFFFFFFFFFFFB80 6520797469726150 db "Parity error at: ",0
FFFFFFFFFFFFFB88 3A746120726F7272
;-------------------------------------------
; Unimplemented instructions end up here
;-------------------------------------------
FFFFFFFFFFFFFB94 .align 4
FFFFFFFFFFFFFB94 ui_irout:
FFFFFFFFFFFFFB94 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFFB98 67E08000 sw r1,[sp]
FFFFFFFFFFFFFB9C 9A00FBC0 lea r1,msgUnimp
FFFFFFFFFFFFFBA0 31FFF122 call DisplayString
FFFFFFFFFFFFFBA4 02008868 mfspr r1,IPC
FFFFFFFFFFFFFBA8 31FFF169 call DisplayWord
FFFFFFFFFFFFFBAC 31FFFD80 call CRLF
FFFFFFFFFFFFFBB0 47E08000 lw r1,[sp]
FFFFFFFFFFFFFBB4 0BEF0008 addui sp,sp,#8
; hang the context
FFFFFFFFFFFFFBB8 ui_irout1:
FFFFFFFFFFFFFBB8 BE00000A bra ui_irout1
FFFFFFFFFFFFFBBC 01900020 iret
FFFFFFFFFFFFFBC0 msgUnimp:
FFFFFFFFFFFFFBC0 6D656C706D696E55 db "Unimplemented instruction at: ",0
FFFFFFFFFFFFFBC8 6E69206465746E65
FFFFFFFFFFFFFBD0 6F69746375727473
;-------------------------------------------
; Handle miss on Data TLB
;-------------------------------------------
FFFFFFFFFFFFFBD8 0000203A7461206E .align 4
FFFFFFFFFFFFFBE0 .align 4
FFFFFFFFFFFFFBE0 DTLBHandler:
FFFFFFFFFFFFFBE0 E6BF0000 ; SETLO
FFFFFFFFFFFFFBE4 6A0D0413 sw r1,0xFFFF_FFFF_FFFF_0000
FFFFFFFFFFFFFBE8 E6BF0008 ; SETLO
FFFFFFFFFFFFFBEC 6A0D0813 sw r2,0xFFFF_FFFF_FFFF_0008
FFFFFFFFFFFFFBF0 dh1:
FFFFFFFFFFFFFBF0 02008034 omgi r1,#0 ; try open mutex gate #0 (TLB protector)
FFFFFFFFFFFFFBF4 BE107FE9 bne r1,r0,dh1 ; spinlock if gate is closed
FFFFFFFFFFFFFBF8 02008128 mfspr r1,PTA ; get the page table address
FFFFFFFFFFFFFBFC 02010228 mfspr r2,BadVAddr ; get the bad virtual address
FFFFFFFFFFFFFC00 022002E9 mtspr TLBVirtPage,r2 ; which virtual address to update
FFFFFFFFFFFFFC04 06211A01 shrui r2,r2,#13 ; turn va into index
FFFFFFFFFFFFFC08 04110403 addu r1,r1,r2
FFFFFFFFFFFFFC0C 46110000 lw r2,[r1] ; get the physical address from the table
FFFFFFFFFFFFFC10 14210000 and r2,r2,#FFFF_FFFF_FFFF_E000 ; mask off lower bits
FFFFFFFFFFFFFC14 022002A9 mtspr TLBPhysPage0,r2 ;
FFFFFFFFFFFFFC18 46110008 lw r2,8[r1] ; get the physical address from the table
FFFFFFFFFFFFFC1C 14210000 and r2,r2,#FFFF_FFFF_FFFF_E000 ; mask off lower bits
FFFFFFFFFFFFFC20 022002E9 mtspr TLBPhysPage1,r2 ;
FFFFFFFFFFFFFC24 02000034 tlbwr ; update a random entry in the TLB
FFFFFFFFFFFFFC28 02000035 cmgi #0 ; close the mutex gate
FFFFFFFFFFFFFC2C E6BF0000 ; SETLO
FFFFFFFFFFFFFC30 6A0D0403 lw r1,0xFFFF_FFFF_FFFF_0000
FFFFFFFFFFFFFC34 E6BF0008 ; SETLO
FFFFFFFFFFFFFC38 6A0D0803 lw r2,0xFFFF_FFFF_FFFF_0008
FFFFFFFFFFFFFC3C 01900020 iret
FFFFFFFFFFFFFC40 .align 32
FFFFFFFFFFFFFFB0 org 0xFFFF_FFFF_FFFF_FFB0
FFFFFFFFFFFFFFB0 33FFFEF8 jmp DTLBHandler
FFFFFFFFFFFFFFB4 DE000000 nop
FFFFFFFFFFFFFFB8 DE000000 nop
FFFFFFFFFFFFFFC0 org 0xFFFF_FFFF_FFFF_FFC0
FFFFFFFFFFFFFFC0 33FFFEF8 jmp DTLBHandler
FFFFFFFFFFFFFFC4 DE000000 nop
FFFFFFFFFFFFFFC8 DE000000 nop
FFFFFFFFFFFFFFE0 org 0xFFFF_FFFF_FFFF_FFE0
FFFFFFFFFFFFFFE0 0000000000000000 dw 0 ;
FFFFFFFFFFFFFFE8 0000000000000000 dw 0 ;
; RST vector
FFFFFFFFFFFFFFF0 org 0xFFFF_FFFF_FFFF_FFF0
FFFFFFFFFFFFFFF0 33FFEC0B jmp start
; ROM checksum goes here
FFFFFFFFFFFFFFF8 org 0xFFFF_FFFF_FFFF_FFF8
FFFFFFFFFFFFFFF8 0000000000000000 dw 0
0000000000000000 00000000
0000000000000004 00000000
Symbol Table:
==========================================================
Name Typ Segment Address/Value
----------------------------------------------------------
CR C constant 000000000000000D
LF C constant 000000000000000A
TAB C constant 0000000000000009
CTRLC C constant 0000000000000003
CTRLH C constant 0000000000000008
CTRLI C constant 0000000000000009
CTRLJ C constant 000000000000000A
CTRLK C constant 000000000000000B
CTRLM C constant 000000000000000D
CTRLS C constant 0000000000000013
CTRLX C constant 0000000000000018
XON C constant 0000000000000011
XOFF C constant 0000000000000013
EX_IRQ C constant 00000000000001C1
DATA_PRESENT C constant 0000000000000001
XMIT_NOT_FULL C constant 0000000000000020
BUFLEN C constant 0000000000000050
STACKTOP0 C constant FFFFFFFFFFFEFFF8
STACKTOP1 C constant FFFFFFFFFFFEFBF8
STACKTOP2 C constant FFFFFFFFFFFEF7F8
STACKTOP3 C constant FFFFFFFFFFFEF3F8
STACKTOP4 C constant FFFFFFFFFFFEEFF8
STACKTOP5 C constant FFFFFFFFFFFEEBF8
STACKTOP6 C constant FFFFFFFFFFFEE7F8
STACKTOP7 C constant FFFFFFFFFFFEE3F8
STACKTOP8 C constant FFFFFFFFFFFEDFF8
STACKTOP9 C constant FFFFFFFFFFFEDBF8
STACKTOP10 C constant FFFFFFFFFFFED7F8
STACKTOP11 C constant FFFFFFFFFFFED3F8
STACKTOP12 C constant FFFFFFFFFFFECFF8
STACKTOP13 C constant FFFFFFFFFFFECBF8
STACKTOP14 C constant FFFFFFFFFFFEC7F8
STACKTOP15 C constant FFFFFFFFFFFEC3F8
TCBSize C constant 0000000000000200
TCBBase C constant 0000000100000000
TCBr1 C constant 0000000000000000
TCBr2 C constant 0000000000000008
TCBr3 C constant 0000000000000010
TCBr4 C constant 0000000000000018
TCBr5 C constant 0000000000000020
TCBr6 C constant 0000000000000028
TCBr7 C constant 0000000000000030
TCBr8 C constant 0000000000000038
TCBr9 C constant 0000000000000040
TCBr10 C constant 0000000000000048
TCBr11 C constant 0000000000000050
TCBr12 C constant 0000000000000058
TCBr13 C constant 0000000000000060
TCBr14 C constant 0000000000000068
TCBr15 C constant 0000000000000070
TCBr16 C constant 0000000000000078
TCBr17 C constant 0000000000000080
TCBr18 C constant 0000000000000088
TCBr19 C constant 0000000000000090
TCBr20 C constant 0000000000000098
TCBr21 C constant 00000000000000A0
TCBr22 C constant 00000000000000A8
TCBr23 C constant 00000000000000B0
TCBr24 C constant 00000000000000B8
TCBr25 C constant 00000000000000C0
TCBr26 C constant 00000000000000C8
TCBr27 C constant 00000000000000D0
TCBr28 C constant 00000000000000D8
TCBr29 C constant 00000000000000E0
TCBr30 C constant 00000000000000E8
TCBr31 C constant 00000000000000F0
SCREENGATE C constant 0000000000000000
KEYBDGATE C constant 0000000000000001
VIDEOGATE C constant 0000000000000002
CARDGATE C constant 0000000000000003
warmStart C constant 0000000000001020
usrJmp C constant 0000000000001028
TickIRQAddr C constant 0000000000001030
TaskBlock C constant 0000000000001038
Milliseconds C constant 0000000000001400
Lastloc C constant 0000000000001408
CharColor C constant 0000000000001410
ScreenColor C constant 0000000000001414
CursorRow C constant 0000000000001417
CursorCol C constant 0000000000001418
CursorFlash C constant 000000000000141A
KeybdEcho C constant 000000000000141C
KeybdBuffer C constant 0000000000001440
KeybdHead C constant 0000000000001450
KeybdTail C constant 0000000000001451
sp_save C constant 0000000000001460
lr_save C constant 0000000000001468
r1_save C constant 0000000000001470
r2_save C constant 0000000000001478
r26_save C constant 0000000000001480
Score C constant 0000000000001500
Manpos C constant 0000000000001508
MissileActive C constant 0000000000001510
MissileX C constant 0000000000001512
MissileY C constant 0000000000001514
InvadersRow1 C constant 0000000000001520
InvadersRow2 C constant 0000000000001530
InvadersRow3 C constant 0000000000001540
InvadersRow4 C constant 0000000000001550
InvadersRow5 C constant 0000000000001560
InvadersColpos C constant 0000000000001570
InvadersRowpos C constant 0000000000001571
Uart_rxfifo C constant 0000000000001600
Uart_rxhead C constant 0000000000001800
Uart_rxtail C constant 0000000000001802
Uart_ms C constant 0000000000001808
Uart_rxrts C constant 0000000000001809
Uart_rxdtr C constant 000000000000180A
Uart_rxxon C constant 000000000000180B
Uart_rxflow C constant 000000000000180C
Uart_fon C constant 000000000000180E
Uart_foff C constant 0000000000001810
Uart_txrts C constant 0000000000001812
Uart_txdtr C constant 0000000000001813
Uart_txxon C constant 0000000000001814
Uart_txxonoff C constant 0000000000001815
TaskList C constant 0000000000002000
ReadyList1 C constant 0000000000002000
ReadyList2 C constant 0000000000002020
ReadyList3 C constant 0000000000002040
ReadyList4 C constant 0000000000002060
ReadyList5 C constant 0000000000002080
ReadyNdx1 C constant 00000000000020A0
ReadyNdx2 C constant 00000000000020A1
ReadyNdx3 C constant 00000000000020A2
ReadyNdx4 C constant 00000000000020A3
ReadyNdx5 C constant 00000000000020A4
RunningTCB C constant 00000000000020A6
NextToRunTCB C constant 00000000000020A8
r1save C constant 00000000000020B0
r2save C constant 00000000000020B8
AXCstart C constant 00000000000020C0
ctx0start C constant 00000000000020D0
ctx1start C constant 00000000000020D8
ctx2start C constant 00000000000020E0
ctx3start C constant 00000000000020E8
ctx4start C constant 00000000000020F0
ctx5start C constant 00000000000020F8
ctx6start C constant 0000000000002100
ctx7start C constant 0000000000002108
ctx8start C constant 0000000000002110
ctx9start C constant 0000000000002118
ctx10start C constant 0000000000002120
ctx11start C constant 0000000000002128
ctx12start C constant 0000000000002130
ctx13start C constant 0000000000002138
ctx14start C constant 0000000000002140
ctx15start C constant 0000000000002148
sp_saves C constant 0000000000002200
sp_saves_end C constant 0000000000002280
p100IRQvec C constant 0000000000003000
keybdIRQvec C constant 0000000000003008
serialIRQvec C constant 0000000000003010
rasterIRQvec C constant 0000000000003018
startSector C constant 00000000000030F8
BPB C constant 0000000000003100
TEXTSCR C constant 0000000000D00000
COLORSCR C constant 0000000000D10000
TEXTREG C constant 0000000000DA0000
TEXT_COLS C constant 0000000000000000
TEXT_ROWS C constant 0000000000000002
TEXT_CURPOS C constant 0000000000000016
KEYBD C constant 0000000000DC0000
KEYBDCLR C constant 0000000000DC0002
UART C constant 0000000000DC0A00
UART_LS C constant 0000000000DC0A01
UART_IS C constant 0000000000DC0A03
UART_IE C constant 0000000000DC0A04
UART_MC C constant 0000000000DC0A06
DATETIME C constant 0000000000DC0400
SPIMASTER C constant 0000000000DC0500
SPI_MASTER_VERSION_REG C constant 0000000000000000
SPI_MASTER_CONTROL_REG C constant 0000000000000001
SPI_TRANS_TYPE_REG C constant 0000000000000002
SPI_TRANS_CTRL_REG C constant 0000000000000003
SPI_TRANS_STATUS_REG C constant 0000000000000004
SPI_TRANS_ERROR_REG C constant 0000000000000005
SPI_DIRECT_ACCESS_DATA_REG C constant 0000000000000006
SPI_SD_ADDR_7_0_REG C constant 0000000000000007
SPI_SD_ADDR_15_8_REG C constant 0000000000000008
SPI_SD_ADDR_23_16_REG C constant 0000000000000009
SPI_SD_ADDR_31_24_REG C constant 000000000000000A
SPI_RX_FIFO_DATA_REG C constant 0000000000000010
SPI_RX_FIFO_DATA_COUNT_MSB C constant 0000000000000012
SPI_RX_FIFO_DATA_COUNT_LSB C constant 0000000000000013
SPI_RX_FIFO_CTRL_REG C constant 0000000000000014
SPI_TX_FIFO_DATA_REG C constant 0000000000000020
SPI_TX_FIFO_CTRL_REG C constant 0000000000000024
SPI_INIT_SD C constant 0000000000000001
SPI_TRANS_START C constant 0000000000000001
SPI_TRANS_BUSY C constant 0000000000000001
SPI_INIT_NO_ERROR C constant 0000000000000000
SPI_READ_NO_ERROR C constant 0000000000000000
RW_READ_SD_BLOCK C constant 0000000000000002
RW_WRITE_SD_BLOCK C constant 0000000000000003
PIC C constant 0000000000DC0FF0
PIC_IE C constant 0000000000DC0FF2
PSG C constant 0000000000D50000
PSGFREQ0 C constant 0000000000D50000
PSGPW0 C constant 0000000000D50002
PSGCTRL0 C constant 0000000000D50004
PSGADSR0 C constant 0000000000D50006
SPRRAM C constant 0000000000D80000
AC97 C constant 0000000000DC1000
TMP C constant 0000000000DC0300
LED C constant 0000000000DC0600
ETHMAC C constant 0000000000DC2000
CONFIGREC C constant 0000000000DCFFFF
MIIMODER C constant 0000000000000028
MIIADDRESS C constant 0000000000000030
GACCEL C constant 0000000000DAE000
RASTERIRQ C constant 0000000000DA0100
BOOT_STACK C constant FFFFFFFFFFFEFFF8
SPRITEREGS C constant 0000000000DAD000
BITMAPSCR C constant 0000000100200000
BOOTJMP C constant 0000000100800204
txempty C constant 0000000000000040
rxfull C constant 0000000000000001
txtWidth L bss 0000000000001048
txtHeight L bss 0000000000001049
cursx L bss 000000000000104A
cursy L bss 000000000000104B
pos L bss 000000000000104C
dh L bss 000000000000104C
0 L bss 000000000000104C
charToPrint L bss 000000000000104C
fgColor L bss 000000000000104E
bkColor L bss 0000000000001051
cursFlash L bss 0000000000001052
lineLinkTbl L bss 0000000000001053
typef L bss 0000000000001085
OSSP L bss 0000000000001088
CURRNT L bss 0000000000001090
STKGOS L bss 0000000000001098
STKINP L bss 00000000000010A0
LOPVAR L bss 00000000000010A8
LOPINC L bss 00000000000010B0
LOPLMT L bss 00000000000010B8
LOPLN L bss 00000000000010C0
LOPPT L bss 00000000000010C8
TXTUNF L bss 00000000000010D0
VARBGN L bss 00000000000010D8
IVARBGN L bss 00000000000010E0
SVARBGN L bss 00000000000010E8
FVARBGN L bss 00000000000010F0
STKBOT L bss 00000000000010F8
NUMWKA L bss 0000000000001100
BUFFER L bss 000000000000111B
TXT C constant 0000000100600000
start L code FFFFFFFFFFFFB02C
ColdStart L code FFFFFFFFFFFFB02C
ict1 L code FFFFFFFFFFFFB084
ctxstart3 L code FFFFFFFFFFFFB214
ctxstart2 L code FFFFFFFFFFFFB224
ctxstart L code FFFFFFFFFFFFB228
ctxstart1 L code FFFFFFFFFFFFB3FC
csj5 L code FFFFFFFFFFFFB240
skip5 L code FFFFFFFFFFFFB2E4
skip4 L code FFFFFFFFFFFFB2FC
dcokay L code FFFFFFFFFFFFB330
skip1 L code FFFFFFFFFFFFB368
skip2 L code FFFFFFFFFFFFB3B0
skip3 L code FFFFFFFFFFFFB3D8
skip_spi_read L code FFFFFFFFFFFFB3F0
j4 L code FFFFFFFFFFFFB3F4
ctx12 L code FFFFFFFFFFFFB410
context1disp L code FFFFFFFFFFFFB428
ctx11 L code FFFFFFFFFFFFB448
HelloWorld L code FFFFFFFFFFFFB460
j3 L code FFFFFFFFFFFFB478
j2 L code FFFFFFFFFFFFB48C
MSG L code FFFFFFFFFFFFB4A0
MSGSTART L code FFFFFFFFFFFFB4AD
PICInit L code FFFFFFFFFFFFB4D0
PICret L code FFFFFFFFFFFFB4EC
SerialInit L code FFFFFFFFFFFFB4F0
SerialGetCharDirect L code FFFFFFFFFFFFB534
sgc1 L code FFFFFFFFFFFFCDC0
SerialCheckForCharDirect L code FFFFFFFFFFFFB558
SerialPutChar L code FFFFFFFFFFFFB570
spcb1 L code FFFFFFFFFFFFB5D0
spcb3 L code FFFFFFFFFFFFB5B0
spcabort L code FFFFFFFFFFFFB658
spcb2 L code FFFFFFFFFFFFB600
spcb4 L code FFFFFFFFFFFFB5E0
spcb5 L code FFFFFFFFFFFFB61C
spcb6 L code FFFFFFFFFFFFB608
spcb8 L code FFFFFFFFFFFFB624
spcb7 L code FFFFFFFFFFFFB64C
CharsInRxBuf L code FFFFFFFFFFFFB66C
cirxb1 L code FFFFFFFFFFFFB68C
SerialGetChar L code FFFFFFFFFFFFB690
sgcfifo1 L code FFFFFFFFFFFFB750
sgcfifo2 L code FFFFFFFFFFFFB73C
sgcfifo3 L code FFFFFFFFFFFFB700
sgcfifo4 L code FFFFFFFFFFFFB724
sgcfifo5 L code FFFFFFFFFFFFB73C
SerialIRQ L code FFFFFFFFFFFFB768
sirq1 L code FFFFFFFFFFFFB7A0
srxirq L code FFFFFFFFFFFFB7C8
stxirq L code FFFFFFFFFFFFB7C4
smsirq L code FFFFFFFFFFFFB7B8
srxirq1 L code FFFFFFFFFFFFB7C8
srxirq3 L code FFFFFFFFFFFFB7F8
srxirq2 L code FFFFFFFFFFFFB7EC
srxirq5 L code FFFFFFFFFFFFB814
srxirq8 L code FFFFFFFFFFFFB8A4
srxirq6 L code FFFFFFFFFFFFB868
srxirq7 L code FFFFFFFFFFFFB88C
VideoSC L code FFFFFFFFFFFFB8A8
Video1 L code FFFFFFFFFFFFB8D0
Video_x02 L code FFFFFFFFFFFFB90C
Video_x03 L code FFFFFFFFFFFFB91C
Video_x06 L code FFFFFFFFFFFFB928
Video_x09 L code FFFFFFFFFFFFB930
Video_x0A L code FFFFFFFFFFFFB944
Video_x0C L code FFFFFFFFFFFFB954
Video_x0D L code FFFFFFFFFFFFB98C
Video_x14 L code FFFFFFFFFFFFB9E0
Video_x15 L code FFFFFFFFFFFFB9EC
Video_x16 L code FFFFFFFFFFFFB9FC
Video_x17 L code FFFFFFFFFFFFBA08
Video_x1A L code FFFFFFFFFFFFBA14
VideoRet L code FFFFFFFFFFFFBA20
Video_x09a L code FFFFFFFFFFFFB938
Video_x0Aa L code FFFFFFFFFFFFB948
vxd1 L code FFFFFFFFFFFFB9C0
SDCARDSC L code FFFFFFFFFFFFBA38
SDC_1 L code FFFFFFFFFFFFBA60
SDC_x00 L code FFFFFFFFFFFFBA78
SDC_x01 L code FFFFFFFFFFFFBA80
SDC_x02 L code FFFFFFFFFFFFBA90
SDCRet L code FFFFFFFFFFFFBA90
RTCSC L code FFFFFFFFFFFFBAA8
RTC_x00 L code FFFFFFFFFFFFBAD8
RTC_x01 L code FFFFFFFFFFFFBAE0
RTCRet L code FFFFFFFFFFFFBB00
KeybdSC L code FFFFFFFFFFFFBB14
kbdsc5 L code FFFFFFFFFFFFBB3C
kbd_x00 L code FFFFFFFFFFFFBB60
kbd_x01 L code FFFFFFFFFFFFBB68
kbd_x02 L code FFFFFFFFFFFFBB74
kbd_x03 L code FFFFFFFFFFFFBB7C
kbd_x04 L code FFFFFFFFFFFFBB84
kbd_x05 L code FFFFFFFFFFFFBB8C
kbdscRet L code FFFFFFFFFFFFBB94
KeybdInit L code FFFFFFFFFFFFBBAC
KeybdIRQ L code FFFFFFFFFFFFBBC0
KeybdIRQa L code FFFFFFFFFFFFBBD0
KeybdIRQb L code FFFFFFFFFFFFBBF8
KeybdIRQc L code FFFFFFFFFFFFBC0C
SetKeyboardEcho L code FFFFFFFFFFFFBC14
KeybdGetChar L code FFFFFFFFFFFFBC1C
nochar L code FFFFFFFFFFFFBC60
kgc3 L code FFFFFFFFFFFFBC64
kgc2 L code FFFFFFFFFFFFBC58
KeybdCheckForKey L code FFFFFFFFFFFFBC70
KeybdCheckForKeyDirect L code FFFFFFFFFFFFBC80
KeybdGetCharDirect L code FFFFFFFFFFFFBC94
kgc1 L code FFFFFFFFFFFFBCA4
gk1 L code FFFFFFFFFFFFBCDC
gk2 L code FFFFFFFFFFFFBCD8
tmp_init L code FFFFFFFFFFFFBCE8
tmp_init4 L code FFFFFFFFFFFFBCF4
tmp_init5 L code FFFFFFFFFFFFBD0C
tmp_init1 L code FFFFFFFFFFFFBD20
tmp_init2 L code FFFFFFFFFFFFBD30
tmp_init3 L code FFFFFFFFFFFFBD48
tmp_read L code FFFFFFFFFFFFBD4C
tmp_read1 L code FFFFFFFFFFFFBD68
tmp_read3 L code FFFFFFFFFFFFBD80
tmp_read2 L code FFFFFFFFFFFFBD90
tmp_read4 L code FFFFFFFFFFFFBDA8
Pulse100 L code FFFFFFFFFFFFBDCC
p1001 L code FFFFFFFFFFFFBE00
SelectNextToRunTCB L code FFFFFFFFFFFFBE08
SwitchTask L code FFFFFFFFFFFFBE10
swtsk1 L code FFFFFFFFFFFFBE30
FlashCursor L code FFFFFFFFFFFFBF60
flshcrsr2 L code FFFFFFFFFFFFBFBC
flshcrsr3 L code FFFFFFFFFFFFBF94
flshcrsr1 L code FFFFFFFFFFFFBFA8
CursorOff L code FFFFFFFFFFFFBFC8
CursorOn L code FFFFFFFFFFFFBFDC
ClearBmpScreen L code FFFFFFFFFFFFBFF0
csj4 L code FFFFFFFFFFFFC08C
ClearScreen L code FFFFFFFFFFFFC044
ScrollUp L code FFFFFFFFFFFFC0B8
scrup1 L code FFFFFFFFFFFFC0F8
BlankLine L code FFFFFFFFFFFFC138
blnkln1 L code FFFFFFFFFFFFC170
AsciiToScreen L code FFFFFFFFFFFFC18C
atoscr1 L code FFFFFFFFFFFFC1A4
ScreenToAscii L code FFFFFFFFFFFFC1AC
stasc1 L code FFFFFFFFFFFFC1B8
CalcScreenLoc L code FFFFFFFFFFFFC1BC
DisplayChar L code FFFFFFFFFFFFC1FC
dccr L code FFFFFFFFFFFFC21C
dcx7 L code FFFFFFFFFFFFC248
dcx6 L code FFFFFFFFFFFFC260
dccr1 L code FFFFFFFFFFFFC224
dcx8 L code FFFFFFFFFFFFC290
dccu1 L code FFFFFFFFFFFFC268
dcx9 L code FFFFFFFFFFFFC2C0
dccl1 L code FFFFFFFFFFFFC298
dcx10 L code FFFFFFFFFFFFC2F0
dccd1 L code FFFFFFFFFFFFC2C8
dcx11 L code FFFFFFFFFFFFC324
dcx12 L code FFFFFFFFFFFFC31C
dcx13 L code FFFFFFFFFFFFC358
dcx5 L code FFFFFFFFFFFFC378
dcx3 L code FFFFFFFFFFFFC3AC
dcx4 L code FFFFFFFFFFFFC3E0
dclf L code FFFFFFFFFFFFC3DC
IncCursorPos L code FFFFFFFFFFFFC3FC
icc1 L code FFFFFFFFFFFFC470
icr1 L code FFFFFFFFFFFFC448
IncCursorRow L code FFFFFFFFFFFFC434
DisplayString L code FFFFFFFFFFFFC488
dspj1 L code FFFFFFFFFFFFC49C
dsret L code FFFFFFFFFFFFC4B0
DisplayStringCRLF L code FFFFFFFFFFFFC4C0
CRLF L code FFFFFFFFFFFFF600
DisplayNum L code FFFFFFFFFFFFC4FC
DisplayNybble L code FFFFFFFFFFFFC500
dispnyb1 L code FFFFFFFFFFFFC51C
DisplayByte L code FFFFFFFFFFFFC52C
DisplayCharr L code FFFFFFFFFFFFC554
DisplayHalf L code FFFFFFFFFFFFC57C
DisplayWord L code FFFFFFFFFFFFC5A4
dspwd1 L code FFFFFFFFFFFFC5B8
DisplayMemB L code FFFFFFFFFFFFC5D4
dspmem1 L code FFFFFFFFFFFFC5F8
DisplayMemC L code FFFFFFFFFFFFC624
dspmemc1 L code FFFFFFFFFFFFC648
DisplayMemW L code FFFFFFFFFFFFC674
BinToBCD L code FFFFFFFFFFFFC6B4
bta1 L code FFFFFFFFFFFFC6D8
BCDToAscii L code FFFFFFFFFFFFC730
bta2 L code FFFFFFFFFFFFC748
BinToStr L code FFFFFFFFFFFFC78C
btos3 L code FFFFFFFFFFFFC7C0
btos1 L code FFFFFFFFFFFFC7C4
btos2 L code FFFFFFFFFFFFC7F4
Monitor L code FFFFFFFFFFFFC828
PromptLn L code FFFFFFFFFFFFC834
Prompt3 L code FFFFFFFFFFFFC840
Prompt1 L code FFFFFFFFFFFFC854
Prompt2 L code FFFFFFFFFFFFC87C
Editmem L code FFFFFFFFFFFFCA24
Dumpmem L code FFFFFFFFFFFFCA70
Fillmem L code FFFFFFFFFFFFCAD4
Prompt7 L code FFFFFFFFFFFFC888
Prompt4 L code FFFFFFFFFFFFC890
ExecuteCode L code FFFFFFFFFFFFCA4C
Prompt9 L code FFFFFFFFFFFFC89C
Prompt10 L code FFFFFFFFFFFFC8AC
TestCLS L code FFFFFFFFFFFFC8DC
Prompt12 L code FFFFFFFFFFFFC8B8
Prompt13 L code FFFFFFFFFFFFC8C0
Prompt14 L code FFFFFFFFFFFFC8C8
Prompt15 L code FFFFFFFFFFFFC8D0
RandomLinesCall L code FFFFFFFFFFFFC8D4
HelpMsg L code FFFFFFFFFFFFC910
ignBlanks L code FFFFFFFFFFFFCA00
ignBlanks1 L code FFFFFFFFFFFFCA08
edtmem1 L code FFFFFFFFFFFFCA34
LoadSector L code FFFFFFFFFFFFCA5C
Dumpmem2 L code FFFFFFFFFFFFCAA0
DumpmemW L code FFFFFFFFFFFFCAC4
DumpmemC L code FFFFFFFFFFFFCAB8
DumpmemB L code FFFFFFFFFFFFCAAC
FillmemC L code FFFFFFFFFFFFCB20
FillmemH L code FFFFFFFFFFFFCB30
FillmemW L code FFFFFFFFFFFFCB40
FillmemB L code FFFFFFFFFFFFCB10
GetHexNumber L code FFFFFFFFFFFFCB50
gthxn2 L code FFFFFFFFFFFFCB68
gthxn1 L code FFFFFFFFFFFFCB8C
AsciiToHexNybble L code FFFFFFFFFFFFCBA0
gthx3 L code FFFFFFFFFFFFCBD8
gthx5 L code FFFFFFFFFFFFCBB0
gthx6 L code FFFFFFFFFFFFCBC4
LoadS19 L code FFFFFFFFFFFFCBE0
ProcessRec L code FFFFFFFFFFFFCBEC
NextRec L code FFFFFFFFFFFFCBE4
ProcessS1 L code FFFFFFFFFFFFCCA4
ProcessS2 L code FFFFFFFFFFFFCCAC
ProcessS3 L code FFFFFFFFFFFFCCB4
ProcessS7 L code FFFFFFFFFFFFCCBC
ProcessS8 L code FFFFFFFFFFFFCCC8
ProcessS9 L code FFFFFFFFFFFFCCD4
pcssxa L code FFFFFFFFFFFFCC4C
pcss1a L code FFFFFFFFFFFFCC54
S19Get16BitAddress L code FFFFFFFFFFFFCCE0
S1932b L code FFFFFFFFFFFFCD64
S19Get24BitAddress L code FFFFFFFFFFFFCCF8
S1932a L code FFFFFFFFFFFFCD44
S19Get32BitAddress L code FFFFFFFFFFFFCD10
sGetChar L code FFFFFFFFFFFFCDA8
sgc2 L code FFFFFFFFFFFFCDB0
RandomLines L code FFFFFFFFFFFFCDD0
rl5 L code FFFFFFFFFFFFCDE4
rl1 L code FFFFFFFFFFFFCDF8
rl2 L code FFFFFFFFFFFFCE14
rl3 L code FFFFFFFFFFFFCE30
rl4 L code FFFFFFFFFFFFCE4C
rl8 L code FFFFFFFFFFFFCE78
rl7 L code FFFFFFFFFFFFCE8C
RandomizeSprram L code FFFFFFFFFFFFCE9C
rsr1 L code FFFFFFFFFFFFCEAC
SetupAC97 L code FFFFFFFFFFFFCEC4
sac974 L code FFFFFFFFFFFFCED0
sac971 L code FFFFFFFFFFFFCEDC
sac973 L code FFFFFFFFFFFFCF08
sac972 L code FFFFFFFFFFFFCF48
sac975 L code FFFFFFFFFFFFCF60
Beep L code FFFFFFFFFFFFCF6C
beep1 L code FFFFFFFFFFFFCFE4
beep2 L code FFFFFFFFFFFFD014
Piano L code FFFFFFFFFFFFD044
playnt L code FFFFFFFFFFFFD054
playnt1a L code FFFFFFFFFFFFD07C
playnt1b L code FFFFFFFFFFFFD088
playnt1c L code FFFFFFFFFFFFD094
playnt1d L code FFFFFFFFFFFFD0A0
playnt1e L code FFFFFFFFFFFFD0AC
playnt1f L code FFFFFFFFFFFFD0B8
playnt1g L code FFFFFFFFFFFFD0C4
Tone L code FFFFFFFFFFFFD0D0
tone1 L code FFFFFFFFFFFFD110
tone2 L code FFFFFFFFFFFFD12C
SetupRasterIRQ L code FFFFFFFFFFFFD14C
RasterIRQfn L code FFFFFFFFFFFFD1AC
rirq1 L code FFFFFFFFFFFFD1DC
rirq2 L code FFFFFFFFFFFFD1DC
rirq3 L code FFFFFFFFFFFFD1DC
rirq4 L code FFFFFFFFFFFFD1DC
rirq5 L code FFFFFFFFFFFFD1DC
rirq6 L code FFFFFFFFFFFFD1DC
rirq7 L code FFFFFFFFFFFFD1DC
rirq8 L code FFFFFFFFFFFFD1DC
DisplayDatetime L code FFFFFFFFFFFFD248
InitializeGame L code FFFFFFFFFFFFD2C4
DrawScore L code FFFFFFFFFFFFD2EC
DrawMissile L code FFFFFFFFFFFFD31C
MissileOff L code FFFFFFFFFFFFD378
DrawMan L code FFFFFFFFFFFFD3A0
DrawInvader L code FFFFFFFFFFFFD3EC
DrawInvaders L code FFFFFFFFFFFFD40C
dinv1 L code FFFFFFFFFFFFD494
DrawBombs L code FFFFFFFFFFFFD49C
Invaders L code FFFFFFFFFFFFD4A0
InvadersLoop L code FFFFFFFFFFFFD4AC
TestMoveMan L code FFFFFFFFFFFFD4C0
MoveManRight L code FFFFFFFFFFFFD4D4
MoveManLeft L code FFFFFFFFFFFFD4EC
FireMissile L code FFFFFFFFFFFFD500
Invaders1 L code FFFFFFFFFFFFD524
InvadersEnd L code FFFFFFFFFFFFD52C
spi_init L code FFFFFFFFFFFFD538
spi_init1 L code FFFFFFFFFFFFD568
spi_error L code FFFFFFFFFFFFD594
spi_init_exit L code FFFFFFFFFFFFD5A4
spi_read_sector L code FFFFFFFFFFFFD5B4
spi_read_sect1 L code FFFFFFFFFFFFD614
spi_read_error L code FFFFFFFFFFFFD64C
spi_read_sect2 L code FFFFFFFFFFFFD634
spi_read_ret L code FFFFFFFFFFFFD65C
spi_read_boot L code FFFFFFFFFFFFD674
spi_read_boot1 L code FFFFFFFFFFFFD694
spi_read_boot2 L code FFFFFFFFFFFFD6DC
spi_read_boot3 L code FFFFFFFFFFFFD6D0
spi_read_boot4 L code FFFFFFFFFFFFD714
msgFoundEB L code FFFFFFFFFFFFD728
loadFAT L code FFFFFFFFFFFFD73C
loadFAT1 L code FFFFFFFFFFFFD780
loadRootDirectory L code FFFFFFFFFFFFD79C
loadRootDir1 L code FFFFFFFFFFFFD800
loadBootFile L code FFFFFFFFFFFFD814
loadBootFileTmp L code FFFFFFFFFFFFD8A8
loadBootFile4 L code FFFFFFFFFFFFD870
loadBootFile5 L code FFFFFFFFFFFFD890
loadBootFile3 L code FFFFFFFFFFFFD888
loadBootFile1 L code FFFFFFFFFFFFD8C8
loadBootFile2 L code FFFFFFFFFFFFD914
msgJumpingToBoot L code FFFFFFFFFFFFD920
msgNotBootable L code FFFFFFFFFFFFD930
spi_init_ok_msg L code FFFFFFFFFFFFD946
spi_init_error_msg L code FFFFFFFFFFFFD960
spi_boot_error_msg L code FFFFFFFFFFFFD98B
spi_read_error_msg L code FFFFFFFFFFFFD99E
my_MAC1 C constant 0000000000000000
my_MAC2 C constant 00000000000000FF
my_MAC3 C constant 00000000000000EE
my_MAC4 C constant 00000000000000F0
my_MAC5 C constant 00000000000000DA
my_MAC6 C constant 0000000000000042
.bss L code FFFFFFFFFFFFD9B4
eth_unique_id L code FFFFFFFFFFFFD9B4
.code L code FFFFFFFFFFFFD9BC
eth_init L code FFFFFFFFFFFFD9BC
eth_request_packet L code FFFFFFFFFFFFD9F4
eth1 L code FFFFFFFFFFFFDA24
eth20 L code FFFFFFFFFFFFDA4C
eth_interpret_packet L code FFFFFFFFFFFFDA70
eth2 L code FFFFFFFFFFFFDA9C
eth5 L code FFFFFFFFFFFFDA90
eth3 L code FFFFFFFFFFFFDACC
eth4 L code FFFFFFFFFFFFDAB4
eth6 L code FFFFFFFFFFFFDAC0
eth7 L code FFFFFFFFFFFFDACC
eth_send_packet L code FFFFFFFFFFFFDADC
eth8 L code FFFFFFFFFFFFDAF4
eth_build_packet L code FFFFFFFFFFFFDB24
eth16 L code FFFFFFFFFFFFDBEC
eth_checksum L code FFFFFFFFFFFFDC38
eth15 L code FFFFFFFFFFFFDC58
eth14 L code FFFFFFFFFFFFDC80
eth_verifyIP L code FFFFFFFFFFFFDCB0
eth11 L code FFFFFFFFFFFFDD0C
eth12 L code FFFFFFFFFFFFDCF4
eth13 L code FFFFFFFFFFFFDCF8
eth_main L code FFFFFFFFFFFFDD3C
eth_loop L code FFFFFFFFFFFFDD40
eth10 L code FFFFFFFFFFFFDDF8
GOSTART L code FFFFFFFFFFFFDF4C
GOWARM L code FFFFFFFFFFFFDF50
GOOUT L code FFFFFFFFFFFFDF54
GOIN L code FFFFFFFFFFFFDF58
GOAUXO L code FFFFFFFFFFFFDF5C
GOAUXI L code FFFFFFFFFFFFDF60
GOBYE L code FFFFFFFFFFFFDF64
TXTBGN L code FFFFFFFFFFFFDF68
ENDMEM L code FFFFFFFFFFFFDF70
CSTART L code FFFFFFFFFFFFDF80
WSTART L code FFFFFFFFFFFFE004
ST3 L code FFFFFFFFFFFFE01C
DIRECT L code FFFFFFFFFFFFE318
ST2 L code FFFFFFFFFFFFE048
ERROR L code FFFFFFFFFFFFF028
ST4 L code FFFFFFFFFFFFE09C
ST7 L code FFFFFFFFFFFFE078
ST6 L code FFFFFFFFFFFFE094
ST5 L code FFFFFFFFFFFFE0C4
TAB1 L code FFFFFFFFFFFFE0EC
TAB2 L code FFFFFFFFFFFFE0FE
TAB4 L code FFFFFFFFFFFFE14E
TAB5 L code FFFFFFFFFFFFE16F
TAB6 L code FFFFFFFFFFFFE172
TAB8 L code FFFFFFFFFFFFE177
TAB9 L code FFFFFFFFFFFFE181
TAB10 L code FFFFFFFFFFFFE185
TAB1_1 L code FFFFFFFFFFFFE188
TAB2_1 L code FFFFFFFFFFFFE1B0
TAB4_1 L code FFFFFFFFFFFFE258
TAB5_1 L code FFFFFFFFFFFFE2A0
TAB6_1 L code FFFFFFFFFFFFE2B0
TAB8_1 L code FFFFFFFFFFFFE2C0
TAB9_1 L code FFFFFFFFFFFFE2F8
TAB10_1 L code FFFFFFFFFFFFE308
EXEC L code FFFFFFFFFFFFE320
EXLP L code FFFFFFFFFFFFE334
EXNGO L code FFFFFFFFFFFFE34C
EXGO L code FFFFFFFFFFFFE384
EXMAT L code FFFFFFFFFFFFE374
EX1 L code FFFFFFFFFFFFE364
NEW L code FFFFFFFFFFFFE38C
STOP L code FFFFFFFFFFFFE39C
RUN L code FFFFFFFFFFFFE3A4
RUNNXL L code FFFFFFFFFFFFE3B4
RUNTSL L code FFFFFFFFFFFFE3D4
RUNSML L code FFFFFFFFFFFFE3DC
GOTO L code FFFFFFFFFFFFE3EC
_clr L code FFFFFFFFFFFFE40C
FINISH L code FFFFFFFFFFFFE518
clearVars L code FFFFFFFFFFFFE414
cv1 L code FFFFFFFFFFFFE428
LISTX L code FFFFFFFFFFFFE440
LS1 L code FFFFFFFFFFFFE454
LS4 L code FFFFFFFFFFFFE45C
LS3 L code FFFFFFFFFFFFE47C
LS2 L code FFFFFFFFFFFFE474
PRINT L code FFFFFFFFFFFFE488
PR2 L code FFFFFFFFFFFFE4A0
PR0 L code FFFFFFFFFFFFE4B4
PR3 L code FFFFFFFFFFFFE4EC
PR1 L code FFFFFFFFFFFFE4CC
PR4 L code FFFFFFFFFFFFE4E4
PR8 L code FFFFFFFFFFFFE508
PR6 L code FFFFFFFFFFFFE500
GOSUB L code FFFFFFFFFFFFE520
gosub1 L code FFFFFFFFFFFFE538
RETURN L code FFFFFFFFFFFFE55C
return1 L code FFFFFFFFFFFFE570
FOR L code FFFFFFFFFFFFE594
FR1 L code FFFFFFFFFFFFE5AC
FR2 L code FFFFFFFFFFFFE5C0
FR4 L code FFFFFFFFFFFFE5CC
FR3 L code FFFFFFFFFFFFE5C8
FR5 L code FFFFFFFFFFFFE5D0
FR7 L code FFFFFFFFFFFFE5EC
FR6 L code FFFFFFFFFFFFE5E8
FR8 L code FFFFFFFFFFFFE60C
NEXT L code FFFFFFFFFFFFE610
NX4 L code FFFFFFFFFFFFE624
NX0 L code FFFFFFFFFFFFE628
NX5 L code FFFFFFFFFFFFE638
NX2 L code FFFFFFFFFFFFE644
NX1 L code FFFFFFFFFFFFE664
NXPurge L code FFFFFFFFFFFFE678
NX3 L code FFFFFFFFFFFFE668
IF L code FFFFFFFFFFFFE680
IF1 L code FFFFFFFFFFFFE684
IF2 L code FFFFFFFFFFFFE688
IF3 L code FFFFFFFFFFFFE698
INPERR L code FFFFFFFFFFFFE69C
INPUT L code FFFFFFFFFFFFE6B0
IP6 L code FFFFFFFFFFFFE6B8
IP2 L code FFFFFFFFFFFFE6D8
IP4 L code FFFFFFFFFFFFE748
IP3 L code FFFFFFFFFFFFE708
IP7 L code FFFFFFFFFFFFE6F0
IP5 L code FFFFFFFFFFFFE758
DEFLT L code FFFFFFFFFFFFE764
LET L code FFFFFFFFFFFFE76C
LT1 L code FFFFFFFFFFFFE780
LOAD L code FFFFFFFFFFFFE784
LOD1 L code FFFFFFFFFFFFE790
LODEND L code FFFFFFFFFFFFE7D0
LOD2 L code FFFFFFFFFFFFE7B8
GCHAR L code FFFFFFFFFFFFE7D8
GCHAR1 L code FFFFFFFFFFFFE7F0
asciiToHex L code FFFFFFFFFFFFE81C
a2h1 L code FFFFFFFFFFFFE824
SAVE L code FFFFFFFFFFFFE830
SAVE1 L code FFFFFFFFFFFFE838
SAVEND L code FFFFFFFFFFFFE874
SAVE2 L code FFFFFFFFFFFFE860
AUXOCRLF L code FFFFFFFFFFFFE88C
PWORD L code FFFFFFFFFFFFE8AC
pword1 L code FFFFFFFFFFFFE8C0
pword2 L code FFFFFFFFFFFFE8DC
toAsciiHex L code FFFFFFFFFFFFE8FC
tah1 L code FFFFFFFFFFFFE908
POKE L code FFFFFFFFFFFFE910
PKER L code FFFFFFFFFFFFE93C
POKEC L code FFFFFFFFFFFFE944
POKEH L code FFFFFFFFFFFFE970
POKEW L code FFFFFFFFFFFFE99C
SYSX L code FFFFFFFFFFFFE9C8
sysx1 L code FFFFFFFFFFFFE9DC
OREXPR L code FFFFFFFFFFFFE9F0
XP_OR1 L code FFFFFFFFFFFFE9FC
XP_OR L code FFFFFFFFFFFFEA0C
XP_ORX L code FFFFFFFFFFFFEA1C
ANDEXPR L code FFFFFFFFFFFFEA28
XP_AND1 L code FFFFFFFFFFFFEA34
XP_AND L code FFFFFFFFFFFFEA44
XP_ANDX L code FFFFFFFFFFFFEA54
isDigit L code FFFFFFFFFFFFEA60
isDigitFalse L code FFFFFFFFFFFFEA70
isAlpha L code FFFFFFFFFFFFEA78
isAlphaFalse L code FFFFFFFFFFFFEA90
isAlphaTrue L code FFFFFFFFFFFFEA88
isAlnum L code FFFFFFFFFFFFEA98
isDigitx L code FFFFFFFFFFFFEAB4
EXPR L code FFFFFFFFFFFFEABC
XP11 L code FFFFFFFFFFFFEAD8
XPRT1 L code FFFFFFFFFFFFEB44
XPRT0 L code FFFFFFFFFFFFEB38
XP12 L code FFFFFFFFFFFFEAE8
XP13 L code FFFFFFFFFFFFEAF8
XP14 L code FFFFFFFFFFFFEB08
XP15 L code FFFFFFFFFFFFEB18
XP16 L code FFFFFFFFFFFFEB28
XP17 L code FFFFFFFFFFFFEB50
XP18 L code FFFFFFFFFFFFEB5C
EXPR2 L code FFFFFFFFFFFFEB78
XP26 L code FFFFFFFFFFFFEBD4
XP21 L code FFFFFFFFFFFFEB98
XP22 L code FFFFFFFFFFFFEBA4
XP23 L code FFFFFFFFFFFFEBA8
XP24 L code FFFFFFFFFFFFEBBC
XP25 L code FFFFFFFFFFFFEBC8
XP45 L code FFFFFFFFFFFFEBE0
EXPR3 L code FFFFFFFFFFFFEBEC
XP31 L code FFFFFFFFFFFFEBF8
XP34 L code FFFFFFFFFFFFEC18
XP47 L code FFFFFFFFFFFFEC38
EXPR4 L code FFFFFFFFFFFFEC44
XP40 L code FFFFFFFFFFFFEC58
XP41 L code FFFFFFFFFFFFEC70
XP46 L code FFFFFFFFFFFFEC7C
PARN L code FFFFFFFFFFFFEC84
XP42 L code FFFFFFFFFFFFECA8
XP43 L code FFFFFFFFFFFFECB0
TSTV L code FFFFFFFFFFFFECB8
tstv_notfound L code FFFFFFFFFFFFED2C
TV1 L code FFFFFFFFFFFFED10
TV2 L code FFFFFFFFFFFFED04
TSTVRT L code FFFFFFFFFFFFED20
getVarName L code FFFFFFFFFFFFED3C
gvn1 L code FFFFFFFFFFFFEDC4
gvn4 L code FFFFFFFFFFFFED5C
gvn2 L code FFFFFFFFFFFFED94
gvn6 L code FFFFFFFFFFFFED84
gvn3 L code FFFFFFFFFFFFEDA8
findVar L code FFFFFFFFFFFFEDD4
fv4 L code FFFFFFFFFFFFEDE4
fv3 L code FFFFFFFFFFFFEE08
fv1 L code FFFFFFFFFFFFEE10
fv2 L code FFFFFFFFFFFFEE20
PEEK L code FFFFFFFFFFFFEE34
PEEKC L code FFFFFFFFFFFFEE44
PEEKH L code FFFFFFFFFFFFEE58
PEEKW L code FFFFFFFFFFFFEE6C
USRX L code FFFFFFFFFFFFEE80
RND L code FFFFFFFFFFFFEE9C
rnd2 L code FFFFFFFFFFFFEECC
rnd1 L code FFFFFFFFFFFFEEC4
modu4 L code FFFFFFFFFFFFEEDC
mod2 L code FFFFFFFFFFFFEEFC
mod1 L code FFFFFFFFFFFFEF18
ABS L code FFFFFFFFFFFFEF34
SGN L code FFFFFFFFFFFFEF44
SIZEX L code FFFFFFFFFFFFEF54
SETVAL L code FFFFFFFFFFFFEF68
sv2 L code FFFFFFFFFFFFEF84
SV1 L code FFFFFFFFFFFFEFAC
QWHAT L code FFFFFFFFFFFFF024
FIN L code FFFFFFFFFFFFEFB0
FI1 L code FFFFFFFFFFFFEFCC
FI2 L code FFFFFFFFFFFFEFE4
ENDCHK L code FFFFFFFFFFFFEFEC
ec1 L code FFFFFFFFFFFFF00C
TOOBIG L code FFFFFFFFFFFFF014
QSORRY L code FFFFFFFFFFFFF01C
GETLN L code FFFFFFFFFFFFF068
GL1 L code FFFFFFFFFFFFF090
GL3 L code FFFFFFFFFFFFF0C4
GL4 L code FFFFFFFFFFFFF0EC
GL2 L code FFFFFFFFFFFFF0A8
GL7 L code FFFFFFFFFFFFF11C
GL6 L code FFFFFFFFFFFFF114
GL5 L code FFFFFFFFFFFFF0F8
FNDLN L code FFFFFFFFFFFFF138
fl1 L code FFFFFFFFFFFFF144
FNDLNP L code FFFFFFFFFFFFF148
FNDRET1 L code FFFFFFFFFFFFF174
FNDNXT L code FFFFFFFFFFFFF188
FNDRET2 L code FFFFFFFFFFFFF180
FNDRET L code FFFFFFFFFFFFF16C
FNDSKP L code FFFFFFFFFFFFF18C
MVUP1 L code FFFFFFFFFFFFF19C
MVUP L code FFFFFFFFFFFFF1AC
MVRET L code FFFFFFFFFFFFF1B0
MVDOWN1 L code FFFFFFFFFFFFF1B4
MVDOWN L code FFFFFFFFFFFFF1C4
POPA L code FFFFFFFFFFFFF1CC
PP1 L code FFFFFFFFFFFFF1FC
PUSHA L code FFFFFFFFFFFFF200
PU1 L code FFFFFFFFFFFFF240
PRTSTG L code FFFFFFFFFFFFF24C
PS1 L code FFFFFFFFFFFFF268
PRTRET L code FFFFFFFFFFFFF288
QTSTG L code FFFFFFFFFFFFF2A4
QT1 L code FFFFFFFFFFFFF2BC
QT2 L code FFFFFFFFFFFFF2FC
QT3 L code FFFFFFFFFFFFF2D4
QT4 L code FFFFFFFFFFFFF2E8
QT5 L code FFFFFFFFFFFFF308
prCRLF L code FFFFFFFFFFFFF310
PRTNUM L code FFFFFFFFFFFFF330
PN2 L code FFFFFFFFFFFFF360
PN1 L code FFFFFFFFFFFFF364
PN6 L code FFFFFFFFFFFFF380
PN4 L code FFFFFFFFFFFFF390
PN3 L code FFFFFFFFFFFFF384
PN5 L code FFFFFFFFFFFFF39C
PNRET L code FFFFFFFFFFFFF3B0
PRTHEXNUM L code FFFFFFFFFFFFF3C8
PHN1 L code FFFFFFFFFFFFF400
PHN7 L code FFFFFFFFFFFFF414
PHN8 L code FFFFFFFFFFFFF418
PHN6 L code FFFFFFFFFFFFF430
PHN4 L code FFFFFFFFFFFFF440
PHN3 L code FFFFFFFFFFFFF434
PHN5 L code FFFFFFFFFFFFF44C
PHNRET L code FFFFFFFFFFFFF460
PRTLN L code FFFFFFFFFFFFF478
TSTC L code FFFFFFFFFFFFF4C0
TC1 L code FFFFFFFFFFFFF4E8
TSTNUM L code FFFFFFFFFFFFF4F8
TN1 L code FFFFFFFFFFFFF50C
TSNMRET L code FFFFFFFFFFFFF54C
TN2 L code FFFFFFFFFFFFF534
IGNBLK L code FFFFFFFFFFFFF554
IGB2 L code FFFFFFFFFFFFF55C
IGB1 L code FFFFFFFFFFFFF568
IGBRET L code FFFFFFFFFFFFF570
TOUPBUF L code FFFFFFFFFFFFF578
TOUPB1 L code FFFFFFFFFFFFF588
TOUPBRT L code FFFFFFFFFFFFF5C4
DOQUO L code FFFFFFFFFFFFF5AC
DOQUO1 L code FFFFFFFFFFFFF5B8
toUpper L code FFFFFFFFFFFFF5CC
TOUPRET L code FFFFFFFFFFFFF5D8
CHKIO L code FFFFFFFFFFFFF5DC
CHKRET2 L code FFFFFFFFFFFFF5F4
CHKRET L code FFFFFFFFFFFFF5F8
PRMESG L code FFFFFFFFFFFFF604
PRMESG1 L code FFFFFFFFFFFFF614
PRMRET L code FFFFFFFFFFFFF628
PRMESGAUX L code FFFFFFFFFFFFF638
PRMESGA1 L code FFFFFFFFFFFFF648
PRMRETA L code FFFFFFFFFFFFF65C
OUTC L code FFFFFFFFFFFFF66C
INC L code FFFFFFFFFFFFF670
AUXIN L code FFFFFFFFFFFFF674
AXIRET_ZERO L code FFFFFFFFFFFFF684
AXIRET L code FFFFFFFFFFFFF680
AUXOUT L code FFFFFFFFFFFFF68C
_cls L code FFFFFFFFFFFFF690
_wait10 L code FFFFFFFFFFFFF698
_getATAStatus L code FFFFFFFFFFFFF69C
_waitCFNotBusy L code FFFFFFFFFFFFF6A0
_rdcf L code FFFFFFFFFFFFF6A4
rdcf6 L code FFFFFFFFFFFFF6A8
BYEBYE L code FFFFFFFFFFFFF8A0
msgInit L code FFFFFFFFFFFFF6B8
OKMSG L code FFFFFFFFFFFFF6EE
msgWhat L code FFFFFFFFFFFFF6F5
SRYMSG L code FFFFFFFFFFFFF6FD
CLMSG L code FFFFFFFFFFFFF703
msgReadError L code FFFFFFFFFFFFF706
msgNumTooBig L code FFFFFFFFFFFFF721
msgDivZero L code FFFFFFFFFFFFF735
msgVarSpace L code FFFFFFFFFFFFF748
msgBytesFree L code FFFFFFFFFFFFF760
msgReady L code FFFFFFFFFFFFF76E
msgComma L code FFFFFFFFFFFFF778
msgLineRange L code FFFFFFFFFFFFF78C
msgVar L code FFFFFFFFFFFFF7A2
msgRNDBad L code FFFFFFFFFFFFF7B9
msgSYSBad L code FFFFFFFFFFFFF7CD
msgInputVar L code FFFFFFFFFFFFF7DF
msgNextFor L code FFFFFFFFFFFFF7FC
msgNextVar L code FFFFFFFFFFFFF80F
msgBadGotoGosub L code FFFFFFFFFFFFF833
msgRetWoGosub L code FFFFFFFFFFFFF850
msgTooBig L code FFFFFFFFFFFFF867
msgExtraChars L code FFFFFFFFFFFFF87C
LSTROM C constant 0000000000000000
ramtest L code FFFFFFFFFFFFF8B0
ramtest2 L code FFFFFFFFFFFFF8C4
ramtest1 L code FFFFFFFFFFFFF8E8
ramtest4 L code FFFFFFFFFFFFF8F0
ramtest3 L code FFFFFFFFFFFFF91C
ramtest8 L code FFFFFFFFFFFFF98C
ramtest5 L code FFFFFFFFFFFFF934
ramtest6 L code FFFFFFFFFFFFF958
ramtest7 L code FFFFFFFFFFFFF960
ramtest9 L code FFFFFFFFFFFFF994
ramtest10 L code FFFFFFFFFFFFF99C
iberr_rout L code FFFFFFFFFFFFF9A4
dberr_rout L code FFFFFFFFFFFFF9BC
dberr1 L code FFFFFFFFFFFFF9F0
msgdberr L code FFFFFFFFFFFFFA20
msgEPC L code FFFFFFFFFFFFFA34
msgiberr L code FFFFFFFFFFFFFA3B
irqrout L code FFFFFFFFFFFFFA5C
irq1000Hz L code FFFFFFFFFFFFFABC
irq100Hz L code FFFFFFFFFFFFFAF0
irqSerial L code FFFFFFFFFFFFFB10
irqRaster L code FFFFFFFFFFFFFB1C
irqKeybd L code FFFFFFFFFFFFFB28
irqColdStart L code FFFFFFFFFFFFFB34
irqret L code FFFFFFFFFFFFFAF8
nmirout L code FFFFFFFFFFFFFB38
msgPerr L code FFFFFFFFFFFFFB80
ui_irout L code FFFFFFFFFFFFFB94
ui_irout1 L code FFFFFFFFFFFFFBB8
msgUnimp L code FFFFFFFFFFFFFBC0
DTLBHandler L code FFFFFFFFFFFFFBE0
dh1 L code FFFFFFFFFFFFFBF0
Go to most recent revision | Compare with Previous | Blame | View Log