1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-27 14:48:06 +11:00

basic: add ldbas command

This commit is contained in:
Virgil Dupras 2019-11-24 14:26:32 -05:00
parent 13f935aa88
commit e1df320d44
6 changed files with 80 additions and 12 deletions

View File

@ -82,15 +82,17 @@ are initialized to zero on launch.
There are two types of commands: normal and direct-only. The latter can only There are two types of commands: normal and direct-only. The latter can only
be invoked in direct mode, not through a code listing. be invoked in direct mode, not through a code listing.
**bye**. Direct-only. Quits BASIC **bye**: Direct-only. Quits BASIC
**list**. Direct-only. Prints all lines in the code listing, prefixing them **list**: Direct-only. Prints all lines in the code listing, prefixing them
with their associated line number. with their associated line number.
**run**. Direct-only. Runs code from the listing, starting with the first one. **run**: Direct-only. Runs code from the listing, starting with the first one.
If `goto` was previously called in direct mode, we start from that line instead. If `goto` was previously called in direct mode, we start from that line instead.
**print**. Prints the result of the specified expression, then CR/LF. Can be **clear**: Direct-only. Clears the current code listing.
**print**: Prints the result of the specified expression, then CR/LF. Can be
given multiple arguments. In that case, all arguments are printed separately given multiple arguments. In that case, all arguments are printed separately
with a space in between. For example, `print 12 13` prints `12 13<cr><lf>` with a space in between. For example, `print 12 13` prints `12 13<cr><lf>`
@ -98,16 +100,16 @@ Unlike anywhere else, the `print` command can take a string inside a double
quote. That string will be printed as-is. For example, `print "foo" 40+2` will quote. That string will be printed as-is. For example, `print "foo" 40+2` will
print `foo 42`. print `foo 42`.
**goto**. Make the next line to be executed the line number specified as an **goto**: Make the next line to be executed the line number specified as an
argument. Errors out if line doesn't exist. Argument can be an expression. If argument. Errors out if line doesn't exist. Argument can be an expression. If
invoked in direct mode, `run` must be called to actually run the line (followed invoked in direct mode, `run` must be called to actually run the line (followed
by the next, and so on). by the next, and so on).
**if**. If specified condition is true, execute the rest of the line. Otherwise, **if**: If specified condition is true, execute the rest of the line. Otherwise,
do nothing. For example, `if 2>1 print 12` prints `12` and `if 2<1 print 12` do nothing. For example, `if 2>1 print 12` prints `12` and `if 2<1 print 12`
does nothing. The argument for this command is a "thruth expression". does nothing. The argument for this command is a "thruth expression".
**input**. Prompts the user for a numerical value and puts that value in the **input**: Prompts the user for a numerical value and puts that value in the
specified variable. The prompted value is evaluated as an expression and then specified variable. The prompted value is evaluated as an expression and then
stored where specified. For example, `input x` stores the result of the stored where specified. For example, `input x` stores the result of the
evaluation in variable `x`. Before the variable name, a quoted string literal evaluation in variable `x`. Before the variable name, a quoted string literal
@ -144,3 +146,7 @@ Here's the documentation for them.
`fs.asm` provides those commands: `fs.asm` provides those commands:
**fls**: prints the list of files contained in the active filesystem. **fls**: prints the list of files contained in the active filesystem.
**ldbas**: loads the content of the file specified in the argument (as an
unquoted filename) and replace the current code listing with this contents. Any
line not starting with a number is ignored (not an error).

View File

@ -22,6 +22,7 @@ bufInit:
ld (BUF_LFREE), hl ld (BUF_LFREE), hl
ld hl, BUF_POOL ld hl, BUF_POOL
ld (BUF_PFREE), hl ld (BUF_PFREE), hl
cp a ; ensure Z
ret ret
; Add line at (HL) with line number DE to the buffer. The string at (HL) should ; Add line at (HL) with line number DE to the buffer. The string at (HL) should

View File

@ -1,4 +1,8 @@
; FS-related basic commands ; FS-related basic commands
; *** Variables ***
; Handle of the target file
.equ BFS_FILE_HDL BFS_RAMSTART
.equ BFS_RAMEND @+FS_HANDLE_SIZE
basFLS: basFLS:
ld iy, .iter ld iy, .iter
@ -9,7 +13,57 @@ basFLS:
call printstr call printstr
jp printcrlf jp printcrlf
basLDBAS:
call fsFindFN
ret nz
call bufInit
ld ix, BFS_FILE_HDL
call fsOpen
ld hl, 0
ld de, SCRATCHPAD
.loop:
ld ix, BFS_FILE_HDL
call fsGetB
jr nz, .loopend
inc hl
or a ; null? hum, weird. same as LF
jr z, .lineend
cp LF
jr z, .lineend
ld (de), a
inc de
jr .loop
.lineend:
; We've just finished reading a line, writing each char in the pad.
; Null terminate it.
xor a
ld (de), a
; Ok, line ready
push hl ; --> lvl 1. current file position
ld hl, SCRATCHPAD
call parseDecimal
jr nz, .notANumber
push ix \ pop de
call toSep
call rdSep
call bufAdd
pop hl ; <-- lvl 1
ret nz
ld de, SCRATCHPAD
jr .loop
.notANumber:
pop hl ; <-- lvl 1
ld de, SCRATCHPAD
jr .loop
.loopend:
cp a
ret
basFSCmds: basFSCmds:
.dw basFLS .dw basFLS
.db "fls", 0, 0, 0 .db "fls", 0, 0, 0
.dw basLDBAS
.db "ldbas", 0
.db 0xff, 0xff, 0xff ; end of table .db 0xff, 0xff, 0xff ; end of table

View File

@ -139,7 +139,7 @@ basBYE:
basLIST: basLIST:
call bufFirst call bufFirst
ret nz jr nz, .end
.loop: .loop:
ld e, (ix) ld e, (ix)
ld d, (ix+1) ld d, (ix+1)
@ -153,6 +153,7 @@ basLIST:
call printcrlf call printcrlf
call bufNext call bufNext
jr z, .loop jr z, .loop
.end:
cp a ; ensure Z cp a ; ensure Z
ret ret
@ -383,6 +384,8 @@ basCmds1:
.db "list", 0, 0 .db "list", 0, 0
.dw basRUN .dw basRUN
.db "run", 0, 0, 0 .db "run", 0, 0, 0
.dw bufInit
.db "clear", 0
; statements ; statements
basCmds2: basCmds2:
.dw basPRINT .dw basPRINT

View File

@ -84,11 +84,10 @@
.inc "basic/var.asm" .inc "basic/var.asm"
.equ BUF_RAMSTART VAR_RAMEND .equ BUF_RAMSTART VAR_RAMEND
.inc "basic/buf.asm" .inc "basic/buf.asm"
.equ BAS_RAMSTART BUF_RAMEND .equ BFS_RAMSTART BUF_RAMEND
.inc "basic/main.asm"
; Extra cmds
.inc "basic/fs.asm" .inc "basic/fs.asm"
.equ BAS_RAMSTART BFS_RAMEND
.inc "basic/main.asm"
init: init:
di di

View File

@ -0,0 +1,5 @@
10 print "Count to 10"
20 a=0
30 a=a+1
40 print a
50 if a<10 goto 30