
***
*** AUTHOR:	Laxity of Kefrens. (Merge of Polka Brothers)
*** RESOURCING:	[·M·n·O·] (Lasse Jari Hansen).
*** E-MAIL:	ljh@sigma.ou.dk
***

po_data		dc.l	0
po_data2	dc.l	0

;po_waitdma	movem.l	d0/d1,-(a7)
;		moveq	#10-1,d0
;		move.b	$dff006,d1
;		cmp.b	$dff006,d1
;		beq.s	*-6
;		dbra	d0,*-14
;		movem.l	(a7)+,d0/d1
;		rts

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

**	****************************
**	* POWERTracker Replay V1.0 *
**	****************************
**
**	1992 by Laxity of Kefrens.
**


po_init		movem.l	d0-a6,-(a7)
		lea	po_1332(pc),a0
		moveq	#5-1,d0
.clrloop	clr.l	(a0)+
		dbra	d0,.clrloop
		move.l	#$00060001,po_1336	

		move.l	po_data(pc),a0
		move	2(a0),d0
		lea	8(a0,d0.w),a1
		move	(a1)+,d2
		move	d2,po_1334
		move	4(a0),po_1340
		move	6(a0),po_133c
		move	4(a0),d1
		lsl	#2,d1
		subq	#1,d1
		moveq	#0,d0

po_setbigpat	tst.b	(a1)+
		bpl.s	.ok
		dbra	d1,po_setbigpat
.ok		cmp.b	-1(a1),d0
		bcc.s	po_sbploop
		move.b	-1(a1),d0
po_sbploop	dbra	d1,po_setbigpat

		addq	#1,d0
		mulu	d2,d0
		lea	(a1,d0.w),a1
		move.l	a1,po_data2
		lea	32*5(a1),a1
		move	2(a0),d1
		divu	#24,d1
		subq	#1,d1
		lea	16+8(a0),a0
		lea	po_samplestart(pc),a2
.samploop	move.l	a1,(a2)+
		moveq	#0,d0
		move	(a0),d0
		subq.l	#1,d0
		beq.s	.nosamp
		addq	#1,d0
		lsl.l	#1,d0
		add.l	d0,a1
.nosamp		lea	24(a0),a0
		dbra	d1,.samploop
		movem.l	(a7)+,d0-a6
		rts

po_end		movem.l	d0-a6,-(a7)
		lea	$dff000,a6
		moveq	#0,d0
		move	d0,$a8(A6)
		move	d0,$b8(A6)
		move	d0,$c8(A6)
		move	d0,$d8(A6)
		move	#$f,$96(a6)
		movem.l	(a7)+,d0-a6
		rts

po_music	movem.l	d0-a6,-(a7)
		subq	#1,po_count
		ble.b	po_0b4a

		lea	po_voice1(pc),a3
		lea	$dff0a0,a6
		bsr	po_getefx
		lea	po_voice2(pc),a3
		lea	$10(a6),a6
		bsr	po_getefx
		lea	po_voice3(pc),a3
		lea	$10(a6),a6
		bsr	po_getefx
		lea	po_voice4(pc),a3
		lea	$10(a6),a6
		bsr	po_getefx

		bsr	po_doweird
		bra	po_0c1e

po_0b4a		move.l	po_data(pc),a0
		move	(a0)+,d0
		lea	-2(a0,d0),a1
		move	(a0)+,d0
		move.l	a0,a5
		lea	-4(a5),a5
		clr	po_dmacon
		move	po_133e(pc),d7

		lea	po_voice1(pc),a3
		add	po_133a(pc),d0
		lea	6(a0,d0),a0
		lea	$dff0a0,a6
		bsr	po_0c2c

		lea	po_voice2(pc),a3
		move	po_1340(pc),d0
		lea	(a0,d0),a0
		add	#$0010,a6
		bsr	po_0c2c

		lea	po_voice3(pc),a3
		move	po_1340(pc),d0
		lea	(a0,d0),a0
		add	#$0010,a6
		bsr	po_0c2c

		lea	po_voice4(pc),a3
		move	po_1340(pc),d0
		lea	(a0,d0),a0
		add	#$0010,a6
		bsr	po_0c2c

		bsr	po_doweird
		move	po_dmacon(pc),d0
		beq.b	po_0be2
		move	d0,$dff096
		ori	#$8000,d0
		move	d0,po_tempdma+2
		bsr	po_setdma
