85 lines
1.6 KiB
ArmAsm
85 lines
1.6 KiB
ArmAsm
; On CGB, length counters are reset when powered up.
|
|
; On DMG, they are unaffected, and not clocked.
|
|
|
|
;.define REQUIRE_DMG 1
|
|
;.define REQUIRE_CGB 1
|
|
.include "shell.inc"
|
|
.include "apu.s"
|
|
|
|
enable_len_ctrs:
|
|
wreg NR22,8
|
|
wreg NR24,$C0
|
|
wreg NR12,8
|
|
wreg NR14,$C0
|
|
wreg NR30,$80
|
|
wreg NR34,$C0
|
|
wreg NR42,8
|
|
wreg NR44,$C0
|
|
ret
|
|
|
|
main:
|
|
call sync_apu
|
|
|
|
ld a,0
|
|
call fill_apu_regs
|
|
|
|
; Load length counters
|
|
wreg NR41,-$33
|
|
wreg NR31,-$44
|
|
wreg NR11,-$11
|
|
wreg NR21,-$22
|
|
|
|
delay_clocks 8192
|
|
call enable_len_ctrs
|
|
|
|
; Power down. Comment out to see what would
|
|
; happen if length counters did run.
|
|
wreg NR52,$00
|
|
|
|
; Try to enable length counters
|
|
call enable_len_ctrs
|
|
|
|
; Give plenty of time for them to be clocked
|
|
delay_msec 250
|
|
|
|
; Power back on and wait a bit longer
|
|
wreg NR52,$80
|
|
;call enable_len_ctrs ; can't do this here
|
|
delay_clocks 2048
|
|
|
|
; Get values from length counters
|
|
wreg NR22,8
|
|
wreg NR24,$C0
|
|
ld a,$02
|
|
call get_len_a
|
|
push af
|
|
|
|
wreg NR12,8
|
|
wreg NR14,$C0
|
|
ld a,$01
|
|
call get_len_a
|
|
push af
|
|
|
|
wreg NR30,$80
|
|
wreg NR34,$C0
|
|
ld a,$04
|
|
call get_len_a
|
|
push af
|
|
|
|
wreg NR42,8
|
|
wreg NR44,$C0
|
|
ld a,$08
|
|
call get_len_a
|
|
|
|
; Print them
|
|
call print_a
|
|
pop af
|
|
call print_a
|
|
pop af
|
|
call print_a
|
|
pop af
|
|
call print_a
|
|
|
|
check_crc_dmg_cgb $32F0CFBB,$3CF589B4
|
|
jp tests_passed
|