basic: add addr command
This commit is contained in:
parent
381d57a513
commit
8f1d942e5f
@ -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.
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user