po_0be2		move	po_1336(pc),po_count
		addq	#4,po_133e
		move	po_1334(pc),d0
		cmp	po_133e(pc),d0
		bhi.b	po_0c1e
po_0bfa		clr	po_133e
		clr.b	po_1342
		addq	#1,po_133a
		move	po_133a(pc),d0
		cmp	po_1340(pc),d0
		bne.b	po_0c1e
		move	po_133c(pc),po_133a
po_0c1e		tst.b	po_1342
		bne.b	po_0bfa
		movem.l	(a7)+,d0-a6
		rts

po_0c2c		move.b	(a0),d0
		cmpi.b	#-2,d0
		bcs.b	po_0c54
		addq.b	#1,d0
		bne	po_0e9e
		clr	8(a6)
po_0c3e		lea	po_periods(pc),a4
		move	a6,d1
		andi	#$00f0,d1
		lsr	#4,d1
		mulu	#10,d1
		st	(a4,d1)
		rts

po_0c54		ext	d0
		mulu	po_1334(pc),d0
		lea	(a1,d0),a2
		move.l	(a2,d7),(a3)
		moveq	#0,d2
		move.b	2(a3),d2
		lsr.b	#4,d2
		move.b	(a3),d0
		lsr.b	#6,d0
		lsl.b	#4,d0
		move.b	1(a3),d1
		bmi.b	po_0c82
		move.b	d1,$0012(a3)
po_0c82		andi.b	#$0f,$0002(a3)
		or.b	d0,d2
		beq	po_0cf0
		move	d2,d0
		mulu	#24,d0
		tst.b	7(a5,d0)
		beq.b	po_0cb2
		bsr	po_10ee
		move.l	4(a3),10(a3)
		move	#16,8(a3)
		move	#16,14(a3)
		bra.b	po_0cf0

po_0cb2		bsr	po_0c3e
		lea	po_voice4+28(pc),a4
		add	d2,d2
		add	d2,d2
		move.l	(a4,d2.l),4(a3)
		move	(a5,d0),8(a3)
		move	4(a5,d0),14(a3)
		bne.b	po_0ce0
		addq	#1,14(a3)
		move.l	#po_1332,10(a3)
		bra.b	po_0cf0

po_0ce0		moveq	#0,d1
		move	2(a5,d0),d1
		add.l	d1,d1
		add.l	4(a3),d1
		move.l	d1,10(a3)
po_0cf0		moveq	#0,d1
		;;move.b	18(a3),8(a6)
		move.l	d0,-(a7)	;*******************
		moveq	#0,d0
		move.b	18(a3),d0
		mulu	po_myvol(pc),d0
		divu	#64,d0
		move	d0,8(a6)
		move.l	(a7)+,d0	;*******************
		move.b	(a3),d1
		andi.b	#$3f,d1
		beq	po_0da6
		add.b	d1,d1
		move.b	d1,21(a3)
		tst	8(a3)
		beq	po_0d9c
		moveq	#0,d1
		move.b	21(a3),d1
		move.b	6(a5,d0),d0
		ext	d0
		beq.b	po_0d28
		lea	po_123c(pc),a4
		muls	(a4,d1),d0
po_0d28		move	d0,28(a3)
		lea	po_12b4(pc),a4
		add	(a4,d1),d0
		cmpi.b	#3,2(a3)
		beq	po_0e48
		move	d0,16(a3)
		move.l	4(a3),(a6)
		move	8(a3),4(a6)
		move	16(a3),6(a6)
		clr.b	20(a3)
		move	30(a3),d0
		or	d0,po_dmacon
		bsr	po_0e1e
		move.b	2(a3),d0
		andi.b	#$0f,d0
		beq	po_0e9e
		subq.b	#5,d0
		beq	po_0ff4
		subq.b	#2,d0
		beq	po_1086
		subq.b	#4,d0
		beq	po_109a
		subq.b	#1,d0
		beq	po_10c4
		subq.b	#1,d0
		beq	po_10ae
		subq.b	#1,d0
		beq	po_102c
		subq.b	#1,d0
		beq	po_10e4
		rts

