* Soundtracker FastReplay v1.0 * * For D.O.C Sound Tracker v2.3 * * Written by Midway of PxO/ACME Factories in 1989 * * Contact us: Blish, Toredalsv. 58, 144 00 Ronninge, Sweden * length=0 bsr pxo_init pxo_next: bsr pxo_blanking move.w #0,$dff180 bsr pxo_music move.w #$555,$dff180 btst #6,$bfe001 bne.s pxo_next bclr #1,$bfe001 move.w #$000f,$dff096 rts pxo_blanking: cmp.b #$ff,$dff006 bne.s pxo_blanking pxo_blanking2: cmp.b #$ff,$dff006 beq.s pxo_blanking2 rts pxo_volumedown: and.b #$f,d0 sub.b d0,3(a5) bne.s pxo_volok2 clr.b 3(a5) pxo_volok2: move.b 3(a5),9(a6) rts pxo_volumeslde: move.b 11(a5),d1 move.b d1,d0 lsr.b #4,d1 beq.s pxo_volumedown add.b d1,3(a5) cmp.b #64,3(a5) ble.s pxo_volok1 move.b #64,3(a5) pxo_volok1: move.b 3(a5),9(a6) rts pxo_arpeggio: move.b pxo_arpcount(pc),d0 cmp.b #4,d0 beq.s pxo_arpeggio1 cmp.b #3,d0 beq.s pxo_arpeggio2 cmp.b #2,d0 beq.s pxo_arpeggio3 cmp.b #1,d0 beq.s pxo_arpeggio1 tst.b d0 beq.s pxo_arpeggio2 rts pxo_arpeggio1: move.w 12(a5),6(a6) bra.s pxo_arpend pxo_arpeggio2: move.w 14(a5),6(a6) bra.s pxo_arpend pxo_arpeggio3: move.w (a5),6(a6) pxo_arpend: sub.b #1,pxo_arpcount bpl.s pxo_noreset move.b #4,pxo_arpcount pxo_noreset: rts pxo_iseffect: cmp.b #$a,4(a5) beq.s pxo_volumeslde cmp.b #1,4(a5) beq.s pxo_portup cmp.b #2,4(a5) beq.s pxo_portdown cmp.b #$10,4(a5) beq.s pxo_arpeggio rts pxo_portup: move.w 10(a5),d0 sub.w d0,(a5) cmp.w #$71,(a5) bpl.s pxo_allright1 move.w #$71,(a5) pxo_allright1: move.w (a5),6(a6) rts pxo_portdown: move.w 10(a5),d0 add.w d0,(a5) cmp.w #$538,(a5) blt.s pxo_allright2 move.w #$538,(a5) pxo_allright2: move.w (a5),6(a6) rts pxo_doeffects: tst.b 4(a5) bne.s pxo_iseffect rts pxo_music: move.w pxo_channels(pc),$dff096 clr.b pxo_channels+1 moveq #16,d6 pxo_speed1: cmp.b #5,pxo_counter bne.s pxo_norepeat lea pxo_channel1+4(pc),a5 lea $dff0a0,a6 moveq #2,d7 pxo_setnext: move.l (a5)+,(a6)+ move.w (a5),(a6) add.l #12,a5 add.l #12,a6 dbra d7,pxo_setnext move.l (a5)+,(a6)+ move.w (a5),(a6) pxo_norepeat: subq.b #1,pxo_counter beq.s pxo_nextline lea pxo_channel1-$10(pc),a5 lea $dff090,a6 moveq #16,d6 moveq #3,d7 pxo_dothenext: add.l d6,a5 add.l d6,a6 bsr.s pxo_doeffects dbra d7,pxo_dothenext pxo_nonewpat: rts pxo_nextline: bsr.s pxo_checkvoice pxo_speed2: move.b #6,pxo_counter add.l #16,pxo_patterncnt subq.b #1,pxo_patternpos bne.s pxo_nonewpat move.b #64,pxo_patternpos addq.l #4,pxo_patoffset move.l pxo_patoffset(pc),a0 move.l (a0),pxo_patterncnt bne.s pxo_nonewpat pxo_resetsong: move.l #pxo_patterndta,pxo_patoffset move.l pxo_patoffset(pc),a0 move.l (a0),pxo_patterncnt rts pxo_checkvoice: move.l pxo_patterncnt(pc),a0 lea pxo_sampleinfo(pc),a1 lea pxo_voicesave-2(pc),a3 lea $dff0a0,a6 lea pxo_channel1(pc),a5 bsr.s pxo_getaddr bmi.s pxo_notvoice0 moveq #1,d1 bsr.L pxo_startchan pxo_notvoice0: bsr.L pxo_checkfxts addq.l #4,a0 add.l d6,a6 add.l d6,a5 bsr.s pxo_getaddr bmi.s pxo_notvoice1 moveq #2,d1 bsr.s pxo_startchan pxo_notvoice1: bsr.L pxo_checkfxts addq.l #4,a0 add.l d6,a6 add.l d6,a5 bsr.s pxo_getaddr bmi.s pxo_notvoice2 moveq #4,d1 bsr.s pxo_startchan pxo_notvoice2: bsr.L pxo_checkfxts addq.l #4,a0 add.l d6,a6 add.l d6,a5 bsr.s pxo_getaddr bmi.s pxo_notvoice3 moveq #8,d1 bsr.s pxo_startchan pxo_notvoice3: bsr.L pxo_checkfxts rts pxo_getaddr: addq.l #2,a3 tst.w (a0) beq.s pxo_nosample moveq #0,d5 move.w 2(a0),d0 and.w #$f000,d0 beq.s pxo_oldsample sub.w #$1000,d0 lsr.w #8,d0 move.w (a0),d1 and.w #$f000,d1 lsr.w #4,d1 or.w d1,d0 move.w d0,(a3) rts pxo_nosample: move.w 2(a0),d4 and.w #$f000,d4 tst.w d4 beq.s pxo_no lsr.w #8,d4 sub.w #$10,d4 move.w d4,(a3) moveq #0,d5 pxo_no: move.b #-1,d0 rts pxo_oldsample: moveq #1,d5 move.w (a3),d0 rts pxo_startchan: move.w d1,$dff096 move.l (a1,d0.w),(a6) move.w 4(a1,d0.w),4(a6) move.w (a0),d2 and.w #$fff,d2 move.w d2,6(a6) move.w d2,(a5) move.l 12(a1,d0.w),4(a5) move.w 8(a1,d0.w),8(a5) or.b d1,pxo_channels+1 tst.b d5 bne.s pxo_novolchnge move.w 6(a1,d0.w),8(a6) move.w 6(a1,d0.w),2(a5) rts pxo_novolchnge: move.b 3(a5),d1 move.w d1,8(a6) rts pxo_checkfxts: move.w 2(a0),d0 move.b d0,d1 and.w #$fff,d0 bne.s pxo_effect clr.b 4(a5) rts pxo_setarp: move.b #$10,4(a5) move.b d1,11(a5) moveq #0,d0 move.b 11(a5),d0 lsr.b #4,d0 bsr.s pxo_getvalue move.w -2(a2,d0.l),12(a5) moveq #0,d0 move.b 11(a5),d0 and.b #$f,d0 pxo_getvalue: add.w d0,d0 moveq #0,d1 move.w (a5),d1 lea pxo_arptable(pc),a2 pxo_search: cmp.w (a2)+,d1 bne.s pxo_search move.w -2(a2,d0.l),14(a5) rts pxo_changespd: move.b d1,pxo_speed2+3 subq.b #1,d1 move.b d1,pxo_speed1+3 rts pxo_setvolslde: move.b d1,11(a5) move.b d0,4(a5) rts pxo_effect: lsr.w #8,d0 beq.s pxo_setarp cmp.b #$1,d0 beq.s pxo_port cmp.b #$2,d0 beq.s pxo_port cmp.b #$a,d0 beq.L pxo_setvolslde cmp.b #$b,d0 beq.s pxo_posjump cmp.b #$c,d0 beq.s pxo_setvolume cmp.b #$d,d0 beq.s pxo_patternbrk cmp.b #$e,d0 beq.s pxo_chgefilter cmp.b #$f,d0 beq.s pxo_changespd rts pxo_port: move.b d1,11(a5) move.b d0,4(a5) rts pxo_posjump: move.b #1,pxo_patternpos ext.w d1 ext.l d1 beq.s pxo_pattern0 subq.b #1,d1 pxo_pattern0: lsl.w #2,d1 move.l #pxo_patterndta,pxo_patoffset add.l d1,pxo_patoffset rts pxo_setvolume: move.b d1,3(a5) move.b d1,9(a6) rts pxo_patternbrk: move.b #1,pxo_patternpos rts pxo_chgefilter: tst.b d1 bne.s pxo_filteron bclr #1,$bfe001 rts pxo_filteron: bset #1,$bfe001 rts pxo_init: lea pxo_musicdata+$3b8,a0 moveq #0,d7 move.b -2(a0),d7 moveq #0,d1 pxo_highvalue: move.l d1,d2 pxo_nextpatchk: move.b (a0)+,d1 cmp.b d2,d1 bgt.s pxo_highvalue dbra d7,pxo_nextpatchk addq.b #2,d2 lea pxo_musicdata,a0 lea pxo_sampleinfo,a1 mulu #$400,d2 add.l #$38,d2 add.l a0,d2 moveq #31,d7 pxo_nextinstr: move.l d2,(a1)+ moveq #0,d1 move.w 42(a0),d1 move.w d1,(a1)+ move.w 44(a0),(a1)+ move.w 48(a0),(a1)+ clr.w (a1)+ move.l d2,(a1) move.w 46(a0),d5 ext.l d5 add.l d5,(a1)+ asl.l #1,d1 add.l d1,d2 add.l #$1e,a0 dbra d7,pxo_nextinstr lea pxo_sampleinfo,a0 move.l #$1e0,d0 pxo_clear: move.l (a0,d0.w),a1 clr.l (a1) sub.l #16,d0 bne.s pxo_clear lea pxo_musicdata+$3b8,a0 lea pxo_patterndta,a1 move.b -2(a0),d7 ext.w d7 pxo_getpat: moveq #0,d0 move.b (a0)+,d0 mulu #$400,d0 add.l #pxo_musicdata+$43c,d0 move.l d0,(a1)+ dbra d7,pxo_getpat clr.l -4(a1) move.l pxo_patoffset,a0 move.l (a0),pxo_patterncnt bset #1,$bfe001 rts pxo_arptable: dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c dc.w $023a,$021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d dc.w $0168,$0153,$0140,$012e,$011d,$010d,$00fe,$00f0 dc.w $00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097 dc.w $008f,$0087,$007f,$0078,$0071,$0000,$0000,$0000 pxo_channel1: dc.l 0,0,0,0 pxo_channel2: dc.l 0,0,0,0 pxo_channel3: dc.l 0,0,0,0 pxo_channel4: dc.l 0,0,0,0 pxo_patterncnt: dc.l 0 pxo_patoffset: dc.l pxo_patterndta pxo_channels: dc.w $8000 pxo_patternpos: dc.b 64 pxo_counter: dc.b 2 pxo_arpcount: dc.b 4,0 pxo_sampleinfo: blk.l 31*4,0 pxo_voicesave: blk.l 2,0 pxo_patterndta: blk.l length+1,0 pxo_musicdata: blk.b 0  .