Browse Source

zasm: add support for subtractions in expressions

pull/10/head
Virgil Dupras 5 years ago
parent
commit
1010e8372c
2 changed files with 50 additions and 14 deletions
  1. +49
    -14
      apps/zasm/expr.asm
  2. +1
    -0
      apps/zasm/tests/test5.asm

+ 49
- 14
apps/zasm/expr.asm View File

@@ -2,34 +2,69 @@
; We expect (HL) to be disposable: we mutate it to avoid having to make a copy.
; Sets Z on success, unset on error.
parseExpr:
push bc
push de
push hl
ld a, '+'
call JUMP_FINDCHAR
jr z, .hasExpr
pop hl
push hl
ld a, '-'
call JUMP_FINDCHAR
jr nz, .noExpr
; Alright, we have a + and we're pointing at it. Let's advance HL and
ld c, '-'
jr .hasExpr
.hasPlus:
ld c, '+'
jr .hasExpr
.hasExpr:
; Alright, we have a +/ and we're pointing at it. Let's advance HL and
; recurse. But first, let's change this + into a null char. It will be
; handy later.
xor a
ld (hl), a ; + changed to \0

inc hl
call parseExpr
; Whether parseExpr was successful or not, we pop hl right now
pop de ; we pop out the HL we pushed earlier into DE
; That's our original beginning of string.
call _applyExprToHL
pop de
pop bc
ret

.noExpr:
pop hl
pop de
pop bc
jp parseNumberOrSymbol

; Parse number or symbol in (DE) and expression in (HL) and apply operator
; specified in C to them.
_applyExprToHL:
call parseExpr
ret nz ; return immediately if error
; Now we have parsed everything to the right and we have its result in
; IX. the pop hl brought us back to the beginning of the string. Our
; + was changed to a 0. Let's save IX somewhere and parse this.
push de
ld d, ixh
ld e, ixl
; IX. What we need to do now is parseNumberOrSymbol on (DE) and apply
; operator. Let's save IX somewhere and parse this.
ex hl, de
push ix
pop de
call parseNumberOrSymbol
jr nz, .end ; error
; Good! let's do the math!
ret nz ; error
; Good! let's do the math! IX has our left part, DE has our right one.
ld a, c ; restore operator
cp '-'
jr z, .sub
; addition
add ix, de
jr .end
.sub:
push ix
pop hl
sbc hl, de
push hl
pop ix
.end:
pop de
cp a ; ensure Z
ret
.noExpr:
pop hl
jp parseNumberOrSymbol

+ 1
- 0
apps/zasm/tests/test5.asm View File

@@ -1,2 +1,3 @@
; test expressions
ld a, 'A'+3
ld a, 'A'-0x20

Loading…
Cancel
Save