201 lines
5.4 KiB
ArmAsm
201 lines
5.4 KiB
ArmAsm
; Verifies length counter clocking during fifth register writes
|
|
|
|
;.define CGB_02 1
|
|
.include "shell.inc"
|
|
.include "test_chan.s"
|
|
|
|
main:
|
|
test_all_chans
|
|
jp tests_passed
|
|
|
|
begin:
|
|
call sync_apu
|
|
wchn 1,-60
|
|
wchn 4,$80
|
|
ret
|
|
|
|
end:
|
|
delay_clocks 8192+1024 ; so we don't clock length when enabling it below
|
|
end_nodelay:
|
|
ld b,a
|
|
wchn 4,$C0
|
|
ld a,b
|
|
end_passive:
|
|
ld b,a
|
|
lda chan_mask
|
|
call get_len_a
|
|
cp b
|
|
jp nz,test_failed
|
|
ret
|
|
|
|
test_chan:
|
|
set_test 2,"Enabling in second half of length period ","shouldn't clock length"
|
|
call begin
|
|
wchn 1,-2 ; length = 2
|
|
delay_clocks 8256 ; delay until beginning of second half of length period
|
|
wchn 4,$40 ; enable
|
|
ld a,2
|
|
call end_nodelay
|
|
|
|
set_test 3,"Enabling in first half of length period should clock length"
|
|
call begin
|
|
wchn 1,-2 ; length = 2
|
|
delay_clocks 7900 ; delay until near-end of first half of length period
|
|
wchn 4,$40 ; enable
|
|
ld a,1
|
|
call end_nodelay
|
|
|
|
.ifdef CGB_02
|
|
set_test 4,"Keeping disabled should clock length; ","disabling or keeping enabled shouldn't"
|
|
call begin
|
|
wchn 1,-2 ; length = 2
|
|
wchn 4,$00 ; disabled -> disabled clocks as well
|
|
ld a,1
|
|
call end
|
|
|
|
call begin
|
|
wchn 4,$40 ; enable length
|
|
wchn 1,-2 ; length = 2
|
|
wchn 4,$40 ; enabled -> enabled doesn't clock
|
|
wchn 4,$00 ; enabled -> disabled doesn't clock
|
|
ld a,2
|
|
call end
|
|
.else
|
|
set_test 4,"Anything besides enabling shouldnt't clock"
|
|
call begin
|
|
wchn 4,$40 ; enable length
|
|
wchn 1,-2 ; length = 2
|
|
wchn 4,$40 ; enabled -> enabled doesn't clock
|
|
wchn 4,$00 ; enabled -> disabled doesn't clock
|
|
wchn 4,$00 ; disabled -> disabled doesn't clock
|
|
ld a,2
|
|
call end
|
|
.endif
|
|
|
|
set_test 5,"If clock makes length zero, should disable chan"
|
|
call begin
|
|
wchn 1,-1 ; length = 1
|
|
wchn 4,$40 ; enable, causing clock to zero
|
|
lda chan_mask
|
|
ld b,a
|
|
lda NR52 ; channel now disabled
|
|
and b
|
|
jp nz,test_failed
|
|
|
|
set_test 6,"If length already reached zero, shouldn't clock"
|
|
call begin
|
|
wchn 1,-1 ; length = 1
|
|
wchn 4,$40 ; enable, causing clock to zero
|
|
wchn 4,0
|
|
wchn 4,$40 ; no clock; length still 0
|
|
wchn 4,0
|
|
wchn 4,$40 ; no clock; length still 0
|
|
lda chan_maxlen; end triggers channel, which loads it with max length
|
|
call end
|
|
|
|
set_test 7,"Trigger should un-freeze length that reached zero"
|
|
call begin
|
|
wchn 1,-1 ; length = 1
|
|
wchn 4,$40 ; enable, causing clock to zero
|
|
wchn 4,$00 ; disable
|
|
wchn 4,$80 ; trigger unfreezes length, so it takes on maximum value
|
|
delay_clocks 8192
|
|
wchn 4,$40 ; enable
|
|
delay_apu 2 ; clock length by 2
|
|
lda chan_maxlen
|
|
sub 2
|
|
call end_nodelay
|
|
|
|
set_test 8,"Trigger that un-freezes enabled length should clock it"
|
|
call begin
|
|
wchn 1,-1 ; length = 1
|
|
wchn 4,$40 ; enable, causing clock to zero
|
|
wchn 4,$00 ; disable
|
|
wchn 4,$C0 ; trigger unfreezes length, and since enabled, clocks it
|
|
lda chan_maxlen
|
|
dec a
|
|
call end_nodelay
|
|
|
|
call begin
|
|
wchn 1,-1 ; length = 1
|
|
wchn 4,$40 ; enable, causing clock to zero
|
|
wchn 4,$C0 ; trigger unfreezes length, and since enabled, clocks it
|
|
lda chan_maxlen
|
|
dec a
|
|
call end_nodelay
|
|
|
|
set_test 9,"Triggering that clocks length of 1 ","should clock twice and shouldn't freeze"
|
|
call begin
|
|
wchn 1,-1 ; length = 1
|
|
wchn 4,$C0 ; trigger and enable
|
|
; First length counter is enabled, which clocks it to 0 and freezes it
|
|
; Trigger unfreezes length counter, which clocks it AGAIN
|
|
; The result is the same as the previous test, which enables separately
|
|
lda chan_maxlen
|
|
dec a
|
|
call end_nodelay
|
|
|
|
set_test 10,"Trigger shouldn't otherwise affect length"
|
|
call begin
|
|
wchn 1,0 ; length = max
|
|
delay_clocks 8192
|
|
wchn 4,$80 ; trigger
|
|
lda chan_maxlen
|
|
call end_nodelay
|
|
|
|
.ifndef CGB_02
|
|
call begin
|
|
wchn 1,0 ; length = max
|
|
wchn 4,$80 ; trigger
|
|
lda chan_maxlen
|
|
call end
|
|
|
|
call begin
|
|
wchn 1,-2 ; length = 2
|
|
wchn 4,$80 ; trigger
|
|
ld a,2
|
|
call end
|
|
.endif
|
|
|
|
set_test 11,"Disabled DAC shouldn't stop other trigger effects"
|
|
call begin
|
|
wchn 0,$00 ; disable wave DAC
|
|
wchn 2,$07 ; disable square/noise DAC
|
|
wchn 1,-1
|
|
wchn 4,$C0 ; clocks length, which becomes max
|
|
wchn 0,$80 ; enable wave DAC
|
|
wchn 2,$08 ; enable square/noise DAC
|
|
wchn 4,$80 ; trigger
|
|
lda chan_maxlen
|
|
dec a
|
|
call end
|
|
|
|
set_test 12,"Other trigger effects should still occur when disabled"
|
|
call sync_apu
|
|
wchn 0,0
|
|
wchn 4,0
|
|
wchn 1,-1
|
|
wchn 4,$40 ; len = 0
|
|
wchn 4,0
|
|
wchn 4,$40 ; len = 0
|
|
wchn 4,$80 ; len = max
|
|
wchn 4,$40 ; len = max-1
|
|
wchn 4,0
|
|
wchn 4,$40 ; len = max-2
|
|
wchn 0,$80 ; enable now
|
|
wchn 4,$C0
|
|
lda chan_maxlen
|
|
sub 3
|
|
call delay_apu_cycles
|
|
lda chan_mask
|
|
ld b,a
|
|
lda NR52
|
|
and b
|
|
jp z,test_failed
|
|
delay_apu 1
|
|
lda NR52
|
|
and b
|
|
jp nz,test_failed
|
|
|
|
ret
|