po_0d9c		move	30(a3),d0
		or	d0,po_dmacon
po_0da6		bsr	po_0e1e
		move.b	2(a3),d0
		andi.b	#$0f,d0
		beq	po_0e9e
		subq.b	#5,d0
		beq	po_0ff4
		subq.b	#2,d0
		beq	po_1086
		subq.b	#4,d0
		beq	po_109a
		subq.b	#1,d0
		beq	po_10c4
		subq.b	#1,d0
		beq	po_10ae
		subq.b	#1,d0
		beq	po_102c
		subq.b	#1,d0
		beq	po_10e4
		rts

po_getefx	bsr	po_0e1e
		move.b	2(a3),d0
		beq	po_0f58
		subq.b	#1,d0
		beq	po_0f8e
		subq.b	#1,d0
		beq	po_0faa
		subq.b	#1,d0
		beq.b	po_0e5c
		subq.b	#1,d0
		beq	po_0ec0
		subq.b	#1,d0
		beq	po_0ffe
		subq.b	#1,d0
		beq	po_103c
		move	16(a3),6(a6)
		subq.b	#4,d0
		beq	po_0fb8
		rts

po_0e1e		move.b	1(a3),d0
		bpl.b	po_0e9e
		move.b	d0,d1
		addq.b	#1,d1
		beq	po_0e9e
		addq.b	#1,d1
		beq	po_10a6
		move.b	d0,d1
		andi.b	#$0f,d1
		lsr.b	#4,d0
		subq.b	#8,d0
		beq	po_0fc2
		subq.b	#1,d0
		beq	po_0fde
		rts

po_0e48		moveq	#1,d1
		cmp	16(a3),d0
		beq	po_0e9e
		slt	d0
		move.b	d0,25(a3)
		bra	po_0da6

po_0e5c		tst.b	25(a3)
		beq	po_0e9e
		moveq	#0,d0
		move.b	3(a3),d0
		tst.b	25(a3)
		bmi.b	po_0e8a
		add	d0,16(a3)
		move	22(a3),d0
		cmp	16(a3),d0
		bge.b	po_0e98
po_0e7e		move	22(a3),6(a6)
		clr.b	25(a3)
		rts

po_0e8a		sub	d0,16(a3)
		move	22(a3),d0
		cmp	16(a3),d0
		bgt.b	po_0e7e
po_0e98		move	16(a3),6(a6)
po_0e9e		rts

po_0ea0		dc	$0018,$314a,$6178,$8da1,$b4c5,$d4e0,$ebf4,$fafd
		dc	$fffd,$faf4,$ebe0,$d4c5,$b4a1,$8d78,$614a,$3118

po_0ec0		move.b	03(a3),d0
		beq.b	po_0edc
		move.b	d0,d1
		andi.b	#$0f,d1
		beq	po_0f1c
		move.b	d0,d1
		lsr.b	#4,d1
		beq	po_0f2a
		move.b	d0,19(a3)
po_0edc		move.b	20(a3),d0
		andi	#$001f,d0
		lsr	#2,d0
		moveq	#0,d2
		move.b	po_0ea0(pc,d0),d2
		move.b	19(a3),d0
		andi	#$000f,d0
		mulu	d0,d2
		lsr	#7,d2
		move	16(a3),d0
		tst.b	20(a3)
		bmi.b	po_0f06
		add	d2,d0
		bra.b	po_0f08

po_0f06		sub	d2,d0
po_0f08		move	d0,6(a6)
		move.b	19(a3),d0
		lsr	#2,d0
		andi	#$003c,d0
		add.b	d0,20(a3)
		rts

po_0f1c		andi.b	#$0f,19(a3)
		or.b	d0,19(a3)
		bra	po_0edc

po_0f2a		andi.b	#$f0,19(a3)
		or.b	d0,19(a3)
		bra	po_0edc

