**** TRACEUR MANDELBROT AVEC ZOOM PAR EMMANUEL HOCDET
**** MODIFICATIONS PAR FUNX/PHOENIX     DEVPAC 3.02
**** PROGRAMME COMPATIBLE KICKSTART 2.0

* F1		RESET COULEURS
* F2		CYCLE COULEUR VERS L'EXTERIEUR
* F3		CYCLE COULEUR VERS L'INTERIEUR
* F4		REDUIRE LA VITESSE DU CYCLE
* F5		ACCELERER LA VITESSE DU CYCLE
* F6		MANDEBROT D'ORIGINE
* F10		CALCUL
* ESC		SORTIE
* GESTION DU ZOOM PAR LA SOURIS

	OPT	C-	* OPT CASE OFF

BEGIN:
	JMP DEBUT
;========================
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

;=================
DEBUT:
	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

	BSR INIT_MUSIQUE		;INITIALISATION DE LA MUSIQUE

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

	BSR 	MAIN			;VA A ROUTINE MISE EN PLACE IMAGE
		
WAIT:
	
	BSR	MANDEL			;VA A ROUTINE MANDELBROT
	
WAIT2:	
	CMP.B	#$74,$BFEC01		;TESTE TOUCHE ESCAPE
	BEQ	END			;SI OUI    FIN

	CMP.W	#1,NEWCALC		;TESTE FLAG NOUVEAU CALCUL
	BNE	WAIT2			;SI = 0	RETOURNE A WAIT2

	BSR	NEWPOSI			;VA A ROUTINE NOUVEAU CALCUL

	BRA	WAIT			;SAUTE A WAIT



END: 					;FIN:	
	BSR STOP_MUSIQUE		;ARRET DE LA MUSIQUE
	BSR STOPIRQ3			;SAUTE SOUS PROGRAMME: STOPPE INTERRUPTION
	BSR CLRCOPPER			;SAUTE SOUS PROGRAMME: RESTAURE ANCIENNE LISTE COPPER
	BSR 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 PLAY_MUSIQUE	;VA A LA ROUTINE POUR JOUER LA MUSIQUE

	BSR CLAVIER		;VA A ROUTINE TEST TOUCHES

	BSR SOURIS		;VA A ROUTINE GESTION SOURIS

	CMP.L #1,CPT_ITCOPPER
	BNE PAS_ITCOPPER1
	BSR ITCOPPER1		;CYCLE COULEUR 1
PAS_ITCOPPER1:

	CMP.L #2,CPT_ITCOPPER
	BNE PAS_ITCOPPER2	;CYCLE COULEUR 2
	BSR ITCOPPER2	
PAS_ITCOPPER2:

	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

;====================
CPT_ITCOPPER:	DC.L	0

CLAVIER:

	CMP.B	#$5E,$BFEC01	;TESTE TOUCHE F1
	BNE	PASF1		
	BSR	F1		
PASF1:	
	
	CMP.B	#$5C,$BFEC01	;TESTE TOUCHE F2
	BNE	PASF2
	BSR F2
PASF2:
			
	CMP.B	#$5A,$BFEC01	;TESTE TOUCHE F3
	BNE	PASF3
	BSR F3
PASF3:
			
	CMP.B	#$58,$BFEC01	;TESTE TOUCHE F4
	BNE	PASF4
	BSR	F4
PASF4:
			
	CMP.B	#$56,$BFEC01	;TESTE TOUCHE F5
	BNE	PASF5
	BSR	F5
PASF5:
			
	CMP.B	#$54,$BFEC01	;TESTE TOUCHE F6
	BNE	PASF6
	BSR	F6
PASF6:
			
	CMP.B	#$52,$BFEC01	;TESTE TOUCHE F7
	BNE	PASF7
	BSR	F7
PASF7:
			
	CMP.B	#$50,$BFEC01	;TESTE TOUCHE F8
	BNE	PASF8
	BSR	F8
PASF8:
			
	CMP.B	#$4E,$BFEC01	;TESTE TOUCHE F9
	BNE	PASF9
	BSR	F9
PASF9:
			
	CMP.B	#$4C,$BFEC01	;TESTE TOUCHE F10
	BNE	PASF10
	BSR	F10
