;POUR CHARGER LES DATAS TAPEZ:
;RI		RETURN
;BOB_RAW	RETURN
;BOBDATA	RETURN RETURN
;
;RI		RETURN
;BOB_MASK	RETURN
;BOBMASK	RETURN RETURN
;
;RI
;MODULE		RETURN
;MT_DATA	RETURN RETURN
;
;PUIS TAPEZ
;G BEGIN	RETURN RETURN
;
;SUPPRIMEZ LES LIGNES SUIVANTES SI VOTRE VERSION DU SEKA
;NE COMPORTE PAS LA COMMANDE Y

>EXTERN "BOB_RAW",BOBDATA
>EXTERN "BOB_MASK",BOBMASK
>EXTERN "MODULE",MT_DATA

org $30000	;EMPLACEMENT EN MEMOIRE
load $30000	;DE NOTRE PROGRAMME

BEGIN:
JMP START
;=====================================================================
EXECBASE=4
OPENLIBRARY=-408
CLOSELIBRARY=-414
SUPERSTATE=-150
USERSTATE=-156	
FORBID=-132
PERMIT=-138
ADDINTSERVER=-168
REMINTSERVER=-174
Open=-30
Close=-36
Read=-42

;=====================================================================
BLTCON0=$DFF040		
BLTCON1=$DFF042
BLTAFWM=$DFF044
BLTALWM=$DFF046
BLTCPTH=$DFF048
BLTCPTL=$DFF04A
BLTBPTH=$DFF04C
BLTBPTL=$DFF04E
BLTAPTH=$DFF050
BLTAPTL=$DFF052
BLTDPTH=$DFF054
BLTDPTL=$DFF056
BLTSIZE=$DFF058
BLTCMOD=$DFF060
BLTBMOD=$DFF062
BLTAMOD=$DFF064
BLTDMOD=$DFF066
BLTCDAT=$DFF070
BLTBDAT=$DFF072
BLTADAT=$DFF074
DMACONR=$DFF002
;==================================
BITPLANES=$35000		;IMAGES POUR ANIMATIONS

BOBDATA=BITPLANES+[40*256*3*8]	;IMAGE DU BOB

BOBMASK=BOBDATA+192		;MASQUE DU BOB
	
MT_DATA=BOBMASK+192		;MODULE MUSIQUE

FINDATA=MT_DATA+39498		;FIN DES DATAS

;==================================
BUFFERS=7			;NOMBRE D'ECRANS -1
PLANES=3			;NOMBRE DE PLANS
PLANEWIDTH=40			;LARGEUR IMAGE EN MOTS
PLANEHIGH=256			;HAUTEUR IMAGE EN PIXELS
PLANESIZE=PLANEWIDTH*PLANEHIGH	;TAILLE PLAN 256*40
BITPLANESIZE=PLANEWIDTH*PLANES*PLANEHIGH ;TAILLE IMAGE 256*40*3
		
;==================================
START:    
MOVEM.L D0-D7/A0-A6,-(A7)	;SAUVE REGISTRES
MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
JSR FORBID(A6)    		;SAUTE SOUS PROGRAMME: INTERDIT MULTITACHE
JSR OPENLIB  			;SAUTE SOUS PROGRAMME: OUVERTURE LIBRAIRIES

CLEAR_PLANES_1:
	
LEA.L	BITPLANES,A0		; ADRESSE BITPLANES DANS A0
MOVE.w	#PLANES,D2		; COMBIEN DE PLANS ? -> D2
ADD.W	#BUFFERS,D2		; COMBIEN D'ECRANS -> D2

CLEAR_PLANES_2:
	
MOVE.W	#PLANESIZE-1,D1		; TAILLE PLAN DANS D1
	
CLEAR_PLANES_3:
	
MOVE.W	#0,(A0)+		; EFFACE PLAN	

DBF	D1,CLEAR_PLANES_3
DBF	D2,CLEAR_PLANES_2

BSR.L INIT_MUSIQUE		;INITIALISATION DE LA MUSIQUE

BSR.L SETCOPPER			;SAUTE SOUS PROGRAMME: MET EN PLACE LISTE COPPER
BSR.s NEWIRQ3			;SAUTE SOUS PROGRAMME: MET EN PLACE ROUTINE D'INTERRRUPTION

WAIT:
CMP.B #$E0,$DFF006		;ATTENDANT 200 IEME LIGNE RASTER
BNE.S WAIT			;SINON RETOURNE A WAIT

BSR.L	NEXT_BOB		;VA A ROUTINE DE CALCUL ET D'AFFICHAGE

BTST	#6,$BFE001		;ATTENDANT PRESSION SUR BOUTON GAUCHE SOURIS
BNE.S	WAIT			;SINON RETOURNE A WAIT
 				;SI OUI  FIN
