- 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
ld hl, signon
call puts
+
+ call putscreen
ei
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
ld hl,memteststr
call puts
- ld hl, $C001 ; Write loop
+ ld hl, $C000 ; Write loop
.wr:
ld a,h
xor l
cp $80
jr nz, .wr
- ld hl, $C001 ; Read loop
+ ld hl, $C000 ; Read loop
.rd:
ld a,h
xor l
ret
.memfail: ; Say we failed (sadface)
; decrement hl the easy way
- ld a,[hld]
+ dec [hl]
push hl
ld hl, failatstr
call puts
; 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
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:
ret z
call putc
jr puts
+