*******************************
*        Player v4.0b ฎ       *
*         Lev6-version        *
*          Revision 3         *
*    ฉ 1992 Jarno Paananen    *
*     All rights reserved     *
*******************************

;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
;ญ call 'P40_init' to initialize the playroutine ญ
;ญ A0 --> Modules address			 ญ
;ญ A1 --> Samples' address or NULL		 ญ
;ญ A6 --> Customchip baseaddress ($DFF000)	 ญ
;ญ returns -1 in D0 if not a correct module	 ญ
;ญ Used regs: A0/A1/A3/D0/D1			 ญ
;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ

P40_init
	cmpi.l	#`P40B`,(a0)+
	beq.b	P00
	moveq	#-1,d0
	rts

P00	lea	P0(pc),a3
	move.l	a0,P72-P0(a3)

	move.l	a0,d0
	add.l	d0,4(a0)
	add.l	d0,8(a0)
	add.l	d0,12(a0)

	move.l	a1,d0
	beq.b	P1
	move.l	a1,12(a0)

P1	move.l	12(a0),d0
	moveq	#0,d1
	move.b	2(a0),d1
	subq	#1,d1
	lea	16(a0),a1
P2	add.l	d0,(a1)
	add.l	d0,6(a1)
	lea	16(a1),a1
	dbra	d1,P2

	lea	P63(pc),a1
	moveq	#20,d0
P3	clr	(a1)+
	dbf	d0,P3

	lea	P64(pc),a1
	moveq	#20,d0
P4	clr	(a1)+
	dbf	d0,P4

	lea	P65(pc),a1
	moveq	#20,d0
P5	clr	(a1)+
	dbf	d0,P5

	lea	P66(pc),a1
	moveq	#20,d0
P6	clr	(a1)+
	dbf	d0,P6

	move.l	8(a0),a1
	move.l	a1,P6F-P0(a3)
	moveq	#0,d1
	move	(a1)+,d1
	add.l	4(a0),d1
	move.l	d1,32+P63-P0(a3)
	moveq	#0,d1
	move	(a1)+,d1
	add.l	4(a0),d1
	move.l	d1,32+P64-P0(a3)
	moveq	#0,d1
	move	(a1)+,d1
	add.l	4(a0),d1
	move.l	d1,32+P65-P0(a3)
	moveq	#0,d1
	move	(a1)+,d1
	add.l	4(a0),d1
	move.l	d1,32+P66-P0(a3)
	move.l	a1,P6C-P0(a3)

	move.l	4(a0),P70-P0(a3)

	lea	P62(pc),a0
	move.l	a0,P71-P0(a3)

	move	#63,P68-P0(a3)
	move	#6,P69-P0(a3)
	move	#5,P6A-P0(a3)
	clr	P6B-P0(a3)
	clr.l	P6D-P0(a3)
	clr	(a3)

	move.b	#$3f,$bfdd00
	move.b	#$81,$bfdd00
	move.b	#151,$bfd400
	move.b	#1,$bfd500
	move.b	#$90,$bfde00
	move	#$6000,$9c(a6)
	move	#$a000,$9a(a6)

	move.l	$78.w,P73-P0(a3)
	or.b	#2,$bfe001
	move	#$f,$96(a6)

	moveq	#0,d0

	lea	P61(pc),a0
	move.l	a0,$78.w

	clr	$a8(a6)
	clr	$b8(a6)
	clr	$c8(a6)
	clr	$d8(a6)
	rts

;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
;ญ        call 'P40_end' to stop music       ญ
;ญ A6 --> Customchip baseaddress ($DFF000)   ญ
;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
P40_end	clr	$a8(a6)
	clr	$b8(a6)
	clr	$c8(a6)
	clr	$d8(a6)
	move.l	P73(pc),$78.w
	rts

;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
;ญ call 'P40_music' every frame to play the music ญ
;ญ A6 --> Customchip baseaddress ($DFF000)	  ญ
;ญ          Used regs: a0-a6/d0-d7		  -
;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
P40_music
	lea	P0(pc),a3

	moveq	#44,d6
	moveq	#16,d7

	move	(a3),d4
	addq	#1,d4
	cmpi	P69(pc),d4
	beq.w	P2E

	lea	P63(pc),a5
	lea	$a0(a6),a4

	move	d4,(a3)

	moveq	#3,d5
