;
; Demo grafico/sonoro (di Pierluigi Montanari)
; (cfr. AmigaByte 40, corso di assembler, ottava puntata)
;
; 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_40: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	$24000
load	$24000

Start:	movem.l d0-d7/a0-a6,-(a7)	;iniziamo!....
	bsr	clear_all		;puliamo la memoria
	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 #CopList,(a0)		;nostro, quindi saltiamo alla
	bsr	Program
	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

Program:bsr	punta_plan		;posizioniamo i puntatori ai bitplanes
	bsr	mt_init			;ed inizializziamo i canali audio
	bsr	text
Mouse:	cmp.b	#$f0,$dff006		;aspettiamo che il vertical beam
 					;raggiunga la linea di raster $f0		
	bne.s	mouse
	Bsr ScrollDU			;scrolliamo il testo su e giu'
	Bsr Scroll			;scrolliamo il logo
	Bsr mt_music			;suonimao 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
Clear_all:				;questa e' una semplicissima routine
	lea	end,a0			;di pulizia
Clear_loop:
	move.l	#0,(a0)+
	cmpa.l	#$7ff00,a0
	bls	Clear_loop
	rts

Punta_Plan:		
	move.l	#bigpicture,d0		;preleviamo l' indirizzo del disegno
	lea	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	#$2210,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	#$2210,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	#$2210,d0		;aggiungiamo un valore (in questo
	addi.l	#8,a1			;caso #$2210) 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	#$2210,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!!
;*** adesso tocca al logo ***
	move.l	#scrollpic,d0		;adesso preleviamo l' indirizzo del logo
	lea	picplanes,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	#$1590,d0		;d0 (e quindi i bits 16-31) con la word
	addi.l	#8,a1			;bassa (i bits 0-15). A questo punto
;*** 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	#$1590,d0		;altro 'swap d0' riportiamo lo
	addi.l	#8,a1			;indirizzo del primo bitplane del	
;*** terzo bitplane ***
	move.w	d0,6(a1)		;logo  alla forma originale
	swap	d0			;(ovvero la parte alta dello
	move.w	d0,2(a1)		;indirizzo del primo bitplane del
					;disegno nei bit 16-31 di d0) ed
					;aggiungiamo un valore (in questo
					;caso $1590)	
	rts

ScrollDU:
	cmpi.w	#1,up_dw		;up_dw=1 --> scroll verso il basso
					;up_dw=0 --> scroll verso l' alto
	beq	sc_dw			
sc_up:	lea	cop_select,a0		;routine di scroll verso l'alto.
	subi.w	#42,$00(a0)		;carichiamo a0 con l' indirizzo di	
	subi.w	#42,$04(a0)		;cop_select, decrementiamo i puntatori
	cmpi.w	#$9d00,$00(a0)		;di un valore pari al modulo dello
	bhi	ex_up			;schermo e controlliamo se e' stato
	move.w	#1,up_dw		;raggiunto l' inizio (qui posto a
ex_up:	rts				;$79d00) ed agiamo di conseguenza.
sc_dw:	lea	cop_select,a0		;routine di scroll verso il basso
					;incrementiamo di un numero pari al
					;modulo il puntatore a
	addi.w	#42,$00(a0)		;BPL1PTL ed il puntatore a	
	addi.w	#42,$04(a0)		;BPL3PTL. Siamo arrivati alla fine del	
	cmpi.w	#$c000,$00(a0)		;testo? (qui $7c000)
	bls	ex_dw			;no  , esci.
	move.w	#0,up_dw		;si' , attiviamo lo scroll verso  	
ex_dw:	rts				;l' alto ed usciamo dalla routine.

up_dw:	dc.w	1

;******************************************************************************
;* Routine di stampa caratteri: il set usato e' il bubble_set		      *
;******************************************************************************
text:	lea	my_text,a0	;indirizzo del testo in a0
next_char:
	move.b	(a0)+,d2	;prendiamo il carattere del testo e lo poniamo
	cmpi.b	#$ff,d2		;in d2, verificando se siamo giunti alla fine
	beq	end_text	;del testo stesso (con $ff). Se la risposta e'	
	bsr	get_char	;negativa, saltiamo alla rouine di 
	bra	next_char	;identificazione e stampa del carattere, 
end_text:			;ripetendo il ciclo sino alla fine del testo
	rts
get_char:
	lea	my_map,a1	;indirizzo dei caratteri disponibili in a1
	moveq	#$00,d0		;puliamo d0 e d1
	moveq	#$00,d1
get_it:
	move.b	(a1)+,d0	;mettiamo il codice del carattere in d0 e lo
	cmp.b	d2,d0		;confrontiamo con quello del testo. Se il
	beq	ok_char		;risultato e' positivo, saltiamo alla routine
	addi.w	#$01,d1		;di stampa carattere, altrimenti incrementiamo
	bra	get_it		;d1, che indica a quale posizione nell' alfabeto
ok_char:			;siamo arrivati.
	lea	bubble_set,a1	;indirizzo del set di caratteri in a1
	lsl.w	#3,d1		;moltiplichiamo per otto d1, cosi' troviamo
				;l' inizio effettivo del carattere da stampare
				;a partire dall' indirizzo bubble_set.
				;Questo perche' ogni carattere e' definito da
				;otto bytes posti in successione.
	add.l	d1,a1		;aggiungiamo tale valore ad a1
get_pos:move.l	bitmap,a2	;poniamo l' indirizzo della bitmap in a2		
	move.w	col,d0		;poniamo il valore della colonna attuale in d0
	move.w	row,d1		;poniamo il valore della riga attuale in d1
	mulu	#336,d1		;moltiplichiamo d1 per 336, che sarebbe 42 * 8
	add.w	d0,d1		;con 42 il modulo di schermo e 8 l' altezza in
	add.w	d1,a2		;pixel di ciascun carattere del font.Aggiungiamo 
end_line:			;ad a2 i valori di d0 e d1 per ottenere la
	addi.w	#01,col		;posizione fisica in memoria di dove stampare il	
	cmpi.w	#42,col		;carattere.Prima di stamparlo, pero',aggiungiamo
	bne	print_it	;uno alla colonna attuale. Se la colonna e' pari
	move.w	#0,col		;al modulo, incrementiamo di uno il numero di
	add.w	#$01,row	;riga e poniamo a zero quello di colonna
print_it:			;(produciamo un 'ritorno a capo')	
	move.b	(a1)+,00(a2)	;adesso stampiamo il carattere byte per byte,
	move.b	(a1)+,42(a2)	;incrementando ogni volta di 42 (il modulo di
	move.b	(a1)+,84(a2)	;schermo) l' offset.
	move.b	(a1)+,126(a2)
	move.b	(a1)+,168(a2)
	move.b	(a1)+,210(a2)
	move.b	(a1)+,252(a2)
	move.b	(a1)+,294(a2)
	rts

bitmap:		dc.l $79d00
text_offset:	dc.l 0
col:		dc.w 0
row:		dc.w 0
;******************************************************************************
;* Questi sono i dati per il font di caratteri 8 x 8 pixels...		      *	
;******************************************************************************

bubble_set:

dc.w $666e,$6e60,$623c,$0,$7ce6,$fefe,$e6e6,$e600
dc.w $fce6,$fce6,$fefe,$fc00,$7ce6,$e0e6,$fefe,$7c00
dc.w $fce6,$e6e6,$fefe,$fc00,$fee0,$fce0,$fefe,$fe00
dc.w $fee0,$fce0,$e0e0,$e000,$7ee0,$eee6,$fefe,$7c00
dc.w $e6e6,$fee6,$e6e6,$e600,$7c38,$3838,$7c7c,$7c00
dc.w $7e1c,$1cdc,$fcfc,$7800,$e6e6,$ecf8,$ece6,$e600
dc.w $e0e0,$e0e6,$fefe,$fe00,$eefe,$fed6,$c6c6,$c600
dc.w $e6f6,$fefe,$eee6,$e600,$7ce6,$e6e6,$fefe,$7c00
dc.w $fce6,$e6fe,$fce0,$e000,$7ce6,$e6ee,$eefe,$7e00
dc.w $fce6,$e6fc,$feee,$e600,$7ee0,$fc7e,$1efe,$fc00
dc.w $fe38,$3838,$3838,$3800,$e6e6,$e6e6,$fefe,$7c00
dc.w $e6e6,$e6e6,$fe7c,$3800,$c6c6,$d6fe,$feee,$c600
dc.w $c6ee,$7c38,$7cee,$c600,$eeee,$fe7c,$3838,$3800
dc.w $fe1c,$3870,$fefe,$fe00,$3c30,$3030,$3030,$3c00
dc.w $c12,$307c,$3062,$fc00,$3c0c,$c0c,$c0c,$3c00
dc.w $18,$3c7e,$1818,$1818,$10,$307f,$7f30,$1000
dc.w $0,$0,$0,$0,$1818,$1818,$0,$1800
dc.w $6666,$6600,$0,$0,$6666,$ff66,$ff66,$6600
dc.w $183e,$603c,$67c,$1800,$6266,$c18,$3066,$4600
dc.w $3c66,$3c38,$6766,$3f00,$60c,$1800,$0,$0
dc.w $c18,$3030,$3018,$c00,$3018,$c0c,$c18,$3000
dc.w $66,$3cff,$3c66,$0,$18,$187e,$1818,$0
dc.w $0,$0,$18,$1830,$0,$7e,$0,$0
dc.w $0,$0,$18,$1800,$306,$c18,$3060,$0
dc.w $3c66,$6e76,$6666,$3c00,$1818,$3818,$1818,$7e00
dc.w $3c66,$60c,$3060,$7e00,$3c66,$61c,$666,$3c00
dc.w $60e,$1e66,$7f06,$600,$7e60,$7c06,$666,$3c00
dc.w $3c66,$607c,$6666,$3c00,$7e66,$c18,$1818,$1800
dc.w $3c66,$663c,$6666,$3c00,$3c66,$663e,$666,$3c00
dc.w $0,$1800,$18,$0,$18,$0,$1818,$300e
dc.w $1830,$6030,$180e,$0,$0,$7e00,$7e00,$0
dc.w $7018,$c06,$c18,$7000,$3c66,$60c,$1800,$1800
;******************************************************************************
;* Questo e' l' alfabeto, ovvero la mappa dei codici corrispondenti ai
;* caratteri disponibili nel font
;******************************************************************************
my_map:
dc.b	"@abcdefghijklmnopqrstuvwxyz[ฃ]^| !_#$%&"
dc.b	"'()*+,-./0123456789:;<=>?"
;******************************************************************************
;* Qui possiamo scrivere il nostro testo....
;******************************************************************************
my_text:
dc.b	'                                          '
dc.b	'                                          '
dc.b    '            amigabyte disk 40             '
dc.b	'                                          '
dc.b	'                                          '
dc.b	' .......sul disco di questo mese.......   '
dc.b    ' --------------------------------------   '
dc.b	' utilities.............................   '
dc.b    ' programmi.............................   '
dc.b	' sorgenti..............................   '
dc.b	' corso di linguaggio macchina..........   '
dc.b	' musica................................   '
dc.b	' disegni...............................   '
dc.b	' --------------------------------------   '
dc.b	'                                          '
dc.b	' direttore...........       sira rocchi   '
dc.b	' direzione editoriale     mario magrone   '
dc.b	' direzione tecnica...giancarlo cairella   '
dc.b	' segreteria di redazione   silvia maier   '
dc.b    ' grafica............       nadia marini   '
dc.b	' fotografie.........        marius look   '
dc.b    ' --------------------------------------   '
dc.b	'                                          '
dc.b	' a    -=pj=-    production    in   1991   '
dc.b	'                                          '
even
dc.w	$ffff		;fine del testo!!!!!!!!!!!!!!


*******************************************************************************
* ROUTINE SCROLL : Scrolla da destra a sinistra e viceserva un logo qualsiasi.
*		   Funziona anche in interrupt.
*		   Nella copperlist va messo:
*	   	dc.w	$102
*	df:	dc.w %0000000011110000,$10a,46,$108,46
*		dc.w $92,$30
*	picplanes:
*		DC.W $e0,7,$e2,0	;----> puntatori alla schermata...
*		dc.w $e4,7,$e6,10240	;---->
*		dc.w $e8,7,$ea,20480	;---->
******************************************************************************
Scroll:
	cmpi.w	#0,cnt3		;se cnt3 vale zero, stiamo scrollando il logo	
	beq	scrolLR		;da sinistra a destra
scrollRL:			;altrimenti stiamo scrollando da destra a	
	move.l	pnt,a0		;sinistra. Mettiamo l' indirizzo di pnt in a0.
	moveq	#0,d0		;pnt infatti contiene l' indirizzo che specifica
	move.b	(a0)+,d0	;l' attuale valore di scroll che poniamo in d0
	andi.w	#%0000000011110000,df	
	ori.w	d0,df		;dopo aver effettuato una maschera, poniamo d0
	cmpi.b	#-1,(a0)	;in df (scrollando quindi il video) e	
	bne	cnt		;controlliamo se siamo giunti alla fine dello
	subi.w	#2,scroll0	;scroll hardware e successivamente all' inizio	
	cmpi.w	#0,scroll0	;del logo (stiamo scrollando da destra a
	bne	scroll1		;sinistra...), decrementando scroll0 di 2 bytes.
	move.l	#scrolright,pnt	;se siamo giunti a zero, poniamo l' indirizzo	
	move.w	#0,cnt3		;della tabella di scroll sinistra->destra in pnt
	move.w	#%0000000011110000,df
	bra	scrollr		;e saltiamo alla routine scrollr
scroll1:move.l	#picplanes,a0	;indirizzo planes (dispari) nella cop.list
	subi.w	#2,6(a0)	;sottraiamo due bytes per ogni bitplane
	subi.w	#2,14(a0)	;(e questo perche' attraverso lo scroll fine
	subi.w	#2,22(a0)	; abbiamo shiftato il logo di 16 pixels)
	move.l	#scrolleft,pnt  ;e reinizializziamo il puntatore alla tabella.
	rts
scrolLR:move.l	pnt,a0		;mettiamo il puntatore al valore di shift in a0
	moveq	#0,d0		;e poniamo il byte corrispondente in d0.
	move.b	(a0)+,d0	;Successivamente puliamo i primi quattro bit	
	andi.w	#%0000000011110000,df
	ori.w	d0,df		;in df ed effetuiamo un or logico con il valore
	cmpi.b	#-1,(a0)	;in d0. Se a0 punta al valore -1 significa che
	bne	cnt		;siamo alla fine della tabella. In questo caso,
	addi.w	#2,scroll0	;aggiungiamo due bytes a scroll0 (che ci indica
	cmpi.w	#48,scroll0	;di quanto ci siamo spostati a destra) e vediamo
;* leggere anche nota alla fine del listato...
	bls	scroll2		;se abbiamo raggiunto una distanza pari alla	
	move.l	#scrolleft,pnt	;meta' del logo. Se l' abbiamo superata, e'
	move.w	#1,cnt3		;dobbiamo allora cominciare a scrollare verso
	move.w	#%0000000011110000,df
	rts			;sinistra,ponendo uno in cnt3 e reinizializzando
				;i puntatori.
scroll2:move.l	#picplanes,a0	;indirizzo planes (dispari) nella cop.list
	addi.w	#2,6(a0)	;aggiungiamo due ad ogni puntatore ai bitplanes
	addi.w	#2,14(a0)	;in questo modo ci spostiamo di 16 pixels verso
	addi.w	#2,22(a0)	;destra.
	move.l	#scrolright,pnt
scrollr1:rts
cnt:	move.l	a0,pnt
	rts
cnt3:	dc.w	0		;variabili di controllo per la routine.
scroll0:dc.w	0
pnt:	dc.l	scrolright	;all' inizio puntiamo a scrolright
scrolright:			;tabella di scroll verso destra
	dc.b	14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,15,-1
scrolleft:			;tabella di scroll verso sinistra
	dc.b	1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,-1
	even

******************************************************************************
;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
;ญ   NoisetrackerV1.0 replayroutine   ญ
;ญ Mahoney & Kaktus - HALLONSOFT 1989 ญ
;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
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
even
********************************************************************************
* La nostra Copperlist... Leggere attentamente l' articolo per il commento
* a questa parte del listato !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
********************************************************************************

Coplist:
	dc.w	$008e,$2081,$0090,$4fc1,$0092,$0030,$0094,$00d0
	dc.w	$0100,$5400,$010a,$0000,$0104,%0000000001000000
	dc.w 	$0102