PASF10:	
	MOVE.B	#0,$BFEC01	;EFFACE TAMPON CLAVIER		
	
	RTS

;======================================
ITCOPPER1:			;CYCLE DE COULEURS 1


	MOVE	COMPT,D0
	ADD	ADDITION,D0
	MOVE	D0,COMPT
	CMP	#256,D0
	BLT.S	F_IRQ1
	CLR.B	COMPT

	LEA	CYCLE_COLORS,A0
	LEA	SCOPPER,A1
	ADD.W 	#2,A1
	MOVE	START,D1
	ADDQ.W	#2,START
	MOVEQ	#31,D0	
MAKCYCL:
	SUBQ	#2,D1
	AND	#$3E,D1
	MOVE	(A0,D1),(A1)
	ADD.W #4,A1
	DBF	D0,MAKCYCL


F_IRQ1:
	RTS

;==================================
ITCOPPER2:			;CYCLE DE COULEURS 2


	MOVE	COMPT,D0
	ADD	ADDITION,D0
	MOVE	D0,COMPT
	CMP	#256,D0
	BLT.S	F_IRQ2
	CLR.B	COMPT

	LEA	CYCLE_COLORS,A0
	LEA	SCOPPER,A1
	ADD.W #2,A1
	MOVE	START,D1
	SUBQ.W	#2,START
	MOVEQ	#31,D0	
MAKCYC:
	SUBQ	#2,D1
	AND	#$3E,D1
	MOVE	(A0,D1),(A1)
	ADD.W #4,A1
	DBF	D0,MAKCYC

F_IRQ2
	RTS
;==================================

START		DC.W	0
ADDITION	DC.W	128
COMPT		DC.W	0	

;=======================================
F6:					;VARIABLES MANDEL D'ORIGINE
	MOVE	#ZOOM*CLARG*8*2/4,X1
	MOVE	#ZOOM*HAUT/2,Y1
	MOVE	#ZOOM,ZOOMXY
F10:	MOVE	#1,NEWCALC
	RTS
;=======================================
F1:	LEA	CYCLE_COLORS+32*2,A0	;MISE EN PLACE COULEURS ORIGINE
	LEA	SCOPPER,A1
	ADD.W #2,A1
	MOVEQ	#31,D0
LOOPF1:
	MOVE	-(A0),(A1)
	ADD.W #4,A1
	DBF	D0,LOOPF1
	CLR.W	START
	MOVE.L	#0,CPT_ITCOPPER
	RTS

;=======================================
F2:	MOVE.L	#1,CPT_ITCOPPER		;FLAG POUR CYCLE COULEUR 1		
	RTS

;=======================================
F3:	MOVE.L	#2,CPT_ITCOPPER		;FLAG POUR CYCLE COULEUR 2
	RTS

;=======================================
F4:	LEA	ADDITION+1,A0		;REGLAGE VITESSE CYCLE
	SUB.B	#2,(A0)
	BNE.S	PASMOIN
	MOVE.B	#2,(A0)
PASMOIN:
	RTS

;=======================================
F5:	LEA	ADDITION+1,A0		;REGLAGE VITESSE CYCLE
	ADD.B	#2,(A0)
	BNE.S	PASPLUS
	MOVE.B	#-2,(A0)
PASPLUS:
	RTS

;=======================================
F7:

F8:

F9:

	RTS

;==================================
PREP:				;PREPARATION PARAMETRES
	MOVE	#HAUT,LCOORSY
	MOVE	#CLARG*8,D0
	MOVE	D0,LCOORSX
	EXT.L	D0
	DIVU	ZOOMXY,D0
	BNE.S	PRECIS
	MOVEQ	#1,D0
PRECIS:
	MOVE.L	D0,REST
	RTS
;==================================
REST:	DC.W	0
QUOT:	DC.W	0

;==================================
SOURIS:				;GERER LE ZOOM

	MOVE.W	LCOORSX,D2
	MOVE.W	LPRECIX,D3
	MOVE.W	QUOT,D0
	MOVE.W	REST,D1

	BTST 	#6,$BFE001	;LEFT BOTTON
	BNE.S	GRAND
	ADD.W	D1,D3
	ADDX.W	D0,D2
	CMP.W	#CLARG*8,D2
	BGT.S	PETIT
	MOVE	D2,LCOORSX
	MOVE	D3,LPRECIX
	MULU	#MINY,D2
	DIVU	#MINX,D2
	MOVE	D2,LCOORSY
	BRA.S	PETIT
GRAND:
	BTST	#10,$DFF016	;RIGHT BOTTON
	BNE.S	PETIT
	SUB.W	D1,D3
	SUBX.W	D0,D2
	CMP	#MINX,D2
	BLT.S	PETIT
	MOVE	D2,LCOORSX
	MOVE	D3,LPRECIX
	MULU	#MINY,D2
	DIVU	#MINX,D2
	MOVE	D2,LCOORSY
PETIT:				;GERER LE MOUVEMENT DE LA SOURIS
	LEA	SMEM,A0
	MOVE.B	(A0),D2
	MOVE.B	1(A0),D3
	MOVE	$DFF00A,(A0)
	MOVE.B	(A0),D0
	MOVE.B	1(A0),D1
	EXT	D0
	EXT	D1
	EXT	D2
	EXT	D3
	SUB	D0,D2
	SUB	D1,D3
	MOVE.B	D2,D0
	MOVE.B	D3,D1
	NEG.B	D0
	NEG.B	D1
	EXT	D0
	EXT	D1
	SUB	D1,D3
	BEQ.S	NOX
	LEA	POSIX,A0
	ADD	(A0),D1
				;TRAITER X
	BPL.S	XPOSI
	MOVEQ	#0,D1
XPOSI:
	MOVE	D1,(A0)
NOX:
	SUB	D0,D2
	BEQ.S	NOY
	LEA	POSIY,A0
	ADD	(A0),D0
				;TRAITER Y
	BPL.S	YPOSI
	MOVEQ	#0,D0
YPOSI:
	MOVE	D0,(A0)
NOY:
	MOVE	#CLARG*8,D0
	SUB	LCOORSX,D0
	LEA	POSIX,A0
	CMP	(A0),D0
	BGE.S	CATIENX
	MOVE	D0,(A0)
CATIENX:
	MOVE	#HAUT,D0
	SUB	LCOORSY,D0
	LEA	POSIY,A0
	CMP	(A0),D0
	BGE.S	CATIENY
	MOVE	D0,(A0)
CATIENY:			;LES SPRITES
	LEA	POSIX,A0
	LEA	POSIY,A1
	MOVE	(A1),D0
	MOVE	(A0),D2
	ADD.W	#FYMIN,D0
	ADD.W	#FXMIN,D2
	BSR	SPTMOT
	MOVE.L	D0,HG

	MOVE	(A1),D0
	MOVE	(A0),D2
	ADD.W	#FYMIN,D0
	ADD.W	#FXMIN-16-1,D2
	ADD.W	LCOORSX,D2
	BSR	SPTMOT
	MOVE.L	D0,HD

	MOVE	(A1),D0
	MOVE	(A0),D2
	ADD.W	#FYMIN-16,D0
	ADD.W	LCOORSY,D0
	ADD.W	#FXMIN-16-1,D2
	ADD.W	LCOORSX,D2
	BSR	SPTMOT
	MOVE.L	D0,BD

	MOVE	(A1),D0
	MOVE	(A0),D2
	ADD.W	#FYMIN-16,D0
	ADD.W	LCOORSY,D0
	ADD.W	#FXMIN,D2
	BSR	SPTMOT
	MOVE.L	D0,BG

	BSR	SPRITS
	RTS

SPTMOT:
	MOVE	D0,D1
	ADD	#16,D1
	MOVEQ	#0,D3
	LSL.W	#8,D0
	ADDX	D3,D3
	LSL.W	#8,D1
	ADDX	D3,D3
	LSR.W	#1,D2
	ADDX	D3,D3
	OR.W	D2,D0
	OR.W	D3,D1
	SWAP	D0
	MOVE	D1,D0
	RTS

