|
- ; Whether A is a separator or end-of-string (null or ':')
- isSepOrEnd:
- or a
- ret z
- cp ':'
- ret z
- ; continue to isSep
-
- ; Sets Z is A is ' ' or '\t' (whitespace)
- isSep:
- cp ' '
- ret z
- cp 0x09
- ret
-
- ; Expect at least one whitespace (0x20, 0x09) at (HL), and then advance HL
- ; until a non-whitespace character is met.
- ; HL is advanced to the first non-whitespace char.
- ; Sets Z on success, unset on failure.
- ; Failure is either not having a first whitespace or reaching the end of the
- ; string.
- ; Sets Z if we found a non-whitespace char, unset if we found the end of string.
- rdSep:
- ld a, (hl)
- call isSep
- ret nz ; failure
- .loop:
- inc hl
- ld a, (hl)
- call isSep
- jr z, .loop
- call isSepOrEnd
- jp z, .fail ; unexpected EOL. fail
- cp a ; ensure Z
- ret
- .fail:
- ; A is zero at this point
- inc a ; unset Z
- ret
-
- ; Advance HL to the next separator or to the end of string.
- toSepOrEnd:
- ld a, (hl)
- call isSepOrEnd
- ret z
- inc hl
- jr toSepOrEnd
-
- ; Advance HL to the end of the line, that is, either a null terminating char
- ; or the ':'.
- ; Sets Z if we met a null char, unset if we met a ':'
- toEnd:
- ld a, (hl)
- or a
- ret z
- cp ':'
- jr z, .havesep
- inc hl
- call skipQuoted
- jr toEnd
- .havesep:
- inc a ; unset Z
- ret
-
- ; Read (HL) until the next separator and copy it in (DE)
- ; DE is preserved, but HL is advanced to the end of the read word.
- rdWord:
- push af
- push de
- .loop:
- ld a, (hl)
- call isSepOrEnd
- jr z, .stop
- ld (de), a
- inc hl
- inc de
- jr .loop
- .stop:
- xor a
- ld (de), a
- pop de
- pop af
- ret
-
- ; Read word from HL in SCRATCHPAD and then intepret that word as an expression.
- ; Put the result in IX.
- ; Z for success.
- ; TODO: put result in DE
- rdExpr:
- ld de, SCRATCHPAD
- call rdWord
- push hl
- ex de, hl
- call parseExpr
- push de \ pop ix
- pop hl
- ret
|