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