Nosync/sync wave selection optimized among other smaller optimizations.

This commit is contained in:
Chris Hodges 2023-08-20 21:09:34 +02:00
parent 815d5f6e29
commit 1580f0a174
3 changed files with 80 additions and 83 deletions

View File

@ -101,7 +101,7 @@ The original code compressed with *Blueberry's* Shrinkler goes from
18052 bytes down to 9023 bytes. 18052 bytes down to 9023 bytes.
Raspberry Casket, depending on the features compiled in, is about Raspberry Casket, depending on the features compiled in, is about
5802 bytes and shrinkles down to ~4125 bytes (in isolation). 5784 bytes and shrinkles down to ~4118 bytes (in isolation).
So this means that the optimization is not just "on the outside". So this means that the optimization is not just "on the outside".
@ -165,10 +165,11 @@ solve this problem.
- This also fixes usages of illegal period 0 in the lead-in that could cause the replay to miss the first trigger. - This also fixes usages of illegal period 0 in the lead-in that could cause the replay to miss the first trigger.
- Moved pattern table init from PlayerInit to SongInit, optimized SongInit a bit. - Moved pattern table init from PlayerInit to SongInit, optimized SongInit a bit.
- Wave order table filling moved and optimized in SongInit. - Wave order table filling moved and optimized in SongInit.
- Added Presto player draft.
- Bugfix: Songend detection for back-jumps was broken since at least V1.1. - Bugfix: Songend detection for back-jumps was broken since at least V1.1.
- Optimized some more wave selection code. - Optimized some more wave selection code.
- Drop-in replacement code size: 5802 bytes. - Nosync/sync wave selection optimized.
- Added Presto player draft.
- Drop-in replacement code size: 5784 bytes.
### V1.x (unreleased) ### V1.x (unreleased)
- Fixed a bug regarding the copper output mode with looping waves having a loop-offset. - Fixed a bug regarding the copper output mode with looping waves having a loop-offset.

Binary file not shown.

View File

