X-Git-Url: http://git.joshuawise.com/fpgaboy.git/blobdiff_plain/537e1f833b8eba858c06053ea6006ea608b9a5cc..7d59dad969a6cd1e42958f4c805d1d373ee04713:/diag.asm diff --git a/diag.asm b/diag.asm index ff70e07..2c843eb 100644 --- a/diag.asm +++ b/diag.asm @@ -1,14 +1,30 @@ - SECTION "a",HOME + section "end",HOME[1024] + nop + + SECTION "a",HOME[$00] + +start: jp main + + section "vbl",HOME[$40] + jp vbl + + section "lcdc",HOME[$48] + jp lcdc + + section "tmro",HOME[$50] + jp tmro main: ld a, $FF - ld [$FF51],a - + ld c, $51 + ld [c], a + ld sp, $DFF0 ld a, $04 ;start timer, 4.096KHz - ld [$FF07], a - + ld c, $07 + ld [c], a + ld hl, $DF81 xor a ld [hli], a @@ -16,6 +32,8 @@ main: ld hl, signon call puts + + call putscreen ei @@ -32,8 +50,68 @@ main: signon: db $0D,$0A,$1B,"[1mFPGABoy Diagnostic ROM",$1B,"[0m",$0D,$0A,0 - section "fuq",HOME[$100] -irqhand: +putscreen: + ; Wait for vblank +.stat: ld a, [$FF41] + ld [$FF51], a + and $03 ; mode + cp $01 ; VBLANK + jr nz, .stat + + ld hl, $8000 ; Copy two tiles. + ld a, $AA + ld [hli], a + ld [hli], a + ld a, $55 + ld [hli], a + ld [hli], a + ld a, $AA + ld [hli], a + ld [hli], a + ld a, $55 + ld [hli], a + ld [hli], a + ld a, $AA + ld [hli], a + ld [hli], a + ld a, $55 + ld [hli], a + ld [hli], a + ld a, $AA + ld [hli], a + ld [hli], a + ld a, $55 + ld [hli], a + ld [hli], a + xor a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + + ld hl, $9800 +.loop: ld a, $01 + ld [hli], a + xor a + ld [hli], a + ld a, h + cp $9C + jp nz,.loop + ret + +vbl: PUSH AF PUSH BC PUSH DE @@ -41,16 +119,59 @@ irqhand: xor a ld [$FF0F], a + + ld c, $42 ; SCY + ld a, [c] + inc a + ld [c], a - ld hl, $DF82 - ld a, [hld] + ld c, $43 ; SCX + ld a, [c] + inc a + ld [c], a + + POP HL + POP DE + POP BC + POP AF + + RETI + +lcdc: + PUSH AF + PUSH BC + + xor a + ld [$FF0F], a + + POP BC + POP AF + + reti + +tmro: + PUSH AF + PUSH BC + PUSH DE + PUSH HL + + xor a + ld [$FF0F], a + + ld c, $45 ; LYC + ld a, [c] + inc a + ld [c], a + + ld a, [$DF82] cp 0 jr z, .noprint ld a, $41 ; print A call putc .noprint: - inc [hl] - ld a, [hl] + ld a, [$DF81] + inc a + ld [$DF81], a ld [$FF51], a POP HL @@ -64,7 +185,7 @@ memtest: ld hl,memteststr call puts - ld hl, $C001 ; Write loop + ld hl, $C000 ; Write loop .wr: ld a,h xor l @@ -76,7 +197,7 @@ memtest: cp $80 jr nz, .wr - ld hl, $C001 ; Read loop + ld hl, $C000 ; Read loop .rd: ld a,h xor l @@ -97,7 +218,7 @@ memtest: ret .memfail: ; Say we failed (sadface) ; decrement hl the easy way - ld a,[hld] + dec [hl] push hl ld hl, failatstr call puts @@ -233,20 +354,25 @@ insntest: ; Test DI/EI delay di - ld hl, .difail + ld hl, .dinocausefail ld c, $0F ; First, wait until an interrupt happens... .wait: ld a, [c] + and $04 cp 0 jr z, .wait ei ; Now make sure that an IRQ didn't happen on EI/DI di ld a, [c] + and $04 cp 0 jr z, .fail + ld hl, .dicausefail ei ; Make sure that an IRQ does happen on EI/NOP/DI nop + nop di ld a, [c] + and $04 cp 0 jr nz, .fail ei @@ -278,8 +404,10 @@ insntest: db "CPL",0 .inc16fail: db "INC16",0 -.difail: - db "DI/EI delay",0 +.dinocausefail: + db "DI/EI does not cause interrupt",0 +.dicausefail: + db "DI/NOP/EI cause interrupt",0 .testfailed: db " test failed.",$0D,$0A,0 .ok: @@ -303,3 +431,4 @@ puts: ret z call putc jr puts +