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 sp, $DFFF
+; 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
- jp main
+ 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
ld hl,memteststr
call puts
- ld hl, $C000 ; Write loop
+ ld hl, $C001 ; Write loop
.wr:
ld a,h
xor l
ld [hli],a
ld a, $DF
cp h
- jp nz, .wr
+ jr nz, .wr
ld a, $80
cp l
- jp nz, .wr
+ jr nz, .wr
- ld hl, $C000 ; Read loop
+ ld hl, $C001 ; Read loop
.rd:
ld a,h
xor l
ld b,a
ld a, [hli]
cp b
- jp nz, .memfail
+ jr nz, .memfail
ld a, $DF
cp h
- jp nz, .rd
+ jr nz, .rd
ld a, $80
cp l
- jp nz, .rd
+ jr nz, .rd
ld hl, testokstr ; Say we're OK
call puts
waitsw:
ld hl,waitswstr
call puts
-
+
ld c, $51
- ld a, $00
+ xor a
ld [c],a
- ld c, $51
ld b, $0
.loop1:
ld a,[c]
cp b
- jp z,.loop1
+ ei
+ jr z,.loop1
.loop2:
ld a,[c]
cp b
- jp nz,.loop2
+ jr nz,.loop2
ret
waitswstr:
- db "Diagnostic ROM complete; flip switches to nonzero and then to zero to reset.",$0D,$0A,0
+ 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, .pushpopfail
ld a, d
cp b
- jp nz,.fail
+ jr nz,.fail
ld a, e
cp c
- jp nz,.fail
+ jr nz,.fail
; Test ALU (HL).
ld hl, .ff
ld a, $FF
xor [hl]
ld hl, .xorhlfail
- jp nz, .fail
+ jr nz, .fail
; Test JP (HL)
ld hl, .jphl
jp [hl]
ld hl, .jphlfail
- jp .fail
+ jr .fail
rst $00
.jphl:
cp b
jr nz,.jr
ld hl, .jrfail
- jp .fail
+ 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
- jp nc,.fail
+ jr nc,.fail
ld a, $20
ld b, $10
cp b
- jp c,.fail
+ jr c,.fail
; Test CPL
ld hl, .cplfail
ld b, $AA
cpl
cp b
- jp nz,.fail
+ jr nz,.fail
ld hl, .ok
call puts
ret
.fail:
+ call puts
+ ld hl, .testfailed
call puts
ret
.insnteststr:
- db "Testing instructions... ",$0
+ db "Testing instructions... ",0
.pushpopfail:
- db "PUSH/POP test failed.",$0D,$0A,0
+ db "PUSH/POP",0
.ff:
db $FF
.xorhlfail:
- db "XOR [HL] test failed.",$0D,$0A,0
+ db "XOR [HL]",0
.jphlfail:
- db "JP [HL] test failed.",$0D,$0A,0
+ db "JP [HL]",0
.jrfail:
- db "JR test failed.",$0D,$0A,0
+ db "JR",0
.cpfail:
- db "CP test failed.",$0D,$0A,0
+ db "CP",0
.cplfail:
- db "CPL test failed.",$0D,$0A,0
+ 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:
- push af
ld b, 0
ld c, $50
+ push af
.waitport:
ld a,[c]
cp b
- jp nz,.waitport
+ jr nz,.waitport
pop af
ld [c],a
ret
ld a, [hli]
ld b, $00
cp b
- jp z, .done
+ ret z
call putc
- jp puts
-.done:
- ret
-
+ jr puts