;
; Demo grafico/sonoro (di Pierluigi Montanari)
; (cfr. AmigaByte 38, "Il trattamento delle immagini")
;
; Per assemblare con il SEKA ASSEMBLER
;
; 1) caricare l'assemblatore
; 2) alle domande iniziali rispondere CHIP (tipo di memoria) e 380
;    (workspace)
; 3) caricare il sorgente con il comando R seguito dal nome del file senza
;    estensione (es.: R [return] AmigaByte_38:Listati/Demo [return])
; 4) assemblare il programma con il comando A (battere solo return alla
;    richiesta "Options")
; 5) salvare su disco il file binario generato con il comando WI seguito dal
;    nome del file che gli si vuole attribuire e dalle label START ed END
;    che indicano le locazioni iniziale e finale del codice.

org	$40000
load	$40000

Start:	movem.l d0-d7/a0-a6,-(a7)	;iniziamo!....
	bsr	punta_plan		;posizioniamo i puntatori ai bitplanes
	bsr	mt_init			;ed inizializziamo i canali audio
	move.l $4,a6
	lea gfxname,a1
	clr.l d0
	jsr -552(a6)			;apertura della libreria grafica
	move.l d0,gfxbase
	add.l #$32,d0
	move.l d0,a0			;salviamo il vecchio indirizzo della
	move.l (a0),OldCopL		;copperlist e lo sostituiamo con il
	move.l #CopList0,(a0)		;nostro, quindi saltiamo alla
	bsr	FadeIo			;routine di Fade e visualizzazione
	move.l gfxbase,d0
	add.l #$32,d0
	move.l d0,a0
	move.l OldCopL,(a0)		;ripristiniamo la vecchia copperlist
	move.l $4,a6
	move.l gfxbase,a1
	jsr -414(a6)			;chiudiamo la libreria grafica
	movem.l (a7)+,d0-d7/a0-a6	;ed usciamo...	
	rts

Mouse:	cmp.b	#$f0,$dff006		;aspettiamo che il vertical beam
 					;raggiunga la linea di raster $f0		
	bne.s	mouse
	bsr	mt_music		;suoniamo la musica
	btst #6,$bfe001			;controlliamo se e' premuto il tasto
	bne Mouse			;sinistro del mouse... se si'
	bsr	mt_end			;spegniamo i canali audio
	rts				;e ritorniamo.

GfxName:dc.b 'graphics.library',0	;nome della libreria grafica
even				
GfxBase:dc.l 0
OldCopL: dc.l 0				;spazio per il puntatore alla vecchia
					;copperlist
Punta_Plan:		
	move.l	#picture,d0		;preleviamo l' indirizzo del disegno
	move.l	#bpl_ptr,a1		;e l' indirizzo (nella copperlist)
;*** primo bitplane ***
	move.w	d0,6(a1)		;dei puntatori ai bitplanes.
	swap	d0			;Poniamo la word bassa dell' indirizzo
	move.w	d0,2(a1)		;in BPL1PTL, poi, tramite l' istruzione
	swap	d0			;'swap d0' scambiamo la word alta in
	addi.l	#10240,d0		;d0 (e quindi i bits 16-31) con la word
	addi.l	#8,a1			;bassa (i bits 0-15). A questo punto

;*** qui si potrebbe creare un loop ***

;*** secondo bitplane ***
	move.w	d0,6(a1)		;la word bassa in D0 contiene la parte
	swap	d0			;alta dell' indirizzo del primo
	move.w	d0,2(a1)		;bitplane del disegno, e la poniamo
	swap	d0			;in BPL1PTH. A questo punto, con un
	addi.l	#10240,d0		;altro 'swap d0' riportiamo lo
	addi.l	#8,a1			;indirizzo del primo bitplane del	
;*** terzo bitplane ***
	move.w	d0,6(a1)		;disegno alla forma originale
	swap	d0			;(ovvero la parte alta dello
	move.w	d0,2(a1)		;indirizzo del primo bitplane del
	swap	d0			;disegno nei bit 16-31 di d0) ed
	addi.l	#10240,d0		;aggiungiamo un valore (in questo
	addi.l	#8,a1			;caso #10240) che dipende dalla
