
* ************************************************************ *  
** ***            SID-MONITOR - PLAY ROUTINE              *** **  
*** ****------------------------------------------------**** *** 
*** ******************************************************** *** 
*** ****------------------------------------------------**** ***  
** ****            CREATED BY REINIER V VLIET             *** **  
* ************************************************************ *  
                                                                 
**************** THE PLAYER FOR EXTRA SMALL TUNES **************
*--------------------------------------------------------------*
************************ WITH NO SAMPLES ***********************


main:
	bsr	init
	bsr	playon

mouzer:
	btst	#6,$bfe001
	bne	mouzer

	bsr	playoff
	rts



playon:
	bsr	init
	lea	intflag(pc),a3
	cmp.l	#1,(a3)
	beq	interisaan
	bsr	interon
interisaan:
	rts

playoff:
	bsr	interoff
	rts

init:
	lea	offsetter(pc),a0
	add.l	-44(a0),a0
	lea	audiochannel1(pc),a1
	move.l	a0,(a1)
	lea	offsetter(pc),a0
	add.l	-40(a0),a0
	lea	audiochannel2(pc),a1
	move.l	a0,(a1)
	lea	offsetter(pc),a0
	add.l	-36(a0),a0
	lea	audiochannel3(pc),a1
	move.l	a0,(a1)
	lea	offsetter(pc),a0	
	add.l	-32(a0),a0
	lea	audiochannel4(pc),a1
	move.l	a0,(a1)


	move.w	#$000f,$dff096
	lea	datas(pc),a0
	move.l	#19,d0
clear:
	clr.l	(a0)+
	dbf	d0,clear
	
	move.l	#3,d0
	lea	offsetter(pc),a0
	add.l	-12(a0),a0	;patroom
	move.l	a0,d7
	lea	datas(pc),a0
	lea	audiochannel1(pc),a1
	move.l	#$dff0a0,a3
loop1:
	move.l	(a1)+,a2

	move.l	#1,d5	;waar beginnen in de song

	move.l	a2,(a0)+
	move.l	(a2),d5
	lea	offsetter(pc),a4
	add.l	-8(a4),a4	;patpointers
	asl.l	#2,d5		;mischien 1 subben!!
	add.l	d5,a4
	move.l	(a4),a4
	add.l	d7,a4
	move.l	a4,a2

	move.l	a4,(a0)+
;	move.l	2(a1),a2
;	move.l	a2,(a0)+
	clr.l	d6
	move.b	1(a2),d6
	sub.b	#1,d6
	lea	offsetter(pc),a4	;inst1
	add.l	-28(a4),a4
	mulu	#32,d6
	add.l	d6,a4

	move.l	a4,(a0)+
	move.l	#$99990000,(a0)+
	move.l	#$00000800,(a0)+
	move.l	#$00000000,(a0)+
	move.l	#$00000000,(a0)+
	move.w	#$10,4(a3)
	move.w	#$00,8(a3)
	lea	16(a3),a3
	dbf	d0,loop1
	lea	intercount(pc),a0
	move.l	#-1,(a0)
	lea	intersongcount(pc),a0
	move.l	#1,(a0)
	move.w	#$800f,$dff096
	rts


interon:
	lea	intflag(pc),a0
	cmp.l	#1,(a0)
	beq	noton
	lea	oldirqvec(pc),a1
	move.l	$6c,2(a1)
	lea	muzakplay(pc),a1
	move.l	a1,$6c
	move.l	#1,(a0)
noton:
	lea	endofpatflag(pc),a0
	clr.l	(a0)
	lea	endofsongflag(pc),a0
	clr.l	(a0)
	lea	offsetter(pc),a0	;speed
	add.l	-20(a0),a0
	add.l	#32,a0
	lea	flipflap(pc),a1
	move.l	(a0),(a1)
	rts
interoff:
	lea	intflag(pc),a0
	cmp.l	#0,(a0)
	beq	notoff
	lea	oldirqvec(pc),a1
	move.l	2(a1),$6c
	move.w	#$000f,$dff096
	clr.l	(a0)

notoff:
	rts

muzakplay:
	movem.l	d0-d7/a0-a6,-(a7)
	move.w	#$800f,$dff096
	lea	drumflag(pc),a0
	cmp.l	#1,(a0)
	bne	naja
	move.w	#2,$dff0d4
naja:
	lea	dma(pc),a0
	move.w	#$0001,(a0)
	lea	datas(pc),a0
	move.l	#$dff0a0,a1	
	lea	audiochannel1(pc),a5
	bsr	play
	lea	dma(pc),a0
	move.w	#$0002,(a0)
	lea	datas(pc),a0
	add.l	#28,a0
	move.l	#$dff0b0,a1	
	lea	audiochannel2(pc),a5
	bsr	play
	lea	dma(pc),a0
	move.w	#$0008,(a0)	
	lea	datas(pc),a0
	add.l	#84,a0
	move.l	#$dff0d0,a1
	lea	audiochannel4(pc),a5
	bsr	play	
	lea	dma(pc),a0
	move.w	#$0004,(a0)
	lea	datas(pc),a0
	add.l	#56,a0
	move.l	#$dff0c0,a1
	lea	audiochannel3(pc),a5
	bsr	play
;	move.w	#$800f,$dff096
ditwazit:
	lea	flipflap(pc),a0
	add.l	#1,(a0)

	lea	offsetter(pc),a1	;speed
	add.l	-20(a1),a1
	add.l	#32,a1

	move.l	(a1),d0
	cmp.l	(a0),d0
	bhs	neinz
	move.l	#0,(a0)
neinz:
	lea	endofpatflag(pc),a1
	clr.l	(a1)
	lea	endofsongflag(pc),a1
	clr.l	(a1)

	cmp.l	#0,(a0)
	bne	wegwezer

	lea	intercount(pc),a0

	lea	offsetter(pc),a1	;patlength
	add.l	-20(a1),a1
	add.l	#24,a1
	add.l	#1,(a0)
	move.l	(a0),d0
	cmp.l	(a1),d0
	bne	rnoendofpat
	move.l	#0,(a0)
	lea	endofpatflag(pc),a0
	move.l	#1,(a0)


rsongtellers:
	lea	intersongcount(pc),a0
	lea	offsetter(pc),a1	;songl
	add.l	-20(a1),a1
	add.l	#28,a1
	lea	endofsongflag(pc),a2

	add.l	#1,(a0)
	move.l	(a1),d0
	cmp.l	(a0),d0	
	bhi	rnoendofsong
	move.l	#1,(a0)
	move.l	#1,(a2)
rnoendofsong:
	
ralle:

rnoendofpat:
nottim:
wegwezer:
	bsr	mixforms
	movem.l	(a7)+,d0-d7/a0-a6
oldirqvec:
	jmp	$00000000


play:
	lea	audpoint(pc),a6
	clr.l	(a6)
	lea	audper(pc),a6
	clr.l	(a6)
	lea	flipflap(pc),a6
	cmp.l	#0,(a6)
	bne	nosub2

	lea	endofpatflag(pc),a6
	cmp.l	#1,(a6)
	bne	noendofpat


songtellers:
	lea	endofsongflag(pc),a6
	add.l	#6,(a0)
	cmp.l	#1,(a6)
	bne	noendofsong
;	move.w	#$0fff,$dff180
	move.l	(a5),a2
	move.l	a2,(a0)
noendofsong:
	
	move.l	(a0),a2
	move.l	(a2),d0

	lea	offsetter(pc),a2	;patp
	add.l	-8(a2),a2
	asl.l	#2,d0		;mischien 1 subben!!
	add.l	d0,a2
	move.l	(a2),a2
	lea	offsetter(pc),a6	;patr
	add.l	-12(a6),a6
	add.l	a6,a2


alle:
	move.l	a2,4(a0)

noendofpat:
	cmp.b	#0,19(a0)
	bne	nosub

;	move.w	#$0fff,$dff180
	move.l	4(a0),a2
	clr.l	d0
	move.b	1(a2),d0
	cmp.b	#0,d0
	beq	noinstrument
	sub.l	#1,d0
	lea	chan4drum(pc),a6
	cmp.l	#1,(a6)
	bne	nosmpl
	cmp.b	#60,d0
	bhs	itsasample
nosmpl:
	asl	#5,d0		;aslen rein
	lea	offsetter(pc),a3	;inst1
	add.l	-28(a3),a3
	add.l	d0,a3

	move.l	(a3),d1
	sub.l	#1,d1
	asl.l	#5,d1
	lea	offsetter(pc),a6	;wavef
	add.l	-24(a6),a6
	add.l	a6,d1
	lea	audpoint(pc),a6
	move.l	d1,(a6)			;wave in audiochan
	move.l	a3,8(a0)		;cur inst
	clr.b	18(a0)			;envelope timer
	clr.w	26(a0)
	clr.w	22(a0)
noinstrument:
	clr.l	d1
	move.b	(a2),d1			;note
	cmp.b	#0,d1
	beq	envelopehandler
	cmp.b	#$ff,d1
	bne	neinswein
	move.b	4(a2),19(a0)
	bra	envelopehandler
neinswein:	
	lea	frequencies(pc),a3
	move.l	(a0),a4
	add.b	5(a4),d1	;pattern transpose!
	asl.l	#1,d1
	move.w	0(a3,d1),d2
	move.w	d2,12(a0)	;cur freq
	move.b	d1,16(a0)	;last note
	lea	audper(pc),a6
	move.w	d2,(a6)		;audioper
	lea	chan4drum(pc),a6
	cmp.l	#1,(a6)
	bne	sosorry
	lea	dma(pc),a6
	cmp.w	#$0008,(a6)
	bne	sosorry
	move.w	(a6),$dff096
	move.w	d2,$dff0d6
sosorry:
	clr.b	18(a0)		;envelopetimer
	clr.w	20(a0)		;envelopes
	clr.w	22(a0)		;pitchcount
	clr.w	26(a0)
	move.b	2(a2),d2		;end note for bending
	add.b	5(a4),d2
	move.b	d2,14(a0)	;pat transposer!
	move.b	3(a2),15(a0)	;pitch speed
	move.b	4(a2),19(a0)
	move.l	8(a0),a4
	move.b	29(a4),25(a0)
envelopehandler:
	add.l	#5,a2
	move.l	a2,4(a0)
	bra	nosub2
nosub:
	sub.b	#1,19(a0)
nosub2:
	move.l	8(a0),a3	;cur inst
	lea	20(a3),a3	;envelopes
	clr.w	d3
	clr.w	d2
	clr.w	d1
	lea	audvol(pc),a6
	move.b	18(a0),d1
	cmp.b	#0,d1
	beq	attack
	add.l	#2,a3
	cmp.b	#2,d1
	beq	decay
	add.l	#2,a3
	cmp.b	#4,d1
	beq	sustain
	add.l	#2,a3
	cmp.b	#6,d1
	beq	release
	bra	envelopegone
attack:
	move.b	(a3),d1
	move.b	1(a3),d2		
	move.b	20(a0),d3
	add.w	d1,d3
	move.w	d3,(a6)
	move.b	d3,20(a0)
	cmp.w	d2,d3
	bls	envelopegone
	add.b	#2,18(a0)
	move.w	d2,(a6)		;audio vol
	move.b	d2,20(a0)	;cur vol
	bra	envelopegone

decay:
	move.b	(a3),d1
	move.b	1(a3),d2		
	move.b	20(a0),d3
	sub.w	d1,d3
	move.w	d3,(a6)
	move.b	d3,20(a0)
	cmp.w	d2,d3
	bls	pasaan
	cmp.w	#$ff00,d3
	bhs	pasaan
	bra	envelopegone
pasaan:
	add.b	#2,18(a0)
	move.w	d2,(a6)		;audio vol
	move.b	d2,20(a0)	;cur vol
	move.b	2(a3),21(a0)	;sustain time
	bra	envelopegone

sustain:
	move.b	20(a0),d3
	move.w	d3,(a6)
	sub.b	#1,21(a0)
	cmp.b	#0,21(a0)
	bne	envelopegone
	add.b	#2,18(a0)
	bra	envelopegone

release:
	move.b	(a3),d1
	move.b	1(a3),d2		
	move.b	20(a0),d3
	sub.w	d1,d3
	move.w	d3,(a6)
	move.b	d3,20(a0)
	cmp.w	d2,d3
	bls	pasaan2
	cmp.w	#$ff00,d3
	bhi	pasaan2
	bra	envelopegone
pasaan2:
	add.b	#2,18(a0)
	move.w	d2,(a6)		;audio vol
	move.b	d2,20(a0)	;cur vol

envelopegone:		;end of envelopehandler

	move.l	8(a0),a2
	add.b	#1,17(a0)
	and.b	#15,17(a0)
	clr.l	d1
	move.b	17(a0),d1
	lea	4(a2),a2
	add.l	d1,a2		;pointer to arpeggio
	move.b	(a2),d1
	clr.l	d2
	move.b	16(a0),d2
	asl.w	#1,d1
	add.b	d1,d2
	lea	frequencies(pc),a2
	add.l	d2,a2
	move.w	(a2),d2
	move.w	d2,12(a0)
	lea	audper(pc),a6
	move.w	d2,(a6)		;arpeggio ready

	clr.w	d3
	move.b	15(a0),d3	;pitchbend speed
	cmp.b	#0,d3		;no pitchbendings
	beq	audioinit
	neg.b	d3
	ext.w	d3
	clr.l	d4
	move.b	14(a0),d4
	asl.w	#1,d4
	lea	frequencies(pc),a4
	add.l	d4,a4
	move.w	(a4),d4		;end-frequencie
	btst	#15,d3
	beq	up		;pitchdown or up?
	move.w	22(a0),d2
	add.w	d3,d2
	add.w	d2,12(a0)	;cur freq
	move.w	d2,22(a0)
	move.w	12(a0),d2
	cmp.w	d2,d4
	blo	audioinit
	move.b	14(a0),d3
	asl.b	#1,d3
	move.b	d3,16(a0)
	move.w	d4,12(a0)
	clr.w	22(a0)
	move.b	#0,15(a0)
	bra	audioinit
up:
	move.w	22(a0),d2
	add.w	d3,d2
	add.w	d2,12(a0)	;cur freq
	move.w	d2,22(a0)
	move.w	12(a0),d2
	cmp.w	d2,d4
	bhi	audioinit
	move.b	14(a0),d3
	asl.b	#1,d3
	move.b	d3,16(a0)
	move.w	d4,12(a0)
	clr.w	22(a0)
	move.b	#0,15(a0)
audioinit:	

	move.l	8(a0),a4
	cmp.b	#0,28(a4)
	beq	audio3
	cmp.b	#0,25(a0)
	bne	audio2
	clr.l	d0
	move.b	28(a4),d0
	sub.b	#1,d0
	asl.l	#5,d0
	lea	offsetter(pc),a6	;wavef
	add.l	-24(a6),a6
	add.l	a6,d0
	move.l	d0,a4
	add.b	#1,24(a0)
	and.b	#$1f,24(a0)
	clr.l	d0
	move.b	24(a0),d0
	add.l	d0,a4
	clr.w	d1
	move.b	(a4),d1
	ext.w	d1
	ext.l	d1
	asr.w	#2,d1
	add.w	d1,12(a0)
	bra	audio3
audio2:
	sub.b	#1,25(a0)
audio3:


	move.l	8(a0),a4
	move.w	30(a4),d4
	neg.w	d4
	add.w	d4,26(a0)
	move.w	26(a0),d4
	add.w	d4,12(a0)



	lea	dma(pc),a6
	cmp.w	#$0008,(a6)
	bne	gaatverderf
	lea	chan4drum(pc),a6
	cmp.l	#1,(a6)
	beq	skip3
gaatverderf:
	lea	audpoint(pc),a6
	cmp.l	#0,(a6)
	beq	skip1
	lea	audpoint(pc),a6
	move.l	(a6),(a1)
