dsforth: added "-1", "-2", "-4" constants
[urasm.git] / libs / mac_screen.zas
blobb839af63690269d77aed8f8fd22f79df17db6409
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: scraddrnext -- previous y line
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   rrca
158   rrca
159   rrca
160   and  #03
161   or   =attrbasehi
162   IF =skipastore == 0
163   ld   =regpair[0],a
164   ENDIF
165 ENDM
168 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
169 ;; calculate address in ROM font for the given char
170 ;; WARNING! char must be in [32..127] range!
171 ;; in:
172 ;;   srcreg: charcode reg8 (can be empty to avoid load at all)
173 ;;           default is A; if empty, load code to 'L'
174 ;; out:
175 ;;   HL: scraddrnext -- previous y line
176 ;;   flags: dead (not yet, but i reserve it)
177 MACRO calcROMCharHL_A  srcreg=a
178   IF strlen(marg2str(=srcreg)) > 0
179     IF marg2str(=srcreg[0]) != "l"
180     ld    l,=srcreg[0]
181     ENDIF
182   ENDIF
183   add  hl,hl
184   ld   h,15
185   add  hl,hl
186   add  hl,hl
187 ENDM
190   ;scrDownXX  hl
191   ;nop
192   ;scrDownXX  de,"jr",:skipaload=1
193   ;nop
194   ;scrDownXX  bc,"jp",:skipinc=1
195   ;nop
196   ;scrDownXX  hl,"ret"