********************************************
** FAST REPLAY-ROUTINE V1.0		  **
** USES IRQ - DO NOT DISABLE MASTER IRQ   **
** IN $DFF096                             **
**					  **
** ( NORMAL )				  **
**					  **
** 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
	addq.l	#8,d0
	addq.l	#4,d0
	moveq	#32-1,d1
	moveq	#30,d3
pt_lop4	move.l	d0,(a1)+
	add.l	d3,d0
	dbf	d1,pt_lop4
	lea	$3b8(a0),a1
	moveq	#127,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	4(a1,d2.l),a2
	lea	pt_samplestarts(pc),a1
	add.w	#$2a,a0
	moveq	#$1e,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
	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
	move.w	#$fff,d5
	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	952(a0),a2
	lea	1084(a0),a0
	sub.w	d0,d0
	sub.w	d1,d1
	move.b	pt_songpos(pc),d0
	move.b	(a2,d0.w),d1
	lsl.w	#8,d1
	add.w	d1,d1
	add.w	d1,d1
	add.w	pt_pattpos(pc),d1
	clr.w	pt_dmacontemp-(pt_samplestarts-4)(a1)
	lea	(a0,d1.l),a0
	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)
	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	n_cmd(a6),d2
	lsr.b	#4,d2
	move.b	(a6),d0
	and.b	d4,d0
	or.b	d0,d2
	beq	pt_setregs
	add.b	d2,d2
	add.b	d2,d2
	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
	move.w	(a6),d0
	and.w	d5,d0
	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
	and.w	d5,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
	move.w	n_cmd(a6),d0
	and.w	d5,d0
	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
	and.w	d5,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),d0
	and.w	d5,d0
	move.w	d0,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
	and.w	d5,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),d0
	and.w	d5,d0
	move.w	d0,6(a5)
	rts

pt_settoneporta
	move.w	(a6),d2
	and.w	d5,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	d5,d2
	bra.s	pt_vib_set
pt_vib_rampdown
	tst.b	n_vibratopos(a6)
	bpl.s	pt_vib_rampdown2
	move.b	d5,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	d5,d2
	bra.s	pt_tre_set
pt_tre_rampdown
	tst.b	n_vibratopos(a6)
	bpl.s	pt_tre_rampdown2
	move.b	d5,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-(pt_samplestarts-4)(a1)
	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
	and.w	d5,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
	even