skip1:

	lea	audper(pc),a6
	cmp.l	#0,(a6)
	beq	skip2
	move.w	12(a0),6(a1)
skip2:
	lea	audvol(pc),a6
	cmp.l	#0,(a6)
	beq	skip3
	move.w	(a6),d0
	asr.w	#2,d0
	move.w	d0,8(a1)
skip3:
	lea	chan4drum(pc),a6
	cmp.l	#1,(a6)
	bne	rtsen
	lea	drumflag(pc),a6
	move.l	#1,(a6)
	rts
itsasample:
	lea	dma(pc),a6
	cmp.w	#$0008,(a6)	;chan4?
	bne	rtsen
	move.w	(a6),$dff096
	cmp.b	#60,d0
	bne	nosn
	lea	smpls(pc),a6
	move.l	a6,$dff0d0
	move.w	#583,$dff0d4
	move.w	#64,$dff0d8
nosn:
	cmp.b	#61,d0
	bne	noba
	lea	smpls(pc),a6
	add.l	#1166,a6
	move.l	a6,$dff0d0
	move.w	#204,$dff0d4
	move.w	#64,$dff0d8
noba:
	cmp.b	#62,d0
	bne	nohi
	lea	smpls(pc),a6
	add.l	#1574,a6
	move.l	a6,$dff0d0
	move.w	#454,$dff0d4
	move.w	#64,$dff0d8
nohi:
	clr.l	d0
	bra	noinstrument
rtsen:
	rts		




mixforms:
	lea	offsetter(pc),a0	;mix1spd
	add.l	-20(a0),a0
	add.l	#36,a0
	move.l	(a0),d0
	cmp.l	#0,d0
	beq	nomix1

	lea	playmix1speed(pc),a6
	cmp.l	#0,(a6)
	bne	nomix2

	move.l	(a0),(a6)

	lea	offsetter(pc),a6	;mix1src1
	add.l	-20(a6),a6
	move.l	(a6),d0
	sub.l	#1,d0
	asl.l	#5,d0
	lea	offsetter(pc),a0	;wvform
	add.l	-24(a0),a0
	add.l	d0,a0

	lea	offsetter(pc),a6	;mix1source2
	add.l	-20(a6),a6
	add.l	#8,a6
	move.l	(a6),d0
	sub.l	#1,d0
	asl.l	#5,d0
	lea	offsetter(pc),a1	;wavef
	add.l	-24(a1),a1
	add.l	d0,a1

	lea	verloopje1(pc),a6
	add.l	#1,(a6)
	and.l	#31,(a6)

	lea	offsetter(pc),a6	;mix1d1
	add.l	-20(a6),a6
	add.l	#16,a6
	move.l	(a6),d0
	sub.l	#1,d0
	asl.l	#5,d0
	lea	offsetter(pc),a2	;wfor
	add.l	-24(a2),a2
	add.l	d0,a2

	lea	verloopje1(pc),a6
	move.l	(a6),d1
	move.l	#31,d0
mixendiehap1:
	clr.l	d2
	clr.l	d3
	move.b	0(a0,d0),d2
	add.b	#128,d2
	move.b	0(a1,d1),d3
	add.b	#128,d3
	add.w	d3,d2
	asr.w	#1,d2
	sub.b	#128,d2
	move.b	d2,0(a2,d0)
	sub.l	#1,d1
	and.l	#31,d1
	dbf	d0,mixendiehap1

nomix2:
	lea	playmix1speed(pc),a6	;mix1spd
	sub.l	#1,(a6)
