more comments; assembler is isolated in its own module now; moved listing part out...
[bz80asm.git] / parser.zas
blob1e89a298d36ec3394db6e6fd40c505e068eb92c3
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; skip blanks
3 ;; returns current char in A
4 ;; sets zero flag on EOL
5 ;; IN:
6 ;;   IY: text buffer
7 ;; OUT:
8 ;;   IY: text buffer at non-blank or EOL
9 ;;    A: non-blank or EOL char
10 ;;   zero flag is set on EOL
12 skipBlanks:
13   ld    a,(iy)
14   or    a
15   ret   z
16   cp    13
17   ret   z
18   inc   iy
19   cp    33
20   jr    c,skipBlanks
21   dec   iy
22   ; reset zero flag
23   or    a
24   ret
27 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
28 ;; check if A is an alpha char
29 ;; carry set: not alpha char
31 isAlpha:
32   cp    'a'
33   jr    c,.notlower
34   cp    'z'+1
35   jr    nc,.notlower
36   or    a
37   ret
38 .notlower:
39   cp    'A'
40   ret   c
41   cp    'Z'+1
42   ccf
43   ret
46 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
47 ;; check if A is a decimal digit
48 ;; carry set: not digit char
50 isDigit:
51   cp    '0'
52   ret   c
53   cp    '9'+1
54   ccf
55   ret
58 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
59 ;; check if A is a valid identifier char (including digits)
60 ;; carry set: not id char
62 isIdChar:
63   call  isAlpha
64   ret   nc
65   call  isDigit
66   ret   nc
67   cp    '_'
68   jr    z,.goodchar
69   cp    '$'
70   jr    z,.goodchar
71   scf
72   ret
73 .goodchar:
74   or    a
75   ret
78 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
80 ;; parse an integer expression
82 ;; IN:
83 ;;   IY: text buffer
84 ;; OUT:
85 ;;   IY: text buffer after the expression
86 ;;   HL: expression value
87 ;;   everything other (including all alternate registers) is dead
89 PARSE_INT_EXPR:
90   call  skipBlanks
91   jp    z,error_integer_expected
92   ld    c,0
93   cp    '-'
94   jr    nz,.notneg
95   inc   c
96   inc   iy
97   jr    .ccnum
98 .notneg:
99   cp    '+'
100   jr    nz,.ccnum
101   inc   iy
102 .ccnum:
103   ld    a,(iy)
104   cp    '0'
105   jp    c,error_integer_expected
106   cp    '9'+1
107   jp    nc,error_integer_expected
108   ld    hl,0
109 .numloop:
110   ld    a,(iy)
111   sub   '0'
112   jr    c,.numdone
113   cp    10
114   jr    nc,.numdone
115   ; hl = hl*10
116   add   hl,hl
117   ld    de,hl
118   add   hl,hl
119   add   hl,hl
120   add   hl,de
121   ld    e,a
122   ld    d,0
123   add   hl,de
124   inc   iy
125   jr    .numloop
126 .numdone:
127   ld    a,c
128   or    a
129   jr    z,.noneg
130   ; net hl
131   ld    de,0
132   ex    de,hl
133   sbc   hl,de
134 .noneg:
135   call  skipBlanks
136   ret
139 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
141 ;; parse a string expression
143 ;; IN:
144 ;;   IY: text buffer
145 ;; OUT:
146 ;;   HL: string buffer start
147 ;;    E: parsed string length
148 ;;   everything other (including all alternate registers) is dead
150 PARSE_STR_EXPR:
151   call  skipBlanks
152   jp    z,error_string_expected
153   cp    34
154   jr    z,.strok
155   cp    39
156   jp    nz,error_string_expected
157 .strok:
158   ld    c,a  ; terminator
159   inc   iy
160   ld    hl,ACCS
161   push  hl
162 .strloop:
163   ld    a,(iy)
164   or    a
165   jp    z,error_string_expected
166   inc   iy
167   cp    c
168   jr    z,.strdone
169   ld    (hl),a
170   inc   hl
171   jr    .strloop
172 .strdone:
173   pop   de
174   or    a
175   sbc   hl,de
176   ex    de,hl
177   ret
179 ;; string accumulator
180 ACCS: defs 256,0