P7	tst	30(a5)
	beq.w	P1C
	moveq	#$f,d0
	and	(a5),d0
	add	d0,d0
	move	P8(pc,d0),d0
	jmp	P8(pc,d0)

P8	dc	P1C-P8,P1D-P8,P1F-P8,P19-P8,P58-P8,P16-P8,P55-P8,P5B-P8
	dc	PE-P8,P1C-P8,P13-P8,P1C-P8,P1C-P8,P1C-P8,P9-P8,P1C-P8

P9	move.b	2(a5),d0
	and.b	#$f0,d0
	cmp	#$90,d0
	beq.b	PB
	cmp	#$c0,d0
	beq.b	PA
	cmp	#$d0,d0
	bne.w	P1C

	moveq	#$f,d0
	and.b	2(a5),d0
	cmpi	(a3),d0
	bne.w	P1C
	move	42(a5),d0
	or	#$8000,d0
	or	d0,P67-P0(a3)
	move.l	4(a5),a1
	move.l	(a1)+,(a4)
	move	(a1),4(a4)
	move.b	#%10010001,$bfde00
	lea	P60(pc),a1
	move.l	a1,$78.w
	bra.w	P1C

PA	moveq	#$f,d0
	and.b	2(a5),d0
	cmpi	(a3),d0
	bne.w	P1C
	clr	8(a4)
	clr	14(a5)
	bra.w	P1C

PB	subq	#1,26(a5)
	bne.w	P1C
	move	42(a5),d0
	move	d0,$96(a6)
	or	#$8000,d0
	or	d0,P67-P0(a3)
	move.l	4(a5),a1
	move.l	(a1)+,(a4)
	move	(a1),4(a4)
	move.b	#%10010001,$bfde00
	lea	P60(pc),a1
	move.l	a1,$78.w
	moveq	#$f,d0
	and.b	2(a5),d0
	move	d0,26(a5)
	bra.w	P1C

PD	dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1

PE	move	(a3),d0
	move.b	PD(pc,d0),d0
	beq.b	PF
	btst	#0,d0
	bne.b	P10
	moveq	#$f,d0
	and.b	2(a5),d0
	bra.b	P11
PF	moveq	#0,d0
	bra.b	P11
P10	moveq	#0,d0
	move.b	2(a5),d0
	lsr.b	#4,d0
P11	add	d0,d0
	add	28(a5),d0
	move	P12(pc,d0),6(a4)
	bra.w	P1C

