	LES CARTES GRAPHIQUES: SUITE!

	Dans le numro 115, j'avais parl des modes 256 et 32768 couleurs.
Attaquons nous aux autres modes: le monochrome et le 16 couleurs. Mais
d'abord, une petite correction, il manquait une ligne dans la routine
"Nova_2_Falc_256" (ST Mag 115), un "swap d1" doit tre ajout vers la fin
du listing:
	...
	dbf d1,.pixels_16
	move d6,d5
	swap d6
	swap d1
	...

	Merci  Olivier!


Le Mode Monochrome
------------------
	Ce dernier ne pose aucun problme puisque le codage est exactement
le mme sur une carte que sur l'cran Atari normal:
	1 octet = 8 pixels (bit  1 pour noir, bit  0 pour blanc).
L'cran ST Haute contient donc 640x400 = 256000 bits = 32000 octets.

	Certains programmes cependant refusent obstinment de tourner sur
carte ou ont un affichage incomplet: au dbugger on se rend compte qu'ils
utilisent deux crans (l'un affich, l'autre en cours de construction) et
qu'ils basculent de l'un  l'autre. Seulement pour basculer ils utilisent
les registres hardware du ST, ce qui n'a aucun effet sur la carte
graphique!

Le Mode 16 couleurs
-------------------
	Ce mode pose un petit problme sur une carte graphique, car tous
les plans ne sont pas accessibles en mme temps! La RAM ne se comporte pas
comme une mmoire normale, elle ne donne accs qu' un quart des
informations  la fois: il faudrait accder aux registres hardwares
de la carte pour pouvoir passer d'un plan  l'autre.
	Bref, devant le peu de portabilit de cette mthode, je me suis
tourn vers nos bonnes vieilles fonctions VDI. Ces fonctions disposent de
deux modes: le mode indpendant et le mode shifter. Le mode shifter
correspond au format cran et varie selon qu'on dispose d'une carte
graphique ou non, le mode indpendant est une dfinition standard
valable pour toutes les stations.

	Le mode shifter Atari
	- - - - - - - - - - -

	Comme pour les 256 couleurs TT ou Falcon, tous les modes 16
couleurs Atari sont en 4 plans entrelacs, c'est  dire qu'il faut 4 mots
de 16 bits pour reconstituer 16 pixels conscutifs:
	mot0: a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0
	mot1: a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1
	mot2: a2b2c2d2e2f2g2h2i2j2k2l2m2n2o2p2
	mot3: a3b3c3d3e3f3g3h3i3j3k3l3m3n3o3p3

	Le premier pixel tant: a3a2a1a0 (de 0  15), le second b3b2b1b0,
etc... C'est  dire que le mot0 contient tous les bits de poids faible
jusqu'au mot3 qui contient tous les bits de poids fort des 16 pixels.

	Suite  ces 4 mots, on trouve une autre srie de 4 mots
dfinissant les 16 pixels suivants: ainsi pour une ligne de 320 pixels, il
y a 20 groupes de 4 mots, donc 20*4*2=160 octets par ligne.

	Le mode indpendant
	- - - - - - - - - -

	Il est trs proche du mode shifter, sauf que les mots ne sont pas
rangs en mmoire dans le mme ordre, au lieu d'avoir:

	ligne0: mot0-1-2-3   mot0-1-2-3 ....
	ligne1: mot0-1-2-3   mot0-1-2-3 ....
	....

	On organise les donnes ainsi:

	plan0:
	ligne0: mot0, mot0, mot0 ....
	ligne1: mot0, mot0, mot0 ....
	....

	plan1:
	ligne0: mot1, mot1, mot1, ...
	ligne1: mot1, mot1, mot1, ...
	...

	plan2:
	ligne0: mot2, mot2, mot2, ...
	ligne1: mot2, mot2, mot2, ...
	...

	plan3:
	ligne0: mot3, mot3, mot3, ...
	ligne1: mot3, mot3, mot3, ...
	...

	C'est  dire que le plan0 contient tous les mots0 de toutes les
lignes de l'image, ensuite vient le plan1 avec tous les mots1 de toutes les
lignes de l'image... jusqu'au plan3.

	C'est la fonction VR_TRNFM (VDI 110) qui s'occupe de la conversion
