X-Git-Url: http://git.joshuawise.com/fpgaboy.git/blobdiff_plain/f888201b9894683abfff012bd68b641319fb2744..b598de01e4664cfd8e13d33b046db022c202ea04:/diag.asm diff --git a/diag.asm b/diag.asm index 28fce99..8e09874 100644 --- a/diag.asm +++ b/diag.asm @@ -1,19 +1,34 @@ - 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 c, $51 ; Note that we are alive. ld a, $FF - ld [c],a - + ld c, $51 + ld [c], a + ld sp, $DFF0 - ld c, $07 ld a, $04 ;start timer, 4.096KHz + ld c, $07 ld [c], a - + ld hl, $DF81 xor a - ld [hl], a + ld [hli], a + ld [hli], a ld hl, signon call puts @@ -33,26 +48,63 @@ main: signon: db $0D,$0A,$1B,"[1mFPGABoy Diagnostic ROM",$1B,"[0m",$0D,$0A,0 - section "fuq",HOME[$100] -irqhand: +vbl: PUSH AF PUSH BC PUSH DE PUSH HL xor a - ld c, $0F ; ack the irq + ld [$FF0F], a + + ld c, $42 ; SCY + ld a, [c] + inc a ld [c], a + + POP HL + POP DE + POP BC + POP AF + + RETI + +lcdc: + PUSH AF + PUSH BC - ld a, $41 ; print A - call putc + xor a + ld [$FF0F], a - ld hl, $DF81 - ld a, [hl] - add 1 - ld c, $51 + 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 [hl], a + + ld a, [$DF82] + cp 0 + jr z, .noprint + ld a, $41 ; print A + call putc +.noprint: + ld a, [$DF81] + inc a + ld [$DF81], a + ld [$FF51], a POP HL POP DE @@ -65,7 +117,7 @@ memtest: ld hl,memteststr call puts - ld hl, $C001 ; Write loop + ld hl, $C000 ; Write loop .wr: ld a,h xor l @@ -77,7 +129,7 @@ memtest: cp $80 jr nz, .wr - ld hl, $C001 ; Read loop + ld hl, $C000 ; Read loop .rd: ld a,h xor l @@ -98,7 +150,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 @@ -138,6 +190,10 @@ puthex: ; Put two hex nibbles to the serial console. waitsw: ld hl,waitswstr call puts + + ld hl,$DF82 + ld a, 1 + ld [hl], a ld c, $51 xor a @@ -227,11 +283,37 @@ insntest: cpl cp $AA jr nz,.fail + + ; Test DI/EI delay + di + 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 ld hl, .ok call puts ret .fail: + ei call puts ld hl, .testfailed call puts @@ -254,6 +336,10 @@ insntest: db "CPL",0 .inc16fail: db "INC16",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: @@ -277,3 +363,4 @@ puts: ret z call putc jr puts +