P12	dc	856,856,808,762,720,678,640,604,570,538,508,480,453
	dc	428,404,381,360,339,320,302,285,269,254,240,226
	dc	214,202,190,180,170,160,151,143,135,127,120,113
	dc	850,850,802,757,715,674,637,601,567,535,505,477,450
	dc	425,401,379,357,337,318,300,284,268,253,239,225
	dc	213,201,189,179,169,159,150,142,134,126,119,113
	dc	844,844,796,752,709,670,632,597,563,532,502,474,447
	dc	422,398,376,355,335,316,298,282,266,251,237,224
	dc	211,199,188,177,167,158,149,141,133,125,118,112
	dc	838,838,791,746,704,665,628,592,559,528,498,470,444
	dc	419,395,373,352,332,314,296,280,264,249,235,222
	dc	209,198,187,176,166,157,148,140,132,125,118,111
	dc	832,832,785,741,699,660,623,588,555,524,495,467,441
	dc	416,392,370,350,330,312,294,278,262,247,233,220
	dc	208,196,185,175,165,156,147,139,131,124,117,110
	dc	826,826,779,736,694,655,619,584,551,520,491,463,437
	dc	413,390,368,347,328,309,292,276,260,245,232,219
	dc	206,195,184,174,164,155,146,138,130,123,116,109
	dc	820,820,774,730,689,651,614,580,547,516,487,460,434
	dc	410,387,365,345,325,307,290,274,258,244,230,217
	dc	205,193,183,172,163,154,145,137,129,122,115,109
	dc	814,814,768,725,684,646,610,575,543,513,484,457,431
	dc	407,384,363,342,323,305,288,272,256,242,228,216
	dc	204,192,181,171,161,152,144,136,128,121,114,108
	dc	907,907,856,808,762,720,678,640,604,570,538,508,480
	dc	453,428,404,381,360,339,320,302,285,269,254,240
	dc	226,214,202,190,180,170,160,151,143,135,127,120
	dc	900,900,850,802,757,715,675,636,601,567,535,505,477
	dc	450,425,401,379,357,337,318,300,284,268,253,238
	dc	225,212,200,189,179,169,159,150,142,134,126,119
	dc	894,894,844,796,752,709,670,632,597,563,532,502,474
	dc	447,422,398,376,355,335,316,298,282,266,251,237
	dc	223,211,199,188,177,167,158,149,141,133,125,118
	dc	887,887,838,791,746,704,665,628,592,559,528,498,470
	dc	444,419,395,373,352,332,314,296,280,264,249,235
	dc	222,209,198,187,176,166,157,148,140,132,125,118
	dc	881,881,832,785,741,699,660,623,588,555,524,494,467
	dc	441,416,392,370,350,330,312,294,278,262,247,233
	dc	220,208,196,185,175,165,156,147,139,131,123,117
	dc	875,875,826,779,736,694,655,619,584,551,520,491,463
	dc	437,413,390,368,347,328,309,292,276,260,245,232
	dc	219,206,195,184,174,164,155,146,138,130,123,116
	dc	868,868,820,774,730,689,651,614,580,547,516,487,460
	dc	434,410,387,365,345,325,307,290,274,258,244,230
	dc	217,205,193,183,172,163,154,145,137,129,122,115
	dc	862,862,814,768,725,684,646,610,575,543,513,484,457
	dc	431,407,384,363,342,323,305,288,272,256,242,228
	dc	216,203,192,181,171,161,152,144,136,128,121,114

P13	move.b	2(a5),d0
	sub.b	d0,14+1(a5)
	bpl.b	P14
	clr	14(a5)
	clr	8(a4)
	bra.w	P1C
P14	moveq	#64,d0
	cmp	14(a5),d0
	bge.b	P15
	move	d0,14(a5)
	move	d0,8(a4)
	bra.b	P1C
P15	move	14(a5),8(a4)
	bra.b	P1C

P16	move.b	2(a5),d0
	sub.b	d0,14+1(a5)
	bpl.b	P17
	clr	14(a5)
	clr	8(a4)
	bra.b	P19
P17	moveq	#64,d0
	cmp	14(a5),d0
	bge.b	P18
	move	d0,14(a5)
P18	move	14(a5),8(a4)

P19	move	18(a5),d0
	beq.b	P1C
	move	20(a5),d1
	cmp	16(a5),d0
	blt.b	P1A

	add	d1,16(a5)
	cmp	16(a5),d0
	bgt.b	P1B
	move	d0,16(a5)
	clr	18(a5)
	move	d0,6(a4)
	bra.b	P1C

P1A	sub	d1,16(a5)
	cmp	16(a5),d0
	blt.b	P1B
	move	d0,16(a5)
	clr	18(a5)
P1B	move	16(a5),6(a4)

P1C	add	d6,a5
	add	d7,a4
	dbf	d5,P7

	cmp	P6A(pc),d4
	beq.b	P21
	rts

P1D	moveq	#0,D0
	move.b	2(a5),d0
	sub	d0,16(a5)
	moveq	#113,d0
	cmpi	16(a5),d0
	ble.b	P1E
	move	d0,16(a5)
	move	d0,6(a4)
	bra.b	P1C
P1E	move	16(a5),6(a4)
	bra.b	P1C

P1F	moveq	#0,d0
	move.b	2(a5),d0
	add	d0,16(a5)
	cmp	#856,16(a5)
	ble.b	P20
	move.w	#856,d0
	move	d0,16(a5)
	move	d0,6(a4)
	bra.b	P1C
