started expression parser; for now, implemented numeric parser, with alot of prefixes...
[bz80asm.git] / main.zas
blob3557e94178cf71c3acf62715a6adf3b6a78ce0cd
1   $refopt alllabels
3   org   #8000
4   ent   main
6   include "bzasm80.zas"
8 csizestart = $
9   include "parser.zas"
10 csizeend = $
11 $printf "parser size: %d", csizeend-csizestart
13 csizestart = $
14   include "labman.zas"
15 csizeend = $
16 $printf "label manager size: %d", csizeend-csizestart
18 csizestart = $
19   include "output.zas"
20 csizeend = $
21 $printf "ouput system size: %d", csizeend-csizestart
23 csizestart = $
24   ;include "output_driver_std.zas"
25   include "output_driver_4x8.zas"
26 csizeend = $
27 $printf "printing driver size: %d", csizeend-csizestart
30 main:
31   call  emitInit
33   di
34   ld    ix,(BZ80ASM.PC)
35   ld    iy,strbuf
36 asmmore:
37   ; print line to assemble
38   $IF 0
39   push  iy
40 .dumploop:
41   ld    a,(iy)
42   or    a
43   jr    z,.dumpdone
44   cp    13
45   jr    z,.dumpdone
46   call  EMIT
47   inc   iy
48   jr    .dumploop
49 .dumpdone:
50   pop   iy
51   ld    a,13
52   call  EMIT
53   $ENDIF
55 doasm:
56   push  ix      ; save code destination
57   push  iy      ; we'll need it for listing
58 doasm_nopush:
59   call  EXPR_STACK_RESET
60   call  BZ80ASM.ASSEM
61   jp    c,list_and_error
62 doasm_done_line:
63   pop   bc
64   pop   de
65   call  ASM_LISTING
67 .skipnl:
68   ld    a,(iy)
69   inc   iy
70   cp    13
71   jr    z,.skipnl
72   cp    ':'
73   jr    z,.skipnl
74   cp    32
75   jr    z,.skipnl
76   dec   iy
77   or    a
78   jr    nz,asmmore
80   ld    a,6
81   out   (#fe),a
82   jr    $
84 trylabel:
85   ld    hl,(BZ80ASM.PC)
86   call  DEFLABEL
87   call  BZ80ASM.SKIP
88   ; if terminator, don't try to assemble more
89   jr    z,.linedone
90   jr    doasm_nopush
91 .linedone:
92   jr    doasm_done_line
93 .lineerr:
94   jr    list_and_error_no_label_check
96 list_and_error:
97   ; bad mnemonics?
98   ld    a,(BZ80ASM.ASM_BAD_B)
99   cp    255
100   jr    z,trylabel
102 list_and_error_no_label_check:
103   ld    hl,errline
104   call  printstrnl
105   push  iy
106   pop   bc    ; current position in text buffer
107   pop   de    ; initial position
108   ; calc length
109   or    a
110   sbc   hl,de
111   jr    z,.nothing
112   ; de: print from here
113   ; hl: length
114 .prloop:
115   ld    a,(de)
116   call  EMIT
117   inc   de
118   dec   hl
119   ld    a,h
120   or    l
121   jr    nz,.prloop
122 .nothing:
123   ld    hl,errline
124   call  printstrnl
125   jp    error_syntax
126 errline: defx "---------"
129 strbuf:
130   defm  "label cp  69",13
131   ;defm  "jr   label",13
132   defm  "ld   a,42",13
133   defm  "ld   hl,16384",13
134   defm  "exx",13
135   defm  "ld   hl,#4001",13
136   defm  "ld   a,(ix-2)",13
137   defm  "call BEEFh",13
138   defm  "or   c",13
139   defm  "and  (hl)",13
140   defm  "jr   $",13
141   defm  "ld   de,$1234",13
142   defm  "ld   bc,0x5b02",13
143   defb  0
145 dest: defs 64,0
148 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
150 ;; show listing
151 ;; extracted from assembler code, because we don't need it there
153 ;; IN:
154 ;;   IY: current position in text buffer
155 ;;   IX: current position in code buffer
156 ;;   BC: starting position in text buffer
157 ;;   DE: starting position in code buffer
158 ;; OUT:
159 ;;   IX, IY: unchanged
160 ;;   others are dead
162 ;COUNT:  defb  0  ;PRINT POSITION
163 ASM_LISTING:
164   ; calculate code length
165   push  ix
167   push  ix
168   pop   hl
169   or    a
170   sbc   hl,de
171   ld    (.codelen),hl
172   ld    (.codestart),de
174   ; calculate original PC
175   ex    de,hl
176   ld    hl,(BZ80ASM.PC)
177   or    a
178   sbc   hl,de
179   ; print original PC
180   push  hl
181   ld    a,h
182   call  HEX
183   pop   hl
184   ld    a,l
185   call  HEXSP
187   ; print code bytes (if there are any)
188   ld    de,(.codelen)
189   ld    a,d
190   or    a
191   jr    nz,.nocode
192   ; do not print code if more than 4 bytes (long strings and dbs)
193   or    e
194   jr    z,.nocode
195   ; do not print code if more than 4 bytes (long strings and dbs)
196   cp    5
197   jr    nc,.nocode
199   ; print hex bytes
200   ld    hl,(.codestart)
201 .cdumploop:
202   ld    a,(hl)
203   call  HEXSP
204   inc   hl
205   dec   e
206   jr    nz,.cdumploop
207   ; align printed code
208   ld    a,(.codelen)
209 .alignloop:
210   cp    a,4
211   jr    nc,.aligndone
212   ld    e,a
213   ld    a,32
214   call  EMIT
215   ld    a,32
216   call  EMIT
217   ld    a,32
218   call  EMIT
219   ld    a,e
220   inc   a
221   jr    .alignloop
222 .aligndone:
224 .nocode:
225   ; print source line, from BC to IY (exclusive)
226   ; calculate string length
227   push  iy
228   pop   hl
229   or    a
230   sbc   hl,bc
231   jr    z,.notextline
232 .textloop:
233   ld    a,(bc)
234   call  EMIT
235   inc   bc
236   dec   hl
237   ld    a,h
238   or    l
239   jr    nz,.textloop
240 .notextline:
241   ; print final CR
242   ld    a,13
243   call  EMIT
245   pop   ix
246   ret
248 .codelen: defw 0
249 .codestart: defw 0
252 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
254 ;; print byte in hex with the trailing space
256 HEXSP:
257   call  HEX
258   ld    a,' '
259   jr    OUTCH1
262 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
264 ;; print byte in hex
266 HEX:
267   push  af
268   rrca
269   rrca
270   rrca
271   rrca
272   call  HEXOUT
273   pop   af
274 HEXOUT:
275   and   0FH
276   add   a,90H
277   daa
278   adc   a,40H
279   daa
280 OUTCH1:
281   jp    EMIT