*************************************************
* This NoiseTracker source is made by:		*
* Lars-¸ke Berg					*
* Email adress:d0berg@dtek.chalmers.se		*
* It is PublicDomain				*
* If you want to get in contact with me		*
* use my email adress or write to		*
* Lars-¸ke Berg					*
* Volratamsgatan 6-9320				*
* 412 60 G”teborg				*
* Sweden					*
* or phone 046-(0)31-163123			*
*************************************************
* Thanx to M.K for the sorce.(from the Amiga)	*
*************************************************
* This player uses NoiseTracker modules from	*
* the amiga (not SoundTracker and ProTracker).	*
* To start, it,do like this.			*
* 1. Assamble it in (Seka).			*
* 2. Chose playing frek by puting 0,1 or 2(.l)	*
*    in hz (label).				*
* 3. jump to start.				*
* 4. to stop playing jump to back.		*
* 3 diffrent playing frek. are included.	*
* The flag hz(.l) stands for			*
* 0(.l)=6.25 kHz 1(.l)=12.5 kHz 2(.l)=25.0 kHz	*
* don't forget to do initmusic and initdma 	*
* after changing playing frek.			*
*************************************************
moduldta=$80000
start:
	bsr.L	mod_init
	bsr.l 	initmusic
	bsr.l 	initdma
	move.w	#$2700,sr
	move.l	$70,oldvbl
	move.l	#vbl,$70
	move.w	#$2300,sr
	rts
back:
	move.w	#$2700,sr
	move.l	oldvbl,$70
;	move.w	#$-1,$ff8240
	move.w	#$2300,sr
	rts
oldvbl:	dc.l 0
vbl:
	movem.l	a0-a6/d0-d7,-(sp)
	
;	move.w 	#$000,$ff8240
	bsr.L	playmod
	move.w 	#$fff,$ff8240
	bsr.l	Atari_rutin
;	move.w	#$-1,$ff8240

	bsr.s	levelstaplar
	movem.l	(sp)+,a0-a6/d0-d7
	rte
***********************************************
;show rutiner
***********************************************
levelstaplar:
	lea	voice1+6,a1
	lea	old_voltab,a2
	move.w (a1),d0	;level ch 0
	move.w 28(a1),d1;level ch 1
	move.w 56(a1),d2;level ch 2
	move.w 84(a1),d3;level ch 3
	and.w #$7f,d0
	and.w #$7f,d1
	and.w #$7f,d2
	and.w #$7f,d3
	lsr.w #1,d0	;skala ner 2 ggr.
	lsr.w #1,d1
	lsr.w #1,d2
	lsr.w #1,d3
	
	lea	$f8002+[160*90],a0
	bsr.s	vol_before
	bsr.s 	channel
		
	lea 	$f800a+[160*90],a0
	move.w 	d1,d0
	bsr.s	vol_before
	bsr.s 	channel

	lea 	$f8012+[160*90],a0
	move.w 	d2,d0
	bsr.s	vol_before
	bsr.s 	channel

	lea 	$f801a+[160*90],a0
	move.w 	d3,d0
	bsr.s	vol_before
	bsr.s 	channel
	rts
vol_before:
	cmp.w	#$40,d0
	ble.s	no_error_vol
	moveq	#$40,d0
no_error_vol:
	move.w	(a2),d5
	cmp.w	d5,d0
	blo.s	minska_st
	move.w	d0,(a2)+
	rts
minska_st:
	subq.w	#1,d5
	bpl.s	minska_st2
	moveq	#0,d5
minska_st2:
	move.w	d5,(a2)+
	move.w	d5,d0
	rts
channel:
	lea stapel,a1
	lsl.w #1,d0
	and.l #$00fe ,d0
	add.l d0,a1
	moveq #31,d4
lpstap:
	move.w (a1)+,(a0)
	lea 160(a0),a0
	dbf d4,lpstap
	rts
old_voltab:
	dc.w 0,0,0,0
stapel:
	dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.w -1,-1,-1,-1,-1,-1,-1,-1
	dc.w -1,-1,-1,-1,-1,-1,-1,-1
	dc.w -1,-1,-1,-1,-1,-1,-1,-1
	dc.w -1,-1,-1,-1,-1,-1,-1,-1
