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.
177 lines
2.9 KiB
ArmAsm
177 lines
2.9 KiB
ArmAsm
; Diagnostic and testing utilities
|
|
|
|
.define result bss+0
|
|
.define test_name bss+1
|
|
.redefine bss bss+3
|
|
|
|
|
|
; Sets test code and optional error text
|
|
; Preserved: AF, BC, DE, HL
|
|
.macro set_test ; code[,text[,text2]]
|
|
push hl
|
|
call set_test_
|
|
jr @set_test\@
|
|
.byte \1
|
|
.if NARGS > 1
|
|
.byte \2
|
|
.endif
|
|
.if NARGS > 2
|
|
.byte \3
|
|
.endif
|
|
.byte 0
|
|
@set_test\@:
|
|
pop hl
|
|
.endm
|
|
|
|
set_test_:
|
|
pop hl
|
|
push hl
|
|
push af
|
|
inc hl
|
|
inc hl
|
|
ldi a,(hl)
|
|
ld (result),a
|
|
ld a,l
|
|
ld (test_name),a
|
|
ld a,h
|
|
ld (test_name+1),a
|
|
pop af
|
|
ret
|
|
|
|
|
|
; Initializes testing module
|
|
init_testing:
|
|
set_test $FF
|
|
call init_crc
|
|
ret
|
|
|
|
|
|
; Reports "Passed", then exits with code 0
|
|
tests_passed:
|
|
call print_newline
|
|
print_str "Passed"
|
|
ld a,0
|
|
jp exit
|
|
|
|
|
|
; Reports "Done" if set_test has never been used,
|
|
; "Passed" if set_test 0 was last used, or
|
|
; failure if set_test n was last used.
|
|
tests_done:
|
|
ld a,(result)
|
|
inc a
|
|
jr z,+
|
|
dec a
|
|
jr z,tests_passed
|
|
jr test_failed
|
|
+ print_str "Done"
|
|
ld a,0
|
|
jp exit
|
|
|
|
|
|
; Reports current error text and exits with result code
|
|
test_failed:
|
|
ld a,(test_name)
|
|
ld l,a
|
|
ld a,(test_name+1)
|
|
ld h,a
|
|
ld a,(hl)
|
|
or a
|
|
jr z,+
|
|
call print_newline
|
|
call print_str_hl
|
|
call print_newline
|
|
+
|
|
ld a,(result)
|
|
cp 1 ; if a = 0 then a = 1
|
|
adc 0
|
|
jp exit
|
|
|
|
|
|
; Prints checksum as 8-character hex value
|
|
; Preserved: AF, BC, DE, HL
|
|
print_crc:
|
|
push af
|
|
|
|
; Must read checksum entirely before printing,
|
|
; since printing updates it.
|
|
lda checksum
|
|
cpl
|
|
push af
|
|
|
|
lda checksum+1
|
|
cpl
|
|
push af
|
|
|
|
lda checksum+2
|
|
cpl
|
|
push af
|
|
|
|
lda checksum+3
|
|
cpl
|
|
|
|
call print_hex
|
|
pop af
|
|
call print_hex
|
|
pop af
|
|
call print_hex
|
|
pop af
|
|
call print_a
|
|
|
|
pop af
|
|
ret
|
|
|
|
|
|
; If checksum doesn't match expected, reports failed test.
|
|
; Passing 0 just prints checksum. Clears checksum afterwards.
|
|
.macro check_crc ARGS crc
|
|
.if crc == 0
|
|
call show_printing
|
|
call print_newline
|
|
call print_crc
|
|
.else
|
|
ld bc,(crc >> 16) ~ $FFFF
|
|
ld de,(crc & $FFFF) ~ $FFFF
|
|
call check_crc_
|
|
.endif
|
|
.endm
|
|
|
|
check_crc_:
|
|
lda checksum+0
|
|
cp e
|
|
jr nz,+
|
|
|
|
lda checksum+1
|
|
cp d
|
|
jr nz,+
|
|
|
|
lda checksum+2
|
|
cp c
|
|
jr nz,+
|
|
|
|
lda checksum+3
|
|
cp b
|
|
jr nz,+
|
|
|
|
jp reset_crc
|
|
|
|
+ call print_crc
|
|
jp test_failed
|
|
|
|
|
|
; Updates checksum with bytes from addr to addr+size-1
|
|
.macro checksum_mem ARGS addr,size
|
|
ld hl,addr
|
|
ld bc,size
|
|
call checksum_mem_
|
|
.endm
|
|
|
|
checksum_mem_:
|
|
- ldi a,(hl)
|
|
call update_crc
|
|
dec bc
|
|
ld a,b
|
|
or c
|
|
jr nz,-
|
|
ret
|