@ -1,5 +1,5 @@
;-------------------------------------------------------------------- ;--------------------------------------------------------------------
; Raspberry Casket Player V2.x (19-Aug-2023) ; Raspberry Casket Player V2.x (20-Aug-2023)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; ;
; Provided by Chris 'platon42' Hodges <chrisly@platon42.de> ; Provided by Chris 'platon42' Hodges <chrisly@platon42.de>
@ -96,7 +96,7 @@
; 18052 bytes down to 9023 bytes. ; 18052 bytes down to 9023 bytes.
; ;
; Raspberry Casket, depending on the features compiled in, is about ; Raspberry Casket, depending on the features compiled in, is about
; 5802 bytes and shrinkles down to ~4125 bytes (in isolation). ; 5784 bytes and shrinkles down to ~4118 bytes (in isolation).
; ;
; So this means that the optimization is not just "on the outside". ; So this means that the optimization is not just "on the outside".
; ;
@ -433,7 +433,7 @@ pre_SongInit:
dbra d3,.waveorderloop dbra d3,.waveorderloop
.hasnowaveordering .hasnowaveordering
lea sv_pattern_table(a1),a0 lea sv_pattern_table(a1),a0
.pattableloop .pattableloop
move.l a4,(a0)+ move.l a4,(a0)+
@ -1476,7 +1476,6 @@ pre_PlayerTick:
IFNE PRETRACKER_PARANOIA_MODE IFNE PRETRACKER_PARANOIA_MODE
moveq.l #0,d2 ; default to not stitched moveq.l #0,d2 ; default to not stitched
move.b (a0)+,d1 ; pdb_pitch_ctrl get pitch byte move.b (a0)+,d1 ; pdb_pitch_ctrl get pitch byte
move.b d1,d6
bpl.s .inst_note_is_not_stitched ; means that note is stitched bpl.s .inst_note_is_not_stitched ; means that note is stitched
tst.w d4 tst.w d4
@ -1486,15 +1485,15 @@ pre_PlayerTick:
moveq.l #1,d2 ; next note will be fetched immediately moveq.l #1,d2 ; next note will be fetched immediately
.inst_note_is_not_stitched .inst_note_is_not_stitched
ELSE ELSE
move.b (a0)+,d1 ; pdb_pitch_ctrl get pitch byte move.b (a0)+,d6 ; pdb_pitch_ctrl get pitch byte
move.b d1,d6
smi d2 ; note stitched? smi d2 ; note stitched?
;neg.b d2 ;neg.b d2
ENDC ENDC
tst.b d3 tst.b d3
bne.s .skippitchloading bne.s .skippitchloading
and.w #$3f,d1 moveq.l #$3f,d1
and.w d6,d1
beq.s .skippitchloading ; no new note beq.s .skippitchloading ; no new note
subq.w #1,d1 subq.w #1,d1
lsl.w #4,d1 lsl.w #4,d1
@ -1508,9 +1507,9 @@ pre_PlayerTick:
moveq.l #15,d6 moveq.l #15,d6
and.b (a0)+,d6 ; pdb_effect_cmd command number and.b (a0)+,d6 ; pdb_effect_cmd command number
add.w d6,d6 add.w d6,d6
moveq.l #0,d5
move.b (a0)+,d5 ; pdb_effect_data command parameter byte
move.w .inst_command_jmptable(pc,d6.w),d3 move.w .inst_command_jmptable(pc,d6.w),d3
moveq.l #0,d5
move.b (a0)+,d5 ; pdb_effect_data command parameter byte, note that condition codes are used in inst_set_speed
jmp .inst_command_jmptable(pc,d3.w) jmp .inst_command_jmptable(pc,d3.w)
.inst_command_jmptable .inst_command_jmptable
@ -1534,6 +1533,7 @@ pre_PlayerTick:
; d0 = current step / next step ; d0 = current step / next step
; d5 = command parameter data / scratch ; d5 = command parameter data / scratch
; d2 = note stitched flag ; d2 = note stitched flag
; d1 = scratch
; d3 = scratch ; d3 = scratch
; d6 = scratch ; d6 = scratch
; ---------------------------------------- ; ----------------------------------------
@ -1546,7 +1546,7 @@ pre_PlayerTick:
add.w d5,d5 add.w d5,d5
cmp.w pcd_inst_wave_num4_w(a5),d5 cmp.w pcd_inst_wave_num4_w(a5),d5
beq.s .inst_set_wave_rts beq.s .inst_set_wave_rts
.inst_select_wave_subroutine .inst_select_wave_subroutine
move.w d5,pcd_inst_wave_num4_w(a5) move.w d5,pcd_inst_wave_num4_w(a5)
move.l sv_waveinfo_table(a6,d5.w),a3 move.l sv_waveinfo_table(a6,d5.w),a3
@ -1560,16 +1560,58 @@ pre_PlayerTick:
moveq.l #0,d3 moveq.l #0,d3
tst.w d6 move.w wi_loop_offset_w(a3),d1 ; is unlikely >= 32768 -- if it is, it will be past end of sample
bne.s .inst_select_wave_nosync
move.w wi_loop_offset_w(a3),d6 ; is unlikely >= 32768 -- if it is, it will be past end of sample
tst.w wi_subloop_len_w(a3) tst.w wi_subloop_len_w(a3)
bne.s .inst_set_wave_has_subloop beq.s .inst_set_wave_has_no_subloop
.inst_set_wave_has_no_subloop
adda.w d6,a1 ; add loop offset (which is actually not a loop offset for one-shot samples)
sub.w d6,d5 tst.w d6
beq.s .inst_set_wave_has_subloop
; nosync version
.inst_set_wave_ns_has_subloop
move.w d3,pcd_out_lof_w(a5)
move.l a1,pcd_out_ptr_l(a5)
IFEQ PRETRACKER_BUGFIX_CODE
move.w pcd_inst_loop_offset_w(a5),d1
cmp.w d1,d5
ELSE
cmp.w pcd_inst_loop_offset_w(a5),d5
ENDC
bhs.s .inst_set_wave_ns_keep_pp
st pcd_inst_ping_pong_dir_b(a5)
.inst_set_wave_ns_keep_pp
clr.w pcd_inst_subloop_wait_w(a5)
IFEQ PRETRACKER_BUGFIX_CODE ; This adds an extra jump to the wave that's not desired
sub.w wi_subloop_step_w(a3),d1
move.w d1,pcd_inst_loop_offset_w(a5)
ENDC
rts
.inst_set_wave_has_no_subloop
IFEQ PRETRACKER_BUGFIX_CODE
tst.w d6
beq.s .inst_select_wave_nosync_no_subloop
; note that nosync on non-looping waves doesn't effectivly do anything special
adda.w d1,a1
sub.w d1,d5
;cmp.w #1,d5 ; not necessary as increases in steps of 2
bhi.s .inst_set_wave_ns_has_min_length
moveq.l #2,d5
.inst_set_wave_ns_has_min_length
move.w d5,pcd_out_len_w(a5)
moveq.l #-1,d3
bra.s .inst_set_wave_ns_has_subloop
.inst_select_wave_nosync_no_subloop
ENDC
adda.w d1,a1 ; add loop offset (which is actually not a loop offset for one-shot samples)
sub.w d1,d5
;cmp.w #1,d5 ; not necessary as increases in steps of 2 ;cmp.w #1,d5 ; not necessary as increases in steps of 2
bhi.s .inst_set_wave_has_min_length bhi.s .inst_set_wave_has_min_length
moveq.l #2,d5 moveq.l #2,d5
@ -1583,7 +1625,7 @@ pre_PlayerTick:
.inst_set_wave_has_subloop .inst_set_wave_has_subloop
move.w d3,pcd_out_lof_w(a5) move.w d3,pcd_out_lof_w(a5)
move.l a1,pcd_out_ptr_l(a5) move.l a1,pcd_out_ptr_l(a5)
move.w d6,pcd_inst_loop_offset_w(a5) move.w d1,pcd_inst_loop_offset_w(a5)
st pcd_inst_ping_pong_dir_b(a5) st pcd_inst_ping_pong_dir_b(a5)
moveq.l #0,d5 moveq.l #0,d5
@ -1593,57 +1635,6 @@ pre_PlayerTick:
.inst_set_wave_rts .inst_set_wave_rts
rts rts
; ----------------------------------------
.inst_select_wave_nosync
IFNE PRETRACKER_BUGFIX_CODE
move.w wi_loop_offset_w(a3),d6
tst.w wi_subloop_len_w(a3)
beq.s .inst_set_wave_has_no_subloop
ELSE
tst.w wi_subloop_len_w(a3)
bne.s .inst_set_wave_ns_has_subloop
; note that nosync on non-looping waves doesn't effectivly do anything special
move.w wi_loop_offset_w(a3),d6
adda.w d6,a1
sub.w d6,d5
;cmp.w #1,d5 ; not necessary as increases in steps of 2
bhi.s .inst_set_wave_ns_has_min_length
moveq.l #2,d5
.inst_set_wave_ns_has_min_length
move.w d5,pcd_out_len_w(a5)
moveq.l #-1,d3
ENDC
.inst_set_wave_ns_has_subloop
move.w d3,pcd_out_lof_w(a5)
move.l a1,pcd_out_ptr_l(a5)
IFEQ PRETRACKER_BUGFIX_CODE
move.w pcd_inst_loop_offset_w(a5),d6
cmp.w d6,d5
ELSE
cmp.w pcd_inst_loop_offset_w(a5),d5
ENDC
bhs.s .inst_set_wave_ns_keep_pp
st pcd_inst_ping_pong_dir_b(a5)
.inst_set_wave_ns_keep_pp
clr.w pcd_inst_subloop_wait_w(a5)
IFEQ PRETRACKER_BUGFIX_CODE ; This adds an extra jump to the wave that's not desired
sub.w wi_subloop_step_w(a3),d6
move.w d6,pcd_inst_loop_offset_w(a5)
ENDC
rts
; ----------------------------------------
.inst_slide_down
neg.w d5
.inst_slide_up
move.w d5,pcd_inst_pitch_slide_w(a5)
bra .inst_cmd_cont_next
; ---------------------------------------- ; ----------------------------------------
.inst_adsr .inst_adsr
subq.w #1,d5 subq.w #1,d5
@ -1681,7 +1672,7 @@ pre_PlayerTick:
bra.s .inst_cmd_cont_next bra.s .inst_cmd_cont_next
.inst_vol_slide_up .inst_vol_slide_up
lsr.b #4,d5 lsr.w #4,d5
move.b d5,pcd_inst_vol_slide_b(a5) move.b d5,pcd_inst_vol_slide_b(a5)
bra.s .inst_cmd_cont_next bra.s .inst_cmd_cont_next
@ -1708,12 +1699,12 @@ pre_PlayerTick:
movea.l sv_inst_patterns_table-4(a6,d1.w),a0 movea.l sv_inst_patterns_table-4(a6,d1.w),a0
add.w d5,a0 add.w d5,a0
add.w d5,d5 add.w d5,a0
add.w d5,a0 add.w d5,a0
bra.s .inst_fetch_next bra.s .inst_fetch_next
.inst_we_were_stitched .inst_we_were_stitched
move.b pcd_inst_speed_stop_b(a5),d2 moveq.l #0,d2
bra.s .inst_cont_from_nasty_double_jump bra.s .inst_cont_from_nasty_double_jump
; ---------------------------------------- ; ----------------------------------------
@ -1753,12 +1744,17 @@ pre_PlayerTick:
addq.w #1,d0 addq.w #1,d0
bra.s .inst_fetch_next bra.s .inst_fetch_next
; ----------------------------------------
.inst_slide_down
neg.w d5
.inst_slide_up
move.w d5,pcd_inst_pitch_slide_w(a5)
bra.s .inst_cmd_cont_next
; ---------------------------------------- ; ----------------------------------------
.inst_set_speed .inst_set_speed
tst.w d5 seq d3
bne.s .inst_set_speed_nostop or.b d3,d5
st d5
.inst_set_speed_nostop
move.b d5,pcd_inst_speed_stop_b(a5) move.b d5,pcd_inst_speed_stop_b(a5)
; ---------------------------------------- ; ----------------------------------------
@ -1777,8 +1773,8 @@ pre_PlayerTick:
.inst_pat_loop_exit .inst_pat_loop_exit
st d2 st d2
.inst_pat_loop_exit2 .inst_pat_loop_exit2
add.b pcd_inst_speed_stop_b(a5),d2
.inst_cont_from_nasty_double_jump .inst_cont_from_nasty_double_jump
add.b pcd_inst_speed_stop_b(a5),d2
move.b d2,pcd_inst_line_ticks_b(a5) move.b d2,pcd_inst_line_ticks_b(a5)
move.b d0,pcd_inst_step_pos_b(a5) ; update inst step pos move.b d0,pcd_inst_step_pos_b(a5) ; update inst step pos
@ -1830,8 +1826,9 @@ pre_PlayerTick:
; same code for both release and decay ; same code for both release and decay
.adsr_decay_and_release .adsr_decay_and_release
moveq.l #0,d4 moveq.l #0,d4
moveq.l #-$71,d5 ; same as $8f, we only need the byte
move.b pcd_adsr_phase_speed_b(a5),d4 move.b pcd_adsr_phase_speed_b(a5),d4
cmp.b #$8f,d4 cmp.b d5,d4
bhs.s .adsr_absurd_slow_release bhs.s .adsr_absurd_slow_release
move.b d4,d5 move.b d4,d5
addq.b #1,d5 addq.b #1,d5
@ -1842,7 +1839,6 @@ pre_PlayerTick:
.adsr_absurd_slow_release .adsr_absurd_slow_release
moveq.l #2,d4 ; FIXME I guess this should be 1, if I look at the roll-off table moveq.l #2,d4 ; FIXME I guess this should be 1, if I look at the roll-off table
moveq.l #-$71,d5 ; same as $8f, we only need the byte
.adsr_release_cont .adsr_release_cont
move.b d5,pcd_adsr_phase_speed_b(a5) move.b d5,pcd_adsr_phase_speed_b(a5)
@ -1998,7 +1994,7 @@ pre_PlayerTick:
move.w wi_loop_start_w(a3),d4 move.w wi_loop_start_w(a3),d4
move.w d4,d2 move.w d4,d2
sub.w d1,d2 ; calc how many bytes we are part front sub.w d1,d2 ; calc how many bytes we are past front
bmi.s .wave_new_loop_pos_fits bmi.s .wave_new_loop_pos_fits
.wave_hit_front_of_loop .wave_hit_front_of_loop