po_sinefunk	dc.b	0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0
		dc.b	1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1

po_0f58		move.b	3(a3),d0
		beq	po_0e9e
		move	po_count(pc),d1
		move.b	po_sinefunk(pc,d1),d1
		beq	po_0e98
		subq.b	#1,d1
		bne.b	po_0f72
		lsr.b	#4,d0
po_0f72		andi	#$000f,d0
		add	d0,d0
		add.b	21(a3),d0
		lea	po_12b4(pc),a4
		move	(a4,d0),d0
		add	28(a3),d0
		move	d0,6(a6)
		rts

po_0f8e		lea	16(a3),a4
		moveq	#0,d0
		move.b	3(a3),d0
		sub	d0,(a4)
		cmpi	#$0071,(a4)
		bge.b	po_0fa4
		move	#$0071,(a4)
po_0fa4		move	(a4),6(a6)
		rts

po_0faa		lea	16(a3),a4
		moveq	#0,d0
		move.b	3(a3),d0
		add	d0,(a4)
		bra.b	po_0fa4

po_0fb8		moveq	#0,d1
		move.b	3(a3),d1
		lsr.b	#4,d1
		beq.b	po_0fd6
po_0fc2		add.b	d1,18(a3)
		cmpi.b	#$40,18(a3)
		ble.b	po_0fe8
		move.b	#$40,18(a3)
		bra.b	po_0fe8

po_0fd6		move.b	3(a3),d1
		andi.b	#$0f,d1
po_0fde		sub.b	d1,18(a3)
		bge.b	po_0fe8
		clr.b	18(a3)
po_0fe8		moveq	#0,d0
		;;move.b	18(a3),8(a6)
		move.l	d0,-(a7)	;*******************
		moveq	#0,d0
		move.b	18(a3),d0
		mulu	po_myvol(pc),d0
		divu	#64,d0
		move	d0,8(a6)
		move.l	(a7)+,d0	;*******************
		rts

po_0ff4		move.b	#1,po_1344
		rts

po_0ffe		subq.b	#1,po_1344
		bne	po_0e9e
		move.b	3(a3),d0
		lsr.b	#4,d0
		beq.b	po_101a
		move.b	d0,po_1344
		moveq	#1,d1
		bra.b	po_0fc2

po_101a		move.b	3(a3),d0
		andi.b	#$0f,d0
		move.b	d0,po_1344
		moveq	#1,d1
		bra.b	po_0fde

po_102c		andi.b	#$fd,$bfe001
		or.b	d0,$bfe001
		rts

po_103c		moveq	#0,d0
		move.b	3(a3),d0
		beq	po_0e9e
		moveq	#0,d1
		move	po_count(pc),d1
		divu	d0,d1
		swap	d1
		tst	d1
		bne	po_0e9e
		move	30(a3),d0
		move	d0,$dff096
		ori	#$8000,d0
		move	d0,po_tempdma
		move.l	4(a3),(a6)
		move	8(a3),4(a6)
		bsr	po_setdma
		rts

po_1086		moveq	#0,d0
		move.b	3(a3),d0
		move	po_1336(pc),d2
		mulu	d0,d2
		move	d2,po_count
		rts

po_109a		move.b	3(a3),d0
		subq.b	#1,d0
		move.b	d0,po_133b
po_10a6		st	po_1342
		rts

po_10ae		moveq	#0,d0
		move.b	3(a3),d0
		lsl	#2,d0
		move	d0,po_133e
		addq.b	#1,po_1342
		rts

po_10c4		moveq	#0,d0
		move.b	3(a3),d0
		cmpi.b	#$40,d0
		bls.b	po_10d2
		moveq	#$40,d0
po_10d2		move.b	d0,19(a3)
		;;move	d0,8(a6)
		move.l	d0,-(a7)	;*******************
		mulu	po_myvol(pc),d0
		divu	#64,d0
		move	d0,8(a6)
		move.l	(a7)+,d0	;*******************
		rts

po_10e4		move.b	3(a3),po_speed
		rts