END: 				;FIN:	
BSR.L STOP_MUSIQUE		;ARRET DE LA MUSIQUE
BSR.s STOPIRQ3        		;SAUTE SOUS PROGRAMME: STOPPE INTERRUPTION
BSR.L CLRCOPPER       		;SAUTE SOUS PROGRAMME: RESTAURE ANCIENNE LISTE COPPER
BSR.L CLOSELIB        		;SAUTE SOUS PROGRAMME: FERME LIBRAIRIES 
MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
JSR PERMIT(A6)      		;AUTORISE MULTITACHE
                      
MOVEM.L (A7)+,D0-D7/A0-A6	;RESTAURE REGISTRES
RTS
;========================
NEWIRQ3:			;MET EN PLACE NOTRE ROUTINE 
MOVE.L	EXECBASE,A6		;D'INTERRUPTION
lea	irqstr,a1
move.l	#5,d0
jsr	addintserver(a6)
move.l	d0,irq
beq.s	irqerror
rts
irqerror:
rts
;==========================
STOPIRQ3:			;RESTAURE ANCIENNE ROUTINE
movem.l	a0-a6/d0-d7,-(sp)	;D'INTERRUPTION
	tst.l	irq
	beq.s	irqoff1
	move.l	execbase,a6
	lea	irqstr,a1
	move.l	#32,d0
	jsr	remintserver(a6)
irqoff1:movem.l	(sp)+,a0-a6/d0-d7
	rts
irqstr:
	dc.l	0,0
	dc.b	2,-127
	dc.l	0,irqdat,interrupt
irqdat:	dc.l	0,0,0,0
irq:	dc.l	0
;============================
interrupt:			;NOTRE ROUTINE D'INTERRUPTION	
movem.l	a0-a6/d0-d7,-(sp)

BSR.L PLAY_MUSIQUE		;VA A LA ROUTINE POUR JOUER LA MUSIQUE

movem.l	(sp)+,a0-a6/d0-d7
rts
;============================
OPENLIB:  			;OUVERTURE DE LA LIBRAIRIE GRAPHIQUE
move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
lea gfxname,a1			;MET NOM DE LA LIBRAIRIE DANS A1
move.l #$0,d0           	;MET 0 DANS D0
jsr openlibrary(a6)		;OUVRE LIBRAIRIE
tst d0				;TESTE D0
beq.s error			;SI = A 0   VA A ERROR = SORTIE
move.l d0,gfxbase       	;SI NON, MET ADRESSE D0 DANS GFXBASE
add.l #$32,d0			;AJOUTE $32 A CETTE ADRESSE
move.l d0,coppertr      	;MET D0=ADRESSE ACTUELLE LISTE COPPER
rts				;DANS COPPERTR
even
gfxname: dc.b 'graphics.library',0 	;NOM DE LA LIBRAIRIE
even
gfxbase: dc.l 0				;POINTEUR POUR LA GRAPHICS LIBRARY
coppertr: dc.l 0			;POINTEUR POUR ADRESSE LISTE COPPER
;====================
CLOSELIB: 			;FERMETURE LIBRAIRIE
move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
move.l gfxbase,a1		;MET NOM DE LA LIBRAIRIE DANS A1
jsr closelibrary(a6)		;FERME LIBRAIRIE
rts
;====================
ERROR:				;SI ERREUR
illegal				;SORTIE
rts
;====================
SETCOPPER:			;MET EN PLACE NOTRE LISTE COPPER
move.l coppertr,a0		;MET ADRESSE ACTUEL COPPER DANS A0
move.l (a0),oldcopper		;MET CONTENU DANS OLDCOPPER
move.l #newcopper,(a0)		;MET NOTRE LISTE COPPER DANS A0
move.w #$81c0,$dff096		;ACTIVE LISTE COPPER
rts		
oldcopper: dc.l 0
;====================
CLRCOPPER:			;RESTAURE ANCIENNE LISTE COPPER
move.l coppertr,a0		;MET ANCIENNE ADRESSE DANS A0
move.l oldcopper,(a0)		;MET CONTENU DANS A0
move.w #$80a0,$dff096		;REACTIVE ANCIENNE COPPER
rts
;====================
WHICH_PLANE:	DC.W	6	; NUMERO DE L'ECRAN VISIBLE

YPOS:		DC.W	0	;POSITION X
XPOS:		DC.W	0	;POSITION Y

BLTCON0BOB:	DC.W	%0000111111000010
BLTCON1BOB:	DC.W	%0000000000000000

STATUS:		DC.B	0

EVEN
; -------------------------------

