*****  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 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	

	MOVE.W #0,RESOLUTION

	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

	BSR FREEMEMORY

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

END: 				;FIN:	
	BSR FREEMEMORY
	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)

	
	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 'PIC_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
FilEPIC7:	dc.b 'PIC7_IFF',0

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

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

PICTURE:	DS.B 180000	;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




	END

