1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-30 20:18:06 +11:00

lib/expr: fix unary minus

For some reason, I've mistakenly disabled tests in test_expr without noticing
and I also broke "-123" parsing. Fixed.
This commit is contained in:
Virgil Dupras 2019-12-23 20:53:31 -05:00
parent 6d88c3a754
commit 7410891ad1
2 changed files with 9 additions and 6 deletions

View File

@ -96,18 +96,15 @@ _findAndSplit:
; parse expression on the left (HL) and the right (DE) and put the results in ; parse expression on the left (HL) and the right (DE) and put the results in
; HL (left) and DE (right) ; HL (left) and DE (right)
_resolveLeftAndRight: _resolveLeftAndRight:
; special case: is (HL) zero? If yes, it means that our left operand
; is empty. consider it as 0
ld ix, 0 ; pre-set to 0
ld a, (hl) ld a, (hl)
or a or a
jr z, .skip jr z, .noleft
; Parse left operand in (HL) ; Parse left operand in (HL)
push de ; --> lvl 1 push de ; --> lvl 1
call parseExpr call parseExpr
pop hl ; <-- lvl 1, orig DE pop hl ; <-- lvl 1, orig DE
ret nz ; return immediately if error ret nz ; return immediately if error
.skip: .parseright:
; 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
; DE. 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 DE somewhere and parse this. ; the + operator. Let's save DE somewhere and parse this.
@ -116,6 +113,12 @@ _resolveLeftAndRight:
call parseExpr ; DE is set call parseExpr ; DE is set
pop hl ; <-- lvl 1. left value pop hl ; <-- lvl 1. left value
ret ; Z is parseExpr's result ret ; Z is parseExpr's result
.noleft:
; special case: is (HL) zero? If yes, it means that our left operand
; is empty. consider it as 0
ex de, hl ; (DE) goes in (HL) for .parseright
ld de, 0
jr .parseright
; 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)
; and IX (right), apply the operator and put the resulting number in DE. ; and IX (right), apply the operator and put the resulting number in DE.

View File

@ -48,7 +48,7 @@ test:
ld sp, 0xffff ld sp, 0xffff
; New-style tests ; New-style tests
;call testParseExpr call testParseExpr
; Old-style tests, not touching them now. ; Old-style tests, not touching them now.
ld hl, s1 ld hl, s1