SPRITS:				;MISE EN PLACE SPRITES
	LEA	SPRITES+2,A1	;DANS LISTE COPPER

	MOVE.L	#HG,D0
	SWAP	D0
	MOVE.W	D0,(a1)
	ADD.W	#4,a1
	SWAP	D0
	MOVE.W	D0,(a1)
	ADD.W	#4,a1

	MOVE.L	#BD,D0
	SWAP	D0
	MOVE.W	D0,(a1)
	ADD.W	#4,a1
	SWAP	D0
	MOVE.W	D0,(a1)
	ADD.W	#4,a1

	MOVE.L	#BG,D0
	SWAP	D0
	MOVE.W	D0,(a1)
	ADD.W	#4,a1
	SWAP	D0
	MOVE.W	D0,(a1)
	ADD.W	#4,a1

	MOVE.L	#HD,D0
	SWAP	D0
	MOVE.W	D0,(a1)
	ADD.W	#4,a1
	SWAP	D0
	MOVE.W	D0,(a1)
	ADD.W	#4,a1

	RTS
;==================================

SMEM:		DC.W	0
POSIX:		DC.W	0
POSIY:		DC.W	0

LCOORSX:	DC.W	0
LCOORSY:	DC.W	0
LPRECIX:	DC.W	0

MINX=20
MINY=17

ZOOM=$80

X1:		DC.W	ZOOM*CLARG*8*2/4
Y1:		DC.W	ZOOM*HAUT/2
ZOOMXY:		DC.W	ZOOM
YY:		DC.W	0
XX:		DC.W	0
INCX:		DC.W	0
INCY:		DC.W	0

;==================================
MAIN:
	MOVE	$DFF00A,SMEM	;SAUVEGARDE POSITION SOURIS

	LEA	BITPLAN,A0	;PLACE ADRESSE IMAGE DANS LISTE COPPER
	MOVE.L	A0,D1
	LEA	PLANS,A1
	MOVEQ	#4,D0
CREE:
	LEA	2(A1),A1
	SWAP	D1
	MOVE	D1,(A1)+
	LEA	2(A1),A1
	SWAP	D1
	MOVE	D1,(A1)+
	ADD.L	#TAILLE,D1
	DBF	D0,CREE
	
	RTS
;===================================	
HAUT=34*8
LARG=40
CLARG=40

FYMIN=$20
FYMAX=$30
FXMIN=$81
FXMAX=$C1
BXMIN=$38
BXMAX=$D0
;====================================

MANDEL:				;ROUTINE DE MANDELBROT
	BSR	PREP

	CLR.W	YY
	MOVE	Y1,D0
	NEG	D0
	MOVE	D0,INCY

LOOP1:	
	CLR.W	XX
	MOVE	X1,D0
	NEG	D0
	MOVE	D0,INCX
	MOVE	INCY,A6		;=IM
	MOVE	ZOOMXY,D0
	ADD	D0,INCY

LOOP2:

	MOVEQ	#15,D4
LE_MOT:

	MOVE.W	INCX,A5		;=RE
	MOVE	ZOOMXY,D0
	ADD	D0,INCX
	
	MOVEQ	#0,D0
	MOVEQ	#0,D1
	MOVEQ	#0,D2
	MOVEQ	#0,D3

	MOVEQ	#30,D7		;NBS D'ITERATIONS ESSAYEZ NBRE DE 1 A 50
LOOP3:
	SUB.L	D3,D2		;*******************
	LSL.L	#3,D2		;* X=X-Y+P0
	SWAP	D2		;*
	ADD.W	A5,D2		;*******************
				
	MOVE.W	D1,D3		;*******************
	MULS	D0,D3		;*
	LSL.L	#4,D3		;* Y=2*X*Y+Q0
	SWAP	D3		;*
	ADD.W	A6,D3		;*******************

	MOVE.W	D2,D0		;*******************
	MOVE.W	D3,D1		;*
	MULS	D2,D2		;* MODULE=X^2+Y^2
	MULS	D3,D3		;*
	MOVE.L	D2,D6		;*
	ADD.L	D3,D6		;*******************

	CMP.L	#$10000000,D6	;TEST (4<<13)*2

				;ESSAYEZ   $20000000 ET  $40000000
	
	DBHI	D7,LOOP3

	BPL.S	OUT
	SWAP	D6
	AND	#31<<3,D6
	MOVE	D6,D7
	BRA.S	IN

