]> Joshua Wise's Git repositories - fpgaboy.git/blobdiff - diag.asm
Fix tileaddr bug. Make bus interface more explicit.
[fpgaboy.git] / diag.asm
index 55127f82cff8704fd3c716ebdd22f43b2ff1e28e..5d44cef29f6ba6c9654ef0dada74bf8868e4ae68 100644 (file)
--- a/diag.asm
+++ b/diag.asm
@@ -1,16 +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 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 [hli], a
@@ -18,6 +32,8 @@ main:
        
        ld hl, signon
        call puts
+
+       call putscreen
        
        ei
 
@@ -34,28 +50,130 @@ main:
 signon:
        db $0D,$0A,$1B,"[1mFPGABoy Diagnostic ROM",$1B,"[0m",$0D,$0A,0
 
-       section "fuq",HOME[$100]
-irqhand:
+putscreen:
+       ; Wait for vblank
+       ld c, $41
+.stat: ld a, [c]
+       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
+       PUSH HL
+       
+       xor a
+       ld [$FF0F], a
+
+       ld c, $42       ; SCY
+       ld a, [c]
+       inc a
+       ld [c], a
+       
+       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 c, $0F       ; ack the irq
+       ld [$FF0F], a
+       
+       ld c, $45       ; LYC
+       ld a, [c]
+       inc a
        ld [c], a
        
-       ld hl, $DF82
-       ld a, [hld]
+       ld a, [$DF82]
        cp 0
        jr z, .noprint
        ld a, $41       ; print A
        call putc
 .noprint:
-       inc [hl]
-       ld a, [hl]
-       ld c, $51
-       ld [c], a
+       ld a, [$DF81]
+       inc a
+       ld [$DF81], a
+       ld [$FF51], a
 
        POP HL
        POP DE
@@ -68,7 +186,7 @@ memtest:
        ld hl,memteststr
        call puts
        
-       ld hl, $C001            ; Write loop
+       ld hl, $C000            ; Write loop
 .wr:
        ld a,h
        xor l
@@ -80,7 +198,7 @@ memtest:
        cp $80
        jr nz, .wr
 
-       ld hl, $C001            ; Read loop
+       ld hl, $C000            ; Read loop
 .rd:
        ld a,h
        xor l
@@ -101,7 +219,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
@@ -237,20 +355,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
@@ -282,8 +405,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:
@@ -307,3 +432,4 @@ puts:
        ret z
        call putc
        jr puts
+
This page took 0.034465 seconds and 4 git commands to generate.