;*** quarto bitplane ***
	move.w	d0,6(a1)		;risoluzione del disegno. Questo per
	swap	d0			;ottenere l' indirizzo del prossimo
	move.w	d0,2(a1)		;bitplane nel disegno.	
	swap	d0			;A questo punto aggiungiamo 8 bytes ad
	addi.l	#10240,d0		;A1 e saltiamo al prossimo puntatore
	addi.l	#8,a1			;ai bitplanes, ripetendo il tutto per
					;quanti bitplanes occorrono
;*** quinto bitplane ***
	move.w	d0,6(a1)		;NOTA: tutto questo si puo' ottenere
	swap	d0			;con un loop... provate a farlo nel
	move.w	d0,2(a1)		;punto indicato!!
	swap	d0
	addi.l	#10240,d0
	addi.l	#8,a1		
				
;*** sesto bitplane ***
	move.w	d0,6(a1)	
	swap	d0		
	move.w	d0,2(a1)	
	rts


CopList0:
	dc.w 	$0100,%0110000000000000	; BPLCON0 = 6 bitplane
	dc.w	$0102,$0000		; BPLCON1 = 0 (per ora non interessa)
	dc.w	$0104,$0000		; BPLCON2 = 0 ( "   "   "    "   "  )
	dc.w	$0108,$0000		; BPL1MOD = modulo planes dispari 0
	dc.w	$010a,$0000		; BPL2MOD = modulo planes pari 0
	dc.w	$008E,$2c41		; DIWSTRT = $2c41 \valori scelti per centrare            
	dc.w	$0090,$2cc1		; DIWSTOP = $2cc1 /l' immagine....
	dc.w 	$0092,$003c		; DDFSTRT = $003c
	dc.w	$0094,$00d4		; DDFSTOP = $00d4
bpl_ptr:dc.w $e0,0,$e2,0		;primo 	 bitplane
	dc.w $e4,0,$e6,0		;secondo    "
	dc.w $e8,0,$ea,0		;terzo	    "
	dc.w $ec,0,$ee,0		;quarto	    "
	dc.w $f0,0,$f2,0		;quinto	    "	
	dc.w $f4,0,$f6,0		;sesto	    "
fdouts:					;queste labels servono per le
fadeins:				;routines di Fade in-out
	dc.w	$0180,$0000,$0182,$0000,$0184,$0000,$0186,$0000
	dc.w	$0188,$0000,$018A,$0000,$018C,$0000,$018E,$0000
	dc.w	$0190,$0000,$0192,$0000,$0194,$0000,$0196,$0000
	dc.w	$0198,$0,$019a,$0,$019c,$0,$019e,$0
	dc.w	$01a0,$0,$01a2,$0,$01a4,$0,$01a6,$0
	dc.w	$01a8,$0,$01aa,$0,$01ac,$0,$01ae,$0
	dc.w	$01b0,$0,$01b2,$0,$01b4,$0,$01b6,$0
	dc.w	$01b8,$0,$01ba,$0,$01bc,$0,$01be,$0
fadeine:
fdoute:
	dc.w	0,0,0,0
	dc.l	-2			;fine della copperlist

*******************************************************************************
* ROUTINE FADEIN-OUT
*******************************************************************************
FadeIO:	movem.l d0-d7/a0-a6,-(a7)	;salviamo i registri
	bsr	fadein			;routine fadein
	bsr	Mouse			;aspettiamo la pressione del mouse
	bsr	fadeout			;routine fadeout
	movem.l (a7)+,d0-d7/a0-a6	;uscita e ripristino puntatori
	rts

Fadein: move.l	#fadeins-2,a0		;indirizzo della word precedente le
					;labels 'fadeins' nella copperlist e
					;'fadein0', label alla quale porre i
					;colori del disegno che successivamente
	move.l	#fadein0-2,a1		;saranno impiegati dalla routine.
fadein4:addi.l	#4,a0			;ora aggiungiamo 4 bytes ad a0 (per
					;puntare alla word che rappresenta il
					;colore nella copperlist) e 2 bytes ad
					;a1 (per puntare alla word che
					;rappresenta il colore nella tabella 
	addi.l	#2,a1			;colori). Prendiamo il colore dalla
	move.w	(a0),d0			;copperlist ed il colore dalla
	move.w	(a1),d1			;tabella. 	
	cmpi.w	d0,d1			;Se non sono uguali (ovvero il colore
	bne	fadein3			;nella copperlist non ha traggiunto
	cmpi.l	#fadeine,a0		;una intensita' pari a quello nella
	bls	fadein4			;tabella) saltiamo a fadein3. Se il
					;colore e' a posto vediamo se siamo
					;giunti alla fine dei colori da
					;processare nella copperlist (label
	rts				;fadeine), altrimenti continuiamo.					;saranno usati.	

fadein3:moveq	#0,d2			;Puliamo d2 e consideriamo solo la
	andi.w	#%0000000000001111,d1	;componente BLUE dei colori caricati
	andi.w	#%0000000000001111,d0	;in d0 e d1. Se tale componente e'
	cmp.w	d0,d1			;uguale, la lasciamo inalterata,
	beq	fadein5			;altrimneti incrementiamo di una
	addi.w	#1,d0			;unita' quella in d0 (della copperlist).
fadein5:move.w	d0,d2			;Ora poniamo d0 in d2 (o, meglio, la
	move.w	(a0),d0			;componente BLUE) e ripristiniamo i
	move.w	(a1),d1			;registri, considerando questa volta
	andi.w	#%0000000011110000,d1	;la componente GREEN di entrambi ed
	andi.w	#%0000000011110000,d0	;incrementando tale componente nel caso
	cmpi.w	d0,d1			;non siano uguali, quindi la sommiamo
	beq	fadein6			;a quella BLUE precedentemente
	addi.w	#%0000000000010000,d0	;calcolata ( in d2). Lo stesso discorso
fadein6:addi.w	d0,d2			;vale per la componente RED.
	move.w	(a0),d0
	move.w	(a1),d1
	andi.w	#%0000111100000000,d1
	andi.w	#%0000111100000000,d0
	cmpi.w	d0,d1
	beq	fadein7
	addi.w	#%0000000100000000,d0
fadein7:addi.w	d0,d2
	move.w	d2,(a0)			;Ora poniamo d2 nella copperlist.
fadein8:addi.l	#4,a0			;Passiamo al prossimo colore nella 
	cmpi.l	#fadeine,a0		;copperlist. Se superiamo la label 
	bhi	fadein2			;fadeine, saltiamo a fadein2,	
	addi.l	#2,a1			;altrimenti consideriamo il prossimo
					;colore nella tabella.
	move.w	(a0),d0			;Prendiamo il colore dalla copperlist
	move.w	(a1),d1			;e dalla tabella. 	
	cmpi.w	d0,d1			;Se sono uguali	continuiamo col prossimo
	beq	fadein8			;altrimenti li processiamo come prima.
	bra	fadein3
fadein2:
	move.l	#$10000,a3		;e' un semplicissimo ciclo di attesa...
fdein10:move.b	(a3)+,d3
	cmpi.l	#$16000,a3
	bls	fdein10
	bra	Fadein			;ripetiamo il tutto!!!!!
FadeOut:move.l	#fdouts-2,a0		;puntiamo alla word precedente la
					;label fdouts con il registro a0 
fadout2:addi.l	#4,a0			;adesso sommiamo quattro bytes
					;e puntiamo al primo colore nella
	cmpi.w	#0,(a0)			;copperlist. Se e' nullo controlliamo
	bne	fadout1			;se siamo giunti alla fine della
	cmpi.l	#fdoute,a0		;tabella colori (nella copperlist) e
	bls	fadout2			;ripetiamo il tutto, altrimenti saltiamo
	rts				;alla routine fadout1.
fadout1:move.w	(a0),d0			;Prendiamo il colore, lo poniamo in d0.
	moveq	#0,d1			;E' nullo? Se e' cosi' prendiamo il	
	cmpi.w	#0,d0			;successivo, altrimenti sottraiamo prima
	beq	fadout5			;una unita' dalla componente BLUE, poi
	andi.w	#%0000000000001111,d0	;dalla componente GREEN ed infine dalla
	beq	fadout3			;componente RED del colore.
	subi.w	#1,d0
	move.w	d0,d1
fadout3:move.w	(a0),d0
	andi.w	#%0000000011110000,d0
	beq	fadout4
	subi.w	#%0000000000010000,d0
	addi.w	d0,d1	
fadout4:move.w	(a0),d0
	andi.w	#%0000111100000000,d0
	beq	fadout5
	subi.w	#%0000000100000000,d0
	addi.w	d0,d1
fadout5:move.w	d1,(a0)			;adesso riponiamo il colore (con le 
	addi.l	#4,a0			;componenti variate) nella copperlist 
	cmpi.l	#fdoute,a0		;e vediamo se, per caso, siamo giunti
	bls	fadout1			;alla fine della medesima. Se e' cosi'
	move.l	#$10000,a0		;aspettiamo un po' e ripetiamo il 
fadout6:move.b	(a0)+,d0		;ciclo.
	cmpi.l	#$15000,a0
	bls	fadout6
	bra	fadeout	

fadein1:blk.w	32,0			;Zona di lavoro per la routine di 
					;fadein.

fadein0:

;A partire da questa label viene posta la colormap del disegno. La prima
;word rappresenta il valore finale da porre in COLOR00, la seconda il valore
;da porre in COLOR01 e cosi' di seguito.

	dc.w	$0000,$0eca,$0f00,$0c00,$0700,$0f40,$0f62,$0f84
	dc.w	$0fa7,$0fca,$0fdc,$0ff1,$0f33,$0915,$0604,$0c13
	dc.w	$0e00,$0e09,$0b07,$0906,$0f22,$0a31,$0821,$0800
	dc.w	$0800,$0500,$0f93,$0fb3,$0fd3,$0fff,$0ccc,$0999
fdein11:dc.w	0,0			;label che segna la fine della mappa
					;colori.
******************************************************************************
* Questa che vedete e' la famosa routine REPLAY del NOISETRACKER. Non e' scopo
* di questa puntata spiegarla, per cui sappiate che:
* sono accettate tutte le musiche del soundtracker, noisetracker, startrekker
* per inizializzare i canali audio deve essere eseguito un 'bsr mt_init'
* per suonare la musica bisogna eseguire un 'bsr mt_music' durante un vertical
* blank oppure in un ciclo di interrupt
* per terminare la musica bisogna eseguire un 'bsr mt_end'
* i dati della musica vanno posti in memoria alla label 'mt_data'
******************************************************************************
mt_init:lea	mt_data,a0
	move.l	a0,a1
	add.l	#$3b8,a1
	moveq	#$7f,d0
	moveq	#0,d1
mt_loop:move.l	d1,d2
	subq.w	#1,d0
mt_lop2:move.b	(a1)+,d1
	cmp.b	d2,d1
	bgt.s	mt_loop
	dbf	d0,mt_lop2
	addq.b	#1,d2

	lea	mt_samplestarts(pc),a1
	asl.l	#8,d2
	asl.l	#2,d2
	add.l	#$43c,d2
	add.l	a0,d2
	move.l	d2,a2
	moveq	#$1e,d0
mt_lop3:clr.l	(a2)
	move.l	a2,(a1)+
	moveq	#0,d1
	move.w	42(a0),d1
	asl.l	#1,d1
	add.l	d1,a2
	add.l	#$1e,a0
	dbf	d0,mt_lop3

	or.b	#$2,$bfe001
	move.b	#$6,mt_speed
	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	clr.b	mt_songpos
	clr.b	mt_counter
	clr.w	mt_pattpos
	rts

mt_end:	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	move.w	#$f,$dff096
	rts

mt_music:
	movem.l	d0-d4/a0-a3/a5-a6,-(a7)
	lea	mt_data,a0
	addq.b	#$1,mt_counter
	move.b	mt_counter,D0
	cmp.b	mt_speed,D0
	blt.s	mt_nonew
	clr.b	mt_counter
	bra	mt_getnew

mt_nonew:
	lea	mt_voice1(pc),a6
	lea	$dff0a0,a5
	bsr	mt_checkcom
	lea	mt_voice2(pc),a6
	lea	$dff0b0,a5
	bsr	mt_checkcom
	lea	mt_voice3(pc),a6
	lea	$dff0c0,a5
	bsr	mt_checkcom
	lea	mt_voice4(pc),a6
	lea	$dff0d0,a5
	bsr	mt_checkcom
	bra	mt_endr

mt_arpeggio:
	moveq	#0,d0
	move.b	mt_counter,d0
	divs	#$3,d0
	swap	d0
	cmp.w	#$0,d0
	beq.s	mt_arp2
	cmp.w	#$2,d0
	beq.s	mt_arp1

	moveq	#0,d0
	move.b	$3(a6),d0
	lsr.b	#4,d0
	bra.s	mt_arp3
mt_arp1:moveq	#0,d0
	move.b	$3(a6),d0
	and.b	#$f,d0
	bra.s	mt_arp3
mt_arp2:move.w	$10(a6),d2
	bra.s	mt_arp4
mt_arp3:asl.w	#1,d0
	moveq	#0,d1
	move.w	$10(a6),d1
	lea	mt_periods(pc),a0
	moveq	#$24,d7
mt_arploop:
	move.w	(a0,d0.w),d2
	cmp.w	(a0),d1
	bge.s	mt_arp4
	addq.l	#2,a0
	dbf	d7,mt_arploop
	rts
mt_arp4:move.w	d2,$6(a5)
	rts

mt_getnew:
	lea	mt_data,a0
	move.l	a0,a3
	move.l	a0,a2
	add.l	#$c,a3
	add.l	#$3b8,a2
	add.l	#$43c,a0

	moveq	#0,d0
	move.l	d0,d1
	move.b	mt_songpos,d0
	move.b	(a2,d0.w),d1
	asl.l	#8,d1
	asl.l	#2,d1
	add.w	mt_pattpos,d1
	clr.w	mt_dmacon

	lea	$dff0a0,a5
	lea	mt_voice1(pc),a6
	bsr.s	mt_playvoice
	lea	$dff0b0,a5
	lea	mt_voice2(pc),a6
	bsr.s	mt_playvoice
	lea	$dff0c0,a5
	lea	mt_voice3(pc),a6
	bsr.s	mt_playvoice
	lea	$dff0d0,a5
	lea	mt_voice4(pc),a6
	bsr.s	mt_playvoice
	bra	mt_setdma

mt_playvoice:
	move.l	(a0,d1.l),(a6)
	addq.l	#4,d1
	moveq	#0,d2
	move.b	$2(a6),d2
	and.b	#$f0,d2
	lsr.b	#4,d2
	move.b	(a6),d0
	and.b	#$f0,d0
	or.b	d0,d2
	tst.b	d2
	beq.s	mt_setregs
	moveq	#0,d3
	lea	mt_samplestarts(pc),a1
	move.l	d2,d4
	subq.l	#$1,d2
	asl.l	#2,d2
	mulu	#$1e,d4
	move.l	(a1,d2.l),$4(a6)
	move.w	(a3,d4.l),$8(a6)
	move.w	$2(a3,d4.l),$12(a6)
	move.w	$4(a3,d4.l),d3
	tst.w	d3
	beq.s	mt_noloop
	move.l	$4(a6),d2
	asl.w	#1,d3
	add.l	d3,d2
	move.l	d2,$a(a6)
	move.w	$4(a3,d4.l),d0
	add.w	$6(a3,d4.l),d0
	move.w	d0,8(a6)
	move.w	$6(a3,d4.l),$e(a6)
	move.w	$12(a6),$8(a5)
	bra.s	mt_setregs
mt_noloop:
	move.l	$4(a6),d2
	add.l	d3,d2
	move.l	d2,$a(a6)
	move.w	$6(a3,d4.l),$e(a6)
	move.w	$12(a6),$8(a5)
mt_setregs:
	move.w	(a6),d0
	and.w	#$fff,d0
	beq	mt_checkcom2
	move.b	$2(a6),d0
	and.b	#$F,d0
	cmp.b	#$3,d0
	bne.s	mt_setperiod
	bsr	mt_setmyport
	bra	mt_checkcom2
mt_setperiod:
	move.w	(a6),$10(a6)
	and.w	#$fff,$10(a6)
	move.w	$14(a6),d0
	move.w	d0,$dff096
	clr.b	$1b(a6)

	move.l	$4(a6),(a5)
	move.w	$8(a6),$4(a5)
	move.w	$10(a6),d0
	and.w	#$fff,d0
	move.w	d0,$6(a5)
	move.w	$14(a6),d0
	or.w	d0,mt_dmacon
	bra	mt_checkcom2

mt_setdma:
	move.w	#$12c,d0
mt_wait:dbf	d0,mt_wait
	move.w	mt_dmacon,d0
	or.w	#$8000,d0
	move.w	d0,$dff096
	move.w	#$12c,d0
mt_wai2:dbf	d0,mt_wai2
	lea	$dff000,a5
	lea	mt_voice4(pc),a6
	move.l	$a(a6),$d0(a5)
	move.w	$e(a6),$d4(a5)
	lea	mt_voice3(pc),a6
	move.l	$a(a6),$c0(a5)
	move.w	$e(a6),$c4(a5)
	lea	mt_voice2(pc),a6
	move.l	$a(a6),$b0(a5)
	move.w	$e(a6),$b4(a5)
	lea	mt_voice1(pc),a6
	move.l	$a(a6),$a0(a5)
	move.w	$e(a6),$a4(a5)

	add.w	#$10,mt_pattpos
	cmp.w	#$400,mt_pattpos
	bne.s	mt_endr
mt_nex:	clr.w	mt_pattpos
	clr.b	mt_break
	addq.b	#1,mt_songpos
	and.b	#$7f,mt_songpos
	move.b	mt_songpos,d1
	cmp.b	mt_data+$3b6,d1
	bne.s	mt_endr
	clr.b	mt_songpos
mt_endr:tst.b	mt_break
	bne.s	mt_nex
	movem.l	(a7)+,d0-d4/a0-a3/a5-a6
	rts

mt_setmyport:
	move.w	(a6),d2
	and.w	#$fff,d2
	move.w	d2,$18(a6)
	move.w	$10(a6),d0
	clr.b	$16(a6)
	cmp.w	d0,d2
	beq.s	mt_clrport
	bge.s	mt_rt
	move.b	#$1,$16(a6)
	rts
mt_clrport:
	clr.w	$18(a6)
mt_rt:	rts

mt_myport:
	move.b	$3(a6),d0
	beq.s	mt_myslide
	move.b	d0,$17(a6)
	clr.b	$3(a6)
mt_myslide:
	tst.w	$18(a6)
	beq.s	mt_rt
	moveq	#0,d0
	move.b	$17(a6),d0
	tst.b	$16(a6)
	bne.s	mt_mysub
	add.w	d0,$10(a6)
	move.w	$18(a6),d0
	cmp.w	$10(a6),d0
	bgt.s	mt_myok
	move.w	$18(a6),$10(a6)
	clr.w	$18(a6)
mt_myok:move.w	$10(a6),$6(a5)
	rts
mt_mysub:
	sub.w	d0,$10(a6)
	move.w	$18(a6),d0
	cmp.w	$10(a6),d0
	blt.s	mt_myok
	move.w	$18(a6),$10(a6)
	clr.w	$18(a6)
	move.w	$10(a6),$6(a5)
	rts

mt_vib:	move.b	$3(a6),d0
	beq.s	mt_vi
	move.b	d0,$1a(a6)

mt_vi:	move.b	$1b(a6),d0
	lea	mt_sin(pc),a4
	lsr.w	#$2,d0
	and.w	#$1f,d0
	moveq	#0,d2
	move.b	(a4,d0.w),d2
	move.b	$1a(a6),d0
	and.w	#$f,d0
	mulu	d0,d2
	lsr.w	#$6,d2
	move.w	$10(a6),d0
	tst.b	$1b(a6)
	bmi.s	mt_vibmin
	add.w	d2,d0
	bra.s	mt_vib2
mt_vibmin:
	sub.w	d2,d0
mt_vib2:move.w	d0,$6(a5)
	move.b	$1a(a6),d0
	lsr.w	#$2,d0
	and.w	#$3c,d0
	add.b	d0,$1b(a6)
	rts

mt_nop:	move.w	$10(a6),$6(a5)
	rts

mt_checkcom:
	move.w	$2(a6),d0
	and.w	#$fff,d0
	beq.s	mt_nop
	move.b	$2(a6),d0
	and.b	#$f,d0
	tst.b	d0
	beq	mt_arpeggio
	cmp.b	#$1,d0
	beq.s	mt_portup
	cmp.b	#$2,d0
	beq	mt_portdown
	cmp.b	#$3,d0
	beq	mt_myport
	cmp.b	#$4,d0
	beq	mt_vib
	move.w	$10(a6),$6(a5)
	cmp.b	#$a,d0
	beq.s	mt_volslide
	rts

mt_volslide:
	moveq	#0,d0
	move.b	$3(a6),d0
	lsr.b	#4,d0
	tst.b	d0
	beq.s	mt_voldown
	add.w	d0,$12(a6)
	cmp.w	#$40,$12(a6)
	bmi.s	mt_vol2
	move.w	#$40,$12(a6)
mt_vol2:move.w	$12(a6),$8(a5)
	rts

mt_voldown:
	moveq	#0,d0
	move.b	$3(a6),d0
	and.b	#$f,d0
	sub.w	d0,$12(a6)
	bpl.s	mt_vol3
	clr.w	$12(a6)
mt_vol3:move.w	$12(a6),$8(a5)
	rts

mt_portup:
	moveq	#0,d0
	move.b	$3(a6),d0
	sub.w	d0,$10(a6)
	move.w	$10(a6),d0
	and.w	#$fff,d0
	cmp.w	#$71,d0
	bpl.s	mt_por2
	and.w	#$f000,$10(a6)
	or.w	#$71,$10(a6)
mt_por2:move.w	$10(a6),d0
	and.w	#$fff,d0
	move.w	d0,$6(a5)
	rts

mt_portdown:
	clr.w	d0
	move.b	$3(a6),d0
	add.w	d0,$10(a6)
	move.w	$10(a6),d0
	and.w	#$fff,d0
	cmp.w	#$358,d0
	bmi.s	mt_por3
	and.w	#$f000,$10(a6)
	or.w	#$358,$10(a6)
mt_por3:move.w	$10(a6),d0
	and.w	#$fff,d0
	move.w	d0,$6(a5)
	rts

mt_checkcom2:
	move.b	$2(a6),d0
	and.b	#$f,d0
	cmp.b	#$e,d0
	beq.s	mt_setfilt
	cmp.b	#$d,d0
	beq.s	mt_pattbreak
	cmp.b	#$b,d0
	beq.s	mt_posjmp
	cmp.b	#$c,d0
	beq.s	mt_setvol
	cmp.b	#$f,d0
	beq.s	mt_setspeed
	rts

mt_setfilt:
	move.b	$3(a6),d0
	and.b	#$1,d0
	asl.b	#$1,d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	rts
mt_pattbreak:
	not.b	mt_break
	rts
mt_posjmp:
	move.b	$3(a6),d0
	subq.b	#$1,d0
	move.b	d0,mt_songpos
	not.b	mt_break
	rts
mt_setvol:
	cmp.b	#$40,$3(a6)
	ble.s	mt_vol4
	move.b	#$40,$3(a6)
mt_vol4:move.b	$3(a6),$8(a5)
	rts
mt_setspeed:
	move.b	$3(a6),d0
	and.w	#$1f,d0
	beq.s	mt_rts2
	clr.b	mt_counter
	move.b	d0,mt_speed
mt_rts2:rts

mt_sin:
dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18

mt_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,$0000

mt_speed:	dc.b	$6
mt_songpos:	dc.b	$0
mt_pattpos:	dc.w	$0
mt_counter:	dc.b	$0

mt_break:	dc.b	$0
mt_dmacon:	dc.w	$0
mt_samplestarts:blk.l	$1f,0
mt_voice1:	blk.w	10,0
		dc.w	$1
		blk.w	3,0
mt_voice2:	blk.w	10,0
		dc.w	$2
		blk.w	3,0
mt_voice3:	blk.w	10,0
		dc.w	$4
		blk.w	3,0
mt_voice4:	blk.w	10,0
		dc.w	$8
		blk.w	3,0
******************************************************************************
* Qui inseriamo i dati del disegno e della musica
******************************************************************************
picture:incbin	"dominator.raw"
mt_data:incbin	"mod.funkymetal..."
end:

; That's all, folks !
; (c) 1991,1992 by AmigaByte (L'Agorà Srl)
