|
|
| (4 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]]
| |
| − | | |
| − | [[Category:Programming]]
| |