225 lines
4.9 KiB
Diff
225 lines
4.9 KiB
Diff
--- a/ptplayer.asm
|
|
+++ b/ptplayer.asm
|
|
@@ -2495,6 +2495,10 @@
|
|
mt_arpeggio:
|
|
; cmd 0 x y (x = first arpeggio offset, y = second arpeggio offset)
|
|
; d4 = xy
|
|
+; As Protracker 2.3: the period, wherever a slide has left it, is looked
|
|
+; up in the channel's finetune row, and the note x or y above taken from
|
|
+; there -- past B-3, from the next finetune's row, which the table runs on
|
|
+; into. (Counting from n_noteoff instead kept the note from before a slide.)
|
|
|
|
moveq #0,d0
|
|
move.b mt_Counter(a4),d0
|
|
@@ -2509,16 +2513,26 @@
|
|
; step 2, arpeggio by right nibble
|
|
.1: and.w #$000f,d4
|
|
|
|
- ; offset current note
|
|
+ ; find the period in the tuned table: 37 entries, as Protracker reads
|
|
.2: add.w d4,d4
|
|
- add.w n_noteoff(a2),d4
|
|
- cmp.w #2*36,d4
|
|
+ lea mt_PeriodTableEnd(pc),a1
|
|
+ move.l n_pertab(a2),a0
|
|
+ move.w n_period(a2),d1
|
|
+ moveq #37-1,d0
|
|
+.3: cmp.l a1,a0
|
|
+ bhs .5
|
|
+ cmp.w (a0),d1
|
|
bhs .4
|
|
+ addq.l #2,a0
|
|
+ dbf d0,.3
|
|
+ rts
|
|
|
|
- ; set period with arpeggio offset from note table
|
|
- move.l n_pertab(a2),a0
|
|
- move.w (a0,d4.w),AUDPER(a5)
|
|
-.4: rts
|
|
+ ; set period with arpeggio offset, unless it runs off the table
|
|
+.4: add.w d4,a0
|
|
+ cmp.l a1,a0
|
|
+ bhs .5
|
|
+ move.w (a0),AUDPER(a5)
|
|
+.5: rts
|
|
|
|
arptab:
|
|
dc.b 0,1,-1,0,1,-1,0,1,-1,0,1,-1,0,1,-1,0
|
|
@@ -2689,7 +2703,7 @@
|
|
; cmd 5 x y (x = volume-up, y = volume-down)
|
|
; d4 = xy
|
|
|
|
- pea mt_volumeslide(pc)
|
|
+ pea mt_volslide_noper(pc)
|
|
bra mt_toneporta_nc
|
|
|
|
|
|
@@ -2698,12 +2712,13 @@
|
|
; d4 = xy
|
|
|
|
move.w d4,d3
|
|
+ moveq #0,d2 ; the depth indexes a table: no stale high byte
|
|
move.b n_vibratoamp(a2),d2
|
|
move.b n_vibratospd(a2),d4
|
|
bsr mt_vibrato_nc
|
|
|
|
move.w d3,d4
|
|
- bra mt_volumeslide
|
|
+ bra mt_volslide_noper
|
|
|
|
|
|
mt_tremolo:
|
|
@@ -2723,47 +2738,53 @@
|
|
bra .4
|
|
.3: move.b n_tremolospd(a2),d4
|
|
|
|
- ; calculate tremolo table offset: 64 * amplitude + (pos & 63)
|
|
-.4: lsl.w #6,d2
|
|
- moveq #63,d0
|
|
- and.b n_tremolopos(a2),d0
|
|
- add.w d0,d2
|
|
-
|
|
- ifne ENABLE_SAWRECT
|
|
- ; select tremolo waveform
|
|
+ ; As Protracker 2.3: twice a vibrato's depth (the wave times y, over
|
|
+ ; 64), and the saw ramping as the channel's VIBRATO position says.
|
|
+.4: moveq #31,d0
|
|
+ and.b n_tremolopos(a2),d0 ; d0 = position in the wave's half
|
|
moveq #3,d1
|
|
and.b n_tremoloctrl(a2),d1
|
|
beq .6
|
|
+
|
|
+ lsl.b #3,d0 ; saw and square: the ramp's step
|
|
subq.b #1,d1
|
|
- beq .5
|
|
+ bne .5
|
|
|
|
- ; ctrl 2 & 3 select a rectangle tremolo
|
|
- lea mt_VibratoRectTable(pc),a0
|
|
+ ; ctrl 1 selects a saw, falling in the vibrato's negative half
|
|
+ btst #5,n_vibratopos(a2)
|
|
+ beq .9
|
|
+ not.b d0 ; 255 - ramp
|
|
bra .9
|
|
|
|
- ; ctrl 1 selects a sawtooth tremolo
|
|
-.5: lea mt_VibratoSawTable(pc),a0
|
|
+ ; ctrl 2 & 3 select a square
|
|
+.5: st d0
|
|
bra .9
|
|
- endc ; ENABLE_SAWRECT
|
|
|
|
- ; ctrl 0 selects a sine tremolo
|
|
-.6: lea mt_VibratoSineTable(pc),a0
|
|
+ ; ctrl 0 selects a sine
|
|
+.6: move.b mt_ProTrackerSine(pc,d0.w),d0
|
|
|
|
- ; add tremolo-offset to volume
|
|
-.9: move.w n_volume(a2),d0
|
|
- add.b (a0,d2.w),d0
|
|
- bpl .10
|
|
- moveq #0,d0
|
|
-.10: cmp.w #64,d0
|
|
+ ; scale by the depth, then add or subtract by the position's half
|
|
+.9: and.w #$00ff,d0
|
|
+ mulu d2,d0
|
|
+ lsr.w #6,d0
|
|
+ move.w n_volume(a2),d1
|
|
+ btst #5,n_tremolopos(a2)
|
|
+ beq .10
|
|
+ sub.w d0,d1
|
|
+ bpl .11
|
|
+ moveq #0,d1
|
|
+ bra .11
|
|
+.10: add.w d0,d1
|
|
+ cmp.w #64,d1
|
|
bls .11
|
|
- moveq #64,d0
|
|
+ moveq #64,d1
|
|
.11: move.w n_period(a2),AUDPER(a5)
|
|
ifeq MINIMAL
|
|
move.l mt_MasterVolTab(a4),a0
|
|
- move.b (a0,d0.w),d0
|
|
- and.b n_enable(a2),d0
|
|
+ move.b (a0,d1.w),d1
|
|
+ and.b n_enable(a2),d1
|
|
endc
|
|
- move.w d0,AUDVOL(a5)
|
|
+ move.w d1,AUDVOL(a5)
|
|
ifd VOL0_UNLOOPS
|
|
bne .12
|
|
move.b d7,n_looped(a2)
|
|
@@ -2773,6 +2794,12 @@
|
|
.12: add.b d4,n_tremolopos(a2)
|
|
rts
|
|
|
|
+mt_ProTrackerSine:
|
|
+ ; Protracker's mt_VibratoTable: the first half of the sine
|
|
+ dc.b 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253
|
|
+ dc.b 255,253,250,244,235,224,212,197,180,161,141,120,97,74,49,24
|
|
+ even
|
|
+
|
|
|
|
mt_volumeslide:
|
|
; cmd A x y (x = volume-up, y = volume-down)
|
|
@@ -2815,6 +2842,34 @@
|
|
.1: rts
|
|
|
|
|
|
+mt_volslide_noper:
|
|
+; The volume slide of 5xy and 6xy, and EAx/EBx's: as mt_volumeslide but
|
|
+; leaving Paula's period alone, as Protracker 2.3 does -- setting it back to
|
|
+; n_period undid 6xy's vibrato, 5xy's glissando, and a tick of either.
|
|
+; d4 = xy
|
|
+
|
|
+ move.w n_volume(a2),d0
|
|
+ moveq #$0f,d1
|
|
+ and.b d4,d1
|
|
+ lsr.b #4,d4
|
|
+ beq vol_slide_down_np
|
|
+
|
|
+ ; slide up, until 64
|
|
+ add.b d4,d0
|
|
+vol_slide_up_np:
|
|
+ cmp.b #64,d0
|
|
+ bls set_vol
|
|
+ moveq #64,d0
|
|
+ bra set_vol
|
|
+
|
|
+ ; slide down, until 0
|
|
+vol_slide_down_np:
|
|
+ sub.b d1,d0
|
|
+ bpl set_vol
|
|
+ moveq #0,d0
|
|
+ bra set_vol
|
|
+
|
|
+
|
|
mt_posjump:
|
|
; cmd B x y (xy = new song position)
|
|
; d4 = xy
|
|
@@ -3079,7 +3134,7 @@
|
|
rts
|
|
|
|
.1: add.w n_volume(a2),d0
|
|
- bra vol_slide_up
|
|
+ bra vol_slide_up_np
|
|
|
|
|
|
mt_volfinedn:
|
|
@@ -3092,7 +3147,7 @@
|
|
|
|
.1: move.b d0,d1
|
|
move.w n_volume(a2),d0
|
|
- bra vol_slide_down
|
|
+ bra vol_slide_down_np
|
|
|
|
|
|
mt_notecut:
|
|
@@ -3448,6 +3503,7 @@
|
|
dc.w 862,814,768,725,684,646,610,575,543,513,484,457
|
|
dc.w 431,407,384,363,342,323,305,288,272,256,242,228
|
|
dc.w 216,203,192,181,171,161,152,144,136,128,121,114
|
|
+mt_PeriodTableEnd:
|
|
|
|
ifeq MINIMAL
|
|
MasterVolTab0:
|