diff --git a/apps/zasm/expr.asm b/apps/zasm/expr.asm index 82ec38b..40a8eec 100644 --- a/apps/zasm/expr.asm +++ b/apps/zasm/expr.asm @@ -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 diff --git a/apps/zasm/tests/test5.asm b/apps/zasm/tests/test5.asm index 3343e41..90e7ed5 100644 --- a/apps/zasm/tests/test5.asm +++ b/apps/zasm/tests/test5.asm @@ -1,2 +1,3 @@ ; test expressions ld a, 'A'+3 +ld a, 'A'-0x20