Manuel d'utilisation du BLITTER

From Atari Wiki
Revision as of 09:36, 17 April 2007 by Frost242 (talk | contribs)
Jump to navigation Jump to search



                 Manuel d'utilisation du 'BLITTER'
     
             (Processeur de transfert de blocs de bits)


                        ATARI Corporation

                      Sunnyvale, California

                          17 Juin 1987.










1.  Introduction

2.  Transferts de blocs de bits

3.  Description fonctionnelle

4.  Modèles de programmation
     4.1.  Carte des registres
     4.2.  Adresses des blocs de bits
     4.3.  Cadrages des blocs de bits
     4.4.  Opérations logiques
     4.5.  Accès au bus

Annexe A: Exemple de programmation

Annexe B: Fonction XBios de configuration du 'blitter'

Annexe C: Références











     Cette documentation se limite … une description fonctionnelle 
du 'BLITTER' de l'ATARI ST. Il ne constitue ni une notice 
d'installation du circuit, ni un manuel de programmation de ce 
circuit. Pour plus d'informations, référez-vous … l'Annexe C en 
fin de ce chapitre.



1. INTRODUCTION

     Le processeur de transfert de blocs de bits de l'Atari ST 
("Bit-Block Transfer Processor", BLITTER) constitue la traduction 
matérielle de l'algorithme de transfert de blocs de bits. Cet 
algorithme peut être décrit comme la méthode de copie d'un bloc de 
bits source vers un bloc de bits destination … travers une 
opération logique. La primitive de transfert de blocs peut servir 
à des opérations comme:

     * le remplissage de zone,
     * la rotation par découpage récursif,
     * le zoom ou la réduction,
     * le tracage de ligne par l'algorithme de Bresenham,
     * les transformations de texte (ex: gras, italique, souligné)
     * le déroulement de texte ("scrolling"),
     * le remplissage selon une matrice,

     et toutes les fonctions de copie de blocs de mémoire [C.1].

     L'essence du transfert de blocs a été définie de façon 
formelle et pour la première fois par Newman et Sproull dans leur 
description de la fonction de copie de zones ("RasterOp", C.2). 
Selon cette définition de base, l'opération de copie effectuait le 
transfert sur une base de bit à bit et se limitait à un jeu réduit 
de combinaisons booléennes. Des améliorations de cette fonction 
comme le transfert de bits en parallèle ou l'introduction d'une 
matrice demi-teinte ("half-tone") lors du transfert étaient 
simplement proposées au lecteur en exercices.

     Afin d'améliorer les fonctionnalités et d'accroitre les 
performances de l'algorithme d'origine, les caractéristiques 
décrites plus haut ont été ajoutées à la définition de la fonction 
copie de zones et implémentées dans le circuit "RasterOp" (C.3). 
Ce circuit manquait toutefois de la bi-dimensionnalité de la 
fonction de départ et ses performances se ressentaient du goulot 
d'étranglement constitue‚ par la lecture et l'écriture des données 
de la source, de la destination et de la matrice demi-teinte (il 
ne pouvait accéder à la mémoire par DMA).

     Tandis que des progrès étaient accomplis au niveau de 
l'accélération des fonctions du circuit "RasterOp", la d‚finition 
formelle de la copie de zones était par ailleurs redéfinie et 
fournissait la base de la primitive de copie par boucle de blocs 
de bits dans le noyau du langage graphique Smalltalk-80 (C.4). Du 
fait de son interface utilisateur très ouverte, la primitive de 
transfert de blocs se révéla toutefois peu efficace, des 
optimisations étant indispensables pour les cas simples, ce qui 
allait contre la vocation même de globalité de la fonction. Il 
devenait clair qu'une solution matérielle était indispensable si 
l'on désirait améliorer les performances de la primitive de copie 
par boucle sans réduire ses fonctionnalités.

     Le 'Blitter' de l'Atari ST est une solution matérielle aux 
problèmes de performances rencontrés par la fonction de transfert 
de blocs. Le 'Blitter' est un périphérique DMA (accès direct à la 
mémoire) qui réalise l'étendue complète des fonctions de copie de 
blocs de bits en y ajoutant quelques possibilités mineures. Des 
incréments ou des décréments sur un ou plusieurs mots sont 
possibles pour des transferts vers la mémoire d'affichage du ST. 
Un masque de destination, qui pourra être constitué de bits … 1 
(ce qui supprime son effet), autorise un niveau supplémentaire de 
trame. Le reste de cette documentation est directement orient‚ 
vers la description fonctionnelle du 'Blitter' de l'Atari ST.

2. TRANSFERTS DE BLOCS DE BITS

     Comme indiqué précédemment, un transfert de bloc de bits peut 
être considéré comme une procédure de déplacement de données 
alignées sur un bit d'une source vers une destination, avec 
application d'une opération logique lors du transfert. Il existe 
seize règles de combinaisons logiques applicables au transfert de 
la source vers la destination. On notera que ces seize règles 
constituent l'ensemble des op‚rations logiques possibles lors du 
transfert. La table ci-dessous fournit les caractéristiques de ces 
opérations logiques:

OPERATIONS LOGIQUES

(~s&~d) (~s&d) (s&~d) (s&d) |OP| Règle logique
bit fort          bit faible|  |
------------------------------------------------------------------
   0      0      0      0   |0 | tous à zéro
   0      0      0      1   |1 | (source) ET (destination)
   0      0      1      0   |2 | (source) ET (NON destination)
   0      0      1      1   |3 | source
   0      1      0      0   |4 | (NON source) ET (destination)
   0      1      0      1   |5 | destination
   0      1      1      0   |6 | (source) EOU (destination)
   0      1      1      1   |7 | (source) OU (destination)
   1      0      0      0   |8 | (NON source) ET (NON destination)
   1      0      0      1   |9 | (NON source) EOU (destination)
   1      0      1      0   |A | (NON destination)
   1      0      1      1   |B | (source) OU (NON destination)
   1      1      0      0   |C | (NON source)
   1      1      0      1   |D | (NON source) OU (destination)
   1      1      1      0   |E | (NON source) OU (NON destination)
   1      1      1      1   |F | tous à un
------------------------------------------------------------------


     Les paramètres de dimensions et de positions des blocs ainsi 
que les caractéristiques du transfert doivent être initialisés 
avant le transfert du bloc. Ces paramètres incluent l'affichage 
restreint ("clipping"), l'oblique, les masques finaux, et le 
recouvrement.

Affichage restreint ("clipping"): Les dimensions et positions des 
blocs source et destination sont ajustées pour correspondre au 
rectangle d'affichage restreint sélectionné. Dans la mesure où les 
blocs source et destination ont une taille identique, les 
dimensions du bloc destination sont réduites à celles du bloc 
source une fois appliqué à ce dernier l'affichage restreint (et 
vice-versa). On notera que le transfert n'a pas lieu d'être si le 
bloc résultant est nul.