entre les deux formats. Il tait conseill DES LES DEBUTS du ST de
toujours utiliser cette fonction:
	* pour sauver une partie d'cran:
	- la copier depuis l'cran dans un buffer (Shifter)
	- appeler vr_trnfm (conversion shifter->indpendant)
	- sauver le buffer (indpendant)

	* pour afficher:
	- lire les donnes dans un buffer (indpendant)
	- appeler vr_trnfm (conversion indpendant->shifter)
	- copier vers l'cran (shifter)

	Si tout le monde s'en tait tenu l, les vieux programmes
tourneraient encore sur une carte graphique en 16 couleurs! En effet,
chaque carte est livre avec ses drivers VDI qui adaptent la fonction
VR_TRNFM. Seulement, et c'est bien comprhensible, pour des raisons de
rapidit et d'absence totale de cartes graphiques pendant des annes, les
programmeurs ont travaill uniquement avec le format shifter pensant que
ce serait le seul et unique pour les sicles  venir...

	Le format Shifter sur NOVA 16 couleurs
	- - - - - - - - - - - - - - - - - - - -

	Attention, roulement de tambour...... c'est le format INDEPENDANT!
De ce fait, les drivers VDI de cette carte contiennent pour la fonction
VR_TRNFM une routine vide!
	Quelle est l'utilit d'appeler une telle routine puisqu'elle est
vide? Tout simplement pour assurer  votre code la compatibilit avec tout
type d'affichage 16 couleurs.

	Les routines
	- - - - - - -

	Normalement donc, la fonction vr_trnfm devrait suffire  toutes
les conversions, malgr tout, on peut avoir besoin d'une routine dans
certains cas comme par exemple:
	- un programme dispose de fichiers images au format shifter Atari
	et n'appelle donc pas vr_trnfm, il suffit de convertir ces
	fichiers sur le disque au format shifter NOVA et le programme
	affichera correctement les images sur une carte.

; shifter NOVA vers shifter Atari
; ou Indpendant vers shifter Atari
; 60 octets
; Utilse D7, A0-A4

	BSS

; zone suffisante pour un cran ST Basse

source_nova: ds.b 320*200/2
dest_atari: ds.b 320*200/2

largeur: ds.w 1
hauteur: ds.w 1

	TEXT

NOVA_2_ATARI:
	move largeur,d7
; on aligne d7 sur un multiple de 16
	add.w #15,d7
; d7 contient le nombre de
; paquets de 16 pixels par ligne
	lsr #4,d7
; d7 contient le nombre de
; paquets de 16 pixels pour l'image
	muls hauteur,d7
; le double correspond au nombre
; de 8 pixels pour l'image
; donc au nombre d'octets par plan!
	add.l d7,d7
; a0 pointe sur le plan0 NOVA
	lea source_nova,a0
; a1 sur le plan1
	lea 0(a0,d7.l),a1
; a2 sur le plan2
	lea 0(a1,d7.l),a2
; a3 sur le plan3
	lea 0(a2,d7.l),a3
; a4 sur le buffer entrelac Atari
	lea dest_atari,a4
entrelace_plans:
; on entrelace les 4 plans
	move.w (a0)+,(a4)+
	move.w (a1)+,(a4)+
	move.w (a2)+,(a4)+
	move.w (a3)+,(a4)+
	subq.l #2,d7
	bne.s entrelace_plans
	rts


; shifter Atari vers shifter NOVA
; ou shifter Atari vers indpendant
; 60 octets
; Utilise D7, A0-A4

	BSS

source_atari: ds.b 320*200/2
dest_nova: ds.b 320*200/2

largeur: ds.w 1
hauteur: ds.w 1

ATARI_2_NOVA:
; mme dmarrage qu'avant, d7 contient
; finalement la taille d'un plan en octets
	move largeur,d7
	add.w #15,d7
	lsr #4,d7
	muls hauteur,d7
	add.l d7,d7
; dans a4 le buffer Atari  convertir
	lea source_atari,a4
; a0 va pointer sur le plan0 NOVA
	lea dest_nova,a0
; a1, a2 et a3 sur les autres plans
	lea 0(a0,d7.l),a1
	lea 0(a1,d7.l),a2
	lea 0(a2,d7.l),a3
separe_plans:
	move.w (a4)+,(a0)+
	move.w (a4)+,(a1)+
	move.w (a4)+,(a2)+
	move.w (a4)+,(a3)+
	subq.l #2,d7
	bne.s separe_plans
	rts

	Voil quelques outils que, j'espre, vous saurez utiliser pour
rendre vos crations les plus compatibles possibles au niveau de
l'affichage.

	Vos ractions sur Internet sont les bien venues,
	Guillaume Tello
	gtello@planete.net