math expression evaluator with priorities seems to work
[bz80asm.git] / main.zas
blob6059dca9ae0b235efa783c5e839fd02e860b4b4c
1   $refopt alllabels
3   org   #8000
4   ent   main
6 totalasm_start = $
7   include "bzasm80.zas"
9 csizestart = $
10   include "parser_number.zas"
11 csizeend = $
12 $printf "parser_number size: %d", csizeend-csizestart
14 csizestart = $
15   include "parser_expr.zas"
16 csizeend = $
17 $printf "parser_expr size: %d", csizeend-csizestart
19 totalasm_end = $
20 $printf "total assembler size: %d", totalasm_end-totalasm_start
22 ; so they won't clutter symbol table
23 totalasm_end = -1
24 totalasm_start = -1
26 csizestart = $
27   include "labman.zas"
28 csizeend = $
29 $printf "label manager size: %d", csizeend-csizestart
31 csizestart = $
32   include "output.zas"
33 csizeend = $
34 $printf "ouput system size: %d", csizeend-csizestart
36 csizestart = $
37   ;include "output_driver_std.zas"
38   include "output_driver_4x8.zas"
39 csizeend = $
40 $printf "printing driver size: %d", csizeend-csizestart
42 ; so they won't clutter symbol table
43 csizeend = -1
44 csizestart = -1
47 main:
48   call  emitInit
50   ; setup callbacks
51   ld    hl,expr_error_cb
52   ld    (EXPR_ERROR_CB),hl
54   ld    hl,expr_error_jrfar_cb
55   ld    (BZ80ASM.ASM_JR_TOO_FAR_CB),hl
57   di
58   ld    ix,(BZ80ASM.PC)
59   ld    iy,strbuf
61 asmmore:
62   ; print line to assemble
63   $IF 0
64   push  iy
65 .dumploop:
66   ld    a,(iy)
67   or    a
68   jr    z,.dumpdone
69   cp    13
70   jr    z,.dumpdone
71   call  EMIT
72   inc   iy
73   jr    .dumploop
74 .dumpdone:
75   pop   iy
76   ld    a,13
77   call  EMIT
78   $ENDIF
80 doasm:
81   push  ix      ; save code destination
82   push  iy      ; we'll need it for listing
83 doasm_nopush:
84   ;call  EXPR_STACK_RESET
85   call  BZ80ASM.ASSEM
86   jp    c,list_and_error
87 doasm_done_line:
88   pop   bc
89   pop   de
90   call  ASM_LISTING
92 .skipnl:
93   ld    a,(iy)
94   inc   iy
95   cp    13
96   jr    z,.skipnl
97   cp    ':'
98   jr    z,.skipnl
99   cp    32
100   jr    z,.skipnl
101   dec   iy
102   or    a
103   jr    nz,asmmore
105   ld    a,6
106   out   (#fe),a
107   jr    $
109 trylabel:
110   ld    hl,(BZ80ASM.PC)
111   call  DEFLABEL
112   call  BZ80ASM.SKIP
113   ; if terminator, don't try to assemble more
114   jr    z,.linedone
115   jr    doasm_nopush
116 .linedone:
117   jr    doasm_done_line
118 .lineerr:
119   jr    list_and_error_no_label_check
122 list_and_error:
123   ; bad mnemonics?
124   ld    a,(BZ80ASM.ASM_BAD_B)
125   cp    255
126   jr    z,trylabel
128 list_and_error_no_label_check:
129   ld    hl,errline
130   call  printstrnl
131   push  iy
132   pop   hl    ; current position in text buffer
133   pop   de    ; initial position
134   ; calc length
135   or    a
136   sbc   hl,de
137   jr    z,.nothing
138   ; de: print from here
139   ; hl: length
140 .prloop:
141   ld    a,(de)
142   call  EMIT
143   inc   de
144   dec   hl
145   ld    a,h
146   or    l
147   jr    nz,.prloop
148   dec   de
149   ld    a,(de)
150   or    a
151   jr    z,.doneerrlist
152   cp    13
153   jr    z,.doneerrlist
154   inc   de
155   ld    a,'|'
156   call  EMIT
157 .nothing:
158   ld    a,(de)
159   call  EMIT
160   ld    a,(de)
161   inc   de
162   cp    13
163   jr    nz,.nothing
165 .doneerrlist:
166   ld    hl,errline
167   call  printstrnl
168   ;jp    error_syntax
169   di
170   ld    a,2
171   out   (#fe),a
172   jr    $
173 errline: defx "---------"
176 strbuf:
177   defm  "label cp  69",13
178   ;defm  "jr   label",13
179   defm  "ld   a,40+2",13
180   defm  "ld   bc,2+3*5",13
181   defm  "ld   bc,0+(2+3)*5",13
182   defm  "ld   bc,[2+3]*5",13
183   defm  "ld   bc,(2+3)*5",13
184   defm  "ld   hl,16384",13
185   defm  "exx",13
186   defm  "ld   hl,#4001",13
187   defm  "ld   a,(ix-2)",13
188   defm  "ld   c,(ix)",13
189   defm  "call 0BEEFh",13
190   defm  "or   c",13
191   defm  "and  (hl)",13
192   defm  "jr   $",13
193   defm  "ld   de,$1234",13
194   defm  "ld   bc,0x5b02",13
195   defm  "ld   a,0b1001",13
196   defm  "ld   a,%1010",13
197   defm  "ld   ix,-1234",13
198   defm  "ld   iy,-0x602a",13
199   defb  0
201 dest: defs 64,0
204 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
206 ;; show listing
207 ;; extracted from assembler code, because we don't need it there
209 ;; IN:
210 ;;   IY: current position in text buffer
211 ;;   IX: current position in code buffer
212 ;;   BC: starting position in text buffer
213 ;;   DE: starting position in code buffer
214 ;; OUT:
215 ;;   IX, IY: unchanged
216 ;;   others are dead
218 ;COUNT:  defb  0  ;PRINT POSITION
219 ASM_LISTING:
220   ; calculate code length
221   push  ix
223   push  ix
224   pop   hl
225   or    a
226   sbc   hl,de
227   ld    (.codelen),hl
228   ld    (.codestart),de
230   ; calculate original PC
231   ex    de,hl
232   ld    hl,(BZ80ASM.PC)
233   or    a
234   sbc   hl,de
235   ; print original PC
236   push  hl
237   ld    a,h
238   call  HEX
239   pop   hl
240   ld    a,l
241   call  HEXSP
243   ; print code bytes (if there are any)
244   ld    de,(.codelen)
245   ld    a,d
246   or    a
247   jr    nz,.nocode
248   ; do not print code if more than 4 bytes (long strings and dbs)
249   or    e
250   jr    z,.nocode
251   ; do not print code if more than 4 bytes (long strings and dbs)
252   cp    5
253   jr    nc,.nocode
255   ; print hex bytes
256   ld    hl,(.codestart)
257 .cdumploop:
258   ld    a,(hl)
259   call  HEXSP
260   inc   hl
261   dec   e
262   jr    nz,.cdumploop
263   ; align printed code
264   ld    a,(.codelen)
265 .alignloop:
266   cp    a,4
267   jr    nc,.aligndone
268   ld    e,a
269   ld    a,32
270   call  EMIT
271   ld    a,32
272   call  EMIT
273   ld    a,32
274   call  EMIT
275   ld    a,e
276   inc   a
277   jr    .alignloop
278 .aligndone:
280 .nocode:
281   ; print source line, from BC to IY (exclusive)
282   ; calculate string length
283   push  iy
284   pop   hl
285   or    a
286   sbc   hl,bc
287   jr    z,.notextline
288 .textloop:
289   ld    a,(bc)
290   call  EMIT
291   inc   bc
292   dec   hl
293   ld    a,h
294   or    l
295   jr    nz,.textloop
296 .notextline:
297   ; print final CR
298   ld    a,13
299   call  EMIT
301   pop   ix
302   ret
304 .codelen: defw 0
305 .codestart: defw 0
308 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
310 ;; print byte in hex with the trailing space
312 HEXSP:
313   call  HEX
314   ld    a,' '
315   jr    OUTCH1
318 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
320 ;; print byte in hex
322 HEX:
323   push  af
324   rrca
325   rrca
326   rrca
327   rrca
328   call  HEXOUT
329   pop   af
330 HEXOUT:
331   and   0FH
332   add   a,90H
333   daa
334   adc   a,40H
335   daa
336 OUTCH1:
337   jp    EMIT