;
;	afficheur d'image pendant le calcul
;	le 3/05/1992
;	(c) 92 by oulan bator
;	adapte … l'affichage imm‚diat par RedRackam
;	donc egalement (c) 92 by RedRackam

; repris integralement, enormememnt modifie
;	ameliore et commente le 20/06/1992
;    par RedRackam

;	importation et exportation vers le C

        .EXPORT aff_rend
        .EXPORT	calc_palette2
        .EXPORT	init_linea
		.EXPORT chg_palette
		.EXPORT	calc_corresp
		.EXPORT aff_ligne

		.IMPORT lim				        
 		.IMPORT	lasty	; dernier point en y
		.IMPORT	lastx	;			       x
		.IMPORT	dim_x	; dimension en x
		.IMPORT	dim_y	; dim en y
		.IMPORT color			
		.IMPORT nb_coul
		.IMPORT	inter
		.IMPORT res
		.IMPORT indx
		.IMPORT index
		.IMPORT	ptr_ligne

calc_palette2:
; cette procedure calcule la palette optimale en nb_coul couleur
; pour cela, elle utilise une copie de la table des occurences
; des couleurs 
;	sur FALCON, EN TRUE COLOR, ELLE NE DOIT PAS ETRE APPELEE
; entrees:
; -------
;	color	: table des occurences des couleurs
;	nb_coul : nombre de couleur affichables simultanements
; sorties:
; --------
;   indx:	tables des numeros de couleurs tries pour les
;			nb_coul les plus utilisees (le numero est constitu‚
;			ainsi: RRRRGGGGBBBB)
;	color: table des occurences triees
; lim	: nb de couleur utilisees
;	et si lim<nb_coul
;		indx : tables des numero de couleurs tries par ordre 
;				d'apparition … l'image
;		index: table inverse (couleur j =>indice palette i)

	movem.l	d0-d7/a0-a6,-(sp)	; sauvegarde des registres
	move.w	lim,d2		; d2 =nb_couleur_used-1
	addq.w	#1,d2		; d2=d2+1
	cmp.w	nb_coul,d2		; if (d2>nb_coul)
	bgt	tri_color		; { goto tri_color }
	
	lea	indx,a0
	lea	color,a1
	lea	index,a2
	move.w	#-1,d3			;
	move.w	#4095,d0		; for (i=0;i=<4095;)

abc1:	addq.w	#1,d3		;	i++	
		move.l	(a1)+,d1	; {	d1=color(i-1)	; si la couleur est utilisee
		beq	abc2			; 	if (d1)
		move.w	d3,d4
		add.w	d4,d4		;	d4=i*2
		cmp.w	#-1,(a2,d4.w)	; on regarde si la couleur a deja un numero d'index2
		bne	abc2			; si oui, sauter
		addq.w	#1,lim		; 
		move.w	lim,d2		;
		move.w	d2,(a2,d4.w)	; sinon, le numero d'index est le nombre de couleur
							; utilise
		add.w	d2,d2					
		move.w	d3,(a0,d2.w) ; sauver la couleur dans le tableau utilise par les chg_palette
abc2:	dbra	d0,abc1
	movem.l	(sp)+,d0-d7/a0-a6
	rts

tri_color:
	lea	indx+2*4096,a0
	move.w	#4095,d0		; for (i=0;i<4096;i++)
bcl2_0:	move.w	d0,-(a0) 	;	indx(i)=i
	dbra	d0,bcl2_0
	
tri_color_avec_indx:
	; on tri les couleurs par ordre d'utilisation decroissante	
	; et dans le tableau index, on obtient les numero de couleurs tries
	; en entree, on a dans le tableau color pour chaque couleur le nb d'occurence
	; et dans le tableau indx le numero des couleurs dans l'odre

	; en sortie, on a dans color le nombre d'occurence trie
	; et dans indx les indices des couleurs tries de meme
	move.w	#2048,d0
bcl10:	move.w	#4095,d1
	sub.w	d0,d1
bcl11:	moveq	#-1,d2
	move.w	d1,d4
	clr.w	d3
	lea	color,a0
	lea	indx,a1
; version 68020 ou plus
;	lea	(a0,d0.w*4),a2		; on lit le nb d'occurence couleur d0
;	lea	(a1,d0.w*2),a3		; et l'index correspondant
;version 68000
	move.w	d0,d5
	add.w d5,d5
	lea (a1,d5.w),a3
	add.w	d5,d5
	lea	(a0,d5.w),a2

bcl12:	cmp.l	(a0)+,(a2)+	; on compare avec le nb occurence couleur courante
	ble	rien10
	move.l	-(a0),d5		; si >, on echange la couleur courante
	move.l	-(a2),(a0)+		; et celle comparee
	move.l	d5,(a2)+		; ainsi que les index
	move.w	(a1),d5
	move.w	(a3),(a1)
	move.w	d5,(a3)
	move.w	d3,d2
rien10:addq.w	#1,d3
	addq.l	#2,a1
	addq.l	#2,a3
	dbra	d4,bcl12
	move.w	d2,d1
	sub.w	d0,d1
	bmi	rien11
	tst.w	d2
	bpl	bcl11
rien11:lsr.w	#1,d0
	bne	bcl10

	movem.l	(sp)+,d0-d7/a0-a6
	rts
	

;--------------------------------------------------------

	calc_corresp:
;	cette procedure calcule les correspondances entres les couleurs
;	sur nb_bits et la couleur obtenue dans la palette des
;	nb_coul affichables
;	sur FALCON, EN TRUE COLOR, ELLE NE DOIT PAS ETRE APPELEE
; entrees:
; -------
;	color	: table des couleurs tries par ordre decroissant
;			 d'utilisation
;   indx:	tables des numeros de couleurs tries pour les
;			nb_coul les plus utilisees (le numero est constitu‚
;			ainsi: RRRRGGGGBBBB)
;	nb_coul	: nombre de couleur de la palette
;
; sorties:
; --------
;	index	: table des equivalences. pour chaque couleur,
;				on trouve le numero de la composante de la palette
;				la + proche
;
;	indx2 : tableau des couleurs (indice palette i=couleur indx2(j))
;		

	movem.l	d0-d7/a0-a6,-(sp)	; sauvegarde des registres
;	initialisation des tables d'index
	lea.l	indx2,a2


	lea	indx2,a0		; for (i=0;i<nb_coul;i++)
	move.w	nb_coul,d0		; 
	clr.l	d1
	move.w	d0,d1
	add.w	d1,d1
	add.l	d1,a0
	subq.w	#1,d0		; {	
bcl21:	move.w	d0,-(a0) ; 	indx2(i)=i;
	dbra	d0,bcl21	; }
	 
	move.w	nb_coul,d0	;	if (nb_coul>nbcoul_used)
	cmp.w	lim,d0		;
	bgt	fin				;
	
