replaced some JPs with JRs
[bz80asm.git] / parser_expr.zas
blobd630dc16cfdd7e8a82e0a48077f6bb9a216cae51
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; math expression parser
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 ;;
8 ;; parse an integer expression
9 ;; IN:
10 ;;   IY: text buffer
11 ;; OUT:
12 ;;   IY: text buffer after the expression
13 ;;   HL: expression value
14 ;;   everything other (including all alternate registers) is dead
16 PARSE_INT_EXPR:
17   call  skipBlanks
18   jp    z,error_integer_expected
19   ld    c,#FF   ; use this, as we need bit 1 to be set
20   call  BZ80ASM.SIGN
21   jr    nz,.ccnum
22   ld    c,a
23   inc   iy
24 .ccnum:
25   call  PARSE_NUMBER
26   jp    c,error_integer_expected
27   ; check for negate
28   xor   a
29   bit   1,c     ; '+' has bit 1 set, '-' hasn't
30   ret   nz
31   ; negate HL
32   ld    de,0
33   ex    de,hl
34   sbc   hl,de
35   or    a
36   ret
39 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
41 ;; parse a string expression
43 ;; IN:
44 ;;   IY: text buffer
45 ;; OUT:
46 ;;   HL: string buffer start
47 ;;    E: parsed string length
48 ;;   everything other (including all alternate registers) is dead
50 PARSE_STR_EXPR:
51   call  skipBlanks
52   jp    z,error_string_expected
53   cp    34
54   jr    z,.strok
55   cp    39
56   jp    nz,error_string_expected
57 .strok:
58   ld    c,a  ; terminator
59   inc   iy
60   ld    hl,ACCS
61   push  hl
62 .strloop:
63   ld    a,(iy)
64   or    a
65   jp    z,error_string_expected
66   inc   iy
67   cp    c
68   jr    z,.strdone
69   ld    (hl),a
70   inc   hl
71   jr    .strloop
72 .strdone:
73   pop   de
74   or    a
75   sbc   hl,de
76   ex    de,hl
77   ret
79 ;; string accumulator
80 ACCS: defs 256,0