5/10.2.4 RSX de manipulation d'imagesI. Copie de blocs : RSX |COPYBL L'écran des CPC est composé de 640 pixels horizontaux sur 400 pixels verticaux. Selon la résolution (Mode 0. 1 ou 2), les points élémentaires peuvent être composés de 2. 4 ou 8 pixels. A moins de spécifier le contraire à l'aide d'une instruction ORIGIN, le point de coordonnées 0,0 se trouve dans le coin inférieur gauche de l'écran. Les abscisses sont donc croissantes de la gauche vers la droite, et les ordonnées du bas vers le haut. Cette petite introduction a pour but de vous remémorer le fonctionnement du système de coordonnées graphiques des CPC. La RSX ;COPYBL permet de copier une partie de l'écran délimitée par un rectangle dont deux des extrémités sont spécifiées : - bord inférieur droit de coordonnées X1, Y1 ;
- bord supérieur gauche de coordonnées X2, Y2 ;
à la position spécifiée : coordonnées X3, Y3. Comment utiliser la RSX Le listing de la RSX est le suivant : BUF 9000 BOUCLE 907C COPYBL 902E DEFRSX 9024 FIN 90E5 LOGEXT BCD1 LXGSUIV 90C5 PLOTABS BBEA PTRTAB 9004 PTSUIV 90B3 SETFEN BBDE TESTABS BBF0 TABLE 9009 X1 9010 X2 9014 X3 9018 XS 901C XB 9020 Y1 9012 Y2 9016 Y3 901A YS 901E YB 9022Sa version Assembleur est intéressante pour comprendre son fonctionnement, mais son utilisation réelle se fera sous la forme de données hexadécimales insérées dans un programme Basic. Pour utiliser la RSX, il faut l'installer à l'aide d'une instruction CALL : CALL &9024puis l'appeler en spécifiant les coordonnées extrémales du rectangle à copier (XI, Y1 et X2, Y2) et le coin inférieur gauche à partir duquel doit être affiché la copie (X3, Y3) : |COPYBL, x1, y1, x2, y2, x3, y3La RSX en détail La logique de la RSX apparaît dans l'ordinogramme suivant : La RSX débute par la déclaration des constantes et variables utilisées par le programme : - la primitive LOGEXT permet de définir la RSX 1COPYBL ;
- la primitive TESTABS renvoie la couleur d'un point de l'écran ;
- la primitive SETPEN définit la couleur de tracé ;
- la primitive PLOTABS permet d'allumer un point sur l'écran :
LOGEXT: EQU 0BCD1H ;KL LOG EXT TESTABS: EQU OBBFOH ;GRA TEST ABS SETPEN: EQU OBBDEH ;GRA SETPEN PLOTABS: EQU 0BBEAH ;GRA PLOT ABSLes données suivantes concernent la définition de la RSX. Remarquez en particulier le pointeur PTRTAB qui fait référence à l'adresse de traitement de la RSX (JP COPYBL), et la table de définition de la RSX qui contient le mot clé COPYBL : BUF: DS 4 ;Zone RAM pour LOGEXT PTRTAB: DW TABLE pointeur table JP COPYBL ;Copie du bloc TABLE: DB "COPYB" DB "L"+80H DB 0 ;Fin de tableLa zone de déclaration des variables se termine par diverses coordonnées d'écran : X1: DS 2 ;Abs coin sup gauche SRC ... YB: DS 2 ;Ord but couranteLa RSX est définie à l'aide du petit programme situé entre les lignes 45 et 49 : DEFRSX: EQU $ ;Point d'entrée LD BC, PTRTAB ;Ptr table définition LD HL, BUF ;Buffer pour LOG EXT CALL LOGEXT ;Définition de la RSX RETLorsque le mot |COPYBL sera reconnu par le Basic, le programme situé à l'étiquette COPYBL sera exécuté (le tableau PTRTAB pointe sur l'étiquette COPYBL et contient le mot clé COPYBL). Le programme situé à l'étiquette COPYBL débute par la mémorisation des données qui lui sont passées : COPYBL: EQU $ LD H, (IX+1) LD (X1), HLIl se poursuit par l'initialisation des coordonnées source (Xs et Ys) et but (Xb et Yb) : LD HL, (X1) .... LD (YB), HLLes lignes qui suivent représentent le cœur du programme. Deux boucles imbriquées copient le rectangle source dans le rectangle but selon la logique suivante : La couleur du point situé en XS, YS est lue à l'aide de la macro TESTABS: BOUCLE : EQU $ LD HL, (YS) LD DE, (XS) CALL TESTABS ; Test coul pointCette couleur devra être reproduite dans le bloc but. Aussi est-elle passée à la macro SETPEN qui initialise la couleur de tracé : CALL SETPEN ;lnit couleurLe point de coordonnées XB, YB est allumé avec la même couleur que le point source : LD HL, (YB) LD DE, (XB) CALL PLOTABS ;CopieL'abscisse source est alors comparée à l'extrémité droite du bloc source, dans le but de déterminer si une des lignes du bloc source a été décrite. L'indicateur de retenue est préalablement mis à zéro pour éviter toute erreur dans la soustraction 16 bits entre HL et DE : LD HL, (X2) LD DE, (XS) SCF CCF SBC HL, DE LD A, H OR LLorsque toute la ligne n'a pas été décrite, le programme donne le contrôle à l'étiquette PTSUIV qui donne accès aux points source et but suivants : JR NZ, PTSUIV ;Point suivantDans le cas où toute la ligne a été décrite, le programme teste si tout le bloc source a été décrit en comparant les ordonnées Y2 et YS : LD HL, (Y2) LD DE, (YS) SCF CCF SBC HL, DE LD A, H OR LLorsque tout le bloc source n'a pas été décrit, le programme donne le contrôle à l'étiquette LIGSUIV qui donne accès au premier point de la ligne suivante dans les blocs source et but : JR NZ, LIGSUIV ;Ligne suivanteDans le cas où tout le bloc source a été décrit, le programme redonne le contrôle au Basic : JR FIN FIN: EQU $ RETLe programme se termine par les deux routines qui permettent de passer au point suivant et à la ligne suivante dans les blocs source et but. Le passage au point suivant se fait par la simple incrémentation de variables XS et XB : PTSUIV: EQU $ SCF CCF LD HL, (XS) INC HL LD (XS), HL ;XS+1 LD HL, (XB) INC HL LD (XB), HLLe passage à la ligne suivante est plus complexe : - l'abscisse source est initialisée à X1 (XS=X1) ;
- l'ordonnée source est incrémentée de 2 (YS=YS+2) ;
- l'abscisse but est initialisée à X3 (XB=X3) ;
- l'ordonnée but est incrémentée de 2 (YB=YB+2) :
SCF CCF LD HL, (X1) LD (XS), HL ;XS=X1 LD HL, (YS) INC HL INC HL LD (YS), HL ;YS+2 LD HL, (X3) LD (XB), HL ;XB=X3 LD HL, (YB) INC HL INC HL LD (YP), HL ;YB+2Programme d'exemple en Basic Voici un court programme qui illustre l'utilisation de la RSX |COPYBL en Basic : Les données de checksum correspondantes sont les suivantes : 67 0 B1 7 A 22 A6 4 16 C1 22 3 9B 8B DF 4E La logique de fonctionnement de ce programme apparaît dans l'ordinogramme suivant : La ligne 1150 initialise la RSX : 1150 CALL &9024La ligne 1280 copie le bloc de coordonnées extrémales 0,369 et 639,399 en 0,100 : 1280 |COPYBL, 0, 369, 639, 399, 0, 100Dans la suite logique de la RSX ICOPYBL, nous allons maintenant étudier trois autres RSX qui effectuent la copie d'un bloc graphique avec : - |symétrie par rapport à un axe horizontal (|SYMOX) ;
- |symétrie par rapport à un axe vertical ( |SYMOY) ;
- |symétrie par rapport à un axe horizontal et à un axe vertical ( |SYMOXOY).
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 423 millisecondes et consultée 288 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|