Oblique: Le décalage de ligne horizontale réalisant l'oblique est 
calcul‚ lors du transfert de la source vers la destination.
 
Masques finaux: Les masques partiels des mots de début et de fin 
sont déterminés. Ces masques sont fusionnés si la destination a 
une largeur d'un seul mot.

Recouvrement: Les positions des blocs sont comparées pour tester 
le recouvrement éventuel de ces blocs et éviter la destruction 
d'une partie du bloc source lors du transfert.

     Lors de transferts sans recouvrement, la direction de 
transfert du bloc source est sans importance et débutera par 
d‚faut au sommet en haut … gauche pour se terminer au sommet en 
bas … droite. Pour des transferts avec recouvrement, la direction 
de transfert correspond également à la diagonale coin haut gauche 
vers coin bas droite si l'adresse de la source est supérieure ou 
égale à l'adresse de la destination. Dans le cas contraire, c'est-
à-dire si l'adresse de la source est inférieure … l'adresse de la 
destination, alors le transfert de données s'effectue … partir du 
sommet en bas … droite vers le sommet en haut … gauche.


     Une fois les paramètres de transfert positionnés, l'opération 
de transfert de bloc peut débuter. Cette opération s'effectue 
selon l'opération logique fixée (la demi-teinte et le code de 
prise en compte de la demi-teinte [HOP] seront étudiés en 4.5).

TRANSFERT DE BLOC DE BITS









[Diagramme manquant]


















3. DESCRIPTION FONCTIONNELLE

     Veuillez vous référer au diagramme précédent de transfert de 
bloc de bits pour la compréhension de ce chapitre. Pour percevoir 
les composants de base d'un transfert, examinons d'abord le cas le 
plus simple possible de transfert. Nous voulons remplir un bloc de 
mémoires soit uniquement avec des zéros, soit seulement avec des 
uns (OP = 0 ou OP = F). Dans ce cas élémentaire, seuls le bloc 
d'opération logique, qui génère les zéros et les uns, et le bloc 
de masque final servent au transfert. Si le masque final est 
uniquement compos‚ de 1, le 'BLITTER' écrira simplement un mot (de 
0 ou de 1 selon OP) puis un autre, etc., à partir de l'adresse de 
la destination sans même prendre connaissance de l'ancien contenu 
de la destination.

     Au fur et à mesure de l'écriture, l'adresse de la destination 
sera modifiée en accord avec les valeurs des registres d'INCREMENT 
HORIZONTAL DE DESTINATION, d'INCREMENT VERTICAL DE DESTINATION, de 
TAILLE HORIZONTALE et de TAILLE VERTICALE. Ces registres 
définissent la taille et la forme du bloc à transférer. Les 
registres de TAILLE HORIZONTALE et de TAILLE VERTICALE fournissent 
les dimensions du bloc. Le registre de TAILLE HORIZONTALE spécifie 
le nombre d'écritures de mots nécessaires pour la mise à jour 
d'une ligne horizontale. Le registre de TAILLE VERTICALE spécifie 
le nombre de lignes horizontales du bloc. L'INCREMENT HORIZONTAL 
DE DESTINATION est un mot signé (16 bits, en complément à 2) qui 
est ajout‚ à l'adresse de destination afin d'obtenir l'adresse du 
mot suivant de la destination. En fin d'écriture de ligne, 
l'INCREMENT VERTICAL DE DESTINATION est ajout‚ à l'adresse de la 
destination afin de pointer le premier mot de la ligne suivante.

     Le masque final d‚termine quels bits de la destination vont 
être mis à jour. Les bits de la destination correspondant … des 1 
dans le masque final sont mis à jour. Les bits de la destination 
correspondant … des 0 dans le masque final restent inchangés. On 
notera que même si certains bits de la destination demeurent 
inchangés, une séquence de lecture-modification-écriture est 
nécessaire. Afin d'améliorer les performances, seule la lecture 
sera effectuée. On distingue trois MASQUES FINAUX numérots de 1 à
3. Le MASQUE FINAL 1 sert uniquement à l'écriture de la première 
ligne horizontale. Le MASQUE FINAL 3 sert uniquement à l'écriture 
de la dernière ligne horizontale. Le MASQUE FINAL 2 sert pour 
toutes les autres lignes.

     Maintenant considérons un cas plus complexe, supposons que 
nous voulions effectuer un EOU ("XOR") du bloc de destination avec 
une matrice demi-teinte de 16x16 bits. D'abord nous devons charger 
la m‚moire demi-teinte ("Halftone RAM") avec la matrice demi-
teinte. La sélection de demi-teinte s'effectue à partir du 
registre HOP tandis que l'opération logique EOU est fixée par 
l'opérateur logique OP. Le registre de NUMERO DE LIGNE sert à 
spécifier lequel des 16 mots de la matrice demi-teinte servira 
pour la ligne courante. Ce registre doit être incrémenté ou 
décrémenté en fin de chaque ligne conformément au signe du 
registre d'INCREMENT VERTICAL DE LA DESTINATION. Placez les 
registres d'INCREMENT HORIZONTAL et VERTICAL DE LA DESTINATION 
ainsi que les registres de TAILLE HORIZONTALE et VERTICALE à leurs 
valeurs avant le transfert. Cette procédure peut être utilisée 
quel que soit l'opérateur logique choisi. Elle est également 
utilisable avec un bloc source au lieu d'une matrice demi-teinte 
ou en effectuant un ET logique entre le bloc source et la matrice 
demi-teinte par modification du registre HOP. Un bloc source doit 
avoir la même taille que le bloc destination mais peut avoir des 
incréments et une adresse différentes, lesquels sont fixés par les 
registres d'INCREMENT HORIZONTAL et VERTICAL DE SOURCE et par le 
registre d'ADRESSE SOURCE.

     En conclusion, considérons le cas où les blocs source et 
destination ne sont pas alignés sur un mot. Dans ce cas, il se 
peut que l'on doive lire les deux premiers mots de la source dans 
le tampon source 32 bits et utiliser les seuls 16 bits coïncidant 
avec les bits de la destination, selon le contenu du registre 
OBLIQUE. Lorsque le mot suivant de la source est lu, les 16 bits 
faibles du tampon source sont copiés dans les 16 bits forts et ces 
16 bits faibles sont remplacés par le nouveau mot. Ce processus 
est inversé lorsque la source est lue de la droite vers la gauche 
(INCREMENT HORIZONTAL DE SOURCE négatif).

     Etant donné que peuvent se présenter des cas où il s'avère 