P20	move	16(a5),6(a4)
	bra.b	P1C

P21	tst	P6D-P0(a3)
	beq.b	P22
	subq	#1,P6D-P0(a3)
	rts

P22	lea	P63(pc),a5
	move.l	P72(pc),a0
	move.l	P70(pc),a4

	moveq	#3,d5
P23	tst.b	3(a5)
	beq.b	P25
	bmi.b	P24

	subq.b	#1,3(a5)
	clr	30(a5)
	add	d6,a5
	dbf	d5,P23
	bra.b	P2B

P24	addq.b	#1,3(a5)
	bra.b	P29

P25	tst.b	40+1(a5)
	beq.b	P26

	subq.b	#1,40+1(a5)
	addq.l	#4,36(a5)
	move.l	36(a5),a2
	move.l	(a2),(a5)
	bra.b	P29

P26	move.l	32(a5),a2
	tst.b	(a2)
	bmi.b	P27
	move.l	(a2),(a5)
	bra.b	P28

P27	move	(a2)+,40(a5)
	move	(a2),d0
	lea	(a4,d0),a2
	move.l	(a2),(a5)
	move.l	a2,36(a5)
P28	addq.l	#4,32(a5)

P29	move	(a5),d0
	st	30(a5)

	and	#$1f0,d0
	beq.b	P2A
	lea	(a0,d0),a1
	move.l	a1,4(a5)
	move.l	12(a1),12(a5)

P2A	add	d6,a5
	dbf	d5,P23

P2B	subq	#1,P68-P0(a3)
	bpl.b	P2D

	move	#63,P68-P0(a3)
	move.l	P6C-P0(a3),a1
	move	(a1)+,d0
	bpl.b	P2C
	move.l	P6F(pc),a1
	move	(a1)+,d0
P2C	lea	(a4,d0),a2
	move.l	a2,32+P63-P0(a3)
	move	(a1)+,d0
	lea	(a4,d0),a2
	move.l	a2,32+P64-P0(a3)
	move	(a1)+,d0
	lea	(a4,d0),a2
	move.l	a2,32+P65-P0(a3)
	move	(a1)+,d0
	add	d0,a4
	move.l	a4,32+P66-P0(a3)
	move.l	a1,P6C-P0(a3)
P2D	rts

P2E	clr	(a3)
	tst	P6E-P0(a3)
	beq.b	P2F
	subq	#1,P6E-P0(a3)
	rts

P2F	;tst	P6B-P0(a3)		;Remove colons if you use P69 1
	;beq.b	P30
	;bsr.w	P21
	
P30	lea	P63(pc),a5
	lea	$a0(a6),a4
	lea	P12(pc),a2

	move.b	#%10010001,$bfde00
	lea	P60(pc),a1
	move.l	a1,$78.w

	move	#$8000,d4
	moveq	#3,d5
P31	tst	30(a5)
	beq.b	P35

	moveq	#$f,d1
	and	(a5),d1
	subq	#3,d1
	beq.b	P33
	subq	#2,d1
	beq.b	P34

	moveq	#$7e,d0
	and.b	(a5),d0
	beq.b	P32
	clr.b	23(a5)
	add	12(a5),d0
	move	d0,28(a5)
	move	(a2,d0),16(a5)
	move	42(a5),d0
	move	d0,$96(a6)
	eor	d0,d4

	subq	#4,d1
	beq.b	P36

	move.l	4(a5),a1
	move.l	(a1)+,(a4)
	move	(a1),4(a4)

P32	moveq	#$f,d0
	and	(a5),d0
	lea	P5F(pc),a1
	add	d0,d0
	add	(a1,d0),a1
	jmp	(a1)

P33	move.b	2(a5),d0
	beq.b	P34
	move.b	d0,20+1(a5)
P34	moveq	#$7e,d0
	and.b	(a5),d0
	beq.b	P35
	add	12(a5),d0
	move	d0,28(a5)
	move	(a2,d0),18(a5)
P35	move	16(a5),6(a4)
	move	14(a5),8(a4)

	add	d6,a5
	add	d7,a4
	dbf	d5,P31

	move	d4,P67-P0(a3)
	rts

P36	moveq	#0,d1
	move.b	2(a5),d1
	lsl	#8,d1
	move.l	4(a5),a1
	move.l	(a1)+,d0
	add.l	d1,d0
	move.l	d0,(a4)
	asr	#1,d1
	move	(a1),d0
	sub	d1,d0
	bpl.b	P37
	move.l	-4(a1),(a4)
	moveq	#1,d0
P37	move	d0,4(a4)
	bra.b	P35

P38	move.b	2(a5),14+1(a5)
	bra.b	P35

P39	moveq	#0,d0
	move.b	2(a5),d0
	asl	#2,d0
	add.l	P6F(pc),d0
	move.l	d0,P6C-P0(a3)

P40	move	#63,P68-P0(a3)
	move.l	P6C-P0(a3),a1
	move.l	P70(pc),a2
	move	(a1)+,d0
	bpl.b	P41
	move.l	P6F(pc),a1
	move	(a1)+,d0
P41	movem	(a1)+,d1-d3
	move.l	a1,P6C-P0(a3)
	lea	(a2,d0),a1
	move.l	a1,32+P63-P0(a3)
	lea	(a2,d1),a1
	move.l	a1,32+P64-P0(a3)
	lea	(a2,d2),a1
	move.l	a1,32+P65-P0(a3)
	add	d3,a2
	move.l	a2,32+P66-P0(a3)
	bra.w	P35

P42	move.b	2(a5),d0
	beq.w	P35
	move.b	d0,d1
	move.b	22(a5),d2
	and.b	#$f,d0
	beq.b	P43
	and.b	#$f0,d2
	or.b	d0,d2
P43	and.b	#$f0,d1
	beq.b	P44
	and.b	#$f,d2
	or.b	d1,d2
P44	move.b	d2,22(a5)
	bra.w	P35

P45	move.b	2(a5),d0
	beq.w	P35
	move.b	d0,d1
	move.b	24(a5),d2
	moveq	#$f,d3
	and.b	d3,d0
	beq.b	P46
	and.b	#$f0,d2
	or.b	d0,d2
P46	and.b	#$f0,d1
	beq.b	P47
	and.b	d3,d2
	or.b	d1,d2
P47	move.b	d2,24(a5)
	bra.w	P35

P48	move.b	2(a5),d0
	and.b	#$f0,d0
	lsr	#3,d0
	move	P49(pc,d0),d0
	jmp	P49(pc,d0)

P49	dc	P4A-P49,P4B-P49,P4C-P49,P35-P49,P35-P49,P4E-P49,P35-P49
	dc	P35-P49,P35-P49,P4F-P49,P4D-P49,P50-P49,P35-P49,P51-P49
	dc	P52-P49,P35-P49

P4A	move.b	2(a5),d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	bra.w	P35

P4B	moveq	#$f,d0
	and.b	2(a5),d0
	sub	d0,16(a5)
	moveq	#113,d0
	cmpi	16(a5),d0
	ble.w	P35
	move	d0,16(A5)
	bra.w	P35

P4C	moveq	#$f,d0
	and.b	2(a5),d0
	add	d0,16(a5)
	cmp	#856,16(a5)
	ble.w	P35
	move	#856,16(a5)
	bra.w	P35

P4D	moveq	#$f,d0
	and.b	2(a5),d0
	add	d0,14(a5)
	moveq	#64,d0
	cmpi	14(a5),d0
	bge.w	P35
	move	d0,14(a5)
	bra.w	P35

P4E	moveq	#$f,d0
	and.b	2(a5),d0
	mulu	#74,d0
	move	d0,12(a5)
	bra.w	P35

P4F	moveq	#$f,d0
	and.b	2(a5),d0
	move	d0,26(a5)
	bra.w	P35

P50	moveq	#$f,d0
	and.b	2(a5),d0
	sub	d0,14(a5)
	bpl.w	P35
	clr	14(a5)
	bra.w	P35

P51	move	42(a5),d0
	eor	d0,d4
	bra.w	P35

P52	moveq	#$f,d0
	and.b	2(a5),d0
	move	d0,P6D-P0(a3)
	move	d0,P6E-P0(a3)
	bra.w	P35

P53	move.b	2(a5),d0
	cmp.b	#1,d0
	bne.b	P54
	move.b	d0,P69+1-P0(a3)
	move.b	d0,P6A+1-P0(a3)
	st	P6B-P0(a3)
	bra.w	P35
P54	move.b	d0,P69+1-P0(a3)
	subq.b	#1,d0
	move.b	d0,P6A+1-P0(a3)
	clr	P6B-P0(a3)
	bra.w	P35

P55	move.b	2(a5),d0
	sub.b	d0,14+1(a5)
	bpl.b	P56
	clr	14(a5)
	clr	8(a4)
	bra.b	P58
P56	moveq	#64,d0
	cmp	14(a5),d0
	bge.b	P57
	move	d0,14(a5)
P57	move	14(a5),8(a4)
	
P58	moveq	#$f,d0
	and.b	22(a5),d0
	lsl	#6,d0
	
	move.b	23(a5),d1
	lsr	#1,d1
	and	#$3e,d1
	add	d1,d0

	move.w	P5E(pc,d0),d2

	move	16(a5),d0
	tst.b	23(a5)
	bmi.b	P59
	add	d2,d0
	bra.b	P5A

P59	sub	d2,d0

P5A	move	d0,6(a4)
	move.b	22(a5),d0
	lsr.b	#2,d0
	and	#$3c,d0
	add.b	d0,23(a5)
	bra.w	P1C

P5B	moveq	#$f,d0
	and.b	24(a5),d0
	lsl	#6,d0
	
	move.b	25(a5),d1
	lsr	#1,d1
	and	#$3e,d1
	add	d1,d0

	move	P5E(pc,d0),d2

	move	14(a5),d0
	tst.b	25(a5)
	bmi.b	P5C
	add	d2,d0
	cmp	#64,d0
	ble.b	P5D
	moveq	#64,d0
	bra.b	P5D

P5C	sub	d2,d0
	bpl.b	P5D
	moveq	#0,d0
P5D	move	d0,8(a4)
	move.b	24(a5),d0
	lsr.b	#2,d0
	and	#$3c,d0
	add.b	d0,25(a5)
	bra.w	P1C

	incdir	"dh0:asm/sources/Player/"
P5E	incbin	vibtab

P5F	dc	P35-P5F,P35-P5F,P35-P5F,P35-P5F,P42-P5F,P35-P5F,P35-P5F
	dc	P45-P5F,P35-P5F,P35-P5F,P35-P5F,P39-P5F,P38-P5F,P40-P5F
	dc	P48-P5F,P53-P5F

P60	move	P67(pc),$dff096
	move.l	P71(pc),$78.w
	tst.b	$bfdd00
P61	move	#$2000,$dff09c
	rte

P62	movem.l	d0/a0/a1,-(sp)
	lea	$dff0a0,a1
	move	P67(pc),d0

	move.l	4+P63(pc),a0
	move.l	6(a0),(a1)
	move	10(a0),4(a1)
	move.l	4+P64(pc),a0
	move.l	6(a0),16(a1)
	move	10(a0),20(a1)
	move.l	4+P65(pc),a0
	move.l	6(a0),32(a1)
	move	10(a0),36(a1)
	move.l	4+P66(pc),a0
	move.l	6(a0),48(a1)
	move	10(a0),52(a1)

	tst.b	$bfdd00
	move.b	#%10000000,$bfde00
	move	#$2000,-4(a1)
	movem.l	(sp)+,d0/a0/a1
	rte

P63	ds	21
	dc	1
P64	ds	21
	dc	2
P65	ds	21
	dc	4
P66	ds	21
	dc	8
P0	dc	0
P67	dc	$8000
P68	dc	63
P69	dc	6
P6A	dc	5
P6B	dc	0
P6C	dc.l	0
P6D	dc	0
P6E	dc	0
P6F	dc.l	0
P70	dc.l	0
P71	dc.l	0
P72	dc.l	0
P73	dc.l	0

*/ end of file /*