df:	dc.w 	%0000000011111111,$108,50 ;** leggere nota alla fine del listato
picplanes:
	dc.w 	$00e0,$6,$00E2,$0000,$00e8,$6,$00ea,$5000
	dc.w	$00f0,$6,$00f2,$5000,$00e4,$7,$00ec,$7,$00e6
cop_select:
	dc.w	$9d00,$00ee,$9cd6
	dc.w	$f4,0,$f6,0
	dc.w 	$0120,$0000,$0122,$0000,$0124,$0000,$0126,$0000
	dc.w 	$0128,$0000,$012A,$0000,$012C,$0000,$012E,$0000
	dc.w 	$0130,$0000,$0132,$0000,$0134,$0000,$0136,$0000
	dc.w 	$0138,$0000,$013A,$0000,$013C,$0000,$013E,$0000 
	dc.w	$0180,$0000,$0182,$0faf,$0184,$0b8d,$0186,$078d
	dc.w	$0188,$057a,$018a,$079c,$018c,$0abd,$018e,$0def
	dc.w	$0190,$0000,$0192,$0faf,$0194,$0b8d,$0196,$078d
	dc.w	$0198,$057a,$019a,$079c,$019c,$0abd,$019e,$0def
	dc.w	$5801,$fffe		 ;** leggere nota alla fine del listato
	dc.w	$0092,$0038,$0094,$00d0,$100,0,$102,0,$104,0,$108,0,$10a,0
	dc.w	$5b01,$fffe
	dc.w 	$0100,%0101000000000000
bpl_ptr:dc.w 	$e0,0,$e2,0		
	dc.w 	$e4,0,$e6,0		
	dc.w 	$e8,0,$ea,0		
	dc.w 	$ec,0,$ee,0		
	dc.w 	$f0,0,$f2,0		
	dc.w	$0180,$0001 ,$0182,$05ef ,$0184,$0999 ,$0186,$069e
	dc.w	$0188,$000a ,$018a,$066a ,$018c,$0004 ,$018e,$035b
	dc.w	$0190,$0358 ,$0192,$0469 ,$0194,$048a ,$0196,$059b
	dc.w	$0198,$05ac ,$019a,$05bd ,$019c,$06cd ,$019e,$09a8
	dc.w	$01a0,$0666 ,$01a2,$0777 ,$01a4,$0999 ,$01a6,$0bbb
	dc.w	$01a8,$0ddd ,$01aa,$0b00 ,$01ac,$0c21 ,$01ae,$0c60
	dc.w	$01b0,$0c71 ,$01b2,$0c91 ,$01b4,$0866 ,$01b6,$0988
	dc.w	$01b8,$0766 ,$01ba,$0877 ,$01bc,$0735 ,$01be,$06cd
	dc.w    $ffff,$fffe
********************************************************************************
* NOTA: Il modulo (e di conseguenza il numero di bytes che possiamo scrollare a
*	destra e sinistra) dipende direttamente dalle  dimensioni  iniziali del
*	logo. Specificare in $108  un valore di 50 equivale a considerare, come
*	gia' spiegato nel corso della lezione, un logo di 42 + 50 = 92 bytes di 
*	larghezza. Stesse considerazioni valgono per quanto riguarda l' altezza
*	del logo stesso, da cui  dipende direttamente il valore da  porre nella
*	istruzione di WAIT del copper. La cosa  migliore e' provare e riprovare
*	sino a che non si sono trovate le dimensioni adeguate...
********************************************************************************
* Qui vengono caricati i dati per la nostra demo....
* ...ovviamente dovrete specificare i nomi dei file relativi alle immagini e
*    alla musica scelte da voi...
********************************************************************************
scrollpic:	incbin	"logo2.raw"		;dati per il logo
bigpicture:	incbin	"picture.raw"		;dati per il disegno
mt_data:	incbin	"module"		;dati per la musica
end:
********************************************************************************
* La fine.... per fortuna che doveva essere un *SEMPLICE* articolo!!!!!!       *
* Si ringraziano Mr K e Kidz dei Ghostly Spreaders per la musica e la grafica  *
* originale...								       *
********************************************************************************