nécessaire d'effectuer une lecture supplémentaire de la source en 
début de ligne afin de rafraichir le tampon de source et d'autres 
où cela n'est pas indispensable du fait du registre de masque 
final, un bit de contrôle a été fourni pour permettre cette 
lecture supplémentaire. Le bit FXSR du registre OBLIQUE indique, 
lorsqu'il est placé à 1, qu'une lecture suppl‚mentaire de la 
source est n‚cessaire en début de ligne afin de rafraichir le 
tampon de source. Cette lecture peut ne pas être nécessaire avec 
certaines combinaisons de masques finaux et d'obliques. Si cette 
lecture est supprimée, le transfert du mot bas vers le mot haut du 
tampon source se produira normalement. Dans ce cas, un cycle de 
lecture-modification-écriture sera effectué sur la destination en 
fin d'écriture de chaque ligne horizontale sans prise en compte de 
la valeur du registre de MASQUE FINAL correspondant.















4. MODELES DE PROGRAMMATION

     Le 'Blitter' contient un ensemble de registres correspondant 
aux adresses du transfert, aux cadrages des blocs de bits, aux 
op‚rations logiques et demi-teinte ainsi qu'aux accŠs bus. Le 
temps de positionnement des registres est … peu prŠs constant et 
relativement important comparativement au temps de transfert de 
petits blocs, beaucoup plus r‚duit relativement au temps de 
transfert de grands blocs.

4.1. Carte des registres

     Voici la carte des registres programmables du 'Blitter' 
(notez que les bits inutilis‚s sont lus comme des 0 et figurent 
ici sous forme de tirets).

CARTE DES REGISTRES

     FF8A00    |XXXXXXXX| |XXXXXXXX|  MEMOIRE DEMI-TEINTE
     FF8A02    |XXXXXXXX| |XXXXXXXX| 
     FF8A04    |XXXXXXXX| |XXXXXXXX|
       ..      :   ..   : :   ..   :
     FF8A1E    |XXXXXXXX| |XXXXXXXX|
     FF8A20    |XXXXXXXX| |XXXXXXX-|  INCREMENT HORIZONTAL SOURCE
     FF8A22    |XXXXXXXX| |XXXXXXX-|  INCREMENT VERTICAL SOURCE
     FF8A24    |--------| |XXXXXXXX|  ADRESSE BLOC SOURCE
     FF8A26    |XXXXXXXX| |XXXXXXX-|     
     FF8A28    |XXXXXXXX| |XXXXXXXX|  MASQUE FINAL 1
     FF8A2A    |XXXXXXXX| |XXXXXXXX|  MASQUE FINAL 2
     FF8A2C    |XXXXXXXX| |XXXXXXXX|  MASQUE FINAL 3
     FF8A2E    |XXXXXXXX| |XXXXXXX-|  INCREMENT HORIZ. DESTINATION
     FF8A30    |XXXXXXXX| |XXXXXXX-|  INCREMENT VERT. DESTINATION
     FF8A32    |--------| |XXXXXXXX|  ADRESSE BLOC DESTINATION
     FF8A34    |XXXXXXXX| |XXXXXXX-|  
     FF8A36    |XXXXXXXX| |XXXXXXXX|  TAILLE HORIZONTALE
     FF8A38    |XXXXXXXX| |XXXXXXXX|  TAILLE VERTICALE

     FF8A3A    |------XX|             OPERATION DEMI-TEINTE
     FF8A3B    |----XXXX|             OPERATION LOGIQUE
     
     FF8A3C    |XXX-XXXX|
                ||| ||||
                |||  ---------------- NUMERO DE LIGNE
                || ------------------ DEBORDEMENT
                | ------------------- PARTAGE DU BUS
                 -------------------- OCCUPATION DU BUS


     FF8A3D    |XX--XXXX|
                ||  ||||
                ||   ---------------- OBLIQUE
                | ------------------- NFSR
                 -------------------- FXSR

4.2. Adresses des blocs de bits

     Cette section traite des registres d‚finissant les origines 
des blocs de bits, les incr‚ments d'adresse et les tailles.

ADRESSE BLOC SOURCE
	Ce registre de 23 bits contient l'adresse courante du bloc 
	source (seule une adresse paire peut ˆtre sp‚cifi‚e). Il est 
	accessible par le biais d'un adressage sur deux mots ou sur 
	un long mot. La valeur de ce registre correspond toujours … 
	l'adresse du prochain mot de la source devant ˆtre trait‚. Il 
	doit ˆtre mis … jour du pas sp‚cifi‚ par les registres 
	d'INCREMENT HORIZONTAL DE LA SOURCE et d'INCREMENT VERTICAL 
	DE LA SOURCE au fur et … mesure du transfert.
     

INCREMENT HORIZONTAL SOURCE
	Ce registre de 15 bits, le bit le plus faible ‚tant ignor‚, 
	sp‚cifie le d‚calage horizontal en octets qui doit ˆtre 
	appliqu‚ … l'adresse du bloc source aprŠs chaque transfert de 
	mot. Cette valeur est SIGNEE et ajout‚e … l'adresse du bloc 
	source aprŠs chaque lecture de mot, lorsque la taille 
	horizontale est diff‚rente de 1. Si la taille horizontale est 
	‚gale … 1, ce registre n'est pas pris en compte. Les 
	instructions portant sur un op‚rande d'un octet ne doivent 
	pas ˆtre utilis‚es pour lire ou ‚crire ce registre.	

INCREMENT VERTICAL SOURCE
	Ce registre de 15 bits, le bit le plus faible ‚tant ignor‚, 
	sp‚cifie le d‚calage en octet qui doit ˆtre ajout‚ … 
	l'adresse du premier mot de la source lors d'un changement de 
	ligne. Cette valeur est SIGNEE et ajout‚e au registre 
	d'adresse du bloc source une fois arriv‚ en fin de ligne 
	(donc, lorsque la TAILLE HORIZONTALE est ‚gale … 1). Si le 
	registre de TAILLE HORIZONTALE contient 1, seul ce registre 
	est utilis‚. Les instructions portant sur un op‚rande d'un 
	octet ne doivent pas ˆtre utilis‚es pour lire ou ‚crire ce 
	registre.

ADRESSE BLOC DESTINATION
	Ce registre de 23 bits contient l'adresse courante du bloc 
	DESTINATION (seule une adresse paire peut ˆtre sp‚cifi‚e). Il 
	est accessible par le biais d'une instruction portant sur 
	une taille mot ou long mot. La valeur de ce registre 
	correspond toujours … l'adresse du prochain mot de la 
	DESTINATION devant ˆtre trait‚. Il doit ˆtre mis … jour du 
	pas sp‚cifi‚ par les registres d'INCREMENT HORIZONTAL DE LA 
	DESTINATION et d'INCREMENT VERTICAL DE LA DESTINATION au fur 
	et … mesure du transfert.
     

