reordered samples a little
[bz80asm.git] / main.zas
blob8f83276ebfbc9d5c669163e3735b6d00348867f0
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  "or   c",13
178   defm  "and  (hl)",13
179   defm  "exx",13
180   defm  "label cp  69",13
181   defm  "call 0BEEFh",13
182   defm  "jr   $",13
183   ;defm  "jr   label",13
184   defm  "ld   a,40+2",13
185   defm  "ld   b,44-2",13
186   defm  "ld   c,126/3",13
187   defm  "ld   e,427%10",13
188   defm  "ld   bc,2+3*5",13
189   defm  "ld   bc,0+(2+3)*5",13
190   defm  "ld   bc,[2+3]*5",13
191   defm  "ld   bc,(2+3)*5",13
192   defm  "ld   hl,16384",13
193   defm  "ld   hl,#4001",13
194   defm  "ld   a,(ix-2)",13
195   defm  "ld   c,(ix)",13
196   defm  "ld   de,$1234",13
197   defm  "ld   bc,0x5b02",13
198   defm  "ld   a,0b1001",13
199   defm  "ld   a,%1010",13
200   defm  "ld   ix,-1234",13
201   defm  "ld   iy,-0x602a",13
202   defm  "cp   1<<3",13
203   defm  "cp   8>>2",13
204   defm  "cp   ~0-1",13
205   defm  "defb 7&$c,1|2,1|(3^1),1<<15",13
206   defm  "defw 1<<15",13
207   defm  "defm '012','34'",13
208   defb  0
210 dest: defs 64,0
213 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
215 ;; show listing
216 ;; extracted from assembler code, because we don't need it there
218 ;; IN:
219 ;;   IY: current position in text buffer
220 ;;   IX: current position in code buffer
221 ;;   BC: starting position in text buffer
222 ;;   DE: starting position in code buffer
223 ;; OUT:
224 ;;   IX, IY: unchanged
225 ;;   others are dead
227 ;COUNT:  defb  0  ;PRINT POSITION
228 ASM_LISTING:
229   ; calculate code length
230   push  ix
232   push  ix
233   pop   hl
234   or    a
235   sbc   hl,de
236   ld    (.codelen),hl
237   ld    (.codestart),de
239   ; calculate original PC
240   ex    de,hl
241   ld    hl,(BZ80ASM.PC)
242   or    a
243   sbc   hl,de
244   ; print original PC
245   push  hl
246   ld    a,h
247   call  HEX
248   pop   hl
249   ld    a,l
250   call  HEXSP
252   ; print code bytes (if there are any)
253   ld    de,(.codelen)
254   ld    a,d
255   or    a
256   jr    nz,.nocode
257   ; do not print code if more than 4 bytes (long strings and dbs)
258   or    e
259   jr    z,.nocode
260   ; do not print code if more than 4 bytes (long strings and dbs)
261   cp    5
262   jr    nc,.nocode
264   ; print hex bytes
265   ld    hl,(.codestart)
266 .cdumploop:
267   ld    a,(hl)
268   call  HEXSP
269   inc   hl
270   dec   e
271   jr    nz,.cdumploop
272   ; align printed code
273   ld    a,(.codelen)
274 .alignloop:
275   cp    a,4
276   jr    nc,.aligndone
277   ld    e,a
278   ld    a,32
279   call  EMIT
280   ld    a,32
281   call  EMIT
282   ld    a,32
283   call  EMIT
284   ld    a,e
285   inc   a
286   jr    .alignloop
287 .aligndone:
289 .nocode:
290   ; print source line, from BC to IY (exclusive)
291   ; calculate string length
292   push  iy
293   pop   hl
294   or    a
295   sbc   hl,bc
296   jr    z,.notextline
297 .textloop:
298   ld    a,(bc)
299   call  EMIT
300   inc   bc
301   dec   hl
302   ld    a,h
303   or    l
304   jr    nz,.textloop
305 .notextline:
306   ; print final CR
307   ld    a,13
308   call  EMIT
310   pop   ix
311   ret
313 .codelen: defw 0
314 .codestart: defw 0
317 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
319 ;; print byte in hex with the trailing space
321 HEXSP:
322   call  HEX
323   ld    a,' '
324   jr    OUTCH1
327 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
329 ;; print byte in hex
331 HEX:
332   push  af
333   rrca
334   rrca
335   rrca
336   rrca
337   call  HEXOUT
338   pop   af
339 HEXOUT:
340   and   0FH
341   add   a,90H
342   daa
343   adc   a,40H
344   daa
345 OUTCH1:
346   jp    EMIT