Manuel d'utilisation du BLITTER: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
(duplicate, redirect) |
||
(4 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
+ | #redirect [[Blitter_manual/fr]] |
||
− | <pre> |
||
− | |||
− | |||
− | |||
− | 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 11:55, 1 November 2008
Redirect to: