CODINGAMSTRAD CPC 464 - CRÉER DE NOUVELLES INSTRUCTIONS

Nouvelles Instructions 016

5. LES VARIABLES

LES VARIABLES NUMÉRIQUES

Comme vous le savez sans doute, le BASIC fait la différence entre ce que l'on appelle les nombres entiers et les nombres décimaux. Ces nombres ne sont pas traités de la même manière, et il existe d'ailleurs dans le système d'exploitation, deux blocs distincts de routines arithmétiques : l'un pour les variables entières et l'autre pour les variables à virgule flottante.

Il faut également savoir que le traitement des variables à virgule flottante est nettement plus long que celui des variables entières.

La ligne suivante, par exemple, sera exécutée en 5,6 secondes environ :

FOR I% =1 TO 10000 : NEXT I%

(Le symbole % signale à la machine qu'il s'agit d'un nombre entier.)
Alors que celle-ci le sera en plus de 10 secondes :

FOR I = 1 T0 10000:NEXT I

Nous allons nous intéresser à la manière dont ces variables sont stockées en mémoire par la machine.

Le cas des variables entières est simple : elles sont stockées sur deux cases mémoire. La première contient l'octet faible du nombre, et la seconde l'octet fort.

Nous pouvons le vérifier grâce au pointeur de variable que l'on peut appeler avec l'arobas (@). Cette fonction permet d'obtenir l'adresse d'une variable, c'est-à-dire l'adresse de l'emplacement mémoire contenant l'octet faible de cette variable (l'octet fort étant situé immédiatement après).

Essayez par exemple de taper ceci (en mode direct et après avoir éinitialisé la machine) :

A% = 4

Puis :

PRINT @A%

Vous obtenez 374.

L'octet faible de A % est donc stocké dans l'emplacement mémoire 374 et l'octet fort dans l'emplacement 375. On peut le vérifier en faisant :

PRINT PEEK(374)

On obtient 4.

PRINT PEEK(375)

On obtient 0.

Un nombre peut être calculé à partir de son octet fort et de son octet faible grâce à la formule :

(octet fort * 256) + octet faible

(si l'on est sûr qu'il est positif, le problème étant un peu différent pour les nombres négatifs.)

Dans notre cas, nous avons bien : 4 = (0 * 256) + 4

Essayez maintenant ceci :

A% =500

Puis :

PRINT PEEK (@A%) + PEEK (@A% + 1) * 256

Vous obtenez bien 500.

Le premier PEEK donne le contenu de l'emplacement mémoire où est situé l'octet faible de A %, et le second le contenu de l'emplacement mémoire où est situé l'octet fort.

Pour conclure, retenons simplement qu'une variable entière est stockée sur 2 octets, et que l'octet faible est situé en "première position".

Le cas des variables à virgule flottante est un peu plus complexe, puisque 5 octets sont nécessaires pour leur stockage en mémoire (pour information, les quatre premiers octets s'appellent la mantisse, et le cinquième l'exposant).

Pour ces variables à virgule flottante, la fonction @ donnera l'adresse du premier des cinq emplacements mémoire où elle est stockée

Notons enfin qu'il est possible de transmettre l'adresse d'une variable grâce à l'arobas lors de l'utilisation de l'instruction CALL :

CALL Adresse du programme, @ variable

Nous utilisons cette possibilité dans le dernier programme de cet ouvrage (Tri de données alphanumériques).

Vous en savez maintenant assez sur les variables numériques pour étudier les programmes présentés.

LES VARIABLES ALPHANUMÉRIQUES

Les variables alphanumériques sont des variables pouvant être constituées de lettres, de chiffres, ou des deux ensembles. Elles sont signalées par le symbole $. Par exemple :

A$ = "JAMES BOND 007"

Une chaîne alphanumérique (c'est-à-dire comprenant plusieurs élé-
ments alphanumériques) est bien sûr stockée en mémoire sous la forme
d'une succession des codes ASCII des éléments qui la composent. La
chaîne "JAMES BOND 007", par exemple, se présentera ainsi :

&4A (code ASCII de J)

&41 (code ASCII de A)

&4D (code ASCII de M)

&45 (code ASCII de E)

&53 (code ASCII de S)