nomix1:

	lea	offsetter(pc),a1	;mix2spd
	add.l	-20(a1),a1
	add.l	#40,a1
	move.l	(a1),d0
	cmp.l	#0,d0
	beq	nomix12

	lea	playmix2speed(pc),a2
	cmp.l	#0,(a2)
	bne	nomix22

	move.l	(a1),(a2)

	lea	offsetter(pc),a0	;mix2src1
	add.l	-20(a0),a0
	add.l	#4,a0
	move.l	(a0),d0
	sub.l	#1,d0
	asl.l	#5,d0
	lea	offsetter(pc),a0	;wavef
	add.l	-24(a0),a0
	add.l	d0,a0

	lea	offsetter(pc),a1	;mix2src2
	add.l	-20(a1),a1
	add.l	#12,a1
	move.l	(a1),d0
	sub.l	#1,d0
	asl.l	#5,d0
	lea	offsetter(pc),a1	;wavef
	add.l	-24(a1),a1
	add.l	d0,a1

	lea	verloopje2(pc),a6
	add.l	#1,(a6)
	and.l	#31,(a6)

	lea	offsetter(pc),a6	;mix2d
	add.l	-20(a6),a6
	add.l	#20,a6
	move.l	(a6),d0
	sub.l	#1,d0
	asl.l	#5,d0
	lea	offsetter(pc),a2	;wave
	add.l	-24(a2),a2
	add.l	d0,a2

	lea	verloopje2(pc),a6
	move.l	(a6),d1
	move.l	#31,d0
mixendiehap2:
	clr.l	d2
	clr.l	d3
	move.b	0(a0,d0),d2
	add.b	#128,d2
	move.b	0(a1,d1),d3
	add.b	#128,d3
	add.w	d3,d2
	asr.w	#1,d2
	sub.b	#128,d2
	move.b	d2,0(a2,d0)
	sub.l	#1,d1
	and.l	#31,d1
	dbf	d0,mixendiehap2

nomix22:
	lea	playmix2speed(pc),a6
	sub.l	#1,(a6)
nomix12:
	rts

playmix1speed:
	dc.l	0
playmix2speed:
	dc.l	0
verloopje1:
	dc.l	0
verloopje2:
	dc.l	0





audpoint:	dc.l	0
audper:		dc.w	0
audvol:		dc.w	0
intercount:	dc.l	0
intersongcount:	dc.l	0


datas:
	dc.l	0	;currentsong
	dc.l	0	;currentpattern
	dc.l	0	;currentinstrument
	dc.w	0	;curfreq
	dc.b	0	;end note
	dc.b	0	;bend speed
	dc.b	0	;last note
	dc.b	0	;arpeggiocount
	dc.b	0	;envelopecount
	dc.b	0	;notetimer
	dc.b	0	;last volumie
	dc.b	0	;sustaincount
	dc.w	0	;pitch-count
	dc.b	0	;phasetimer
	dc.b	0	;phase flipflop
	dc.w	0	;pitchfallcount
	blk.b	28*3,0


audiochannel1:
	dc.l	0		
audiochannel2:
	dc.l	0
audiochannel3:
	dc.l	0
audiochannel4:
	dc.l	0

frequencies:
dc.w 0000
dc.w 6848,6464,6096,5760,5424,5120,4832,4560,4304,4064,3840,3616;oct1
dc.w 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1808;oct2
dc.w 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,0960,0904;oct3
dc.w 0856,0808,0762,0720,0678,0640,0604,0570,0538,0508,0480,0452;oct4
dc.w 0428,0404,0381,0360,0339,0320,0302,0285,0269,0254,0240,0226;oct5
dc.w 0214,0202,0190,0180,0170,0160,0151,0143,0135,0127		;oct6

;    c    c#   d    d#   e    f    f#   g    g#   a    a#   b




endofpatflag:
	dc.l	0
endofsongflag:
	dc.l	0
flipflap:
	dc.l	0
intflag:
	dc.l	0



dma:			;hehehe
	dc.l	0


even
drumflag:
	dc.l	0

m:
smpls:
	blk.b	2485,0		;0=snare,1166=bassd,1574=hi


EVEN


************
begin:
	song1offset:		dc.l	0
	song2offset:		dc.l	0
	song3offset:		dc.l	0
	song4offset:		dc.l	0
	inst1offset:		dc.l	0
	waveform1offset:	dc.l	0
	variablesoffset:	dc.l	0
	wavelistoffset:		dc.l	0
	patroomoffset:		dc.l	0
	patpointersoffset:	dc.l	0
	chan4drum:		dc.l	0
*
	offsetter:	blk.b	4516-44,0
*
