From 8f1d942e5f8bd38eff3e0e4e7b0fd7ece3fdf7b8 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 24 Nov 2019 15:39:36 -0500 Subject: [PATCH] basic: add addr command --- apps/basic/README.md | 16 ++++++++++++++++ apps/basic/main.asm | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/apps/basic/README.md b/apps/basic/README.md index 142e89f..9fee770 100644 --- a/apps/basic/README.md +++ b/apps/basic/README.md @@ -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 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 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 "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 As explained in "glueing" section abolve, this folder contains optional modules. diff --git a/apps/basic/main.asm b/apps/basic/main.asm index a992f92..1eeba98 100644 --- a/apps/basic/main.asm +++ b/apps/basic/main.asm @@ -360,6 +360,45 @@ basSLEEP: dec hl ; 6T 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 basCmds1: .dw basBYE @@ -394,4 +433,6 @@ basCmds2: .db "in", 0, 0, 0, 0 .dw basSLEEP .db "sleep", 0 + .dw basADDR + .db "addr", 0, 0 .db 0xff, 0xff, 0xff ; end of table