************************************************
mod_init:
;spara pekare till smp data.
	lea 	moduldta,a0
	lea 	spl_dta_starts,a1

	lea	42(a0),a0	
	moveq 	#31,d0		;max 31 sampels.
	moveq	#$1e,d1
init_lp:
	move.l	a0,(a1)+
	add.l	d1,a0
	dbf	d0,init_lp
;leta reda pa hogsta pattern nr. ->d2	
	lea	moduldta,a0	
	lea	952(a0),a0
	moveq	#127,d0		;max 128
	moveq	#0,d1
	moveq	#0,d2
init_lp2:
	move.b	(a0)+,d1
	cmp.b	d2,d1
	ble.s	init_lp3
	move.w d1,d2
init_lp3:
	dbf	d0,init_lp2
	addq.l	#1,d2		;step	to spl.
;find samples starts
	lea	moduldta,a0
	lea	1084(a0),a0	;pattern starts		
	lea	spl_starts,a1
	lea	spl_dta_starts,a2
	lsl.l	#8,d2		;mulu 1024
	lsl.l	#2,d2		;step to first spl.
	add.l	d2,a0		;pointer spl.
	moveq	#31,d1
init_lp4:
	moveq	#0,d0
	move.l	a0,(a1)+
	move.l	(a2)+,a3
	move.w	(a3),d0		;len in words
	lsl.w	#1,d0		;in bytes
	add.l	d0,a0
	dbf	d1,init_lp4
;set volym =0
	lea	voice1,a0
	moveq	#0,d0
	move.w	d0,6(a0)
	move.w	d0,28+6(a0)
	move.w	d0,56+6(a0)
	move.w	d0,84+6(a0)
	move.b	d0,songpos
	move.b	d0,counter
	move.w	d0,patternpos
	move.b	#6,songspeed
	rts
;init data.
spl_dta_starts:	blk.l	32,0
spl_starts:	blk.l	32,0
songpos:	dc.b	0
counter:	dc.b	0
patternpos:	dc.w	0
songspeed:	dc.b	0
mod_break:	dc.b	0
even
playmod:
	lea	moduldta,a0
	add.b	#1,counter
	move.b	counter,d0
	cmp.b	songspeed,d0
	blo.L	no_new
new_voice:
	moveq	#0,d0
	moveq	#0,d1
	lea	1084(a0),a1	;first pattern pek
	move.b	d0,counter
	move.b	songpos,d0
	add.l	#950,a0
	move.b	2(a0,d0.w),d0
	move.w	patternpos,d1
	lsl.l	#8,d0		;find right pattern offset.
	lsl.l	#2,d0	

	lea	spl_starts,a2
	lea	spl_dta_starts,a6
	lea	voice1,a4
	bsr.s	playvoice
	addq.w	#4,d1
	lea	voice2,a4
	bsr.s	playvoice
	addq.w	#4,d1
	lea	voice3,a4
	bsr.s	playvoice
	addq.w	#4,d1
	lea	voice4,a4
	bsr.s	playvoice
	addq.w	#4,d1
	move.w d1,patternpos
	
	cmp.w	#1024,d1
	bne.s	not_end_pattern
end_pattern:
	move.w	#0,patternpos
	clr.b	mod_break
	add.b	#1,songpos
	move.b	songpos,d0
	cmp.b	(a0),d0		
	bne.s	not_end_song
end_song:
	move.b	#0,songpos
	move.w	#0,patternpos
not_end_pattern:
not_end_song:
	tst.b	mod_break
	bne.s	end_pattern
	rts
playvoice:
	lea 0(a1,d0.l),a3	;pattern pek	
	add.l	d1,a3		;pattern pos
	move.l	(a3),18(a4)	;lagra ton dta.

	moveq	#0,d2
	moveq	#0,d3
	move.w	18(a4),d2
	move.w	18+2(a4),d3
	and.w	#$f000,d2
	and.w 	#$f000,d3
	lsr.w	#4,d3
	or.w	d3,d2
	lsr.w	#8,d2
	tst.w	d2
	beq.L	old_instr

	sub.w	#1,d2
	lsl.w	#2,d2
	move.l	0(a2,d2.w),a5	;spl start
	move.l	a5,(a4)		;to voicedta
	move.l	a5,d3		;copy spl start
	
	move.l	0(a6,d2.w),a5	;spl dta pek
	move.w	(a5),d2
	
	lsl.w	#1,d2		;len in bytes
	neg.w	d2
	sub.l	d2,(a4)		;andra  spl start
	move.w	d2,4(a4)	;to voicedta
	move.w	2(a5),d2	
	and.w	#$007f,d2	;volyme (mask bort fine tune)
	
	cmp.w	#$40,d2
	ble.s	volmask
	moveq	#$40,d2
volmask:
	move.w	d2,6(a4)	;volym

	moveq	#0,d2
	move.w	4(a5),d2	;rep point
	beq.s	no_loop		;no rep from beginning

	lsl.w	#1,d2		;to bytes.
	add.l	d3,d2		
	move.l	d2,8(a4)	;rep start
	moveq	#0,d4	
	move.w	6(a5),d4	;rel len
	lsl.w	#1,d4		;rep len in bytes
	neg.w	d4
	sub.l	d4,8(a4)	;rep start.
	move.w	d4,12(a4)	;rep dta pek. (len)
	bra.s	looping	
no_loop:	
	move.l	d3,8(a4)		
	moveq	#0,d3
	move.w	6(a5),d3
	sub.w	#1,d3		;kompensation
	lsl.w	#1,d3
	neg.w	d3
	sub.l	d3,8(a4)
	move.w	d3,12(a4)
looping:
	move.w	#0,16(a4)
old_instr:
	move.w	18(a4),d2
	and.w	#$0fff,d2	;note period
	beq.L	mod_command2
	tst.w	4(a4)		;tst spl len
	beq.s	stopsound

	move.b	18+2(a4),d3	;effect command
	and.b	#$0f,d3
	cmp.b	#5,d3
	beq.s	set_port
	cmp.b	#3,d3
	beq.s	set_port

	move.w	d2,14(a4)	;to voicedta
	clr.b	27(a4)
	bra.L	mod_command2
stopsound:
	move.w	#0,6(a4)
	bra.L	mod_command2
no_new:
	lea	voice1,a4
	bsr.L	mod_command
	lea	voice2,a4
	bsr.L	mod_command
	lea	voice3,a4
	bsr.L	mod_command
	lea	voice4,a4
	bsr.L	mod_command
	rts
set_port:
	move.w	18(a4),d2		;period
	and.w	#$0fff,d2
	move.w	d2,22(a4)	;new period?
	move.w	14(a4),d3	;old note period
	clr.b	24(a4)
	cmp.w	d3,d2
	beq.s	mod_clrport
	bge.L	mod_command2
	move.b	#1,24(a4)		;set flag
	bra.L	mod_command2
mod_clrport:
	clr.w	22(a4)
	rts	
mod_port:
	moveq	#0,d3
	move.b	18+3(a4),d2
	beq.s	mod_port2
	move.b	d2,25(a4)
	move.b	d3,18+3(a4)
mod_port2:
	tst.w	22(a4)
	beq.s	mod_rts
	move.b	25(a4),d3
	tst.b	24(a4)
	bne.s	mod_sub
	add.w	d3,14(a4)
	move.w	22(a4),d3
	cmp.w	14(a4),d3
	bgt.s	mod_portok
	move.w	22(a4),14(a4)
	clr.w	22(a4)
mod_portok:
mod_rts:
	rts
mod_sub:
	sub.w	d3,14(a4)
	move.w	22(a4),d3
	cmp.w	14(a4),d3
	blt.s	mod_portok
	move.w	22(a4),14(a4)
	clr.w	22(a4)
	rts
mod_sin:
	dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1
	dc.b $b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
	dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5
	dc.b $b4,$a1,$8d,$78,$61,$4a,$31,$18

mod_vib:
	move.b 18+3(a4),d3
	beq.s	mod_vib2
	move.b	d3,26(a4)
mod_vib2:
	move.b	27(a4),d3
	lsr.w	#2,d3
	and.w	#$1f,d3
	moveq	#0,d2
	lea	mod_sin,a3
	move.b	0(a3,d3.w),d2
	move.b	26(a4),d3
	and.w	#$0f,d3
	mulu 	d3,d2
	lsr.w	#7,d2
	move.w	14(a4),d3
	tst.b	27(a4)
	bmi.s	mod_vibsub
	add.w	d2,d3
	bra.s	mod_vib3
