parseExprDE --> parseExpr

This commit is contained in:
Virgil Dupras 2019-12-23 19:13:44 -05:00
parent 5301200d6f
commit 6d88c3a754
9 changed files with 35 additions and 47 deletions

View File

@ -222,7 +222,7 @@ basPRINT:
call rdWord call rdWord
push hl ; --> lvl 1 push hl ; --> lvl 1
ex de, hl ex de, hl
call parseExprDE call parseExpr
jr nz, .parseError jr nz, .parseError
ld hl, SCRATCHPAD ld hl, SCRATCHPAD
call fmtDecimalS call fmtDecimalS
@ -251,7 +251,7 @@ basGOTO:
ld de, SCRATCHPAD ld de, SCRATCHPAD
call rdWord call rdWord
ex de, hl ex de, hl
call parseExprDE call parseExpr
ret nz ret nz
call bufFind call bufFind
jr nz, .notFound jr nz, .notFound
@ -314,7 +314,7 @@ basINPUT:
call spitQuoted call spitQuoted
call rdSep call rdSep
call stdioReadLine call stdioReadLine
call parseExprDE call parseExpr
ld (VAR_TBL), de ld (VAR_TBL), de
call printcrlf call printcrlf
cp a ; ensure Z cp a ; ensure Z

View File

@ -40,7 +40,7 @@ parseTruth:
ret ret
.simple: .simple:
call parseExprDE call parseExpr
jr nz, .end jr nz, .end
ld a, d ld a, d
or e or e
@ -132,11 +132,11 @@ parseTruth:
.parseLeftRight: .parseLeftRight:
; let's start with HL ; let's start with HL
push de ; --> lvl 1 push de ; --> lvl 1
call parseExprDE call parseExpr
pop hl ; <-- lvl 1, orig DE pop hl ; <-- lvl 1, orig DE
ret nz ret nz
push de ; --> lvl 1. save HL value in stack. push de ; --> lvl 1. save HL value in stack.
; Now, for DE. (DE) is now in HL ; Now, for DE. (DE) is now in HL
call parseExprDE ; DE in place call parseExpr ; DE in place
pop hl ; <-- lvl 1. restore saved HL pop hl ; <-- lvl 1. restore saved HL
ret ret

View File

@ -91,7 +91,7 @@ rdExpr:
call rdWord call rdWord
push hl push hl
ex de, hl ex de, hl
call parseExprDE call parseExpr
push de \ pop ix push de \ pop ix
pop hl pop hl
ret ret

View File

@ -52,7 +52,7 @@ varTryAssign:
call rdWord call rdWord
ex de, hl ex de, hl
; Now, evaluate that expression now in (HL) ; Now, evaluate that expression now in (HL)
call parseExprDE ; --> number in DE call parseExpr ; --> number in DE
jr nz, .exprErr jr nz, .exprErr
pop af ; <-- lvl 4 pop af ; <-- lvl 4
call varAssign call varAssign

View File

@ -11,25 +11,12 @@
; ;
; *** Code *** ; *** Code ***
; ;
; Parse expression in string at (HL) and returns the result in IX.
; Parse expression in string at (HL) and returns the result in DE.
; **This routine mutates (HL).** ; **This routine mutates (HL).**
; We expect (HL) to be disposable: we mutate it to avoid having to make a copy. ; We expect (HL) to be disposable: we mutate it to avoid having to make a copy.
; Sets Z on success, unset on error. ; Sets Z on success, unset on error.
; TODO: the IX output register is a bit awkward. Nearly everywhere, I need
; to push \ pop that thing. See if we could return the result in DE
; instead.
parseExpr: parseExpr:
push de
push hl
call _parseExpr
pop hl
pop de
ret
; Same as parseExpr, but preserves IX and puts result in DE. This is a
; transitionary routine and will replace parseExpr when everyone has jumped
; ship.
parseExprDE:
push ix push ix
push hl push hl
call _parseExpr call _parseExpr
@ -116,17 +103,18 @@ _resolveLeftAndRight:
or a or a
jr z, .skip jr z, .skip
; Parse left operand in (HL) ; Parse left operand in (HL)
push de ; --> lvl 1
call parseExpr call parseExpr
pop hl ; <-- lvl 1, orig DE
ret nz ; return immediately if error ret nz ; return immediately if error
.skip: .skip:
; Now we have parsed everything to the left and we have its result in ; Now we have parsed everything to the left and we have its result in
; IX. What we need to do now is the same thing on (DE) and then apply ; DE. What we need to do now is the same thing on (DE) and then apply
; the + operator. Let's save IX somewhere and parse this. ; the + operator. Let's save DE somewhere and parse this.
ex de, hl ; right expr now in HL push de ; --> lvl 1
push ix ; --> lvl 1 ; right expr in (HL)
call parseExpr call parseExpr ; DE is set
pop hl ; <-- lvl 1. left pop hl ; <-- lvl 1. left value
push ix \ pop de ; right
ret ; Z is parseExpr's result ret ; Z is parseExpr's result
; Routines in here all have the same signature: they take two numbers, DE (left) ; Routines in here all have the same signature: they take two numbers, DE (left)

View File

