Store instrument number * 4 on loading to avoid using two adds every frame

This commit is contained in:
Chris Hodges 2022-12-27 21:10:27 +01:00
parent 4736b305f9
commit 627b388615
2 changed files with 28 additions and 26 deletions

View File

@ -107,6 +107,8 @@ solve this problem.
- Further optimized ADSR code
- Optimized wave loop code
- Bake in this strange vibrato speed multiplication to precalculated vibrato value (where possible)
- Various small optimizations
- Store instrument number * 4 on loading to avoid using two adds every frame
### V1.0 (26-Dec-22)

View File

@ -449,7 +449,7 @@ pcd_pat_portamento_dest_w rs.w 1 ; portamento destination pitch
pcd_pat_pitch_slide_w rs.w 1
pcd_pat_vol_ramp_speed_b rs.b 1
pcd_pat_2nd_inst_num_b rs.b 1
pcd_pat_2nd_inst_num4_b rs.b 1
pcd_pat_2nd_inst_delay_b rs.b 1
pcd_wave_offset_b rs.b 1
@ -493,7 +493,7 @@ pcd_track_delay_steps_b rs.b 1 ; $00 = no track delay, $ff = stop track d
pcd_track_delay_vol16_b rs.b 1
pcd_track_init_delay_b rs.b 1 ; number of frames to ignore the delay
pcd_inst_num_w rs.w 1 ; current instrument number (lower byte used)
pcd_inst_num4_w rs.w 1 ; current instrument number * 4
;pcd_inst_new_step_w rs.w 1 ; seems to be unused
pcd_inst_subloop_wait_w rs.w 1
pcd_inst_loop_offset_w rs.w 1
@ -502,8 +502,8 @@ pcd_inst_info_ptr rs.l 1 ; pointer to currently active instrument
pcd_waveinfo_ptr rs.l 1 ; pointer to currently active waveinfo
pcd_channel_mask_b rs.b 1
pcd_channel_num_b rs.b 1
pcd_adsr_phase_w rs.w 1 ; 0=attack, 1=decay, 2=sustain, 3=release
pcd_adsr_volume_w rs.w 1 ; 0 for restart / $400 (word only)
pcd_adsr_phase_w rs.w 1 ; 0=attack, 1=decay, 2=sustain, 3=release ! do not change order
pcd_adsr_volume_w rs.w 1 ; 0 for restart / $400 (word only) ! do not change order
pcd_adsr_phase_speed_b rs.b 1
pcd_inst_ping_pong_dir_b rs.b 1 ; direction of ping-pong (-1 == $00 / +1 = $ff)
pcd_adsr_pos_w rs.w 1 ; pos in adsr curve
@ -2356,7 +2356,7 @@ pre_PlayerTick:
; ----------------------------------------
.handle_2nd_instrument
moveq.l #0,d1
move.b pcd_pat_2nd_inst_num_b(a5),d1
move.b pcd_pat_2nd_inst_num4_b(a5),d1
beq.s .handle_current_instrument
move.b pcd_pat_2nd_inst_delay_b(a5),d3
@ -2366,9 +2366,10 @@ pre_PlayerTick:
bra.s .handle_current_instrument
.trigger_2nd_instrument
move.w d1,pcd_inst_num_w(a5)
move.b d1,pcd_new_inst_num_b(a5)
lsl.w #4,d1
move.w d1,pcd_inst_num4_w(a5)
add.w d1,d1
add.w d1,d1
lea sv_inst_infos_table-uii_SIZEOF(a6),a1
add.w d1,a1
move.l a1,pcd_inst_info_ptr(a5) ; loads 2nd instrument
@ -2377,7 +2378,7 @@ pre_PlayerTick:
moveq.l #0,d1
move.l a5,a1
move.l d1,(a1)+ ; pcd_pat_portamento_dest_w and pcd_pat_pitch_slide_w
move.l d1,(a1)+ ; pcd_pat_vol_ramp_speed_b, pcd_pat_2nd_inst_num_b, pcd_pat_2nd_inst_delay_b, pcd_wave_offset_b
move.l d1,(a1)+ ; pcd_pat_vol_ramp_speed_b, pcd_pat_2nd_inst_num4_b, pcd_pat_2nd_inst_delay_b, pcd_wave_offset_b
move.l d1,(a1)+ ; pcd_inst_pitch_slide_w and pcd_inst_sel_arp_note_w
move.w d1,(a1)+ ; pcd_inst_note_pitch_w
addq.w #2,a1
@ -2536,13 +2537,15 @@ pre_PlayerTick:
; ----------------------------------------
; read out pattern editor data
moveq.l #0,d6 ; clear arp flag
move.b pdb_pitch_ctrl(a0),d3 ; pitch and control byte
bpl.s .noselinst16plus
add.w #16,d4 ; add high bit of instrument number
.noselinst16plus
moveq.l #$3f,d7
and.w d3,d7 ; pitch
tst.w d4
add.w d4,d4
add.w d4,d4
beq.s .no_new_note ; if no instrument
tst.w d7
bne.s .no_new_note ; if it has pitch
@ -2550,18 +2553,17 @@ pre_PlayerTick:
; only change of instrument, not pitch
move.b pcd_loaded_inst_vol_b(a5),pcd_pat_vol_b(a5)
cmp.w pcd_inst_num_w(a5),d4
cmp.w pcd_inst_num4_w(a5),d4
bne.s .no_new_note
clr.w pcd_adsr_phase_w(a5) ; attack!
clr.w pcd_adsr_volume_w(a5)
; attack!
move.l d6,pcd_adsr_phase_w(a5) ; and pcd_adsr_volume_w
;clr.w pcd_adsr_volume_w(a5)
;move.b #1,pcd_adsr_trigger_b(a5) ; never read
.no_new_note
; d2 = effect cmd, d3 = pitch_ctrl, d4 = inst number, d5 = effect data, d7 = pitch
moveq.l #0,d6 ; clear arp flag
andi.b #$40,d3 ; ARP bit
bne.s .has_arp_note
.no_arp_note
@ -2572,6 +2574,8 @@ pre_PlayerTick:
beq.s .no_effect
moveq.l #15,d1 ; FIXME seems like it only supports the lower 15 instruments
and.b d5,d1
add.w d1,d1
add.w d1,d1
tst.b d7
bne.s .play_2nd_inst_without_trigger
@ -2652,9 +2656,10 @@ pre_PlayerTick:
.trigger_new_instrument
move.w d4,d1
move.w d1,pcd_inst_num_w(a5)
move.b d1,pcd_new_inst_num_b(a5)
lsl.w #4,d1
move.w d1,pcd_inst_num4_w(a5)
add.w d1,d1
add.w d1,d1
lea sv_inst_infos_table-uii_SIZEOF(a6),a1
add.w d1,a1
move.l a1,pcd_inst_info_ptr(a5)
@ -2663,7 +2668,7 @@ pre_PlayerTick:
moveq.l #0,d1
move.l a5,a1
move.l d1,(a1)+ ; pcd_pat_portamento_dest_w and pcd_pat_pitch_slide_w
move.l d1,(a1)+ ; pcd_pat_vol_ramp_speed_b, pcd_pat_2nd_inst_num_b, pcd_pat_2nd_inst_delay_b, pcd_wave_offset_b
move.l d1,(a1)+ ; pcd_pat_vol_ramp_speed_b, pcd_pat_2nd_inst_num4_b, pcd_pat_2nd_inst_delay_b, pcd_wave_offset_b
move.l d1,(a1)+ ; pcd_inst_pitch_slide_w and pcd_inst_sel_arp_note_w
move.l d1,(a1)+ ; pcd_inst_note_pitch_w and pcd_inst_curr_port_pitch_w
@ -2725,7 +2730,7 @@ pre_PlayerTick:
; FIXME can we move this code to avoid blocking the two registers d3/d5
tst.b d3
beq.s .has_no_second_inst
move.b d3,pcd_pat_2nd_inst_num_b(a5)
move.b d3,pcd_pat_2nd_inst_num4_b(a5)
move.b d5,d3
lsr.b #4,d3
move.b d3,pcd_pat_2nd_inst_delay_b(a5)
@ -3070,9 +3075,7 @@ pre_PlayerTick:
moveq.l #0,d3 ; flag for stitching -- if set, must not trigger new note
; enters with d4 = -1, meaning no first note pos yet
move.w pcd_inst_num_w(a5),d1
add.w d1,d1
add.w d1,d1
move.w pcd_inst_num4_w(a5),d1
movea.l sv_inst_patterns_table-4(a6,d1.w),a0
add.w d0,a0
@ -3165,7 +3168,7 @@ pre_PlayerTick:
moveq.l #0,d3
move.w wi_loop_offset_w(a3),d6 ; is unlikely 32768
tst.w wi_subloop_len_w(a3)
move.w wi_subloop_len_w(a3),d5
bne.s .inst_set_wave_has_subloop
adda.w d6,a1 ; add loop offset
@ -3293,9 +3296,7 @@ pre_PlayerTick:
moveq.l #-1,d4 ; mark as no first stitch pos
ENDC
move.w pcd_inst_num_w(a5),d1
add.w d1,d1
add.w d1,d1
move.w pcd_inst_num4_w(a5),d1
movea.l sv_inst_patterns_table-4(a6,d1.w),a0
add.w d5,a0
@ -3436,7 +3437,6 @@ pre_PlayerTick:
; expects d2 = inst num
; a5 = channel
move.w pcd_inst_vol_w(a5),d1
tst.b pcd_new_inst_num_b(a5)
bne.s .load_instrument