&20 (code ASCII de l'espace)

etc.

Là encore, l'arobas peut être utilisé.

Dans ce cas, pourtant, l'adresse obtenue ne sera pas directement l'adresse de la variable, mais l'adresse de ce que l'on appelle son descripteur de chaîne. Ce descripteur comporte 3 octets :

Notons que la longueur d'une chaîne de caractères (ou, si l'on veut, son nombre d'éléments) ne pouvant dépasser 255, le chiffre indiquant cette longueur peut toujours tenir sur 1 octet.

EXEMPLES:
1 A$ = "JAMES BOND" : L=PEEK (@A$):ADR=PEEK (@A$+1)+PEEK(@A$+2)*256-.F0R 1=0 TO L-1:PRINT CHR$(PEEK(ADR+I);:NEXT
RUN
JAMES BOND

Cette partie récapitule et décrit d'une manière formelle les instructions utilisées dans les programmes présentés.

Celles-ci sont classées dans l'ordre alphabétique de leurs mnémoniques, dont les représentations conventionnelles notables sont les suivantes :

* Les registres doubles sont, selon le cas, symbolisés par ss, rr ou dd.

* Les registres simples sont symbolisés par r.

* Les données immédiates tenant sur un octet (ou si l'on veut, les valeurs quelconques n'ayant qu'un octet faible) sont représentées par n. Les autres sont représentées par nn.

* L'adresse d'un emplacement mémoire est représentée par nn, et le contenu de cet emplacement mémoire par (nn).

* La partie basse d'un registre double est celle où se trouvent les octets de poids faible. La partie haute est celle où se trouvent les octets de poids fort.

Signalons d'autre part que :

• Une description détaillée de l'instruction est proposée lorsque cela semble nécessaire.

• Seuls les éventuels effets sur les indicateurs S et Z ont été spécifiés.

• Concernant toutes les instructions de chargement, la règle générale est que la source n'est pas modifiée par l'instruction (cela concerne également les instruction de transfert répétitif).

ADD HL,ss (Additionner HL et le registre double ss)

Octet 1 : Selon registre ss (BC:09 - DE:19 - HL:29)

Description : Le contenu du registre double spécifié est additionné au contenu de HL. Le résultat est rangé dans HL, l'autre registre restant inchangé.

Indicateurs : aucun effet.

BIT b,r (Test du bit b du registre r)

Octet 1 :CB
Octet 2 : Selon le registre et le bit

Indicateurs : L'indicateur Z est mis à 1 .si le bit testé est 0, et il est mis à 0 autrement. L'indicateur S est modifié aléatoirement.

CALL pq (Appel du sous-programme d'adresse pq)

Octet 1 : CD
Octet 2 : adresse, poids faible
Octet 3 : adresse, poids fort

Observation ; Lorsque cette instruction est rencontrée, l'adresse de
retour du sous-programme est déposée sur la pile.

Indicateur: aucun effet.

CP s (Comparaison de l'opérande s et de l'accumulateur A)

Si s est un registre :

Octet 1 : selon registre (A:BF - B:B8 - C:B9 - D:BA - E:BB - H:BC - L:BD)

Si s est une donnée immédiate :

Octet 1 : FE
Octet 2 . donnée immédiate

Si s est (HL) :
Octet 1 : BE

Si s est (IX+ d):

Octet 1 : DD
Octet 2 : BE
Octet 3 : d

Indicateurs: L'indicateur Z est mis à 1 quand le test indique l'égalité. Pour effectuer la comparaison, le processeur soustrait l'opérande de l'accumulateur, mais sans conserver le résultat (l'accumulateur reste inchangé). L'indicateur S est par conséquent modifié selon le résultat.

DEC m (Décrémentation de l'opérande m)

Si r est un registre - Octet 1 : selon registre (A:3D - B:05 - C:0D - D:15 - F:1D - H:25 - L:2D)

Description : Le contenu du registre spécifié est diminué de 1.

Indicateurs : S et Z sont modifiés selon le résultat.

DEC rr (Décrémentation du registre double rr)

Octet 1 : selon registre (BCToB - DE:1B - HL:2B)

Indicateurs : aucun effet.

DEC IX (Décrémentation du registre IX)

Octet 1 : DD
Octet 2 : 2B

Indicateurs : aucun effet.

DJNZ e (Décrémentation de B et saut relatif de e si non nul)

Octet 1:10

Octet 2 : longueur du saut

Indicateurs : aucun effet

EX DE, HL (Échange des registres HL et DE)

Octet 1 : EB

Indicateurs : aucun effet.

INC rr (Incrémentation du registre double rr)

Octet 1 : selon registre (BC:03 - DE:13 - HL:23)

Description . Le contenu du registre spécifié est augmenté de 1.

Indicateurs : aucun effet.

INC IX (Incrémentation du registre IX)

Octet 1 : DD
Octet 2 : 23

Indicateurs : aucun effet.

JP ce, pq (Saut conditionnel à l'adresse pq)

Octet 1 : selon condition (positif : F2 ; négatif : FA ; nul : CA ; non nul:C2),
Octet 2 : adresse, poids faible
Octet 3 : adresse, poids fort

Description : Si la condition spécifiée est remplie, le programme
saute à l'adresse indiquée. Sinon, cette adresse est ignorée et le
programme se poursuit normalement.

Indicateurs : aucun effet.

JP pq (Saut à l'adresse pqj

Octet 1 : C3
Octet 2 : adresse, poids faible
Octet 3 : adresse, poids fort

Description : Le programme saute à l'adresse indiquée.

Indicateurs : aucun effet.

JR ce, e (Saut relatif conditionnel de e)

Octet 1 : selon condition (nul : 28 – non nul : 20)
Octet 2 : longueur du saut

Indicateurs : aucun effet.

JR e (Saut relatif de e)

Octet 1 : 18
Octet 2 : longueur du saut

Indicateurs : aucun effet.

LD dd, (nn)(Chargement du registre double dd à partir de l'emplacement
mémoire d'adresse nn)

Octet 1 : ED
Octet 2 : selon registre (BC4B - DE:5B - HL:6B)
Octet 3 : adresse, poids faible
Octet 4 : adresse, poids fort

Description : Le contenu de l'emplacement mémoire dont l'adresse est spécifiée est chargé dans les poids faibles du registre choisi. Le contenu de l'emplacement mémoire suivant immédiatement le précédent est chargé dans les poids fort du registre.

Indicateurs : aucun effet.

LD dd, nn (chargement du registre double dd avec la donnée immédiatenn)

Octet 1 : selon registre (BC:1 - DE:11 - HL:21)
Octet 2 : donnée immédiate, poids faible
Octet 3 : donnée immédiate, poids fort

Indicateurs : aucun effet.

LD r, n (Chargement du registre r avec la donnée immédiate n)

Octet 1 : selon registre (A:3E - B:06 - C:OE - D:16 - E:1E - H:26 - L:2E)
Octet 2 : données immédiate

Indicateurs : aucun effet.

LD r, r' (Chargement du registre r à partir du registre r')

Octet 1 : selon registre

Indicateurs : aucun effet.

LD (BC), A (Chargement de l'emplacement mémoire adressé par BC à partir de l'accumulateur)

Octet 1 : 2
Indicateurs ' aucun effet

LD (DE), A (Chargement de l'emplacement mémoire adressé par DE à partir de l'accumulateur)

Octet 1 :12

Indicateurs : aucun effet.

LD (HL), n (Chargement de la donnée immédiate n dans l'emplacementmémoire adressé par HL)

Octet 1 : 36
Octet 2 : donnée immédiate

Description : La donnée fournie est chargée dans l'emplacement mémoire dont l'adresse est dans HL.

Indicateurs : aucun effet.

LD r, (IX+d) (Chargement du registre r à partir de l'emplacement mémoire d'adresse IX + d)

Octet 1 : DD
Octet 2 : selon registre (A:7E - B:46 - C:4E - D:56 - b:5E - H:66 - L:6E
Octet 3 : déplacement

Description : Le contenu de l'emplacement mémoire dont l'adresse est IX + d (d est appelé "déplacement"), est chargé dans le registre spécifié.

Indicateurs : aucun effet.

LD (nn), dd (Chargement de l'emplacement mémoire d'adresse nn à partir du registre double dd)

Octet 1 : ED
Octet 2 : selon registre (BC:43 - DE:53 - HL:63)
Octet 3 : adresse, poids faible
Octet 4 : adresse, poids fort

Description : Le contenu de la partie basse du registre spécifié (c'est-à-dire la partie contenant l'octet faible) est chargé dans l'emplacement mémoire indiqué. Le contenu de la partie haute du registre est chargé dans l'emplacement mémoire suivant immédiatement le précédent.

Indicateurs : aucun effet.

LD (nn), HL (Chargement de l'emplacement mémoire d'adresse nn à partir de HL)

Octet 1 : 22
Octet 2 : adresse, poids faible
Octet 3 : adresse, poids fort V

Description : Le contenu du registre L est chargé dans l'emplacement mémoire dont l'adresse est spécifiée. Le contenu du registre H est chargé dans l'emplacement mémoire suivant immédiatement le précédent.

Indicateurs : aucun effet.

LD A, (BC) (Chargement de l'accumulateur à partir de l'emplacement mémoire adressé par BC)

Octet 1 : A

Indicateurs : aucun effet.

LD A, (DE) (Chargement de l'accumulateur à partir de l'emplacement mémoire adressé par DE)

Octet 1 : 1A

Indicateurs : aucun effet.

LD HL, (nn) (Chargement de HL à partir de l'emplacement mémoire d'adresse nn)

Octet 1 : 2A
Octet 2 : adresse, poids faible
Octet 3 : adresse, poids fort

Description. Le contenu de l'emplacement mémoire dont l'adresse est spécifiée est chargé dans le registre L. Le contenu de l'emplacement mémoire suivant immédiatement le précédent est chargé dans H.

Indicateurs : aucun effet.

LD (HL), r (Chargement de l'emplacement mémoire adressé par HL àpartir du registre r)

Octet 1 : selon registre (A:77 - B:70 - C:71 - D:72 - E:73 - H 74 - L:75)

Indicateurs : aucun effet.

LD (IX+d), r(Chargement de l'emplacement mémoire d'adresse IX + d à partir du registre r)

Octet 1 : DD
Octet 2 : selon registre (A:77 - B:70 - C:71 - D:72 - E:73 - H:74 - L:75)
Octet 3 : d

Indicateurs : aucun effet.

LD IX, (nn) (Chargement du registre IX à partir de l'emplacemen mémoire d'adresse nn)

Octet 1 : DD
Octet 2 : 2A
Octet 3 : adresse, poids faible
Octet 4 : adresse, poids fort

Description : Le contenu de l'emplacement mémoire dont l'adresse est spécifiée est chargé dans la partie basse du registre IX. Le contenu de l'emplacement mémoire suivant immédiatement le précédent est chargé dans la partie haute.

Indicateurs : aucun effet.

LDDR (Transfert répétitif de bloc avec décrémentation)

Octet 1 : ED
Octet 2 : B8

Description : Le contenu de I emplacement mémoire adresse par HL est chargé dans l'emplacement mémoire adressé par DE. Les trois registres HL, DE et BC sont ensuite décrémentés. Si BC est différent de 0, l'instruction est exécutée de nouveau. Sinon, le programme se poursuit en séquence.

Indicateurs : aucun effet.

LDIR (Transfert répétitif de bloc avec incrémentation)

Octet 1 : ED
Octet 2 : B0

Description : Le contenu de remplacement mémoire adressé par HL est chargé dans l'emplacement mémoire adressé par DE. Les registres HL et DE sont ensuite incrémentés, alors que BC est décrémenté. Si BC est différent de 0, l'instruction est exécutée de nouveau. Sinon le programme se poursuit en séquence.

Indicateurs : aucun effet.

POP qq (Dépilement du registre double qq)

Octet 1 : selon registre (BCC1 - DE:D1 - HLE1 - AF:F1)

Description : La donnée située au-dessus de la pile est enlevée et chargée dans le registre spécifié.

Indicateurs : aucun effet.

PUSH qq (Empilement du registre double qq)

Octet 1 : selon registre (BCC5 - DE:D5 - HL:E5 - AF:F5)

Description : Le contenu du registre spécifié est déposé su (le registre reste malgré tout inchangé)

Indicateurs : aucun effet.

RET (Retour de sous-programme)

Octet 1 : C9

Observation : Lorsque cette instructïontest rencontrée, l'adresse de retour du sous-programme est retirée de la pile.

Indicateurs : aucun effet.

RET ce (Retour conditionnel de sous-programme)

Octet 1 : selon condition (non nul : C0 - nul : C8 - positif : F0 - négatif : F81 »

Observation: Dans ce cas particulier, l'adresse de retour n'est retirée de la pile que si ce retour a effectivement lieu, donc si la condition spécifiée est remplie.

Indicateurs : aucun effet.

SBC HL, ss (Soustraire de HL le registre double ss)

Octet 1 : ED
Octet 2 : selon registre (BC:42 - DE:52 - HL:62)

Description : Le contenu du registre double spécifie est soustrait du contenu du registre HL et le résultat est rangé dans HL (l'autre registre reste inchangé).

Indicateurs : S est Z sont modifiés selon le résultat.

★ ANNÉE: ???
★ AUTEUR: JEAN-CLAUDE DESPOINE

Page précédente : Nouvelles Instructions 015
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 177 millisecondes et consultée 1005 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.