+++ /dev/null
- SECTION "a",HOME
-
-main:
- ld c, $51 ; Note that we are alive.
- ld a, $FF
- ld [c],a
-
- ld sp, $DFF0
-
- ld hl, $DF81
- ld a, $80
- ld [hl], a
-
-; ld c, $07
-; ld a, $04 ;start timer, 4.096KHz
-; ld [c], a
-diqs:; ei
- jr diqs
-
- ld hl, signon
- call puts
-
-
- ei
-
- call memtest
-
- call insntest
-
- call waitsw
- di
-
- jr main
-
- section "fuq",HOME[$50]
-irqhand:
- PUSH AF
- PUSH BC
- PUSH DE
- PUSH HL
-
-; ld c, $51
-; ld a, $F0
-; ld [c], a
-
- xor a
- ld c, $0F ; ack the irq
- ld [c], a
-
- ;ld a, $41 ; print A
- ;call putc
-
- ld hl, $DF81
- ld a, [hl]
-; ld b, 1
-; add b
- ld c, $51
-; ld [c], a
-; ld [hl], a
-
-
-; ld c, $51
-; ld a, $0F
-; ld [c], a
-
- POP HL
- POP DE
- POP BC
- POP AF
- RETI
-
-signon:
- db $0D,$0A,$1B,"[1mFPGABoy Diagnostic ROM",$1B,"[0m",$0D,$0A,0
-
-; Memory tester: writes h ^ l to all addresses from C000 to DF80.
-memtest:
- ld hl,memteststr
- call puts
-
- ld hl, $C001 ; Write loop
-.wr:
- ld a,h
- xor l
- ld [hli],a
- ld a, $DF
- cp h
- jr nz, .wr
- ld a, $80
- cp l
- jr nz, .wr
-
- ld hl, $C001 ; Read loop
-.rd:
- ld a,h
- xor l
- ld b,a
- ld a, [hli]
- cp b
- jr nz, .memfail
-
- ld a, $DF
- cp h
- jr nz, .rd
- ld a, $80
- cp l
- jr nz, .rd
-
- ld hl, testokstr ; Say we're OK
- call puts
- ret
-.memfail: ; Say we failed (sadface)
- ; decrement hl the easy way
- ld a,[hld]
- push hl
- ld hl, failatstr
- call puts
- pop hl
- ld a, h
- call puthex
- ld a, l
- call puthex
- ld a, $0A
- call putc
- ld a, $0D
- call putc
- ret
-memteststr:
- db "Testing memory from $C000 to $DF80...",0
-testokstr:
- db " OK!",$0D,$0A,0
-failatstr:
- db " Test failed at $",0
-
-puthex: ; Put two hex nibbles to the serial console.
- push af
- rra
- rra
- rra
- rra
- ld b,$0F
- and b
- ld b,$30
- add b
- call putc
- pop af
- ld b,$0F
- and b
- ld b,$30
- add b
- call putc
- ret
-
-; Wait for switches to be flipped on and off again.
-waitsw:
- ld hl,waitswstr
- call puts
-
- ld c, $51
- xor a
- ld [c],a
-
- ld b, $0
-.loop1:
- ld a,[c]
- cp b
- ei
- jr z,.loop1
-.loop2:
- ld a,[c]
- cp b
- jr nz,.loop2
- ret
-
-waitswstr:
- db "Diagnostic ROM complete; flip switches to nonzero and then to zero to reset. Expect A.",$0D,$0A,0
-
-; Core instruction basic acceptance tests.
-insntest:
- ld hl, .insnteststr
- call puts
-
- ; Test PUSH and POP.
- ld b, $12
- ld c, $34
- ld d, $56
- ld e, $78
- push bc
- pop de
- ld hl, .pushpopfail
- ld a, d
- cp b
- jr nz,.fail
- ld a, e
- cp c
- jr nz,.fail
-
- ; Test ALU (HL).
- ld hl, .ff
- ld a, $FF
- xor [hl]
- ld hl, .xorhlfail
- jr nz, .fail
-
- ; Test JP (HL)
- ld hl, .jphl
- jp [hl]
- ld hl, .jphlfail
- jr .fail
- rst $00
-.jphl:
-
- ; Test JR
- ld a, $FF
- ld b, $00
- cp b
- jr nz,.jr
- ld hl, .jrfail
- jr .fail
- rst $00
-.jr:
-
- ; Test inc16
- ld d, $12
- ld e, $FF
- ld hl, .inc16fail
- inc de
- ld a, $13
- cp d
- jr nz, .fail
- ld a, $00
- cp e
- jr nz, .fail
-
- ; Test CP.
- ld hl, .cpfail
- ld a, $10
- ld b, $20
- cp b
- jr nc,.fail
- ld a, $20
- ld b, $10
- cp b
- jr c,.fail
-
- ; Test CPL
- ld hl, .cplfail
- ld a, $55
- ld b, $AA
- cpl
- cp b
- jr nz,.fail
-
- ld hl, .ok
- call puts
- ret
-.fail:
- call puts
- ld hl, .testfailed
- call puts
- ret
-.insnteststr:
- db "Testing instructions... ",0
-.pushpopfail:
- db "PUSH/POP",0
-.ff:
- db $FF
-.xorhlfail:
- db "XOR [HL]",0
-.jphlfail:
- db "JP [HL]",0
-.jrfail:
- db "JR",0
-.cpfail:
- db "CP",0
-.cplfail:
- db "CPL",0
-.inc16fail:
- db "INC16",0
-.testfailed:
- db " test failed.",$0D,$0A,0
-.ok:
- db "OK!",$0D,$0A,0
-
-; Serial port manipulation functions.
-putc:
- ld b, 0
- ld c, $50
- push af
-.waitport:
- ld a,[c]
- cp b
- jr nz,.waitport
- pop af
- ld [c],a
- ret
-
-puts:
- ld a, [hli]
- ld b, $00
- cp b
- ret z
- call putc
- jr puts