; lea mod,a0 ; bsr pro_init ; rts ; ;mod incbin data:modules/chiptunes/16-beat/itspheno.mod ; dc.b "hier ist ende!" n_note EQU 0 ;w n_cmd EQU 2 ;w n_cmdlo EQU 3 ;b n_start EQU 4 ;l n_length EQU 8 ;w n_loopstart EQU 10 ;l n_replen EQU 14 ;w n_period EQU 16 ;w n_finetune EQU 18 ;b n_volume EQU 19 ;b n_dmabit EQU 20 ;w n_toneportdirec EQU 22 ;b n_toneportspeed EQU 23 ;b n_wantedperiod EQU 24 ;w n_vibratocmd EQU 26 ;b n_vibratopos EQU 27 ;b n_tremolocmd EQU 28 ;b n_tremolopos EQU 29 ;b n_wavecontrol EQU 30 ;b n_glissfunk EQU 31 ;b n_sampleoffset EQU 32 ;b n_pattpos EQU 33 ;b n_loopcount EQU 34 ;b n_funkoffset EQU 35 ;b n_wavestart EQU 36 ;l n_reallength EQU 40 ;w n_trigger = 42 ; b ******************************************** * * * PROPLAYER V2.04 - NON-SYSTEM OCT/96 * * ---------------------------- * * CODED BY WIZZBALL * * * * FIXED BY STINGRAY o8-DEC-2k1 * * (FIXES MARKED WITH '!! stingray') * * * * - now it's really 1oo% pc-relative * * (over 1oo RELOC32 entries is NOT * * what I call PC independent...) * * * * - module size is calculated at the * * beginning and can be found at * * 'pro_modlen', needed for a range * * check in the sample init-loop, * * no more destroying of data behind * * the module! * * * * - interrupts fixed for 68o4o/68o6o * * * * 13-Dec-2k1 * * - added pro_customLev6 for external * * level6 interrupt routines, usefull * * for e.g. scopes/analyzers * * * * 15-Dec-2k1 * * - n_xxx added, look above * * * * - n_trigger, useful for scopes * * * * - mega bug fixxxxxed after !!!HOURS!!! * * of bughunting, this was actually a * * a bug of mine :/ a4 had a random * * value when calling pro_portaup/down * * instead of pro_framecount which lead * * to memory trashing.... * * * * 08-Jan-2018 * * - source can be assembled * * case-sensitive now * * * ******************************************** * * * Supporting the following effects:- * * - CIA Timing! (BPM) * * - Running with 68000/10/20/30/40/60! * * - VBR anywhere and PC independant * * - Module Protection * * - Volume control with Fading Up/Down! * * - Four channel equaliser labels * * - Sample equaliser labels * * - Asmone and Devpac Compatible * * * * This version needs SYSTEM to be killed. * * Do not disable Master Interrupt in * * INTENA becoz the Replay runs under a * * Level6 Interrupt. Call Pro_init to in- * * stall the Interrupt Server. The music * * starts when the Pro_Enable flag is set * * to 1. To end the music call Pro_end. If * * your using VBL mode then call Pro_music * * every frame. * * * * Send bug reports to:- * * Michael Phipps * * 53 Grilse Close * * Edmonton * * London. N9 OUU * * United Kingdom * * * * E-mail: wizzball@dcandy.demon.co.uk * * * ******************************************** NO EQU 0 YES EQU 1 VBL EQU 0 CIA EQU 1 IFND DMA_DELAY DMA_DELAY EQU 2 ;(ECS=2) (AGA=4) ENDC IFND REPLAY_MODE REPLAY_MODE EQU CIA ;(VBL) or (CIA) ENDC IFND MUSIC_FADING MUSIC_FADING EQU NO ENDC MUSIC_PROTECT EQU NO IFND FOUR_CHANNELS FOUR_CHANNELS EQU NO ENDC IFND SAMPLE_CHANNELS SAMPLE_CHANNELS EQU YES ENDC IFND MUSIC_RASTER MUSIC_RASTER EQU NO ENDC * MODULE PROTECT ROUTINE ************************************************** songname equ 0 pro_init: lea 20+22(a0),a1 ; !! stingray point to 1st sample moveq #31-1,d7 ; !! max. # of samples moveq #0,d0 ; !! .calcsamplesize ; !! moveq #0,d1 ; !! move.w (a1),d1 ; !! get sample length add.l d1,d0 ; !! lea 30(a1),a1 ; !! next sample dbf d7,.calcsamplesize ; !! add.l d0,d0 ; !! d0 = samplesize in bytes ; !! move.l d0,d7 ; !! ; !! lea 952(a0),a1 ; !! get highest pattern moveq #128-1,d0 ; !! moveq #0,d1 ; !! moveq #0,d2 ; !! .getpat move.b (a1)+,d1 ; !! cmp.b d2,d1 ; !! ble.b .nohi ; !! move.b d1,d2 ; !! .nohi dbf d0,.getpat ; !! ; !! lsl.l #8,d2 ; !! lsl.l #2,d2 ; !! add.l d2,d7 ; !! add.l #1084+1024,d7 ; !! add samplesize and ; !! patternsize -> lea pro_modlen(pc),a1 ; !! d7 = modulesize move.l d7,(a1) ; !! IFNE MUSIC_PROTECT cmp.l #"M.K.",1080(a0) beq.s pro_init2 cmp.l #"FLT4",1080(a0) beq.s pro_init2 rts pro_init2: lea songname(a0),a1 lea 20(a1),a1 moveq #0,d0 moveq #0,d2 moveq #(20/4)-1,d1 pro_song: move.b d0,-20(a1,d2.w) addq.w #1,d2 move.b d0,-20(a1,d2.w) addq.w #1,d2 move.b d0,-20(a1,d2.w) addq.w #1,d2 move.b d0,-20(a1,d2.w) addq.w #1,d2 dbf d1,pro_song move.l d0,1080(a0) moveq #30,d1 lea 20(a0),a2 pro_nextsample: moveq #21,d2 move.l a2,a1 pro_sampleclear move.b d0,(a1)+ dbf d2,pro_sampleclear adda.l #30,a2 dbf d1,pro_nextsample move.b #1,951(a0) ENDC * INITIALISE MODULE INFORMATION ******************************************* IFEQ MUSIC_PROTECT cmp.l #"M.K.",1080(a0) beq.s pro_init2 cmp.l #"FLT4",1080(a0) beq.s pro_init2 rts pro_init2: ENDC lea pro_frame_count(pc),a4 move.l a0,pro_SongDataPtr-pro_frame_count(a4) move.l a0,a1 move.l a0,a5 ; !! stingray add.l pro_modlen(pc),a5 ; !! point to end of module lea 952(a1),a1 moveq #127,d0 moveq #0,d1 pro_loop: move.l d1,d2 subq.w #1,d0 pro_loop2: move.b (a1)+,d1 cmp.b d2,d1 bgt.s pro_loop dbra d0,pro_loop2 addq.l #1,d2 asl.l #8,d2 asl.l #2,d2 add.l #1084,d2 add.l a0,d2 move.l d2,a2 lea pro_samplestarts(pc),a1 lea pro_mulu(pc),a3 lea 42(a0),a0 moveq #0,d2 moveq #0,d3 moveq #31,d0 pro_loop3: move.w d2,d1 mulu #30,d1 move.w d1,(a3)+ addq.w #1,d2 cmp.l a5,a2 ; !! stingray bge.b .skip ; !! move.l d3,(a2) move.l a2,(a1)+ .skip move.w (a0),d1 ext.l d1 asl.l #1,d1 add.l d1,a2 lea 30(a0),a0 dbra d0,pro_loop3 lea pro_chan1temp(pc),a0 lea pro_chan2temp(pc),a1 lea pro_chan3temp(pc),a2 lea pro_chan4temp(pc),a3 moveq #0,d0 moveq #4,d1 pro_chanloop1: move.l d0,(a0)+ move.l d0,(a1)+ move.l d0,(a2)+ move.l d0,(a3)+ dbf d1,pro_chanloop1 moveq #1,d2 swap d2 move.l d2,(a0)+ moveq #2,d2 swap d2 move.l d2,(a1)+ moveq #4,d2 swap d2 move.l d2,(a2)+ moveq #8,d2 swap d2 move.l d2,(a3)+ moveq #4,d1 pro_chanloop2: move.l d0,(a0)+ move.l d0,(a1)+ move.l d0,(a2)+ move.l d0,(a3)+ dbf d1,pro_chanloop2 lea pro_arpTable(pc),a0 moveq #0,d0 moveq #1,d1 moveq #2,d2 moveq #11,d3 pro_loop4: move.b d0,(a0)+ move.b d1,(a0)+ move.b d2,(a0)+ dbf d3,pro_loop4 lea $dff000,a6 clr.w $a8(a6) clr.w $b8(a6) clr.w $c8(a6) clr.w $d8(a6) move.w #$f,$96(a6) clr.w pro_Enable-pro_frame_count(a4) clr.w pro_counter-pro_frame_count(a4) clr.w pro_SongPos-pro_frame_count(a4) move.b #6,pro_speed-pro_frame_count(a4) clr.w pro_PatternPos-pro_frame_count(a4) clr.w pro_DMACONtemp-pro_frame_count(a4) sf pro_SongEnd-pro_frame_count(a4) * INSTALL CIA-A OR B TIMERS *********************************************** move.l pro_vectorbase(pc),a0 lea pro_newirq1(pc),a1 move.w #$2000,$9a(a6) move.l $78(a0),pro_oldlevel6-pro_frame_count(a4) move.l a1,$78(a0) IFNE REPLAY_MODE movea.l 4.w,a6 cmp.b #60,$213(a6) beq.s .GoNTSC move.l #1773447,d0 ;global PAL bra.s .GoPal .GoNTSC move.l #1789773,d0 ;global NTSC .GoPal moveq #125,d1 ;Default to normal 50 Hz Timer. move.l d0,pro_TimerValue-pro_frame_count(a4) divu d1,d0 ENDC lea pro_CIAstore(pc),a2 lea $dff000,a6 lea $bfd000,a1 move.b #$7f,$d00(a1) or.b #2,$1001(a1) move.b $E00(a1),(a2)+ move.b $F00(a1),(a2)+ move.b $D00(a1),(a2)+ move.b #$00,$E00(a1) move.b #$00,$F00(a1) move.b #$A8,$400(a1) move.b #$01,$500(a1) IFNE REPLAY_MODE move.b d0,$600(a1) lsr.w #8,d0 move.b d0,$700(a1) ENDC IFNE REPLAY_MODE move.b #$83,$D00(a1) ENDC IFEQ REPLAY_MODE move.b #$81,$D00(a1) ENDC move.b #$19,$E00(a1) IFNE REPLAY_MODE move.b #$11,$F00(a1) move.w #$E000,$9a(a6) ENDC IFEQ REPLAY_MODE move.w #$A000,$9a(a6) ENDC rts * STOP REPLAY ************************************************************* pro_end lea $dff000,a6 lea $BFD000,a1 move.b #$7f,$d00(a1) lea pro_CIAstore(pc),a2 move.w #$2000,$9a(a6) movea.l pro_vectorbase(pc),a0 move.l pro_oldlevel6(pc),$78(a0) move.b (a2)+,$E00(a1) move.b (a2)+,$F00(a1) move.b (a2)+,d0 or.b #$80,d0 move.b d0,$d00(a1) pro_clear: lea $dff000,a6 clr.w $a8(a6) clr.w $b8(a6) clr.w $c8(a6) clr.w $d8(a6) move.w #$f,$96(a6) rts * MUSIC FADE MACROS ******************************************************* PRO_FADE: MACRO moveq #0,d0 move.b 19(a6),d0 mulu pro_fadecount(pc),d0 lsr.l #6,d0 move.w d0,8(a5) ENDM pro_fadecount: dc.w 64 ;volume control (max=64) (min=0) pro_fadedir: dc.w 0 ;set fade direction down = -1 / up = 1 * MUSIC REPLAY ROUTINE **************************************************** pro_music: IFNE REPLAY_MODE movem.l d0-d7/a0-a6,-(sp) btst #1,$BFDD00 beq pro_level6 move.b pro_Enable(pc),d0 tst.b d0 beq.w pro_level6 ENDC IFNE MUSIC_RASTER move.w #$f00,$dff180 ENDC IFNE MUSIC_FADING lea pro_fadecount(pc),a0 move.w pro_fadedir(pc),d0 add.w d0,(a0) cmp.w #64,(a0) bls.s pro_out bgt.s pro_peak clr.w (a0) lea pro_fadedir(pc),a0 ; !! stingray clr.w (a0) ; !! ;clr.w pro_fadedir bra.w pro_level6 pro_peak: move.w #64,(a0) lea pro_fadedir(pc),a0 ; !! stingray clr.w (a0) ; !! ; clr.w pro_fadedir pro_out: ENDC move.w #$fff,d5 ;mask. lea pro_frame_count(pc),a3 addq.b #1,pro_counter-pro_frame_count(a3) moveq #0,d0 move.b pro_counter(pc),d0 cmp.b pro_speed(pc),d0 blo.s pro_nonewnote clr.b pro_counter-pro_frame_count(a3) tst.b pro_PattDelTime2-pro_frame_count(a3) beq.s pro_getnewnote pea pro_dskip(pc) bra pro_nonewallchannels pro_nonewnote: pea pro_nonewposyet(pc) bra pro_nonewallchannels pro_getnewnote: move.l pro_SongDataPtr(pc),a0 lea 12(a0),a3 lea 952(a0),a2 ;pattpo lea 1084(a0),a0 ;patterndata moveq #0,d0 moveq #0,d1 move.b pro_SongPos(pc),d0 move.b (a2,d0.w),d1 lsl.l #8,d1 lsl.l #2,d1 add.w pro_PatternPos(pc),d1 lea pro_DMACONtemp(pc),a4 ; !! stingray clr.w (a4) ; !! ;clr.w pro_dmacontemp ; !! lea pro_playvoice(pc),a4 lea $DFF0A0,a5 lea pro_chan1temp(pc),a6 IFNE FOUR_CHANNELS move.w (a6),pro_check_chan1-pro_chan1temp(a6) ENDC jsr (a4) lea $DFF0B0,a5 lea pro_chan2temp(pc),a6 IFNE FOUR_CHANNELS move.w (a6),pro_check_chan2-pro_chan2temp(a6) ENDC jsr (a4) lea $DFF0C0,a5 lea pro_chan3temp(pc),a6 IFNE FOUR_CHANNELS move.w (a6),pro_check_chan3-pro_chan3temp(a6) ENDC jsr (a4) lea $DFF0D0,a5 lea pro_chan4temp(pc),a6 IFNE FOUR_CHANNELS move.w (a6),pro_check_chan4-pro_chan4temp(a6) ENDC jsr (a4) move.l pro_vectorbase(pc),a0 lea pro_newirq1(pc),a3 ; !! stingray move.l a3,$78(a0) ; !! ; move.l #pro_newirq1,$78(a0) ; !! move.b #$19,$BFDE00 *************************************************************************** * Update patterns and all sample positions every frame. pro_dskip: lea pro_frame_count(pc),a3 add.w #16,pro_PatternPos-pro_frame_count(a3) move.b pro_PattDelTime(pc),d0 beq.s pro_dskc move.b d0,pro_PattDelTime2-pro_frame_count(a3) clr.b pro_PattDelTime-pro_frame_count(a3) pro_dskc: tst.b pro_PattDelTime2-pro_frame_count(a3) beq.s pro_dska subq.b #1,pro_PattDelTime2-pro_frame_count(a3) beq.s pro_dska sub.w #16,pro_PatternPos-pro_frame_count(a3) pro_dska: tst.b pro_PBreakFlag-pro_frame_count(a3) beq.s pro_nnpysk SF pro_PBreakFlag-pro_frame_count(a3) moveq #0,d0 move.b pro_PBreakPos(pc),d0 clr.b pro_PBreakPos-pro_frame_count(a3) lsl.w #4,d0 move.w d0,pro_PatternPos-pro_frame_count(a3) pro_nnpysk: cmp.w #1024,pro_PatternPos-pro_frame_count(a3) blo.s pro_nonewposyet pro_nextposition: moveq #0,d0 move.b pro_PBreakPos(pc),d0 lsl.w #4,d0 move.w d0,pro_PatternPos-pro_frame_count(a3) clr.b pro_PBreakPos-pro_frame_count(a3) clr.b pro_PosJumpFlag-pro_frame_count(a3) addq.b #1,pro_SongPos-pro_frame_count(a3) and.b #$7f,pro_SongPos-pro_frame_count(a3) move.b pro_SongPos(pc),d1 move.l pro_SongDataPtr(pc),a0 cmp.b 950(a0),d1 blo.s pro_nonewposyet clr.b pro_SongPos-pro_frame_count(a3) st pro_SongEnd-pro_frame_count(a3) ; !! stingray pro_nonewposyet: tst.b pro_PosJumpFlag-pro_frame_count(a3) bne.s pro_nextposition IFNE MUSIC_RASTER move.w #$00f,$dff180 ENDC pro_level6: move.l pro_customLev6(pc),d0 ; !! stingray beq.b .nocust move.l d0,a0 jsr (a0) .nocust IFNE REPLAY_MODE movem.l (sp)+,d0-d7/a0-a6 move.w #$2000,$dff09c move.w #$2000,$dff09c ; !! stingray rte ENDC IFEQ REPLAY_MODE rts ENDC *************************************************************************** pro_newirq1: tst.b $BFDD00 move.b #$19,$BFDE00 ; or.w #$8000,pro_DMACONtemp ; move.w pro_DMACONtemp(pc),$dff096 movem.l a0/a1,-(a7) ; !! stingray lea pro_DMACONtemp(pc),a0 ; !! stingray or.w #$8000,(a0) ; !! move.w (a0),$dff096 ; !! move.l pro_vectorbase(pc),a0 ; !! lea pro_newirq2(pc),a1 ; !! move.l a1,$78(a0) ; !! movem.l (a7)+,a0/a1 ; !! ; move.l a0,-(sp) ; !! ; move.l pro_vectorbase(pc),a0 ; !! ; move.l #pro_newirq2,$78(a0) ; !! ; move.l (sp)+,a0 ; !! move.w #$2000,$dff09c move.w #$2000,$dff09c ; !! stingray rte pro_newirq2: tst.b $BFDD00 movem.l a4-a6,-(a7) ; !! stingray ; movem.l a5/a6,-(sp) ; !! lea $dff000,a5 lea pro_chan4temp(pc),a6 move.l 10(a6),$d0(a5) move.w 14(a6),$d4(a5) move.l 58(a6),$c0(a5) move.w 62(a6),$c4(a5) move.l 106(a6),$b0(a5) move.w 110(a6),$b4(a5) move.l 154(a6),$a0(a5) move.w 158(a6),$a4(a5) move.b #0,$BFDE00 move.l pro_vectorbase(pc),a5 IFNE REPLAY_MODE lea pro_music(pc),a4 ; !! stingray move.l a4,$78(a5) ; !! ; move.l #pro_music,$78(a5) ; !! ENDC IFEQ REPLAY_MODE move.l pro_oldlevel6(pc),$78(a5) ENDC movem.l (a7)+,a4-a6 ; !! stingray ; movem.l (sp)+,a5/a6 ; !! move.w #$2000,$dff09c move.w #$2000,$dff09c ; !! stingray rte * PRO-PLAY VOICE ********************************************************** pro_playvoice: tst.l (a6) bne.s pro_plvskip move.w 16(a6),6(a5) pro_plvskip: move.l (a0,d1.l),(a6) addq.l #4,d1 moveq #0,d2 move.b 2(a6),d2 and.b #$F0,d2 lsr.b #4,d2 IFNE SAMPLE_CHANNELS move.w d2,d0 and.w #$f,d0 * and.w #$1f,d0 ;use this instead if testing all 32 samples! add.w d0,d0 lea Pro_CheckSamples_Table(pc),a2 move.w (a2,d0.w),d0 jsr (a2,d0.w) ENDC moveq #0,d0 move.b (a6),d0 and.b #$F0,d0 or.b d0,d2 tst.b d2 beq.w pro_setregs lea pro_samplestarts(pc),a1 move.w d2,d4 subq.l #1,d2 add.l d2,d2 add.l d2,d2 add.w d4,d4 move.w d4,d3 lsl.w #4,d4 sub.w d3,d4 move.l (a1,d2.l),4(a6) ; !! stingray : n_start move.w (a3,d4.w),8(a6) ; !! : n_length move.w (a3,d4.w),40(a6) ; !! : n_reallength move.b 2(a3,d4.w),18(a6) ; !! : n_finetune move.b 3(a3,d4.w),19(a6) ; !! : n_volume move.w 4(a3,d4.w),d3 ext.l d3 beq.s pro_noloop move.l 4(a6),d2 add.w d3,d3 add.l d3,d2 move.l d2,10(a6) move.l d2,36(a6) move.w 4(a3,d4.w),d0 add.w 6(a3,d4.w),d0 move.w d0,8(a6) move.w 6(a3,d4.w),14(a6) IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC IFEQ MUSIC_FADING MOVEQ #0,D0 MOVE.B 19(A6),D0 move.w d0,8(a5) ENDC bra.w pro_setregs pro_mulu: ds.w 32 *************************************************************************** pro_noloop: move.l 4(a6),d2 add.l d3,d2 move.l d2,10(a6) move.l d2,36(a6) move.w 6(a3,d4.w),14(a6) ; save replen IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC IFEQ MUSIC_FADING MOVEQ #0,D0 MOVE.B 19(A6),D0 move.w d0,8(a5) ENDC pro_setregs: move.w (a6),d0 and.w d5,d0 beq pro_CheckMoreEFX ; if no note move.w 2(a6),d0 and.w #$0ff0,d0 cmp.w #$0e50,d0 beq.s pro_dosetfinetune move.b 2(a6),d0 and.b #$0f,d0 cmp.b #3,d0 ; toneportamento beq.s pro_chktoneporta cmp.b #5,d0 beq.s pro_chktoneporta cmp.b #9,d0 ; sample offset bne.s pro_setperiod bsr pro_CheckMoreEFX bra.s pro_setperiod pro_dosetfinetune: pea pro_setperiod(pc) bra pro_SetFineTune pro_chktoneporta: pea pro_CheckMoreEFX(pc) *************************************************************************** pro_settoneporta: move.w (a6),d2 and.w d5,d2 moveq #0,d0 move.b 18(a6),d0 mulu #37*2,d0 lea pro_PeriodTable(pc),a1 add.l d0,a1 moveq #0,d0 moveq #2,d3 move.w #37*2,d4 pro_stploop cmp.w (a1,d0.w),d2 bhs.s pro_stpfound add.w d3,d0 cmp.w d4,d0 blo.s pro_stploop moveq #35*2,d0 pro_stpfound move.b 18(a6),d2 and.b #8,d2 beq.s pro_stpgoss tst.w d0 beq.s pro_stpgoss subq.w #2,d0 pro_stpgoss move.w (a1,d0.w),d2 move.w d2,24(a6) move.w 16(a6),d0 clr.b 22(a6) cmp.w d0,d2 beq.s pro_cleartoneporta bge.s pro_return2 move.b #1,22(a6) rts pro_cleartoneporta clr.w 24(a6) rts pro_return2: rts *************************************************************************** pro_setperiod tst.b 18(a6) beq.s no_finetune move.w (a6),d2 and.w d5,d2 lea pro_PeriodTable(pc),a1 moveq #0,d0 moveq #2,d3 moveq #36,d7 pro_ftuloop cmp.w (a1,d0.w),d2 bhs.s pro_ftufound add.l d3,d0 dbra d7,pro_ftuloop pro_ftufound moveq #0,d2 move.b 18(a6),d2 mulu #36*2,d2 add.l d2,a1 move.w (a1,d0.w),16(a6) bra.s finetuneok no_finetune move.w (a6),d0 and.w d5,d0 move.w d0,$10(a6) finetuneok ;move.w 2(a6),d0 ;and.w #$0ff0,d0 ;cmp.w #$0ed0,d0 ; notedelay ;beq pro_checkmoreefx move.w 20(a6),d0 move.w pro_activeDMA(pc),d2 not.w d2 and.w d2,d0 move.w d0,$dff096 btst #2,30(a6) bne.s pro_vibnoc clr.b 27(a6) pro_vibnoc btst #6,30(a6) bne.s pro_trenoc clr.b 29(a6) pro_trenoc move.l 4(a6),(a5) ; set start move.w 8(a6),4(a5) ; set length move.w 16(a6),d0 move.w d0,6(a5) ; set period st n_trigger(a6) ; !! stingray, useful for scopes etc. move.w 20(a6),d0 move.l a0,-(a7) ; !! stingray lea pro_DMACONtemp(pc),a0 ; !! or.w d0,(a0) ; !! move.l (a7)+,a0 ; !! ; or.w d0,pro_dmacontemp bra pro_CheckMoreEFX *************************************************************************** * This part tests what samples are being played and sets the label * accordingly. If testing all 32 samples remember to create an extra * 16 pro_sample labels! IFNE SAMPLE_CHANNELS Pro_CheckSamples_Table: dc.w pro_check_sample0-Pro_CheckSamples_Table dc.w pro_check_sample1-Pro_CheckSamples_Table dc.w pro_check_sample2-Pro_CheckSamples_Table dc.w pro_check_sample3-Pro_CheckSamples_Table dc.w pro_check_sample4-Pro_CheckSamples_Table dc.w pro_check_sample5-Pro_CheckSamples_Table dc.w pro_check_sample6-Pro_CheckSamples_Table dc.w pro_check_sample7-Pro_CheckSamples_Table dc.w pro_check_sample8-Pro_CheckSamples_Table dc.w pro_check_sample9-Pro_CheckSamples_Table dc.w pro_check_sampleA-Pro_CheckSamples_Table dc.w pro_check_sampleB-Pro_CheckSamples_Table dc.w pro_check_sampleC-Pro_CheckSamples_Table dc.w pro_check_sampleD-Pro_CheckSamples_Table dc.w pro_check_sampleE-Pro_CheckSamples_Table dc.w pro_check_sampleF-Pro_CheckSamples_Table pro_check_sample0: lea pro_sample0_on(pc),a2 ; !! stingray st (a2) ; !! ;ST pro_sample0_on ; !! rts pro_check_sample1: lea pro_sample1_on(pc),a2 st (a2) ;ST pro_sample1_on rts pro_check_sample2: lea pro_sample2_on(pc),a2 st (a2) ;ST pro_sample2_on rts pro_check_sample3: lea pro_sample3_on(pc),a2 st (a2) ;ST pro_sample3_on rts pro_check_sample4: lea pro_sample4_on(pc),a2 st (a2) ;ST pro_sample4_on rts pro_check_sample5: lea pro_sample5_on(pc),a2 st (a2) ;ST pro_sample5_on rts pro_check_sample6: lea pro_sample6_on(pc),a2 st (a2) ;ST pro_sample6_on rts pro_check_sample7: lea pro_sample7_on(pc),a2 st (a2) ;ST pro_sample7_on rts pro_check_sample8: lea pro_sample8_on(pc),a2 st (a2) ;ST pro_sample8_on rts pro_check_sample9: lea pro_sample9_on(pc),a2 st (a2) ;ST pro_sample9_on rts pro_check_sampleA: lea pro_sampleA_on(pc),a2 st (a2) ;ST pro_sampleA_on rts pro_check_sampleB: lea pro_sampleB_on(pc),a2 st (a2) ;ST pro_sampleB_on rts pro_check_sampleC: lea pro_sampleC_on(pc),a2 st (a2) ;ST pro_sampleC_on rts pro_check_sampleD: lea pro_sampleD_on(pc),a2 st (a2) ;ST pro_sampleD_on rts pro_check_sampleE: lea pro_sampleE_on(pc),a2 st (a2) ;ST pro_sampleE_on rts pro_check_sampleF: lea pro_sampleF_on(pc),a2 st (a2) ;ST pro_sampleF_on rts ENDC *************************************************************************** pro_nonewallchannels: lea $dff0a0,a5 lea pro_chan1temp(pc),a6 bsr.s pro_checkEFX IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC adda.l #$10,a5 lea pro_chan2temp(pc),a6 bsr.s pro_checkEFX IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC adda.l #$10,a5 lea pro_chan3temp(pc),a6 bsr.s pro_checkEFX IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC adda.l #$10,a5 lea pro_chan4temp(pc),a6 bsr.s pro_checkEFX IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC rts *************************************************************************** pro_checkEFX move.b 2(a6),d0 lsr.b #4,d0 beq.s pro_PerNop1 bsr.w pro_UpdateFunk pro_PerNop1: move.w 2(a6),d0 and.w d5,d0 beq.s pro_PerNop2 moveq #0,d0 move.b 2(a6),d0 and.b #$0F,d0 add.w d0,d0 lea pro_CheckEffects_Table(pc),a2 move.w (a2,d0.w),d0 jmp (a2,d0.w) pro_PerNop2: move.w 16(a6),6(a5) rts pro_CheckEffects_Table: dc.w pro_arpeggio-pro_CheckEffects_Table ;0 dc.w pro_portaup-pro_CheckEffects_Table ;1 dc.w pro_portadown-pro_CheckEffects_Table ;2 dc.w pro_toneportamento-pro_CheckEffects_Table ;3 dc.w pro_vibrato-pro_CheckEffects_Table ;4 dc.w pro_TonePlusVolSlide-pro_CheckEffects_Table ;5 dc.w pro_VibratoPlusVolSlide-pro_CheckEffects_Table ;6 dc.w pro_Tremolo-pro_CheckEffects_Table ;7 dc.w pro_noeffect-pro_CheckEffects_Table ;8 dc.w pro_noeffect-pro_CheckEffects_Table ;9 dc.w pro_VolumeSlide-pro_CheckEffects_Table ;A dc.w pro_noeffect-pro_CheckEffects_Table ;B dc.w pro_noeffect-pro_CheckEffects_Table ;C dc.w pro_noeffect-pro_CheckEffects_Table ;D dc.w pro_E_Commands-pro_CheckEffects_Table ;E dc.w pro_noeffect-pro_CheckEffects_Table ;F pro_noeffect: rts pro_arpTable: ds.b (12*3) pro_arpeggio: moveq #0,d0 move.b pro_counter(pc),d0 move.b pro_arpTable(pc,d0.w),d0 beq.s pro_arpeggio2 cmp.w #2,d0 beq.s pro_arpeggio1 moveq #0,d0 move.b 3(a6),d0 lsr.b #4,d0 bra.s pro_arpeggio3 pro_arpeggio1: moveq #0,d0 move.b 3(a6),d0 and.b #15,d0 bra.s pro_arpeggio3 pro_arpeggio2: move.w 16(a6),d2 bra.s pro_arpeggio4 pro_arpeggio3: add.w d0,d0 moveq #0,d6 move.b 18(a6),d6 mulu #(36*2),d6 lea pro_PeriodTable(pc),a0 add.l d6,a0 moveq #0,d6 move.w 16(a6),d6 moveq #36,d3 pro_arploop: move.w (a0,d0.w),d2 cmp.w (a0),d6 bhs.s pro_arpeggio4 tst.w (a0)+ dbf d3,pro_arploop rts pro_arpeggio4: move.w d2,6(a5) rts pro_fineportaup: move.l a4,-(a7) ; !! stingray lea pro_frame_count(pc),a4 ; !! tst.b pro_counter-pro_frame_count(a4) ; !! ; tst.b pro_counter bne.s pro_fineportaupreturn move.b #$0f,pro_LowMask-pro_frame_count(a4) ; !! stingray ; move.b #$0f,pro_lowmask ; !! move.l (a7)+,a4 ; !! fiiiixxxxeeed!!! pro_portaup move.l a4,-(a7) ; !! stingray lea pro_frame_count(pc),a4 ; !! gooosh, this ; !! was MY bug... moveq #0,d0 move.b 3(a6),d0 and.b pro_LowMask(pc),d0 move.b #$ff,pro_LowMask-pro_frame_count(a4) ; !! stingray ; move.b #$ff,pro_lowmask ; !! sub.w d0,16(a6) move.w 16(a6),d0 and.w d5,d0 cmp.w #113,d0 bpl.s pro_portauskip and.w #$f000,16(a6) or.w #113,16(a6) pro_portauskip move.w 16(a6),d0 and.w d5,d0 move.w d0,6(a5) pro_fineportaupreturn: move.l (a7)+,a4 ; !! stingray rts pro_fineportadown: move.l a4,-(a7) ; !! stingray lea pro_frame_count(pc),a4 ; !! tst.b pro_counter-pro_frame_count(a4) ; !! ; tst.b pro_counter ; !! bne.s pro_fineportadownreturn move.b #$0f,pro_LowMask-pro_frame_count(a4) ; !! stingray ; move.b #$0f,pro_lowmask move.l (a7)+,a4 ; !! look above pro_portadown: move.l a4,-(a7) ; !! this one was lea pro_frame_count(pc),a4 ; !! a bitch to find!! moveq #0,d0 move.b 3(a6),d0 and.b pro_LowMask(pc),d0 move.b #$ff,pro_LowMask-pro_frame_count(a4) ; !! stingray ; move.b #$ff,pro_lowmask ; !! add.w d0,16(a6) move.w 16(a6),d0 and.w d5,d0 cmp.w #856,d0 bmi.s pro_portadskip and.w #$f000,16(a6) or.w #856,16(a6) pro_portadskip move.w 16(a6),d0 and.w d5,d0 move.w d0,6(a5) pro_fineportadownreturn: move.l (a7)+,a4 ; !! stingray rts pro_toneportamento: moveq #0,d0 move.b 3(a6),d0 beq.s pro_toneportnochange move.b d0,23(a6) clr.b 3(a6) pro_toneportnochange: tst.w 24(a6) beq.s pro_toneportamentoreturn moveq #0,d0 move.b 23(a6),d0 tst.b 22(a6) bne.s pro_toneportaup pro_toneportadown: add.w d0,16(a6) move.w 24(a6),d0 cmp.w 16(a6),d0 bgt.s pro_toneportasetper move.w 24(a6),16(a6) clr.w 24(a6) bra.s pro_toneportasetper pro_toneportamentoreturn: rts pro_toneportaup: sub.w d0,16(a6) move.w 24(a6),d0 cmp.w 16(a6),d0 blt.s pro_toneportasetper move.w 24(a6),16(a6) clr.w 24(a6) pro_toneportasetper: move.w 16(a6),d2 move.b 31(a6),d0 and.b #$0f,d0 beq.s pro_glissskip moveq #0,d0 move.b 18(a6),d0 mulu #(36*2),d0 lea pro_PeriodTable(pc),a0 add.l d0,a0 moveq #0,d0 move.w #2,d3 move.w #(36*2),d4 pro_glissloop: cmp.w (a0,d0.w),d2 bhs.s pro_glissfound add.w d3,d0 cmp.w d4,d0 blo.s pro_glissloop moveq #(35*2),d0 pro_glissfound: move.w (a0,d0.w),d2 pro_glissskip: move.w d2,6(a5) ;set period rts pro_TonePlusVolSlide: bsr.w pro_toneportnochange bra.s pro_VolumeSlide pro_VibratoPlusVolSlide: bsr.w pro_vibrato2 pro_VolumeSlide: moveq #0,d0 move.b 3(a6),d0 lsr.b #4,d0 tst.b d0 beq.s pro_VolSlideDown pro_volslideup: add.b d0,19(a6) cmp.b #64,19(a6) bmi.s pro_vsuskip move.b #64,19(a6) pro_vsuskip: IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC IFEQ MUSIC_FADING move.b 19(a6),d0 move.w d0,8(a5) ENDC rts pro_VolSlideDown: moveq #0,d0 move.b 3(a6),d0 and.b #$0f,d0 pro_volslidedown2 sub.b d0,19(a6) bpl.s pro_vsdskip clr.b 19(a6) pro_vsdskip: IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC IFEQ MUSIC_FADING move.b 19(a6),d0 move.w d0,8(a5) ENDC rts pro_vibrato: moveq #0,d0 move.b 3(a6),d0 beq.s pro_vibrato2 move.b 26(a6),d2 and.b #$0f,d0 beq.s pro_vibskip and.b #$f0,d2 or.b d0,d2 pro_vibskip: move.b 3(a6),d0 and.b #$f0,d0 beq.s pro_vibskip2 and.b #$0f,d2 or.b d0,d2 pro_vibskip2: move.b d2,26(a6) pro_vibrato2: move.b 27(a6),d0 lea pro_VibratoTable(pc),a4 lsr.w #2,d0 and.w #$001f,d0 moveq #0,d2 move.b 30(a6),d2 and.b #$03,d2 beq.s pro_vib_sine lsl.b #3,d0 cmp.b #1,d2 beq.s pro_vib_rampdown move.b #255,d2 bra.s pro_vib_set pro_vib_rampdown: tst.b 27(a6) bpl.s pro_vib_rampdown2 move.b #255,d2 sub.b d0,d2 bra.s pro_vib_set pro_vib_rampdown2: move.b d0,d2 bra.s pro_vib_set pro_vib_sine: move.b (a4,d0.w),d2 pro_vib_set: move.b 26(a6),d0 and.w #15,d0 mulu d0,d2 lsr.w #7,d2 move.w 16(a6),d0 tst.b 27(a6) bmi.s pro_vibratoneg add.w d2,d0 bra.s pro_vibrato3 pro_vibratoneg: sub.w d2,d0 pro_vibrato3: move.w d0,6(a5) move.b 26(a6),d0 lsr.w #2,d0 and.w #$003c,d0 add.b d0,27(a6) rts pro_Tremolo: moveq #0,d0 move.b 3(a6),d0 beq.s pro_tremolo2 move.b 28(a6),d2 and.b #$0f,d0 beq.s pro_treskip and.b #$f0,d2 or.b d0,d2 pro_treskip: moveq #0,d0 move.b 3(a6),d0 and.b #$f0,d0 beq.s pro_treskip2 and.b #$0f,d2 or.b d0,d2 pro_treskip2 move.b d2,28(a6) pro_tremolo2: move.b 29(a6),d0 lea pro_VibratoTable(pc),a4 lsr.w #2,d0 and.w #$001f,d0 moveq #0,d2 move.b 30(a6),d2 lsr.b #4,d2 and.b #$03,d2 beq.s pro_tre_sine lsl.b #3,d0 cmp.b #1,d2 beq.s pro_tre_rampdown move.b #255,d2 bra.s pro_tre_set pro_tre_rampdown: tst.b 29(a6) bpl.s pro_tre_rampdown2 move.b #255,d2 sub.b d0,d2 bra.s pro_tre_set pro_tre_rampdown2: move.b d0,d2 bra.s pro_tre_set pro_tre_sine: move.b (a4,d0.w),d2 pro_tre_set: move.b 28(a6),d0 and.w #15,d0 mulu d0,d2 lsr.w #6,d2 moveq #0,d0 move.b 19(a6),d0 tst.b 29(a6) bmi.s pro_tremoloneg add.w d2,d0 bra.s pro_tremolo3 pro_tremoloneg: sub.w d2,d0 pro_tremolo3: bpl.s pro_tremoloskip moveq #0,d0 pro_tremoloskip: cmp.w #64,d0 bls.s pro_TremoloOk move.w #64,d0 pro_TremoloOk: IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC IFEQ MUSIC_FADING move.w d0,8(a5) ENDC moveq #0,d0 move.b 28(a6),d0 lsr.w #2,d0 and.w #$003C,d0 add.b d0,29(a6) rts *************************************************************************** pro_CheckMoreEFX: move.b 31(a6),d0 lsr.b #4,d0 beq.s no_CheckFunk bsr.w pro_UpdateFunk no_CheckFunk: moveq #0,d0 move.b 2(a6),d0 and.b #$0F,d0 add.w d0,d0 lea pro_CheckMoreEFX_Table(pc),a2 move.w (a2,d0.w),d0 jmp (a2,d0.w) pro_CheckMoreEFX_Table: dc.w pro_PerNop-pro_CheckMoreEFX_Table ;0 dc.w pro_PerNop-pro_CheckMoreEFX_Table ;1 dc.w pro_PerNop-pro_CheckMoreEFX_Table ;2 dc.w pro_PerNop-pro_CheckMoreEFX_Table ;3 dc.w pro_PerNop-pro_CheckMoreEFX_Table ;4 dc.w pro_PerNop-pro_CheckMoreEFX_Table ;5 dc.w pro_PerNop-pro_CheckMoreEFX_Table ;6 dc.w pro_PerNop-pro_CheckMoreEFX_Table ;7 dc.w pro_PerNop-pro_CheckMoreEFX_Table ;8 dc.w pro_SampleOffset-pro_CheckMoreEFX_Table ;9 dc.w pro_PerNop-pro_CheckMoreEFX_Table ;A dc.w pro_PositionJump-pro_CheckMoreEFX_Table ;B dc.w pro_VolumeChange-pro_CheckMoreEFX_Table ;C dc.w pro_PatternBreak-pro_CheckMoreEFX_Table ;D dc.w pro_E_Commands-pro_CheckMoreEFX_Table ;E dc.w pro_SetSpeed-pro_CheckMoreEFX_Table ;F pro_PerNop: move.w 16(a6),6(a5) rts pro_SampleOffset: moveq #0,d0 move.b 3(a6),d0 beq.s pro_SoNoNew move.b d0,32(a6) pro_SoNoNew: move.b 32(a6),d0 lsl.w #7,d0 cmp.w 8(a6),d0 bge.s pro_softskip sub.w d0,8(a6) add.w d0,d0 add.l d0,4(a6) rts pro_softskip: move.w #$0001,8(a6) rts pro_PositionJump: moveq #0,d0 move.b 3(a6),d0 cmp.b pro_SongPos(pc),d0 bhi.b .noend move.l a2,-(a7) ; !! stingray lea pro_SongEnd(pc),a2 ; !! st (a2) ; !! move.l (a7)+,a2 .noend subq.b #1,d0 move.l a2,-(a7) ; !! stingray lea pro_SongPos(pc),a2 ; !! move.b d0,(a2) ; !! ; move.b d0,pro_SongPos ; !! lea pro_PBreakPos(pc),a2 ; !! stingray clr.b (a2) ; !! ; clr.b pro_PBreakPos ; !! lea pro_PosJumpFlag(pc),a2 ; !! stingray st (a2) ; !! ; ST pro_PosJumpFlag ; !! move.l (a7)+,a2 ; !! stingray rts pro_SetSpeed: moveq #0,d0 move.b 3(a6),d0 beq.w pro_clear IFNE REPLAY_MODE cmp.b #32,d0 bhs.s pro_SetTempo ENDC move.l a2,-(a7) ; !! stingray lea pro_counter(pc),a2 ; !! clr.b (a2) ; !! lea pro_speed(pc),a2 ; !! move.b d0,(a2) ; !! move.l (a7)+,a2 ; !! ; clr.b pro_counter ; move.b d0,pro_speed rts IFNE REPLAY_MODE pro_SetTempo: cmp.w #32,d0 bhs.s pro_setemsk moveq #32,d0 pro_setemsk: move.l a2,-(a7) ; !! stingray lea pro_RealTempo(pc),a2 ; !! move.w d0,(a2) ; !! move.l (a7)+,a2 ; !! ; move.w d0,pro_RealTempo move.l pro_TimerValue(pc),d2 divu d0,d2 move.b d2,$BFD600 ;CIA-Timer B Low value lsr.w #8,d2 move.b d2,$BFD700 ;CIA-Timer B High value rts ENDC pro_VolumeChange: moveq #0,d0 move.b 3(a6),d0 cmp.b #64,d0 bls.s pro_volumeok moveq #64,d0 pro_volumeok: move.b d0,19(a6) IFNE MUSIC_FADING PRO_FADE ;set volume. ENDC IFEQ MUSIC_FADING move.w d0,8(a5) ENDC rts pro_PatternBreak: moveq #0,d0 move.b 3(a6),d0 move.l d0,d2 lsr.b #4,d0 add.w d0,d0 move.w d0,d6 add.w d6,d6 add.w d6,d6 add.w d6,d0 and.b #$0F,d2 add.b d2,d0 cmp.b #63,d0 bhi.s pro_positionjump2 move.l a2,-(a7) ; !! stingray lea pro_PBreakPos(pc),a2 ; !! move.b d0,(a2) ; !! lea pro_PosJumpFlag(pc),a2 ; !! st (a2) ; !! move.l (a7)+,a2 ; !! ; move.b d0,pro_PBreakPos ; ST pro_PosJumpFlag rts pro_positionjump2: move.l a2,-(a7) ; !! stingray lea pro_PBreakPos(pc),a2 ; !! clr.b (a2) ; !! lea pro_PosJumpFlag(pc),a2 ; !! st (a2) ; !! move.l (a7)+,a2 ; !! ; clr.b pro_PBreakPos ; ST pro_PosJumpFlag rts *************************************************************************** pro_no_E_command: rts pro_E_Commands: moveq #0,d0 move.b 3(a6),d0 and.b #$F0,d0 lsr.b #4,d0 add.w d0,d0 lea pro_E_Commands_Table(pc),a2 move.w (a2,d0.w),d0 jmp (a2,d0.w) pro_E_Commands_Table: dc.w pro_FilterOnOff-pro_E_Commands_Table ;0 dc.w pro_fineportaup-pro_E_Commands_Table ;1 dc.w pro_fineportadown-pro_E_Commands_Table ;2 dc.w pro_SetGlissControl-pro_E_Commands_Table ;3 dc.w pro_SetVibratoControl-pro_E_Commands_Table ;4 dc.w pro_SetFineTune-pro_E_Commands_Table ;5 dc.w pro_JumpLoop-pro_E_Commands_Table ;6 dc.w pro_SetTremoloControl-pro_E_Commands_Table ;7 dc.w pro_no_E_command-pro_E_Commands_Table ;8 dc.w pro_RetrigNote-pro_E_Commands_Table ;9 dc.w pro_VolumeFineUp-pro_E_Commands_Table ;A dc.w pro_VolumeFineDown-pro_E_Commands_Table ;B dc.w pro_NoteCut-pro_E_Commands_Table ;C dc.w pro_NoteDelay-pro_E_Commands_Table ;D dc.w pro_PatternDelay-pro_E_Commands_Table ;E dc.w pro_FunkIt-pro_E_Commands_Table ;F pro_FunkIt: ; tst.b pro_counter ; bne.w pro_FunkitReturn moveq #0,d0 ; !! stingray move.b pro_counter(pc),d0 ; !! bne.w pro_funkitReturn ; !! moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 lsl.b #4,d0 and.b #$0F,31(a6) or.b d0,31(a6) tst.b d0 beq.s pro_funkitReturn *************************************************************************** pro_UpdateFunk: moveq #0,d0 move.b 31(a6),d0 lsr.b #4,d0 beq.s pro_funkend lea pro_FunkTable(pc),a1 move.b (a1,d0.w),d0 add.b d0,35(a6) btst #7,35(a6) beq.s pro_funkend clr.b 35(a6) move.l 10(a6),d0 moveq #0,d2 move.w 14(a6),d2 add.l d2,d0 add.l d2,d0 move.l 36(a6),a1 tst.b (a1)+ cmp.l d0,a1 blo.s pro_funkok move.l 10(a6),a1 pro_funkok: move.l a1,36(a6) moveq #-1,d0 sub.b (a1),d0 move.b d0,(a1) pro_funkend: pro_funkitReturn: rts *************************************************************************** pro_FilterOnOff: moveq #0,d0 move.b 3(a6),d0 and.b #1,d0 add.b d0,d0 and.b #$fd,$bfe001 or.b d0,$bfe001 rts pro_SetGlissControl: moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 and.b #$F0,31(a6) or.b d0,31(a6) rts pro_SetVibratoControl: moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 and.b #$F0,30(a6) or.b d0,30(a6) rts pro_SetFineTune: moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 move.b d0,18(a6) rts pro_JumpLoop: ; tst.b pro_counter ; bne.s pro_JumpLoop_return moveq #0,d0 ; !! move.b pro_counter(pc),d0 ; !! stingray bne.b pro_JumpLoop_return ; !! moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 beq.s pro_SetLoop tst.b 34(a6) beq.s pro_jumpcount subq.b #1,34(a6) beq.s pro_JumpLoop_return move.l a2,-(a7) ; !! stingray lea pro_PBreakPos(pc),a2 ; !! move.b 33(a6),(a2) ; !! lea pro_PBreakFlag(pc),a2 ; !! st (a2) ; !! move.l (a7)+,a2 ; !! ; move.b 33(a6),pro_PBreakPos ; ST pro_PBreakFlag pro_JumpLoop_return: rts pro_jumpcount: move.l a2,-(a7) ; !! stingray move.b d0,34(a6) lea pro_PBreakPos(pc),a2 ; !! move.b 33(a6),(a2) ; !! lea pro_PBreakFlag(pc),a2 ; !! st (a2) ; !! move.l (a7)+,a2 ; !! ; move.b 33(a6),pro_PBreakPos ; ST pro_PBreakFlag rts pro_SetLoop: moveq #0,d0 move.w pro_PatternPos(pc),d0 lsr.w #4,d0 move.b d0,33(a6) rts pro_SetTremoloControl: moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 lsl.b #4,d0 and.b #$0F,30(a6) or.b d0,30(a6) rts pro_RetrigNote: moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 beq.s pro_returnend moveq #0,d2 move.b pro_counter(pc),d2 bne.s pro_returnskip move.w (a6),d2 and.w d5,d2 bne.s pro_returnend moveq #0,d2 move.b pro_counter(pc),d2 pro_returnskip: divu d0,d2 swap d2 tst.w d2 bne.s pro_returnend pro_DoRetrig: move.w 20(a6),d0 move.w pro_activeDMA(pc),d6 not.w d6 and.w d6,d0 move.w d0,$dff096 move.l 4(a6),(a5) ;Set sampledata pointer move.w 8(a6),4(a5) ;Set length bsr.s Wait_DMA move.w 20(a6),d0 bset #15,d0 move.w d0,$dff096 bsr.s Wait_DMA move.l 10(a6),(a5) move.l 14(a6),4(a5) pro_returnend: rts *************************************************************************** * DMA delay using video beam position. Wait_DMA: movem.l d0-d1,-(sp) moveq #DMA_DELAY,d0 .wait1: move.b $dff006,d1 .wait2: cmp.b $dff006,d1 beq.s .wait2 dbf d0,.wait1 movem.l (sp)+,d0-d1 rts *************************************************************************** pro_return: rts pro_VolumeFineUp: moveq #0,d0 ; !! stingray move.b pro_counter(pc),d0 ; !! ; tst.b pro_counter bne.s pro_return moveq #0,d0 move.b 3(a6),d0 and.b #$F,d0 lea pro_volslideup(pc),a2 jmp (a2) pro_VolumeFineDown: moveq #0,d0 ; !! stingray move.b pro_counter(pc),d0 ; !! ; tst.b pro_counter bne.s pro_return moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 lea pro_volslidedown2(pc),a2 jmp (a2) pro_NoteDelay: moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 cmp.b pro_counter(pc),d0 bne.s pro_return move.w (a6),d0 beq.s pro_return lea pro_DoRetrig(pc),a2 jmp (a2) pro_NoteCut: moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 cmp.b pro_counter(pc),d0 bne.s pro_NoteCutReturn clr.b 19(a6) move.w #0,8(a5) pro_NoteCutReturn: rts pro_PatternDelay: moveq #0,d0 ; !! stingray move.b pro_counter(pc),d0 ; !! ; tst.b pro_counter bne.s pro_PatternDelayReturn move.l a2,-(a7) ; !! stingray lea pro_PattDelTime2(pc),a2 ; !! moveq #0,d0 move.b 3(a6),d0 and.b #$0F,d0 ; tst.b pro_PattDelTime2 tst.b (a2) ; !! bne.b .no ; !! ; bne.s pro_PatternDelayReturn addq.b #1,d0 lea pro_PattDelTime(pc),a2 ; !! move.b d0,(a2) ; move.b d0,pro_PattDelTime .no move.l (a7)+,a2 ; !! pro_PatternDelayReturn: rts *************************************************************************** pro_FunkTable: dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128 pro_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 pro_PeriodTable: ; 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 ; 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 pro_check_chan1 dc.w 0 pro_check_chan2 dc.w 0 pro_check_chan3 dc.w 0 pro_check_chan4 dc.w 0 pro_chan4temp: ds.l 12 pro_chan3temp: ds.l 12 pro_chan2temp: ds.l 12 pro_chan1temp: ds.l 12 pro_samplestarts: ds.l 32 pro_SongDataPtr dc.l 0 pro_RealTempo dc.w 125 pro_TimerValue dc.l 0 pro_oldlevel6: dc.l 0 pro_vectorbase: dc.l 0 pro_CIAstore ds.w 4 pro_frame_count dc.w 0 pro_sample0_on dc.w 0 pro_sample1_on dc.w 0 pro_sample2_on dc.w 0 pro_sample3_on dc.w 0 pro_sample4_on dc.w 0 pro_sample5_on dc.w 0 pro_sample6_on dc.w 0 pro_sample7_on dc.w 0 pro_sample8_on dc.w 0 pro_sample9_on dc.w 0 pro_sampleA_on dc.w 0 pro_sampleB_on dc.w 0 pro_sampleC_on dc.w 0 pro_sampleD_on dc.w 0 pro_sampleE_on dc.w 0 pro_sampleF_on dc.w 0 pro_DMACONtemp dc.w 0 pro_activeDMA dc.w 0 pro_PatternPos dc.w 0 pro_Enable dc.w 0 pro_counter dc.w 0 pro_SongPos dc.w 0 pro_speed dc.w 0 pro_PBreakPos dc.w 0 pro_PosJumpFlag dc.w 0 pro_PBreakFlag dc.w 0 pro_LowMask dc.w 0 pro_PattDelTime dc.w 0 pro_PattDelTime2 dc.w 0 pro_modlen dc.l 0 pro_customLev6 dc.l 0 ; !! stingray pointer to external ; !! level 6 interrupt routine pro_SongEnd dc.b 0 ; !! stingray, $ff: songend reached dc.b 0 ; padding * END OF PROTRACKER PRO *************************************************** * pro_data: incbin SYS:mod.any_protracker_tune!