Cosmetics, doc updates, and optimizations.
This commit is contained in:
parent
d2360ef174
commit
40822e295c
16
README.md
16
README.md
@ -99,8 +99,20 @@ the remaining code for playback.
|
|||||||
|
|
||||||
### Timing
|
### Timing
|
||||||
|
|
||||||
Sample generation is a bit faster (I guess around 10-15%),
|
#### Sample precalculation
|
||||||
but most of the time is spent on `muls` operations, so this is the limiting factor.
|
|
||||||
|
Sample generation is a faster than the original 1.0 player and also
|
||||||
|
faster than the 1.5 player, which got a slightly better performance
|
||||||
|
than the 1.0 one (compiler change?).
|
||||||
|
|
||||||
|
According to my measurements on my set of Pretracker tunes,
|
||||||
|
Raspberry Casket needs between 10% to 20% less instructions.
|
||||||
|
Of these instructions, about 5% are `muls` operations and the new
|
||||||
|
player is only able to shave off between 3% and 8% percent of those,
|
||||||
|
so this is probably the limiting factor.
|
||||||
|
|
||||||
|
#### Playback
|
||||||
|
|
||||||
Raspberry Casket is about twice as fast as the old replayer for playback.
|
Raspberry Casket is about twice as fast as the old replayer for playback.
|
||||||
|
|
||||||
Unfortunately, the replayer is still pretty slow and has high
|
Unfortunately, the replayer is still pretty slow and has high
|
||||||
|
Binary file not shown.
@ -346,23 +346,23 @@ pre_PrepareCopperlist:
|
|||||||
;********************************************************************
|
;********************************************************************
|
||||||
pre_SongInit:
|
pre_SongInit:
|
||||||
IFNE PRETRACKER_DONT_TRASH_REGS
|
IFNE PRETRACKER_DONT_TRASH_REGS
|
||||||
movem.l d2/d7/a2-a5,-(sp)
|
movem.l d2-d7/a2-a5,-(sp)
|
||||||
ENDC
|
ENDC
|
||||||
moveq.l #0,d0
|
moveq.l #0,d0
|
||||||
move.l $0000(a2),d1
|
movem.l (a2),d1/d3-d6 ; song offsets $0000/$0004/$0008/$000c/$0010
|
||||||
move.b d1,d2
|
move.b d1,d2
|
||||||
move.b d0,d1
|
move.b d0,d1
|
||||||
cmp.l #$50525400,d1 ; "PRE"-Text
|
cmp.l #$50525400,d1 ; "PRE"-Text
|
||||||
bne .error
|
bne .error
|
||||||
moveq.l #MAX_INSTRUMENTS-1,d7 ; notice there's one extra name (available in 1.5, but not usable)!
|
moveq.l #MAX_INSTRUMENTS-1,d7 ; notice there's one extra name (available in 1.5, but not usable)!
|
||||||
IFNE PRETRACKER_SUPPORT_V1_5
|
IFNE PRETRACKER_SUPPORT_V1_5
|
||||||
cmpi.b #$1e,d2
|
cmp.b #$1e,d2
|
||||||
bgt .error
|
bgt .error
|
||||||
bne.s .nopatchv15
|
bne.s .nopatchv15
|
||||||
move.l $005c(a2),d0 ; make song backward compatible
|
move.l $005c(a2),d0 ; make song backward compatible
|
||||||
ror.w #8,d0
|
ror.w #8,d0
|
||||||
move.l d0,$003c(a2)
|
move.l d0,$003c(a2)
|
||||||
addq.l #8,$0004(a2) ; skip over first pattern data
|
addq.l #8,d3 ; skip over first pattern data (offset $0004)
|
||||||
moveq.l #2*MAX_INSTRUMENTS-1,d7 ; v1.5 has 32 slots (the other ones used for sfx)
|
moveq.l #2*MAX_INSTRUMENTS-1,d7 ; v1.5 has 32 slots (the other ones used for sfx)
|
||||||
.nopatchv15
|
.nopatchv15
|
||||||
ELSE
|
ELSE
|
||||||
@ -379,17 +379,13 @@ pre_SongInit:
|
|||||||
move.b $003f(a2),sv_num_steps_b(a1) ; number of steps!
|
move.b $003f(a2),sv_num_steps_b(a1) ; number of steps!
|
||||||
move.b $0041(a2),sv_num_waves_b(a1) ; number of instruments
|
move.b $0041(a2),sv_num_waves_b(a1) ; number of instruments
|
||||||
|
|
||||||
move.l $0004(a2),d0
|
add.l a2,d3 ; add to offset $0004
|
||||||
add.l a2,d0
|
move.l d3,sv_pos_data_adr(a1) ; address to position data (POSD)
|
||||||
move.l d0,sv_pos_data_adr(a1) ; address to position data (POSD)
|
|
||||||
|
|
||||||
move.l $0008(a2),d0
|
add.l a2,d4 ; add to offset $0008
|
||||||
add.l a2,d0
|
move.l d4,sv_patterns_ptr(a1) ; address to pattern data (PATT)
|
||||||
move.l d0,sv_patterns_ptr(a1) ; address to pattern data (PATT)
|
|
||||||
|
|
||||||
move.l $000c(a2),d0 ; offset into instrument names
|
|
||||||
lea (a2,d0.l),a0 ; instrument names
|
|
||||||
|
|
||||||
|
lea (a2,d5.l),a0 ; offset (from $000c) into instrument names
|
||||||
.instrnamesloop
|
.instrnamesloop
|
||||||
moveq.l #23-1,d0 ; max 23 chars
|
moveq.l #23-1,d0 ; max 23 chars
|
||||||
.inststrloop
|
.inststrloop
|
||||||
@ -466,8 +462,7 @@ pre_SongInit:
|
|||||||
dbra d7,.instinfoloop
|
dbra d7,.instinfoloop
|
||||||
|
|
||||||
.noinstsskip
|
.noinstsskip
|
||||||
move.l $0010(a2),d0 ; offset into wave names
|
lea (a2,d6.l),a0 ; offset (from $0010) into wave names
|
||||||
lea (a2,d0.l),a0
|
|
||||||
moveq.l #MAX_WAVES-1,d7
|
moveq.l #MAX_WAVES-1,d7
|
||||||
.wavenamesloop
|
.wavenamesloop
|
||||||
moveq.l #23-1,d0 ; max 23 chars
|
moveq.l #23-1,d0 ; max 23 chars
|
||||||
@ -533,7 +528,7 @@ pre_SongInit:
|
|||||||
.error
|
.error
|
||||||
.exit
|
.exit
|
||||||
IFNE PRETRACKER_DONT_TRASH_REGS
|
IFNE PRETRACKER_DONT_TRASH_REGS
|
||||||
movem.l (sp)+,d2/d7/a2-a5
|
movem.l (sp)+,d2-d7/a2-a5
|
||||||
ENDC
|
ENDC
|
||||||
rts
|
rts
|
||||||
|
|
||||||
@ -845,7 +840,7 @@ pre_PlayerTick:
|
|||||||
bpl.s .noclip_pat_vol_min
|
bpl.s .noclip_pat_vol_min
|
||||||
moveq.l #0,d1
|
moveq.l #0,d1
|
||||||
.noclip_pat_vol_min
|
.noclip_pat_vol_min
|
||||||
cmpi.b #MAX_VOLUME,d1
|
cmp.b #MAX_VOLUME,d1
|
||||||
ble.s .noclip_pat_vol_max
|
ble.s .noclip_pat_vol_max
|
||||||
moveq.l #MAX_VOLUME,d1
|
moveq.l #MAX_VOLUME,d1
|
||||||
.noclip_pat_vol_max
|
.noclip_pat_vol_max
|
||||||
@ -1165,7 +1160,7 @@ pre_PlayerTick:
|
|||||||
; ----------------------------------------
|
; ----------------------------------------
|
||||||
.pat_set_speed
|
.pat_set_speed
|
||||||
lea pv_pat_speed_even_b(a4),a1
|
lea pv_pat_speed_even_b(a4),a1
|
||||||
cmpi.b #MAX_SPEED,d5
|
cmp.b #MAX_SPEED,d5
|
||||||
bhs.s .pat_set_speed_shuffle
|
bhs.s .pat_set_speed_shuffle
|
||||||
move.b d5,(a1)+ ; pv_pat_speed_even_b
|
move.b d5,(a1)+ ; pv_pat_speed_even_b
|
||||||
move.b d5,(a1)+ ; pv_pat_speed_odd_b
|
move.b d5,(a1)+ ; pv_pat_speed_odd_b
|
||||||
@ -1279,7 +1274,7 @@ pre_PlayerTick:
|
|||||||
|
|
||||||
; ----------------------------------------
|
; ----------------------------------------
|
||||||
.pat_set_volume
|
.pat_set_volume
|
||||||
cmpi.b #MAX_VOLUME,d5
|
cmp.b #MAX_VOLUME,d5
|
||||||
bls.s .pat_set_volume_nomax
|
bls.s .pat_set_volume_nomax
|
||||||
moveq.l #MAX_VOLUME,d5
|
moveq.l #MAX_VOLUME,d5
|
||||||
.pat_set_volume_nomax
|
.pat_set_volume_nomax
|
||||||
@ -1445,7 +1440,7 @@ pre_PlayerTick:
|
|||||||
; IFNE PRETRACKER_PARANOIA_MODE ; new step is never written
|
; IFNE PRETRACKER_PARANOIA_MODE ; new step is never written
|
||||||
; move.w pcd_inst_new_step_w(a5),d1
|
; move.w pcd_inst_new_step_w(a5),d1
|
||||||
; blt.s .inst_no_new_step_pos
|
; blt.s .inst_no_new_step_pos
|
||||||
; cmpi.w #$20,d1
|
; cmp.w #$20,d1
|
||||||
; ble.s .inst_good_new_step_pos
|
; ble.s .inst_good_new_step_pos
|
||||||
; moveq.l #$20,d1
|
; moveq.l #$20,d1
|
||||||
;.inst_good_new_step_pos
|
;.inst_good_new_step_pos
|
||||||
@ -1792,7 +1787,7 @@ pre_PlayerTick:
|
|||||||
bsr .inst_select_wave_subroutine
|
bsr .inst_select_wave_subroutine
|
||||||
|
|
||||||
.inst_wave_selected
|
.inst_wave_selected
|
||||||
cmpi.b #$FF,d2
|
cmp.b #$FF,d2
|
||||||
beq.s .inst_pat_loop_exit3
|
beq.s .inst_pat_loop_exit3
|
||||||
subq.b #1,d2
|
subq.b #1,d2
|
||||||
move.b d2,pcd_inst_line_ticks_b(a5)
|
move.b d2,pcd_inst_line_ticks_b(a5)
|
||||||
@ -1832,7 +1827,7 @@ pre_PlayerTick:
|
|||||||
.adsr_decay_and_release
|
.adsr_decay_and_release
|
||||||
moveq.l #0,d4
|
moveq.l #0,d4
|
||||||
move.b pcd_adsr_phase_speed_b(a5),d4
|
move.b pcd_adsr_phase_speed_b(a5),d4
|
||||||
cmpi.b #$8f,d4
|
cmp.b #$8f,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
|
||||||
@ -1884,7 +1879,7 @@ pre_PlayerTick:
|
|||||||
|
|
||||||
.adsr_attack
|
.adsr_attack
|
||||||
add.w uii_adsr_attack(a2),d2
|
add.w uii_adsr_attack(a2),d2
|
||||||
cmpi.w #MAX_VOLUME<<4,d2
|
cmp.w #MAX_VOLUME<<4,d2
|
||||||
blt.s .adsr_done
|
blt.s .adsr_done
|
||||||
|
|
||||||
.adsr_do_decay
|
.adsr_do_decay
|
||||||
@ -2111,7 +2106,7 @@ pre_PlayerTick:
|
|||||||
; select right sample corresponding to current pitch
|
; select right sample corresponding to current pitch
|
||||||
|
|
||||||
move.w pcd_out_len_w(a5),d3
|
move.w pcd_out_len_w(a5),d3
|
||||||
cmpi.w #$219,d0
|
cmp.w #$219,d0
|
||||||
ble .noclippitchhigh
|
ble .noclippitchhigh
|
||||||
move.w #$231,d6 ; That's probably B-3+1, mapping to period $71 (although $7c is the last safe value)
|
move.w #$231,d6 ; That's probably B-3+1, mapping to period $71 (although $7c is the last safe value)
|
||||||
btst #2,wi_flags_b(a3)
|
btst #2,wi_flags_b(a3)
|
||||||
@ -2184,7 +2179,7 @@ pre_PlayerTick:
|
|||||||
add.w d1,d1
|
add.w d1,d1
|
||||||
add.w d1,d1
|
add.w d1,d1
|
||||||
sub.w d1,d0
|
sub.w d1,d0
|
||||||
cmpi.w #$231,d0
|
cmp.w #$231,d0
|
||||||
ble.s .noclippitchhigh
|
ble.s .noclippitchhigh
|
||||||
move.w #$231,d0
|
move.w #$231,d0
|
||||||
.noclippitchhigh
|
.noclippitchhigh
|
||||||
@ -2237,7 +2232,7 @@ pre_PlayerTick:
|
|||||||
moveq.l #MAX_TRACK_DELAY-1,d0 ; load from last buffer
|
moveq.l #MAX_TRACK_DELAY-1,d0 ; load from last buffer
|
||||||
|
|
||||||
; handle track delay
|
; handle track delay
|
||||||
cmpi.b #$FF,d3
|
cmp.b #$FF,d3
|
||||||
beq.s .clear_track_delay
|
beq.s .clear_track_delay
|
||||||
|
|
||||||
; advance and wrap offset
|
; advance and wrap offset
|
||||||
|
@ -1194,8 +1194,7 @@ pre_WaveGen:
|
|||||||
;--------------------------------------------------------------------
|
;--------------------------------------------------------------------
|
||||||
; a3: waveinfo
|
; a3: waveinfo
|
||||||
;
|
;
|
||||||
; d6: wetness (word)
|
; uses all data registers and a0-a1 (a2/a3 unchanged)
|
||||||
; uses all data registers and a0-a2 (a3 unchanged)
|
|
||||||
pre_Modulator:
|
pre_Modulator:
|
||||||
tst.b wi_mod_wetness_b(a3)
|
tst.b wi_mod_wetness_b(a3)
|
||||||
beq.s .earlyexit
|
beq.s .earlyexit
|
||||||
@ -1240,21 +1239,21 @@ pre_Modulator:
|
|||||||
moveq.l #0,d3
|
moveq.l #0,d3
|
||||||
|
|
||||||
.innerloop
|
.innerloop
|
||||||
|
moveq.l #0,d1
|
||||||
add.w d7,d3
|
add.w d7,d3
|
||||||
addq.w #8,d3
|
addq.w #8,d3
|
||||||
smi d1
|
smi d1
|
||||||
ext.w d1
|
ext.w d1
|
||||||
eor.w d3,d1
|
eor.w d3,d1 ; flip order if it was negative
|
||||||
lsr.w #6,d1 ; 4 bit key is bits 14 to 11, needs to be 8 to 5
|
lsr.w #6,d1 ; 4 bit key is bits 14 to 11, needs to be 8 to 5
|
||||||
and.w #15<<5,d1
|
and.w #15<<5,d1
|
||||||
ext.l d1
|
|
||||||
|
|
||||||
add.l d5,d1
|
add.l d5,d1
|
||||||
lsr.l #6,d1
|
lsr.l #6,d1
|
||||||
|
|
||||||
move.w d2,d0
|
move.w d2,d0
|
||||||
sub.w d1,d0
|
sub.w d1,d0
|
||||||
bmi.s .isneg
|
bmi.s .is_outside_sample
|
||||||
|
|
||||||
move.b (a0,d0.w),d1
|
move.b (a0,d0.w),d1
|
||||||
ext.w d1
|
ext.w d1
|
||||||
@ -1269,7 +1268,7 @@ pre_Modulator:
|
|||||||
|
|
||||||
CLIPTO8BITAFTERADD d1
|
CLIPTO8BITAFTERADD d1
|
||||||
move.b d1,(a0,d2.w)
|
move.b d1,(a0,d2.w)
|
||||||
.isneg
|
.is_outside_sample
|
||||||
addq.w #1,d2
|
addq.w #1,d2
|
||||||
cmp.w d4,d2
|
cmp.w d4,d2
|
||||||
bcs.s .innerloop
|
bcs.s .innerloop
|
||||||
|
Loading…
Reference in New Issue
Block a user