Introduced symbol files for various Game Boy systems (CGB, AGB, MGB, SGB) to define boot sequences and functionalities. Included CPU instruction behavior tests, with detailed coverage of standard operations and interrupt handling. Added documentation for test execution and internal framework operations.
128 lines
3.1 KiB
ArmAsm
128 lines
3.1 KiB
ArmAsm
; Tests branch instructions
|
|
|
|
;.define PRINT_CHECKSUMS 1
|
|
.include "shell.inc"
|
|
.include "instr_test.s"
|
|
|
|
instrs:
|
|
; JR cond,skip
|
|
; INC A
|
|
; skip:
|
|
.byte $18,$01,$3C ; JR *+3
|
|
.byte $20,$01,$3C ; JR NZ,*+3
|
|
.byte $28,$01,$3C ; JR Z,*+3
|
|
.byte $30,$01,$3C ; JR NC,*+3
|
|
.byte $38,$01,$3C ; JR C,*+3
|
|
|
|
.byte $C2,<taken,>taken ; JP NZ,taken
|
|
.byte $C3,<taken,>taken ; JP taken
|
|
.byte $CA,<taken,>taken ; JP Z,taken
|
|
.byte $D2,<taken,>taken ; JP NC,taken
|
|
.byte $DA,<taken,>taken ; JP C,taken
|
|
|
|
.byte $C4,<taken,>taken ; CALL NZ,taken
|
|
.byte $CC,<taken,>taken ; CALL Z,taken
|
|
.byte $CD,<taken,>taken ; CALL taken
|
|
.byte $D4,<taken,>taken ; CALL NC,taken
|
|
.byte $DC,<taken,>taken ; CALL C,taken
|
|
|
|
; RET cond
|
|
; INC A
|
|
.byte $C0,$3C,0 ; RET NZ
|
|
.byte $C8,$3C,0 ; RET Z
|
|
.byte $C9,$3C,0 ; RET
|
|
.byte $D0,$3C,0 ; RET NC
|
|
.byte $D8,$3C,0 ; RET C
|
|
.byte $D9,$3C,0 ; RETI
|
|
|
|
; RST
|
|
; can only easily test this one on devcart
|
|
.byte $C7,0,0 ; RST $00
|
|
.ifndef BUILD_DEVCART
|
|
.byte $CF,0,0 ; RST $08
|
|
.byte $D7,0,0 ; RST $10
|
|
.byte $DF,0,0 ; RST $18
|
|
.byte $E7,0,0 ; RST $20
|
|
.byte $EF,0,0 ; RST $28
|
|
.byte $F7,0,0 ; RST $30
|
|
.byte $FF,0,0 ; RST $38
|
|
.endif
|
|
|
|
instrs_end:
|
|
|
|
test_instr:
|
|
wreg IE,0 ; disable interrupts, since RETI does EI
|
|
|
|
; Go through all 16 combinations of flags
|
|
ld bc,$1200
|
|
-
|
|
; Fill 4 bytes of new stack
|
|
ld a,$12
|
|
ld ($DF80-2),a
|
|
ld a,$34
|
|
ld ($DF80-3),a
|
|
ld a,$56
|
|
ld ($DF80-4),a
|
|
ld a,$78
|
|
ld ($DF80-5),a
|
|
|
|
; Set AF
|
|
push bc
|
|
pop af
|
|
|
|
; Switch to new stack
|
|
ld (temp),sp
|
|
ld sp,$DF80
|
|
|
|
; Set return address
|
|
ld de,instr+3
|
|
push de
|
|
|
|
jp instr
|
|
instr_done:
|
|
inc a
|
|
taken:
|
|
di ; RETI enables interrupts
|
|
|
|
; Save new SP and switch to yet another stack
|
|
ld (temp+2),sp
|
|
ld sp,$DF70
|
|
|
|
; Checksum A and SP
|
|
call update_crc_fast
|
|
ld a,(temp+2)
|
|
call update_crc_fast
|
|
ld a,(temp+3)
|
|
call update_crc_fast
|
|
|
|
; Checksum 4 bytes of stack
|
|
ld a,($DF80-2)
|
|
call update_crc_fast
|
|
ld a,($DF80-3)
|
|
call update_crc_fast
|
|
ld a,($DF80-4)
|
|
call update_crc_fast
|
|
ld a,($DF80-5)
|
|
call update_crc_fast
|
|
|
|
ldsp temp
|
|
|
|
ld a,c
|
|
add $10
|
|
ld c,a
|
|
jr nz,-
|
|
|
|
ret
|
|
|
|
checksums:
|
|
.byte $EC,$A4,$94,$79,$C4,$00,$96,$2C,$C4,$64,$90,$33,$77,$C7,$0A,$D4
|
|
.byte $77,$A3,$0C,$CB,$79,$E7,$7E,$AE,$DA,$DC,$03,$F7,$4F,$9F,$E9,$20
|
|
.byte $72,$12,$DA,$01,$44,$6A,$4D,$8F,$D1,$79,$30,$4C,$AA,$37,$F2,$6A
|
|
.byte $97,$EA,$56,$5F,$32,$28,$C7,$D1,$49,$66,$05,$F7,$80,$0F,$BA,$8E
|
|
.byte $41,$E2,$A4,$9A,$2D,$2D,$8C,$72,$A5,$13,$76,$A8,$64,$FE,$68,$BC
|
|
.byte $2D,$2D,$8C,$72,$50,$96,$24,$27,$50,$96,$24,$27,$50,$96,$24,$27
|
|
.byte $50,$96,$24,$27,$50,$96,$24,$27,$50,$96,$24,$27,$50,$96,$24,$27
|
|
.byte $50,$96,$24,$27
|
|
|
|
.include "multi_custom.s"
|