Optimized ping pong some more.
This commit is contained in:
parent
ef1c519a6c
commit
f97f406272
Binary file not shown.
@ -1623,8 +1623,8 @@ pre_PlayerTick:
|
|||||||
move.w d5,pcd_out_len_w(a5)
|
move.w d5,pcd_out_len_w(a5)
|
||||||
|
|
||||||
moveq.l #-1,d3
|
moveq.l #-1,d3
|
||||||
.inst_set_wave_has_subloop
|
|
||||||
move.w d3,pcd_out_lof_w(a5)
|
move.w d3,pcd_out_lof_w(a5)
|
||||||
|
.inst_set_wave_has_subloop
|
||||||
move.l a1,pcd_out_ptr_l(a5)
|
move.l a1,pcd_out_ptr_l(a5)
|
||||||
move.w d1,pcd_inst_loop_offset_w(a5)
|
move.w d1,pcd_inst_loop_offset_w(a5)
|
||||||
|
|
||||||
@ -1930,15 +1930,19 @@ pre_PlayerTick:
|
|||||||
; ----------------------------------------
|
; ----------------------------------------
|
||||||
; wave loop pos advancing and pattern wave offset command handling
|
; wave loop pos advancing and pattern wave offset command handling
|
||||||
|
|
||||||
|
moveq.l #0,d1
|
||||||
|
tst.b wi_allow_9xx_b(a3)
|
||||||
|
sne d1
|
||||||
|
and.b pcd_wave_offset_b(a5),d1
|
||||||
|
|
||||||
move.w wi_subloop_len_w(a3),d3
|
move.w wi_subloop_len_w(a3),d3
|
||||||
beq .wave_has_no_subloop
|
beq .wave_has_no_subloop
|
||||||
move.w d3,pcd_out_len_w(a5) ; FIXME can we move this to wave loading?
|
move.w d3,pcd_out_len_w(a5) ; FIXME can we move this to wave loading?
|
||||||
|
move.w pcd_inst_subloop_wait_w(a5),d5
|
||||||
|
|
||||||
|
move.b pcd_inst_ping_pong_dir_b(a5),d4
|
||||||
move.w wi_subloop_step_w(a3),d2
|
move.w wi_subloop_step_w(a3),d2
|
||||||
moveq.l #0,d1
|
tst.w d1
|
||||||
move.b pcd_wave_offset_b(a5),d1
|
|
||||||
beq.s .wave_with_subloop_but_no_wave_offset
|
|
||||||
tst.b wi_allow_9xx_b(a3)
|
|
||||||
beq.s .wave_with_subloop_but_no_wave_offset
|
beq.s .wave_with_subloop_but_no_wave_offset
|
||||||
|
|
||||||
; update loop offset from pattern
|
; update loop offset from pattern
|
||||||
@ -1947,7 +1951,7 @@ pre_PlayerTick:
|
|||||||
clr.b pcd_wave_offset_b(a5)
|
clr.b pcd_wave_offset_b(a5)
|
||||||
|
|
||||||
; keep current direction of ping-pong unchanged
|
; keep current direction of ping-pong unchanged
|
||||||
move.b pcd_inst_ping_pong_dir_b(a5),d4
|
tst.b d4
|
||||||
bpl.s .wave_move_one_step_ahead
|
bpl.s .wave_move_one_step_ahead
|
||||||
sub.w d2,d1 ; go in reverse direction one step?
|
sub.w d2,d1 ; go in reverse direction one step?
|
||||||
bra.s .wave_submove_cont
|
bra.s .wave_submove_cont
|
||||||
@ -1957,23 +1961,29 @@ pre_PlayerTick:
|
|||||||
|
|
||||||
.wave_with_subloop_but_no_wave_offset
|
.wave_with_subloop_but_no_wave_offset
|
||||||
move.w pcd_inst_loop_offset_w(a5),d1
|
move.w pcd_inst_loop_offset_w(a5),d1
|
||||||
subq.w #1,pcd_inst_subloop_wait_w(a5)
|
subq.w #1,d5
|
||||||
bgt.s .wave_subloop_wait
|
bgt.s .wave_subloop_wait
|
||||||
|
|
||||||
; subloop moves!
|
; subloop moves!
|
||||||
move.b pcd_inst_ping_pong_dir_b(a5),d4
|
|
||||||
.wave_submove_cont
|
.wave_submove_cont
|
||||||
; reset subloop wait
|
; reset subloop wait
|
||||||
moveq.l #0,d5
|
moveq.l #0,d5
|
||||||
move.b wi_subloop_wait_b(a3),d5 ; FIXME why is this not increased by one here?
|
move.b wi_subloop_wait_b(a3),d5 ; FIXME why is this not increased by one here?
|
||||||
move.w d5,pcd_inst_subloop_wait_w(a5)
|
|
||||||
|
|
||||||
tst.b d4
|
tst.b d4
|
||||||
bpl.s .loop_is_moving_backwards
|
bmi.s .loop_is_moving_forwards
|
||||||
|
sub.w d2,d1 ; decrement offset in backward direction one step
|
||||||
|
|
||||||
|
move.w wi_loop_start_w(a3),d2
|
||||||
|
sub.w d1,d2 ; calc how many bytes we are past front
|
||||||
|
bmi.s .wave_new_loop_pos_fits
|
||||||
|
bra.s .wave_loop_dir_changed
|
||||||
|
|
||||||
|
.loop_is_moving_forwards
|
||||||
add.w d2,d1 ; increment offset in forward direction one step
|
add.w d2,d1 ; increment offset in forward direction one step
|
||||||
|
|
||||||
move.w d1,d4
|
move.w d1,d4
|
||||||
add.w d3,d4 ; calculate next start of loop (curr start)
|
add.w d3,d4 ; calculate new end position of loop sample
|
||||||
|
|
||||||
move.w wi_loop_end_w(a3),d2
|
move.w wi_loop_end_w(a3),d2
|
||||||
cmp.w d1,d2
|
cmp.w d1,d2
|
||||||
@ -1983,46 +1993,28 @@ pre_PlayerTick:
|
|||||||
sub.w d4,d2 ; space left = (max(loop end, sample end) - curr start)
|
sub.w d4,d2 ; space left = (max(loop end, sample end) - curr start)
|
||||||
bhi.s .wave_new_loop_pos_fits ; max(loop end, sample end) > curr start?
|
bhi.s .wave_new_loop_pos_fits ; max(loop end, sample end) > curr start?
|
||||||
|
|
||||||
add.w d2,d1 ; place offset at last possible place (loop_end - loop size)
|
|
||||||
|
|
||||||
clr.b pcd_inst_ping_pong_dir_b(a5) ; mark going backwards
|
|
||||||
bra.s .wave_loop_dir_changed
|
|
||||||
|
|
||||||
.loop_is_moving_backwards
|
|
||||||
sub.w d2,d1 ; decrement offset in backward direction one step
|
|
||||||
|
|
||||||
move.w wi_loop_start_w(a3),d4
|
|
||||||
|
|
||||||
move.w d4,d2
|
|
||||||
sub.w d1,d2 ; calc how many bytes we are past front
|
|
||||||
bmi.s .wave_new_loop_pos_fits
|
|
||||||
|
|
||||||
.wave_hit_front_of_loop
|
|
||||||
move.w d4,d1
|
|
||||||
st pcd_inst_ping_pong_dir_b(a5)
|
|
||||||
|
|
||||||
.wave_loop_dir_changed
|
.wave_loop_dir_changed
|
||||||
|
add.w d2,d1 ; fix front of looip
|
||||||
|
not.b pcd_inst_ping_pong_dir_b(a5)
|
||||||
|
IFEQ PRETRACKER_FASTER_CODE ; this extra code doesn't seem to be justified
|
||||||
tst.w d2
|
tst.w d2
|
||||||
bne.s .wave_new_loop_pos_fits ; perfect fit for last loop
|
bne.s .wave_new_loop_pos_fits ; perfect fit for last loop
|
||||||
|
|
||||||
; partial fit only
|
; partial fit only
|
||||||
subq.w #1,pcd_inst_subloop_wait_w(a5) ; why, oh why?
|
subq.w #1,d5 ; why, oh why?
|
||||||
|
ENDC
|
||||||
.wave_new_loop_pos_fits
|
.wave_new_loop_pos_fits
|
||||||
move.w d1,pcd_inst_loop_offset_w(a5)
|
move.w d1,pcd_inst_loop_offset_w(a5)
|
||||||
|
|
||||||
.wave_subloop_wait
|
.wave_subloop_wait
|
||||||
|
move.w d5,pcd_inst_subloop_wait_w(a5)
|
||||||
move.w d1,pcd_out_lof_w(a5)
|
move.w d1,pcd_out_lof_w(a5)
|
||||||
|
|
||||||
moveq.l #0,d1
|
moveq.l #0,d1
|
||||||
bra.s .wave_load_sample_offset
|
bra.s .wave_load_sample_offset
|
||||||
|
|
||||||
.wave_has_no_subloop
|
.wave_has_no_subloop
|
||||||
moveq.l #0,d1
|
tst.w d1
|
||||||
move.b pcd_wave_offset_b(a5),d1
|
beq.s .wave_loop_handling_done
|
||||||
beq.s .loop_handling_done
|
|
||||||
tst.b wi_allow_9xx_b(a3)
|
|
||||||
beq.s .loop_handling_done
|
|
||||||
|
|
||||||
; apply offset from pattern for sample without subloop
|
; apply offset from pattern for sample without subloop
|
||||||
lsl.w #7,d1
|
lsl.w #7,d1
|
||||||
@ -2049,8 +2041,7 @@ pre_PlayerTick:
|
|||||||
add.l pv_wave_sample_table(a4,d2.w),d1
|
add.l pv_wave_sample_table(a4,d2.w),d1
|
||||||
move.l d1,pcd_out_ptr_l(a5)
|
move.l d1,pcd_out_ptr_l(a5)
|
||||||
|
|
||||||
;move.w #$FFFF,pcd_out_lof_w(a5) ; this is already set to -1, no need to set it again
|
.wave_loop_handling_done
|
||||||
.loop_handling_done
|
|
||||||
|
|
||||||
; ----------------------------------------
|
; ----------------------------------------
|
||||||
; pitch handling
|
; pitch handling
|
||||||
|
Loading…
Reference in New Issue
Block a user