CODINGCLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★

5/10.2.4 : I. Copie de blocs : RSX COPYBL (25e Complément)Coding Classeurs Weka
5/10.2.4 RSX de manipulation d'images

I. 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 9022

Sa 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 &9024

puis 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, y3

La 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 ABS

Les 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 table

La 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 courante

La 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
RET

Lorsque 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), HL

Il se poursuit par l'initialisation des coordonnées source (Xs et Ys) et but (Xb et Yb) :

LD HL, (X1)
....
LD (YB), HL

Les 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 point

Cette 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 couleur

Le 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 ;Copie

L'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 L

Lorsque 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 suivant

Dans 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 L

Lorsque 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 suivante

Dans le cas où tout le bloc source a été décrit, le programme redonne le contrôle au Basic :

JR FIN
FIN: EQU $
RET

Le 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), HL

Le 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+2

Programme 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 &9024

La 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, 100

Dans 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).

Page précédente : 5/10.2.4 - RSX de manipulation d'images
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 423 millisecondes et consultée 288 fois

L'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.