@ -644,7 +644,7 @@ _readK8:
_readDouble: _readDouble:
push de push de
call parseExprDE call parseExpr
jr nz, .end jr nz, .end
ld b, d ld b, d
ld c, e ld c, e
@ -658,7 +658,7 @@ _readk7:
push hl push hl
push de push de
push ix push ix
call parseExprDE call parseExpr
jr nz, .end jr nz, .end
; If we're in first pass, stop now. The value of HL doesn't matter and ; If we're in first pass, stop now. The value of HL doesn't matter and
; truncation checks might falsely fail. ; truncation checks might falsely fail.
@ -742,7 +742,7 @@ _readExpr:
push de push de
push bc push bc
ld b, a ld b, a
call parseExprDE call parseExpr
jr nz, .end jr nz, .end
ld a, b ld a, b
call _DE2A call _DE2A

View File

@ -48,7 +48,7 @@ handleDB:
ld hl, scratchpad ld hl, scratchpad
call enterDoubleQuotes call enterDoubleQuotes
jr z, .stringLiteral jr z, .stringLiteral
call parseExprDE call parseExpr
jr nz, .badarg jr nz, .badarg
ld a, d ld a, d
or a ; cp 0 or a ; cp 0
@ -96,7 +96,7 @@ handleDW:
call readWord call readWord
jr nz, .badfmt jr nz, .badfmt
ld hl, scratchpad ld hl, scratchpad
call parseExprDE call parseExpr
jr nz, .badarg jr nz, .badarg
ld a, e ld a, e
call ioPutB call ioPutB
@ -148,7 +148,7 @@ handleEQU:
call readWord call readWord
jr nz, .badfmt jr nz, .badfmt
ld hl, scratchpad ld hl, scratchpad
call parseExprDE call parseExpr
jr nz, .badarg jr nz, .badarg
ld hl, DIREC_SCRATCHPAD ld hl, DIREC_SCRATCHPAD
; Save value in "@" special variable ; Save value in "@" special variable
@ -183,7 +183,7 @@ handleORG:
push de push de
call readWord call readWord
jr nz, .badfmt jr nz, .badfmt
call parseExprDE call parseExpr
jr nz, .badarg jr nz, .badarg
ex de, hl ex de, hl
ld (DIREC_LASTVAL), hl ld (DIREC_LASTVAL), hl
@ -204,7 +204,7 @@ handleORG:
handleFIL: handleFIL:
call readWord call readWord
jr nz, .badfmt jr nz, .badfmt
call parseExprDE call parseExpr
jr nz, .badarg jr nz, .badarg
ld a, d ld a, d
cp 0xd0 cp 0xd0
@ -243,7 +243,7 @@ handleOUT:
call zasmIsFirstPass ; No .out during first pass call zasmIsFirstPass ; No .out during first pass
jr z, .end jr z, .end
ld hl, scratchpad ld hl, scratchpad
call parseExprDE call parseExpr
jr nz, .badarg jr nz, .badarg
ld a, d ld a, d
out (ZASM_DEBUG_PORT), a out (ZASM_DEBUG_PORT), a

View File

@ -246,7 +246,7 @@ parseArg:
ld de, 0 ; in first pass, return a clean zero ld de, 0 ; in first pass, return a clean zero
call zasmIsFirstPass call zasmIsFirstPass
ret z ret z
jp parseExprDE jp parseExpr
; Returns, with Z, whether A is a groupId ; Returns, with Z, whether A is a groupId
isGroupId: isGroupId:

View File

@ -52,14 +52,14 @@ test:
; Old-style tests, not touching them now. ; Old-style tests, not touching them now.
ld hl, s1 ld hl, s1
call parseExprDE call parseExpr
call assertZ call assertZ
ld hl, 4 ld hl, 4
call assertEQW call assertEQW
call nexttest call nexttest
ld hl, s2 ld hl, s2
call parseExprDE call parseExpr
call assertZ call assertZ
ld hl, 0x4023 ld hl, 0x4023
call assertEQW call assertEQW
@ -77,28 +77,28 @@ test:
jp nz, fail jp nz, fail
ld hl, s3 ld hl, s3
call parseExprDE call parseExpr
call assertZ call assertZ
ld hl, 0x4020 ld hl, 0x4020
call assertEQW call assertEQW
call nexttest call nexttest
ld hl, s4 ld hl, s4
call parseExprDE call parseExpr
call assertZ call assertZ
ld hl, 0x60 ld hl, 0x60
call assertEQW call assertEQW
call nexttest call nexttest
ld hl, s5 ld hl, s5
call parseExprDE call parseExpr
call assertZ call assertZ
ld hl, 0x3ffd ld hl, 0x3ffd
call assertEQW call assertEQW
call nexttest call nexttest
ld hl, s6 ld hl, s6
call parseExprDE call parseExpr
call assertZ call assertZ
ld hl, 0x4080 ld hl, 0x4080
call assertEQW call assertEQW
@ -132,7 +132,7 @@ testParseExpr:
.testEQ: .testEQ:
push iy \ pop hl push iy \ pop hl
inc hl \ inc hl inc hl \ inc hl
call parseExprDE call parseExpr
call assertZ call assertZ
ld l, (iy) ld l, (iy)
ld h, (iy+1) ld h, (iy+1)