NEXT_BOB:

	MOVEM.L	D0-D7/A0-A6,-(A7)	; SAUVE REGISTRES
	MOVE	WHICH_PLANE,D0		; NOMBRE DE PLANE -> D0
	ADDQ	#1,D0			; +1
	CMP.W	#BUFFERS,D0		; SI = 7
	BNE.S	ALL_RIGHT		; SINON ...
	MOVEQ	#0,D0			; EFFACE D0

ALL_RIGHT:

	LEA	WHICH_PLANE,A0
	MOVE.W	D0,(A0)			; SAUVE COMPTEUR PLANS
	
	MOVE.L	#BITPLANESIZE,D1			
	MULU.W	D0,D1			; CALCUL NOUVELLE ADDRESSE 
	MOVE.L	D1,D0	

	MOVE.L	#BITPLANES,D1		; BITPLANE ADDRESSE DANS D1
	ADD.L	D0,D1
	
	MOVEQ	#PLANES-1,D4		; COMPTEUR PLANS - 1
	LEA.L	COP_PLANE,A0		; COPPERLIST
	MOVE.W	#$00E0,D3		; BPL1PTH -> D3
	
INST_BOBPLANES:

	MOVE.W	D3,(A0)+		; BPLXPTH DANS COPPERLISTE
	ADDQ.W	#2,D3			; REGISTRE SUIVANT
	SWAP	D1			; CHANGE MOTS LOW/HIGH 
	MOVE.W	D1,(A0)+		; MOT HI DANS COPPERLISTE
	MOVE.W	D3,(A0)+		; BPLXPTL DANS COPPERLISTE
	ADDQ.W	#2,D3			; REGISTRE SUIVANT	
	SWAP	D1			; CHANGE LOW/HIGH MOTS
	MOVE.W	D1,(A0)+		; MOT LO DANS COPPERLISTE
	ADD.W	#PLANEWIDTH,D1		; CALCUL ADRESSE PLAN SUIVANT
	DBF	D4,INST_BOBPLANES

	MOVE.W	WHICH_PLANE,D0		; COMPTEUR PLAN -> D0
	MOVE.W	#BUFFERS,D2
CONT:
	ADDQ	#1,D0			; +1
	CMP.W	#BUFFERS,D0		; SI = 7
	BNE.S	ALL_RIGHT2		; SINON ...

	MOVEQ	#0,D0			; EFFACE D0

ALL_RIGHT2:

	MOVEM.L	D0-D7/A0-A6,-(A7)	; SAUVE REGISTRES
	BSR	DOBOBY
	MOVEM.L	(A7)+,D0-D7/A0-A6	; RESTAURE REGISTRES

	DBF	D2,CONT

	MOVEM.L	(A7)+,D0-D7/A0-A6	; RESTAURE REGISTRES

	RTS

; -------------------------------

DOBOBY:

	MOVE.L	#BITPLANESIZE,D1			
	MULU.W	D0,D1			; CALCUL NOUVELLE ADDRESSE PLAN 
	MOVE.L	D1,D0	

	LEA.L	BITPLANES,A0		; BITPLANE ADDRESSE DANS D1
	ADD.L	D0,A0

	MOVEQ	#0,D0			; CLEAR D0
	LEA.L	COSINTABX,A1		; A1 POINTE SUR TABLE COSINUS 
	LEA.L	XPOS,A2			; A2 POINTE SUR XPOS
	ADD.W	(A2),A1	
	ADD.W	#2,(A2)			; POSITION SUIVANTE
	LEA.L	COSINTABXEND-4,A3	; FIN DE COSINUS TABLE -> A3
 	CMP.L	A3,A1			; TEST SI FIN TABLE
	BLS.S	NOCOSTABEND2		; SINON ...
	MOVE.W	#4,(A2)			; ECRIT 4 DANS XPOS

NOCOSTABEND2:
	
	MOVE.W	(A1),D0			; ECRIT NOUVELLE XPOSITION DANS D0

NOMIN1:

	BSR.W	FINESCROLL

	MOVEQ	#0,D1			; CLEAR D1
	LEA.L	SINTABY,A1		; A1 POINTE SUR SINUS TABLE
	LEA.L	YPOS,A2			; COMPTEUR YPOS DANS A2
	ADD.W	(A2),A1				
	ADD.W	#2,(A2)			; POSITION SUIVANTE
	LEA.L	SINTABYEND-4,A3		; FIN DE SINUSTABLE -> A3
	CMP.L	A3,A1			; TEST SI FIN TABLE ATTEINTE
	BLS.S	NOSINTABYEND		; SINON ...
	MOVE.W	#0,(A2)			; DOIT ETRE A 0 !

NOSINTABYEND:
	
	MOVE.W	(A1),D1			; ECRIT NOUVELLE YPOITION DANS D1

	ADD.L	D0,D1			; AJOUTE LES MOTS DE XPOS

	LEA.L	BOBDATA,A1		; ADRESSE DESSIN -> A1
	LEA.L	BOBMASK,A2		; ADRESSE MASQUEBOB => A2

	BSR.S	INSERT_BOB		; COPIE BOB DANS LES PLANS

	RTS

; -------------------------------

INSERT_BOB:

	BSR.L	BLITTER_WAIT		; TEST SI BLITTER FINI TRAVAIL

* A0 BITPLANE ADDRESS
* A1 BOBIMAGEDATA	
* A2 BOBDATAMASK
* D0 X-POSITION	
* D1 Y-POSITION	

	ADD.L	D1,A0			; AJOUTE YPOS + XPOS(MOTS) A A0

	MOVE.L	A1,BLTAPTH
	MOVE.L	A2,BLTBPTH
	MOVE.L	A0,BLTCPTH
	MOVE.L	A0,BLTDPTH

	MOVE.L	#$FFFFFFFF,BLTAFWM

	MOVE.W	BLTCON0BOB,BLTCON0
	MOVE.W	BLTCON1BOB,BLTCON1
	MOVE.W	#0,BLTAMOD
	MOVE.W	#0,BLTBMOD
	MOVE.W	#PLANEWIDTH-4,BLTCMOD
	MOVE.W	#PLANEWIDTH-4,BLTDMOD
	MOVE.W	#[PLANES*16]*64+2,BLTSIZE

	RTS

; -------------------------------
		
FINESCROLL:
	
	MOVE.W	d0,d1			; COPIE D0 DANS D1
	LSR.W	#4,d0			; >> 4 D0 
	LSL.W	#1,d0			; << 1 D0

	ANDI.W	#%0000000000001111,d1	; SEULS LES 4 DERNIERS BITS !!!
	LSL.W	#8,d1			; << 8 D1
	LSL.W	#4,d1			; << 4 D1
	LEA.L	BLTCON1BOB,A2		; BLTCON1 DANS A2 
	MOVE.W	D1,(A2)			; ECRIT D1 DANS BLTCON1BOB

	ORI.W	#%0000111111100010,d1	; 
	LEA.L	BLTCON0BOB,A2		; 
	MOVE.W	d1,(a2)			; ECRIT D1 DANS BLTCON0BOB
	RTS				; RETURN

; -------------------------------

BLITTER_WAIT:

	BTST	#14,DMACONR		;TEST BLITTER
	BNE.S	BLITTER_WAIT		
	RTS				

; -------------------------------

; ===============================

COSINTABX:

  dc.w  304,304,304,304,304,303,303,303,303,302,302,301,301,300,299,299
  dc.w  298,297,297,296,295,294,293,292,291,290,289,287,286,285,284,282
  dc.w  281,279,278,277,275,273,272,270,268,267,265,263,261,259,258,256
  dc.w  254,252,250,248,246,243,241,239,237,235,233,230,228,226,223,221
  dc.w  219,216,214,211,209,206,204,201,199,196,194,191,189,186,184,181
  dc.w  178,176,173,171,168,165,163,160,157,155,152,149,147,144,141,139
  dc.w  136,133,131,128,126,123,120,118,115,113,110,108,105,103,100,98
  dc.w  95,93,90,88,85,83,81,78,76,74,71,69,67,65,63,61
  dc.w  58,56,54,52,50,48,46,45,43,41,39,37,36,34,32,31
  dc.w  29,27,26,25,23,22,20,19,18,17,15,14,13,12,11,10
  dc.w  9,8,7,7,6,5,5,4,3,3,2,2,1,1,1,1
  dc.w  0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3
  dc.w  3,4,5,5,6,7,7,8,9,10,11,12,13,14,15,17
  dc.w  18,19,20,22,23,25,26,27,29,31,32,34,36,37,39,41
  dc.w  43,45,46,48,50,52,54,56,58,61,63,65,67,69,71,74
  dc.w  76,78,81,83,85,88,90,93,95,98,100,103,105,108,110,113
  dc.w  115,118,120,123,126,128,131,133,136,139,141,144,147,149,152,155
  dc.w  157,160,163,165,168,171,173,176,178,181,184,186,189,191,194,196
  dc.w  199,201,204,206,209,211,214,216,219,221,223,226,228,230,233,235
  dc.w  237,239,241,243,246,248,250,252,254,256,258,259,261,263,265,267
  dc.w  268,270,272,273,275,277,278,279,281,282,284,285,286,287,289,290
  dc.w  291,292,293,294,295,296,297,297,298,299,299,300,301,301,302,302
  dc.w  303,303,303,303,304,304,304,304

COSINTABXEND:

; ------------------------

