added a way to extend command list without adding custom code to asm module
[bz80asm.git] / output_driver_4x8.zas
blob8a052b535fceb003c009f238c2a5424e39535f43
1 emitXY defw 0
3 emitInit:
4   ld    hl,#4000
5   ld    de,#4001
6   ld    bc,#17FF
7   ld    (hl),l
8   ldir
9   ld    a,64
10   ld    (WIDTH),a
11   ret
14 ; A: code
15 ; should preserve registers (except A and F)
16 OSWRCH:
17   cp    10
18   ret   z
19   push  bc,de,hl
20   cp    13
21   jr    z,.docr
22   cp    32
23   jr    nc,.oklow
24   ld    a,'?'
25 .oklow:
26   cp    128
27   jr    c,.okhigh
28   ld    a,'?'
29 .okhigh:
30   ld    (.charcode),a
31   ld    de,(emitXY)
32   ld    a,e
33   ; check if we need to wrap
34   cp    64
35   jr    c,.nowrap
36   ; need to wrap (and maybe scroll)
37   ld    e,0
38   inc   d
39   ld    a,d
40   cp    24
41   jr    c,.noscroll
42   ; need to scroll
43   ld    d,23
44   push  de
45   ld    b,24
46   call  #0E00
47   pop   de
48 .noscroll:
49   ld    a,e
50 .nowrap:
51   push  af
52   inc   e
53   ld    (emitXY),de
54   srl   a
55   ld    e,a
56   ; d: y
57   ; e: x
58   ld    a,d
59   and   #18
60   or    #40
61   ld    h,a
62   ld    a,d
63   rrca
64   rrca
65   rrca
66   and   #E0
67   or    e
68   ld    l,a
69   ; hl: screen address
70   ; setup mask
71   pop   af
72   and   #01
73   ld    a,#F0
74   jr    z,.maskok
75   cpl
76 .maskok:
77   ld    (.fontmask),a
78   cpl
79   ld    (.scrmask),a
80   ex    de,hl
81   ld    l,0     ; patched above
82 .charcode equ $-1
83   ld    h,0
84   add   hl,hl
85   add   hl,hl
86   add   hl,hl
87   push  de
88   ld    de,font4x8-32*8
89   add   hl,de
90   pop   de
91   ; de: scr$
92   ; hl: font
93   ld    b,8
94 .charloop:
95   ld    a,(de)
96   and   #00     ; patched above
97 .scrmask equ $-1
98   ld    c,a
99   ld    a,(hl)
100   and   #00     ; patched above
101 .fontmask equ $-1
102   or    c
103   ld    (de),a
104   inc   d
105   inc   hl
106   djnz  .charloop
107 .exit:
108   pop   hl,de,bc
109   ret
111 .docr:
112   ; this actually moves cursor to (64,n), if it is not there
113   ; otherwise, moves down a line, and scroll
114   ld    hl,(emitXY)
115   ld    a,l
116   cp    64
117   jr    nc,.dorealcr
118   ; put cursor to (64,n)
119   ld    l,64
120   ld    (emitXY),hl
121   jr    .exit
122 .dorealcr:
123   ; must do real newline here
124   ld    l,0
125   inc   h
126   ld    (emitXY),hl
127   ld    a,h
128   cp    24
129   jr    c,.exit
130   ld    h,23
131   ld    (emitXY),hl
132   ; scroll screen
133   ld    b,24
134   call  #0E00
135   jr    .exit
137   include "font4x8.zas"