po_10ee		movem.l	a0/a1,-(a7)
		lea	po_weird(pc),a0
		move	a6,d1
		andi	#$00f0,d1
		lsr	#4,d1
		subi	#10,d1
		move	d1,d2
		mulu	#10,d1
		lea	(a0,d1),a0
		move.l	po_data2(pc),a1
		lsl	#5,d2
		lea	(a1,d2),a1
		move.l	a1,4(a3)
		move.l	a1,(a0)+
		clr.b	(a0)+
		move.b	1(a5,d0),(a0)+
		move.b	#1,(a0)+
		move.b	3(a5,d0),(a0)+
		move.b	3(a5,d0),(a0)+
		move.b	5(a5,d0),(a0)+
		movem.l	(a7)+,a0/a1
		rts

po_doweird	moveq	#16,d5
		lea	po_weird(pc),a0
		moveq	#3,d7
po_1140		move.l	(a0),d0
		bmi.b	po_11b6
		subq.b	#1,4(a0)
		bpl.b	po_11b6
		move.b	5(a0),4(a0)
		moveq	#0,d1
		move.b	7(a0),d1
		tst.b	6(a0)
		beq.b	po_117e
		add.b	6(a0),d1
		cmp.b	8(a0),d1
		bge.b	po_1170
		move.b	8(a0),d1
		neg.b	6(a0)
		bra.b	po_117e

po_1170		cmp.b	9(a0),d1
		ble.b	po_117e
		move.b	9(a0),d1
		neg.b	6(a0)
po_117e		move.b	d1,7(a0)
		move.l	d0,a1
		moveq	#0,d4
		move	d1,d2
		lsr	#1,d1
		scs	d4
		ext	d4
		sub	d5,d1
		neg	d1
		move	d1,d3
		moveq	#-128,d0
		bra.b	po_119a

po_1198		move.b	d0,(a1)+
po_119a		dbra	d3,po_1198
		subq	#1,d2
		bmi.b	po_11a8
po_11a2		clr.b	(a1)+
		dbra	d2,po_11a2
po_11a8		moveq	#$7f,d0
		subq	#1,d1
		add	d4,d1
		bmi.b	po_11b6
po_11b0		move.b	d0,(a1)+
		dbra	d1,po_11b0
po_11b6		lea	10(a0),a0
		dbra	d7,po_1140
		rts

po_setdma	bsr	po_waitdma
po_tempdma	move	#0,$dff096
		bsr	po_waitdma
		movem.l	a5/a6,-(a7)
		lea	$dff0a0,a6
		lea	po_voice1(pc),a5
		move.l	10(a5),(a6)
		move	14(a5),$04(a6)
		move.l	42(a5),$10(a6)
		move	46(a5),$14(a6)
		move.l	74(a5),$20(a6)
		move	78(a5),$24(a6)
		move.l	106(a5),$30(a6)
		move	110(a5),$34(a6)
		movem.l	(a7)+,a5/a6
po_123c		rts

po_12b4		dc	$001,$d60,$ca0,$be0,$b40,$aa0,$a00,$970
		dc	$8f0,$870,$7f0,$780,$710,$6b0,$650,$5f0
		dc	$5a0,$550,$500,$4b8,$478,$438,$3f8,$3c0

po_periods	dc	904,856,808,760,720,680,640,604,572,540,508,480
		dc	452,428,404,380,360,340,320,302,286,270,254,240
		dc	226,214,202,190,180,170,160,151,143,135,127,120,113

po_oldlev6	dc.l	0

po_1332		dc	0
po_1334		dc	0
po_1336		dc.b	0
po_speed	dc.b	6
po_count	dc	1
po_133a		dc.b	0
po_133b		dc.b	0
po_133c		dc	0
po_133e		dc	0
po_1340		dc	0
po_1342		dc	0
po_1344		dc	0
po_dmacon	dc	0

po_weird	blk.b	40,-1

po_voice1	blk.b	31,0
		dc.b	1
po_voice2	blk.b	31,0
		dc.b	2
po_voice3	blk.b	31,0
		dc.b	4
po_voice4	blk.b	31,0
		dc.b	8

po_samplestart	blk.l	32,0
		blk	500,0

po_myvol	dc	0

