some cleanups
[bz80asm.git] / parser.zas
blob8c9589e32bcb14355374eba7c37562e49daad271
1 ; returns current char in A
2 ; sets zero flag on EOL
3 skipBlanks:
4   ld    a,(iy)
5   or    a
6   ret   z
7   cp    13
8   ret   z
9   cp    10
10   ret   z
11   inc   iy
12   cp    33
13   jr    c,skipBlanks
14   dec   iy
15   ret
17 ; carry set: not alpha char
18 isAlpha:
19   cp    'a'
20   jr    c,.notlower
21   cp    'z'+1
22   jr    nc,.notlower
23   or    a
24   ret
25 .notlower:
26   cp    'A'
27   ret   c
28   cp    'Z'+1
29   ccf
30   ret
32 ; carry set: not digit char
33 isDigit:
34   cp    '0'
35   ret   c
36   cp    '9'+1
37   ccf
38   ret
40 ; carry set: not id char
41 isIdChar:
42   call  isAlpha
43   ret   nc
44   call  isDigit
45   ret   nc
46   cp    '_'
47   jr    z,.goodchar
48   cp    '$'
49   jr    z,.goodchar
50   scf
51   ret
52 .goodchar:
53   or    a
54   ret
56 ;EXPR - VARIABLE-TYPE EXPRESSION EVALUATION
57 ;     Expression type is returned in A'F':
58 ;        Numeric - A' bit 7=0, F' sign bit cleared.
59 ;         String - A' bit 7=1, F' sign bit set.
60 ;Floating-point or integer result returned in HLH'L'C
61 ; Integer result denoted by C=0 and HLH'L' non-zero.
62 ;String result returned in string accumulator, DE set.
63 ;  DE addresses byte after last (E=length).
65 ;Hierarchy is: (1) Variables, functions,
66 ;                  constants, bracketed expressions.
67 ;              (2) ^
68 ;              (3) * / MOD DIV
69 ;              (4) + -
70 ;              (5) = <> <= >= > <
71 ;              (6) AND
72 ;              (7) EOR OR
75 ;ITEM - VARIABLE TYPE NUMERIC OR STRING ITEM.
76 ;Item type is returned in A:  Bit 7=0 numeric.
77 ;                             Bit 7=1 string.
78 ;Numeric item returned in HLH'L'C.
79 ;String item returned in string accumulator,
80 ;  DE addresses byte after last (E=length).
82 ;ITEM:   CALL    CHECK
85 ; parse integer expression
86 ;   Output: Integer in HLH'L', C=0
87 ; Destroys: A,C,H,L,A',B',C',H',L',F,F'
88 EXPRI:
89   call  skipBlanks
90   jp    z,error_integer_expected
91   ld    c,0
92   cp    '-'
93   jr    nz,.notneg
94   inc   c
95   inc   iy
96   jr    .ccnum
97 .notneg:
98   cp    '+'
99   jr    nz,.ccnum
100   inc   iy
101 .ccnum:
102   ld    a,(iy)
103   cp    '0'
104   jp    c,error_integer_expected
105   cp    '9'+1
106   jp    nc,error_integer_expected
107   ld    hl,0
108 .numloop:
109   ld    a,(iy)
110   sub   '0'
111   jr    c,.numdone
112   cp    10
113   jr    nc,.numdone
114   ; hl = hl*10
115   add   hl,hl
116   ld    de,hl
117   add   hl,hl
118   add   hl,hl
119   add   hl,de
120   ld    e,a
121   ld    d,0
122   add   hl,de
123   inc   iy
124   jr    .numloop
125 .numdone:
126   ld    a,c
127   or    a
128   jr    z,.noneg
129   ; net hl
130   ld    de,0
131   ex    de,hl
132   sbc   hl,de
133 .noneg:
134   call  skipBlanks
135   exx
136   ld    c,0
137   ret
140 ; parse string expression
141 ;String result returned in string accumulator, DE set.
142 ;  DE addresses byte after last (E=length).
143 EXPRS:
144   call  skipBlanks
145   jp    z,error_string_expected
146   cp    34
147   jr    z,.strok
148   cp    39
149   jp    nz,error_string_expected
150 .strok:
151   ld    c,a  ; terminator
152   inc   iy
153   ld    de,ACCS
154 .strloop:
155   ld    a,(iy)
156   or    a
157   jp    z,error_string_expected
158   inc   iy
159   cp    c
160   jr    z,.strdone
161   ld    (de),a
162   inc   de
163   jr    .strloop
164 .strdone:
165   ret