mod_vibsub:
	sub.w	d2,d3
mod_vib3:
	move.w	d3,14(a4)
	move.b	26(a4),d3
	lsr.w	#2,d3
	and.w	#$3c,d3
	add.b	d3,27(a4)
	rts
mod_arplist:
	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

mod_arp:
	moveq	#0,d3
	move.b	counter,d3
	move.b	mod_arplist(pc,d3.w),d3
	beq.s	mod_normper
	cmp.b	#2,d3
	beq.s	mod_arp2
mod_arp1:
	move.b	18+3(a4),d3
	lsr.w	#4,d3
	bra.s	mod_arpdo
mod_arp2:
	move.b	18+3(a4),d3
	and.w	#$0f,d3
mod_arpdo:
	lsl.w	#1,d3
	move.w	14(a4),d2
	lea	mod_periods,a0
mod_arp3:
	cmp.w	(a0)+,d2
	blt.s	mod_arp3
	move.w	-2(a0,d3.w),14(a4)
	rts
mod_normper:
	move.w	14(a4),14(a4)
	rts
mod_command:
	move.w	18+2(a4),d3
	and.w	#$0fff,d3
	beq.s	mod_normper	;normal period
	move.b	18+2(a4),d3
	and.b	#$0f,d3
	beq.s	mod_arp
	cmp.b	#6,d3
	beq.L	mod_volvib
	cmp.b	#4,d3
	beq.L	mod_vib
	cmp.b	#5,d3
	beq.L	mod_volport
	cmp.b	#3,d3
	beq.L	mod_port
	cmp.b	#1,d3
	beq.s	mod_portup
	cmp.b	#2,d3
	beq.s	mod_portdown
	move.w	14(a4),14(a4)	;set period
	cmp.b	#10,d3
	beq.s	mod_volslide
	rts
mod_portup:
	moveq	#0,d2
	move.b	18+3(a4),d2
	sub.w	d2,14(a4)
	move.w	14(a4),d2
	cmp.w	#$71,d2
	bpl.s	mod_portup2
	move.w	#$71,14(a4)
mod_portup2:
	rts
mod_portdown:
	moveq	#0,d2
	move.b	18+3(a4),d2
	add.w	d2,14(a4)
	move.w	14(a4),d2
	cmp.w	#$358,d2
	bmi.s	mod_portdown2
	move.w	#$358,14(a4)
mod_portdown2:
	rts
mod_volvib:
	bsr.L	mod_vib2
	bra.s	mod_volslide
mod_volport:
	bsr.L	mod_port2
mod_volslide:
	moveq	#0,d2
	move.b	18+3(a4),d2
	lsr.b	#4,d2
	tst.b	d2
	beq.s	mod_vol3
	add.w	d2,6(a4)
	cmp.w	#$40,6(a4)
	bmi.s	mod_vol2
	move.w	#$40,6(a4)
mod_vol2:
	move.w	6(a4),6(a4)
	rts
mod_vol3:
	moveq	#0,d2
	move.b	18+3(a4),d2
	and.b	#$0f,d2
	sub.w	d2,6(a4)
	bpl.s	mod_vol4
	clr.w	6(a4)
mod_vol4:
	move.w	6(a4),6(a4)
	rts
mod_command2:
;extra
	tst.w	4(a4)
	bne.L	vol_snd
	move.w	#0,6(a4)	;stop_sound
vol_snd:
;hit	
	moveq	#0,d3
	move.b	18+2(a4),d3
	and.b	#$0f,d3
	beq.L	mod_rts
	cmp.b	#$0e,d3
	beq.s	mod_filter
	cmp.b	#$0d,d3
	beq.s	mod_pattbreak
	cmp.b	#$0b,d3
	beq.s	mod_songjmp
	cmp.b	#$0c,d3
	beq.s	mod_setvol
	cmp.b	#$0f,d3
	beq.s	mod_setspeed
	rts
mod_filter:
	rts			;ej i funk
mod_pattbreak:			
	move.b	#1,mod_break
	rts
