initial commit
[zxkeybtest] / testrom.asm
1 ; vi:filetype=z80:
2 fb_addr equ $4000
3 attr_addr equ $5800
4 ula_port equ $fe
5
6 main:
7         call init
8         ld c, 16
9         ld b, 12
10         call calc_cell_addr
11         ld a, 'F'
12         call putchar
13         inc de
14         ld a, 'O'
15         call putchar
16         inc de
17         ld a, 'O'
18         call putchar
19
20 .looptop:
21         jr .looptop
22
23 init:
24         ; setup attributes
25         ld hl, attr_addr
26         ld a, $47
27         ld b, 24
28 .attry: ld c, 32
29 .attrx: ld (hl), a
30         inc hl
31         dec c
32         jr nz, .attrx
33         dec b
34         jr nz, .attry
35
36         ; clear screen
37         ld hl, fb_addr
38         xor a
39         ld b, 192
40 .clry:  ld c, 32
41 .clrx:  ld (hl), a
42         inc hl
43         dec c
44         jr nz, .clrx
45         dec b
46         jr nz, .clry
47
48         ; set border
49         out (ula_port), a
50         
51         ret
52
53 ; expects X -> c, Y -> b, returns in de
54 calc_cell_addr:
55         push af
56         sla b
57         sla b           ; change from blocks to pixels
58         sla b
59         ; construct low address byte -> e
60         ld a, b         ; start with Y
61         sla a
62         sla a
63         and $e0         ; keep top 3 bits
64         ld e, a         ; move into e
65         ld a, c         ; a <- X
66         and $1f         ; keep low 5 bits
67         or e            ; combine with Y bits
68         ld e, a         ; move the result back to e
69         ; construct high address byte -> d
70         ld a, b         ; start with Y again
71         sra a
72         sra a
73         sra a
74         and $18         ; keep bits 3 and 4
75         ld d, a         ; keep it in d
76         ld a, b         ; grap Y one more time
77         and $7          ; keep low 3 bits of Y in a
78         or d            ; combine with Y6-Y7
79         ld bc, fb_addr
80         or b            ; combine with high byte of fb address
81         ld d, a         ; move result back to d
82         pop af
83         ret
84
85
86         ; de: dest
87         ; a: char
88 putchar:
89         sub 'A'
90         ret c
91         cp 27
92         ret nc
93         push de
94         sla a
95         sla a
96         sla a
97         ld h, 0
98         ld l, a
99         ld bc, glyph_a
100         add hl, bc
101         ld c, 8
102 .chartop:
103         ld a, (hl)
104         ld (de), a
105         inc d
106         inc hl
107         dec c
108         jr nz, .chartop
109         pop de
110         ret
111
112         include glyphs.inc