added numbers and logo
[zxkeybtest] / testrom.asm
1 ; vi:filetype=z80:
2 fb_addr equ $4000
3 attr_addr equ $5800
4 ula_port equ $fe
5
6
7 main:
8         call init
9
10         ld hl, fb_addr + 25
11         call draw_logo
12
13         ld c, 4
14         ld b, 12
15         call calc_cell_addr
16         ld hl, str_foobar
17         call putstr
18
19 .looptop:
20         jr .looptop
21
22 init:
23         ; setup attributes
24         ld hl, attr_addr
25         ld a, $47
26         ld b, 24
27 .attry: ld c, 32
28 .attrx: ld (hl), a
29         inc hl
30         dec c
31         jr nz, .attrx
32         dec b
33         jr nz, .attry
34
35         ; clear screen
36         ld hl, fb_addr
37         xor a
38         ld b, 192
39 .clry:  ld c, 32
40 .clrx:  ld (hl), a
41         inc hl
42         dec c
43         jr nz, .clrx
44         dec b
45         jr nz, .clry
46
47         ; set border
48         out (ula_port), a
49         
50         ret
51
52 ; expects X -> c, Y -> b, returns in de
53 calc_cell_addr:
54         push af
55         sla b
56         sla b           ; change from blocks to pixels
57         sla b
58         ; construct low address byte -> e
59         ld a, b         ; start with Y
60         sla a
61         sla a
62         and $e0         ; keep top 3 bits
63         ld e, a         ; move into e
64         ld a, c         ; a <- X
65         and $1f         ; keep low 5 bits
66         or e            ; combine with Y bits
67         ld e, a         ; move the result back to e
68         ; construct high address byte -> d
69         ld a, b         ; start with Y again
70         sra a
71         sra a
72         sra a
73         and $18         ; keep bits 3 and 4
74         ld d, a         ; keep it in d
75         ld a, b         ; grap Y one more time
76         and $7          ; keep low 3 bits of Y in a
77         or d            ; combine with Y6-Y7
78         ld bc, fb_addr
79         or b            ; combine with high byte of fb address
80         ld d, a         ; move result back to d
81         pop af
82         ret
83
84         ; hl: dest
85 draw_logo:
86         ld de, logo
87         ld b, 16
88 .logoy: ld c, 7
89         push bc
90 .logox: ld a, (de)
91         ld (hl), a
92         inc de
93         inc l
94         dec c
95         jr nz, .logox
96         ld bc, 7
97         sbc hl, bc
98         inc h
99
100         ld a, h
101         and $e7
102         ld h, a 
103         and $7
104         jr nz, .skipinc
105         ld a, l
106         add $20
107         ld l, a
108 .skipinc:
109         pop bc
110         dec b
111         jr nz, .logoy
112         ret
113
114         ; de: dest
115         ; a: char
116 putchar:
117         ; is it a digit?
118         ld bc, glyph_0
119         sub '0'
120         ret c
121         cp 10
122         jr c, .common
123         ; is it A-Z ?
124         sub 'A'-'0'
125         ret c
126         cp 27
127         ret nc
128         ld bc, glyph_a
129 .common:
130         push de
131         push hl
132         sla a
133         sla a
134         sla a
135         ld h, 0
136         ld l, a
137         add hl, bc
138         ld c, 8
139 .chartop:
140         ld a, (hl)
141         ld (de), a
142         inc d
143         inc hl
144         dec c
145         jr nz, .chartop
146         pop hl
147         pop de
148         ret
149
150         ; de: dest
151         ; hl: str
152 putstr:
153         xor a
154         ld b, (hl)
155         cp b
156         jr z, .done
157         ld a, b
158         call putchar
159         inc hl
160         inc de
161         jr putstr
162 .done:  ret
163
164         ; de: dest
165         ; a: number
166 putbin8:
167         ld b, 8
168
169
170 str_foobar asciiz 'FOOBAR 1234567890'
171
172         include glyphs.inc
173         include logo.inc