home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CDPD Public Domain Collection for CDTV 4
/
CDPD_IV.bin
/
amfm
/
amfm11
/
utilities
/
prorun
/
prorunner.s.pp
/
prorunner.s
Wrap
Text File
|
1994-06-20
|
40KB
|
1,846 lines
*****************************************************
* NOTE : *
* This Replayer Source has been included in this *
* distribution with the permission of SANITY !!! *
* For this i am extremely grateful. *
* However, if you use this source, remember to give *
* SANITY credit for the routine (it is after all *
* their hard work...) *
* *
* SHAYERA - PARASITE *
*****************************************************
; Remember This code is © Copyright 1992,1993 Cosmos of Sanity
; This distribution is © Copyright 1992,1993 Shayera/Parasite
***************
* TESTPROGRAM *
***************
start:
move.l #pr_data,pr_module
bsr.w pr_init
main:
cmp.b #160,$dff006
bne.s main
move.w #$4000,$dff09a
main2:
cmp.b #161,$dff006
bls.s main2
move.w #$f00,$dff180
bsr.w pr_music
clr.w $dff180
move.w #$c000,$dff09a
moveq.l #0,d0
move.b $dff006,d0
sub.w #162,d0
move.w medraster,d1
add.w d0,d1
lsr.w #1,d1
move.w d1,medraster
cmp.w maxraster,d0
bls.s main3
move.w d0,maxraster
main3:
btst #6,$bfe001
bne.s main
move.w #-1,pr_musicfadedirection ; Now fading out...
main4:
cmp.b #160,$dff006
bne.s main4
move.w #$4000,$dff09a
main5:
cmp.b #161,$dff006
bls.s main5
move.w #$f00,$dff180
bsr.w pr_music
clr.w $dff180
move.w #$c000,$dff09a
moveq.l #0,d0
move.b $dff006,d0
sub.w #162,d0
move.w medraster,d1
add.w d0,d1
lsr.w #1,d1
move.w d1,medraster
cmp.w maxraster,d0
bls.s main6
move.w d0,maxraster
main6:
tst.w pr_musicfadect
bne.s main4
bsr.w pr_end
moveq.l #0,d0
move.l d0,d1
move.w maxraster,d0
move.w medraster,d1
rts
maxraster: dc.w 0
medraster: dc.w 0
*****************************************
* *
* PRORUNNER V1.0 *
* -------------- *
* CODED BY COSMOS OF SANITY IN 1992 *
* *
*****************************************
* *
* Supporting the following effects: *
* *
* - Fade Sound in/out *
* - Finetune *
* - Normal play or Arpeggio *
* - Slide Frequenz up *
* - Slide Frequenz down *
* - Tone Portamento *
* - Vibrato *
* - Tone Portamento+Volume Slide *
* - Vibrato + Volume Slide *
* - Tremolo *
* - Set SampleOffset *
* - Volume Slide *
* - Position Jump *
* - Set Volume *
* - Pattern Break *
* - Set Speed *
* - E-Commands: *
* - Set Filter *
* - Fine Slide Up *
* - Fine Slide Down *
* - Glissando Control *
* - Set Vibrato Waveform *
* - Set Finetune *
* - Set Loop / Jump to Loop *
* - Set Tremolo Waveform *
* - Retrig Note *
* - Fine VolumeSlide Up *
* - Fine VolumeSlide Down *
* - NoteCut *
* - NoteDelay *
* - PatternDelay *
* - FunkRepeat *
* *
*****************************************
YES EQU 1
NO EQU 0
INCLUDEFADINGROUTINE EQU YES
SAMPLELENGTHOFFSET EQU 4
SAMPLEVOLUMEOFFSET EQU 6
SAMPLEREPEATPOINTOFFSET EQU 8
SAMPLEWITHLOOP EQU 12
SAMPLEREPEATLENGTHOFFSET EQU 14
SAMPLEFINETUNEOFFSET EQU 16
* Init-Routine *******************************************************
pr_init:
lea pr_framecounter(pc),a6
move.l pr_module(pc),a0
cmp.l #0,a0
bne.s pr_init1
rts
pr_init1:
cmp.l #'M.K.',1080(a0)
beq.s pr_init2
cmp.l #'SNT.',1080(a0)
beq.s pr_init2
rts
pr_init2:
lea 20(a0),a1
lea pr_Sampleinfos(pc),a2
moveq.l #32,d7
moveq #30,d0
pr_init3:
lea 22(a1),a1 ; Samplenamen überspringen
move.w (a1)+,SAMPLELENGTHOFFSET(a2) ; Samplelength in Words
lea pr_periods(pc),a3
move.b (a1)+,d2 ; Finetuning
and.w #$f,d2
mulu.w #36*2,d2
add.l d2,a3
move.l a3,SAMPLEFINETUNEOFFSET(a2)
moveq #0,d1
move.b (a1)+,d1
move.w d1,SAMPLEVOLUMEOFFSET(a2) ; Volume
moveq.l #0,d1
move.w (a1)+,d1 ; Repeatpoint in Bytes
add.l d1,d1
move.l d1,SAMPLEREPEATPOINTOFFSET(a2)
move.w (a1)+,d1
clr.w SAMPLEWITHLOOP(a2)
cmp.w #1,d1
bls.s pr_init3_2
addq.w #1,SAMPLEWITHLOOP(a2)
pr_init3_2:
move.w d1,SAMPLEREPEATLENGTHOFFSET(a2) ; Repeatlength
add.l d7,a2
dbf d0,pr_init3
moveq #0,d0
move.b 950(a0),d0 ; Number of patterns
subq.w #1,d0
move.w d0,pr_highestpattern-pr_framecounter(a6)
moveq.l #0,d1
lea 952(a0),a1 ; 1. Patternpos
lea 1084(a0),a2 ; 1. Patterndata
lea pr_Patternpositions(pc),a3
pr_init4:
move.b (a1)+,d2 ; x. Patternpos
moveq.l #0,d3
move.b d2,d3
lsl.l #8,d3
lsl.l #2,d3
add.l a2,d3
move.l d3,(a3)+
dbf d0,pr_init4
lea 952(a0),a1
moveq.l #0,d1
moveq #127,d0
pr_init4_1:
move.b (a1)+,d2
cmp.b d1,d2 ; Highest Pattern ?
bls.s pr_init4_2
move.b d2,d1
pr_init4_2:
dbf d0,pr_init4_1
addq.w #1,d1
lsl.l #8,d1
lsl.l #2,d1 ; Highest Pattern * 1024 Bytes
move.l a0,d2
add.l #1084,d2
add.l d1,d2
lea pr_Sampleinfos(pc),a3
lea pr_Sampleinfos+SAMPLELENGTHOFFSET(pc),a2
moveq.l #32,d7
move.l d2,(a3)
moveq #29,d0
pr_init4_3:
move.l (a3),d1
add.l d7,a3
moveq.l #0,d2
move.w (a2),d2
add.l d7,a2
add.l d2,d2
add.l d2,d1
move.l d1,(a3)
dbf d0,pr_init4_3
lea pr_Sampleinfos(pc),a2
lea pr_Sampleinfos+SAMPLEREPEATPOINTOFFSET(pc),a3
moveq.l #32,d7
moveq #30,d0
pr_init4_4:
move.l (a2),d1
add.l d1,(a3)
add.l d7,a2
add.l d7,a3
dbf d0,pr_init4_4
cmp.l #'SNT.',1080(a0)
beq.w pr_init7
lea 1084(a0),a1
move.l pr_Sampleinfos(pc),a2
move.b #$f0,d6
move.w #$fff,d7
pr_init5:
move.b (a1),d0
move.b 2(a1),d1
move.w (a1),d2
and.w d7,2(a1)
and.w d7,d2
and.b d6,d0
lsr.b #4,d1
or.b d1,d0
move.b d0,(a1)
tst.w d2
beq.s pr_init5_3
lea pr_periods(pc),a4
moveq #0,d1
pr_init5_2:
addq.w #1,d1
cmp.w (a4)+,d2
bne.s pr_init5_2
move.b d1,1(a1)
pr_init5_3:
addq.l #4,a1
cmp.l a2,a1
blt.s pr_init5
move.l #'SNT.',1080(a0)
pr_init7:
lea pr_Arpeggiofastlist(pc),a2
lea pr_Arpeggiofastlistperiods(pc),a1
lea 35*2(a1),a1 ; to the end of list...
moveq #0,d0
moveq #35,d1
move.w #999,d2
moveq #0,d6
pr_init8:
move.w -(a1),d7
addq.w #1,d6
pr_init8_2:
cmp.w d7,d0
blt.s pr_init8_4
subq.w #1,d1
tst.b d1
bne.s pr_init8
pr_init8_3:
move.b d1,(a2)+
dbf d2,pr_init8_3
bra.s pr_init8_5
pr_init8_4:
move.b d1,(a2)+
addq.w #1,d0
dbf d2,pr_init8_2
pr_init8_5:
lea pr_channel0(pc),a1
move.w #1,(a1)
move.w #1,pr_channel1-pr_channel0(a1)
move.w #1,pr_channel2-pr_channel0(a1)
move.w #1,pr_channel3-pr_channel0(a1)
addq.l #2,a1
moveq #(pr_channel1-pr_channel0)/2-2,d0
pr_init9_2:
clr.w (a1)
clr.w pr_channel1-pr_channel0(a1)
clr.w pr_channel2-pr_channel0(a1)
clr.w pr_channel3-pr_channel0(a1)
addq.l #2,a1
dbf d0,pr_init9_2
lea pr_fastperiodlist(pc),a1
lea pr_periods(pc),a2
move.l a2,(a1)
moveq.l #36*2,d1
moveq #14,d0
pr_init9_3:
move.l (a1)+,d2
add.l d1,d2
move.l d2,(a1)
dbf d0,pr_init9_3
lea pr_arpeggiofastdivisionlist(pc),a1
moveq #0,d1
move.w #$ff,d0
pr_init9_4:
move.b d1,(a1)+
subq.b #1,d1
btst #7,d1
beq.s pr_init9_4_2
moveq #2,d1
pr_init9_4_2:
dbf d0,pr_init9_4
move.w #6,pr_speed-pr_framecounter(a6)
move.w pr_speed(pc),(a6)
clr.w pr_Patternct-pr_framecounter(a6)
move.w pr_highestpattern(pc),d0
move.w pr_startposition(pc),d1
blt.s pr_init9_5
cmp.w d0,d1
bls.s pr_init9_5_2
pr_init9_5:
clr.w pr_startposition-pr_framecounter(a6)
pr_init9_5_2:
move.w pr_startposition(pc),pr_currentpattern-pr_framecounter(a6)
lea pr_Patternpositions(pc),a3
move.l a3,d0
moveq.l #0,d1
move.w pr_startposition(pc),d1
lsl.l #2,d1
add.l d1,d0
move.l d0,pr_Patternpt-pr_framecounter(a6)
move.l pr_Patternpt(pc),a5
move.l (a5),pr_Currentposition-pr_framecounter(a6)
lea $dff000,a5
lea $bfd000,a0
move.w #$2000,$9c(a5)
move.l $78.w,pr_old78-pr_framecounter(a6)
lea pr_int(pc),a3
move.l a3,$78.w
move.b #$7f,$d00(a0)
move.b #$08,$e00(a0)
move.b #$80,$400(a0)
move.b #$01,$500(a0)
pr_init10:
btst #0,$bfdd00
beq.s pr_init10
move.b #$81,$d00(a0)
move.w #$a000,$9a(a5)
move.w #$f,$96(a5)
clr.w $a8(a5)
clr.w $b8(a5)
clr.w $c8(a5)
clr.w $d8(a5)
bset #1,$bfe001
rts
* End-Routine *********************************************************
pr_end:
lea $dff000,a5
move.w #$f,$96(a5)
clr.w $a8(a5)
clr.w $b8(a5)
clr.w $c8(a5)
clr.w $d8(a5)
move.w #$2000,$9a(a5)
move.l pr_old78(pc),$78.w
bclr #1,$bfe001
rts
* Music-Fading ********************************************************
IFEQ INCLUDEFADINGROUTINE-YES
pr_fademusic: macro
lea pr_musicfadect(pc),a0
move.w pr_musicfadedirection(pc),d0
add.w d0,(a0)
cmp.w #64,(a0)
bls.s pr_fademusicend
bgt.s pr_fademusictoohigh
clr.w (a0)
clr.w pr_musicfadedirection-pr_musicfadect(a0)
rts
pr_fademusictoohigh:
move.w #64,(a0)
clr.w pr_musicfadedirection-pr_musicfadect(a0)
pr_fademusicend:
endm
pr_musicfadect: dc.w 64
pr_musicfadedirection: dc.w 0
ENDC
* MACROS **************************************************************
pr_playchannel: macro ; do not change: a2-a6
moveq #0,d0
move.b 2(a6),d0
add.b d0,d0
lea pr_playchannellist(pc),a0
move.w (a0,d0.w),d0
jsr (a0,d0.w)
endm
pr_checkchannel: macro
bsr.w pr_checkfunkrepeat
moveq #0,d0
move.b 4(a4),d0
add.b d0,d0
lea pr_Effectchecklist(pc),a0
move.w (a0,d0.w),d0
jsr (a0,d0.w)
endm
* Music-Routine *******************************************************
pr_music:
IFEQ INCLUDEFADINGROUTINE-YES
pr_fademusic
ENDC
lea $dff000,a5
lea pr_framecounter(pc),a2
subq.w #1,(a2)
beq.s pr_music2
bsr.w pr_checkeffects
rts
pr_music2:
cmp.b #1,pr_patterndelaytime-pr_framecounter+1(a2)
blt.s pr_music2_2
bsr.w pr_checkeffects
bra.w pr_music2_9
pr_music2_2:
move.l pr_Currentposition(pc),a6
lea pr_Channel0(pc),a4
lea $a0(a5),a3
moveq #1,d7
pr_playchannel
move.w 2(a4),6(a3)
IFEQ INCLUDEFADINGROUTINE-YES
move.w 12(a4),d0
mulu.w pr_musicfadect-pr_framecounter(a2),d0
lsr.l #6,d0
move.w d0,8(a3)
ELSE
move.w 12(a4),8(a3)
ENDC
addq.l #4,a6
lea pr_Channel1(pc),a4
lea $b0(a5),a3
moveq #2,d7
pr_playchannel
move.w 2(a4),6(a3)
IFEQ INCLUDEFADINGROUTINE-YES
move.w 12(a4),d0
mulu.w pr_musicfadect-pr_framecounter(a2),d0
lsr.l #6,d0
move.w d0,8(a3)
ELSE
move.w 12(a4),8(a3)
ENDC
addq.l #4,a6
lea pr_Channel2(pc),a4
lea $c0(a5),a3
moveq #4,d7
pr_playchannel
move.w 2(a4),6(a3)
IFEQ INCLUDEFADINGROUTINE-YES
move.w 12(a4),d0
mulu.w pr_musicfadect-pr_framecounter(a2),d0
lsr.l #6,d0
move.w d0,8(a3)
ELSE
move.w 12(a4),8(a3)
ENDC
addq.l #4,a6
lea pr_Channel3(pc),a4
lea $d0(a5),a3
moveq #8,d7
pr_playchannel
move.w 2(a4),6(a3)
IFEQ INCLUDEFADINGROUTINE-YES
move.w 12(a4),d0
mulu.w pr_musicfadect-pr_framecounter(a2),d0
lsr.l #6,d0
move.w d0,8(a3)
ELSE
move.w 12(a4),8(a3)
ENDC
lea pr_int(pc),a0
move.l a0,$78.w
move.b #$19,$bfde00
pr_music2_9:
move.w pr_speed(pc),(a2)
tst.w pr_patternhasbeenbreaked-pr_framecounter(a2)
bne.s pr_music3
tst.w pr_patterndelaytime-pr_framecounter(a2)
beq.s pr_music3_1
subq.w #1,pr_patterndelaytime-pr_framecounter(a2)
beq.s pr_music3_1
bra.s pr_nonextpattern
pr_music3:
clr.w pr_patternhasbeenbreaked-pr_framecounter(a2)
tst.w pr_patterndelaytime-pr_framecounter(a2)
beq.s pr_music3_1
subq.w #1,pr_patterndelaytime-pr_framecounter(a2)
pr_music3_1:
moveq.l #16,d0
add.l d0,pr_Currentposition-pr_framecounter(a2)
lea pr_Patternct(pc),a1
addq.w #1,(a1)
moveq #64,d1
cmp.w (a1),d1
bgt.s pr_nonextpattern
sub.w d1,(a1)
moveq.l #0,d1
move.w (a1),d1
lsl.w #4,d1
addq.l #4,pr_patternpt-pr_framecounter(a2)
lea pr_currentpattern(pc),a0
addq.w #1,(a0)
move.w (a0),d0
cmp.w pr_highestpattern-pr_framecounter(a2),d0
bls.s pr_nohighestpattern
lea pr_patternpositions(pc),a1
move.l a1,pr_Patternpt-pr_framecounter(a2)
clr.w (a0)
pr_nohighestpattern:
move.l pr_Patternpt-pr_framecounter(a2),a6
move.l (a6),d0
add.l d1,d0
move.l d0,pr_currentposition-pr_framecounter(a2)
pr_nonextpattern:
rts
pr_int:
tst.b $bfdd00
move.b #$19,$bfde00
move.w pr_dmacon(pc),$dff096
move.w #$2000,$dff09c
add.l #pr_int2-pr_int,$78.w
rte
pr_int2:
tst.b $bfdd00
movem.l a5-a6,-(sp)
lea $dff000,a5
lea pr_Channel0+6(pc),a6
move.l (a6),$a0(a5)
move.w 4(a6),$a4(a5)
move.l pr_Channel1-pr_Channel0(a6),$b0(a5)
move.w 4+pr_Channel1-pr_Channel0(a6),$b4(a5)
move.l pr_Channel2-pr_Channel0(a6),$c0(a5)
move.w 4+pr_Channel2-pr_Channel0(a6),$c4(a5)
move.l pr_Channel3-pr_Channel0(a6),$d0(a5)
move.w 4+pr_Channel3-pr_Channel0(a6),$d4(a5)
move.w #$2000,$9c(a5)
move.l pr_old78(pc),78.w
movem.l (sp)+,a5-a6
rte
pr_playchannellist:
dc.w pr_playnormalchannel-pr_playchannellist ; 0
dc.w pr_playnormalchannel-pr_playchannellist ; 1
dc.w pr_playnormalchannel-pr_playchannellist ; 2
dc.w pr_playtpchannel-pr_playchannellist ; 3
dc.w pr_playnormalchannel-pr_playchannellist ; 4
dc.w pr_playtpchannel-pr_playchannellist ; 5
dc.w pr_playnormalchannel-pr_playchannellist ; 6
dc.w pr_playnormalchannel-pr_playchannellist ; 7
dc.w pr_playnormalchannel-pr_playchannellist ; 8
dc.w pr_playsochannel-pr_playchannellist ; 9
dc.w pr_playnormalchannel-pr_playchannellist ; A
dc.w pr_playnormalchannel-pr_playchannellist ; B
dc.w pr_playnormalchannel-pr_playchannellist ; C
dc.w pr_playnormalchannel-pr_playchannellist ; D
dc.w pr_playnormalchannel-pr_playchannellist ; E
dc.w pr_playnormalchannel-pr_playchannellist ; F
* KANAL NORMAL SPIELEN ************************************************
pr_playnormalchannel:
lea pr_Sampleinfos(pc),a0
move.l a0,a1
lea Samplefinetuneoffset(a1),a1
moveq #0,d1
move.b 1(a6),d1
moveq #0,d0
move.b (a6),d0
beq.s pr_playnormalnonewsample ; Irgendein Sample ?
move.w d0,(a4) ; Trage Samplenummer ein
tst.b d1
bne.s pr_playnormalsample
subq.b #1,d0
lsl.l #5,d0
add.l d0,a0
addq.l #6,a0
move.w (a0)+,12(a4)
move.l (a0)+,d2
move.l d2,6(a4)
tst.w (a0)+
beq.s pr_playnormalchannel2
move.l d2,36(a4)
move.l d2,40(a4)
pr_playnormalchannel2:
move.w (a0)+,10(a4)
bra.w pr_playnormalnonewperiod
pr_playnormalsample:
move.w d7,$96(a5)
or.w d7,pr_dmacon-pr_framecounter(a2)
subq.b #1,d0
lsl.l #5,d0
add.l d0,a0
move.l (a0)+,(a3) ; Setze Samplestart
move.w (a0)+,4(a3) ; Setze Audiodatenlänge
move.w (a0)+,12(a4) ; Setze Samplelautstärke
move.l (a0)+,d2
move.l d2,6(a4) ; Samplerepeatpoint eintragen
tst.w (a0)+
beq.s pr_playnormalsample2
move.l d2,36(a4)
move.l d2,40(a4)
pr_playnormalsample2:
move.w (a0)+,10(a4) ; Samplerepeatlength eintragen
bra.s pr_playnormalnewperiod
pr_playnormalnonewsample:
clr.l 14(a4)
tst.b d1
beq.s pr_playnormalnonewperiod ; Irgend ne neue Frequenz ?
move.w (a4),d0 ; Alte Samplenummer holen
move.w d7,$96(a5)
or.w d7,pr_dmacon-pr_framecounter(a2)
subq.b #1,d0
lsl.l #5,d0
add.l d0,a0
move.l (a0)+,(a3) ; Setze Samplestart
move.w (a0)+,4(a3) ; Setze Audiodatenlänge
addq.l #2,a0
move.l (a0)+,d2
move.l d2,6(a4) ; Samplerepeatpoint eintragen
tst.w (a0)+
beq.s pr_playnormalnonewsample2
move.l d2,36(a4)
move.l d2,40(a4)
pr_playnormalnonewsample2:
move.w (a0)+,10(a4) ; Samplerepeatlength eintragen
pr_playnormalnewperiod:
subq.b #1,d1
add.b d1,d1
move.w (a4),d0
subq.b #1,d0
lsl.w #5,d0
move.l (a1,d0.w),a1
move.w (a1,d1.w),2(a4) ; Frequenz eintragen
pr_playnormalnonewperiod:
move.w 2(a6),4(a4)
bra.w pr_playeffect
* KANAL MIT OFFSET SPIELEN *********************************************
pr_playsochannel:
lea pr_Sampleinfos(pc),a0
move.l a0,a1
lea Samplefinetuneoffset(a1),a1
moveq #0,d1
move.b 1(a6),d1
moveq #0,d0
move.b (a6),d0
beq.w pr_playsononewsample ; Irgendein Sample ?
move.w d0,(a4) ; Trage Samplenummer ein
tst.b d1
bne.s pr_playsosample
subq.b #1,d0
lsl.l #5,d0
add.l d0,a0
addq.l #6,a0
move.w (a0)+,12(a4)
move.l (a0)+,d2
move.l d2,6(a4)
tst.w (a0)+
beq.s pr_playsochannel2
move.l d2,36(a4)
move.l d2,40(a4)
pr_playsochannel2:
move.w (a0)+,10(a4)
bra.w pr_playsononewperiod
pr_playsosample:
move.w d7,$96(a5)
or.w d7,pr_dmacon-pr_framecounter(a2)
moveq.l #0,d6
move.b 3(a6),d6
lsl.w #7,d6
subq.b #1,d0
lsl.l #5,d0
add.l d0,a0
move.l (a0)+,d2
move.w (a0)+,d3
cmp.w d3,d6
bge.s pr_playsosample2
sub.w d6,d3
add.l d6,d6
add.l d6,d2
move.l d2,(a3) ; Setze Samplestart
move.w d3,4(a3) ; Setze Audiodatenlänge
move.w (a0)+,12(a4) ; Setze Samplelautstärke
move.l (a0)+,d2
move.l d2,6(a4) ; Samplerepeatpoint eintragen
tst.w (a0)+
beq.s pr_playsosample1
move.l d2,36(a4)
move.l d2,40(a4)
pr_playsosample1:
move.w (a0)+,10(a4) ; Samplerepeatlength eintragen
bra.w pr_playsonewperiod
pr_playsosample2:
move.w (a0)+,12(a4)
move.l (a0),(a3)
move.w 4(a0),4(a3)
move.l (a0)+,d2
move.l d2,6(a4)
tst.w (a0)+
beq.s pr_playsosample4
move.l d2,36(a4)
move.l d2,40(a4)
pr_playsosample4:
move.w (a0)+,10(a4)
bra.s pr_playsonewperiod
pr_playsononewsample:
clr.l 14(a4)
tst.b d1
beq.w pr_playsononewperiod ; Irgend ne neue Frequenz ?
move.w (a4),d0 ; Alte Samplenummer holen
move.w d7,$96(a5)
or.w d7,pr_dmacon-pr_framecounter(a2)
moveq.l #0,d6
move.b 3(a6),d6
lsl.w #7,d6
subq.b #1,d0
lsl.l #5,d0
add.l d0,a0
move.l (a0)+,d2
move.w (a0)+,d3
cmp.w d3,d6
bge.s pr_playsosample3
sub.w d6,d3
add.l d6,d6
add.l d6,d2
move.l d2,(a3) ; Setze Samplestart
move.w d3,4(a3) ; Setze Audiodatenlänge
addq.l #2,a0
move.l (a0)+,d2
move.l d2,6(a4) ; Samplerepeatpoint eintragen
tst.w (a0)+
beq.s pr_playsononewsample2
move.l d2,36(a4)
move.l d2,40(a4)
pr_playsononewsample2:
move.w (a0)+,10(a4) ; Samplerepeatlength eintragen
bra.s pr_playsonewperiod
pr_playsosample3:
addq.l #2,a0
move.l (a0),(a3)
move.w 4(a0),4(a3)
move.l (a0)+,d2
move.l d2,6(a4)
tst.w (a0)+
beq.s pr_playsosample5
move.l d2,36(a4)
move.l d2,40(a4)
pr_playsosample5:
move.w (a0)+,10(a4)
bra.w pr_playsonewperiod
pr_playsonewperiod:
subq.w #1,d1
add.b d1,d1
move.w (a4),d0
subq.b #1,d0
lsl.w #5,d0
move.l (a1,d0.w),a1
move.w (a1,d1.w),2(a4) ; Frequenz eintragen
pr_playsononewperiod:
move.w 2(a6),4(a4)
bra.w pr_playeffect
* Kanal spielen mit TONE PORTAMENTO **********************************
pr_playtpchannel:
lea pr_Sampleinfos(pc),a0
move.l a0,a1
lea Samplefinetuneoffset(a1),a1
moveq #0,d1
move.b 1(a6),d1
moveq #0,d0
move.b (a6),d0
beq.s pr_playtpnonewsample ; Irgendein Sample ?
move.w d0,(a4) ; Trage Samplenummer ein
subq.b #1,d0
lsl.l #5,d0
add.l d0,a0
addq.l #6,a0
move.w (a0)+,12(a4) ; Lautstärke eintragen
move.l (a0)+,d2
move.l d2,6(a4) ; Repeatpoint eintragen
tst.w (a0)+
beq.s pr_playtpchannel2
move.l d2,36(a4)
move.l d2,40(a4)
pr_playtpchannel2:
move.w (a0)+,10(a4) ; Repeatlength eintragen
pr_playtpnonewsample:
tst.b d1
beq.s pr_playtpnonewperiod ; Irgend ne neue Frequenz ?
pr_playtpnewperiod:
move.w 2(a4),14(a4)
subq.w #1,d1
add.b d1,d1
move.w (a4),d0
subq.b #1,d0
lsl.w #5,d0
move.l (a1,d0.w),a1
move.w (a1,d1.w),d2
move.w d2,16(a4) ; Frequenz eintragen
bra.s pr_playtpallowed
pr_playtpnonewperiod:
tst.w 16(a4)
bne.s pr_playtpallowed
clr.w 14(a4)
clr.l 26(a4)
pr_playtpallowed:
move.w 2(a6),4(a4)
bra.w pr_playeffect
pr_playeffect:
bsr.w pr_checkfunkrepeat
moveq #0,d0
move.b 2(a6),d0
add.b d0,d0
lea pr_normaleffectlist(pc),a0
move.w (a0,d0.w),d0
jmp (a0,d0.w)
pr_playnoeffect:
rts
pr_normaleffectlist:
dc.w pr_playnoeffect-pr_normaleffectlist ; 0
dc.w pr_playnoeffect-pr_normaleffectlist ; 1
dc.w pr_playnoeffect-pr_normaleffectlist ; 2
dc.w pr_preptoneportamento-pr_normaleffectlist ; 3
dc.w pr_prepvibrato-pr_normaleffectlist ; 4
dc.w pr_playnoeffect-pr_normaleffectlist ; 5
dc.w pr_prepvibandvolslide-pr_normaleffectlist ; 6
dc.w pr_preptremolo-pr_normaleffectlist ; 7
dc.w pr_playnoeffect-pr_normaleffectlist ; 8
dc.w pr_playnoeffect-pr_normaleffectlist ; 9
dc.w pr_playnoeffect-pr_normaleffectlist ; A
dc.w pr_jumptopattern-pr_normaleffectlist ; B
dc.w pr_newvolume-pr_normaleffectlist ; C
dc.w pr_patternbreak-pr_normaleffectlist ; D
dc.w pr_play_e_command-pr_normaleffectlist ; E
dc.w pr_newspeed-pr_normaleffectlist ; F
pr_play_e_command:
moveq #0,d0
move.b 3(a6),d0
lsr.b #4,d0
add.b d0,d0
lea pr_e_commandeffectlist(pc),a0
move.w (a0,d0.w),d0
jmp (a0,d0.w)
pr_e_commandeffectlist:
dc.w pr_setfilter-pr_e_commandeffectlist ; 0
dc.w pr_fineslideup-pr_e_commandeffectlist ; 1
dc.w pr_fineslidedown-pr_e_commandeffectlist ; 2
dc.w pr_setglissandocontrol-pr_e_commandeffectlist ; 3
dc.w pr_setvibratowaveform-pr_e_commandeffectlist ; 4
dc.w pr_playfinetune-pr_e_commandeffectlist ; 5
dc.w pr_jumptoloop-pr_e_commandeffectlist ; 6
dc.w pr_settremolowaveform-pr_e_commandeffectlist ; 7
dc.w pr_playnoeffect-pr_e_commandeffectlist ; 8
dc.w pr_prepretrignote-pr_e_commandeffectlist ; 9
dc.w pr_finevolumeslideup-pr_e_commandeffectlist ; A
dc.w pr_finevolumeslidedown-pr_e_commandeffectlist ; B
dc.w pr_prepnotecut-pr_e_commandeffectlist ; C
dc.w pr_prepnotedelay-pr_e_commandeffectlist ; D
dc.w pr_preppatterndelay-pr_e_commandeffectlist ; E
dc.w pr_prepfunkrepeat-pr_e_commandeffectlist ; F
pr_preppatterndelay:
cmp.b #1,pr_patterndelaytime-pr_framecounter+1(a2)
bge.s pr_preppatterndelayend
move.b 5(a4),d0
and.b #$f,d0
addq.b #1,d0
move.b d0,pr_patterndelaytime-pr_framecounter+1(a2)
pr_preppatterndelayend:
rts
pr_setvibratowaveform:
move.b 5(a4),d0
moveq #$f,d1
and.w d1,d0
move.w d0,50(a4)
rts
pr_settremolowaveform:
move.b 5(a4),d0
moveq #$f,d1
and.w d1,d0
move.w d0,52(a4)
rts
pr_setglissandocontrol:
move.b 5(a4),d0
moveq #$f,d1
and.w d1,d0
move.w d0,48(a4)
rts
pr_playfinetune:
move.b 5(a4),d0
moveq #$f,d1
and.w d1,d0
lsl.w #2,d0
lea pr_fastperiodlist(pc),a0
move.l (a0,d0.w),a0
moveq #0,d1
move.b 1(a6),d1
beq.s pr_playfinetuneend
subq.b #1,d1
add.w d1,d1
move.w (a0,d1.w),2(a4) ; Frequenz eintragen
pr_playfinetuneend:
rts
pr_jumptoloop:
move.b 5(a4),d0
moveq #$f,d1
and.b d1,d0
beq.s pr_prepjumptoloop
addq.b #1,47(a4)
cmp.b 47(a4),d0
blt.s pr_jumptoloopend
moveq.l #0,d0
move.w 44(a4),d0
subq.b #1,d0
move.w d0,pr_patternct-pr_framecounter(a2)
move.l pr_patternpt(pc),a0
move.l (a0),d5
lsl.l #4,d0
add.l d0,d5
move.l d5,pr_Currentposition-pr_framecounter(a2)
rts
pr_jumptoloopend:
clr.w 46(a4)
rts
pr_prepjumptoloop:
tst.w 46(a4)
bne.s pr_prepjumptoloopend
move.w pr_patternct-pr_framecounter(a2),44(a4)
clr.w 46(a4)
pr_prepjumptoloopend:
rts
pr_prepnotedelay:
tst.w (a6)
beq.s pr_prepnotedelayend
move.b 5(a4),d0
and.b #$f,d0
beq.s pr_prepnotedelayend
move.w d7,d0
not.b d0
and.b d0,pr_dmacon-pr_framecounter(a2)
clr.w 18(a4)
rts
pr_prepnotedelayend:
move.w #$fff,18(a4)
rts
pr_prepretrignote:
clr.w 18(a4)
tst.w (a6)
bne.s pr_prepretrignoteend
bsr.w pr_checkretrignote2
pr_prepretrignoteend:
rts
pr_prepnotecut:
clr.w 18(a4)
move.b 5(a4),d0
moveq #$f,d1
and.b d1,d0
tst.b d0
bne.s pr_prepnotecutend
clr.w 12(a4)
pr_prepnotecutend:
rts
pr_finevolumeslideup:
move.b 3(a6),d0
moveq #$f,d1
and.w d1,d0
move.w 12(a4),d1
add.w d0,d1
moveq #64,d0
cmp.w d0,d1
bls.s pr_finevolumeslideup2
move.w d0,d1
pr_finevolumeslideup2:
move.w d1,12(a4)
rts
pr_finevolumeslidedown:
move.b 3(a6),d0
moveq #$f,d1
and.w d1,d0
move.w 12(a4),d1
sub.w d0,d1
btst #15,d1
beq.s pr_finevolumeslidedown2
moveq #0,d1
pr_finevolumeslidedown2:
move.w d1,12(a4)
rts
pr_fineslideup:
move.b 3(a6),d0
moveq #$f,d1
and.w d1,d0
move.w 2(a4),d1
sub.w d0,d1
cmp.w #108,d1
bge.s pr_fineslideup2
move.w #108,d1
pr_fineslideup2:
move.w d1,2(a4)
rts
pr_fineslidedown:
move.b 3(a6),d0
moveq #$f,d1
and.w d1,d0
move.w 2(a4),d1
add.w d0,d1
cmp.w #907,d1
bls.s pr_fineslidedown2
move.w #907,d1
pr_fineslidedown2:
move.w d1,2(a4)
rts
pr_setfilter:
btst #0,3(a6)
beq.s pr_setfilteron
pr_setfilteroff:
bset #1,$bfe001
rts
pr_setfilteron:
bclr #1,$bfe001
rts
pr_prepvibandvolslide:
cmp.b #1,pr_speed-pr_framecounter+1(a2)
beq.s pr_prepvibandvolslide2
tst.b 1(a6)
beq.s pr_prepvibandvolslide2
clr.w 18(a4)
pr_prepvibandvolslide2:
rts
pr_preptoneportamento:
tst.b 3(a6)
beq.s pr_preptoneportamento2
move.w 2(a6),22(a4)
pr_preptoneportamento2:
rts
pr_prepvibrato:
cmp.b #1,pr_speed-pr_framecounter+1(a2)
beq.s pr_prepvibrato2
tst.b 1(a6)
beq.s pr_prepvibrato0
clr.w 18(a4)
pr_prepvibrato0:
move.b 5(a4),d0
move.b d0,d1
lsr.b #4,d1
beq.s pr_prepvibrato1
move.b d1,24(a4)
pr_prepvibrato1:
and.b #$f,d0
beq.s pr_prepvibrato2
move.b d0,25(a4)
pr_prepvibrato2:
rts
pr_preptremolo:
cmp.b #1,pr_speed-pr_framecounter+1(a2)
beq.s pr_preptremolo2
tst.b 1(a6)
beq.s pr_preptremolo0
clr.w 18(a4)
pr_preptremolo0:
move.w 12(a4),20(a4)
move.b 5(a4),d0
move.b d0,d1
lsr.b #4,d1
beq.s pr_preptremolo1
move.b d1,30(a4)
pr_preptremolo1:
and.b #$f,d0
beq.s pr_preptremolo2
move.b d0,31(a4)
pr_preptremolo2:
rts
pr_newvolume:
move.b 3(a6),d0
cmp.b #64,d0
bls.s pr_newvolumeend
moveq #64,d0
pr_newvolumeend:
move.b d0,13(a4)
rts
pr_newspeed:
move.b 3(a6),d0
tst.b d0
bne.s pr_newspeed2
moveq #1,d0
pr_newspeed2:
move.b d0,pr_speed-pr_framecounter+1(a2)
rts
pr_patternbreak:
moveq #0,d0
move.b 3(a6),d0
add.w #63,d0
move.w d0,pr_Patternct-pr_framecounter(a2)
addq.w #1,pr_patternhasbeenbreaked-pr_framecounter(a2)
rts
pr_jumptopattern:
moveq.l #0,d0
move.b 3(a6),d0
subq.b #1,d0
btst #7,d0
beq.s pr_playjumptopattern2
move.w #128,d0
pr_playjumptopattern2:
move.b d0,pr_currentpattern-pr_framecounter+1(a2)
lsl.l #2,d0
lea pr_patternpositions(pc),a0
add.l a0,d0
move.l d0,pr_patternpt-pr_framecounter(a2)
move.w #63,pr_patternct-pr_framecounter(a2)
addq.w #1,pr_patternhasbeenbreaked-pr_framecounter(a2)
rts
* Control FX every frame **********************************************
pr_checkeffects:
moveq #1,d7
lea $a0(a5),a3
lea pr_channel0(pc),a4
move.w 12(a4),54(a4)
pr_checkchannel
IFEQ INCLUDEFADINGROUTINE-YES
move.w 54(a4),d0
mulu.w pr_musicfadect-pr_framecounter(a2),d0
lsr.l #6,d0
move.w d0,8(a3)
ELSE
move.w 54(a4),8(a3)
ENDC
moveq #2,d7
lea $b0(a5),a3
lea pr_channel1(pc),a4
move.w 12(a4),54(a4)
pr_checkchannel
IFEQ INCLUDEFADINGROUTINE-YES
move.w 54(a4),d0
mulu.w pr_musicfadect-pr_framecounter(a2),d0
lsr.l #6,d0
move.w d0,8(a3)
ELSE
move.w 54(a4),8(a3)
ENDC
moveq #4,d7
lea $c0(a5),a3
lea pr_channel2(pc),a4
move.w 12(a4),54(a4)
pr_checkchannel
IFEQ INCLUDEFADINGROUTINE-YES
move.w 54(a4),d0
mulu.w pr_musicfadect-pr_framecounter(a2),d0
lsr.l #6,d0
move.w d0,8(a3)
ELSE
move.w 54(a4),8(a3)
ENDC
moveq #8,d7
lea $d0(a5),a3
lea pr_channel3(pc),a4
move.w 12(a4),54(a4)
pr_checkchannel
IFEQ INCLUDEFADINGROUTINE-YES
move.w 54(a4),d0
mulu.w pr_musicfadect-pr_framecounter(a2),d0
lsr.l #6,d0
move.w d0,8(a3)
ELSE
move.w 54(a4),8(a3)
ENDC
lea pr_int(pc),a0
move.l a0,$78.w
move.b #$19,$bfde00
rts
***********************************************************************
pr_checknotchannel:
rts
pr_check_e_commands
moveq #0,d0
move.b 5(a4),d0
lsr.b #4,d0
add.b d0,d0
lea pr_E_Command_checklist(pc),a0
move.w (a0,d0.w),d0
jmp (a0,d0.w)
pr_Effectchecklist:
dc.w pr_checkarpeggio-pr_Effectchecklist ; 0
dc.w pr_checkperiodslideup-pr_Effectchecklist ; 1
dc.w pr_checkperiodslidedown-pr_Effectchecklist ; 2
dc.w pr_checktoneportamento-pr_Effectchecklist ; 3
dc.w pr_checkvibrato-pr_Effectchecklist ; 4
dc.w pr_checktpandvolslide-pr_Effectchecklist ; 5
dc.w pr_checkvibandvolslide-pr_Effectchecklist ; 6
dc.w pr_checktremolo-pr_Effectchecklist ; 7
dc.w pr_checknotchannel-pr_Effectchecklist ; 8
dc.w pr_checknotchannel-pr_Effectchecklist ; 9
dc.w pr_checkvolumeslide-pr_Effectchecklist ; A
dc.w pr_checknotchannel-pr_Effectchecklist ; B
dc.w pr_checknotchannel-pr_Effectchecklist ; C
dc.w pr_checknotchannel-pr_Effectchecklist ; D
dc.w pr_check_e_commands-pr_Effectchecklist ; E
dc.w pr_checknotchannel-pr_Effectchecklist ; F
pr_E_Command_checklist:
dc.w pr_checknotchannel-pr_E_Command_checklist ; 0
dc.w pr_checknotchannel-pr_E_Command_checklist ; 1
dc.w pr_checknotchannel-pr_E_Command_checklist ; 2
dc.w pr_checknotchannel-pr_E_Command_checklist ; 3
dc.w pr_checknotchannel-pr_E_Command_checklist ; 4
dc.w pr_checknotchannel-pr_E_Command_checklist ; 5
dc.w pr_checknotchannel-pr_E_Command_checklist ; 6
dc.w pr_checknotchannel-pr_E_Command_checklist ; 7
dc.w pr_checknotchannel-pr_E_Command_checklist ; 8
dc.w pr_checkretrignote-pr_E_Command_checklist ; 9
dc.w pr_checknotchannel-pr_E_Command_checklist ; A
dc.w pr_checknotchannel-pr_E_Command_checklist ; B
dc.w pr_checknotecut-pr_E_Command_checklist ; C
dc.w pr_checknotedelay-pr_E_Command_checklist ; D
dc.w pr_checknotchannel-pr_E_Command_checklist ; E
dc.w pr_checknotchannel-pr_E_Command_checklist ; F
pr_prepfunkrepeat:
move.b 5(a4),d0
moveq #$f,d1
and.b d1,d0
move.b d0,33(a4)
tst.b d0
bne.s pr_checkfunkrepeat
rts
pr_checkfunkrepeat:
move.w 32(a4),d0
beq.s pr_checkfunkrepeatend
lea pr_FunkTable(pc),a0
move.b (a0,d0.w),d0
move.b 35(a4),d1
add.b d0,d1
btst #7,d1
bne.s pr_checkfunkrepeat2
move.b d1,35(a4)
rts
pr_checkfunkrepeat2:
clr.b 35(a4)
move.l 36(a4),d0
beq.s pr_checkfunkrepeatend
move.l d0,d2
moveq.l #0,d1
move.w 10(a4),d1
add.l d1,d0
add.l d1,d0
move.l 40(a4),a0
addq.l #1,a0
cmp.l d0,a0
blo.s pr_checkfunkrepeatok
move.l d2,a0
pr_checkfunkrepeatok:
move.l a0,40(a4)
moveq #-1,d0
sub.b (a0),d0
move.b d0,(a0)
pr_checkfunkrepeatend:
rts
pr_checknotedelay:
move.b 5(a4),d0
moveq #$f,d1
and.w d1,d0
bne.s pr_checknotedelay2
rts
pr_checknotedelay2:
move.w 18(a4),d1
addq.w #1,d1
cmp.w d0,d1
bne.s pr_checknotedelayend
move.w d7,$96(a5)
or.w d7,pr_dmacon-pr_framecounter(a2)
move.w (a4),d0
subq.w #1,d0
lsl.w #5,d0
lea pr_Sampleinfos(pc),a0
move.l (a0,d0.w),(a3)
move.w 4(a0,d0.w),4(a3)
pr_checknotedelayend:
move.w d1,18(a4)
rts
pr_checkretrignote:
move.b 5(a4),d0
moveq #$f,d1
and.w d1,d0
move.w 18(a4),d1
addq.w #1,d1
cmp.w d0,d1
bne.s pr_checkretrignoteend
pr_checkretrignote2:
moveq #0,d1
move.w d7,$96(a5)
or.w d7,pr_dmacon-pr_framecounter(a2)
move.w (a4),d0
subq.w #1,d0
lsl.w #5,d0
lea pr_Sampleinfos(pc),a0
move.l (a0,d0.w),(a3)
move.w 4(a0,d0.w),4(a3)
pr_checkretrignoteend:
move.w d1,18(a4)
rts
pr_checknotecut:
move.b 5(a4),d0
moveq #$f,d1
and.w d1,d0
addq.w #1,18(a4)
move.w 18(a4),d1
cmp.w d0,d1
blt.s pr_checknotecutend
clr.w 12(a4)
clr.w 54(a4)
pr_checknotecutend:
rts
pr_checkarpeggio:
tst.b 5(a4)
bne.s pr_checkarpeggio0
rts
pr_checkarpeggio0:
move.w (a2),d0
lea pr_arpeggiofastdivisionlist(pc),a1
move.b (a1,d0.w),d0
beq.s pr_checkarpeggio2
cmp.b #2,d0
beq.s pr_checkarpeggio1
moveq #0,d0
move.b 5(a4),d0
lsr.b #4,d0
bra.s pr_checkarpeggio3
pr_checkarpeggio2:
move.w 2(a4),6(a3)
rts
pr_checkarpeggio1:
moveq #0,d0
move.b 5(a4),d0
and.b #$f,d0
pr_checkarpeggio3:
asl.w #1,d0
move.w (a4),d1
lsl.w #5,d1
lea pr_Sampleinfos+Samplefinetuneoffset(pc),a0
move.l (a0,d1.w),a0
move.w 2(a4),d1
lea pr_Arpeggiofastlist(pc),a1
moveq.l #0,d2
move.b (a1,d1.w),d2
add.b d2,d2
add.l d2,a0
moveq #36,d7
pr_checkarpeggioloop:
cmp.w (a0)+,d1
bhs.s pr_checkarpeggio4
dbf d7,pr_checkarpeggioloop
rts
pr_checkarpeggio4:
subq.l #2,a0
move.w (a0,d0.w),6(a3)
rts
pr_checktpandvolslide:
bsr.w pr_checkvolumeslide
moveq #0,d2
move.b 23(a4),d2
move.w 26(a4),d0
move.w 28(a4),d1
bsr.s pr_checktoneportamento2
move.w 14(a4),26(a4)
rts
pr_checktoneportamento:
moveq #0,d2
move.b 5(a4),d2
bne.s pr_checktoneportamento1
move.b 23(a4),d2
pr_checktoneportamento1:
move.w 14(a4),d0
move.w 16(a4),d1
pr_checktoneportamento2:
cmp.w d0,d1
bgt.s pr_checktoneportamentoplus
blt.s pr_checktoneportamentominus
cmp.w #1,(a2)
beq.s pr_savetpvalues
rts
pr_checktoneportamentoplus:
add.w d2,d0
cmp.w d0,d1
bgt.s pr_checktoneportamentoend
move.w d1,d0
move.w d1,14(a4)
move.w d1,2(a4)
tst.w 48(a4)
bne.s pr_checktoneportamentoglissando
move.w d1,6(a3)
cmp.w #1,(a2)
beq.s pr_savetpvalues
rts
pr_checktoneportamentominus:
sub.w d2,d0
cmp.w d0,d1
blt.s pr_checktoneportamentoend
move.w d1,d0
move.w d1,14(a4)
move.w d1,2(a4)
tst.w 48(a4)
bne.s pr_checktoneportamentoglissando
move.w d1,6(a3)
cmp.w #1,(a2)
beq.s pr_savetpvalues
rts
pr_checktoneportamentoend:
move.w d0,14(a4)
move.w d0,2(a4)
tst.w 48(a4)
bne.s pr_checktoneportamentoglissando
move.w d0,6(a3)
cmp.w #1,(a2)
beq.s pr_savetpvalues
rts
pr_savetpvalues:
move.l 14(a4),26(a4)
rts
pr_checktoneportamentoglissando:
move.w (a4),d1
lsl.w #5,d1
lea pr_Sampleinfos+Samplefinetuneoffset(pc),a0
move.l (a0,d1.w),a0
lea pr_Arpeggiofastlist(pc),a1
moveq.l #0,d2
move.b (a1,d0.w),d2
add.w d2,d2
add.l d2,a0
moveq #0,d3
moveq #36*2,d1
pr_checktoneportamentoglissandoloop:
cmp.w (a0,d3.w),d0
bhs.s pr_checktoneportamentoglissando2
addq.w #2,d3
cmp.w d1,d3
blo.s pr_checktoneportamentoglissandoloop
moveq #35*2,d3
pr_checktoneportamentoglissando2:
move.w (a0,d3.w),6(a3)
cmp.w #1,(a2)
beq.s pr_savetpvalues
rts
pr_checkvolumeslide:
moveq #0,d0
move.b 5(a4),d0
move.w d0,d1
lsr.b #4,d1
beq.s pr_checkvolumeslidedown
move.w 12(a4),d2
add.w d1,d2
btst #15,d2
bne.s pr_checkvolumeslide0
moveq #64,d0
cmp.w d0,d2
bgt.s pr_checkvolumeslide64
move.w d2,12(a4)
move.w d2,54(a4)
rts
pr_checkvolumeslidedown:
and.b #$f,d0
move.w 12(a4),d2
sub.w d0,d2
btst #15,d2
bne.s pr_checkvolumeslide0
moveq #64,d0
cmp.w d0,d2
bgt.s pr_checkvolumeslide64
move.w d2,12(a4)
move.w d2,54(a4)
rts
pr_checkvolumeslide64:
move.w d0,12(a4)
move.w d0,54(a4)
rts
pr_checkvolumeslide0:
clr.w 12(a4)
clr.w 54(a4)
rts
pr_checkperiodslidedown:
moveq #0,d0
move.b 5(a4),d0
add.w d0,2(a4)
cmp.w #907,2(a4)
bls.s pr_checkperiodslidedown2
move.w #907,2(a4)
pr_checkperiodslidedown2:
move.w 2(a4),6(a3)
rts
pr_checkperiodslideup:
moveq #0,d0
move.b 5(a4),d0
sub.w d0,2(a4)
cmp.w #108,2(a4)
bge.s pr_checkperiodslideup2
move.w #108,2(a4)
pr_checkperiodslideup2:
move.w 2(a4),6(a3)
rts
pr_checkvibandvolslide:
bsr.w pr_checkvolumeslide
moveq.l #0,d0
moveq.l #0,d1
move.b 25(a4),d0
move.b 24(a4),d1
bra.s pr_checkvibrato4
pr_checkvibrato:
moveq.l #0,d0
moveq.l #0,d1
move.b 5(a4),d0 ; Tiefe
pr_checkvibrato2:
move.w d0,d1 ; Geschwindigkeit
and.w #$f,d0
bne.s pr_checkvibrato3
move.b 25(a4),d0
pr_checkvibrato3:
lsr.b #4,d1
bne.s pr_checkvibrato4
move.b 24(a4),d1
pr_checkvibrato4:
move.w 18(a4),d2 ;Position
lsr.w #2,d2
and.w #$1f,d2
move.w 50(a4),d3
beq.s pr_checkvibratosine
btst #0,d3
bne.s pr_checkvibratorampdown
move.b #255,d3
bra.s pr_checkvibratoset
pr_checkvibratorampdown:
lsl.b #3,d2
tst.b 19(a4)
bpl.s pr_checkvibratorampdown2
move.b #255,d3
sub.b d2,d3
bra.s pr_checkvibratoset
pr_checkvibratorampdown2:
move.b d2,d3
bra.s pr_checkvibratoset
pr_checkvibratosine:
lea pr_Vibratotable(pc),a0
moveq #0,d3
move.b (a0,d2.w),d3
pr_checkvibratoset:
mulu.w d0,d3
lsr.w #7,d3
move.w 2(a4),d2
tst.b 19(a4)
bmi.s pr_checkvibratoneg
add.w d3,d2
bra.s pr_checkvibrato5
pr_checkvibratoneg:
sub.w d3,d2
pr_checkvibrato5:
move.w d2,6(a3)
lsl.w #2,d1
add.b d1,19(a4)
rts
pr_checktremolo:
moveq #0,d0
moveq.l #0,d1
move.b 5(a4),d0 ; Tiefe
pr_checktremolo2:
move.w d0,d1 ; Geschwindigkeit
and.w #$f,d0
bne.s pr_checktremolo3
move.b 31(a4),d0
pr_checktremolo3:
lsr.b #4,d1
bne.s pr_checktremolo4
move.b 30(a4),d1
pr_checktremolo4:
move.w 18(a4),d2 ;Position
lsr.w #2,d2
and.w #$1f,d2
move.w 52(a4),d3
beq.s pr_checktremolosine
btst #0,d3
bne.s pr_checktremolorampdown
move.b #255,d3
bra.s pr_checktremoloset
pr_checktremolorampdown:
lsl.b #3,d2
tst.b 19(a4)
bpl.s pr_checktremolorampdown2
move.b #255,d3
sub.b d2,d3
bra.s pr_checktremoloset
pr_checktremolorampdown2:
move.b d2,d3
bra.s pr_checktremoloset
pr_checktremolosine:
lea pr_Vibratotable(pc),a0
moveq #0,d3
move.b (a0,d2.w),d3
pr_checktremoloset:
mulu.w d0,d3
lsr.w #6,d3
move.w 20(a4),d2
tst.b 19(a4)
bmi.s pr_checktremoloneg
add.w d3,d2
moveq #64,d4
cmp.w d4,d2
bls.s pr_checktremolo5
move.w d4,d2
bra.s pr_checktremolo5
pr_checktremoloneg:
sub.w d3,d2
btst #15,d2
beq.s pr_checktremolo5
moveq #0,d2
pr_checktremolo5:
move.w d2,54(a4)
lsl.w #2,d1
add.b d1,19(a4)
rts
pr_VibratoTable:
dc.b 0, 24, 49, 74, 97, 120, 141, 161
dc.b 180, 197, 212, 224, 235, 244, 250, 253
dc.b 255, 253, 250, 244, 235, 224, 212, 197
dc.b 180, 161, 141, 120, 97, 74, 49, 24
pr_FunkTable:
dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
* Variables ***********************************************************
pr_module: dc.l 0
pr_startposition: dc.w 0
pr_speed: dc.w 6
pr_highestpattern: dc.w 0
pr_currentpattern: dc.w 0
pr_framecounter: dc.w 0
pr_patterndelaytime: dc.w 0
pr_patternhasbeenbreaked: dc.w 0
pr_Patternpositions: ds.l 128
pr_Patternpt: dc.l 0
pr_Currentposition: dc.l 0
pr_Patternct: dc.w 0
pr_Channel0: dc.w 1
ds.w 27
pr_Channel1: dc.w 1
ds.w 27
pr_Channel2: dc.w 1
ds.w 27
pr_Channel3: dc.w 1
ds.w 27
pr_dmacon: dc.w $8000
pr_old78: dc.l 0
pr_arpeggiofastlist: ds.b 1000
pr_arpeggiofastdivisionlist: ds.b $100
pr_fastperiodlist: ds.l 16
pr_Sampleinfos: ds.b 32*32
pr_periods:
; Tuning 0, Normal
dc.w 856,808,762,720,678,640,604,570,538,508,480,453
dc.w 428,404,381,360,339,320,302,285,269,254,240,226
dc.w 214,202,190,180,170,160,151,143,135,127,120,113
; Tuning 1
dc.w 850,802,757,715,674,637,601,567,535,505,477,450
dc.w 425,401,379,357,337,318,300,284,268,253,239,225
dc.w 213,201,189,179,169,159,150,142,134,126,119,113
; Tuning 2
dc.w 844,796,752,709,670,632,597,563,532,502,474,447
dc.w 422,398,376,355,335,316,298,282,266,251,237,224
dc.w 211,199,188,177,167,158,149,141,133,125,118,112
; Tuning 3
dc.w 838,791,746,704,665,628,592,559,528,498,470,444
dc.w 419,395,373,352,332,314,296,280,264,249,235,222
dc.w 209,198,187,176,166,157,148,140,132,125,118,111
; Tuning 4
dc.w 832,785,741,699,660,623,588,555,524,495,467,441
dc.w 416,392,370,350,330,312,294,278,262,247,233,220
dc.w 208,196,185,175,165,156,147,139,131,124,117,110
; Tuning 5
dc.w 826,779,736,694,655,619,584,551,520,491,463,437
dc.w 413,390,368,347,328,309,292,276,260,245,232,219
dc.w 206,195,184,174,164,155,146,138,130,123,116,109
; Tuning 6
dc.w 820,774,730,689,651,614,580,547,516,487,460,434
dc.w 410,387,365,345,325,307,290,274,258,244,230,217
dc.w 205,193,183,172,163,154,145,137,129,122,115,109
pr_Arpeggiofastlistperiods:
; Tuning 7
dc.w 814,768,725,684,646,610,575,543,513,484,457,431
dc.w 407,384,363,342,323,305,288,272,256,242,228,216
dc.w 204,192,181,171,161,152,144,136,128,121,114,108
; Tuning -8
dc.w 907,856,808,762,720,678,640,604,570,538,508,480
dc.w 453,428,404,381,360,339,320,302,285,269,254,240
dc.w 226,214,202,190,180,170,160,151,143,135,127,120
; Tuning -7
dc.w 900,850,802,757,715,675,636,601,567,535,505,477
dc.w 450,425,401,379,357,337,318,300,284,268,253,238
dc.w 225,212,200,189,179,169,159,150,142,134,126,119
; Tuning -6
dc.w 894,844,796,752,709,670,632,597,563,532,502,474
dc.w 447,422,398,376,355,335,316,298,282,266,251,237
dc.w 223,211,199,188,177,167,158,149,141,133,125,118
; Tuning -5
dc.w 887,838,791,746,704,665,628,592,559,528,498,470
dc.w 444,419,395,373,352,332,314,296,280,264,249,235
dc.w 222,209,198,187,176,166,157,148,140,132,125,118
; Tuning -4
dc.w 881,832,785,741,699,660,623,588,555,524,494,467
dc.w 441,416,392,370,350,330,312,294,278,262,247,233
dc.w 220,208,196,185,175,165,156,147,139,131,123,117
; Tuning -3
dc.w 875,826,779,736,694,655,619,584,551,520,491,463
dc.w 437,413,390,368,347,328,309,292,276,260,245,232
dc.w 219,206,195,184,174,164,155,146,138,130,123,116
; Tuning -2
dc.w 868,820,774,730,689,651,614,580,547,516,487,460
dc.w 434,410,387,365,345,325,307,290,274,258,244,230
dc.w 217,205,193,183,172,163,154,145,137,129,122,115
; Tuning -1
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
* END OF PRORUNNER ***************************************************
SECTION MUSIC,DATA_C
pr_data:
incbin "df0:mod.testmodule"
END