basic: add addr command

This commit is contained in:
Virgil Dupras 2019-11-24 15:39:36 -05:00
parent 381d57a513
commit 8f1d942e5f
2 changed files with 57 additions and 0 deletions

View File

@ -25,6 +25,12 @@ Because the goal is not to provide a foundation for complex programs, I'm
planning on intentionally crippling this BASIC dialect for the sake of planning on intentionally crippling this BASIC dialect for the sake of
simplicity. simplicity.
The idea here is that the system administrator would build herself many little
tools in assembler and BASIC would be the interactive glue to those tools.
If you find yourself writing complex programs in Collapse OS BASIC, you're on a
wrong path. Back off, that program should be in assembler.
## Glueing ## Glueing
The `glue.asm` file in this folder represents the minimal basic system. There The `glue.asm` file in this folder represents the minimal basic system. There
@ -144,6 +150,16 @@ output I/O on port 42 with value 3.
**sleep**: Sleep a number of "units" specified by the supplied expression. A **sleep**: Sleep a number of "units" specified by the supplied expression. A
"unit" depends on the CPU clock speed. At 4MHz, it is roughly 8 microseconds. "unit" depends on the CPU clock speed. At 4MHz, it is roughly 8 microseconds.
**addr**: This very handy returns (in `A`), the address you query for. You can
query for two types of things: commands or special stuff.
If you query for a command, type the name of the command as an argument. The
address of the associated routine will be returned.
Then, there's the *special stuff*. This is the list of things you can query for:
* `$`: the scratchpad.
## Optional modules ## Optional modules
As explained in "glueing" section abolve, this folder contains optional modules. As explained in "glueing" section abolve, this folder contains optional modules.

View File

@ -360,6 +360,45 @@ basSLEEP:
dec hl ; 6T dec hl ; 6T
jr .loop ; 12T jr .loop ; 12T
basADDR:
call rdWord
ex de, hl
ld de, .specialTbl
.loop:
ld a, (de)
or a
jr z, .notSpecial
cp (hl)
jr z, .found
inc de \ inc de \ inc de
jr .loop
.notSpecial:
; not found, find cmd. needle in (HL)
ex de, hl ; now in (DE)
ld hl, basCmds1
call basFindCmd
jr z, .foundCmd
; no core command? let's try the find hook.
ld ix, (BAS_FINDHOOK)
call callIX
ret nz
.foundCmd:
; We have routine addr in IX
ld (VAR_TBL), ix
cp a ; ensure Z
ret
.found:
; found special thing. Put in "A".
inc de
call intoDE
ld (VAR_TBL), de
ret ; Z set from .found jump.
.specialTbl:
.db '$'
.dw SCRATCHPAD
.db 0
; direct only ; direct only
basCmds1: basCmds1:
.dw basBYE .dw basBYE
@ -394,4 +433,6 @@ basCmds2:
.db "in", 0, 0, 0, 0 .db "in", 0, 0, 0, 0
.dw basSLEEP .dw basSLEEP
.db "sleep", 0 .db "sleep", 0
.dw basADDR
.db "addr", 0, 0
.db 0xff, 0xff, 0xff ; end of table .db 0xff, 0xff, 0xff ; end of table