analyse_passe_3:		; {

	lea	indx,a1
	clr.l	d0
	move.w	nb_coul,d0
	add.w	d0,d0	
	add.l	d0,a1		;
	
	lea	indx2,a2		;
	move.l	a2,a0		;	a2=indx2
	add.l	d0,a2		;						
	move.w	lim,d0		;	d0=nb_coul_used-nb_coul
	sub.w	nb_coul,d0
bcl30:	move.w	(a1)+,d3	; for (i=nb_coul;i<nb_coul_used;i++)
	move.w	d3,d1			; {	d3=indx(i);	/* recuperation de la couleur	*/
	lsr.w	#8,d1			; 		d1=d3/256;
	move.w	d3,d2			;		d2=(d3/16)&15;	/* decomposition en 3 index de couleur	*/
	lsr.w	#4,d2			; 
	and.w	#$f,d2			;		d3=d3&15;
	and.w	#$f,d3			;		

	lea	indx,a3				;	
	move.w	#4096,a4		;	a4=dist_min=4096;
	move.w	nb_coul,d4		;
	subq.w	#1,d4			;		

bcl31:						;		for (d4=nb_coul-1;d4>=0;d4--)
	move.w	(a3)+,d5			;		{	
	move.w	d5,d6			;			d5=index(d4)
	lsr.w	#8,d6			; 			d6=d5/256;	
	sub.w	d1,d6			;			d6=d6-d1
	bpl	pls1				;			if (d6<0)
	neg.w	d6				;				d6=-d6

pls1:	move.w	d6,d7		;		d7=d6		
	move.w	d5,d6			;		d6=(index(d4)/16)&15
	lsr.w	#4,d6			;
	and.w	#$f,d6			;
	sub.w	d2,d6			;		d6=d6-d2
	bpl	pls2				; 		if (d6<0)
	neg.w	d6				;			d6=-d6
pls2:	add.w	d6,d7		;		d7=d7+d6
	move.w	d5,d6			;		d6=d5&15
	and.w	#$f,d6			;
	sub.w	d3,d6			;		d6=d6-d3
	bpl	pls3				; 		if (d6<0)
	neg.w	d5				;			d6=-d6
pls3:	add.w	d6,d7		;	d7=d7+d6
	cmp.w	d7,a4			; 	if (d7<a4)	/* distance <dist_min	*/
	ble	suiv				
	move.w	d7,a4			; 		a4=d7  /*dist=dist_min */
	move.w	nb_coul,d7		;	
	subq.w	#1,d7			;		
	sub.w	d4,d7			;
	move.w	d7,(a2)			;		indx2(i)=d4;
suiv:	dbra	d4,bcl31	;	}	/* boucle en d4	*/
	addq.l	#2,a2			;	
	dbra	d0,bcl30		;}	/* boucle en i	*/

	move.w	nb_coul,d0
	move.w	d0,lim
fin:

; calcul du tableau inverse
;---------------------------
com: move.w	lim,d0
	lea	index,a0		;tableau inverse (couleur ni =>palette j)
	lea	indx,a1			; index des couleurs tries (palette j)	
	lea	indx2,a2		; tableau direct (palette j->couleur i)

ab1:	move.w	(a1)+,d1
	add.w	d1,d1		; d1=d1*2  
	move.w	(a2)+,(a0,d1.w)
	dbra	d0,ab1
	movem.l	(sp)+,d0-d7/a0-a6
	rts

; fin du calcul de la table des equivalences

;-----------------------------------------------------

chg_palette:
;	cette routine effectue le changement de palette
;	sur FALCON, EN TRUE COLOR, ELLE NE DOIT PAS ETRE APPELEE
;
; entrees:
;	indx:	tables des nb_coul a utilisee sous leur format
;			RRRRGGGGBBBB
;	nb_coul	: nombre de couleur de la palette
;				
	movem.l	d0-d7/a0-a6,-(sp)	; sauvegarde des registres
	move.w	lim,d0
	lea.l	indx,a0
	move.w	res,d1	
	cmp.w	#3,d1		; resolution >4	*/
	ble	pas_tt
	clr.w	d1
bcl40:	; ici, on se propose de definir la nouvelle palette
	movem.l	d0-d1/a0,-(sp)
	move.w	(a0),-(sp)
	move.w	d1,-(sp)
	move.w	#83,-(sp)
	trap	#14
	addq.l	#6,sp
	movem.l	(sp)+,d0-d1/a0
	addq.l	#2,a0
	addq.w	#1,d1
	dbra	d0,bcl40
	bra	finch
pas_tt:
	clr.w	d1
bcl50:	movem.l	d0-d1/a0,-(sp)
	move.w	(a0),-(sp)
	move.w	d1,-(sp)
	move.w	#7,-(sp)
	trap	#14
	addq.l	#6,sp
	movem.l	(sp)+,d0-d1/a0
	addq.l	#2,a0
	addq.w	#1,d1
	dbra	d0,bcl50
finch:	movem.l	(sp)+,d0-d7/a0-a6
	rts


aff_rend:
;	routine de remapage de la zone
;	entrees:
;	-------
;		inter:	pointeur sur la zone contenant
;				les couleurs sur 12 bits ST/TT
;		index: table des equivalences.
;				la couleur num i utilise l'indice de 
;				palette index(i)
	movem.l	line_a_a1,a1-a3
	move.l	inter,a0		; a0=inter
	lea	index,a4			;a4=index
	move.w	lasty,d0		; d0=y
	clr.w	d1				;
bcl60:	move.w	dim_x,d2
	subq.w	#1,d2			/* -1	*/
	clr.w	d3
bcl61:	move.w	d3,(a2)		; x
	move.w	d1,(a3)			;y
	move.w	(a0)+,d4		; recuperer le numero de la couleur 
;version 68000
	add.w	d4,d4
	move.w	(a4,d4.w),(a1)
;version 68020 ou plus		
;	move.w	(a4,d4.w*2),(a1); recuperer la couleur correspondante
	movem.l	d0-d3/a0-a4,-(sp)
	dc.w	$a001		;	line_a putpixel
	movem.l	(sp)+,d0-d3/a0-a4
	addq.w	#1,d3
	dbra.w	d2,bcl61
	addq.w	#1,d1
	dbra.w	d0,bcl60
	rts
	
aff_ligne:	
	movem.l	d0-d7/a0-a6,-(sp)
	movem.l	line_a_a1,a1-a3
	move.l	ptr_ligne,a0
	lea	index,a4
	move.w	lasty,d0
	move.w	dim_x,d2
	subq.w	#1,d2			/* -1	*/
	clr.w	d3
bcl71:	move.w	d3,(a2)		; x
	move.w	d0,(a3)			;y
	move.w	(a0)+,d4		; recuperer le numero de la couleur (0<x<4095)
;version 68000
	add.w	d4,d4
	move.w	(a4,d4.w),(a1)
;version 68020 ou plus		
;	move.w	(a4,d4.w*2),(a1); recuperer la couleur correspondante
	movem.l	d0-d3/a0-a4,-(sp)
	dc.w	$a001		;	line_a putpixel
	movem.l	(sp)+,d0-d3/a0-a4
	addq.w	#1,d3
	dbra.w	d2,bcl71
	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
init_linea:
	movem.l	d0-d7/a0-a6,-(sp)
	dc.w	$a000
	move.l	(8,a0),a1
	move.l	(12,a0),a2
	lea	(2,a2),a3
	movem.l	a1-a3,line_a_a1
	movem.l	(sp)+,d0-d7/a0-a6
	rts
.bss
	
handle:	ds.w	1
x:	ds.w	1
y:	ds.w	1
indx2:	ds.w	4096
line_a_a1: ds.l	1		; pour stocker les resultat du ligne_a_init
line_a_a2: ds.l	1		; pour stocker les resultat du ligne_a_init
line_a_a3: ds.l	1		; pour stocker les resultat du ligne_a_init

	ds.l	1024
pile:	ds.l	1

	end