mod_songjmp:
	move.b	#1,mod_break
	move.b	18+3(a4),d3
	subq.b	#1,d3
	move.b	d3,songpos
	rts
mod_setvol:
	cmp.b	#$40,18+3(a4)
	ble.s	mod_sv2
	move.b	#$40,18+3(a4)
mod_sv2:
	move.b	18+3(a4),7(a4)	;set volym
;	move.w 6(a4),6(a4)
	rts
mod_setspeed:
	cmp.b	#$1f,18+3(a4)
	ble.s	mod_sp2
	move.b	#$1f,18+3(a4)
mod_sp2:
	moveq	#0,d3
	move.b 18+3(a4),d3
	beq.s	mod_sp3
	move.b	d3,songspeed
	clr.b	counter
mod_sp3:
	rts
mod_periods:
	dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0
	dc.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe
	dc.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087
	dc.w $007f,$0078,$0071,$0000
		
;	spl pek		.l 0
;	spl len in bytes.w 4
;	spl volym	.w 6
;	rep. start	.l 8
;	rep. len	.w 12
;	period		.w 14
;	special		.w 16
;	ton dta		.l 18
;	clc period	.w 22
;	flagga		.b 24
;	flagga		.b 25
;	---"----	.b 26
;	---"----	.b 27
voice1:	blk.b	28,0
voice2:	blk.b	28,0
voice3:	blk.b	28,0
voice4:	blk.b	28,0
Atari_rutin:
;every vbl..
;	move.w #$070,$ff8240
	bsr.L 	setframe
	move.b 	#0,$ff8901
	move.b 	#1,$ff8901
	bsr.L 	bytframe

	move.l 	frames,a5
	bsr.L 	playonatari
;	move.w 	#$-1,$ff8240
	rts
initmusic:
;init make volum control tabel.
	move.w #$40,d0
	lea volymtab+$4100,a0	;endtabell lagra baklanges
init1:
	move.w #$ff,d1
init2:
	move.w d1,d2
	ext.w d2
	muls d0,d2
	divs #$0080,d2
	move.b d2,-(a0)
	dbf d1,init2
	dbf d0,init1
;make period tabel $2e8 longwords 
	lea 	periodtab,a0
	lea 	Hztabvol,a1
	move.l	hz,d5
	lsl.l	#2,d5
	move.l	0(a1,d5.l),a1

	move.w	#$0071,d1
	move.w	#$02e7,d0
	move.l	#$011df98a,d2
init3:
	swap	d2
	moveq	#0,d3
	move.w	d2,d3
	divu	d1,d3
	move.w	d3,d4
	swap	d4
	swap	d2
	move.w	d2,d3
	divu	d1,d3
	move.w	d3,d4
	
	jsr	(a1)	

	move.l d4,(a0)+
	addq.w #1,d1
	dbf d0,init3
do_fastcheck:
	lea	fastcheck,a0
	lea	periodtab,a1
	move.l	hz,d6
	move.l	#250,d7
	lsl.w	d6,d7
	move.w	#$2e7,d0
chlp1:
	move.w	d7,d1		;+1 for security.
	moveq	#0,d4
	moveq	#0,d5
	move.w	(a1)+,d2
	move.w	(a1)+,d3
chlp2:
	add.w	d3,d5
	addx.w	d2,d4
	dbf	d1,chlp2
	move.w	d4,(a0)+
	dbf	d0,chlp1
	rts
twice:
	lsl.l	#1,d4
	rts
norm:	rts
half:
	lsr.l	#1,d4
	rts
Hztabvol:
	dc.l	twice,norm,half

initdma:

	move.l frames+4,d0	;startframe
	bsr.L setframe2
	
	move.l	hz,d0
	move.b	d0,$ff8921	;set frek.
writetodma:
	move.b	#0,$ff8901
	lea	dmadta,a0
	move.w	(a0)+,$ff8924
	bra.s	dmaloop
newdmadta:
	move.w	d0,$ff8922
waitondma:
	tst.w	$ff8922
	bne.s	waitondma
dmaloop:
	move.w	(a0)+,d0
	bne.s	newdmadta
	move.b	#1,$ff8901
	rts
