zasm: add support for string literals in .db

This commit is contained in:
Virgil Dupras 2019-05-17 16:17:22 -04:00
parent b499d320de
commit f9dac15449
3 changed files with 46 additions and 16 deletions

View File

@ -30,13 +30,24 @@ handleDB:
.loop: .loop:
call readWord call readWord
ld hl, scratchpad ld hl, scratchpad
call enterDoubleQuotes
jr z, .stringLiteral
call parseLiteral call parseLiteral
ld a, ixl ld a, ixl
call ioPutC call ioPutC
.stopStrLit:
call readComma call readComma
jr z, .loop jr z, .loop
pop hl pop hl
ret ret
.stringLiteral:
ld a, (hl)
inc hl
or a ; when we encounter 0, that was what used to
jr z, .stopStrLit ; be our closing quote. Stop.
; Normal character, output
call ioPutC
jr .stringLiteral
handleDW: handleDW:
push hl push hl
@ -96,23 +107,8 @@ handleINC:
call readWord call readWord
jr nz, .end jr nz, .end
; HL points to scratchpad ; HL points to scratchpad
; First, let's verify that our string is enquoted call enterDoubleQuotes
ld a, (hl)
cp '"'
jr nz, .end jr nz, .end
; We have opening quote
inc hl
xor a
call findchar ; go to end of string
dec hl
ld a, (hl)
cp '"'
jr nz, .end
; we have ending quote, let's replace with null char
xor a
ld (hl), a
; Good, let's go back
ld hl, scratchpad+1 ; +1 because of the opening quote
call ioOpenInclude call ioOpenInclude
.end: .end:
xor a ; zero bytes written xor a ; zero bytes written

View File

@ -149,6 +149,39 @@ enterParens:
call unsetZ call unsetZ
ret ret
; Scans (HL) and sets Z according to whether the string is double quoted, that
; is, starts with a " and ends with a ". If it is double quoted, "enter" them,
; that is, advance HL by one and transform the ending quote into a null char.
; If the string isn't double-enquoted, HL isn't changed.
enterDoubleQuotes:
ld a, (hl)
cp '"'
ret nz
push hl
inc hl
ld a, (hl)
or a ; already end of string?
jr z, .nomatch
xor a
call findchar ; go to end of string
dec hl
ld a, (hl)
cp '"'
jr nz, .nomatch
; We have a match, replace ending quote with null char
xor a
ld (hl), a
; Good, let's go back
pop hl
; ... but one char further
inc hl
cp a ; ensure Z
ret
.nomatch:
call unsetZ
pop hl
ret
; Find string (HL) in string list (DE) of size B, in a case-insensitive manner. ; Find string (HL) in string list (DE) of size B, in a case-insensitive manner.
; Each string is C bytes wide. ; Each string is C bytes wide.
; Returns the index of the found string. Sets Z if found, unsets Z if not found. ; Returns the index of the found string. Sets Z if found, unsets Z if not found.

View File

@ -6,3 +6,4 @@ ld hl, 0x4234
ld hl, (0x4234) ld hl, (0x4234)
ld a, 'X' ld a, 'X'
ld a, 'a' ; don't upcase! ld a, 'a' ; don't upcase!
.db "bonjour"