mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-23 19:38:05 +11:00
zasm: add support for string literals in .db
This commit is contained in:
parent
b499d320de
commit
f9dac15449
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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"
|
||||||
|
Loading…
Reference in New Issue
Block a user