4x8 driver with "<MORE>" prompt
[bz80asm.git] / main.zas
blobee5601051741721489b799bea18ba31254a0e43b
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   ld    hl,LABMAN_FIND_LABEL
40   ld    (BZ80ASM.GETLABEL_CB),hl
42   call  LABMAN_INIT
44   di
45   ld    ix,(BZ80ASM.PC)
46   ld    iy,strbuf
48 asmmore:
49   ; print line to assemble
50   $IF 0
51   push  iy
52 .dumploop:
53   ld    a,(iy)
54   or    a
55   jr    z,.dumpdone
56   cp    13
57   jr    z,.dumpdone
58   call  EMIT
59   inc   iy
60   jr    .dumploop
61 .dumpdone:
62   pop   iy
63   ld    a,13
64   call  EMIT
65   $ENDIF
67 doasm:
68   push  ix      ; save code destination
69   push  iy      ; we'll need it for listing
70 doasm_nopush:
71   ;call  EXPR_STACK_RESET
72   call  BZ80ASM.ASSEM
73   jp    c,list_and_error
74 doasm_done_line:
75   pop   bc
76   pop   de
77   call  ASM_LISTING
79 .skipnl:
80   ld    a,(iy)
81   inc   iy
82   cp    13
83   jr    z,.skipnl
84   cp    ':'
85   jr    z,.skipnl
86   cp    32
87   jr    z,.skipnl
88   dec   iy
89   or    a
90   jr    nz,asmmore
92   ld    a,6
93   out   (#fe),a
94   jr    $
96 trylabel:
97   ld    hl,(BZ80ASM.PC)
98   call  LABMAN_DEFINE_LABEL
99   jr    c,bad_label_name_error
100   call  BZ80ASM.SKIP
101   ; if terminator, don't try to assemble more
102   jr    z,.linedone
103   jr    doasm_nopush
104 .linedone:
105   jr    doasm_done_line
106 .lineerr:
107   jr    list_and_error_no_label_check
110 bad_label_name_error:
111   ld    a,BZ80ASM.EXPR_ERR_INVALID_LABEL_NAME
112   jp    BZ80ASM.PARSE_EXPR_ERROR_A
114 list_and_error:
115   ; bad mnemonics?
116   ld    a,(BZ80ASM.ASM_BAD_B)
117   cp    255
118   jr    z,trylabel
120 list_and_error_no_label_check:
121   ld    hl,errline
122   call  printstrnl
123   push  iy
124   pop   hl    ; current position in text buffer
125   pop   de    ; initial position
126   ; calc length
127   or    a
128   sbc   hl,de
129   jr    z,.nothing
130   ; de: print from here
131   ; hl: length
132 .prloop:
133   ld    a,(de)
134   call  EMIT
135   inc   de
136   dec   hl
137   ld    a,h
138   or    l
139   jr    nz,.prloop
140   dec   de
141   ld    a,(de)
142   or    a
143   jr    z,.doneerrlist
144   cp    13
145   jr    z,.doneerrlist
146   inc   de
147   ld    a,'|'
148   call  EMIT
149 .nothing:
150   ld    a,(de)
151   call  EMIT
152   ld    a,(de)
153   inc   de
154   cp    13
155   jr    nz,.nothing
157 .doneerrlist:
158   ld    hl,errline
159   call  printstrnl
160   ;jp    error_syntax
161   di
162   ld    a,2
163   out   (#fe),a
164   jr    $
165 errline: defx "---------"
168 strbuf:
169   defm  "or   c",13
170   defm  "and  (hl)",13
171   defm  "exx",13
172   defm  "label cp  69",13
173   defm  "call 0BEEFh",13
174   defm  "jr   $",13
175   defm  "jr   label",13
176   defm  "djnz label3",13
177   defm  "ld   a,40+2",13
178   defm  "ld   b,44-2",13
179   defm  "ld   c,126/3",13
180   defm  "ld   e,427%10",13
181   defm  "ld   bc,2+3*5",13
182   defm  "ld   bc,0+(2+3)*5",13
183   defm  "ld   bc,[2+3]*5",13
184   defm  "ld   bc,(2+3)*5",13
185   defm  "label3 ld   hl,16384",13
186   defm  "ld   hl,#4001",13
187   defm  "ld   a,(ix-2)",13
188   defm  "ld   c,(ix)",13
189   defm  "ld   de,$1234",13
190   defm  "ld   bc,0x5b02",13
191   defm  "ld   a,0b1001",13
192   defm  "ld   a,%1010",13
193   defm  "ld   ix,-1234",13
194   defm  "ld   iy,-0x602a",13
195   defm  "cp   1<<3",13
196   defm  "cp   8>>2",13
197   defm  "cp   ~0-1",13
198   defm  "defb 7&$c,1|2,1|(3^1),1<<15",13
199   defm  "defw 1<<15",13
200   defm  "defm '012','34'",13
201   defb  0
203 dest: defs 64,0
206 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
208 ;; show listing
209 ;; extracted from assembler code, because we don't need it there
211 ;; IN:
212 ;;   IY: current position in text buffer
213 ;;   IX: current position in code buffer
214 ;;   BC: starting position in text buffer
215 ;;   DE: starting position in code buffer
216 ;; OUT:
217 ;;   IX, IY: unchanged
218 ;;   others are dead
220 ;COUNT:  defb  0  ;PRINT POSITION
221 ASM_LISTING:
222   ; calculate code length
223   push  ix
225   push  ix
226   pop   hl
227   or    a
228   sbc   hl,de
229   ld    (.codelen),hl
230   ld    (.codestart),de
232   ; calculate original PC
233   ex    de,hl
234   ld    hl,(BZ80ASM.PC)
235   or    a
236   sbc   hl,de
237   ; print original PC
238   push  hl
239   ld    a,h
240   call  HEX
241   pop   hl
242   ld    a,l
243   call  HEXSP
245   ; print code bytes (if there are any)
246   ld    de,(.codelen)
247   ld    a,d
248   or    a
249   jr    nz,.nocode
250   ; do not print code if more than 4 bytes (long strings and dbs)
251   or    e
252   jr    z,.nocode
253   ; do not print code if more than 4 bytes (long strings and dbs)
254   cp    5
255   jr    nc,.nocode
257   ; print hex bytes
258   ld    hl,(.codestart)
259 .cdumploop:
260   ld    a,(hl)
261   call  HEXSP
262   inc   hl
263   dec   e
264   jr    nz,.cdumploop
265   ; align printed code
266   ld    a,(.codelen)
267 .alignloop:
268   cp    a,4
269   jr    nc,.aligndone
270   ld    e,a
271   ld    a,32
272   call  EMIT
273   ld    a,32
274   call  EMIT
275   ld    a,32
276   call  EMIT
277   ld    a,e
278   inc   a
279   jr    .alignloop
280 .aligndone:
282 .nocode:
283   ; print source line, from BC to IY (exclusive)
284   ; calculate string length
285   push  iy
286   pop   hl
287   or    a
288   sbc   hl,bc
289   jr    z,.notextline
290 .textloop:
291   ld    a,(bc)
292   call  EMIT
293   inc   bc
294   dec   hl
295   ld    a,h
296   or    l
297   jr    nz,.textloop
298 .notextline:
299   ; print final CR
300   ld    a,13
301   call  EMIT
303   pop   ix
304   ret
306 .codelen: defw 0
307 .codestart: defw 0
310 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
312 ;; print byte in hex with the trailing space
314 HEXSP:
315   call  HEX
316   ld    a,' '
317   jr    OUTCH1
320 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
322 ;; print byte in hex
324 HEX:
325   push  af
326   rrca
327   rrca
328   rrca
329   rrca
330   call  HEXOUT
331   pop   af
332 HEXOUT:
333   and   0FH
334   add   a,90H
335   daa
336   adc   a,40H
337   daa
338 OUTCH1:
339   jp    EMIT
342 LABMAN_FIRST_LABEL: defw $+2