*********************************************************************
*                                                                   *
*                 ญญญ Enlightment greetingspart ญญญ                 *
*                                                                   *
* By: Azatoth of Phenomena.		      Last change: 19-11-91 *
*                                                                   *
*********************************************************************

******************** Defines Structures n Macros ********************

ScrDepth	EQU	1		Vector screen defines
ScrHeight	EQU	256
ScrBPR		EQU	40
ScrBPB		EQU	ScrBPR*ScrHeight
ScrBytes	EQU	ScrDepth*ScrBPB

		include Include:StdMacros.s

******************************** Main *******************************

Start		lea	$dff000,a6		Init
		mac	SystemOff
		icpr	ScrAdr,ScrBplPtrs,ScrDepth,ScrBPB
		move.l	#CprList,$080(a6)
		move	#$83c0,$096(a6)
		move	#$c000,$09a(a6)

		lea	pp_Data(pc),a0
		bsr	pp_Init

.PlayLoop	lea	pp_Data(pc),a0
		wline	$90,d1
		move	#$fff,$180(a6)
		bsr	pp_Music
		move	#$000,$180(a6)
		btst	#6,$bfe001
		bne.s	.PlayLoop

		bsr	pp_End

		mac	SystemOn		Clean and close
		moveq	#0,d0
		rts

*********************************************************************
********************* Program specific routines *********************

********************** Variables and Data ***************************

CprList		dc.w	$0102,$0000
		dc.w	$0104,$0000
		dc.w	$008e,$2c81
		dc.w	$0090,$2cc1

		dc.w	$0100,$0200+ScrDepth*4096
		dc.w	$0092,$0038
		dc.w	$0094,$00d0
		dc.w	$0108,ScrBPR-40
		dc.w	$010a,ScrBPR-40
ScrBplPtrs	ds.w	4*ScrDepth
ScrColors	dc.w	$0180,$0000,$0182,$0001,$0184,$0002,$0186,$0003
		dc.w	$0188,$0004,$018a,$0005,$018c,$0006,$018e,$0007
		dc.w	$0190,$0008,$0192,$0009,$0194,$000a,$0196,$000b
		dc.w	$0198,$000c,$019a,$000d,$019c,$000e,$019e,$000f
		dc.w	$01a0,$011f,$01a2,$022f,$01a4,$033f,$01a6,$044f
		dc.w	$01a8,$055f,$01aa,$066f,$01ac,$077f,$01ae,$088f
		dc.w	$01b0,$099f,$01b2,$0aaf,$01b4,$0bbf,$01b6,$0ccf
		dc.w	$01b8,$0ddf,$01ba,$0eef,$01bc,$0fff,$01be,$0fff

		dc.w	$ffff,$fffe

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

*********************************************************************
*							            *
*                 -=+ ProPacker routines V1.0A +=-                  *
*							            *
* Made by: Azatoth/Pha     Created: 91-07-11  Last change: 92-04-16 *
*							            *
*********************************************************************

; Note:
; This is version A with regsets from irqs !!!
; Interrupts must be enabled !!!
; Some commands are not implemented yet !!!
; There is much left to optimize !!!
; This replay can easily be made pc-independent
; For speed reasons vibrato and tremolo must 
; always be set with both parameters !!!
; Assembled with AsmOne1.07b !!!

		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

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

pp_Init		move	pm_SongLength(a0),pp_SongLength+2
		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)
		clr	pm_RetrigInd(a0)
		move.l	$78.w,pp_OldLev6+2
		move.l	#pp_DmaIrq,$78.w
		move	#$2000,$dff09a
		move.b	#$7f,$bfdd00
		move.b	#$08,$bfde00
		move.b	#$80,$bfd400
		move.b	#$01,$bfd500		
.Respond	btst	#0,$bfdd00
		beq.s	.Respond
		move.b	#$81,$bfdd00
		move	#$a000,$dff09a
		bset	#1,$bfe001
		rts

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

