88 lines
1.3 KiB
NASM
88 lines
1.3 KiB
NASM
|
; *** Variables ***
|
||
|
; Value of `SP` when basic was first invoked. This is where SP is going back to
|
||
|
; on restarts.
|
||
|
.equ BAS_INITSP BAS_RAMSTART
|
||
|
; **Pointer** to current line number
|
||
|
.equ BAS_PCURLN @+2
|
||
|
.equ BAS_RAMEND @+2
|
||
|
|
||
|
; *** Code ***
|
||
|
basStart:
|
||
|
ld (BAS_INITSP), sp
|
||
|
xor a
|
||
|
ld hl, .welcome
|
||
|
call printstr
|
||
|
call printcrlf
|
||
|
ld hl, .welcome+2 ; points to a zero word
|
||
|
ld (BAS_PCURLN), hl
|
||
|
jr basPrompt
|
||
|
|
||
|
.welcome:
|
||
|
.db "OK", 0, 0
|
||
|
|
||
|
basPrompt:
|
||
|
ld hl, .sPrompt
|
||
|
call printstr
|
||
|
call stdioReadLine
|
||
|
call parseDecimal
|
||
|
jr z, .number
|
||
|
call basDirect
|
||
|
jr basPrompt
|
||
|
.number:
|
||
|
; do nothing for now, we only support direct mode.
|
||
|
ld hl, .sNumber
|
||
|
call basPrintLn
|
||
|
jr basPrompt
|
||
|
.sNumber:
|
||
|
.db "A number!", 0
|
||
|
.sPrompt:
|
||
|
.db "> ", 0
|
||
|
|
||
|
basDirect:
|
||
|
ex de, hl
|
||
|
ld hl, basCmds1
|
||
|
.loop:
|
||
|
ld a, 4
|
||
|
call strncmp
|
||
|
jr z, .found
|
||
|
ld a, 6
|
||
|
call addHL
|
||
|
ld a, (hl)
|
||
|
cp 0xff
|
||
|
jr nz, .loop
|
||
|
ld hl, .sUnknown
|
||
|
jr basPrintLn
|
||
|
|
||
|
.found:
|
||
|
inc hl \ inc hl \ inc hl \ inc hl
|
||
|
call intoHL
|
||
|
jp (hl)
|
||
|
|
||
|
.sUnknown:
|
||
|
.db "Unknown command", 0
|
||
|
|
||
|
basPrintLn:
|
||
|
call printcrlf
|
||
|
call printstr
|
||
|
jp printcrlf
|
||
|
|
||
|
; *** Commands ***
|
||
|
basBYE:
|
||
|
ld hl, .sBye
|
||
|
call basPrintLn
|
||
|
; To quit the loop, let's return the stack to its initial value and
|
||
|
; then return.
|
||
|
xor a
|
||
|
ld sp, (BAS_INITSP)
|
||
|
ret
|
||
|
.sBye:
|
||
|
.db "Goodbye!", 0
|
||
|
|
||
|
; direct only
|
||
|
basCmds1:
|
||
|
.db "bye", 0
|
||
|
.dw basBYE
|
||
|
; statements
|
||
|
basCmds2:
|
||
|
.db 0xff ; end of table
|