******************************************** ** FAST REPLAY-ROUTINE V1.0 ** ** USES IRQ - DO NOT DISABLE MASTER IRQ ** ** IN $DFF096 ** ** ** ** ( PROTECTION AND SPECIAL MODE ) ** ** ** ** REGISTERS USED : D0-D7/A0-A6 ** ** ** ** (C) 1992 DAVID COUNTER (MATRIX/LSD) ** ******************************************** pt_init lea pt_data,a0 lea pt_mulu(pc),a1 move.l a0,d0 moveq #31-1,d1 moveq #8,d3 move.l d0,(a1)+ pt_lop4 move.l d0,(a1)+ add.l d3,d0 dbf d1,pt_lop4 lea (31*8)+2(a0),a1 moveq #128-1,d0 moveq #0,d1 moveq #0,d2 pt_lop2 move.b (a1)+,d1 cmp.b d2,d1 ble.s pt_lop move.l d1,d2 pt_lop dbf d0,pt_lop2 addq.w #1,d2 asl.l #8,d2 add.l d2,d2 add.l d2,d2 lea (a1,d2.l),a2 lea pt_samplestarts(pc),a1 moveq #31-1,d0 pt_lop3 clr.l (a2) move.l a2,(a1)+ moveq #0,d1 move.w (a0),d1 add.l d1,d1 add.l d1,a2 add.l d3,a0 dbf d0,pt_lop3 addq.l #4,a2 lea pt_appendptr(pc),a0 move.l a2,(a0) lea pt_periodtable(pc),a0 move.l a0,d0 lea pt_ftumulu1(pc),a0 lea pt_ftumulu2(pc),a1 lea pt_ftumulu3(pc),a2 lea pt_ftumulu4(pc),a3 move.l #36*2,d1 moveq.l #16-1,d7 pt_lop5 move.l d0,(a0)+ move.l d0,(a1)+ move.l d0,(a2)+ move.l d0,(a3)+ add.l d1,d0 dbf d7,pt_lop5 lea pt_oldirq(pc),a0 move.l $78.w,(a0) lea pt_speed(pc),a1 move.b #6,(a1) or.b #2,$bfe001 moveq #0,d0 lea $dff000,a0 move.w d0,$a8(a0) move.w d0,$b8(a0) move.w d0,$c8(a0) move.w d0,$d8(a0) move.b d0,pt_songpos-pt_speed(a1) move.b d0,pt_counter-pt_speed(a1) move.w d0,pt_pattpos-pt_speed(a1) rts pt_end moveq #0,d0 lea $dff000,a0 move.w d0,$a8(a0) move.w d0,$b8(a0) move.w d0,$c8(a0) move.w d0,$d8(a0) move.w #$f,$dff096 rts pt_music moveq.l #$00f,d3 move.w #$ff0,d4 lea pt_samplestarts-4(pc),a1 addq.b #1,pt_counter-(pt_samplestarts-4)(a1) move.b pt_counter(pc),d0 cmp.b pt_speed(pc),d0 blt pt_nonewnote clr.b pt_counter-(pt_samplestarts-4)(a1) tst.b pt_pattdeltime2-(pt_samplestarts-4)(a1) beq.s pt_getnewnote bsr pt_nonewallchannels bra pt_dskip pt_getnewnote lea pt_data,a0 lea (31*8)+2(a0),a2 lea (31*8)+2+128(a0),a0 sub.w d0,d0 moveq #0,d1 moveq #0,d5 move.b pt_songpos(pc),d0 move.b (a2,d0.w),d1 lsl.w #8,d1 move.w d1,d5 add.w d1,d1 add.w d1,d1 add.w pt_pattpos(pc),d1 move.w pt_pattpos(pc),d0 lsr.w #4,d0 add.w d0,d0 add.w d0,d0 add.w d0,d5 clr.w pt_dmacontemp-(pt_samplestarts-4)(a1) move.l a2,-(a7) add.l d1,a0 move.l pt_appendptr(pc),a2 lea (a2,d5.l),a2 lea pt_playvoice(pc),a4 lea $dff0a0,a5 lea pt_chan1temp(pc),a6 jsr (a4) lea $10(a5),a5 lea $2c(a6),a6 jsr (a4) lea $10(a5),a5 lea $2c(a6),a6 jsr (a4) lea $10(a5),a5 lea $2c(a6),a6 jsr (a4) move.l (a7)+,a2 tst.b (pt_dmacontemp+1)-(pt_samplestarts-4)(a1) beq.s pt_dskip or.w #$8000,pt_dmacontemp-(pt_samplestarts-4)(a1) move.b #$7f,$bfdd00 move.w #$2000,$dff09c move.w #$a000,$dff09a lea pt_irq1(pc),a0 move.l a0,$78.w sub.w d0,d0 move.b d0,$bfde00 move.b #$a8,$bfd400 move.b d0,$bfd500 move.b #$11,$bfde00 move.b #$81,$bfdd00 pt_dskip add.w #16,pt_pattpos-(pt_samplestarts-4)(a1) move.b pt_pattdeltime(pc),d0 beq.s pt_dskc move.b d0,pt_pattdeltime2-(pt_samplestarts-4)(a1) clr.b pt_pattdeltime-(pt_samplestarts-4)(a1) pt_dskc tst.b pt_pattdeltime2-(pt_samplestarts-4)(a1) beq.s pt_dska subq.b #1,pt_pattdeltime2-(pt_samplestarts-4)(a1) beq.s pt_dska sub.w #16,pt_pattpos-(pt_samplestarts-4)(a1) pt_dska tst.b pt_pbreakflag-(pt_samplestarts-4)(a1) beq.s pt_nnpysk sf.b pt_pbreakflag-(pt_samplestarts-4)(a1) sub.w d0,d0 move.b pt_pbreakpos(pc),d0 clr.b pt_pbreakpos-(pt_samplestarts-4)(a1) lsl.w #4,d0 move.w d0,pt_pattpos-(pt_samplestarts-4)(a1) pt_nnpysk cmp.w #1024,pt_pattpos-(pt_samplestarts-4)(a1) blt.s pt_nonewposyet pt_nextposition sub.w d0,d0 move.b pt_pbreakpos(pc),d0 lsl.w #4,d0 move.w d0,pt_pattpos-(pt_samplestarts-4)(a1) clr.b pt_pbreakpos-(pt_samplestarts-4)(a1) clr.b pt_posjumpflag-(pt_samplestarts-4)(a1) addq.b #1,pt_songpos-(pt_samplestarts-4)(a1) and.b #$7f,pt_songpos-(pt_samplestarts-4)(a1) move.b pt_songpos(pc),d1 cmp.b -2(a2),d1 blt.s pt_nonewposyet clr.b pt_songpos-(pt_samplestarts-4)(a1) pt_nonewposyet tst.b pt_posjumpflag-(pt_samplestarts-4)(a1) bne.s pt_nextposition rts pt_nonewnote bsr.s pt_nonewallchannels bra.s pt_nonewposyet pt_nonewallchannels lea pt_checkefx(pc),a4 lea $dff0a0,a5 lea pt_chan1temp(pc),a6 jsr (a4) lea $10(a5),a5 lea $2c(a6),a6 jsr (a4) lea $10(a5),a5 lea $2c(a6),a6 jsr (a4) lea $10(a5),a5 lea $2c(a6),a6 jmp (a4) pt_irq1 tst.b $bfdd00 move.w pt_dmacontemp(pc),$dff096 lea pt_irq2(pc),a0 move.l a0,$78.w move.w #$2000,$dff09c rte pt_irq2 tst.b $bfdd00 move.l pt_chan1temp+$a(pc),$dff0a0 move.w pt_chan1temp+$e(pc),$dff0a4 move.l pt_chan2temp+$a(pc),$dff0b0 move.w pt_chan2temp+$e(pc),$dff0b4 move.l pt_chan3temp+$a(pc),$dff0c0 move.w pt_chan3temp+$e(pc),$dff0c4 move.l pt_chan4temp+$a(pc),$dff0d0 move.w pt_chan4temp+$e(pc),$dff0d4 move.b #0,$bfde00 move.b #$7f,$bfdd00 move.l pt_oldirq(pc),$78.w move.w #$2000,$dff09c move.w #$2000,$dff09a rte pt_playvoice move.l (a0)+,(a6) move.b (a2)+,d2 beq pt_setregs ext.w d2 move.l pt_mulu(pc,d2.w),a3 move.l (a1,d2.w),d6 move.w (a3)+,n_length(a6) move.w (a3)+,n_finetune(a6) move.w (a3)+,d2 beq pt_noloop move.l d6,n_start(a6) move.w d2,d0 add.w d2,d2 ext.l d2 add.l d2,d6 move.l d6,n_loopstart(a6) move.l d6,n_wavestart(a6) move.w (a3),d7 add.w d7,d0 move.w d0,n_length(a6) move.w d7,n_replen(a6) move.b n_volume(a6),9(a5) bra pt_setregs pt_mulu ds.l 32 even pt_noloop move.l d6,n_start(a6) move.l d6,n_loopstart(a6) move.l d6,n_wavestart(a6) move.w (a3),n_replen(a6) move.b n_volume(a6),9(a5) pt_setregs tst.w (a6) beq pt_checkmoreefx move.w 2(a6),d2 and.w d4,d2 move.w d2,d6 beq.s pt_setperiod cmp.w #$0e50,d2 beq.s pt_dosetfinetune lsr.w #8,d2 cmp.b #3,d2 beq.s pt_chktoneporta cmp.b #5,d2 beq.s pt_chktoneporta cmp.b #9,d2 bne.s pt_setperiod bsr pt_checkmoreefx bra.s pt_setperiod pt_dosetfinetune bsr pt_setfinetune bra.s pt_setperiod pt_chktoneporta bsr pt_settoneporta bra pt_checkmoreefx pt_setperiod move.w (a6),d2 tst.b n_finetune(a6) beq.s pt_ftufound2 move.l a1,-(sp) lea pt_periodtable(pc),a1 sub.w d0,d0 moveq #36,d7 pt_ftuloop cmp.w (a1,d0.w),d2 bge.s pt_ftufound addq.w #2,d0 dbf d7,pt_ftuloop pt_ftufound sub.w d2,d2 move.b n_finetune(a6),d2 add.b d2,d2 add.b d2,d2 move.l pt_ftumulu1(pc,d2.w),a1 move.w (a1,d0.w),n_period(a6) move.l (sp)+,a1 bra.s pt_ftufound3 pt_ftufound2 move.w d2,n_period(a6) pt_ftufound3 cmp.w #$0ed0,d6 beq pt_checkmoreefx move.w n_dmabit(a6),$dff096 move.b n_wavecontrol(a6),d0 btst #2,d0 bne.s pt_vibnoc clr.b n_vibratopos(a6) pt_vibnoc btst #6,d0 bne.s pt_trenoc clr.b n_tremolopos(a6) pt_trenoc move.l n_start(a6),(a5) move.w n_length(a6),4(a5) move.w n_period(a6),6(a5) move.w n_dmabit(a6),d0 or.w d0,pt_dmacontemp-(pt_samplestarts-4)(a1) bra pt_checkmoreefx pt_ftumulu1 ds.l 16 even pt_checkefx tst.b n_glissfunk(a6) beq.s pt_chkfxnofnk bsr pt_updatefunk pt_chkfxnofnk tst.w n_cmd(a6) beq.s pt_pernop move.b n_cmd(a6),d0 and.w d3,d0 add.w d0,d0 move.w pt_jmptable1(pc,d0),d0 jmp pt_jmptable1(pc,d0) pt_jmptable1 dc.w pt_arpeggio-pt_jmptable1 ;0 dc.w pt_portaup-pt_jmptable1 ;1 dc.w pt_portadown-pt_jmptable1 ;2 dc.w pt_toneportamento-pt_jmptable1 ;3 dc.w pt_vibrato-pt_jmptable1 ;4 dc.w pt_toneplusvolslide-pt_jmptable1 ;5 dc.w pt_vibratoplusvolslide-pt_jmptable1 ;6 dc.w pt_tremolo-pt_jmptable1 ;7 dc.w pt_return2-pt_jmptable1 ;*8 dc.w pt_return2-pt_jmptable1 ;*9 dc.w pt_volumeslide-pt_jmptable1 ;a dc.w pt_return2-pt_jmptable1 ;*b dc.w pt_return2-pt_jmptable1 ;*c dc.w pt_return2-pt_jmptable1 ;*d dc.w pt_e_commands-pt_jmptable1 ;e dc.w setback-pt_jmptable1 ;f setback move.w n_period(a6),6(a5) pt_return2 rts pt_pernop move.w n_period(a6),6(a5) rts pt_arplist dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2 dc.b 0,1,2,0,1,2,0,1,2,0,1 even pt_arpeggio sub.w d0,d0 move.b pt_counter(pc),d0 move.b pt_arplist(pc,d0.w),d0 beq.s pt_arpeggio2 cmp.b #2,d0 beq.s pt_arpeggio1 move.b n_cmdlo(a6),d0 lsr.b #4,d0 bra.s pt_arpeggio3 pt_arpeggio1 move.b n_cmdlo(a6),d0 and.b d3,d0 bra.s pt_arpeggio3 pt_arpeggio2 move.w n_period(a6),d2 bra.s pt_arpeggio4 pt_arpeggio3 lea pt_periodtable(pc),a0 add.w d0,d0 sub.w d1,d1 move.b n_finetune(a6),d1 beq.s pt_arploop31 add.b d1,d1 add.b d1,d1 move.l pt_ftumulu2(pc,d1.w),a0 sub.w d1,d1 pt_arploop31 move.w n_period(a6),d1 moveq #36,d7 pt_arploop move.w (a0,d0.w),d2 cmp.w (a0),d1 bge.s pt_arpeggio4 addq.l #2,a0 dbf d7,pt_arploop rts pt_arpeggio4 move.w d2,6(a5) rts pt_ftumulu2 ds.l 16 even pt_fineportaup tst.b pt_counter-(pt_samplestarts-4)(a1) bne pt_return2 move.b d3,pt_lowmask-(pt_samplestarts-4)(a1) pt_portaup sub.w d0,d0 move.b n_cmdlo(a6),d0 and.b pt_lowmask(pc),d0 st.b pt_lowmask-(pt_samplestarts-4)(a1) sub.w d0,n_period(a6) move.w n_period(a6),d0 cmp.w #113,d0 bpl.s pt_portauskip and.w #$f000,n_period(a6) or.w #113,n_period(a6) pt_portauskip move.w n_period(a6),6(a5) rts pt_fineportadown tst.b pt_counter-(pt_samplestarts-4)(a1) bne pt_return2 move.b d3,pt_lowmask-(pt_samplestarts-4)(a1) pt_portadown sub.w d0,d0 move.b n_cmdlo(a6),d0 and.b pt_lowmask(pc),d0 st.b pt_lowmask-(pt_samplestarts-4)(a1) add.w d0,n_period(a6) move.w n_period(a6),d0 cmp.w #856,d0 bmi.s pt_portadskip and.w #$f000,n_period(a6) or.w #856,n_period(a6) pt_portadskip move.w n_period(a6),6(a5) rts pt_settoneporta move.w (a6),d2 sub.w d0,d0 move.b n_finetune(a6),d0 beq.s pt_stpgoss2 move.l a0,-(sp) lea pt_periodtable(pc),a0 add.b d0,d0 add.b d0,d0 move.l pt_ftumulu3(pc,d0.w),a0 sub.w d0,d0 pt_stploop cmp.w (a0,d0.w),d2 bge.s pt_stpfound addq.w #2,d0 cmp.w #36*2,d0 blt.s pt_stploop moveq #35*2,d0 pt_stpfound move.b n_finetune(a6),d2 and.b #8,d2 beq.s pt_stpgoss tst.w d0 beq.s pt_stpgoss subq.w #2,d0 pt_stpgoss move.w (a0,d0.w),d2 move.l (sp)+,a0 pt_stpgoss2 move.w d2,n_wantedperiod(a6) move.w n_period(a6),d0 clr.b n_toneportdirec(a6) cmp.w d0,d2 beq.s pt_cleartoneporta bge pt_return2 move.b #1,n_toneportdirec(a6) rts pt_cleartoneporta clr.w n_wantedperiod(a6) rts pt_ftumulu3 ds.l 16 even pt_toneportamento move.b n_cmdlo(a6),d0 beq.s pt_toneportnochange move.b d0,n_toneportspeed(a6) clr.b n_cmdlo(a6) pt_toneportnochange tst.w n_wantedperiod(a6) beq pt_return2 sub.w d0,d0 move.b n_toneportspeed(a6),d0 tst.b n_toneportdirec(a6) bne.s pt_toneportaup pt_toneportadown add.w d0,n_period(a6) move.w n_wantedperiod(a6),d0 cmp.w n_period(a6),d0 bgt.s pt_toneportasetper move.w n_wantedperiod(a6),n_period(a6) clr.w n_wantedperiod(a6) bra.s pt_toneportasetper pt_toneportaup sub.w d0,n_period(a6) move.w n_wantedperiod(a6),d0 cmp.w n_period(a6),d0 blt.s pt_toneportasetper move.w n_wantedperiod(a6),n_period(a6) clr.w n_wantedperiod(a6) pt_toneportasetper move.w n_period(a6),d2 move.b n_glissfunk(a6),d0 and.b d3,d0 beq.s pt_glissskip sub.w d0,d0 lea pt_periodtable(pc),a0 move.b n_finetune(a6),d0 beq.s pt_glissskip add.b d0,d0 add.b d0,d0 move.l pt_ftumulu4(pc,d0.w),a0 sub.w d0,d0 pt_glissloop cmp.w (a0,d0.w),d2 bge.s pt_glissfound addq.w #2,d0 cmp.w #36*2,d0 blt.s pt_glissloop moveq #35*2,d0 pt_glissfound move.w (a0,d0.w),d2 pt_glissskip move.w d2,6(a5) rts pt_ftumulu4 ds.l 16 even pt_vibrato move.b n_cmdlo(a6),d0 beq.s pt_vibrato2 move.b n_vibratocmd(a6),d2 and.b d3,d0 beq.s pt_vibskip and.b d4,d2 or.b d0,d2 pt_vibskip move.b n_cmdlo(a6),d0 and.b d4,d0 beq.s pt_vibskip2 and.b d3,d2 or.b d0,d2 pt_vibskip2 move.b d2,n_vibratocmd(a6) pt_vibrato2 move.b n_vibratopos(a6),d0 lsr.w #2,d0 and.w #$001f,d0 sub.w d2,d2 move.b n_wavecontrol(a6),d2 and.b #$03,d2 beq.s pt_vib_sine lsl.b #3,d0 cmp.b #1,d2 beq.s pt_vib_rampdown move.b #$ff,d2 bra.s pt_vib_set pt_vib_rampdown tst.b n_vibratopos(a6) bpl.s pt_vib_rampdown2 move.b #$ff,d2 sub.b d0,d2 bra.s pt_vib_set pt_vib_rampdown2 move.b d0,d2 bra.s pt_vib_set pt_vib_sine move.b pt_vibratotable(pc,d0.w),d2 pt_vib_set move.b n_vibratocmd(a6),d0 and.w d3,d0 mulu d0,d2 lsr.w #7,d2 move.w n_period(a6),d0 tst.b n_vibratopos(a6) bmi.s pt_vibratoneg add.w d2,d0 bra.s pt_vibrato3 pt_vibratoneg sub.w d2,d0 pt_vibrato3 move.w d0,6(a5) move.b n_vibratocmd(a6),d0 lsr.w #2,d0 and.w #$003c,d0 add.b d0,n_vibratopos(a6) rts pt_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 even pt_toneplusvolslide bsr pt_toneportnochange bra pt_volumeslide pt_vibratoplusvolslide bsr pt_vibrato2 bra pt_volumeslide pt_tremolo move.b n_cmdlo(a6),d0 beq.s pt_tremolo2 move.b n_tremolocmd(a6),d2 and.b d3,d0 beq.s pt_treskip and.b d4,d2 or.b d0,d2 pt_treskip move.b n_cmdlo(a6),d0 and.b d4,d0 beq.s pt_treskip2 and.b d3,d2 or.b d0,d2 pt_treskip2 move.b d2,n_tremolocmd(a6) pt_tremolo2 move.b n_tremolopos(a6),d0 lsr.w #2,d0 and.w #$001f,d0 sub.w d2,d2 move.b n_wavecontrol(a6),d2 lsr.b #4,d2 and.b #$03,d2 beq.s pt_tre_sine lsl.b #3,d0 cmp.b #1,d2 beq.s pt_tre_rampdown move.b #$ff,d2 bra.s pt_tre_set pt_tre_rampdown tst.b n_vibratopos(a6) bpl.s pt_tre_rampdown2 move.b #$ff,d2 sub.b d0,d2 bra.s pt_tre_set pt_tre_rampdown2 move.b d0,d2 bra.s pt_tre_set pt_tre_sine move.b pt_tremelotable(pc,d0.w),d2 pt_tre_set move.b n_tremolocmd(a6),d0 and.w d3,d0 mulu d0,d2 lsr.w #6,d2 sub.w d0,d0 move.b n_volume(a6),d0 tst.b n_tremolopos(a6) bmi.s pt_tremoloneg add.w d2,d0 bra.s pt_tremolo3 pt_tremoloneg sub.w d2,d0 pt_tremolo3 bpl.s pt_tremoloskip sub.w d0,d0 pt_tremoloskip cmp.w #$40,d0 bls.s pt_tremolook moveq #$40,d0 pt_tremolook move.b d0,9(a5) move.b n_tremolocmd(a6),d0 lsr.w #2,d0 and.w #$003c,d0 add.b d0,n_tremolopos(a6) rts pt_tremelotable 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 even pt_sampleoffset moveq.l #0,d0 move.b n_cmdlo(a6),d0 beq.s pt_sononew move.b d0,n_sampleoffset(a6) pt_sononew move.b n_sampleoffset(a6),d0 lsl.w #7,d0 cmp.w n_length(a6),d0 bge.s pt_sofskip sub.w d0,n_length(a6) add.w d0,d0 add.l d0,n_start(a6) rts pt_sofskip move.w #1,n_length(a6) rts pt_volumeslide sub.w d0,d0 move.b n_cmdlo(a6),d0 lsr.b #4,d0 beq.s pt_volslidedown pt_volslideup add.b d0,n_volume(a6) cmp.b #$40,n_volume(a6) bmi.s pt_vsuskip move.b #$40,n_volume(a6) pt_vsuskip move.b n_volume(a6),9(a5) rts pt_volslidedown sub.w d0,d0 move.b n_cmdlo(a6),d0 and.b d3,d0 pt_volslidedown2 sub.b d0,n_volume(a6) bpl.s pt_vsdskip clr.b n_volume(a6) pt_vsdskip move.b n_volume(a6),9(a5) rts pt_positionjump move.b n_cmdlo(a6),d0 subq.b #1,d0 move.b d0,pt_songpos-(pt_samplestarts-4)(a1) pt_pj2 clr.b pt_pbreakpos-(pt_samplestarts-4)(a1) st.b pt_posjumpflag-(pt_samplestarts-4)(a1) rts pt_volumechange sub.w d0,d0 move.b n_cmdlo(a6),d0 cmp.b #$40,d0 ble.s pt_volumeok moveq #$40,d0 pt_volumeok move.b d0,n_volume(a6) move.b d0,9(a5) rts pt_patternbreak sub.w d0,d0 move.b n_cmdlo(a6),d0 move.l d0,d2 lsr.b #4,d0 mulu.w #10,d0 and.b d3,d2 add.b d2,d0 cmp.b #63,d0 bgt.s pt_pj2 move.b d0,pt_pbreakpos-(pt_samplestarts-4)(a1) st.b pt_posjumpflag-(pt_samplestarts-4)(a1) rts pt_setspeed move.b 3(a6),d0 beq pt_return2 clr.b pt_counter move.b d0,pt_speed-(pt_samplestarts-4)(a1) rts pt_checkmoreefx tst.b n_glissfunk(a6) beq.s pt_chkmfxnofnk bsr pt_updatefunk pt_chkmfxnofnk move.b 2(a6),d0 and.w d3,d0 add.w d0,d0 move.w pt_jmptable2(pc,d0),d0 jmp pt_jmptable2(pc,d0) pt_jmptable2 dc.w pt_checkmoreefxx-pt_jmptable2 ;*0 dc.w pt_checkmoreefxx-pt_jmptable2 ;*1 dc.w pt_checkmoreefxx-pt_jmptable2 ;*2 dc.w pt_checkmoreefxx-pt_jmptable2 ;*3 dc.w pt_checkmoreefxx-pt_jmptable2 ;*4 dc.w pt_checkmoreefxx-pt_jmptable2 ;*5 dc.w pt_checkmoreefxx-pt_jmptable2 ;*6 dc.w pt_checkmoreefxx-pt_jmptable2 ;*7 dc.w pt_checkmoreefxx-pt_jmptable2 ;*8 dc.w pt_sampleoffset-pt_jmptable2 ;9 dc.w pt_checkmoreefxx-pt_jmptable2 ;*a dc.w pt_positionjump-pt_jmptable2 ;b dc.w pt_volumechange-pt_jmptable2 ;c dc.w pt_patternbreak-pt_jmptable2 ;d dc.w pt_e_commands-pt_jmptable2 ;e dc.w pt_setspeed-pt_jmptable2 ;f pt_checkmoreefxx rts pt_e_commands move.b n_cmdlo(a6),d0 lsr.b #4,d0 and.w d3,d0 add.w d0,d0 move.w pt_jmptable3(pc,d0),d0 jmp pt_jmptable3(pc,d0) pt_jmptable3 dc.w pt_filteronoff-pt_jmptable3 ;0 dc.w pt_fineportaup-pt_jmptable3 ;1 dc.w pt_fineportadown-pt_jmptable3 ;2 dc.w pt_setglisscontrol-pt_jmptable3 ;3 dc.w pt_setvibratocontrol-pt_jmptable3 ;4 dc.w pt_setfinetune-pt_jmptable3 ;5 dc.w pt_jumploop-pt_jmptable3 ;6 dc.w pt_settremolocontrol-pt_jmptable3 ;7 dc.w pt_e_comex-pt_jmptable3 ;*8 dc.w pt_retrignote-pt_jmptable3 ;9 dc.w pt_volumefineup-pt_jmptable3 ;a dc.w pt_volumefinedown-pt_jmptable3 ;b dc.w pt_notecut-pt_jmptable3 ;c dc.w pt_notedelay-pt_jmptable3 ;d dc.w pt_patterndelay-pt_jmptable3 ;e dc.w pt_funkit-pt_jmptable3 ;f pt_e_comex rts pt_filteronoff move.b n_cmdlo(a6),d0 and.b #1,d0 add.b d0,d0 and.b #$fd,$bfe001 or.b d0,$bfe001 rts pt_setglisscontrol move.b n_cmdlo(a6),d0 and.b d3,d0 and.b d4,n_glissfunk(a6) or.b d0,n_glissfunk(a6) rts pt_setvibratocontrol move.b n_cmdlo(a6),d0 and.b d3,d0 and.b d4,n_wavecontrol(a6) or.b d0,n_wavecontrol(a6) rts pt_setfinetune move.b n_cmdlo(a6),d0 and.b d3,d0 move.b d0,n_finetune(a6) rts pt_jumploop tst.b pt_counter-(pt_samplestarts-4)(a1) bne pt_return2 move.b n_cmdlo(a6),d0 and.b d3,d0 beq.s pt_setloop tst.b n_loopcount(a6) beq.s pt_jumpcnt subq.b #1,n_loopcount(a6) beq pt_return2 pt_jmploop move.b n_pattpos(a6),pt_pbreakpos-(pt_samplestarts-4)(a1) st.b pt_pbreakflag-(pt_samplestarts-4)(a1) rts pt_jumpcnt move.b d0,n_loopcount(a6) bra.s pt_jmploop pt_setloop move.w pt_pattpos(pc),d0 lsr.w #4,d0 move.b d0,n_pattpos(a6) rts pt_settremolocontrol move.b n_cmdlo(a6),d0 and.b d3,d0 lsl.b #4,d0 and.b d3,n_wavecontrol(a6) or.b d0,n_wavecontrol(a6) rts pt_retrignote moveq #0,d0 move.b n_cmdlo(a6),d0 and.b d3,d0 beq.s pt_rtnend moveq #0,d2 move.b pt_counter(pc),d2 bne.s pt_rtnskp move.w (a6),d2 bne.s pt_rtnend moveq #0,d2 move.b pt_counter(pc),d2 pt_rtnskp divu d0,d2 swap d2 tst.w d2 bne.s pt_rtnend pt_doretrig move.w n_dmabit(a6),$dff096 move.l n_start(a6),(a5) move.w n_length(a6),4(a5) move.b $dff006,d0 addq.b #3,d0 pt_rtrlp1 cmp.b $dff006,d0 bne.s pt_rtrlp1 move.w n_dmabit(a6),d0 or.w #$8000,d0 move.w d0,$dff096 move.b $dff006,d0 addq.b #3,d0 pt_rtrlp2 cmp.b $dff006,d0 bne.s pt_rtrlp2 move.l n_loopstart(a6),(a5) move.l n_replen(a6),4(a5) pt_rtnend rts pt_volumefineup tst.b pt_counter-(pt_samplestarts-4)(a1) bne pt_return2 sub.w d0,d0 move.b n_cmdlo(a6),d0 and.b d3,d0 bra pt_volslideup pt_volumefinedown tst.b pt_counter-(pt_samplestarts-4)(a1) bne pt_return2 sub.w d0,d0 move.b n_cmdlo(a6),d0 and.b d3,d0 bra pt_volslidedown2 pt_notecut sub.w d0,d0 move.b n_cmdlo(a6),d0 and.b d3,d0 cmp.b pt_counter(pc),d0 bne pt_return2 clr.b n_volume(a6) move.b #0,9(a5) rts pt_notedelay sub.w d0,d0 move.b n_cmdlo(a6),d0 and.b d3,d0 cmp.b pt_counter(pc),d0 bne pt_return2 move.w (a6),d0 beq pt_return2 bra pt_doretrig pt_patterndelay tst.b pt_counter-(pt_samplestarts-4)(a1) bne pt_return2 sub.w d0,d0 move.b n_cmdlo(a6),d0 and.b d3,d0 tst.b pt_pattdeltime2-(pt_samplestarts-4)(a1) bne pt_return2 addq.b #1,d0 move.b d0,pt_pattdeltime-(pt_samplestarts-4)(a1) rts pt_funkit tst.b pt_counter-(pt_samplestarts-4)(a1) bne pt_return2 move.b n_cmdlo(a6),d0 and.b d3,d0 lsl.b #4,d0 and.b d3,n_glissfunk(a6) or.b d0,n_glissfunk(a6) tst.b d0 beq pt_return2 pt_updatefunk sub.w d0,d0 move.b n_glissfunk(a6),d0 lsr.b #4,d0 beq.s pt_funkend2 move.l a0,-(sp) lea pt_funktable(pc),a0 move.b (a0,d0.w),d0 add.b d0,n_funkoffset(a6) btst #7,n_funkoffset(a6) beq.s pt_funkend clr.b n_funkoffset(a6) move.l n_loopstart(a6),d0 moveq #0,d2 move.w n_replen(a6),d2 add.l d2,d0 add.l d2,d0 move.l n_wavestart(a6),a0 addq.l #1,a0 cmp.l d0,a0 blo.s pt_funkok move.l n_loopstart(a6),a0 pt_funkok move.l a0,n_wavestart(a6) moveq #-1,d0 sub.b (a0),d0 move.b d0,(a0) pt_funkend move.l (sp)+,a0 pt_funkend2 rts n_cmd = 2 n_cmdlo = 3 n_start = 4 n_length = 8 n_loopstart = 10 n_replen = 14 n_period = 16 n_finetune = 18 n_volume = 19 n_dmabit = 20 n_toneportdirec = 22 n_toneportspeed = 23 n_wantedperiod = 24 n_vibratocmd = 26 n_vibratopos = 27 n_tremolocmd = 28 n_tremolopos = 29 n_wavecontrol = 30 n_glissfunk = 31 n_sampleoffset = 32 n_pattpos = 33 n_loopcount = 34 n_funkoffset = 35 n_wavestart = 36 n_reallength = 40 pt_funktable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128 pt_periodtable 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 pt_ftune1 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 pt_ftune2 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 pt_ftune3 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 pt_ftune4 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 pt_ftune5 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 pt_ftune6 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 pt_ftune7 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 pt_ftune_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 pt_ftune_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 pt_ftune_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 pt_ftune_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 pt_ftune_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 pt_ftune_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 pt_ftune_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 pt_ftune_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 pt_chan1temp dc.l 0,0,0,0,0,$00010000,0,0,0,0,0 pt_chan2temp dc.l 0,0,0,0,0,$00020000,0,0,0,0,0 pt_chan3temp dc.l 0,0,0,0,0,$00040000,0,0,0,0,0 pt_chan4temp dc.l 0,0,0,0,0,$00080000,0,0,0,0,0 pt_samplestarts dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 pt_speed dc.b 6 pt_counter dc.b 0 pt_songpos dc.b 0 pt_pbreakpos dc.b 0 pt_posjumpflag dc.b 0 pt_pbreakflag dc.b 0 pt_lowmask dc.b 0 pt_pattdeltime dc.b 0 pt_pattdeltime2 dc.b 0 pt_pattpos dc.w 0 pt_dmacontemp dc.w 0 pt_oldirq dc.l 0 pt_appendptr dc.l 0 even