SINTABY:

  dc.w  14400,14640,14880,15120,15360,15600,15960,16200,16440,16680,16920
  dc.w  17160,17400,17640,17880,18120,18360,18600,18840,19080,19320,19560
  dc.w  19800,20040,20280,20520,20760,20880,21120,21360,21600,21840,22080
  dc.w  22200,22440,22680,22920,23040,23280,23520,23640,23880,24000,24240
  dc.w  24360,24600,24720,24960,25080,25320,25440,25560,25800,25920,26040
  dc.w  26160,26280,26520,26640,26760,26880,27000,27120,27240,27360,27480
  dc.w  27600,27600,27720,27840,27960,27960,28080,28200,28200,28320,28320
  dc.w  28440,28440,28560,28560,28680,28680,28680,28680,28800,28800,28800
  dc.w  28800,28800,28800,28800,28800,28800,28800,28800,28680,28680,28680
  dc.w  28680,28560,28560,28440,28440,28320,28320,28200,28200,28080,27960
  dc.w  27960,27840,27720,27600,27600,27480,27360,27240,27120,27000,26880
  dc.w  26760,26640,26520,26280,26160,26040,25920,25800,25560,25440,25320
  dc.w  25080,24960,24720,24600,24360,24240,24000,23880,23640,23520,23280
  dc.w  23040,22920,22680,22440,22200,22080,21840,21600,21360,21120,20880
  dc.w  20760,20520,20280,20040,19800,19560,19320,19080,18840,18600,18360
  dc.w  18120,17880,17640,17400,17160,16920,16680,16440,16200,15960,15600
  dc.w  15360,15120,14880,14640,14400,14160,13920,13680,13440,13200,12840
  dc.w  12600,12360,12120,11880,11640,11400,11160,10920,10680,10440,10200
  dc.w  9960,9720,9480,9240,9000,8760,8520,8280,8040,7920,7680
  dc.w  7440,7200,6960,6720,6600,6360,6120,5880,5760,5520,5280
  dc.w  5160,4920,4800,4560,4440,4200,4080,3840,3720,3480,3360
  dc.w  3240,3000,2880,2760,2640,2520,2280,2160,2040,1920,1800
  dc.w  1680,1560,1440,1320,1200,1200,1080,960,840,840,720
  dc.w  600,600,480,480,360,360,240,240,120,120,120
  dc.w  120,0,0,0,0,0,0,0,0,0,0
  dc.w  0,120,120,120,120,240,240,360,360,480,480
  dc.w  600,600,720,840,840,960,1080,1200,1200,1320,1440
  dc.w  1560,1680,1800,1920,2040,2160,2280,2520,2640,2760,2880
  dc.w  3000,3240,3360,3480,3720,3840,4080,4200,4440,4560,4800
  dc.w  4920,5160,5280,5520,5760,5880,6120,6360,6600,6720,6960
  dc.w  7200,7440,7680,7920,8040,8280,8520,8760,9000,9240,9480
  dc.w  9720,9960,10200,10440,10680,10920,11160,11400,11640,11880,12120
  dc.w  12360,12600,12840,13200,13440,13680,13920,14160

SINTABYEND:
;====================
EVEN
;CETTE ROUTINE PERMET DE JOUER TOUS LES MODULES DE SOUNDTRACKERS
;DE LA VERSION 1.0 A LA VERSION 2.6  AINSI QUE CERTAINS MODULES
;NOISETRACKER.

INIT_MUSIQUE:			;INITIALISATION DE LA MUSIQUE
mt_init:move.l	mt_rdata(pc),a0
	cmp.l	#"M.K.",$438(a0)
	bne	mt_st20
	lea	mt_forst23(pc),a2
	move.l	a2,mt_forst
	bra	ok1st23
mt_st20:
	lea	mt_forst20(pc),a2
	move.l	a2,mt_forst
ok1st23:	
	add.l	(a2),a0
	moveq	#$7f,d0
	moveq	#0,d1
mt_init1:
	move.l	d1,d2
	subq.w	#1,d0
mt_init2:
	move.b	(a0)+,d1
	cmp.b	d2,d1
	bgt.s	mt_init1
	dbf	d0,mt_init2
	addq.b	#1,d2

mt_init3:
	move.l	mt_rdata(pc),a0
	lea	mt_sample1(pc),a1
	asl.l	#8,d2
	asl.l	#2,d2
	add.l	4(a2),d2
	add.l	a0,d2
	move.l	8(a2),d0
mt_init4:
	move.l	d2,(a1)+
	moveq	#0,d1
	move.w	42(a0),d1
	asl.l	#1,d1
	add.l	d1,d2
	add.l	#$1e,a0
	dbf	d0,mt_init4

	lea	mt_sample1(PC),a0
	moveq	#0,d0
mt_clear:
	move.l	(a0,d0.w),a1
	clr.l	(a1)
	addq.w	#4,d0
	cmp.w	#$7c,d0
	bne.s	mt_clear

	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	clr.l	mt_partnrplay
	clr.l	mt_partnote
	clr.l	mt_partpoint
	move.l	mt_rdata(pc),a1
	add.l	12(a2),a1
	move.b	(a1),mt_maxpart+1
	rts

STOP_MUSIQUE:			;ARRET DE LA MUSIQUE
mt_end:	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	move.w	#$f,$dff096
	rts

PLAY_MUSIQUE:			;JOUE LA MUSIQUE
mt_music:
	addq.w	#1,mt_counter
mt_cool:cmp.w	#6,mt_counter
	bne.s	mt_notsix
	clr.w	mt_counter
	bra	mt_rout2

mt_notsix:
	lea	mt_aud1temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp1
	lea	$dff0a0,a5		
	bsr.s	mt_arprout
mt_arp1:lea	mt_aud2temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp2
	lea	$dff0b0,a5
	bsr.s	mt_arprout
mt_arp2:lea	mt_aud3temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp3
	lea	$dff0c0,a5
	bsr.s	mt_arprout
mt_arp3:lea	mt_aud4temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp4
	lea	$dff0d0,a5
	bra.s	mt_arprout
mt_arp4:rts

mt_arprout:
	move.b	2(a6),d0
	and.b	#$0f,d0
	tst.b	d0
	beq	mt_arpegrt
	cmp.b	#$01,d0
	beq.s	mt_portup
	cmp.b	#$02,d0
	beq.s	mt_portdwn
	cmp.b	#$0a,d0
	beq.s	mt_volslide
	rts

mt_portup:
	moveq	#0,d0
	move.b	3(a6),d0
	sub.w	d0,22(a6)
	cmp.w	#$71,22(a6)
	bpl.s	mt_ok1
	move.w	#$71,22(a6)
mt_ok1:	move.w	22(a6),6(a5)
	rts

mt_portdwn:
	moveq	#0,d0
	move.b	3(a6),d0
	add.w	d0,22(a6)
	cmp.w	#$538,22(a6)
	bmi.s	mt_ok2
	move.w	#$538,22(a6)
mt_ok2:	move.w	22(a6),6(a5)
	rts

mt_volslide:
	moveq	#0,d0
	move.b	3(a6),d0
	lsr.b	#4,d0
	tst.b	d0
	beq.s	mt_voldwn
	add.w	d0,18(a6)
	cmp.w	#64,18(a6)
	bmi.s	mt_ok3
	move.w	#64,18(a6)
mt_ok3:	move.w	18(a6),8(a5)
	rts
mt_voldwn:
	moveq	#0,d0
	move.b	3(a6),d0
	and.b	#$0f,d0
	sub.w	d0,18(a6)
	bpl.s	mt_ok4
	clr.w	18(a6)
mt_ok4:	move.w	18(a6),8(a5)
	rts

mt_arpegrt:
	move.w	mt_counter(PC),d0
	cmp.w	#1,d0
	beq.s	mt_loop2
	cmp.w	#2,d0
	beq.s	mt_loop3
	cmp.w	#3,d0
	beq.s	mt_loop4
	cmp.w	#4,d0
	beq.s	mt_loop2
	cmp.w	#5,d0
	beq.s	mt_loop3
	rts

mt_loop2:
	moveq	#0,d0
	move.b	3(a6),d0
	lsr.b	#4,d0
	bra.s	mt_cont
mt_loop3:
	moveq	#$00,d0
	move.b	3(a6),d0
	and.b	#$0f,d0
	bra.s	mt_cont
mt_loop4:
	move.w	16(a6),d2
	bra.s	mt_endpart
mt_cont:
	add.w	d0,d0
	moveq	#0,d1
	move.w	16(a6),d1
	lea	mt_arpeggio(PC),a0
mt_loop5:
	move.w	(a0,d0),d2
	cmp.w	(a0),d1
	beq.s	mt_endpart
	addq.l	#2,a0
	bra.s	mt_loop5
mt_endpart:
	move.w	d2,6(a5)
	rts

mt_rout2:
	move.l	mt_rdata(pc),a0
	move.l	a0,a3
	add.l	#$0c,a3
	move.l	a0,a2
	move.l	mt_forst,a4
	add.l	(a4),a2
	add.l	16(a4),a0
	move.l	mt_partnrplay(PC),d0
	moveq	#0,d1
	move.b	(a2,d0),d1
	asl.l	#8,d1
	asl.l	#2,d1
	add.l	mt_partnote(PC),d1
	move.l	d1,mt_partpoint
	clr.w	mt_dmacon

	lea	$dff0a0,a5
	lea	mt_aud1temp(PC),a6
	bsr	mt_playit
	lea	$dff0b0,a5
	lea	mt_aud2temp(PC),a6
	bsr	mt_playit
	lea	$dff0c0,a5
	lea	mt_aud3temp(PC),a6
	bsr	mt_playit
	lea	$dff0d0,a5
	lea	mt_aud4temp(PC),a6
	bsr	mt_playit
	move.w	#$01f4,d0
