dsforth: cosmetix
[urasm.git] / libs / XPrint8 / XPrint8.zas
blob30458ded6f1f070f123288aa89f3e2058d7bb367
1   MODULE XPrint8
3 CHR_LEFT    EQU  8
4 CHR_RIGHT   EQU  9
5 CHR_NL      EQU  10
6 CHR_INK     EQU  16
7 CHR_PAPER   EQU  17
8 CHR_FLASH   EQU  18
9 CHR_BRIGHT  EQU  19
10 CHR_INV     EQU  20
11 CHR_OVER    EQU  21
12 CHR_AT      EQU  22
13 CHR_SETX    EQU  23
15 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16 ;; print string; last string byte must have bit 7 set
17 ;; in:
18 ;;   HL: string address
19 ;; out:
20 ;;   HL: next string address
21 ;;   AF: dead
22 PrintStrX:
23 .loop:
24   ld   a,(hl)
25   and  #7f
26   call PrintChar
27   ld   a,(hl)
28   inc  hl
29   and  #80
30   jr   z,.loop
31   ret
34 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35 ;; print string; last string byte must be 0
36 ;; in:
37 ;;   HL: string address
38 ;; out:
39 ;;   HL: next string address
40 ;;   AF: dead
41 PrintStrZ:
42 .loop:
43   ld   a,(hl)
44   inc  hl
45   or   a
46   ret  z
47   call PrintChar
48   jr   .loop
51 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
52 ;; print string; last string byte must be $ff
53 ;; in:
54 ;;   HL: string address
55 ;; out:
56 ;;   HL: next string address
57 ;;   AF: dead
58 PrintStrFF:
59 .loop:
60   ld   a,(hl)
61   inc  hl
62   cp   255
63   ret  z
64   call PrintChar
65   jr   .loop
68 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
69 ;; print char
70 ;; in:
71 ;;   A: char code
72 ;; out:
73 ;;   AF: dead
74 PrintChar:
75 curProc: equ $+1
76   jp   printCharMain
78 printOneMoreArg:
79   ld   (curArg1),a
80   push hl
81   ld   hl,printLastArg
82   ld   (curProc),hl
83   pop  hl
84   ret
86 printLastArg:
87   push hl
88   ld   (curArg0),a
89   ld   hl,printCharMain
90   ld   (curProc),hl
91   ld   a,(curSpCode)
92   cp   22
93   jr   nz,.spcodeNotAt
94   ; at
95   ld   hl,(curArgs)  ; h:y; l:x
96   ld   a,31
97   cp   l
98   jr   nc,.spcodeAtXOk
99   ld   l,a
100 .spcodeAtXOk:
101   ld   a,23
102   cp   h
103   jr   nc,.spcodeAtYOk
104   ld   h,a
105 .spcodeAtYOk:
106   ld   (curXY),hl
107 .pophlandquit:
108   pop  hl
109   ret
110 .spcodeNotAt:
112   cp   18
113   jr   nc,.spcodeNotInkPaper
114   ld   h,a
115   ld   a,(curArg0)
116   cp   8
117   jr   nc,.pophlandquit
118   push de
119   ld   e,%11111000
120   bit  0,h   ; 17?
121   jr   z,.notPaper
122   ; paper: *8
123   ld   e,%11000111
124   rlca
125   rlca
126   rlca
127 .notPaper:
128   ld   d,a
129   ld   hl,curAttr
130   ld   a,(hl)
131   and  e
132   or   d
133   ld   (hl),a
134   pop  de,hl
135   ret
136 .spcodeNotInkPaper:
138   ld   hl,curAttr
140   cp   19
141   jr   nz,.spcodeNotBright
142   res  6,(hl)
143   ld   a,(curArg0)
144   or   a
145   jr   z,.pophlandquit
146   set  6,(hl)
147   pop  hl
148   ret
149 .spcodeNotBright:
151   cp   18
152   jr   nz,.spcodeNotFlash
153   res  7,(hl)
154   ld   a,(curArg0)
155   or   a
156   jr   z,.pophlandquit
157   set  7,(hl)
158   pop  hl
159   ret
160 .spcodeNotFlash:
162   cp   20
163   jr   nz,.spcodeNotInverse
164   ld   a,(curArg0)
165   or   a
166   jr   z,.invNormal
167   ld   a,$2F  ; CPL
168 .invNormal:
169   ld   (PrintCharAtHLInvMode),a
170   pop  hl
171   ret
173 .spcodeNotInverse:
174   cp   21
175   jr   nz,.spcodeNotOver
176   ld   a,(curArg0)
177   or   a
178   jr   z,.overNormal
179   dec  a
180   ld   a,$AE  ; XOR (HL)
181   jr   z,.overNormal
182   ld   a,$B6  ; OR (HL)
183 .overNormal:
184   ld   (PrintCharAtHLOverMode),a
185   pop  hl
186   ret
188 .spcodeNotOver:
189   cp   23
190   jr   nz,.pophlandquit
191   ld   l,31
192   ld   a,(curArg0)
193   cp   a
194   jr   nc,.spcodeXXOK
195   ld   a,l
196 .spcodeXXOK:
197   ld   (curX),a
198   pop  hl
199   ret
202 ;; special codes:
203 ;;  6: tab (n/a)
204 ;;  7: ??? (n/a)
205 ;;  8: bs
206 ;;  9: right
207 ;; 10: curdown (same as 13 for now)
208 ;; 11: curup (n/a)
209 ;; 12: del (n/a)
210 ;; 13: enter (x=0;++y)
211 ;; 14: n/a
212 ;; 15: n/a
213 ;; 16: ink
214 ;; 17: paper
215 ;; 18: flash
216 ;; 19: bright
217 ;; 20: inverse
218 ;; 21: over
219 ;; 22: at
220 ;; 23: tab ctl (n/a); for now: move to the given x
222 printCharMain:
223   cp   32
224   jr   nc,.printable
225   cp   16
226   jr   c,.notCtl
227   cp   24
228   jr   nc,.notCtl
229   ; special
230   push hl
231   ld   (curSpCode),a
232   cp   22  ; at
233   ld   hl,printOneMoreArg
234   jr   z,.itsAt
235   ; one byte
236  IF printOneMoreArg/256 = printLastArg/256
237   ld   l,printLastArg%256
238  ELSE
239   ld   hl,printLastArg
240  ENDIF
241 .itsAt:
242 .quitSetProcHL:
243   ld   (curProc),hl
244   pop  hl
245   ret
247 .notCtl:
248   cp   10  ; lf
249   jr   z,.printLF
250   cp   13  ; cr
251   jr   z,.printCR
252   cp   8   ; bs
253   jr   z,.printBS
254   cp   9   ; right
255   jr   nz,.printable
256   push hl
257   jr   .printRightX
259 .printable:
260   cp   128
261   ret  nc
263   ; normal print
264   push hl,de,af
265   ld   de,(curXY)
266   call scrAddr8DE_HL
267   pop  af
268   call PrintCharAtHL
269   call scr2attrHL
270   pop  de
271   ld   a,(curAttr)
272   ld   (hl),a
274 .printRightX:
275   ld   hl,(curXY)
276   inc  l
277   ld   a,31
278   cp   l
279   jr   nc,.pokNC
280   ld   l,0
281   inc  h
282   ld   a,23
283   cp   h
284   jr   nc,.pokNC
285   ld   h,l
286 .pokNC:
287   ld   (curXY),hl
288   pop  hl
289   ret
291 .printBS:
292   ld    a,(curX)
293   sub   a,1
294   jr    nc,.putAtoXandRet
295   ld    a,(curY)
296   sub   a,1
297   ret   c
298   ld    (curY),a
299   ld    a,31
300   jr    .putAtoXandRet
302 .printLF:
303   push  hl
304   ld    hl,curXY+1
305   inc   (hl)
306   pop   hl
308 .printCR:
309   xor  a
310 .putAtoXandRet:
311   ld   (curX),a
312   ret
315 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
316 ;; print char to screen
317 ;; in:
318 ;;  HL: screen address
319 ;;   A: char code
320 PrintCharAtHL:
321   push bc,hl
322   ld   l,a  ; first part of ROM char address calculation
323   cp   52
324   jr   z,.distortNot
325   cp   96
326   ld   a,7
327   jr   c,.distortOk
328 .distortNot:
329   ld   a,#ff
330 .distortOk:
331   ld   (.andOper),a
332   ; new routine
333   add  hl,hl
334   ld   h,15
335   add  hl,hl
336   add  hl,hl
337   ;;ld   h,0
338   ;;add  hl,hl
339   ;;add  hl,hl
340   ;;add  hl,hl
341   ;;ld   de,#3c00
342   ;;add  hl,de
343   ;
344   ex   de,hl
345   pop  hl
346   push hl
347   ld   b,8
348 .lineloop:
349   ld   a,(de)
350   ld   c,a
351   and  #7C
352   rlca
353   or   c
354   ; distort a little
355   ld   c,a
356   ld   a,b
357   cp   3
358   ld   a,c
359   jr   nz,.dontfuck
360 .andOper: equ $+1
361   and  #07
362 .dontfuck:
363   ;
364 @PrintCharAtHLInvMode:
365   nop  ; or CPL ($2F)
366   ; for OVER
367 @PrintCharAtHLOverMode:
368   or   a       ;  or a($AF) / xor (hl)($AE) / or (hl)($B6)
369   ; end OVER
370   ld   (hl),a
371   inc  de
372   inc  h
373   djnz .lineloop
374   ;
375   pop  hl,bc
376   ret
379 ; in:
380 ;   D: y (char)
381 ;   E: x (char)
382 ; out:
383 ;   HL: scrAddr
384 ;   AF: dead
385 scrAddr8DE_HL:
386   ld    a,d
387   and   #18
388   or    #40
389   ld    h,a
390   ld    a,d
391   rrca
392   rrca
393   rrca
394   and   #E0
395   or    e
396   ld    l,a
397   ret
400 ; in:
401 ;   HL: scrAddr
402 ; out:
403 ;   HL: attrAddr
404 scr2attrHL:
405   ld    a,h
406   rrca
407   rrca
408   rrca
409   and   #03
410   or    #58
411   ld    h,a
412   ret
414 curSpCode: db 0
415 curArgs: equ $
416 curArg0: db 0
417 curArg1: db 0
419 curAttr: db 007
420 curXY:   equ $
421 curX:    db 0
422 curY:    db 0
424   ENDMODULE