cleaned up asm source; added alot of comments; removed unneded instructions from...
[bz80asm.git] / main.zas
blobae1c7e016d9616cec2701681accd05a1165cb8d7
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   call  BZ80ASM.ASSEM
59   jp    c,list_and_error
60   pop   bc
61   pop   de
62   call  ASM_LISTING
64 .skipnl:
65   ld    a,(iy)
66   inc   iy
67   cp    13
68   jr    z,.skipnl
69   cp    ':'
70   jr    z,.skipnl
71   cp    32
72   jr    z,.skipnl
73   dec   iy
74   or    a
75   jr    nz,asmmore
77   ld    a,6
78   out   (#fe),a
79   jr    $
81 list_and_error:
82   ld    hl,errline
83   call  printstrnl
84   push  iy
85   pop   bc    ; current position in text buffer
86   pop   de    ; initial position
87   ; calc length
88   or    a
89   sbc   hl,de
90   jr    z,.nothing
91   ; de: print from here
92   ; hl: length
93 .prloop:
94   ld    a,(de)
95   call  EMIT
96   inc   de
97   dec   hl
98   ld    a,h
99   or    l
100   jr    nz,.prloop
101 .nothing:
102   ld    hl,errline
103   call  printstrnl
104   jp    error_syntax
105 errline: defx "---------"
108 strbuf:
109   defm  ".label:",13
110   ;defm  "jr   label",13
111   defm  "ld   a,42",13
112   defm  "ld   hl,16384",13
113   defm  "ld   a,(ix-2)",13
114   defm  "call 1234",13
115   defm  "or   c",13
116   defm  "and  (hl)",13
117   defb  0
119 dest: defs 64,0
122 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
124 ;; show listing
125 ;; extracted from assembler code, because we don't need it there
127 ;; IN:
128 ;;   IY: current position in text buffer
129 ;;   IX: current position in code buffer
130 ;;   BC: starting position in text buffer
131 ;;   DE: starting position in code buffer
132 ;; OUT:
133 ;;   IX, IY: unchanged
134 ;;   others are dead
136 ;COUNT:  defb  0  ;PRINT POSITION
137 ASM_LISTING:
138   ; calculate code length
139   push  ix
141   push  ix
142   pop   hl
143   or    a
144   sbc   hl,de
145   ld    (.codelen),hl
146   ld    (.codestart),de
148   ; calculate original PC
149   ex    de,hl
150   ld    hl,(BZ80ASM.PC)
151   or    a
152   sbc   hl,de
153   ; print original PC
154   push  hl
155   ld    a,h
156   call  HEX
157   pop   hl
158   ld    a,l
159   call  HEXSP
161   ; print code bytes (if there are any)
162   ld    de,(.codelen)
163   ld    a,d
164   or    a
165   jr    nz,.nocode
166   ; do not print code if more than 4 bytes (long strings and dbs)
167   or    e
168   jr    z,.nocode
169   ; do not print code if more than 4 bytes (long strings and dbs)
170   cp    5
171   jr    nc,.nocode
173   ; print hex bytes
174   ld    hl,(.codestart)
175 .cdumploop:
176   ld    a,(hl)
177   call  HEXSP
178   inc   hl
179   dec   e
180   jr    nz,.cdumploop
181   ; align printed code
182   ld    a,(.codelen)
183 .alignloop:
184   cp    a,4
185   jr    nc,.aligndone
186   ld    e,a
187   ld    a,32
188   call  EMIT
189   ld    a,32
190   call  EMIT
191   ld    a,32
192   call  EMIT
193   ld    a,e
194   inc   a
195   jr    .alignloop
196 .aligndone:
198 .nocode:
199   ; print source line, from BC to IY (exclusive)
200   ; calculate string length
201   push  iy
202   pop   hl
203   or    a
204   sbc   hl,bc
205   jr    z,.notextline
206 .textloop:
207   ld    a,(bc)
208   call  EMIT
209   inc   bc
210   dec   hl
211   ld    a,h
212   or    l
213   jr    nz,.textloop
214 .notextline:
215   ; print final CR
216   ld    a,13
217   call  EMIT
219   pop   ix
220   ret
222 .codelen: defw 0
223 .codestart: defw 0
226 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
228 ;; print byte in hex with the trailing space
230 HEXSP:
231   call  HEX
232   ld    a,' '
233   jr    OUTCH1
236 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
238 ;; print byte in hex
240 HEX:
241   push  af
242   rrca
243   rrca
244   rrca
245   rrca
246   call  HEXOUT
247   pop   af
248 HEXOUT:
249   and   0FH
250   add   a,90H
251   daa
252   adc   a,40H
253   daa
254 OUTCH1:
255   jp    EMIT