SECTION "a",HOME main: ld c, $51 ; Note that we are alive. ld a, $FF ld [c],a ld sp, $DFFF ld hl, signon call puts call memtest call insntest call waitsw jp main 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, $C000 ; Write loop .wr: ld a,h xor l ld [hli],a ld a, $DF cp h jp nz, .wr ld a, $80 cp l jp nz, .wr ld hl, $C000 ; Read loop .rd: ld a,h xor l ld b,a ld a, [hli] cp b jp nz, .memfail ld a, $DF cp h jp nz, .rd ld a, $80 cp l jp 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 ld a, $00 ld [c],a ld c, $51 ld b, $0 .loop1: ld a,[c] cp b jp z,.loop1 .loop2: ld a,[c] cp b jp nz,.loop2 ret waitswstr: db "Diagnostic ROM complete; flip switches to nonzero and then to zero to reset.",$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 jp nz,.fail ld a, e cp c jp nz,.fail ; Test ALU (HL). ld hl, .ff ld a, $FF xor [hl] ld hl, .xorhlfail jp nz, .fail ; Test CP. ld hl, .cpfail ld a, $10 ld b, $20 cp b jp nc,.fail ld a, $20 ld b, $10 cp b jp c,.fail ; Test CPL ld hl, .cplfail ld a, $55 ld b, $AA cpl cp b jp nz,.fail ld hl, .ok call puts ret .fail: call puts ret .insnteststr: db "Testing instructions... ",$0 .pushpopfail: db "PUSH/POP test failed.",$0D,$0A,0 .ff: db $FF .xorhlfail: db "XOR [HL] test failed.",$0D,$0A,0 .cpfail: db "CP test failed.",$0D,$0A,0 .cplfail: db "CPL test failed.",$0D,$0A,0 .ok: db "OK!",$0D,$0A,0 ; Serial port manipulation functions. putc: push af ld b, 0 ld c, $50 .waitport: ld a,[c] cp b jp nz,.waitport pop af ld [c],a ret puts: ld a, [hli] ld b, $00 cp b jp z, .done call putc jp puts .done: ret