UrForth: fixed some bugs, added simple benchmark
[urasm.git] / libs / mac_screen.zas
blob5b8d88a927031d5d9a1ed8b4d78e79554c8a34a5
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; various macros for screen$
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 ;; convert character coords to screen$ bitmap address
7 ;; if srcpair[0] is equal to dstpair[0], one stack slot will be used
8 ;; WARNING! coords must be valid!
9 ;; in:
10 ;;   srcpair[0]: y (char)
11 ;;   srcpair[1]: x (char)
12 ;; out:
13 ;;   destpair: scr$addr
14 ;;   AF: dead
15 MACRO scrAddr8XX_fromXX  destpair, srcpair
16   ;$printf  "srcpair[0]len=%d (%s)", strlen(marg2str(=srcpair[0])), marg2str(=srcpair[0])
17   ld    a,=srcpair[0]
18   IF marg2str(=srcpair[0]) == marg2str(=destpair[0])
19   ; we'll need A later
20   push  af
21   ENDIF
22   and   #18
23   or    #40
24   ld    =destpair[0],a
25   IF marg2str(=srcpair[0]) == marg2str(=destpair[0])
26   pop   af
27   ELSE
28   ld    a,=srcpair[0]
29   ENDIF
30   rrca
31   rrca
32   rrca
33   and   #E0
34   or    =srcpair[1]
35   ld    =destpair[1],a
36 ENDM
39 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
40 ;; down to the next screen$ line
41 ;; in:
42 ;;   regpair: scr$addr
43 ;;   skipcmd: command to use to skip sections: "ret"/"jp"/"jr" (default:"jp")
44 ;;   skipinc: if !0, skip first increment (default:0)
45 ;;   skipaload: skip first A loading (A must contain =regpair[0]) (default:0)
46 ;; out:
47 ;;   regpair: scraddrnext -- next y line
48 ;;   AF: dead
49 MACRO scrDownXX  regpair, skipcmd="jp", skipinc=0, skipaload=0
50   ;$printf "regpair=%c%c; skipcmd=<%s>; skipinc=%d; skipaload=%d", =regpair[0], =regpair[1], =skipcmd, =skipinc, =skipaload
51   IF =skipinc == 0
52   inc  =regpair[0]
53   ENDIF
54   IF =skipaload == 0
55   ld   a,=regpair[0]
56   ENDIF
57   and  #07
58   IF =skipcmd == "ret"
59   ret  nz
60   ELSEIF =skipcmd == "jp"
61   jp   nz,..done
62   ELSEIF =skipcmd == "jr"
63   jr   nz,..done
64   ELSE
65   $ERROR "skipcmd must be 'ret'/'jp'/'jr'"
66   ENDIF
67   ld   a,=regpair[1]
68   add  a,32
69   ld   =regpair[1],a
70   IF =skipcmd == "ret"
71   ret  c
72   ELSEIF =skipcmd == "jp"
73   jp   c,..done
74   ELSEIF =skipcmd == "jr"
75   jr   c,..done
76   ELSE
77   $ERROR "skipcmd must be 'ret'/'jp'/'jr'"
78   ENDIF
79   ld   a,=regpair[0]
80   sub  8
81   ld   =regpair[0],a
82   ; add last ret
83   IF =skipcmd == "ret"
84   ret
85   ELSE
86 ..done:
87   ENDIF
88 ENDM
91 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
92 ;; up to the previous screen$ line
93 ;; in:
94 ;;   regpair: scr$addr
95 ;;   skipcmd: command to use to skip sections: "ret"/"jp"/"jr" (default:"jp")
96 ;;   skipdec: if !0, skip first increment (default:0)
97 ;;   skipaload: skip first A loading (A must contain =regpair[0]) (default:0)
98 ;; out:
99 ;;   regpair: scraddrnext -- previous y line
100 ;;   AF: dead
101 MACRO scrUpXX  regpair, skipcmd="jp", skipdec=0, skipaload=0
102   ;$printf "regpair=%c%c; skipcmd=<%s>; skipdec=%d; skipaload=%d", =regpair[0], =regpair[1], =skipcmd, =skipdec, =skipaload
103   IF =skipaload == 0
104   ld   a,=regpair[0]
105   ENDIF
106   IF =skipdec == 0
107   dec  =regpair[0]
108   ENDIF
109   and  #07
110   IF =skipcmd == "ret"
111   ret  nz
112   ELSEIF =skipcmd == "jp"
113   jp   nz,..done
114   ELSEIF =skipcmd == "jr"
115   jr   nz,..done
116   ELSE
117   $ERROR "skipcmd must be 'ret'/'jp'/'jr'"
118   ENDIF
119   ld   a,=regpair[1]
120   sub  32
121   ld   =regpair[1],a
122   IF =skipcmd == "ret"
123   ret  c
124   ELSEIF =skipcmd == "jp"
125   jp   c,..done
126   ELSEIF =skipcmd == "jr"
127   jr   c,..done
128   ELSE
129   $ERROR "skipcmd must be 'ret'/'jp'/'jr'"
130   ENDIF
131   ld   a,=regpair[0]
132   add  a,8
133   ld   =regpair[0],a
134   ; add last ret
135   IF =skipcmd == "ret"
136   ret
137   ELSE
138 ..done:
139   ENDIF
140 ENDM
143 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
144 ;; convert bitmap address to attribute address
145 ;; in:
146 ;;   regpair: scr$addr
147 ;;   skipaload: skip first A loading (A must contain =regpair[0]) (default:0)
148 ;;   skipastore: skip final A storing (default:0)
149 ;;   attrbasehi: high byte of the first attribute address
150 ;; out:
151 ;;   regpair: attraddr -- attribute address
152 ;;   AF: dead
153 MACRO scr2AttrXX  regpair, skipaload=0, skipastore=0, attrbasehi=#58
154   IF =skipaload == 0
155   ld   a,=regpair[0]
156   ENDIF
157   IF =attrbasehi == #58
158   ; fast code by Lethargeek
159   or    #87
160   rra
161   rra
162   srl   a    ;; rra for #C000 screen
163   ELSEIF =attrbasehi == #C0
164   or    #87
165   rra
166   rra
167   rra
168   ELSE
169   rrca
170   rrca
171   rrca
172   and  #03
173   or   =attrbasehi
174   ENDIF
175   IF =skipastore == 0
176   ld   =regpair[0],a
177   ENDIF
178 ENDM
181 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
182 ;; convert bitmap address to attribute address
183 ;; works for #4000 and for #C000
184 ;; in:
185 ;;   regpair: attraddr
186 ;;   skipaload: skip first A loading (A must contain =regpair[0]) (default:0)
187 ;;   skipastore: skip final A storing (default:0)
188 ;; out:
189 ;;   regpair: scr$addr
190 ;;   AF: dead
191 MACRO scrFromAttrXX  regpair, skipaload=0, skipastore=0
192   IF =skipaload == 0
193   ld   a,=regpair[0]
194   ENDIF
195   ; tnx, Lethargeek
196   add   a
197   add   a
198   add   a
199   and   =regpair[0]
200   ENDIF
201   IF =skipastore == 0
202   ld   =regpair[0],a
203   ENDIF
204 ENDM
207 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
208 ;; calculate address in ROM font for the given char
209 ;; WARNING! char must be in [32..127] range!
210 ;; in:
211 ;;   srcreg: charcode reg8 (can be empty to avoid load at all)
212 ;;           default is A; if empty, load code to 'L'
213 ;; out:
214 ;;   HL: scraddrnext -- previous y line
215 ;;   flags: dead (not yet, but i reserve it)
216 MACRO calcROMCharHL_A  srcreg=a
217   IF strlen(marg2str(=srcreg)) > 0
218     IF marg2str(=srcreg[0]) != "l"
219     ld    l,=srcreg[0]
220     ENDIF
221   ENDIF
222   add  hl,hl
223   ld   h,15
224   add  hl,hl
225   add  hl,hl
226 ENDM
229   ;scrDownXX  hl
230   ;nop
231   ;scrDownXX  de,"jr",:skipaload=1
232   ;nop
233   ;scrDownXX  bc,"jp",:skipinc=1
234   ;nop
235   ;scrDownXX  hl,"ret"