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.
163 lines
4.3 KiB
ArmAsm
163 lines
4.3 KiB
ArmAsm
; Tests (HL/BC/DE) instructions.
|
|
; Takes 20 seconds.
|
|
|
|
;.define PRINT_CHECKSUMS 1
|
|
.include "shell.inc"
|
|
.include "instr_test.s"
|
|
|
|
instrs:
|
|
.byte $0A,0,0 ; LD A,(BC)
|
|
.byte $1A,0,0 ; LD A,(DE)
|
|
.byte $02,0,0 ; LD (BC),A
|
|
.byte $12,0,0 ; LD (DE),A
|
|
.byte $2A,0,0 ; LD A,(HL+)
|
|
.byte $3A,0,0 ; LD A,(HL-)
|
|
.byte $22,0,0 ; LD (HL+),A
|
|
.byte $32,0,0 ; LD (HL-),A
|
|
.byte $B6,0,0 ; OR (HL)
|
|
.byte $BE,0,0 ; CP (HL)
|
|
.byte $86,0,0 ; ADD (HL)
|
|
.byte $8E,0,0 ; ADC (HL)
|
|
.byte $96,0,0 ; SUB (HL)
|
|
.byte $9E,0,0 ; SBC (HL)
|
|
.byte $A6,0,0 ; AND (HL)
|
|
.byte $AE,0,0 ; XOR (HL)
|
|
.byte $35,0,0 ; DEC (HL)
|
|
.byte $34,0,0 ; INC (HL)
|
|
.byte $CB,$06,0 ; RLC (HL)
|
|
.byte $CB,$0E,0 ; RRC (HL)
|
|
.byte $CB,$16,0 ; RL (HL)
|
|
.byte $CB,$1E,0 ; RR (HL)
|
|
.byte $CB,$26,0 ; SLA (HL)
|
|
.byte $CB,$2E,0 ; SRA (HL)
|
|
.byte $CB,$36,0 ; SWAP (HL)
|
|
.byte $CB,$3E,0 ; SRL (HL)
|
|
.byte $CB,$46,0 ; BIT 0,(HL)
|
|
.byte $CB,$4E,0 ; BIT 1,(HL)
|
|
.byte $CB,$56,0 ; BIT 2,(HL)
|
|
.byte $CB,$5E,0 ; BIT 3,(HL)
|
|
.byte $CB,$66,0 ; BIT 4,(HL)
|
|
.byte $CB,$6E,0 ; BIT 5,(HL)
|
|
.byte $CB,$76,0 ; BIT 6,(HL)
|
|
.byte $CB,$7E,0 ; BIT 7,(HL)
|
|
.byte $CB,$86,0 ; RES 0,(HL)
|
|
.byte $CB,$8E,0 ; RES 1,(HL)
|
|
.byte $CB,$96,0 ; RES 2,(HL)
|
|
.byte $CB,$9E,0 ; RES 3,(HL)
|
|
.byte $CB,$A6,0 ; RES 4,(HL)
|
|
.byte $CB,$AE,0 ; RES 5,(HL)
|
|
.byte $CB,$B6,0 ; RES 6,(HL)
|
|
.byte $CB,$BE,0 ; RES 7,(HL)
|
|
.byte $CB,$C6,0 ; SET 0,(HL)
|
|
.byte $CB,$CE,0 ; SET 1,(HL)
|
|
.byte $CB,$D6,0 ; SET 2,(HL)
|
|
.byte $CB,$DE,0 ; SET 3,(HL)
|
|
.byte $CB,$E6,0 ; SET 4,(HL)
|
|
.byte $CB,$EE,0 ; SET 5,(HL)
|
|
.byte $CB,$F6,0 ; SET 6,(HL)
|
|
.byte $CB,$FE,0 ; SET 7,(HL)
|
|
.byte $27,0,0 ; DAA
|
|
instrs_end:
|
|
|
|
test_instr:
|
|
ld c,$00
|
|
call test
|
|
ld c,$10
|
|
call test
|
|
ld c,$E0
|
|
call test
|
|
ld c,$F0
|
|
call test
|
|
ret
|
|
|
|
test:
|
|
; Go through each value for A
|
|
ld hl,values
|
|
a_loop:
|
|
ld b,(hl)
|
|
push hl
|
|
|
|
; Go through each value for (HL)
|
|
ld hl,values
|
|
values_loop:
|
|
push bc
|
|
push hl
|
|
|
|
push bc
|
|
|
|
; BC
|
|
ld a,(hl+)
|
|
ld bc,rp_temp
|
|
ld (rp_temp),a
|
|
|
|
; DE
|
|
ld a,(hl+)
|
|
ld de,rp_temp+1
|
|
ld (rp_temp+1),a
|
|
|
|
; HL
|
|
ld a,(hl)
|
|
ld hl,rp_temp+2
|
|
ld (rp_temp+2),a
|
|
|
|
; AF
|
|
pop af
|
|
|
|
; call print_regs
|
|
jp instr
|
|
instr_done:
|
|
|
|
; Checksum AF, HL, and (HL)
|
|
push hl
|
|
push af
|
|
call update_crc_fast
|
|
pop hl
|
|
ld a,l
|
|
call update_crc_fast
|
|
pop bc
|
|
ld a,b
|
|
call update_crc_fast
|
|
ld a,c
|
|
call update_crc_fast
|
|
ld a,(rp_temp)
|
|
call update_crc_fast
|
|
ld a,(rp_temp+1)
|
|
call update_crc_fast
|
|
ld a,(rp_temp+2)
|
|
call update_crc_fast
|
|
|
|
pop hl
|
|
pop bc
|
|
inc hl
|
|
ld a,l
|
|
cp <values_end
|
|
jr nz,values_loop
|
|
|
|
pop hl
|
|
inc hl
|
|
ld a,l
|
|
cp <values_end
|
|
jr nz,a_loop
|
|
|
|
ret
|
|
|
|
values:
|
|
.byte $00,$01,$0F,$10,$1F,$7F,$80,$F0,$FF,$02,$04,$08,$20,$40
|
|
values_end:
|
|
.byte $00,$01,$0F,$10,$1F,$7F,$80,$F0,$FF,$02,$04,$08,$20,$40
|
|
|
|
checksums:
|
|
.byte $E0,$E5,$09,$A7,$FB,$28,$0D,$AE,$AC,$BB,$91,$D8,$B3,$E2,$AF,$C4
|
|
.byte $3D,$B5,$02,$07,$4F,$6E,$5B,$7E,$AE,$02,$E7,$14,$DC,$D9,$BE,$6D
|
|
.byte $F1,$48,$A9,$42,$67,$08,$FE,$57,$06,$6A,$A9,$B1,$FD,$A5,$84,$F0
|
|
.byte $82,$FC,$24,$A9,$A8,$1D,$BB,$E2,$F8,$23,$8C,$DE,$0E,$1D,$64,$D1
|
|
.byte $05,$E0,$24,$41,$53,$75,$47,$55,$F4,$D9,$10,$6A,$38,$16,$28,$D8
|
|
.byte $D1,$28,$A3,$E0,$A2,$05,$B8,$FE,$B0,$F4,$F5,$8F,$4B,$39,$03,$B0
|
|
.byte $8A,$07,$BA,$90,$25,$99,$A7,$78,$E6,$9A,$D1,$49,$C9,$B2,$A3,$E5
|
|
.byte $36,$34,$CB,$5A,$97,$42,$71,$09,$39,$87,$25,$EC,$54,$EE,$C5,$B3
|
|
.byte $FC,$B5,$6F,$BD,$0B,$D8,$46,$6F,$6A,$27,$81,$9F,$F8,$38,$E2,$71
|
|
.byte $55,$19,$21,$83,$4B,$85,$9F,$4B,$A1,$78,$14,$60,$58,$08,$D9,$57
|
|
.byte $11,$8C,$83,$9A,$9F,$01,$D1,$90,$E8,$82,$0B,$5A,$BD,$75,$86,$21
|
|
.byte $DF,$83,$E9,$23,$1E,$B6,$7F,$D1,$4A,$18,$A5,$8E,$CF,$CF,$CA,$51
|
|
.byte $3F,$03,$A4,$96,$C3,$1F,$9E,$88,$0C,$DF,$1F,$B1
|