INCREMENT HORIZONTAL DESTINATION
	Ce registre de 15 bits, le bit le plus faible ‚tant ignor‚, 
	sp‚cifie le d‚calage horizontal en octets qui doit ˆtre 
	appliqu‚ … l'adresse du bloc DESTINATION aprŠs chaque 
	transfert de mot. Cette valeur est SIGNEE et ajout‚e … 
	l'adresse du bloc DESTINATION aprŠs chaque lecture de mot, 
	lorsque la taille horizontale est diff‚rente de 1. Si la 
	taille horizontale est ‚gale … 1, ce registre n'est pas pris 
	en compte. Les instructions portant sur un op‚rande d'un 
	octet ne doivent pas ˆtre utilis‚es pour lire ou ‚crire ce 
	registre.

INCREMENT VERTICAL DESTINATION
	Ce registre de 15 bits, le bit le plus faible ‚tant ignor‚, 
	sp‚cifie le d‚calage en octet qui doit ˆtre ajout‚ … 
	l'adresse du premier mot de la DESTINATION lors d'un 
	changement de ligne. Cette valeur est SIGNEE et ajout‚e au 
	registre d'adresse du bloc DESTINATION une fois arriv‚ en fin 
	de ligne (donc, lorsque la TAILLE HORIZONTALE est ‚gale … 1). 
	Si le registre de TAILLE HORIZONTALE contient 1, seul ce 
	registre est utilis‚. Les instructions portant sur un 
	op‚rande d'un octet ne doivent pas ˆtre utilis‚es pour lire 
	ou ‚crire ce registre.

TAILLE HORIZONTALE
	Ce registre de 16 bits sp‚cifie le nombre de mots contenus 
	dans une ligne de la destination. Le nombre minimum est 1 et 
	le maximum est 65536 d‚sign‚ par 0. Les instructions portant 
	sur un op‚rande d'un octet ne doivent pas ˆtre utilis‚es pour 
	lire ou ‚crire ce registre. Ce registre contient toujours le 
	nombre de mots encore … ‚crire dans la ligne courante, PAS 
	NECESSAIREMENT le nombre plac‚ … l'‚criture du registre. 
	Chaque fois qu'un mot du bloc destination est ‚crit, la 
	valeur de ce registre est d‚cr‚ment‚e jusqu'… ce qu'elle 
	atteigne 0, auquel cas le registre est rafraichi avec la 
	valeur de d‚part.

TAILLE VERTICALE
	Ce registre de 16 bits sp‚cifie le nombre de lignes contenues 
	dans le bloc destination. Le nombre minimum est 1 et le 
	maximum est 65536 d‚sign‚ par 0. Les instructions portant sur 
	un op‚rande d'un octet ne doivent pas ˆtre utilis‚es pour 
	lire ou ‚crire ce registre. Ce registre contient toujours le 
	nombre de lignes restant … ‚crire dans le bloc, PAS 
	NECESSAIREMENT le nombre plac‚ … l'‚criture du registre. 
	Chaque fois qu'une ligne du bloc destination est ‚crite, la 
	valeur de ce registre est d‚cr‚ment‚e jusqu'… ce qu'elle 
	atteigne 0, auquel cas le registre est rafraichi avec la 
	valeur de d‚part.








4.3. Les cadrages des blocs de bits

     Cette section d‚crit les registres de sp‚cification des 
masques finaux, de transfert oblique et de reminiscence des 
donn‚es source.

MASQUES FINAUX 1, 2, 3
	Ces registres de 16 bits servent au masquage lors des 
	‚critures du bloc destination. Les bits du mot de destination 
	qui correspondent … des 1 dans le masque final seront 
	modifi‚s. Les bits du mot de destination qui correspondent … 
	des 0 dans le masque final restent inchang‚s. Le registre 
	MASQUE FINAL courant est d‚termin‚ en fonction de la position 
	de la ligne. Le MASQUE FINAL 1 est utilis‚ uniquement pour la 
	premiŠre ligne. Le MASQUE FINAL 3 sert seulement pour la 
	derniŠre ligne. Le MASQUE FINAL 2 sert pour toutes les autres 
	lignes. Lorsque la ligne est longue d'un seul mot, le MASQUE 
	FINAL 1 est utilis‚. Les instructions portant sur un op‚rande 
	ne doivent pas ˆtre utilis‚es pour lire ou ‚crire ces 
	registres.

OBLIQUE
     Les quatre bits faibles du registre octet, d'adresse $FF8A3D, 
	sp‚cifient l'oblique, c'est-…-dire le d‚calage … droite 
	devant ˆtre appliqu‚ sur les donn‚es de la source avant de 
	les combiner avec la matrice demi-teinte et/ou les donn‚es de 
	la destination.

FXSR
     Abr‚viation de "Force eXtra Source Read" (Force une lecture 
	suppl‚mentaire de la source). Lorsque ce bit est … 1, une 
	lecture suppl‚mentaire d'un mot de la source est effectu‚e 
	afin d'initialiser la portion complŠte de la source … 
	traiter.

NFSR
     Abr‚viation de "No Final Source Read" (Pas de lecture de la 
	source en fin de ligne). Lorsque ce bit est … 1, la lecture 
	de la source lors du dernier mot de chaque ligne n'est pas 
	effectu‚e. On notera que l'utilisation de ce bit et/ou du 
	pr‚c‚dent n‚cessite une mise … jour des registres d'INCREMENT 
	VERTICAL DE LA SOURCE et d'ADRESSE DU BLOC SOURCE.












4.4. Op‚rations logiques

     Cette section d‚crit les registres qui sp‚cifient le type de 
combinaison logique effectu‚ sur les donn‚es du bloc source et du 
bloc destination.


OP
	Les quatre bits faibles de ce registre d'un octet, d'adresse 
	$FF8A3B, sp‚cifient la combinaison logique … effectuer entre 
	les bits du bloc source et du bloc destination, en accord 
	avec la table suivante:

	OPERATIONS LOGIQUES


      --------------------------------------------------
     |  OP  |  Combinaison logique                      |
      --------------------------------------------------
     |  0   |  tous … 0                                 |
     |  1   |  (source) ET (destination)                |
     |  2   |  (source) ET (NON destination)            |
     |  3   |  (source)                                 |
     |  4   |  (NON source) ET (destination)            |     
     |  5   |  (destination)                            |
     |  6   |  (source) EOU (destination)               |
     |  7   |  (source) OU (destination)                | 
     |  8   |  (NON source) ET (NON destination)        |
     |  9   |  (NON destination)                        |
     |  A   |  (source) OU (NON destination)            |
     |  B   |  (NON source)                             |
     |  C   |  (NON source) OU (destination)            |
     |  D   |  (NON source) OU (NON destination)        |
     |  E   |  (source) ET (destination)                |
     |  F   |  (source) ET (destination)                | 
      --------------------------------------------------

     Note: L'op‚ration logique EOU ("XOR") dispose de la table de 