mt_rls:	dbf	d0,mt_rls

	move.w	#$8000,d0
	or.w	mt_dmacon,d0
	move.w	d0,$dff096

	lea	mt_aud4temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice3
	move.l	10(a6),$dff0d0
	move.w	#1,$dff0d4
mt_voice3:
	lea	mt_aud3temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice2
	move.l	10(a6),$dff0c0
	move.w	#1,$dff0c4
mt_voice2:
	lea	mt_aud2temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice1
	move.l	10(a6),$dff0b0
	move.w	#1,$dff0b4
mt_voice1:
	lea	mt_aud1temp(PC),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice0
	move.l	10(a6),$dff0a0
	move.w	#1,$dff0a4
mt_voice0:
	move.l	mt_partnote(PC),d0
	add.l	#$10,d0
	move.l	d0,mt_partnote
	cmp.l	#$400,d0
	bne.s	mt_stop
mt_higher:
	clr.l	mt_partnote
	addq.l	#1,mt_partnrplay
	moveq	#0,d0
	move.w	mt_maxpart(PC),d0
	move.l	mt_partnrplay(PC),d1
	cmp.l	d0,d1
	bne.s	mt_stop
	clr.l	mt_partnrplay
mt_stop:tst.w	mt_status
	beq.s	mt_stop2
	clr.w	mt_status
	bra.s	mt_higher
mt_stop2:
	rts

mt_playit:
	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_nosamplechange

	moveq	#0,d3
	lea	mt_samples(PC),a1
	move.l	d2,d4
	lsl.l	#2,d2
	mulu	#$1e,d4
	move.l	(a1,d2),4(a6)
	move.w	(a3,d4.l),8(a6)
	move.w	2(a3,d4.l),18(a6)
	move.w	4(a3,d4.l),d3
	tst.w	d3
	beq.s	mt_displace
	move.l	4(a6),d2
	add.l	d3,d2
	move.l	d2,4(a6)
	move.l	d2,10(a6)
	move.w	6(a3,d4.l),8(a6)
	move.w	6(a3,d4.l),14(a6)
	move.w	18(a6),8(a5)
	bra.s	mt_nosamplechange

mt_displace:
	move.l	4(a6),d2
	add.l	d3,d2
	move.l	d2,10(a6)
	move.w	6(a3,d4.l),14(a6)
	move.w	18(a6),8(a5)
mt_nosamplechange:
	move.w (a6),d0
	andi.w #$fff,d0			;it's the bug
	tst.w	d0			;of the real
	beq.s	mt_retrout		;source replay
	move.w	(a6),16(a6)
	move.w	20(a6),$dff096
	move.l	4(a6),(a5)
	move.w	8(a6),4(a5)
	move.w	(a6),d0
	andi.w #$fff,d0			;second bug
	move.w d0,6(a5)			;of the source
	move.w	20(a6),d0
	or.w	d0,mt_dmacon

mt_retrout:
	tst.w	(a6)
	beq.s	mt_nonewper
	move.w	(a6),22(a6)

mt_nonewper:
	move.b	2(a6),d0
	and.b	#$0f,d0
	cmp.b	#$0b,d0
	beq.s	mt_posjmp
	cmp.b	#$0c,d0
	beq.s	mt_setvol
	cmp.b	#$0d,d0
	beq.s	mt_break
	cmp.b	#$0e,d0
	beq.s	mt_setfil
	cmp.b	#$0f,d0
	beq.s	mt_setspeed
	rts

mt_posjmp:
	not.w	mt_status
	moveq	#0,d0
	move.b	3(a6),d0
	subq.b	#1,d0
	move.l	d0,mt_partnrplay
	rts

mt_setvol:
	move.b	3(a6),8(a5)
	rts

mt_break:
	not.w	mt_status
	rts

mt_setfil:
	moveq	#0,d0
	move.b	3(a6),d0
	and.b	#1,d0
	rol.b	#1,d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	rts

mt_setspeed:
	move.b	3(a6),d0
	and.b	#$0f,d0
	beq.s	mt_back
	clr.w	mt_counter
	move.b	d0,mt_cool+3
mt_back:rts

mt_aud1temp:
	blk.w	10,0
	dc.w	1
	blk.w	2,0
mt_aud2temp:
	blk.w	10,0
	dc.w	2
	blk.w	2,0
mt_aud3temp:
	blk.w	10,0
	dc.w	4
	blk.w	2,0
mt_aud4temp:
	blk.w	10,0
	dc.w	8
	blk.w	2,0