dmadta:
	dc.w 	$0ffe	;mask
	dc.w	$09d1	;master vol	
	dc.w	$0aa9	;left vol
	dc.w	$0a29	;right vol
	dc.w	$090d	;dis -12dB $901 0dB $90d +12dB $919		
	dc.w	$088d	;bas -12dB $881 0dB $88d +12dB $899
	dc.w	$0803	;mix		mixa inte
	dc.w	0
setframe:
	move.l	frames,d0	;startframe
setframe2:
	move.l	d0,d1
	move.l	hz,d2
	move.l	#250,d3
	lsl.l	d2,d3	
	add.l 	d3,d1

	move.b	d0,$ff8907
	lsr.l	#8,d0
	move.b	d0,$ff8905
	lsr.l	#8,d0
	move.b	d0,$ff8903

	move.b	d1,$ff8913
	lsr.l	#8,d1
	move.b	d1,$ff8911
	lsr.l	#8,d1
	move.b	d1,$ff890f
	rts
bytframe:
	move.l	frames,d0
	move.l	frames+4,d1
	exg	d0,d1
	move.l	d0,frames
	move.l	d1,frames+4
	rts
frames:
	dc.l frame1,frame2
faster1:macro
	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	move.w	d4,(a5)+

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	move.w	d4,(a5)+

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	move.w	d4,(a5)+

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	move.w	d4,(a5)+

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	move.w	d4,(a5)+
endm
faster2:macro
	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b08
	move.w	d6,d1
	move.l 	d5,a0
	addq.w	#2,a5
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.w	d4,(a5)+

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b08
	move.w	d6,d1
	move.l 	d5,a0
	addq.w	#2,a5
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.w	d4,(a5)+

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b08
	move.w	d6,d1
	move.l 	d5,a0
	addq.w	#2,a5
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.w	d4,(a5)+

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b08
	move.w	d6,d1
	move.l 	d5,a0
	addq.w	#2,a5
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.w	d4,(a5)+

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b08
	move.w	d6,d1
	move.l 	d5,a0
	addq.w	#2,a5
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.w	d4,(a5)+
endm
faster3:macro
	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$6008
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),(a5)
	addq.w	#2,a5

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$6008
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),(a5)
	addq.w	#2,a5

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$6008
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),(a5)
	addq.w	#2,a5

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$6008
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),(a5)
	addq.w	#2,a5

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$6008
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),(a5)
	addq.w	#2,a5
endm
faster4:macro
	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5

	add.w 	d2,d0
	addx.w 	d3,d1
	dc.w 	$6b06
	move.w	d6,d1
	move.l 	d5,a0
	dc.w 	$600a
	move.b 	$0(a0,d1.l),d4
	move.b 	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5
endm
fastest1:macro
	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	move.w	d4,(a5)+

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	move.w	d4,(a5)+

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	move.w	d4,(a5)+

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	move.w	d4,(a5)+

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	move.w	d4,(a5)+
endm
fastest2:macro
	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.w	d4,(a5)+

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.w	d4,(a5)+

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.w	d4,(a5)+

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.w	d4,(a5)+

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.w	d4,(a5)+
endm
fastest3:macro
	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),(a5)
	addq.w	#2,a5

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),(a5)
	addq.w	#2,a5

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),(a5)
	addq.w	#2,a5

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),(a5)
	addq.w	#2,a5

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),(a5)
	addq.w	#2,a5
endm
fastest4:macro
	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5

	add.w	d2,d0
	addx.w	d3,d1
	move.b	$0(a0,d1.l),d4
	move.b	$0(a1,d4.l),d4
	add.b	d4,(a5)
	addq.w	#2,a5
endm
playonatari:
;en svordom
kuken:
	move.l	a5,a3
	bsr.l	no_volym
	lea	periodtab,a2
	sub.l	#$1c4,a2
	lea 	volymtab,a4
;CHANNEL 1
playitlp1:
	move.l	a3,a5
	moveq	#0,d0
	moveq	#0,d1
	lea 	fastcheck,a6

	move.l voice1,a0	;spl location
	move.w voice1+4,d1	;kvar av smp.
	move.w voice1+16,d0
	move.w voice1+14,d4;ton hojd
	and.w #$0fff,d4
	add.w d4,d4
	move.w	0(a6,d4.w),d5	;fast check offset.
	add.w d4,d4
	move.w 0(a2,d4.w),d3	;konvert perid
	move.w 2(a2,d4.w),d2
	
	move.w voice1+6,d4	;volym
	st	volymflag1
	tst.w	d4
	bne.s	volymon1
	sf	volymflag1
volymon1:	
	lsl.w #8,d4
	lea 0(a4,d4.w),a1
	moveq #0,d4
	
	lea	fastsound1,a6
	move.w	d3,d6
	lsl.w	#1,d5
	add.w	d5,d6
	move.w	d1,d5
	add.w	d6,d5
	bmi.s	no_fasts1	
	lea	sound1,a6
no_fasts1:	
	move.l 	voice1+8,d5	;repeat offset
	move.w	voice1+12,d6

	tst.b	volymflag1
	bne.s	volym1
	bra.s	volym2_1
volym1:	
	tst.w	d1
	beq.L	volym2_1
	moveq	#0,d4

	move.l	hz,d4
	cmp.l	#0,d4
	beq.s	one_1
	cmp.l	#1,d4
	beq.s	two_1
	jsr 	(a6)
	jsr 	(a6)
two_1:
	jsr 	(a6)
one_1:
	jsr 	(a6)
volym2_1:
	move.l	a0,voice1
	move.w d1,voice1+4
	move.w d0,voice1+16
;CHANNEL 2
playitlp2:
	move.l	a3,a5
	moveq	#0,d0
	moveq	#0,d1
	lea 	fastcheck,a6

	move.l voice2,a0	;spl location
	move.w voice2+4,d1	;kvar av smp.
	move.w voice2+16,d0
	move.w voice2+14,d4;ton hojd
	and.w #$0fff,d4
	add.w d4,d4
	move.w	0(a6,d4.w),d5	;fast check offset.
	add.w d4,d4
	move.w 0(a2,d4.w),d3	;konvert perid
	move.w 2(a2,d4.w),d2
	
	move.w voice2+6,d4	;volym
	st	volymflag2
	tst.w	d4
	bne.s	volymon2
	sf	volymflag2
volymon2:	
	lsl.w #8,d4
	lea 0(a4,d4.w),a1
	moveq #0,d4
	
	lea	fastsound2,a6
	move.w	d3,d6
	lsl.w	#1,d5
	add.w	d5,d6
	move.w	d1,d5
	add.w	d6,d5
	bmi.s	no_fasts2	
	lea	sound2,a6
no_fasts2:	
	move.l 	voice2+8,d5	;repeat offset
	move.w	voice2+12,d6

	tst.b	volymflag2
	bne.s	volym2
	bra.s	volym2_2
volym2:	
	tst.w	d1
	beq.L	volym2_2
	moveq	#0,d4

	move.l	hz,d4
	cmp.l	#0,d4
	beq.s	one_2
	cmp.l	#1,d4
	beq.s	two_2
	jsr 	(a6)
	jsr 	(a6)
two_2:
	jsr 	(a6)
one_2:
	jsr 	(a6)
volym2_2:
	move.l	a0,voice2
	move.w d1,voice2+4
	move.w d0,voice2+16
;CHANNEL 3
playitlp3:
	move.l	a3,a5
	moveq	#0,d0
	moveq	#0,d1
	lea 	fastcheck,a6

	move.l voice3,a0	;spl location
	move.w voice3+4,d1	;kvar av smp.
	move.w voice3+16,d0
	move.w voice3+14,d4;ton hojd
	and.w #$0fff,d4
	add.w d4,d4
	move.w	0(a6,d4.w),d5	;fast check offset.
	add.w d4,d4
	move.w 0(a2,d4.w),d3	;konvert perid
	move.w 2(a2,d4.w),d2
	
	move.w voice3+6,d4	;volym
	st	volymflag3
	tst.w	d4
	bne.s	volymon3
	sf	volymflag3
volymon3:	
	lsl.w #8,d4
	lea 0(a4,d4.w),a1
	moveq #0,d4
	
	lea	fastsound3,a6
	move.w	d3,d6
	lsl.w	#1,d5
	add.w	d5,d6
	move.w	d1,d5
	add.w	d6,d5
	bmi.s	no_fasts3	
	lea	sound3,a6
