ALU8IMM
[fpgaboy.git] / diag.asm
CommitLineData
5bac4cf0
JW
1 SECTION "a",HOME
2
3main:
4 ld c, $51 ; Note that we are alive.
5 ld a, $FF
6 ld [c],a
7
8 ld sp, $DFF0
9
30ef1ae0
JW
10 ld c, $07
11 ld a, $04 ;start timer, 4.096KHz
12 ld [c], a
13
14 ld hl, $DF81
15 xor a
16 ld [hl], a
17
5bac4cf0
JW
18 ld hl, signon
19 call puts
30ef1ae0
JW
20
21 ei
5bac4cf0
JW
22
23 call memtest
24
25 call insntest
26
27 call waitsw
30ef1ae0
JW
28
29 di
5bac4cf0
JW
30
31 jr main
32
33signon:
34 db $0D,$0A,$1B,"[1mFPGABoy Diagnostic ROM",$1B,"[0m",$0D,$0A,0
35
30ef1ae0
JW
36 section "fuq",HOME[$100]
37irqhand:
38 PUSH AF
39 PUSH BC
40 PUSH DE
41 PUSH HL
42
43 xor a
44 ld c, $0F ; ack the irq
45 ld [c], a
46
47 ld a, $41 ; print A
48 call putc
49
50 ld hl, $DF81
51 ld a, [hl]
f888201b 52 add 1
30ef1ae0
JW
53 ld c, $51
54 ld [c], a
55 ld [hl], a
56
30ef1ae0
JW
57 POP HL
58 POP DE
59 POP BC
60 POP AF
61 RETI
30ef1ae0 62
5bac4cf0
JW
63; Memory tester: writes h ^ l to all addresses from C000 to DF80.
64memtest:
65 ld hl,memteststr
66 call puts
67
68 ld hl, $C001 ; Write loop
69.wr:
70 ld a,h
71 xor l
72 ld [hli],a
f888201b
JW
73 ld a, h
74 cp $DF
5bac4cf0 75 jr nz, .wr
f888201b
JW
76 ld a, l
77 cp $80
5bac4cf0
JW
78 jr nz, .wr
79
80 ld hl, $C001 ; Read loop
81.rd:
82 ld a,h
83 xor l
84 ld b,a
85 ld a, [hli]
86 cp b
87 jr nz, .memfail
88
f888201b
JW
89 ld a, h
90 cp $DF
5bac4cf0 91 jr nz, .rd
f888201b
JW
92 ld a, l
93 cp $80
5bac4cf0
JW
94 jr nz, .rd
95
96 ld hl, testokstr ; Say we're OK
97 call puts
98 ret
99.memfail: ; Say we failed (sadface)
100 ; decrement hl the easy way
101 ld a,[hld]
102 push hl
103 ld hl, failatstr
104 call puts
105 pop hl
106 ld a, h
107 call puthex
108 ld a, l
109 call puthex
110 ld a, $0A
111 call putc
112 ld a, $0D
113 call putc
114 ret
115memteststr:
116 db "Testing memory from $C000 to $DF80...",0
117testokstr:
118 db " OK!",$0D,$0A,0
119failatstr:
120 db " Test failed at $",0
121
122puthex: ; Put two hex nibbles to the serial console.
123 push af
124 rra
125 rra
126 rra
127 rra
f888201b
JW
128 and $0F
129 add $30
5bac4cf0
JW
130 call putc
131 pop af
f888201b
JW
132 and $0F
133 add $30
5bac4cf0
JW
134 call putc
135 ret
136
137; Wait for switches to be flipped on and off again.
138waitsw:
139 ld hl,waitswstr
140 call puts
141
142 ld c, $51
143 xor a
144 ld [c],a
145
5bac4cf0
JW
146.loop1:
147 ld a,[c]
f888201b 148 cp $0
5bac4cf0
JW
149 jr z,.loop1
150.loop2:
151 ld a,[c]
f888201b 152 cp $0
5bac4cf0
JW
153 jr nz,.loop2
154 ret
155
156waitswstr:
157 db "Diagnostic ROM complete; flip switches to nonzero and then to zero to reset. Expect A.",$0D,$0A,0
158
159; Core instruction basic acceptance tests.
160insntest:
161 ld hl, .insnteststr
162 call puts
163
164 ; Test PUSH and POP.
165 ld b, $12
166 ld c, $34
167 ld d, $56
168 ld e, $78
169 push bc
170 pop de
171 ld hl, .pushpopfail
172 ld a, d
173 cp b
174 jr nz,.fail
175 ld a, e
176 cp c
177 jr nz,.fail
178
179 ; Test ALU (HL).
180 ld hl, .ff
181 ld a, $FF
182 xor [hl]
183 ld hl, .xorhlfail
184 jr nz, .fail
185
186 ; Test JP (HL)
187 ld hl, .jphl
188 jp [hl]
189 ld hl, .jphlfail
190 jr .fail
191 rst $00
192.jphl:
193
194 ; Test JR
195 ld a, $FF
f888201b 196 cp $0
5bac4cf0
JW
197 jr nz,.jr
198 ld hl, .jrfail
199 jr .fail
200 rst $00
201.jr:
202
203 ; Test inc16
204 ld d, $12
205 ld e, $FF
206 ld hl, .inc16fail
207 inc de
208 ld a, $13
209 cp d
210 jr nz, .fail
211 ld a, $00
212 cp e
213 jr nz, .fail
214
215 ; Test CP.
216 ld hl, .cpfail
217 ld a, $10
f888201b 218 cp $20
5bac4cf0
JW
219 jr nc,.fail
220 ld a, $20
f888201b 221 cp $10
5bac4cf0
JW
222 jr c,.fail
223
224 ; Test CPL
225 ld hl, .cplfail
226 ld a, $55
5bac4cf0 227 cpl
f888201b 228 cp $AA
5bac4cf0
JW
229 jr nz,.fail
230
231 ld hl, .ok
232 call puts
233 ret
234.fail:
235 call puts
236 ld hl, .testfailed
237 call puts
238 ret
239.insnteststr:
240 db "Testing instructions... ",0
241.pushpopfail:
242 db "PUSH/POP",0
243.ff:
244 db $FF
245.xorhlfail:
246 db "XOR [HL]",0
247.jphlfail:
248 db "JP [HL]",0
249.jrfail:
250 db "JR",0
251.cpfail:
252 db "CP",0
253.cplfail:
254 db "CPL",0
255.inc16fail:
256 db "INC16",0
257.testfailed:
258 db " test failed.",$0D,$0A,0
259.ok:
260 db "OK!",$0D,$0A,0
261
262; Serial port manipulation functions.
263putc:
5bac4cf0
JW
264 ld c, $50
265 push af
266.waitport:
267 ld a,[c]
f888201b 268 cp $00
5bac4cf0
JW
269 jr nz,.waitport
270 pop af
271 ld [c],a
272 ret
273
274puts:
275 ld a, [hli]
f888201b 276 cp $00
5bac4cf0
JW
277 ret z
278 call putc
279 jr puts
This page took 0.043062 seconds and 4 git commands to generate.