*****  AFFICHEUR D'IMAGES IFF COMPRESSEES PAR EMMANUEL HOCDET
*****  ASSEMBLE AVEC GENIM2 V2.15
*****  RECONNAîT TOUS LES FORMATS DE DELUXE PAINT IV
*****  MODIFICATIONS ET DEBUGGAGE PAR FUNX/PHOENIX
*****  AVEC DEVPAC V 3.02
*****  PROGRAMME DE SLIDE SHOW PAR FUNX/PHOENIX


	OPT	C-	* opt case off

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

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

	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

WAIT2:
	LEA LISTE,A0
	MOVE.W CPT,D0
	MOVE.L (A0,D0),FILE
	JSR LOADING	

	BSR MAIN	

	BSR MET_ADRESSES

WAIT:
	CMP.B #$E0,$DFF006		;ATTENDANT 200 IEME LIGNE RASTER
	BNE.S WAIT			;SINON RETOURNE A WAIT
	
	btst #10,$dff016
	BEQ.S END	
	
	BTST	#6,$BFE001		;ATTENDANT PRESSION SUR BOUTON GAUCHE SOURIS
	BNE.S	WAIT			;SINON RETOURNE A WAIT

	move.w #0,resolution

	BSR FREEMEMORY

	ADD.W #4,CPT
	CMP.W #4*6,CPT
	Bne.S suite
	move.w #0,cpt
	suite:
	
	JMP WAIT2

END: 				;FIN:	
	BSR FREEMEMORY
	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
	
	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
;====================
FILEHD:		dc.l 0

DosBase:	dc.l 0
	
DosName:	dc.b 'dos.library',0

FilEPIC1:	dc.b 'PIC1_IFF',0
FilEPIC2:	dc.b 'PIC2_IFF',0
FilEPIC3:	dc.b 'PIC3_IFF',0
FilEPIC4:	dc.b 'PIC4_IFF',0
FilEPIC5:	dc.b 'PIC5_IFF',0
FilEPIC6:	dc.b 'PIC6_IFF',0

LISTE:	
	DC.L FILEPIC1,FILEPIC2,FILEPIC3
	DC.L FILEPIC4,FILEPIC5,FILEPIC6

CPT:	DC.W 0

	EVEN

file: 		dc.l 0

adresse: 	dc.l 0
	
;=====================
LOADING:
	MOVEM.L D0-D7/A0-A6,-(A7)

	MOVE.L #PICTURE,ADRESSE

	MOVE.L EXECBASE,A6	;PLACE ADRESSE EXECBASE DANS A6
	LEA DOSNAME,A1		;POINTE A1 SUR NOM LIBRAIRIE
	JSR OPENLIBRARY(A6)	;OUVRE LIBRAIRIE
	MOVE.L D0,DOSBASE	;MET ADRESSE LIBRAIRIE DANS DOSBASE
	MOVE.L D0,A6		;MET ADRESSE LIBRAIRIE DANS A6

	MOVE.L #1005,D2		;
	MOVE.L FILE,D1		;NOM DU FICHIER EN D1
	JSR OPEN(A6)		;OUVRE FICHIER
	MOVE.L D0,FILEHD	;HANDLE EN D0

	MOVE.L D0,D1		;HANDLE EN D1
	MOVE.L ADRESSE,D2	;ADRESSE DE LOAD
	MOVE.L #$FFFFF,D3	;LONGUEUR DU FICHIER
	JSR READ(A6)		;CHARGE FICHIER

	MOVE.L FILEHD,D1	;HANDLE EN D1
	JSR CLOSE(A6)		;FERME FICHIER

	MOVE.L EXECBASE,A6	;ADRESSE EXEC EN D6
	MOVE.L DOSBASE,A1	;ADRESSE DOS EN A1
	JSR CLOSELIBRARY(A6)	;FERME LIBRAIRIE DOS

	MOVEM.L (A7)+,D0-D7/A0-A6
	RTS

