164 lines
4.7 KiB
ArmAsm
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
|