v‚rit‚ suivante:
                       -------
                      |  EOU  |
           -------------------
          |  0  |  0  |   0   |
           -------------------
          |  0  |  1  |   1   |
           -------------------
          |  1  |  0  |   1   |
           -------------------
          |  1  |  1  |   0   |
           -------------------




4.5. Op‚rations demi-teinte

     Cette section traite des registres sp‚cifiant les m‚moires de 
matrice demi-teinte, l'index de ligne de matrice et le type de 
combinaison entre les donn‚es de la source et de la matrice.

MEMOIRES MATRICE DEMI-TEINTE
	Ces m‚moires correspondent au masque de la matrice, soit 16 
	mots (16x16 bits). Chaque mot correspond … une ligne du bloc 
	destination et il se r‚pŠte toutes les 16 lignes. Le mot 
	courant est point‚ par l'index de ligne de matrice. Ces 
	registres peuvent ˆtre lus mais ne peuvent pas ˆtre ‚crits 
	avec des instructions portant sur un octet.

INDEX DE LIGNE DE MATRICE
	Les quatre bits faibles de ce registre octet, situ‚ … 
	l'adresse $FF8A3C, permettent d'obtenir le masque de matrice 
	courant. La valeur du registre est ‚gale … l'index relatif 
	plus deux dans la matrice demi-teinte d‚butant en $FF8A00. 
	Cette valeur est incr‚ment‚e ou d‚cr‚ment‚e en fin de ligne 
	et remise … jour lorsqu'elle devient nulle. Le signe de 
	l'INCREMENT VERTICAL DE LA DESTINATION d‚finit le sens du pas 
	(incr‚mentation ou d‚cr‚mentation).

DEBORDEMENT
	Le bit de d‚bordement, lorsqu'il est … 1, provoque 
	l'utilisation des quatre bits faibles des donn‚es de la 
	source oblique comme index de l'adresse de la matrice demi-
	teinte. Remarque: La matrice demi-teinte reste naturellement 
	valide lorsque ce bit est … 1.

TYPE D'OPERATION DEMI-TEINTE (HOP)
	Les deux bits faibles de ce registre octet, situ‚ … l'adresse 
	$FF8A3A, sp‚cifient le type de combinaison de la source et de 
	la matrice demi-teinte selon le tableau suivant:

     OPERATIONS DEMI-TEINTE

      ------------------------------------------
	| HOP |  R‚gle de combinaison              |
      ------------------------------------------
     |  0  |  tous … 1                          |
     |  1  |  matrice demi-teinte               |
     |  2  |  source                            |
	|  3  |  (source) ET (matrice demi-teinte) |
      ------------------------------------------








4.6. AccŠs au bus

     Cette section d‚crit les registres de contr“le d'accŠs au bus 
et d'‚tat de base du 'Blitter'.

HOG
	Le bit HOG, s'il est … 0, provoque un partage ‚quitable de 
	l'accŠs au bus entre le processeur 68000 et le 'Blitter'. 
	Dans ce mode, chacun dispose de 64 cycles machines, l'autre 
	‚tant stopp‚. Si ce bit est … 1, le processeur 68000 est 
	stopp‚ jusqu'… ce que le transfert ait pris fin. Dans les 
	deux cas le 'Blitter' c‚dera le pas aux autres p‚riph‚riques 
	DMA. L'arbitrage du bus peut permettre au processeur 
	d'ex‚cuter une ou plusieurs instructions mˆme en mode 'hog'. 
	Aussi n'escomptez pas que l'instruction suivant celle qui 
	placera le bit 'BUSY' ne sera ex‚cut‚e qu'une fois le 
	transfert termin‚. Le bit 'BUSY' doit ˆtre scrut‚ si l'on 
	d‚sire r‚aliser ce type de synchronisation.

BUSY
	Le bit 'BUSY' est mis … 1 une fois que tous les autres 
	registres ont ‚t‚ initialis‚s afin de d‚marrer le transfert. 
	Il restera … 1 tant que le transfert ne sera pas termin‚. La 
	ligne d'interruption est une copie conforme de l'‚tat de ce 
	bit. Voir l'annexe A pour des informations compl‚mentaires 
	sur la fa‡on de traiter le bit 'BUSY'.




























ANNEXE A -- EXEMPLE DE PROGRAMMATION



     Afin de maintenir une compatibilit‚ logicielle avec les 
futurs ST d'Atari ‚quip‚s d'un 'Blitter', les d‚veloppeurs n'ont 
besoin que de rester en accord avec les documentations 'Ligne A' 
et 'VDI'. Les futurs systŠmes d'exploitation en ROM utiliseront le 
'Blitter' pour am‚liorer les performances de nombreuses fonctions 
du VDI et de la ligne A. Cela s'effectuera de fa‡on transparente 
pour le programme et l'utilisateur. En cons‚quence, le d‚veloppeur 
n'a besoin de mettre en oeuvre aucune routine particuliŠre pour 
disposer des avantages du 'Blitter'.

     Comme rŠgle de conduite, n'effectuez jamais un appel au VDI 
ou … la ligne A sous interruption, faute de quoi les r‚sultats 
seront impr‚visibles et peut-ˆtre catastrophiques au cas o— une 
op‚ration sur le 'Blitter' viendrait interrompre une autre 
op‚ration sur ce mˆme 'Blitter'.


     Le programme list‚ ci-dessous n'a pas ‚t‚ optimis‚, il est 
seulement fourni … des fins p‚dagogiques.




__________________________________________________________________
* (C) 1987 Atari Corporation
*     Tous droits r‚serv‚s
*
* ADRESSE DE BASE DU BLITTER
*
BLITTER        equ       $FF8A00
*
* DECALAGES DES REGISTRES DU BLITTER
*
Halftone       equ       0         * Matrice demi-teinte *
Src_Xinc       equ       32        * Incr‚ment X source *
Src_Yinc       equ       34        * Incr‚ment Y source *
Src_Addr       equ       36        * Adresse bloc source *
Endmask1       equ       40        * Masque final 1 *
Endmask2       equ       42        * Masque final 2 *
Endmask3       equ       44        * Masque final 3 *
Dst_Xinc       equ       46        * Incr‚ment X destination *
Dst_Yinc       equ       48        * Incr‚ment Y destination *
Dst_Addr       equ       50        * Adresse bloc destination *
X_count        equ       54        * Largeur de bloc *
Y_Count        equ       56        * Hauteur de bloc *
HOP            equ       58        * Type op‚ration demi-teinte *
OP             equ       59        * Type op‚ration logique *
Line_Num       equ       60        * index de ligne dans matrice *
Skew           equ       61        * oblique *
*
* DRAPEAUX DE REGISTRES DU BLITTER
*
fHOP_Source    equ       1
fHOP_Halftone  equ       0
*
fSkewFXSR      equ       7
fSkewNFSR      equ       6
*
fLineBusy      equ       7
fLineHog       equ       6
fLineSmudge    equ       5
*
* MASQUES DE REGISTRES DU BLITTER
*
mHOP_Source    equ       $02
mHOP_Halftone  equ       $01
*
mSkewFXSR      equ       $80
mSkewNFSR      equ       $40
*
mLineBusy      equ       $80
mLineHog       equ       $40
mLineSmudge    equ       $20
*
*                   DONNEES DES MASQUES FINAUX
*
* Ces tables sont r‚f‚renc‚es par des instructions d'adressage 
* relatives au compteur de programme. Aussi les noms de ces
* tables doivent-ils se trouver dans les 128 octets des 
* instructions de r‚f‚rence. Amen.
*
* 0: Destination   1: Source  
* << Inverser donn‚es du masque de donn‚es droite >>
*
lf_endmask
     dc.w      $FFFF
