Difference between revisions of "Manuel d'utilisation du BLITTER"

From AtariForumWiki2018
Jump to: navigation, search
m
m (7 revisions imported)
 
(5 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>
 
−
Back to [[Programming]]
 

Latest revision as of 01:00, 4 June 2018

Redirect to: