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