*
rt_endmask
     dc.w      $7FFF
     dc.w      $3FFF
     dc.w      $1FFF
     dc.w      $0FFF
     dc.w      $07FF
     dc.w      $03FF
     dc.w      $01FF
     dc.w      $00FF
     dc.w      $007F
     dc.w      $003F
     dc.w      $001F
     dc.w      $000F
     dc.w      $0007
     dc.w      $0003
     dc.w      $0001
     dc.w      $0000
*
* Titre:       BLiT_iT
*
* But:         Transf‚rer un bloc de pixels situ‚s … une position
*              arbitraire  X,Y  dans la forme m‚moire source vers
*              une  autre  position  arbitraire X,Y dans la forme
*              m‚moire  destination  en utilisant le mode REPLACE
*              (op‚ration logique 3).
*              Les  rectangles  source  et destination ne doivent 
*              pas se recouvrir.
*
* Entr‚es:
*              a4:  pointeur  vers un bloc de param‚tres d'entr‚e
*                   de 34 octets.
*
* Note:        Cette  routine  doit  ˆtre ex‚cut‚e en mode super-
*              viseur  car  un accŠs vers des registres mat‚riels
*              est effectu‚ dans une r‚gion prot‚g‚e de m‚moire.
*
*
*    D‚calages du Bloc de ParamŠtres d'entr‚e
*
SRC_FORM       equ       0 ; Adresse base du bloc source
SRC_NXWD       equ       4 ; D‚calage entre mots dans plan source
SRC_NXLN       equ       6 ; Largeur du bloc source
SRC_NXPL       equ       8 ; D‚calage entre plans de la source
SRC_XMIN       equ      10 ; X minimum rectangle source
SRC_YMIN       equ      12 ; Y minimum rectangle source
*
DST_FORM       equ      14 ; Adresse base du bloc destination
DST_NXWD       equ      18 ; D‚calage entre mots plan destination
DST_NXLN       equ      20 ; Largeur du bloc destination
DST_NXPL       equ      22 ; D‚calage entre plans destination
DST_XMIN       equ      24 ; X minimum rectangle destination
DST_YMIN       equ      26 ; Y minimum rectangle destination
*
WIDTH          equ      28 ; Largeur du rectangle … transf‚rer
HEIGHT         equ      30 ; Hauteur du rectangle … transf‚rer
PLANES         equ      32 ; Nombre de plans … transf‚rer
*
BLiT_iT:
*
     lea       BLiTTER,a5       ; a5-> registre bloc BLITTER
*
* Calcule les coordonn‚es maximales horizontales … partir des
* coordonn‚es minimales horizontales et de la largeur
*
     move.w    WIDTH(a4),d6
     subq.w    #1,d6            ; d6 <- largeur - 1

     move.w    SRC_XMIN(a4),d0  ; d0 <- X minimum source
     move.w    d0,d1            ; d1 <- X minimal source
     add.w     d6,d1            ;  + largeur du bloc 

     move.w    DST_XMIN(a4),d2  ; d2 <- X minimum destination
     move.w    d2,d3            ; d3 <- X minimal destination
     add.w     d6,d3            ;  + largeur du bloc
*
* Les masques de fin sont d‚duits de l'origine horizontale de la
* source modulo 16 et de l'origine horizontale de la destination
* modulo 16.
*
     moveq     #$0F,d6          ; d6 <- masque modulo 16

     move.w    d2,d4            ; d4 <- DST_XMIN
     and.w     d6,d4            ; d4 <- DST_XMIN modulo 16
     add.w     d4,d4            ; d4 <- d‚calage gauche
     move.w    lf_endmask(pc,d4.w),d4 ; d4 <- masque fin gauche

     move.w    d3,d5            ; d5 <- DST_XMAX
     and.w     d6,d5            ; d5 <- DST_XMAX modulo 16
     add.w     d5,d5            ; d5 <- d‚calage droite 
     move.w    rt_endmask(pc,d5.w),d5 ; d5 <- masque fin droite
     not.w     d5               ; d5 <- masque fin droite
*
* La valeur d'oblique est ‚gale … (Xmin destination modulo 16
* - Xmin source modulo 16) && 0x000F. Trois discriminants sont
* utilis‚s pour d‚terminer les ‚tats des drapeaux FXSR et NFSR:
*
*    bit 0     0: Xmin source mod 16 <= Xmin destination mod 16
*              1: Xmin source mod 16 > Xmin destination mod 16
*
*    bit 1     0: SrcXmax/16-SrcXmin/16 <> DstXmax/16-DstXmin/16
*                     largeur source         largeur destination
*              1: SrcXmax/16-SrcXmin/16 == DstXmax/16-DstXmin/16
*
*    bit 2     0: largeur destination multi-mots
*              1: largeur destination = un seul mot
*
*    Ces drapeaux fournissent le d‚calage dans la table d'oblique
*    supportant les drapeaux d'‚tat FXSR et NFSR pour des aligne-
*    ments donn‚s de la source et de la destination.
*

     move.w    d2,d7            ; d7 <- Dst Xmin
     and.w     d6,d7            ; d7 <- Dst Xmin modulo 16
     and.w     d0,d6            ; d6 <- Src Xmin modulo 16
     sub.w     d6,d7            ; d7 <- Dst Xmin modulo 16
                                ;  - Src Xmin modulo 16
     clr.w     d6               ; d6 <- index base table drapeaux
     addx.w    d6,d6            ; d6[bit 0] <- drapeau d'aligne-
                                ; ment dans le mot
     lsr.w     #4,d0            ; d0 = d‚calage hor. vers srcXmin
     lsr.w     #4,d1            ; d1 = d‚calage vert.vers srcXmax
     sub.w     d0,d1            ; d1 <- largeur source - 1

     lsr.w     #4,d2            ; d2 <- d‚calage mot vers dstXmin
     lsr.w     #4,d3            ; d3 <- d‚calage mot vers dstXmax
     sub.w     d2,d3            ; d3 <- largeur destination - 1
     bne       set_endmasks     ; deuxiŠme discriminant = un mot
                                ; de destination