;====================
MET_ADRESSES:				;CHARGE ADRESSE DE L'IMAGE DANS LA COPPER LIST
	MOVE.L ADR_ECR,D0		;MET ADRESSE DE L'IMAGE DANS D0 (MOT LONG =
					;PAR EXEMPLE $0005 0000 = D0
	MOVE.W D0,LO1			;MET $0000 DANS LO1
	SWAP D0				;INVERSE D0 = $0000 0005
	MOVE.W D0,HI1			;MET $0005 DANS HI1
	SWAP D0				;INVERSE D0 = $0005 0000
	ADD.W SEPARATION,D0		;AJOUTE LA LONGUEUR D'UN PLAN DANS D0
					;ET RECOMMENCE POUR LE PLAN SUIVANT
	MOVE.W D0,LO2
	SWAP D0
	MOVE.W D0,HI2
	SWAP D0
	ADD.W SEPARATION,D0
	
	MOVE.W D0,LO3
	SWAP D0
	MOVE.W D0,HI3
	SWAP D0
	ADD.W SEPARATION,D0
	
	MOVE.W D0,LO4
	SWAP D0
	MOVE.W D0,HI4
	SWAP D0
	ADD.W SEPARATION,D0
	
	MOVE.W D0,LO5
	SWAP D0
	MOVE.W D0,HI5
	SWAP D0
	ADD.W SEPARATION,D0
	
	MOVE.W D0,LO6
	SWAP D0
	MOVE.W D0,HI6
	
	
	RTS
;====================
FREEMEMORY:

	MOVE.L	ADR_ECR,A1
	MOVE.L	TAILLE_ECR,D0
	BEQ.S	RIEN
	MOVE.L EXECBASE,A6
	JSR -210(A6)			;FREEMEM
RIEN:
	RTS
;====================
MAIN:

	LEA	PICTURE,A4		;IMAGE IFF
	BSR	DECRUNCHIFF		;
	BMI	FIN


	MOVE	NB_PLANS,D0		;
	ROR.W	#4,D0
	MOVE	MODE_ECR,D1
	AND	#$8804,D1
	OR	D1,D0
	OR	#$200,D0		;MODE COULEUR
	MOVE	D0,RESOLUTION		;BPLCON0

	MOVE	X_ECR,D3		;PREPARATION POUR LE CALCUL
	MOVEQ	#17,D4			;DE LA TAILLE DE LA FENêTRE
	MOVE	#$FFF8,D5
	MOVE	D1,D0
	AND	#$8000,D0
	BEQ.S	NO_HIRES
	MOVEQ	#9,D4			;...POUR LE HIRES
	MOVE	#$FFFC,D5
	MOVE	D3,D0
	LSR.W	#1,D0
	MOVE	D0,X_ECR
NO_HIRES:
	MOVE	NB_PLANS,D0
	MOVE	D3,SEPARATION		;...ENTRE DEUX BITPLANS
	CLR.L	LACEVAL

	AND	#$0004,D1
	BEQ.S	NO_LACE
	MOVE	D3,D1			;...POUR LE LACE
	MULU	D0,D1
	MOVE.L	D1,LACEVAL		;VALEUR DE L'AUTRE SERIE DE BITPLANS
	ADD	D0,D0
	LEA	Y_ECR,A0
	MOVE	(A0),D1
	LSR.W	#1,D1
	MOVE	D1,(A0)
	BCLR	#15,$DFF02A