no_fasts3:	
	move.l 	voice3+8,d5	;repeat offset
	move.w	voice3+12,d6

	tst.b	volymflag3
	bne.s	volym3
	bra.s	volym2_3
volym3:	
	tst.w	d1
	beq.L	volym2_3
	moveq	#0,d4

	move.l	hz,d4
	cmp.l	#0,d4
	beq.s	one_3
	cmp.l	#1,d4
	beq.s	two_3
	jsr 	(a6)
	jsr 	(a6)
two_3:
	jsr 	(a6)
one_3:
	jsr 	(a6)
volym2_3:
	move.l	a0,voice3
	move.w d1,voice3+4
	move.w d0,voice3+16
;CHANNEL 4
playitlp4:
	move.l	a3,a5
	moveq	#0,d0
	moveq	#0,d1
	lea 	fastcheck,a6

	move.l voice4,a0	;spl location
	move.w voice4+4,d1	;kvar av smp.
	move.w voice4+16,d0
	move.w voice4+14,d4;ton hojd
	and.w #$0fff,d4
	add.w d4,d4
	move.w	0(a6,d4.w),d5	;fast check offset.
	add.w d4,d4
	move.w 0(a2,d4.w),d3	;konvert perid
	move.w 2(a2,d4.w),d2
	
	move.w voice4+6,d4	;volym
	st	volymflag4
	tst.w	d4
	bne.s	volymon4
	sf	volymflag4
volymon4:	
	lsl.w #8,d4
	lea 0(a4,d4.w),a1
	moveq #0,d4
	
	lea	fastsound4,a6
	move.w	d3,d6
	lsl.w	#1,d5
	add.w	d5,d6
	move.w	d1,d5
	add.w	d6,d5
	bmi.s	no_fasts4	
	lea	sound4,a6
no_fasts4:	
	move.l 	voice4+8,d5	;repeat offset
	move.w	voice4+12,d6

	tst.b	volymflag4
	bne.s	volym4
	bra.s	volym2_4
volym4:	
	tst.w	d1
	beq.L	volym2_4
	moveq	#0,d4

	move.l	hz,d4
	cmp.l	#0,d4
	beq.s	one_4
	cmp.l	#1,d4
	beq.s	two_4
	jsr 	(a6)
	jsr 	(a6)
two_4:
	jsr 	(a6)
one_4:
	jsr 	(a6)
volym2_4:

	move.l	a0,voice4
	move.w d1,voice4+4
	move.w d0,voice4+16

	rts
volymflag1:
	dc.b 	0
volymflag2:
	dc.b	0
volymflag3:
	dc.b 	0
volymflag4:
	dc.b	0

even
sound1:
;	move.w	#$f00,$ff8240
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	faster1
	rts
sound2:
;	move.w	#$f00,$ff8240
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	faster2
	rts
sound3:
;	move.w	#$f00,$ff8240
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	faster3
	rts
sound4:
;	move.w	#$f00,$ff8240
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	faster4
	rts
fastsound1:
;	move.w	#$ff0,$ff8240
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	fastest1
	rts
fastsound2:
;	move.w	#$ff0,$ff8240
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	fastest2
	rts
fastsound3:
;	move.w	#$ff0,$ff8240
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	fastest3
	rts
fastsound4:
;	move.w	#$ff0,$ff8240
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	fastest4
	rts
no_volym:
;	move.w	#$00f,$ff8240
blitter:
	move.l	a3,$ff8a32
	move.b	#0,$ff8a3b
	move.w	#1,$ff8a38
	move.w	#125,d0
	move.l	hz,d1
	lsl.w	d1,d0
	move.w	d0,$ff8a36
	move.w	#2,$ff8a2e
	move.w	#2,$ff8a30
	move.b	#$c0,$ff8a3c
	rts
;uppspelnings frekvens
;0 = 6.25 kHz in stereo
;1 = 12.5 kHz in stereo
;2 = 25.0 kHz in stereo

hz:	dc.l	0
volymtab:
	blk.b	$4100,0
periodtab:
	blk.l	$2e8,0
fastcheck:
	blk.w	$2e8,0
frame1:
	blk.b	1000,0
frame2:
	blk.b	1000,0