OUT:
	ADDQ.W	#2,D7
	LSL	#3,D7
IN:				;REPARTITION DE LA COULEUR DE CHAQUE
				;PIXEL DANS LES 5 PLANS
	ADD.B	D7,D7		;BTPL5
	ADDX	D5,D5
	MOVE	A4,D2		;BTPL4
	ADD.B	D7,D7
	ADDX	D2,D2
	MOVE	D2,A4
	MOVE	A3,D2		;BTPL3
	ADD.B	D7,D7
	ADDX	D2,D2
	MOVE	D2,A3
	MOVE	A2,D2		;BTPL2
	ADD.B	D7,D7
	ADDX	D2,D2
	MOVE	D2,A2
	MOVE	A1,D2		;BTPL1
	ADD.B	D7,D7
	ADDX	D2,D2
	MOVE	D2,A1

	DBF	D4,LE_MOT
				;AFFICHAGE DANS LES 5 PLANS

	MOVE.W	YY,D1
	ADD.W	XX,D1

	LEA	BITPLAN,A0
	MOVE.W	A1,(A0,D1)
	LEA	TAILLE(A0),A0
	MOVE.W	A2,(A0,D1)
	LEA	TAILLE(A0),A0
	MOVE.W	A3,(A0,D1)
	LEA	TAILLE(A0),A0
	MOVE.W	A4,(A0,D1)
	LEA	TAILLE(A0),A0
	MOVE.W	D5,(A0,D1)

	ADD.W	#2,XX

	CMP.W	#CLARG,XX
	BMI	LOOP2

	ADD.W	#LARG,YY
	CMP.W	#LARG*HAUT,YY
	BMI	LOOP1

EXIT:
	RTS

;==============================
NEWCALC:	DC.W	0

NEWPOSI:			;CALCUL DU PAS (ZOOM)
	MOVE.W	#0,NEWCALC
	LEA	ZOOMXY,A0
	MOVE	(A0),D0
	MOVE	POSIX,D1
	MULU	D0,D1
	SUB	D1,X1
	MOVE	POSIY,D1
	MULU	D0,D1
	SUB	D1,Y1
	MOVE	LCOORSX,D1
	SUBQ	#1,D1
	MULU	D1,D0
	DIVU	#CLARG*8,D0
	ADDQ	#1,D0
	MOVE	D0,(A0)

	RTS
	
;====================
CYCLE_COLORS
	DC.W	$BBF,$99F,$78F,$57F,$36F,$25E,$35D,$45C,$55B,$64A
	DC.W	$749,$848,$947,$A36,$B35,$C34,$D43,$E42
	DC.W	$F41,$F51,$F61,$F71,$F81,$F91,$FA1,$FB1
	DC.W	$FC1,$FC3,$FD5,$FD7,$FE9,$EEC

;====================
;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	mt_arprout
mt_arp1:lea	mt_aud2temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp2
	lea	$dff0b0,a5
	BSR	mt_arprout
mt_arp2:lea	mt_aud3temp(PC),a6
	tst.b	3(a6)
	beq.s	mt_arp3
	lea	$dff0c0,a5
	BSR	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:
	DS.w	10
	dc.w	1
	DS.w	2
mt_aud2temp:
	DS.w	10
	dc.w	2
	DS.w	2
mt_aud3temp:
	DS.w	10
	dc.w	4
	DS.w	2
mt_aud4temp:
	DS.w	10
	dc.w	8
	DS.w	2
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:	DS.l	31
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
	
	SECTION COPPER,CODE_C
	
NEWCOPPER:   
		DC.W	$008E
WINSTART:	DC.B	FYMIN,FXMIN
		DC.W	$0090
WINSTOP:	DC.B	FYMAX,FXMAX	;DIMENSIONS DE L'ECRAN

		DC.W	$0092
DDFSTART:	DC.W	BXMIN
		DC.W	$0094
DDFSTOP:	DC.W	BXMAX

	;POINTEURS ADRESSE DES PLANS DE L'IMAGE
PLANS:
	DC.W $00E0
