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