playing-coffee/playing-coffee - Copy/roms/cgb_sound/source/02-len ctr.s

164 lines
4.7 KiB
ArmAsm

; Tests basic length counter operation
.include "shell.inc"
.include "test_chan.s"
main:
test_all_chans
jp tests_passed
begin:
call sync_apu
delay 2048 ; avoid extra clocking due to quirks
wchn 4,$40 ; avoid extra clocking due to quirks
wchn 1,-4 ; length = 4
wchn 4,$C0 ; trigger, enabling channel
ret
should_be_on:
lda chan_mask
ld b,a
lda NR52
and b
jp z,test_failed
ret
should_be_almost_off:
call should_be_on
delay_apu 1
should_be_off:
lda chan_mask
ld b,a
lda NR52
and b
jp nz,test_failed
ret
test_chan:
set_test 2,"Length becoming 0 should clear status"
call begin
delay_apu 3
call should_be_almost_off
set_test 3,"Length can be reloaded at any time"
call begin
wchn 1,-10 ; length = 10
delay_apu 9
call should_be_almost_off
set_test 4,"Attempting to load length with 0 should load with maximum"
call begin
wchn 1,0 ; length = maximum
lda chan_maxlen
dec a
call delay_apu_cycles
call should_be_almost_off
set_test 5,"Trigger shouldn't affect length"
call begin
delay_apu 1
wchn 4,$C0 ; length unaffected
delay_apu 2
call should_be_almost_off
set_test 6,"Trigger should treat 0 length as maximum"
call begin
delay_apu 4 ; clocks length to 0
wchn 4,$C0 ; trigger converts 0 to maximum
lda chan_maxlen
dec a
call delay_apu_cycles
call should_be_almost_off
set_test 7,"Trigger with disabled length should convert ","0 length to maximum"
call begin
delay_apu 4 ; clocks length to 0
wchn 4,$00 ; disable length
wchn 4,$80 ; trigger converts 0 to maximum
wchn 4,$40 ; enable length
lda chan_maxlen
dec a
call delay_apu_cycles
call should_be_almost_off
set_test 8,"Disabling length shouldn't re-enable channel"
call begin
delay_apu 4 ; clocks length to 0
call should_be_off
wchn 4,0 ; disable length
call should_be_off
set_test 9,"Disabling length should stop length clocking"
call begin
wchn 4,0 ; disable length
delay_apu 4 ; length isn't affected
wchn 4,$40 ; enable length
delay_apu 3 ; clocks length to 1
call should_be_almost_off
set_test 10,"Reloading shouldn't re-enable channel"
call begin
delay_apu 4 ; clocks length to 0
call should_be_off
wchn 1,-2 ; length = 2
call should_be_off
set_test 11,"Disabled channel should still clock length"
call begin
delay_apu 4 ; clocks length to 0, disabling channel
wchn 1,-8 ; length = 8
delay_apu 4 ; clocks length to 4
wchn 4,$C0 ; trigger, enabling channel
delay_apu 3 ; clocks length to 1
call should_be_almost_off
set_test 12,"Disabled channel should still convert 0 load to max length"
call begin
delay_apu 4 ; clocks length to 0, disabling channel
wchn 1,0 ; length = maximum
delay_apu 32 ; clock length 32 times
wchn 4,$C0
lda chan_maxlen
sub 33
call delay_apu_cycles
call should_be_almost_off
set_test 13,"Disabling DAC should disable channel immediately"
call begin
delay_apu 2 ; clocks length to 2
call should_be_on
wchn 0,$00 ; if wave channel, this disables DAC
wchn 2,$07 ; if square/noise channel, this disables DAC
call should_be_off
set_test 14,"Disabled DAC should prevent enable at trigger"
call begin
wchn 0,$00 ; if wave channel, this disables DAC
wchn 2,$07 ; if square/noise channel, this disables DAC
wchn 4,$80 ; triggers channel but doesn't enable it
call should_be_off
set_test 15,"Enabling DAC shouldn't re-enable channel"
wchn 0,$80 ; if wave channel, this enables DAC
wchn 2,$10 ; if square/noise channel, this enables DAC
call begin
delay_apu 2
call should_be_on
wchn 0,$00 ; if wave channel, this disables DAC
wchn 2,$00 ; if square/noise channel, this disables DAC
call should_be_off
wchn 0,$80 ; if wave channel, this enables DAC
wchn 2,$10 ; if square/noise channel, this enables DAC
call should_be_off
set_test 16,"Volume reaching 0 shouldn't disable channel"
wchn 2,$11 ; envelope that reaches zero in less than
; 20 length clocks (if wave channel, this just sets
; volume to 0)
call begin
wchn 1,-20
delay_apu 19
call should_be_almost_off
ret