HI1:	DC.W 0				;PLAN 1		
	DC.W $00E2
LO1:	DC.W 0 
	DC.W $00E4
HI2:	DC.W 0				;PLAN 2
	DC.W $00E6
LO2:	DC.W 0
	DC.W $00E8
HI3:	DC.W 0				;PLAN 3
	DC.W $00EA
LO3:	DC.W 0
	DC.W $00EC
HI4:	DC.W 0				;PLAN 4
	DC.W $00EE
LO4:	DC.W 0 
	DC.W $00F0
HI5:	DC.W 0
	DC.W $00F2
LO5:	DC.W 0
	

	;REGISTRE POUR CHOISIR RESOLUTION	

		DC.W	$0100
RESOLUTION:	DC.W	$5200		

	;DECALAGE ECRAN

	DC.W	$0102,$11

	;PRIORITE DES PLANS ET SPRITES 

	DC.W 	$0104,$64

	;MODULOS DES PLANS

		DC.W	$0108
MODULO1:	DC.W	0	;MODULOS PLANS PAIRS
		DC.W 	$010A
MODULO2:	DC.W	0	;MODULOS PLANS IMPAIRS

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

SPRITES:
	DC.W	$0120,$0000,$0122,$0000
	DC.W	$0124,$0000,$0126,$0000
	DC.W	$0128,$0000,$012A,$0000
	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

SCOPPER:
	DC.W	$0180,$0bbf	;COULEUR 00
	DC.W	$0182,$099f	;COULEUR 01
	DC.W	$0184,$078f	;COULEUR 02
	DC.W	$0186,$057f	;COULEUR 03
	DC.W	$0188,$036f	;COULEUR 04
	DC.W	$018A,$025e	;COULEUR 05
	DC.W	$018C,$035d	;COULEUR 06
	DC.W	$018E,$045c	;COULEUR 07
	DC.W	$0190,$055b	;COULEUR 08
	DC.W	$0192,$064a	;COULEUR 09
	DC.W	$0194,$0749	;COULEUR 10
	DC.W	$0196,$0848	;COULEUR 11
	DC.W	$0198,$0947	;COULEUR 12
	DC.W	$019A,$0a36	;COULEUR 13
	DC.W	$019C,$0b35	;COULEUR 14
	DC.W	$019E,$0c34	;COULEUR 15
	DC.W	$01A0,$0d43	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W	$01A2,$0e42	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W	$01A4,$0f41	;COULEUR 18
	DC.W	$01A6,$0f51	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W	$01A8,$0f61	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W	$01AA,$0f71	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W	$01AC,$0f81	;COULEUR 22
	DC.W	$01AE,$0f91	;COULEUR 23
	DC.W	$01B0,$0fa1	;COULEUR 24
	DC.W	$01B2,$0fb1	;COULEUR 25
	DC.W	$01B4,$0fc1	;COULEUR 26
	DC.W	$01B6,$0fc3	;COULEUR 27
	DC.W	$01B8,$0fd5	;COULEUR 28
	DC.W	$01BA,$0fd7	;COULEUR 29
	DC.W	$01BC,$0fe9	;COULEUR 30
	DC.W	$01BE,$0eec	;COULEUR 31

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

	DC.W $FFDF,$FFFE

	DC.L $FFFFFFFE

	EVEN


;=================================
					;SPRITES

HG:					;SPRITE HAUT GAUCHE
	DC.W $2940,$3901
	DC.L $FFFF
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L $8000
	DC.L 0

BD:				;SPRITE BAS DROITE
	DC.W $2940,$3901
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $0001
	DC.L $FFFF
	DC.L 0

HD:				;SPRITE HAUT DROITE
	DC.W $2940,$3901
	DC.W $FFFF,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.W $0001,0
	DC.L 0

BG:				;SPRITE BAS GAUCHE
	DC.W $2940,$3901
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $8000,0
	DC.W $FFFF,0
	DC.L 0

TAILLE=LARG*HAUT		;TAILLE 1 PLAN

BITPLAN:	 DS.B  TAILLE*5	;TAILLE IMAGE 5 PLANS

MT_DATA:	INCBIN MODULE

	END

