]> Joshua Wise's Git repositories - fpgaboy.git/blob - diag.asm
Dual bus processor
[fpgaboy.git] / diag.asm
1         section "end",HOME[1024]
2         nop
3
4         SECTION "a",HOME[$00]
5
6 start: 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
17 main:
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         ld a, $91
37         ld [$FF40], a
38
39         call putscreen
40         
41         ei
42
43         call memtest
44
45         call insntest
46
47         call waitsw
48         
49         di
50
51         jr main
52
53 signon:
54         db $0D,$0A,$1B,"[1mFPGABoy Diagnostic ROM",$1B,"[0m",$0D,$0A,0
55
56 tiles:
57         db %01111100
58         db %11000110
59         db %11000110
60         db %11111110
61         db %11000110
62         db %11000110
63         db %11000110
64         db %00000000
65         
66         db %11111100
67         db %11000110
68         db %11000110
69         db %11111100
70         db %11000110
71         db %11000110
72         db %11111100
73         db %00000000
74
75         db %01111100
76         db %11000110
77         db %11000010
78         db %11000000
79         db %11000010
80         db %11000110
81         db %01111100
82         db %00000000
83
84         db %11111100
85         db %11000110
86         db %11000110
87         db %11000110
88         db %11000110
89         db %11000110
90         db %11111100
91         db %00000000
92
93 putscreen:
94         LD A,$fc                ; $001d  Setup BG palette
95         LD [$FF47],A    ; $001f
96
97         ; Wait for vblank
98         call .vblwait
99
100         ld hl, $8000    ; Copy two tiles.
101         ld de, tiles
102         ld c, $20
103 .cloop: ld a, [de]
104         inc de
105         ld [hli], a
106         ld [hli], a
107         dec c
108         xor a
109         cp c
110         jr nz, .cloop
111         
112         ld hl, $9800
113 .vloop: call .vblwait
114         ld c, $40
115         ld b, 0
116 .loop:  ld a, b
117         inc b
118         and $03
119         ld [hli], a
120         ld a, h
121         cp $9C
122         ret z
123         dec c
124         xor a
125         cp c
126         jr nz,.loop
127         jr .vloop
128
129 .vblwait:
130 .stat1: ld a, [$FF41]   ; STAT
131         and $03
132         cp $00
133         jp nz, .stat1
134 .stat2: ld a, [$FF41]
135         and $03
136         cp $01
137         jr nz, .stat2
138         ret
139
140 vbl:
141         PUSH AF
142         PUSH BC
143         PUSH DE
144         PUSH HL
145         
146         xor a
147         ld [$FF0F], a
148
149         ld a, [$FF51]
150         bit 7, a
151         jr z, .nothing
152
153         bit 0, a
154         call nz, .scyup
155         
156         bit 1, a
157         call nz, .scydown
158         
159         bit 2, a
160         call nz, .scxup
161         
162         bit 3, a
163         call nz, .scxdown
164
165 .nothing:
166         POP HL
167         POP DE
168         POP BC
169         POP AF
170
171         RETI
172
173 .scyup: ld hl, $FF42
174         inc [hl]
175         ret
176
177 .scydown:       ld hl, $FF42
178         dec [hl]
179         ret
180
181 .scxup: ld hl, $FF43
182         inc [hl]
183         ret
184
185 .scxdown:       ld hl, $FF43
186         dec [hl]
187         ret     
188         
189
190 lcdc:
191         PUSH AF
192         PUSH BC
193         
194         xor a
195         ld [$FF0F], a
196         
197         POP BC
198         POP AF
199         
200         reti
201         
202 tmro:
203         PUSH AF
204         PUSH BC
205         PUSH DE
206         PUSH HL
207         
208         xor a
209         ld [$FF0F], a
210         
211         ld c, $45       ; LYC
212         ld a, [c]
213         inc a
214         ld [c], a
215         
216         ld a, [$DF82]
217         cp 0
218         jr z, .noprint
219         ld a, $41       ; print A
220         call putc
221 .noprint:
222         ld a, [$DF81]
223         inc a
224         ld [$DF81], a
225         ld [$FF51], a
226
227         POP HL
228         POP DE
229         POP BC
230         POP AF
231         RETI
232
233 ; Memory tester: writes h ^ l to all addresses from C000 to DF80.
234 memtest:
235         ld hl,memteststr
236         call puts
237         
238         ld hl, $C000            ; Write loop
239 .wr:
240         ld a,h
241         xor l
242         ld [hli],a
243         ld a, h
244         cp $DF
245         jr nz, .wr
246         ld a, l
247         cp $80
248         jr nz, .wr
249
250         ld hl, $C000            ; Read loop
251 .rd:
252         ld a,h
253         xor l
254         ld b,a
255         ld a, [hli]
256         cp b
257         jr nz, .memfail
258         
259         ld a, h
260         cp $DF
261         jr nz, .rd
262         ld a, l
263         cp $80
264         jr nz, .rd
265         
266         ld hl, testokstr        ; Say we're OK
267         call puts
268         ret
269 .memfail:                       ; Say we failed (sadface)
270         ; decrement hl the easy way
271         dec [hl]
272         push hl
273         ld hl, failatstr
274         call puts
275         pop hl
276         ld a, h
277         call puthex
278         ld a, l
279         call puthex
280         ld a, $0A
281         call putc
282         ld a, $0D
283         call putc
284         ret
285 memteststr:
286         db "Testing memory from $C000 to $DF80...",0
287 testokstr:
288         db " OK!",$0D,$0A,0
289 failatstr:
290         db " Test failed at $",0
291
292 puthex:                         ; Put two hex nibbles to the serial console.
293         push af
294         rra
295         rra
296         rra
297         rra
298         and $0F
299         add $30
300         call putc
301         pop af
302         and $0F
303         add $30
304         call putc
305         ret
306
307 ; Wait for switches to be flipped on and off again.
308 waitsw:
309         ld hl,waitswstr
310         call puts
311         
312         ld hl,$DF82
313         ld a, 1
314         ld [hl], a
315
316         ld c, $51
317         xor a
318         ld [c],a
319         
320 .loop1:
321         ld a,[c]
322         cp $0
323         jr z,.loop1
324
325 .loop2: ld a,[c]
326         cp $0
327         jr nz,.loop2
328         ret
329
330 waitswstr:
331         db "Diagnostic ROM complete; flip switches to nonzero and then to zero to reset. Expect A.",$0D,$0A,0
332
333 ; Core instruction basic acceptance tests.
334 insntest:
335         ld hl, .insnteststr
336         call puts
337         
338         ; Test PUSH and POP.
339         ld b, $12
340         ld c, $34
341         ld d, $56
342         ld e, $78
343         push bc
344         pop de
345         ld hl, .pushpopfail
346         ld a, d
347         cp b
348         jr nz,.fail
349         ld a, e
350         cp c
351         jr nz,.fail
352         
353         ; Test ALU (HL).
354         ld hl, .ff
355         ld a, $FF
356         xor [hl]
357         ld hl, .xorhlfail
358         jr nz, .fail
359         
360         ; Test JP (HL)
361         ld hl, .jphl
362         jp [hl]
363         ld hl, .jphlfail
364         jr .fail
365         rst $00
366 .jphl:
367
368         ; Test JR
369         ld a, $FF
370         cp $0
371         jr nz,.jr
372         ld hl, .jrfail
373         jr .fail
374         rst $00
375 .jr:
376
377         ; Test inc16
378         ld d, $12
379         ld e, $FF
380         ld hl, .inc16fail
381         inc de
382         ld a, $13
383         cp d
384         jr nz, .fail
385         ld a, $00
386         cp e
387         jr nz, .fail
388         
389         ; Test CP.
390         ld hl, .cpfail
391         ld a, $10
392         cp $20
393         jr nc,.fail
394         ld a, $20
395         cp $10
396         jr c,.fail
397         
398         ; Test CPL
399         ld hl, .cplfail
400         ld a, $55
401         cpl
402         cp $AA
403         jr nz,.fail
404
405         ; Test DI/EI delay
406         di
407         ld hl, .dinocausefail
408         ld c, $0F       ; First, wait until an interrupt happens...
409 .wait:  ld a, [c]
410         and $04
411         cp 0
412         jr z, .wait
413         ei              ; Now make sure that an IRQ didn't happen on EI/DI
414         di
415         ld a, [c]
416         and $04
417         cp 0
418         jr z, .fail
419         ld hl, .dicausefail
420         ei              ; Make sure that an IRQ does happen on EI/NOP/DI
421         nop
422         nop
423         di
424         ld a, [c]
425         and $04
426         cp 0
427         jr nz, .fail
428         ei
429         
430         ld hl, .ok
431         call puts
432         ret
433 .fail:
434         ei
435         call puts
436         ld hl, .testfailed
437         call puts
438         ret
439 .insnteststr:
440         db "Testing instructions... ",0
441 .pushpopfail:
442         db "PUSH/POP",0
443 .ff:
444         db $FF
445 .xorhlfail:
446         db "XOR [HL]",0
447 .jphlfail:
448         db "JP [HL]",0
449 .jrfail:
450         db "JR",0
451 .cpfail:
452         db "CP",0
453 .cplfail:
454         db "CPL",0
455 .inc16fail:
456         db "INC16",0
457 .dinocausefail:
458         db "DI/EI does not cause interrupt",0
459 .dicausefail:
460         db "DI/NOP/EI cause interrupt",0
461 .testfailed:
462         db " test failed.",$0D,$0A,0
463 .ok:
464         db "OK!",$0D,$0A,0
465
466 ; Serial port manipulation functions.
467 putc:
468         ld c, $50
469         push af
470 .waitport:
471         ld a,[c]
472         cp $00
473         jr nz,.waitport
474         pop af
475         ld [c],a
476         ret
477
478 puts:
479         ld a, [hli]
480         cp $00
481         ret z
482         call putc
483         jr puts
484
This page took 0.051447 seconds and 4 git commands to generate.