*
* Lorsque la destination n'a qu'un mot de large, les masques de
* d‚but et de fin sont fusionn‚s pour cr‚er le Masque Final 1.
* Les autres masques finaux seront ignor‚s par le BLiTTER.
*
     and.w     d5,d4            ; d4 <- masque de fin mot simple
     addq.w    #4,d6            ; d6[bit 2]:1 => un mot dest.

set_endmasks:

     move.w    d4,Endmask1(a5)  ; masque final gauche
     move.w    #$FFFF,Endmask2(a5) ; masque final centre
     move.w    d5,Endmask3(a5)  ; masque final droite

     cmp.w     d1,d3            ; dernier discriminant correspond
     bne       set_count        ; ‚galit‚ largeurs src et dst

     addq.w    #2,d6            ; d6[bit 1]:1 => largeurs ‚gales

set_count:

     move.w    d3,d4
     addq.w    #1,d4            ; d4 <- nombre mots ligne dest.
     move.w    d4,X_count(a5)   ; place valeur dans BLiTTER

* Calcule l'adresse de d‚part de la Source:
*
*     Adresse du Bloc Source +
*     ( Ymin source * Largeur Bloc source ) +
*    (( Xmin source / 16) * Xinc Source)

     move.l    SRC_FORM(a4),a0  ; a0 <- d‚but bloc source
     move.w    SRC_YMIN(a4),d4  ; d4 <- d‚calage en lignes SrcYmin
     move.w    SRC_NXLN(a4),d5  ; d5 <- longueur ligne source
     mulu      d5,d4            ; d4 <- d‚calage en octets jusque
                                ; (0, Ymin)
     add.l     d4,a0            ; a0 -> (0,Ymin)

     move.w    SRC_NXWD(a4),d4  ; d4<- d‚calage entre mots cons‚-
     move.w    d4,Src_Xinc(a5)  ;    cutifs dans un plan source

     mulu      d4,d0            ; d0<- d‚calage mot contenant Xmin
     add.l     d0,a0            ; a0-> 1er mot source(Xmin, Ymin)

* Src_Yinc est le d‚calage en octets entre de dernier mot d'une
* ligne de la source et le premier mot de la ligne suivante.

     mulu      d4,d1            ; d1<- taille ligne srce en octets
     sub.w     d1,d5            ; d5 <- valeur ajout‚e au pointeur
     move.w    d5,Src_Yinc(a5)  ;    de fin de ligne pour pointer
                                ;    le d‚but de ligne suivante
*
* Calcule l'adresse de d‚part de la destination:
*
*     Adresse du Bloc destination +
*     ( Ymin destination * Largeur Bloc destination ) +
*    (( Xmin destination / 16) * Xinc destination)

     move.l    DST_FORM(a4),a1  ; a1 <- d‚but bloc destination
     move.w    DST_YMIN(a4),d4  ; d4 <- d‚calage en lignes DstYmin
     move.w    DST_NXLN(a4),d5  ; d5 <- longueur ligne destination
     mulu      d5,d4            ; d4 <- d‚calage en octets jusque
                                ; (0, Ymin)
     add.l     d4,a1            ; a1 -> (0,Ymin)

     move.w    DST_NXWD(a4),d4  ; d4<- d‚calage entre mots cons‚-
     move.w    d4,Dst_Xinc(a5)  ;    cutifs dans un plan dest.

     mulu      d4,d2            ; d2<- d‚calage mot contenant Xmin
     add.l     d2,a1            ; a1-> 1er mot dest.(Xmin, Ymin)

* Dst_Yinc est le d‚calage en octets entre de dernier mot d'une
* ligne de la destination et le premier mot de la ligne suivante.

     mulu      d4,d3            ; d3<- taille ligne DSTe en octets
     sub.w     d3,d5            ; d5 <- valeur ajout‚e au pointeur
     move.w    d5,Dst_Yinc(a5)  ;    de fin de ligne pour pointer
                                ;    le d‚but de ligne suivante
*
* Le quartet bas de la diff‚rence entre l'alignement de la source
* et de la destination constitue la valeur oblique. Utilisation 
* du drapeau d'index d'oblique pour r‚f‚rencer les ‚tats de FXSR
* et NFSR dans la table des drapeaux d'oblique
*
     and.b     #$0F,d7          ; d7 <- compte oblique de base
     or.b      skew_flags(pc,d6.w),d7 ; d7 <- drapeaux n‚cessaires
     move.b    d7,Skew(a5)      ; charge registre Oblique

     move.b    #mHOP_Source,HOP(a5) ; HOP fix‚: source seule
     move.b    #3,OP(a5)        ; OP logique = mode REPLACE

     lea       Line_Num(a5),a2  ; registre num‚ro de ligne
     move.b    #fLineBusy,d2    ; drapeau ligne Busy
     move.w    PLANES(a4),d7    ; d7 <- controleur de plan
     bsr       begin










*              Le placement des drapeaux Oblique
*
*
* Qualificateurs    Actions  Direction transfert: Gauche->Droite
*
* ‚gal Sx&F>
* larg.Dx&F FXSR NFSR
*
*  0    0    0    1 |..ssssssssssssss|ssssssssssssss..|
*                   |......dddddddddd|dddddddddddddddd|dd......
*
*  0    1    1    0 |......ssssssssss|ssssssssssssssss|ss......
*                   |..dddddddddddddd|dddddddddddddd..|
*
*  1    0    0    0 |..ssssssssssssss|ssssssssssssss..|
*                   |...ddddddddddddd|ddddddddddddddd.|
*
*  1    1    1    1 |...sssssssssssss|sssssssssssssss.|
*                   |..dddddddddddddd|dddddddddddddd..|
*


skew_flags:

     dc.b      mSkewNFSR        ; Larg. Source < larg. Destination
     dc.b      mSkewFXSR        ; Larg. Source > larg. Destination
     dc.b      0                ; Largeur=d‚calage droite source
     dc.b      mSkewNFSR+mSkewFXSR ; Largeur=d‚calage gche source

* Lorsque la largeur de la destination est un simple mot

     dc.b      0                ; largeur source = 0 mot
     dc.b      mSkewFXSR        ; largeur source de deux mots
     dc.b      0                ; pas de drapeau d'oblique si la
     dc.b      0                ; largeur de source et de dest.
                                ; sont ‚gales … un mot.


















