basic: allow printing of quoted strings

This commit is contained in:
Virgil Dupras 2019-11-21 19:56:51 -05:00
parent 704d32279a
commit 982d20f895
4 changed files with 44 additions and 5 deletions

View File

@ -41,11 +41,16 @@ is kept in order of lines. Line number don't need to be sequential. You can
keep leeway in between your lines and then insert a line with a middle number keep leeway in between your lines and then insert a line with a middle number
later. later.
Some commands take arguments. Those are given by typing a whitespace after the
command name and then the argument. Additional arguments are given the same way,
by typing a whitespace.
### Numbers, expressions and variables ### Numbers, expressions and variables
Only 16-bit integers (unsigned for now) are supported in this BASIC. When Only 16-bit integers (unsigned for now) are supported in this BASIC. When
printed, they're printed in decimal form. When expressing number literals, you printed, they're printed in decimal form. When expressing number literals, you
can do so either in decimal (`42`), hexadecimal (`0x2a`) or binary (`0b101010`). can do so either in decimal (`42`), hexadecimal (`0x2a`), binary (`0b101010`)
or char ('a', resulting in number 97).
Expressions are accepted wherever a number is expected. For example, Expressions are accepted wherever a number is expected. For example,
`print 2+3` will print `5`. Expressions can't have whitespace inside them and `print 2+3` will print `5`. Expressions can't have whitespace inside them and
@ -75,9 +80,12 @@ with their associated line number.
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 **print**. Prints the result of the specified expression, then CR/LF. Can be
given multiple arguments, separated with `,`. In that case, all arguments are given multiple arguments. In that case, all arguments are printed separately
printed separately with a space in between. For example, `print 12 13` prints with a space in between. For example, `print 12 13` prints `12 13<cr><lf>`
`12 13<cr><lf>`
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
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

View File

@ -20,6 +20,7 @@
.inc "lib/fmt.asm" .inc "lib/fmt.asm"
.equ EXPR_PARSE parseLiteralOrVar .equ EXPR_PARSE parseLiteralOrVar
.inc "lib/expr.asm" .inc "lib/expr.asm"
.inc "basic/util.asm"
.inc "basic/parse.asm" .inc "basic/parse.asm"
.inc "basic/tok.asm" .inc "basic/tok.asm"
.equ VAR_RAMSTART SCRATCHPAD+SCRATCHPAD_SIZE .equ VAR_RAMSTART SCRATCHPAD+SCRATCHPAD_SIZE

View File

@ -176,21 +176,31 @@ basRUN:
ret ret
basPRINT: basPRINT:
; Do we have arguments at all? if not, it's not an error, just print
; crlf
ld a, (hl)
or a
jr z, .end
; Is our arg a string literal?
call spitQuoted
jr z, .chkAnother ; string printed, skip to chkAnother
ld de, SCRATCHPAD ld de, SCRATCHPAD
call rdWord call rdWord
push hl ; --> lvl 1 push hl ; --> lvl 1
ex de, hl ex de, hl
call parseExpr call parseExpr
ret nz jr nz, .parseError
push ix \ pop de push ix \ pop de
ld hl, SCRATCHPAD ld hl, SCRATCHPAD
call fmtDecimal call fmtDecimal
call printstr call printstr
pop hl ; <-- lvl 1 pop hl ; <-- lvl 1
.chkAnother:
; Do we have another arg? ; Do we have another arg?
call rdSep call rdSep
jr z, .another jr z, .another
; no, we can stop here ; no, we can stop here
.end:
cp a ; ensure Z cp a ; ensure Z
jp printcrlf jp printcrlf
.another: .another:
@ -198,6 +208,11 @@ basPRINT:
ld a, ' ' ld a, ' '
call stdioPutC call stdioPutC
jr basPRINT jr basPRINT
.parseError:
; unwind the stack before returning
pop hl ; <-- lvl 1
ret
basGOTO: basGOTO:
ld de, SCRATCHPAD ld de, SCRATCHPAD

15
apps/basic/util.asm Normal file
View File

@ -0,0 +1,15 @@
; Is (HL) a double-quoted string? If yes, spit what's inside and place (HL)
; at char after the closing quote.
; Set Z if there was a string, unset otherwise.
spitQuoted:
ld a, (hl)
cp '"'
ret nz
inc hl
.loop:
ld a, (hl)
inc hl
cp '"'
ret z
call stdioPutC
jr .loop