pp_End		bclr	#1,$bfe001
		move	#$2000,$dff09a
pp_OldLev6	move.l	#$0000,$78.w
		move	#$f,$dff096
		rts

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

pp_Music	subq.b	#1,pm_Counter(a0)
		bhi	pp_NoNotes

		move.l	pm_PlayAdr(a0),a2
		move	#$8000,pp_DmaconTemp
		lea	pp_Chn1Struct(pc),a1
		lea	$a0(a6),a5
		bsr	pp_PlayVoice
		lea	pp_Chn2Struct(pc),a1
		lea	$b0(a6),a5
		bsr	pp_PlayVoice
		lea	pp_Chn3Struct(pc),a1
		lea	$c0(a6),a5
		bsr	pp_PlayVoice
		lea	pp_Chn4Struct(pc),a1
		lea	$d0(a6),a5
		bsr	pp_PlayVoice
		move.l	a2,pm_PlayAdr(a0)
		
		move.b	#$19,$bfde00

		subq	#1,pm_PattCnt(a0)
		bgt.s	pp_Return
		move	#64,pm_PattCnt(a0)
		clr	pp_Chn1Struct+pc_PackCnt
		clr	pp_Chn2Struct+pc_PackCnt
		clr	pp_Chn3Struct+pc_PackCnt
		clr	pp_Chn4Struct+pc_PackCnt	
		addq	#4,pm_SongPos(a0)
pp_SongLength	cmp	#$0000,pm_SongPos(a0)
		blo.s	pp_NotEOS
		clr	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)
		add	#pc_SizeOff,a1
		add	#16,a5
		dbf	d7,pp_CmdLoop2

		move.b	pm_RetrigInd(a0),$bfde00
		clr	pm_RetrigInd(a0)
		rts

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

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_DmaIrq	tst.b	$bfdd00
		move.b	#$19,$bfde00
		add.l	#pp_RegIrq-pp_DmaIrq,$78.w
		move	pp_DmaconTemp(pc),$dff096
		move	#$2000,$dff09c
		rte

pp_RegIrq	tst.b	$bfdd00
		sub.l	#pp_RegIrq-pp_DmaIrq,$78.w
		move.l	pp_Chn1Struct+pc_LoopStart(pc),$dff0a0
		move.l	pp_Chn2Struct+pc_LoopStart(pc),$dff0b0
		move.l	pp_Chn3Struct+pc_LoopStart(pc),$dff0c0
		move.l	pp_Chn4Struct+pc_LoopStart(pc),$dff0d0
		move	pp_Chn1Struct+pc_RepLen(pc),$dff0a4
		move	pp_Chn2Struct+pc_RepLen(pc),$dff0b4
		move	pp_Chn3Struct+pc_RepLen(pc),$dff0c4
		move	pp_Chn4Struct+pc_RepLen(pc),$dff0d4
		move	#$2000,$dff09c
		rte

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

**************************** 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	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	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	pp_SetPort
		subq.b	#2,d0
		beq	pp_SetPort
		move	d2,pc_Period(a1)
		subq.b	#4,d0
		bne.s	pp_NoSamOffset
		bsr	pp_SamOffset
pp_NoSamOffset	move	pc_Command+2(a1),d0
		and	#$0ff0,d0
		cmp	#$0ed0,d0
		beq.s	pp_GoHome

		move	pc_DmaBit(a1),d0
		or	d0,pp_DmaconTemp
		move	d0,$96(a6)
		
		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	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	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
		clr	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	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	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	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)
		move	#0,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
		move	pc_DmaBit(a1),d1
		move	d1,$96(a6)
		or	d1,pp_DmaconTemp
		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	pp_NoDelay
		move	pc_DmaBit(a1),d1
		move	d1,$96(a6)
		or	d1,pp_DmaconTemp
		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_NotImp	rts

pp_Data		Place propacked module here

******************* End of ProPacker routines ***********************
*********************************************************************

ScrAdr		dcb.b	ScrBytes
