RAW:0/0/640/200/PRORUNNER V1.0 CON:0/100/640/80/ENTER FILENAME PRORUNNER V1.0 -------------- Press: 1 to save the Documentary to disk 2 to save the Source-text to disk --------------------------------------------------- Enter: Ú Enter Filename for Documentary : & Enter Filename for Source-Text : *************** * 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 "dh0:modules/mod.microforce-intro4" END -=* PRORUNNER Version 1.0 *=- ------------------------------------------------- * THE ULTIMATE PROTRACKER-REPLAYER * CODED BY COSMOS OF SANITY ------------------------- MAINFILE-MUSIC BY MICROFORCE OF SANITY * USE CURSOR-KEYS TO SCROLL UP/DOWN * PRESS RETURN TO EXIT TO SAVEMENU * 1. NOTE: -------- To understand all factors of PRORUNNER perfectly,it is necessary to read this DOC-file .So if you want to copy the source-text of PRORUNNER on your pack or compilation or whatever,then please copy the Mainfile on your disk, because it also contains this documentary. 2. WHY I WROTE PRORUNNER ------------------------ To tell you the reason of my work,I shall have to take you with me a long way in time: To the beginning of my career as an AMIGA-demo-coder ! At that time a great soundtool made his way through the AMIGA-scene: THE SOUNDTRACKER ( Version 2.2 ,I think ). I was fascinated by that great music you were able to compose and decided to get the replayer-routine in order to include some funky tunes in my demos.To my own surprise I even got several replayers,all of them complaining to replay modules from SOUNDTRACKER V2.2 !! But I was never satisfied with the replay-routine I built in. Most of them were too slow and the rest was a bit faster,but made some mistakes, which you could easily hear. It seemed to me,that a fast replayer outcluded a correct replay. As a demo-coder I first wanted to use one of the fast replayers to gain some rastertime,but the result was,that the music sounded terribly.Moreover I recognized the disappointment,which the musician showed,because he had a lot of work with his tune and this work seemed to be minimated by a wrong replay. And that was finally the reason, why I used the slowest ( and most correct ) replayer ! Later versions of SOUNDTRACKER came up with the same problem and even the first version of NOISETRACKER couldn't solve it. It still took some time, until NOISETRACKER V2.0 appeared, which was in my eyes a highlight for every coder because of its very fast 8-rasterlines-replayer ! Some other tools came up like : NOISEPACKER V1.0 - V3.0 , NOISERUNNER and some other replayers from several guys . NOISETRACKER V2.0 dominated the demo-scene for a long time as suddenly a new,greater,more powerful soundtool showed up: PROTRACKER V1.0 !! Much more comfortable and with new effects this tool persuaded ( nearly ) every musician. But PROTRACKER V1.0 and later versions ( V1.0A - V2.2a ) had a 'The minimum are 56 frames' - replay-routine,if you know,what I mean. Soon some rumours went around about a '10-rasterlines-PROTRACKER-replayer', but that rumours never turned out to be true and so the scene had to wait... After a long time AZATOTH of PHENOMENA wrote a PROPACKER,which was able to shorten the module,replay most of the PROTRACKER-effects and the replay was mostly done in less than 9 rasterlines. It seemed to be musicians' and coders' heaven as this great tool was released. But it wasn't !!! In fact some coders intended to include a soundfading-routine in the PROPACKER-replayer,but they failed,because the replayer was coded too complicated,so that only AZATOTH would have been able to code a soundfading- routine. Another problem was,that PROPACKER seemed to have some problems to convert some PROTRACKER-modules ( e.g. SILENT ATTACK,MYSTIKAL!-VIBES etc. ). Moreover PROPACKER made some mistakes in replaying TONE PORTAMENTO ( I'll explain that later ) and some important effects were missing as many musicians have discovered FUNK REPEAT to let the chip-tunes appear more synthetic . And to name the last point : In the case you are coding a demo and you have tested it for 2000 times and you were listening to that same song 2000 times,it could be,that this song is a bit boring after 2000 times. But you are coding at the moment and a new PROPACKER-module means : 1. Quit Assembler 2. Load PROPACKER ( with the exact parameters,otherwise you can type the whole line again ) 3. Load Assembler again 4. Load Sourcetext So loading in a new song very often turned out to be a long procedure. And for me , the owner of a 105MB Harddisk, 1 MB Chipmem and 2MB Fastmem is it more comfortable just to type in another modulename in order to load another PROTRACKER-module. And remembering the good old times ( SOUNDTRACKER V2.2 ) I didn't want to wait again until a new replay-routine appears and so I tried to code a replayer for the PROTRACKER,which is very fast,plays all effects and corrects all mistakes done by PROPACKER. I hope I didn't fail ..... 3. WHY USING PRORUNNER ? ------------------------ Well,I think,the first advantage is,that PRORUNNER really handles ALL effects,which you are allowed to use in PROTRACKER V2.2a. I don't want to mention them,because they are listed up at the beginning of the source- text. To explain you the second advantage I have to tell you the situation. Imagine yourself a channel looking like this: C-2 1000 ; No Effekt 0301 ; TONE PORTAMENTO 0301 ; TONE PORTAMENTO As you can see,the replayer first has to play sample no.1 with the note C-2. After that he finds neither a note nor a samplenumber,but he shall play TONE PORTAMENTO. And so do most of the replayers,but they do wrong !!! Because at the last time,when they played a sample,TONE PORTAMENTO wasn't included,every following TONE PORTAMENTO ( without any note ) mustn't be played. And that's a fact PRORUNNER pays attention on. I admit,that was a very special situation,but if such a situation appears, you have to replay it as correctly as other situations. I tested PRORUNNER with lots of modules ( all modules I had on my harddisk ) and some special- written modules to confrontate the replayer with abnormal situations ( e.g. several loops ( one in another ) on several channels ) and I hope, that I have removed all bugs now, but who knows ? The third advantage is ( in my eyes ),that PRORUNNER replays NORMAL PROTRACKER-MODULES. That means: If you are coding and you want to listen to another music,then you just have to type in another modulename. NO COMPLICATED PROCEDURES TO PACK ANOTHER MODULE -> JUST ANOTHER MODULENAME !!! The fourth advantage is,that in the sourcetext of PRORUNNER a musicfade- routine is already implemented . I'll explain later how to handle it. The finally last advantage is the fact, that PRORUNNER is the first replayer, which is coded totally PC-relative ! That means,you can copy PRORUNNER freely through the whole memory,it will always play the music correctly ( At least I hope so. I tried it myself and it worked fine. And pay attention: If you copy PRORUNNER from $30000 to $80000 and you call the Init-Routine at $30000 and the Replay-Routine at $80000, then PRORUNNER obviously can't replay the music ). 4. HOW TO USE PRORUNNER ----------------------- I. Write the address of your module to the label 'pr_module'.To give you an example: move.l #moduleaddress,pr_module II. Write the number of the startposition to the label 'pr_startposition'. A short example: move.w #45,pr_startposition If the startposition is 0, you can of course leave that point.If the number of the startposition is too high, then it will be automatically set to 0 ! I just implemented this option as i saw some modules,which were 2 songs in 1.That means,they used the same instruments and the patterns of song 1 were followed by the patterns of song 2. To ease the coder's attempt to start the second song i implemented that option,maybe you can use it. III.After that you can call the subroutine 'pr_init'. I will later explain a bit more to the Init-routine. IV. Call the subroutine 'pr_music' once in every frame to replay the module. Please remark,that PRORUNNER can only replay the samples,when the DMA-Mainbit ( Bit No.9 ) is set and the Interrupts are allowed ( that's because PRORUNNER works with LEVEL 6-Interrupt ). V. To end the song,call the subroutine 'pr_end',which will close all music- channels. REMARK : The PRORUNNER Init-Routine converts the PROTRACKER-module in an own format and replaces the four letters 'M.K.' by 'SNT.' This converting will surely take some time,but it needs max. 1 second. As I know,that many of the coders read their datas ( gfx,music ) in MASTERSEKA or ASMOne with '>extern' once to thier addresses and assemble their code to another part of the memory,I built in the option,that PRORUNNER recognizes an already converted module ( signed by 'SNT.' ) and doesn't convert it again,so that these coders don't have to read in the whole external datas every time they assemble their code. 5. HOW TO USE THE MUSIC-FADE-ROUTINE ------------------------------------ This routine works with 2 labels: pr_musicfadect pr_musicfadedirection pr_musicfadect: It is the counter to fade the music.It runs from 0 to 64.Value at the beginning is 64. pr_musicfadedirection: This gives you the direction you want to fade your music to.Two Possibilities are sensible: 1 = Add 1 to pr_musicfadect in every frame -1 = Sub 1 from pr_musicfadect in every frame Higher values would fade the music away too fast.By the way: If the counter 'pr_musicfadect' reaches the values 0 or 64,then pr_musicfadedirection will be automatically set to 0 !! Anyway. Here are two examples for fading: a) Start of Demo: Fade Music in. ; Fadecounter is still 64 clr.w pr_musicfadect ; Set Fadecounter to 0 move.w #1,pr_musicfadedirection ; Fade Music in b) End of Demo : Fade Music out. ; Counter is still set on 64 move.w #-1,pr_musicfadedirection ; Fade Music out Easy,isn't it ? And the PRORUNNER-Musicfade-routine really fades all channels correctly, no matter, if a longer sample is played without any effects or if some volume-effects ( e.g. tremolo,volume-slide etc. ) are played. 6. HOW FAST IS PRORUNNER ? -------------------------- Well,it of course depends on the effects you are using. I tested it ( as mentioned above ) with lots of modules and I have to say,that PRORUNNER never needed more than 8 RASTERLINES,but many complicated effects together with FUNK REPEAT can surely push it up to 9 or even 10 RASTERLINES ( e.g. Using VIBRATO+VOLUME SLIDE together with FUNK REPEAT on all 4 channels could cost 10 RASTERLINES ). A problem in the replayer is the musicfade-routine,because it uses 4 MULUs, which surely take their rastertime.The problem is,that in most of the demos no fading of the music is needed. In that case you can remove the musicfade- routine to gain a bit more rastertime.Normally the source-text should look like this: . ; \ . ; \ . ; \ Header of . ; / PRORUNNER . ; / . ; / YES EQU 1 NO EQU 0 INCLUDEFADINGROUTINE EQU YES There you just have to change the last line in: INCLUDEFADINGROUTINE EQU NO The Assembler now assembles the PRORUNNER-routine automatically without the musicfade-routine and its labels 'pr_musicfadect' and 'pr_musicfade- direction'. Just some words to the speed of PRORUNNER: Some effects ( e.g. ARPEGGIO, GLISSANDO ) I speeded up a lot. The problem of ARPEGGIO and GLISSANDO was for the replayer,that it had to look through a periodtable until it found the value it searched for. That meant : Even PROPACKER ( which is really a fast replayer ) needed up to 19 RASTERLINES ,when you played ARPEGGIO on all channels. PRORUNNER indeed uses a shorter,but exact(!) method to play ARPEGGIO,so that ARPEGGIO on all channels ( without FUNKREPEAT ofcourse ) takes not more than 7 RASTERLINES ( 6 RASTERLINES, when you switch the musicfade-routine off ) !! 7. IMPORTANT ------------ As I tested PRORUNNER,I also took some older NOISETRACKER-modules, which have a bit different song-format from PROTRACKER-modules. I heard a little difference,because PRORUNNER calculated wrong startaddresses for the samples. I loaded PROTRACKER , read in the module and saved it again. And as I started PRORUNNER again,it replayed the module in a correct way. So if you want to replay old NOISETRACKER-modules, then you first have to save them under PROTRACKER. Otherwise it can be, that PRORUNNER makes trouble in replaying the module. 8. SOME LAST WORDS ------------------ Yep. Some last words have to be said. I hope, that for some guys out there I was able to solve the 'replayer-problem', that I was able to help you. In the case,that you've found a bug in the replayer or if you want to write or call me for any reason, here's my address and phonenumber: COSMOS of SANITY MARC HEYL ROBERT-KOCH-STRASSE 4 6650 HOMBURG-SAAR GERMANY TEL. 06841 / 65164 ****************************************************************************