mt_partnote:	dc.l	0
mt_partnrplay:	dc.l	0
mt_counter:	dc.w	0
mt_partpoint:	dc.l	0
mt_samples:	dc.l	0
mt_sample1:	blk.l	31,0
mt_maxpart:	dc.w	0
mt_dmacon:	dc.w	0
mt_status:	dc.w	0
mt_forst:	dc.l	0

mt_forst20:	dc.l 472,600,14,470,600
mt_forst23:	dc.l $3b8,$438,$1e,$3b6,$43c
mt_arpeggio:
	dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c
	dc.w $023a,$021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d
	dc.w $0168,$0153,$0140,$012e,$011d,$010d,$00fe,$00f0
	dc.w $00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097
	dc.w $008f,$0087,$007f,$0078,$0071,$0000,$0000,$0000
mt_rdata:	dc.l mt_data

;====================
EVEN				;NOTRE LISTE COPPER
NEWCOPPER:   
	DC.W	$008E,$2881	;DIMENSIONS DE L'ECRAN
	DC.W	$0090,$28D1	;256 LIGNES

	DC.W	$0092,$0038,$0094,$00D0

	;POINTEURS ADRESSE DES PLANS DE L'IMAGE

	COP_PLANE:

	DC.W $00E0,BITPLANES+[40*0]/65536
	DC.W $00E2,BITPLANES+[40*0] & 65535   
	DC.W $00E4,BITPLANES+[40*1]/65536
	DC.W $00E6,BITPLANES+[40*1] & 65535
	DC.W $00E8,BITPLANES+[40*2]/65536
	DC.W $00EA,BITPLANES+[40*2] & 65535
	

	;REGISTRE POUR CHOISIR RESOLUTION	

	DC.W	$0100,$3200		;3 PLANS+MODE COULEURS

	;DECALAGE ECRAN - INUTILISE ICI

	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - INUTILISE ICI

	DC.W 	$0104,$0000

	;MODULOS DES PLANS

	DC.W	$0108,80	;MODULOS PLANS PAIRS
	DC.W 	$010A,80	;MODULOS PLANS IMPAIRS

	;POINTEURS DES SPRITES - MIS A 0 SI PAS DE SPRITES

	DC.W	$0120,$0000,$0122,$0000
	DC.W	$0124,$0000,$0126,$0000
	DC.W	$0128,$0000,$012A,$0000	;PAS DE SPRITES
	DC.W	$012C,$0000,$012E,$0000
	DC.W	$0130,$0000,$0132,$0000
	DC.W	$0134,$0000,$0136,$0000
	DC.W	$0138,$0000,$013A,$0000
	DC.W	$013C,$0000,$013E,$0000

	;REGISTRES DES COULEURS

	DC.W	$0180,$0000	;COULEUR 00
	DC.W	$0182,$0260	;COULEUR 01
	DC.W	$0184,$0472	;COULEUR 02
	DC.W	$0186,$0CFC	;COULEUR 03
	DC.W	$0188,$0AC9	;COULEUR 04
	DC.W	$018A,$08B7	;COULEUR 05
	DC.W	$018C,$06A4	;COULEUR 06
	DC.W	$018E,$0582	;COULEUR 07

	DC.W	$0190,$0EEF	;COULEUR 08
	DC.W	$0192,$0CCF	;COULEUR 09
	DC.W	$0194,$099F	;COULEUR 10
	DC.W	$0196,$055F	;COULEUR 11
	DC.W	$0198,$000F	;COULEUR 12
	DC.W	$019A,$000A	;COULEUR 13
	DC.W	$019C,$0006	;COULEUR 14
	DC.W	$019E,$0003	;COULEUR 15
	DC.W	$01A0,$0DEF	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W	$01A2,$0BEF	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W	$01A4,$0ADF	;COULEUR 18
	DC.W	$01A6,$07BD	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W	$01A8,$058A	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W	$01AA,$0357	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W	$01AC,$0234	;COULEUR 22
	DC.W	$01AE,$0011	;COULEUR 23
	DC.W	$01B0,$0FD0	;COULEUR 24
	DC.W	$01B2,$0FA0	;COULEUR 25
	DC.W	$01B4,$0E80	;COULEUR 26
	DC.W	$01B6,$0C60	;COULEUR 27
	DC.W	$01B8,$0A30	;COULEUR 28
	DC.W	$01BA,$0720	;COULEUR 29
	DC.W	$01BC,$0510	;COULEUR 30
	DC.W	$01BE,$0300	;COULEUR 31

	;INSTRUCTIONS POUR AVOIR UN ECRAN PAL (256 LIGNES DE HAUT)

	DC.W $FFDF,$FFFE


DC.L $FFFFFFFE ;FIN LISTE COPPER
EVEN
FINDEMO:
