4x8 driver with "<MORE>" prompt
[bz80asm.git] / output_driver_4x8.zas
blobf2243df8665f8d887ca07e6e36570aa97decf513
1 emitXY defw 0
2 emitBeforeScroll defb 1
4 emitInit:
5   ld    hl,#4000
6   ld    de,#4001
7   ld    bc,#17FF
8   ld    (hl),l
9   ldir
10   ld    a,64
11   ld    (WIDTH),a
12   ld    hl,0
13   ld    (emitXY),hl
14   ld    a,1
15   ld    (emitBeforeScroll),a
16   ret
19 ; A: code
20 ; should preserve registers (except A and F)
21 OSWRCH:
22   cp    10
23   ret   z
24   push  bc,de,hl
25   cp    13
26   jr    z,.docr
27   cp    32
28   jr    nc,.oklow
29   ld    a,'?'
30 .oklow:
31   cp    128
32   jr    c,.okhigh
33   ld    a,'?'
34 .okhigh:
35   ld    (.charcode),a
36   ld    de,(emitXY)
37   ld    a,e
38   ; check if we need to wrap
39   cp    64
40   jr    c,.nowrap
41   ; need to wrap (and maybe scroll)
42   ld    e,0
43   inc   d
44   ld    a,d
45   cp    24
46   jr    c,.noscroll
47   ; need to scroll
48   ld    d,23
49   push  de
50   call  .doscroll
51   pop   de
52 .noscroll:
53   ld    a,e
54 .nowrap:
55   push  af
56   inc   e
57   ld    (emitXY),de
58   srl   a
59   ld    e,a
60   ; d: y
61   ; e: x
62   ld    a,d
63   and   #18
64   or    #40
65   ld    h,a
66   ld    a,d
67   rrca
68   rrca
69   rrca
70   and   #E0
71   or    e
72   ld    l,a
73   ; hl: screen address
74   ; setup mask
75   pop   af
76   and   #01
77   ld    a,#F0
78   jr    z,.maskok
79   cpl
80 .maskok:
81   ld    (.fontmask),a
82   cpl
83   ld    (.scrmask),a
84   ex    de,hl
85   ld    l,0     ; patched above
86 .charcode equ $-1
87   ld    h,0
88   add   hl,hl
89   add   hl,hl
90   add   hl,hl
91   push  de
92   ld    de,font4x8-32*8
93   add   hl,de
94   pop   de
95   ; de: scr$
96   ; hl: font
97   ld    b,8
98 .charloop:
99   ld    a,(de)
100   and   #00     ; patched above
101 .scrmask equ $-1
102   ld    c,a
103   ld    a,(hl)
104   nop
105 .inverse_cmd equ $-1
106   and   #00     ; patched above
107 .fontmask equ $-1
108   or    c
109   ld    (de),a
110   inc   d
111   inc   hl
112   djnz  .charloop
113 .exit:
114   pop   hl,de,bc
115   ret
117 .docr:
118   ; this actually moves cursor to (64,n), if it is not there
119   ; otherwise, moves down a line, and scroll
120   ld    hl,(emitXY)
121   ld    a,l
122   cp    64
123   jr    nc,.dorealcr
124   ; put cursor to (64,n)
125   ld    l,64
126   ld    (emitXY),hl
127   jr    .exit
128 .dorealcr:
129   ; must do real newline here
130   ld    l,0
131   inc   h
132   ld    (emitXY),hl
133   ld    a,h
134   cp    24
135   jr    c,.exit
136   ld    h,23
137   ld    (emitXY),hl
138   ; scroll screen
139   call  .doscroll
140   jr    .exit
142 .doscroll:
143   ld    a,(emitBeforeScroll)
144   dec   a
145   jr    nz,.noprompt
146   ; show scroll prompt, wait a key
147   ld    a,(.charcode)
148   push  af
149   ld    a,#2F   ; CPL
150   ld    (.inverse_cmd),a
151   ld    hl,(emitXY)
152   push  hl
153   ld    hl,#173A
154   push  hl
155   ld    (emitXY),hl
156   ld    hl,.scrollmsg
157 .msgloop:
158   ld    a,(hl)
159   and   #7f
160   call  OSWRCH
161   bit   7,(hl)
162   inc   hl
163   jr    z,.msgloop
164 .waitrelease:
165   call  #028E
166   inc   e
167   jr    nz,.waitrelease
168 .waitpress:
169   call  #028E
170   inc   e
171   jr    z,.waitpress
172   ; clear message area
173   pop   hl
174   ld    (emitXY),hl
175   xor   a
176   ld    (.inverse_cmd),a
177   ld    b,6
178 .clrmsg:
179   ld    a,' '
180   call  OSWRCH
181   djnz  .clrmsg
182   pop   hl
183   ld    (emitXY),hl
184   pop   af
185   ld    (.charcode),a
186   ld    a,23
187 .noprompt:
188   ld    (emitBeforeScroll),a
189   ld    b,24
190   call  #0E00
191   ret
193 .scrollmsg: defx "<MORE>"
195 font4x8:
196   ; space
197   defb %00000000
198   defb %00000000
199   defb %00000000
200   defb %00000000
201   defb %00000000
202   defb %00000000
203   defb %00000000
204   defb %00000000
205   ; !
206   defb %00000000
207   defb %00100010
208   defb %00100010
209   defb %00100010
210   defb %00100010
211   defb %00000000
212   defb %00100010
213   defb %00000000
214   ; "
215   defb %00000000
216   defb %01010101
217   defb %01010101
218   defb %00000000
219   defb %00000000
220   defb %00000000
221   defb %00000000
222   defb %00000000
223   ; #
224   defb %00000000
225   defb %00000000
226   defb %01010101
227   defb %01110111
228   defb %01010101
229   defb %01110111
230   defb %01010101
231   defb %00000000
232   ; $
233   defb %00000000
234   defb %00100010
235   defb %00110011
236   defb %01000100
237   defb %01110111
238   defb %00010001
239   defb %01100110
240   defb %00100010
241   ; %
242   defb %00000000
243   defb %00000000
244   defb %01000100
245   defb %01010101
246   defb %00100010
247   defb %01010101
248   defb %00010001
249   defb %00000000
250   ; &
251   defb %00000000
252   defb %00110011
253   defb %01000100
254   defb %00110011
255   defb %01010101
256   defb %01010101
257   defb %00110011
258   defb %00000000
259   ; '
260   defb %00000000
261   defb %00100010
262   defb %01000100
263   defb %00000000
264   defb %00000000
265   defb %00000000
266   defb %00000000
267   defb %00000000
268   ; (
269   defb %00000000
270   defb %00100010
271   defb %01000100
272   defb %01000100
273   defb %01000100
274   defb %01000100
275   defb %00100010
276   defb %00000000
277   ; )
278   defb %00000000
279   defb %01000100
280   defb %00100010
281   defb %00100010
282   defb %00100010
283   defb %00100010
284   defb %01000100
285   defb %00000000
286   ; *
287   defb %00000000
288   defb %00000000
289   defb %01010101
290   defb %00100010
291   defb %01110111
292   defb %00100010
293   defb %01010101
294   defb %00000000
295   ; +
296   defb %00000000
297   defb %00000000
298   defb %00100010
299   defb %00100010
300   defb %01110111
301   defb %00100010
302   defb %00100010
303   defb %00000000
304   ; ,
305   defb %00000000
306   defb %00000000
307   defb %00000000
308   defb %00000000
309   defb %00000000
310   defb %00000000
311   defb %00100010
312   defb %01000100
313   ; -
314   defb %00000000
315   defb %00000000
316   defb %00000000
317   defb %00000000
318   defb %01110111
319   defb %00000000
320   defb %00000000
321   defb %00000000
322   ; .
323   defb %00000000
324   defb %00000000
325   defb %00000000
326   defb %00000000
327   defb %00000000
328   defb %00000000
329   defb %00100010
330   defb %00000000
331   ; /
332   defb %00000000
333   defb %00010001
334   defb %00010001
335   defb %00100010
336   defb %00100010
337   defb %01000100
338   defb %01000100
339   defb %00000000
340   ; 0
341   defb %00000000
342   defb %00100010
343   defb %01010101
344   defb %01010101
345   defb %01010101
346   defb %01010101
347   defb %00100010
348   defb %00000000
349   ; 1
350   defb %00000000
351   defb %00100010
352   defb %01100110
353   defb %00100010
354   defb %00100010
355   defb %00100010
356   defb %01110111
357   defb %00000000
358   ; 2
359   defb %00000000
360   defb %00100010
361   defb %01010101
362   defb %00010001
363   defb %00100010
364   defb %01000100
365   defb %01110111
366   defb %00000000
367   ; 3
368   defb %00000000
369   defb %01110111
370   defb %00010001
371   defb %00100010
372   defb %00010001
373   defb %01010101
374   defb %00100010
375   defb %00000000
376   ; 4
377   defb %00000000
378   defb %00010001
379   defb %00110011
380   defb %01010101
381   defb %01110111
382   defb %00010001
383   defb %00010001
384   defb %00000000
385   ; 5
386   defb %00000000
387   defb %01110111
388   defb %01000100
389   defb %01100110
390   defb %00010001
391   defb %01010101
392   defb %00100010
393   defb %00000000
394   ; 6
395   defb %00000000
396   defb %00110011
397   defb %01000100
398   defb %01100110
399   defb %01010101
400   defb %01010101
401   defb %00100010
402   defb %00000000
403   ; 7
404   defb %00000000
405   defb %01110111
406   defb %00010001
407   defb %00010001
408   defb %00100010
409   defb %00100010
410   defb %00100010
411   defb %00000000
412   ; 8
413   defb %00000000
414   defb %00100010
415   defb %01010101
416   defb %00100010
417   defb %01010101
418   defb %01010101
419   defb %00100010
420   defb %00000000
421   ; 9
422   defb %00000000
423   defb %00100010
424   defb %01010101
425   defb %01010101
426   defb %00110011
427   defb %00010001
428   defb %00100010
429   defb %00000000
430   ; :
431   defb %00000000
432   defb %00000000
433   defb %00100010
434   defb %00000000
435   defb %00000000
436   defb %00000000
437   defb %00100010
438   defb %00000000
439   ; ;
440   defb %00000000
441   defb %00000000
442   defb %00100010
443   defb %00000000
444   defb %00000000
445   defb %00000000
446   defb %00100010
447   defb %01000100
448   ; <
449   defb %00000000
450   defb %00000000
451   defb %00010001
452   defb %00100010
453   defb %01000100
454   defb %00100010
455   defb %00010001
456   defb %00000000
457   ; =
458   defb %00000000
459   defb %00000000
460   defb %00000000
461   defb %01110111
462   defb %00000000
463   defb %01110111
464   defb %00000000
465   defb %00000000
466   ; >
467   defb %00000000
468   defb %00000000
469   defb %01000100
470   defb %00100010
471   defb %00010001
472   defb %00100010
473   defb %01000100
474   defb %00000000
475   ; ?
476   defb %00000000
477   defb %00100010
478   defb %01010101
479   defb %00010001
480   defb %00100010
481   defb %00000000
482   defb %00100010
483   defb %00000000
484   ; @
485   defb %00000000
486   defb %00100010
487   defb %01010101
488   defb %01110111
489   defb %01010101
490   defb %01100110
491   defb %00110011
492   defb %00000000
493   ; A
494   defb %00000000
495   defb %00100010
496   defb %01010101
497   defb %01010101
498   defb %01110111
499   defb %01010101
500   defb %01010101
501   defb %00000000
502   ; B
503   defb %00000000
504   defb %01100110
505   defb %01010101
506   defb %01100110
507   defb %01010101
508   defb %01010101
509   defb %01100110
510   defb %00000000
511   ; C
512   defb %00000000
513   defb %00100010
514   defb %01010101
515   defb %01000100
516   defb %01000100
517   defb %01010101
518   defb %00100010
519   defb %00000000
520   ; D
521   defb %00000000
522   defb %01100110
523   defb %01010101
524   defb %01010101
525   defb %01010101
526   defb %01010101
527   defb %01100110
528   defb %00000000
529   ; E
530   defb %00000000
531   defb %01110111
532   defb %01000100
533   defb %01100110
534   defb %01000100
535   defb %01000100
536   defb %01110111
537   defb %00000000
538   ; F
539   defb %00000000
540   defb %01110111
541   defb %01000100
542   defb %01100110
543   defb %01000100
544   defb %01000100
545   defb %01000100
546   defb %00000000
547   ; G
548   defb %00000000
549   defb %00110011
550   defb %01000100
551   defb %01010101
552   defb %01010101
553   defb %01010101
554   defb %00110011
555   defb %00000000
556   ; H
557   defb %00000000
558   defb %01010101
559   defb %01010101
560   defb %01110111
561   defb %01010101
562   defb %01010101
563   defb %01010101
564   defb %00000000
565   ; I
566   defb %00000000
567   defb %01110111
568   defb %00100010
569   defb %00100010
570   defb %00100010
571   defb %00100010
572   defb %01110111
573   defb %00000000
574   ; J
575   defb %00000000
576   defb %00010001
577   defb %00010001
578   defb %00010001
579   defb %00010001
580   defb %01010101
581   defb %00100010
582   defb %00000000
583   ; K
584   defb %00000000
585   defb %01010101
586   defb %01010101
587   defb %01100110
588   defb %01100110
589   defb %01010101
590   defb %01010101
591   defb %00000000
592   ; L
593   defb %00000000
594   defb %01000100
595   defb %01000100
596   defb %01000100
597   defb %01000100
598   defb %01000100
599   defb %01110111
600   defb %00000000
601   ; M
602   defb %00000000
603   defb %01010101
604   defb %01110111
605   defb %01110111
606   defb %01010101
607   defb %01010101
608   defb %01010101
609   defb %00000000
610   ; N
611   defb %00000000
612   defb %01100110
613   defb %01010101
614   defb %01010101
615   defb %01010101
616   defb %01010101
617   defb %01010101
618   defb %00000000
619   ; O
620   defb %00000000
621   defb %00100010
622   defb %01010101
623   defb %01010101
624   defb %01010101
625   defb %01010101
626   defb %00100010
627   defb %00000000
628   ; P
629   defb %00000000
630   defb %01100110
631   defb %01010101
632   defb %01010101
633   defb %01100110
634   defb %01000100
635   defb %01000100
636   defb %00000000
637   ; Q
638   defb %00000000
639   defb %00100010
640   defb %01010101
641   defb %01010101
642   defb %01010101
643   defb %01010101
644   defb %00100010
645   defb %00010001
646   ; R
647   defb %00000000
648   defb %01100110
649   defb %01010101
650   defb %01010101
651   defb %01100110
652   defb %01010101
653   defb %01010101
654   defb %00000000
655   ; S
656   defb %00000000
657   defb %00110011
658   defb %01000100
659   defb %00100010
660   defb %00010001
661   defb %00010001
662   defb %01100110
663   defb %00000000
664   ; T
665   defb %00000000
666   defb %01110111
667   defb %00100010
668   defb %00100010
669   defb %00100010
670   defb %00100010
671   defb %00100010
672   defb %00000000
673   ; U
674   defb %00000000
675   defb %01010101
676   defb %01010101
677   defb %01010101
678   defb %01010101
679   defb %01010101
680   defb %00100010
681   defb %00000000
682   ; V
683   defb %00000000
684   defb %01010101
685   defb %01010101
686   defb %01010101
687   defb %01010101
688   defb %01100110
689   defb %01000100
690   defb %00000000
691   ; W
692   defb %00000000
693   defb %01010101
694   defb %01010101
695   defb %01110111
696   defb %01110111
697   defb %01110111
698   defb %01010101
699   defb %00000000
700   ; X
701   defb %00000000
702   defb %01010101
703   defb %01010101
704   defb %00100010
705   defb %00100010
706   defb %01010101
707   defb %01010101
708   defb %00000000
709   ; Y
710   defb %00000000
711   defb %01010101
712   defb %01010101
713   defb %01010101
714   defb %00100010
715   defb %00100010
716   defb %00100010
717   defb %00000000
718   ; Z
719   defb %00000000
720   defb %01110111
721   defb %00010001
722   defb %00100010
723   defb %00100010
724   defb %01000100
725   defb %01110111
726   defb %00000000
727   ; [
728   defb %00000000
729   defb %01110111
730   defb %01000100
731   defb %01000100
732   defb %01000100
733   defb %01000100
734   defb %01110111
735   defb %00000000
736   ; \
737   defb %00000000
738   defb %01000100
739   defb %01000100
740   defb %00100010
741   defb %00100010
742   defb %00010001
743   defb %00010001
744   defb %00000000
745   ; ]
746   defb %00000000
747   defb %01110111
748   defb %00010001
749   defb %00010001
750   defb %00010001
751   defb %00010001
752   defb %01110111
753   defb %00000000
754   ; ^
755   defb %00000000
756   defb %00100010
757   defb %01010101
758   defb %00000000
759   defb %00000000
760   defb %00000000
761   defb %00000000
762   defb %00000000
763   ; _
764   defb %00000000
765   defb %00000000
766   defb %00000000
767   defb %00000000
768   defb %00000000
769   defb %00000000
770   defb %00000000
771   defb %11111111
772   ; `
773   defb %00000000
774   defb %00100010
775   defb %01010101
776   defb %01000100
777   defb %01100110
778   defb %01000100
779   defb %01110111
780   defb %00000000
781   ; a
782   defb %00000000
783   defb %00000000
784   defb %00000000
785   defb %00110011
786   defb %01010101
787   defb %01010101
788   defb %00110011
789   defb %00000000
790   ; b
791   defb %00000000
792   defb %01000100
793   defb %01000100
794   defb %01100110
795   defb %01010101
796   defb %01010101
797   defb %01100110
798   defb %00000000
799   ; c
800   defb %00000000
801   defb %00000000
802   defb %00000000
803   defb %00110011
804   defb %01000100
805   defb %01000100
806   defb %00110011
807   defb %00000000
808   ; d
809   defb %00000000
810   defb %00010001
811   defb %00010001
812   defb %00110011
813   defb %01010101
814   defb %01010101
815   defb %00110011
816   defb %00000000
817   ; e
818   defb %00000000
819   defb %00000000
820   defb %00000000
821   defb %00100010
822   defb %01010101
823   defb %01100110
824   defb %00110011
825   defb %00000000
826   ; f
827   defb %00000000
828   defb %00010001
829   defb %00100010
830   defb %01110111
831   defb %00100010
832   defb %00100010
833   defb %00100010
834   defb %00000000
835   ; g
836   defb %00000000
837   defb %00000000
838   defb %00000000
839   defb %00110011
840   defb %01010101
841   defb %00110011
842   defb %00010001
843   defb %01100110
844   ; h
845   defb %00000000
846   defb %01000100
847   defb %01000100
848   defb %01100110
849   defb %01010101
850   defb %01010101
851   defb %01010101
852   defb %00000000
853   ; i
854   defb %00000000
855   defb %00100010
856   defb %00000000
857   defb %00100010
858   defb %00100010
859   defb %00100010
860   defb %00100010
861   defb %00000000
862   ; j
863   defb %00000000
864   defb %00010001
865   defb %00000000
866   defb %00010001
867   defb %00010001
868   defb %00010001
869   defb %00010001
870   defb %01100110
871   ; k
872   defb %00000000
873   defb %01000100
874   defb %01000100
875   defb %01010101
876   defb %01100110
877   defb %01100110
878   defb %01010101
879   defb %00000000
880   ; l
881   defb %00000000
882   defb %01100110
883   defb %00100010
884   defb %00100010
885   defb %00100010
886   defb %00100010
887   defb %00100010
888   defb %00000000
889   ; m
890   defb %00000000
891   defb %00000000
892   defb %00000000
893   defb %01010101
894   defb %01110111
895   defb %01110111
896   defb %01010101
897   defb %00000000
898   ; n
899   defb %00000000
900   defb %00000000
901   defb %00000000
902   defb %01100110
903   defb %01010101
904   defb %01010101
905   defb %01010101
906   defb %00000000
907   ; o
908   defb %00000000
909   defb %00000000
910   defb %00000000
911   defb %00100010
912   defb %01010101
913   defb %01010101
914   defb %00100010
915   defb %00000000
916   ; p
917   defb %00000000
918   defb %00000000
919   defb %00000000
920   defb %01100110
921   defb %01010101
922   defb %01010101
923   defb %01100110
924   defb %01000100
925   ; q
926   defb %00000000
927   defb %00000000
928   defb %00000000
929   defb %00110011
930   defb %01010101
931   defb %01010101
932   defb %00110011
933   defb %00010001
934   ; r
935   defb %00000000
936   defb %00000000
937   defb %00000000
938   defb %01010101
939   defb %01100110
940   defb %01000100
941   defb %01000100
942   defb %00000000
943   ; s
944   defb %00000000
945   defb %00000000
946   defb %00000000
947   defb %00110011
948   defb %01100110
949   defb %00110011
950   defb %01100110
951   defb %00000000
952   ; t
953   defb %00000000
954   defb %00100010
955   defb %00100010
956   defb %01110111
957   defb %00100010
958   defb %00100010
959   defb %00100010
960   defb %00000000
961   ; u
962   defb %00000000
963   defb %00000000
964   defb %00000000
965   defb %01010101
966   defb %01010101
967   defb %01010101
968   defb %00110011
969   defb %00000000
970   ; v
971   defb %00000000
972   defb %00000000
973   defb %00000000
974   defb %01010101
975   defb %01010101
976   defb %01100110
977   defb %01000100
978   defb %00000000
979   ; w
980   defb %00000000
981   defb %00000000
982   defb %00000000
983   defb %01010101
984   defb %01110111
985   defb %01110111
986   defb %01010101
987   defb %00000000
988   ; x
989   defb %00000000
990   defb %00000000
991   defb %00000000
992   defb %01010101
993   defb %00100010
994   defb %00100010
995   defb %01010101
996   defb %00000000
997   ; y
998   defb %00000000
999   defb %00000000
1000   defb %00000000
1001   defb %01010101
1002   defb %01010101
1003   defb %00110011
1004   defb %00010001
1005   defb %01100110
1006   ; z
1007   defb %00000000
1008   defb %00000000
1009   defb %00000000
1010   defb %01110111
1011   defb %00100010
1012   defb %01000100
1013   defb %01110111
1014   defb %00000000
1015   ; {
1016   defb %00000000
1017   defb %00010001
1018   defb %00100010
1019   defb %00100010
1020   defb %01000100
1021   defb %00100010
1022   defb %00100010
1023   defb %00010001
1024   ; |
1025   defb %00000000
1026   defb %00100010
1027   defb %00100010
1028   defb %00100010
1029   defb %00100010
1030   defb %00100010
1031   defb %00100010
1032   defb %00100010
1033   ; }
1034   defb %00000000
1035   defb %01000100
1036   defb %00100010
1037   defb %00100010
1038   defb %00010001
1039   defb %00100010
1040   defb %00100010
1041   defb %01000100
1042   ; ~
1043   defb %00000000
1044   defb %01010101
1045   defb %10101010
1046   defb %00000000
1047   defb %00000000
1048   defb %00000000
1049   defb %00000000
1050   defb %00000000
1051   ; (c)
1052   defb %01100110
1053   defb %10011001
1054   defb %11111111
1055   defb %11011101
1056   defb %11111111
1057   defb %10011001
1058   defb %01100110
1059   defb %00000000