		
		;This playroutine is made for
		; SoundTracker 2.3
		;          BUT
		; it works quite as well with 
		; Noicetracker 2.0
		;So don`t worry be happy!!!!!!!!
		
		section 1,code_c

		bsr	pxo_init
pxo_next:	bsr	pxo_blanking
		move.w	#0,$dff180
		bsr	pxo_music
		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.w	pxo_startchan
pxo_notvoice0:	bsr.w	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.w	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.w	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.w	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.w	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:	dcb.l	31*4,0
pxo_voicesave:		dcb.l	2,0
pxo_patterndta:	dcb.l	2+1,0             ; <- HERE (WHERE IT`S "2" NOW) YOU WRITE HOW LONG YOUR MODULE IS.
pxo_musicdata:		incbin "st-00:modules/mod.spell" ; <- HERE YOU TYPE THE NAME OF YOUR MODULE.

