Manuel d'utilisation du BLITTER: Difference between revisions

From AtariForumWiki
Jump to navigation Jump to search
>Tompee
mNo edit summary
>Tompee
(duplicate, redirect)
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<pre>
#redirect [[Blitter_manual/fr]]
 
 
 
                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'accroÅ’tre 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 constitu‚ 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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‚rot‚s 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 rafraŒchir 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 rafraŒchir 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.
</pre>
 
[[Category:Programming]]

Latest revision as of 06:55, 1 November 2008

Redirect to: