*******************************************************************************
* ProPacker RasTerPlayer (Interrupt/CIAA FrIeNDLY Version!)
* ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
*	This Version of "ProPacker" DOES NOT USE ANY interrupts like LEVEL 6`s
* etc., & DOES NOT use any CIAA waiting and is STILL VERY FAST! The CIAA/IRQ 
* version can cause some *MAJOR* headaches and weird crashes! This is much MORe
* Stable and less prone to crashes, its all 100% PC-Relative! yEA!!!!
*
* ProPacker VBL version by : 2-Cool of LSD! (Based on CIAA/IRQ Version)
*******************************************************************************

********************** ProPacker init routine ***********************
* a0.l <= Module

pp_Init		lea	$dff000,a6
		lea	pp_SongLength+2(pc),a4
		move.l	a0,(pp_ModulePtr)-(pp_SongLength+2)(a4)
		move	pm_SongLength(a0),(a4)
		move	pm_SongPos(a0),d1
		lea	pm_PattPoses(a0),a1
		move.l	(a1,d1.w),d0
		lea	(a0,d0.l),a1
		move.l	a1,pm_PlayAdr(a0)
		bset	#1,$bfe001
		rts

********************** ProPacker end routine ************************

pp_End		bclr	#1,$bfe001
		move	#$f,$dff096		;turn sample dma off
		rts

********************* ProPacker replay routine **********************
* a0.l <= Module			       Used regs: d0-d7/a1-a5
* a6.l <= CustomBase

pp_Music:	lea	$dff000,a6			;a6=custombase
		move.l	pp_ModulePtr(pc),a0		;a0=ptr to module
		subq.b	#1,pm_Counter(a0)
		bhi.b	pp_NoNotes

		move.l	pm_PlayAdr(a0),a2
		lea	pp_Chn1Struct-44(pc),a1
		move	#$8000,pp_DmaconTemp-(pp_Chn1Struct-44)(a1)

		lea	$a0-$10(a6),a5
		bsr.w	pp_PlayVoice
		bsr.w	pp_PlayVoice
		bsr.w	pp_PlayVoice
		bsr.w	pp_PlayVoice

		move.l	a2,pm_PlayAdr(a0)
		
		subq	#1,pm_PattCnt(a0)
		bgt.s	pp_Return
		move	#64,pm_PattCnt(a0)

		lea	pp_Chn1Struct+pc_PackCnt(pc),a1
		moveq	#0,d0
		move.w	d0,(a1)
		move.w	d0,44*1(a1)
		move.w	d0,44*2(a1)
		move.w	d0,44*3(a1)

		addq	#4,pm_SongPos(a0)
pp_SongLength	cmp	#0,pm_SongPos(a0)
		blo.s	pp_NotEOS
		move.w	d0,pm_SongPos(a0)
pp_NotEOS	lea	pm_PattPoses(a0),a1
		add	pm_SongPos(a0),a1
		move.l	(a1),d0
		lea	(a0,d0.l),a1
		move.l	a1,pm_PlayAdr(a0)

pp_Return	move.b	pm_Speed(a0),pm_Counter(a0)
		rts

pp_NoNotes	lea	pp_Chn1Struct(pc),a1		Effects
		lea	$a0(a6),a5
		moveq	#4-1,d7
pp_CmdLoop2	move.b	pc_Command+2(a1),d0
		and	#$f,d0
		add	d0,d0
		move	pp_Every(pc,d0.w),d0
		moveq	#0,d1
		move.b	pc_Command+3(a1),d1
		jsr	pp_Every(pc,d0.w)
		lea	pc_SizeOff(a1),a1
		lea	16(a5),a5
		dbf	d7,pp_CmdLoop2
		bra.b	pp_regirq

*********************************************************************

pp_Every	dc.w	pp_Arpeggio-pp_Every
		dc.w	pp_PortUp-pp_Every
		dc.w	pp_PortDown-pp_Every
		dc.w	pp_TonePort-pp_Every
		dc.w	pp_Vibrato-pp_Every
		dc.w	pp_PortSlide-pp_Every
		dc.w	pp_VibSlide-pp_Every
		dc.w	pp_Tremolo-pp_Every
		dc.w	pp_NotImp-pp_Every
		dc.w	pp_NotImp-pp_Every
		dc.w	pp_VolSlide-pp_Every
		dc.w	pp_NotImp-pp_Every
		dc.w	pp_NotImp-pp_Every
		dc.w	pp_NotImp-pp_Every
		dc.w	pp_ECmds1-pp_Every
		dc.w	pp_NotImp-pp_Every

pp_RegIrq:

*;		moveq	#3-1,d0
*;pp_waitdma2	move.b	$6(a6),d1
*;pp_waitdma3	cmp.b	$6(a6),d1
*;		dbeq	d0,pp_waitdma2		;do a few *LAME* rasters waits
*;		beq.b	pp_waitdma3		;for samples to finish playing!

		move.w	pp_dmacontemp(pc),d0
		or.w	#$8000,d0
		move.w	d0,$096(a6)
		move.l	pp_Chn1Struct+pc_LoopStart(pc),$0a0(a6)
		move.l	pp_Chn2Struct+pc_LoopStart(pc),$0b0(a6)
		move.l	pp_Chn3Struct+pc_LoopStart(pc),$0c0(a6)
		move.l	pp_Chn4Struct+pc_LoopStart(pc),$0d0(a6)
		move	pp_Chn1Struct+pc_RepLen(pc),$0a4(a6)
		move	pp_Chn2Struct+pc_RepLen(pc),$0b4(a6)
		move	pp_Chn3Struct+pc_RepLen(pc),$0c4(a6)
		move	pp_Chn4Struct+pc_RepLen(pc),$0d4(a6)
		rts
		
**************************** PlayVoice ******************************
* a0.l <= Module			       Used regs: d0-d6/a0-a4
* a1.l <= Channel struct (AutoAdded)
* a2.l <= Play data	 (AutoAdded)
* a5.l <= Sound regs	 (AutoAdded)
* a6.l <= CustomBase

pp_MulList	dc.w	00*ps_SizeOff,01*ps_SizeOff,02*ps_SizeOff,03*ps_SizeOff
		dc.w	04*ps_SizeOff,05*ps_SizeOff,06*ps_SizeOff,07*ps_SizeOff
		dc.w	08*ps_SizeOff,09*ps_SizeOff,10*ps_SizeOff,11*ps_SizeOff
		dc.w	12*ps_SizeOff,13*ps_SizeOff,14*ps_SizeOff,15*ps_SizeOff
		dc.w	16*ps_SizeOff,17*ps_SizeOff,18*ps_SizeOff,19*ps_SizeOff
		dc.w	20*ps_SizeOff,21*ps_SizeOff,22*ps_SizeOff,23*ps_SizeOff
		dc.w	24*ps_SizeOff,25*ps_SizeOff,26*ps_SizeOff,27*ps_SizeOff
		dc.w	28*ps_SizeOff,29*ps_SizeOff,30*ps_SizeOff,31*ps_SizeOff

pp_PlayVoice	lea	$10(a5),a5		; next chanptr
		lea	44(a1),a1		; next chantemp ptr
		addq	#1,pc_PackCnt(a1)
		blt.s	pp_NoNew
		move.l	(a2)+,pc_Command(a1)
		tst	(a2)
		bge.s	pp_NoNew
		move	(a2)+,pc_PackCnt(a1)
pp_NoNew	move.b	pc_Command+0(a1),d0
		beq.b	pp_NoSample
		ext	d0
		add	d0,d0
		move	pp_MulList(pc,d0.w),d0
		lea	pm_SamData-ps_SizeOff(a0,d0.w),a3
		move.l	ps_SamOffset(a3),d1
		lea	(a0,d1.l),a4
		move.l	a4,pc_Start(a1)
		move	ps_Length(a3),pc_Length(a1)
		move	ps_FnTOffset(a3),pc_FnTOffset(a1)
		move.b	ps_Volume(a3),pc_Volume(a1)
		move	ps_Restart(a3),d0
		beq.s	pp_NoLoop
		add	d0,a4
		add	d0,a4
		add	ps_RepLen(a3),d0
		move	d0,pc_Length(a1)
pp_NoLoop	move.l	a4,pc_LoopStart(a1)
		move	ps_RepLen(a3),pc_RepLen(a1)
		move.b	pc_Volume(a1),9(a5)

pp_NoSample	move.b	pc_Command+1(a1),d2
		beq.s	pp_NoNote

		ext	d2
		add	pc_FnTOffset(a1),d2

		move.b	pc_Command+2(a1),d0
		and.b	#$f,d0
		move	pp_PeriodTable-2(pc,d2.w),d2
		subq.b	#3,d0
		beq.w	pp_SetPort
		subq.b	#2,d0
		beq.w	pp_SetPort
		move	d2,pc_Period(a1)
		subq.b	#4,d0
		bne.s	pp_NoSamOffset
		bsr.w	pp_SamOffset
pp_NoSamOffset	move	pc_Command+2(a1),d0
		and	#$0ff0,d0
		cmp	#$0ed0,d0
		beq.s	pp_GoHome
		bsr.w	pp_SaveDmaTemp
		
		move.l	pc_Start(a1),(a5)
		move	pc_Length(a1),4(a5)
pp_NoNote	move	pc_Period(a1),6(a5)

		move.b	pc_Command+2(a1),d0
		and	#$f,d0
		add	d0,d0
		move	pp_Note(pc,d0.w),d0
		moveq	#0,d1
		move.b	pc_Command+3(a1),d1
		jmp	pp_Note(pc,d0.w)

pp_Note		dc.w	pp_NotImp-pp_Note
		dc.w	pp_NotImp-pp_Note
		dc.w	pp_NotImp-pp_Note
		dc.w	pp_TonePort-pp_Note
		dc.w	pp_NotImp-pp_Note
		dc.w	pp_TonePort-pp_Note
		dc.w	pp_VibSlide-pp_Note
		dc.w	pp_NotImp-pp_Note
		dc.w	pp_NotImp-pp_Note
		dc.w	pp_NotImp-pp_Note
		dc.w	pp_NotImp-pp_Note
		dc.w	pp_PosJump-pp_Note
		dc.w	pp_SetVolume-pp_Note
		dc.w	pp_PattBrk-pp_Note
		dc.w	pp_ECmds2-pp_Note
		dc.w	pp_SetSpeed-pp_Note

pp_GoHome	rts

		;	C   C#  D   D#  E   F   F#  G   G#  A   A#  H  	Oct FnT
		
pp_PeriodTable	dc.w	856,808,762,720,678,640,604,570,538,508,480,453   1   1
		dc.w	428,404,381,360,339,320,302,285,269,254,240,226   2
		dc.w	214,202,190,180,170,160,151,143,135,127,120,113   3
		dc.w	850,802,757,715,674,637,601,567,535,505,477,450	  1   2
		dc.w	425,401,379,357,337,318,300,284,268,253,239,225   2
		dc.w	213,201,189,179,169,159,150,142,134,126,119,113   3
		dc.w	844,796,752,709,670,632,597,563,532,502,474,447   o   3
		dc.w	422,398,376,355,335,316,298,282,266,251,237,224   s
		dc.w	211,199,188,177,167,158,149,141,133,125,118,112   v
		dc.w	838,791,746,704,665,628,592,559,528,498,470,444       4
		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
		dc.w	832,785,741,699,660,623,588,555,524,495,467,441       5
		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
		dc.w	826,779,736,694,655,619,584,551,520,491,463,437       6
		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
		dc.w	820,774,730,689,651,614,580,547,516,487,460,434       7
		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
		dc.w	814,768,725,684,646,610,575,543,513,484,457,431      -8
		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
		dc.w	907,856,808,762,720,678,640,604,570,538,508,480      -9
		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
		dc.w	900,850,802,757,715,675,636,601,567,535,505,477     -10
		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
		dc.w	894,844,796,752,709,670,632,597,563,532,502,474     -11
		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
		dc.w	887,838,791,746,704,665,628,592,559,528,498,470     -12
		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
		dc.w	881,832,785,741,699,660,623,588,555,524,494,467     -13
		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
		dc.w	875,826,779,736,694,655,619,584,551,520,491,463     -14
		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
		dc.w	868,820,774,730,689,651,614,580,547,516,487,460     -15
		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
		dc.w	862,814,768,725,684,646,610,575,543,513,484,457     -16
		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

****************************** Commands *****************************
* d1.w <= Command byte
* a0.l <= Module			       Used regs: d0-d6/a3-a4
* a1.l <= Channel struct
* a5.l <= Sound regs
* a6.l <= CustomBase
* sr.? <= tst.b d1

pp_Arpeggio	beq.b	pp_NoArp
		moveq	#0,d0
		move.b	pm_Speed(a0),d0
		subq.b	#1,d0
		sub.b	pm_Counter(a0),d0
		divs	#3,d0
		swap	d0
		tst	d0
		beq.s	pp_Arpeggio2
		cmp	#2,d0
		beq.s	pp_Arpeggio1
		moveq	#0,d0
		move.b	d1,d0
		lsr.b	#4,d0
		bra.s	pp_Arpeggio3
pp_Arpeggio1	moveq	#0,d0
		move.b	d1,d0
		and.b	#$f,d0
		bra.s	pp_Arpeggio3
pp_Arpeggio2	move	pc_Period(a1),d2
		bra.s	pp_Arpeggio4
pp_Arpeggio3	add	d0,d0
		moveq	#0,d1
		move.b	pc_FineTune(a1),d1
		mulu	#2*36,d1

		lea	pp_PeriodTable(pc),a4
		add.l	d1,a4
		moveq	#0,d1
		move	pc_Period(a1),d1
		moveq	#36-1,d6
pp_arploop	move	(a4,d0.w),d2
		cmp	(a4),d1
		bhs.s	pp_Arpeggio4
		addq	#2,a4
		dbf	d6,pp_arploop

pp_NoArp	rts
pp_Arpeggio4	move	d2,6(a5)
		rts

pp_PortUp	sub	d1,pc_Period(a1)
		cmp	#113,pc_Period(a1)
		bpl.s	.NotMin
		move	#113,pc_Period(a1)
.NotMin		move	pc_Period(a1),6(a5)
		rts

pp_PortDown	add	d1,pc_Period(a1)
		cmp	#856,pc_Period(a1)
		bmi.s	.NotMax
		move	#856,pc_Period(a1)
.NotMax		move	pc_Period(a1),6(a5)
		rts

pp_SetPort	move	d2,pc_WantedPeriod(a1)
		rts

pp_PortSlide	bsr.w	pp_VolSlide
		tst.b	d1
pp_TonePort	beq.s	.PortNoChange
		move	d1,pc_PortSpeed(a1)
.PortNoChange	move	pc_PortSpeed(a1),d0
		move	pc_WantedPeriod(a1),d2
		sub	pc_Period(a1),d2
		beq.s	.Return
		bgt.s	.Pos		
		neg	d2
		sub	d0,pc_Period(a1)
		bra.s	.Continue
.Pos		add	d0,pc_Period(a1)
.Continue	cmp	d0,d2
		bge.s	.SlideMore
		move	pc_WantedPeriod(a1),pc_Period(a1)
.SlideMore	move	pc_Period(a1),6(a5)
.Return		rts

pp_Vibrato	beq.s	pp_NoParas1
		move.b	d1,pc_VibratoCmd(a1)
pp_NoParas1	move.b	pc_VibratoPos(a1),d0
		lsr	#2,d0
		and	#$1f,d0
		moveq	#0,d2
		move.b	pp_VibratoTable(pc,d0.w),d2
		move.b	pc_VibratoCmd(a1),d3
		move	d3,d4
		and	#$f,d3
		mulu	d3,d2
		lsr	#7,d2
		tst.b	pc_VibratoPos(a1)
		bpl.s	pp_NoNeg
		neg	d2
pp_NoNeg	add	pc_Period(a1),d2
		move	d2,6(a5)
		lsr.b	#2,d4
		and	#$3c,d4
		add.b	d4,pc_VibratoPos(a1)
		rts

pp_Tremolo	beq.s	pp_NoParas2
		move.b	d1,pc_TremoloCmd(a1)
pp_NoParas2	move.b	pc_TremoloPos(a1),d0
		lsr	#2,d0
		and	#$1f,d0
		moveq	#0,d2
		move.b	pp_VibratoTable(pc,d0.w),d2
		move.b	pc_TremoloCmd(a1),d3
		move	d3,d4
		and	#$f,d3
		mulu	d3,d2
		lsr	#7,d2
		tst.b	pc_TremoloPos(a1)
		bmi.s	pp_TreSub
		neg	d2
pp_TreSub	neg	d2
 		add.b	pc_Volume(a1),d2
		bge.s	pp_TreOk1
		moveq	#0,d2
pp_TreOk1	cmp.b	#$40,d2
		ble.s	pp_TreOk2
		moveq	#$40,d2
pp_TreOk2	move	d2,8(a5)
		lsr.b	#2,d4
		and	#$3c,d4
		add.b	d4,pc_TremoloPos(a1)
		rts

pp_VibratoTable	dc.b 	0,24,49,74,97,120,141,161,180,197,212,224,235,244,250
		dc.b	253,255,253,250,244,235,224,212,197,180,161,141,120,97
		dc.b	74,49,24

pp_VibSlide	bsr.w	pp_NoParas1
pp_VolSlide	move.b	d1,d0
		lsr.b	#4,d1
		beq.s	pp_VolSlideDown
pp_VolSlideUp	add.b	d1,pc_Volume(a1)
		cmp.b	#$40,pc_Volume(a1)
		bmi.s	pp_vsdskip
		move.b	#$40,pc_Volume(a1)
		bra.s	pp_vsdskip
pp_VolSlideDown	and.b	#$f,d0
		sub.b	d0,pc_Volume(a1)
		bpl.s	pp_vsdskip
		clr.b	pc_Volume(a1)
pp_vsdskip	move.b	pc_Volume(a1),8(a5)
		rts

pp_SetVolume	move.b	d1,pc_Volume(a1)
		move	d1,8(a5)
		rts

pp_PosJump	add	d1,d1
		add	d1,d1
		move	d1,pm_SongPos(a0)
pp_PattBrk	clr	pm_PattCnt(a0)
		rts

pp_SetSpeed	move.b	d1,pm_Speed(a0)
		rts

pp_SamOffset	move.b	pc_Command+3(a1),d1
		beq.b	pp_NoNew1
		move.b	d1,pc_SamOffset(a1)
pp_NoNew1	moveq	#0,d1
		move.b	pc_SamOffset(a1),d1
		lsl	#7,d1
		sub	d1,pc_Length(a1)
		add	d1,d1
		add.l	d1,pc_Start(a1)
		rts

pp_ECmds1	move	d1,d0
		lsr	#4,d0
		add	d0,d0
		move	pp_ECmdList1(pc,d0.w),d0
		and	#$f,d1
		jmp	pp_ECmdList1(pc,d0.w)

pp_ECmdList1	dc.w	pp_Filter-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_SetFnTune-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_RetrigNote-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_NoteCut-pp_ECmdList1
		dc.w	pp_NoteDelay-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1
		dc.w	pp_NotImp-pp_ECmdList1

pp_ECmds2	move	d1,d0
		lsr	#4,d0
		add	d0,d0
		move	pp_ECmdList2(pc,d0.w),d0
		and	#$f,d1
		jmp	pp_ECmdList2(pc,d0.w)

pp_ECmdList2	dc.w	pp_Filter-pp_ECmdList2
		dc.w	pp_PortUp-pp_ECmdList2
		dc.w	pp_PortDown-pp_ECmdList2
		dc.w	pp_NotImp-pp_ECmdList2
		dc.w	pp_NotImp-pp_ECmdList2
		dc.w	pp_SetFnTune-pp_ECmdList2
		dc.w	pp_NotImp-pp_ECmdList2
		dc.w	pp_NotImp-pp_ECmdList2
		dc.w	pp_NotImp-pp_ECmdList2
		dc.w	pp_RetrigNote-pp_ECmdList2
		dc.w	pp_VolSlideUp-pp_ECmdList2
		dc.w	pp_VolFineDown-pp_ECmdList2
		dc.w	pp_NoteCut-pp_ECmdList2
		dc.w	pp_NoteDelay-pp_ECmdList2
		dc.w	pp_NotImp-pp_ECmdList2
		dc.w	pp_NotImp-pp_ECmdList2

pp_Filter	add.b	d1,d1
		and.b	#$fd,$bfe001
		or.b	d1,$bfe001
		rts	

pp_SetFnTune	move	d1,d0
		lsl	#6,d0
		lsl	#3,d1
		add	d0,d1
		move	d1,pc_FnTOffset(a1)
		rts

pp_VolFineDown	move	d1,d0
		bra.w	pp_VolSlideDown

pp_NoteCut	move.b	pm_Speed(a0),d0
		sub.b	pm_Counter(a0),d0
		cmp.b	d0,d1
		bne.s	pp_NoCut
		clr.b	pc_Volume(a1)
		clr.w	8(a5)
pp_NoCut	rts

pp_RetrigNote	beq.s	pp_GetBack
		moveq	#0,d0
		move.b	pm_Speed(a0),d0
		sub.b	pm_Counter(a0),d0
		divu	d1,d0
		swap	d0
		tst	d0
		bne.s	pp_GetBack
		bsr.s	pp_SaveDmaTemp

		move.l	pc_Start(a1),(a5)
		move	pc_Length(a1),4(a5)
		move	pc_Period(a1),6(a5)
;		move.b	#$19,pm_RetrigInd(a0)
pp_GetBack	rts

pp_NoteDelay	move.b	pm_Speed(a0),d0
		sub.b	pm_Counter(a0),d0
		cmp.b	d0,d1
		bne.b	pp_NoDelay
		bsr.s	pp_SaveDmaTemp

		move.l	pc_Start(a1),(a5)
		move	pc_Length(a1),4(a5)
		move	pc_Period(a1),6(a5)
;		move.b	#$19,pm_RetrigInd(a0)
pp_NoDelay	rts

pp_SaveDmaTemp	move.l	a0,-(sp)
		lea	pp_DmaconTemp(pc),a0
		move	pc_DmaBit(a1),d1
		move	d1,$96(a6)
		or	d1,(a0)
		move.l	(sp)+,a0
pp_NotImp	rts

pp_ModulePtr	dc.l	0
pp_DmaconTemp	dc.w	0
pp_Chn1Struct	dc.l	0,0,0,0,0,$00010000,0,0,0,0,0
pp_Chn2Struct	dc.l	0,0,0,0,0,$00020000,0,0,0,0,0
pp_Chn3Struct	dc.l	0,0,0,0,0,$00040000,0,0,0,0,0
pp_Chn4Struct	dc.l	0,0,0,0,0,$00080000,0,0,0,0,0

		RSRESET
pc_Command	rs.l	1			Channel structure
pc_Start	rs.l	1
pc_Length	rs.w	1
pc_LoopStart	rs.l	1
pc_RepLen	rs.w	1
pc_Period	rs.w	1
pc_FineTune	rs.b	1
pc_Volume	rs.b	1
pc_DmaBit	rs.w	1
pc_PortSpeed	rs.w	1
pc_WantedPeriod	rs.w	1
pc_VibratoCmd	rs.b	1
pc_VibratoPos	rs.b	1
pc_TremoloCmd	rs.b	1
pc_TremoloPos	rs.b	1
pc_WaveControl	rs.b	1
pc_GlissFunk	rs.b	1
pc_SamOffset	rs.b	1
pc_PattPos	rs.b	1
pc_LoopCount	rs.b	1
pc_FuncOffset	rs.b	1
pc_WaveStart	rs.l	1
pc_PackCnt	rs.w	1
pc_FnTOffset	rs.w	1
pc_SizeOff	rs.w	0
		RSRESET
ps_Length	rs.w	1			Sample data structure
ps_FineTune	rs.b	1
ps_Volume	rs.b	1
ps_Restart	rs.w	1
ps_RepLen	rs.w	1
ps_SamOffset	rs.l	1
ps_FnTOffset	rs.w	1
ps_SizeOff	rs.b	0
		RSRESET
pm_SamData	rs.b	31*ps_SizeOff		Main structure
pm_SongPos	rs.w	1
pm_SongLength	rs.w	1
pm_PattCnt	rs.w	1
pm_Speed	rs.b	1
pm_Counter	rs.b	1
pm_PlayAdr	rs.l	1
pm_RetrigInd	rs.w	1
pm_PattPoses	rs.l	128
pm_PattData	rs.b	0
		RSRESET