NO_LACE:
	SUBQ	#1,D0
	MULU	D0,D3			;MODULO= XOCTET*(NBPLANS-1)
	MOVE	D3,MODULO1		;MODULO PLANS
	MOVE	D3,MODULO2

	MOVE	Y_ECR,D0		;DIWSTRTYV=166-HAUTEUR_ECRAN/2
	LSR.W	#1,D0
	NEG.W	D0
	ADD.W	#166,D0
	LSL.W	#8,D0
	MOVE	X_ECR,D1		;DIWSTRTXV=289-LARGEUR_ECRAN/2
	LSL.W	#2,D1			;8/2 = *4
	NEG.W	D1
	ADD.W	#289,D1
	OR	D1,D0
	MOVE	Y_ECR,D2		;DIWSTOPYV=HAUTEUR_ECRAN/2-90
	LSR.W	#1,D2
	SUB.W	#90,D2
	LSL.W	#8,D2
	MOVE	X_ECR,D3		;DIWSTOPXV=LARGEUR_ECRAN/2+33
	LSL.W	#2,D3			;8/2 = *4
	ADD.W	#33,D3
	OR	D3,D2
	SUB	D4,D1			;DDFSTRT=(DIWSTRTXV-17)/2
	LSR	#1,D1
	AND	D5,D1
	MOVE	X_ECR,D3		;DDFSTOP=DDFSTRT+(LARGEUR_ECRAN/16-1)*8
	LSR	#1,D3
	SUBQ	#1,D3
	LSL	#3,D3
	ADD	D1,D3

	MOVE.W	D0,WINSTART		;DISPLAY WINDOW START
	MOVE.W	D2,WINSTOP		;DISPLAY WINDOW STOP
	MOVE.W	D1,DDFSTART		;DISPLAY DATA FETCH START
	MOVE.W	D3,DDFSTOP		;DISPLAY DATA FETCH STOP

FIN:
	RTS


*****
*****	DéCRUNCHAGE DE L'IMAGE IFF
*****
DECRUNCHIFF:
		CMP.L	#'FORM',(A4)
		BNE	ERREUR
		ADD.L	#8,A4
		CMP.L	#'ILBM',(A4)	;IMAGE IFF ?
		BNE	ERREUR
		ADD.L	#8,A4
		MOVE.L	(A4),D5		;BMHD LONG
		MOVE.L	4(A4),X_ECR		;VALS X ET Y DE L'ECRAN
		MOVE.B	12(A4),NB_PLANS+1	;NOMBRE DE BITPLANS
		ADD.L	D5,A4
		ADD.L	#8,A4
		MOVE.L	A3,D6		;ADRESSE OU METTRE LES
		BEQ.S	NOCMAP		;COULEURS = 0 ?
		MOVE.L	A4,A6		;CMAP LONG
		BSR	IFFCOULEUR
NOCMAP:
		MOVE.L	(A4)+,D5
		ADD.L	D5,A4

CHERCHE:	CMP.L	#'CAMG',(A4)	;MODES DE L'AMIGA
		BNE.S	RECHERCHE
		MOVE	10(A4),MODE_ECR
RECHERCHE:	CMP.L	#'BODY',(A4)	;DEBUT DES DONNéES
		LEA	2(A4),A4
		BNE.S	CHERCHE
		MOVE.L	2(A4),D4
		ADD.L	#6,A4

		MOVE	X_ECR,D0	;CALCUL DE LA TAILLE DE L'ECRAN
		LSR	#3,D0
		MOVE	D0,X_ECR
		MULU	Y_ECR,D0
		MULU	NB_PLANS,D0
		MOVE.L	D0,TAILLE_ECR

		MOVE.L	#$02,D1
		MOVE.L EXECBASE,A6
		JSR -198(A6)		;ALLOCMEM
		MOVE.L	D0,ADR_ECR
		BEQ	ERREUR
		MOVE.L	D0,A5

DECRUNCH:	MOVEQ	#0,D5		;DECOMPACTAGE
		MOVE.B	(A4)+,D5
		BMI.S	CRUNCH
		SUB.L	D5,D4		;< 128
RECOPY:		MOVE.B	(A4)+,(A5)+
		DBF	D5,RECOPY
		BRA.S	TEST
CRUNCH:		NEG.B	D5		;> 128
		MOVE.B	(A4)+,D6
REMPLI:		MOVE.B	D6,(A5)+
		DBF	D5,REMPLI
TEST:		SUBQ.L	#2,D4		;CODE + 1ER OCTET = 2
		BHI.S	DECRUNCH
		MOVEQ	#0,D7
		RTS

ERREUR:		CLR.L	TAILLE_ECR
		MOVEQ	#-1,D7
		RTS



IFFCOULEUR:			;MISE EN PLACE COULEURS DANS LISTE COPPER
	LEA SCOPPER+2,A1
	LEA PICTURE,A0
EVIENTA:
	CMP.L #"CMAP",(A0)+
	BNE EVIENTA
	ADD.L #$4,A0
	MOVE.W #31,D1	;32 COULEURS -1
COULEUR:
	CLR.L D0
	CLR.L D3
	MOVE.B (A0)+,D0
	LSL.W #4,D0
	ADD.B (A0)+,D3
	MOVE.B (A0)+,D0
	LSR.B #4,D0
	ADD.L D0,D3
	MOVE.W D3,(A1)
	ADD.L #4,A1
	DBRA D1,COULEUR
	RTS

LACEVAL:	DC.L	0
SEPARATION:	DC.W	0
MODE_ECR:	DC.W	0
NB_PLANS:	DC.W	0
X_ECR:		DC.W	0
Y_ECR:		DC.W	0
TAILLE_ECR:	DC.L	0
ADR_ECR:	DC.L	0

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

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

PICTURE:	DS.B 160000	;ESPACE MEMOIRE POUR IMAGE IFF

;====================
	EVEN				;NOTRE LISTE COPPER
	
	SECTION COPPER,CODE_C
	
NEWCOPPER:   
		DC.W	$008E
WINSTART:	DC.W	$2A81
		DC.W	$0090
WINSTOP:	DC.W	$2AD1	;DIMENSIONS DE L'ECRAN

		DC.W	$0092
DDFSTART:	DC.W	$0038
		DC.W	$0094
DDFSTOP:	DC.W	$00D0

	;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
	DC.W $00F4
HI6:	DC.W 0
	DC.W $00F6
LO6:	DC.W 0
	

	;REGISTRE POUR CHOISIR RESOLUTION	

		DC.W	$0100
RESOLUTION:	DC.W	$0000		

	;DECALAGE ECRAN

	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - INUTILISE ICI

	DC.W 	$0104,$0000

	;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

	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

SCOPPER:
	DC.W	$0180,$0000	;COULEUR 00
	DC.W	$0182,$0ffc	;COULEUR 01
	DC.W	$0184,$0ff9	;COULEUR 02
	DC.W	$0186,$0fe6	;COULEUR 03
	DC.W	$0188,$0fd3	;COULEUR 04
	DC.W	$018A,$0fb0	;COULEUR 05
	DC.W	$018C,$0e90	;COULEUR 06
	DC.W	$018E,$0c80	;COULEUR 07
	DC.W	$0190,$0b70	;COULEUR 08
	DC.W	$0192,$0a60	;COULEUR 09
	DC.W	$0194,$0850	;COULEUR 10
	DC.W	$0196,$0740	;COULEUR 11
	DC.W	$0198,$0630	;COULEUR 12
	DC.W	$019A,$0520	;COULEUR 13
	DC.W	$019C,$0420	;COULEUR 14
	DC.W	$019E,$0210	;COULEUR 15
	DC.W	$01A0,$0950	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W	$01A2,$0432	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W	$01A4,$0222	;COULEUR 18
	DC.W	$01A6,$0333	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W	$01A8,$0444	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W	$01AA,$0555	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W	$01AC,$0666	;COULEUR 22
	DC.W	$01AE,$0777	;COULEUR 23
	DC.W	$01B0,$0888	;COULEUR 24
	DC.W	$01B2,$0999	;COULEUR 25
	DC.W	$01B4,$0aaa	;COULEUR 26
	DC.W	$01B6,$0bbb	;COULEUR 27
	DC.W	$01B8,$0ccc	;COULEUR 28
	DC.W	$01BA,$0ddd	;COULEUR 29
	DC.W	$01BC,$0eee	;COULEUR 30
	DC.W	$01BE,$0fff	;COULEUR 31

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

	DC.W $FFDF,$FFFE

	DC.L $FFFFFFFE

	EVEN

MT_DATA:	INCBIN MODULE

	END