next_plane:

     move.l    a0,Src_Addr(a5)  ; pointeur Source pour ce plan
     move.l    a1,Dst_Addr(a5)  ; pointeur Dest. pour ce plan
     move.w    HEIGHT(a4),Y_count(a5) ; compteur de lignes

     move.b    #mLineBusy,(a2)  ; <<< d‚marrage du BLiTTER >>>

     add.w     SRC_NXPL(a4),a0  ; a0-> d‚but prochain plan srce
     add.w     DST_NXPL(a4),a1  ; a1-> d‚but prochain plan dest.


*
* Le BLITTER  opŠre  g‚n‚ralement avec le drapeau HOG … 0. Dans ce
* mode,  le BLITTER et l'unit‚ centrale du ST se partagent ‚quita-
* blement  le  bus,  chacun travaillant durant 64 cycles d'horloge 
* tandis  que l'autre est stopp‚. Ce mode permet aux interruptions
* d'ˆtre prises en compte par le 68000 lorsqu'un transfert de bloc
* large  est effectu‚. La contrepartie de ce mode op‚ratoire est 
* que les transferts de blocs effectu‚s dans ce mode prennent deux
* fois plus de temps que dans l'autre mode (HOG … 1).
* 90% des performances du mode HOG peuvent cependant ˆtre obtenues
* si l'on  adopte  une  proc‚dure  de  red‚marrage ultra-rapide du
* blitter.  Lorsque le contr“le est rendu au 68000 par le blitter,
* celui-ci  r‚initialise imm‚diatement le drapeau BUSY, permettant
* au  Blitter  de  red‚marrer  aprŠs seulement 7 cycles horloge au
* lieu  des 64 cycles normaux. Les interruptions en attente seront
* trait‚es  avant  que  le code de red‚marrage prenne effet. Si le
* drapeau BUSY est r‚initialis‚ lorsque le compteur de ligne est …
* z‚ro, le drapeau restera … 0, indiquant la fin de l'op‚ration de
* transfert et la non n‚cessit‚ de red‚marrer le Blitter.
*
* (Les  routines de traitement d'interruption doivent obligatoire-
* ment stopper le BLITTER lors de l'ex‚cution de parties critiques
* par  mise  … 0 du drapeau BUSY. L'‚tat ant‚rieur du drapeau BUSY
* devra ensuite ˆtre restaur‚, avant la fin de la routine de trai-
* tement d'interruption.)


restart:
     
     bset.b    d2,(a2)          ; red‚marre le Blitter + test BUSY
     nop                        ; pour laisser du temps aux inter.
     bne       restart          ; red‚marrage du Blitter si le
*                               ; drapeau n'‚tait pas … 0.

begin:

     dbra      d7,next_plane    ; plan suivant
     rts

----------------------------------------------------------------


Annexe B -- Fonction XBios de configuration du Blitter



0x40  Blitmode - Fixe/Demande la configuration du Blitter

     Synopsis:           int  Blitmode(drapeau)
                         int  drapeau;

     
     La fonction 0x40 (64 en d‚cimal) du Bios ‚tendu (trap #14) 
fixe et demande la configuration actuelle du blitter. Si 'drapeau' 
est ‚gal … -1 (0xFFFF), aucune op‚ration n'est effectu‚e et la 
configuration courante du blitter est retourn‚e. Si 'drapeau' est 
diff‚rent de -1, alors la configuration du blitter est fournie 
comme suit:


     bit 0:              0: mode de transfert logiciel
                         1: mode de transfert mat‚riel (blitter)

     bits 1 .. 14:       ind‚finis, r‚serv‚s

     bit 15:             doit ˆtre nul


     La configuration ant‚rieure du blitter est retourn‚e dans le 
mot faible de D0 avec les caract‚ristiques suivantes:

     bit 0:              0: transferts par logiciel
                         1: transferts par blitter

     bit 1:              0: pas de Blitter implant‚ sur le systŠme
                         1: Blitter implant‚ sur le systŠme

     bits 2 .. 14:      ind‚finis,  r‚serv‚s, peuvent ˆtre … z‚ro 
                         ou … un au retour

     bit 15:             toujours retourn‚ … 0


     Si l'on tente de positionner le mode de transfert "mat‚riel" 
alors qu'aucun blitter n'est implant‚ sur le systŠme, le mode 
"logiciel" reste positionn‚.

     Les champs r‚serv‚s sont destin‚s … de futures possibilit‚s 
du blitter ou d'autres circuits graphiques. Ils ne doivent pas 
ˆtre pris en compte mais doivent ˆtre laiss‚s inchang‚s car ils 
sont susceptibles de servir dans l'avenir.

     Cet appel fonctionne avec toutes les versions du systŠme 
d'exploitation sur ROMs (N.D.T.: Avec des ROMs ant‚rieures … Avril 
1987, cet appel renvoie 0x40, soit "transfert par logiciel" (bit 0 
… 0) et "pas de Blitter implant‚" (bit 1)).

EXEMPLE D'APPEL EN LANGAGE C

     #define Blitmode(a)  xbios(64,a)

     int       curmode;

     Curmode = Blitmode(-1);   /* demande ‚tat courant blitter */
     Blitmode(curmode | 1);    /* active le blitter */ 
     travail();                /* ... fait quelque chose */
     Blitmode(curmode);        /* replace ‚tat ant‚rieur blitter*/




EXEMPLE D'APPEL EN ASSEMBLEUR 68000


     move.w    #-1,-(sp)        * demande ‚tat courant
     move.w    #$40,-(sp)       * fonction Blitmode (demande)
     trap      #14              * bios ‚tendu
     addq.l    #4,sp            * restaure la pile
     move.w    d0,-(sp)         * sauve ‚tat ant‚rieur blitter
     or.w      #1,d0            * active le blitter
     move.w    d0,-(sp)         * fixe activation blitter
     move.w    #$40,-(sp)       * fonction Blitmode (fixe)
     trap      #14              * bios ‚tendu
     addq.l    #4,sp            * restaure la pile
*
*    ... fait quelque chose
*
     move.w    #$40,-(sp)       * restaure l'‚tat ant‚rieur
     trap      #14              * bios ‚tendu
     addq.l    #4,sp            * d‚pile paramŠtres




















Annexe C -- R‚f‚rences



[1]  Rob Pike, Leo Guibas, et Dan Ingalls, 'SIGGRAPH84 Course 
	Notes: Bitmap Graphics', AT&T Bell Laboratories 1984.


[2]  William Newman et Robert Sproull, 'Principles of Interactive 
	Computer Graphics', McGraw-Hill 1979, Chapitre 18.


[3]	John Atwood, '16160 Raster0p Chip Data Sheet', Silicon 
	Compilers 1984. Voir aussi 'VL16160 RasterOp Graphics/Boolean 
	Operation ALU', VLSI Technology 1986.


[4]	Adele Goldberg et David Robson, 'Smalltalk-80: The Language 
	and its Implementation', Addison-Wesley 1983, Chapitre 18.