initial commit
[zxtris] / src / zxtris.asm
1 ; vi:filetype=z80:
2         section code,"c"
3
4         include defs.inc
5
6 main:
7         call init
8
9         ld hl, FB_ADDR + 25
10         call draw_logo
11         call drawbg
12
13 .mainloop:
14         jr .mainloop
15
16 init:
17         ; setup attributes
18         ld hl, ATTR_ADDR
19         ld a, $47
20         ld b, 24
21 .attry: ld c, 32
22 .attrx: ld (hl), a
23         inc hl
24         dec c
25         jr nz, .attrx
26         dec b
27         jr nz, .attry
28
29         ; clear screen
30         ld hl, FB_ADDR
31         xor a
32         ld b, 192
33 .clry:  ld c, 32
34 .clrx:  ld (hl), a
35         inc hl
36         dec c
37         jr nz, .clrx
38         dec b
39         jr nz, .clry
40
41         ; set border
42         out (ULA_PORT), a
43         
44         ret
45
46 ; expects X -> c, Y -> b, returns in de
47 calc_cell_addr:
48         push af
49         sla b
50         sla b           ; change from blocks to pixels
51         sla b
52         ; construct low address byte -> e
53         ld a, b         ; start with Y
54         sla a
55         sla a
56         and $e0         ; keep top 3 bits
57         ld e, a         ; move into e
58         ld a, c         ; a <- X
59         and $1f         ; keep low 5 bits
60         or e            ; combine with Y bits
61         ld e, a         ; move the result back to e
62         ; construct high address byte -> d
63         ld a, b         ; start with Y again
64         sra a
65         sra a
66         sra a
67         and $18         ; keep bits 3 and 4
68         ld d, a         ; keep it in d
69         ld a, b         ; grap Y one more time
70         and $7          ; keep low 3 bits of Y in a
71         or d            ; combine with Y6-Y7
72         ld bc, FB_ADDR
73         or b            ; combine with high byte of fb address
74         ld d, a         ; move result back to d
75         pop af
76         ret
77
78         ; hl: dest
79 draw_logo:
80         push hl
81         ld de, logo
82         ld b, 16
83 .logoy: ld c, 7
84         push bc
85 .logox: ld a, (de)
86         ld (hl), a
87         inc de
88         inc l
89         dec c
90         jr nz, .logox
91         ld bc, 7
92         sbc hl, bc
93         inc h
94
95         ld a, h
96         and $e7
97         ld h, a 
98         and $7
99         jr nz, .skipinc
100         ld a, l
101         add $20
102         ld l, a
103 .skipinc:
104         pop bc
105         dec b
106         jr nz, .logoy
107         pop hl
108
109         ; attr
110         ld a, h
111         srl a
112         srl a
113         srl a
114         or $58
115         ld h, a
116         ld a, $42
117
118         push hl
119         pop ix
120         ld b, 7
121 .sattr: ld (ix), a
122         ld (ix + 32), a
123         inc ix
124         dec b
125         jr nz, .sattr
126         ret
127
128         ; de: dest
129         ; a: char
130 putchar:
131         ; is it a digit?
132         sub '0'
133         ret c
134         cp 11
135         jr nc, .notdigit
136         push bc
137         ld bc, glyph_0
138         jr .common
139 .notdigit:
140         ; is it A-Z ?
141         sub 'A'-'0'
142         ret c
143         cp 30
144         ret nc
145         push bc
146         ld bc, glyph_a
147 .common:
148         push de
149         push hl
150         sla a
151         sla a
152         sla a
153         ld h, 0
154         ld l, a
155         add hl, bc
156         ld c, 8
157 .chartop:
158         ld a, (hl)
159         ld (de), a
160         inc d
161         inc hl
162         dec c
163         jr nz, .chartop
164         pop hl
165         pop de
166         pop bc
167         ret
168
169         ; de: dest
170         ; hl: str
171 putstr:
172         push de
173         push bc
174 .loop:  xor a
175         ld b, (hl)
176         cp b
177         jr z, .done
178         ld a, b
179         call putchar
180         inc hl
181         inc e
182         jr .loop
183 .done:  pop bc
184         pop de
185         ret
186
187         ; de: dest
188         ; a: number
189 putbin8:
190         push de
191         push bc
192         ld b, 8
193 .loop:  rlca
194         push af
195         and 1
196         add '0'
197         call putchar
198         pop af
199         inc e
200         dec b
201         jr nz, .loop
202         pop bc
203         pop de
204         ret
205
206 putbin5:
207         push de
208         push bc
209         ld b, 5
210         rlca
211         rlca
212         rlca
213         jr putbin8.loop
214
215         ; hl: string
216         ; return -> a
217 strlen:
218         push hl
219         xor a
220         ld b, a
221 .loop:  cp (hl)
222         jr z, .done
223         inc hl
224         inc b
225         jr .loop
226 .done:  ld a, b
227         pop hl
228         ret
229
230         include glyphs.inc
231         include logo.inc
232         include tiles.inc