CODINGLA BIBLE DU CPC 6128

La bible du CPC 6128 : 3.03.03 Le pointeur de variable '@'

3.3.3 Le pointeur de variable '@'

Une fonction particulièrement intéressante pour le programmeur en langage-machine est constituée par le pointeur de variable qui est appelé avec l'arobas. Cette fonction renvoie l'adresse où est placée une variable. L'appel de cette fonction se présente ainsi:

PRINT @a
On sort ainsi l'adresse de la variable a. Si la variable n'avait pas encore été initialisée, le message d'erreur 'Improper argument' sera sorti.

Si nous voulons maintenant accéder au contenu de la variable, nous devons distinguer entre les 3 différents types possibles.

La situation est très simple en ce qui concerne les variables entières. La valeur 16 bits est placée à l'adresse fournie. Nous pouvons donc obtenir la valeur de la variable a% avec la formule:

PRINT PEEK(@a%)+256*PEEK(@a%+1 )
Nous pouvons ainsi obtenir des valeurs entre 0 et 65535. Si nous voulons tenir également compte du signe, nous devons utiliser la fonction UNT.
PRINT UNT(PEEK(@a%)+256*PEEK(@a%+1))
Pour les variables à virgule flottante, le pointeur de variable est également dirigé sur la valeur de la variable, mais celle-ci
est exprimée avec 5 octets.

Les 5 premiers octets sont ce qu'on appelle la mantisse et le cinquième octet est la puissance de 2 par laquelle doit être multipliée la mantisse pour obtenir la valeur de la variable. Si nous désignons les 4 octets de la mantisse par ml à m4 et l'exposant par ex, nous obtenons la valeur à virgule flottante avec la formule suivante:

x=(1-2*SGN(m4 AND 128))*2*(ex-129)* (1+((m4 AND 127)+(m3+(m2+ml/256)/256)/256)/128)
La formule met en évidence que le signe du nombre à virgule flottante se trouve dans le bit supérieur de m4 et que les octets de la mantisse ml à m4 ont des valeurs croissantes. La puissance de 2 contient un offset de 129 ce qui donne des valeurs de 2A-129 à 2A127. Essayons notre formule:

100 a=-13:'variable a virgule flottante examinée
110 ad=@a:'adresse de a
120 ml=PEEK(ad):m2=PEEK(ad+1):m3=PEEK(ad+2)
130 m4=PEEK(ad+3):ex=PEEK(ad+4)
140 PRINT(l-2*SGN(m4 AND 128))*2A(ex-129)*(1+((m4 AND 127)+(m3+(m2+m1/256)/256)/256)/128)

Si vous faites tourner ce programme, vous obtiendrez en résultat la valeur -13. Remplacez si vous le voulez la ligne 100 par INPUT a et vous pourrez tester n'importe quelles valeurs.
La fonction de pointeur de variable trouve son application dans l'instruction CALL qui ne peut en effet transmettre que des valeurs 16 bits. Si vous voulez donc travailler avec des valeurs à virgule flottante, vous pouvez transmettre avec '@' l'adresse d'une variable à virgule flottante. Vous pourrez ensuite vous référer à cette adresse. Cette méthode permet également bien sûr de modifier directement la valeur d'une variable à virgule flottante.

Le cas des variables alphanumériques est encore plus intéressant. Ici aussi, nous pouvons utiliser le pointeur de variable qui nous
renvoie l'adresse de la variable.

Ce n'est cependant pas directement l'adresse de la chaîne de caractères mais celle de ce qu'on appelle le descripteur de chaîne. Ce descripteur de chaîne est long de trois octets. Le premier octet contient la longueur de la chaîne, soit une valeur entre 0 et 255. Les deux octets suivants contiennent l'adresse de la chaîne.

100 INPUT a$
110 ad=@a$
120 I=PEEK(ad)
130 sa=PEEK(ad+1)+256*PEEK(ad+2)
140 FOR i=sa TO sa+I-1:PRINT CHR$(PEEK(I));:NEXT

Ce programme va chercher la longueur et l'adresse de la chaîne, la lit et la sort.

Ici aussi, il est possible de transmettre une chaîne à l'instruction CALL à travers le pointeur de variable.

Les chaînes peuvent être encore employées en liaison avec l'instruction CALL de façon tout à fait différente. On peut par exemple placer tout simplement un programme en langage-machine dans une chaîne et l'appeler avec l'instruction CALL et le pointeur de variable. Le programme en langage-machine doit pour cela être transposable (il ne doit pas contenir d'adresse absolue interne) et il ne doit pas comporter plus de 255 octets. La plupart des petits programmes utilitaires remplissent ces conditions. Si vous voulez utiliser cette méthode, il vous faut procéder ainsi

Le programme en langage-machine est d'abord placé dans la variable alphanumérique. On utilisera le plus souvent READ et DATA à cet effet. Si vous voulez ensuite faire exécuter le programme, il vous suffit de faire calculer l'adresse de début de la chaîne de caractères (et donc du programme) avec l'arobas.

★ ANNÉE: ???

Page précédente : La bible du CPC 6128 : 3.03.02 Extensions du Basic avec RSX
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
Page créée en 211 millisecondes et consultée 1205 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.