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

4/1.2.08 - Gestion de la mémoireCoding Classeurs Weka
4/0 - Langages du CPC

4/1 - Locomotive BASIC : Définitions et rappels de base

4/1.2 Version 1.0 sur CPC 464 : Mots clés et leur utilisation

VIII. Gestion de la mémoire
CALL< Adresse > [, < liste de paramètres >]

Donne le contrôle à un programme en langage machine dont le point d'entrée est l'adresse donnée dans le premier argument du CALL.

Un ou plusieurs paramètres (32 au maximum) peuvent être fournis au programme activé. Ces paramètres doivent être séparés par une virgule et peuvent être :

  • des constantes entières (de -32768 à 32767 ou de 0 à &FFFF),
  • des variables entières ou alphanumériques,
  • des pointeurs (pour plus de renseignements, reportez-vous à la description de l'ordre « VARPTR »).
Si aucun paramètre n'est fourni, le programme en langage machine est activé, et le retour sous BASIC se fait quand la commande assembleur « RTS » est rencontrée.

Si un ou plusieurs paramètres sont fournis, les registres du Z80 contiennent toutes les informations pour y accéder et sont définis comme suit au moment du débranchement :

  • PC contient l'adresse du point d'entrée du programme en langage machine,
  • A contient le nombre de paramètre(s) passé(s),
  • DE contient le dernier paramètre,
  • IX pointe sur la zone RAM du dernier paramètre passé.
Chaque paramètre est défini par deux octets : poids faible, poids fort (LSB, MSB).

Si le paramètre est entier ou contient un entier, ces deux octets donnent la valeur numérique de l'entier.

Si le paramètre est une variable alphanumérique, ces deux octets contiennent l'adresse d'implantation de la variable (VARPTR).

Par exemple :

B = 4

B$ = "Texte"

CALL Adresse, B, &334, @B, A$, @B$

Registre A =5 (nombre de paramètres passés)

Registre IX = LSB @ B$
  IX + 1 = MSB @ B$
  IX + 2 = LSB @ A$
  IX + 3 = MSB @ A$
  IX + 4 = LSB @ B
  IX + 5 = MSB @ B
  IX + 6 =34 (LSB de &334 sur 16 bits)
  IX + 7 =3 (MSB de &334 sur 16 bits)
  IX + 8 =4 (LSB de 4 sur 16 bits)
  IX + 9 =0 (MSB de 4 sur 16 bits)

ERASE < Nom(s) de variable(s) >

Permet d'écraser l'espace RAM réservé à des variables numériques, alphanumériques et tableaux quand elles ne sont plus nécessaires.

FRE(< Nombre >) ou FRE(< Chaîne alphanumérique >)
  • « Nombre » peut être une valeur numérique ou une variable numérique.
  • « Chaîne alphanumérique » peut être le contenu d'une chaîne ou une variable représentant une chaîne.
Donne la place RAM disponible sous BASIC.

La première forme donne la valeur « brute » de la RAM disponible.

La deuxième forme donne la valeur de la RAM disponible après avoir éliminé les variables qui ne servent à rien ou sont inutilisées (GARBAGE COLLECTION).

Remarque :

La deuxième forme peut prendre une ou deux secondes, mais permet, après réarrangement de la RAM, de disposer d'un espace plus grand.

Implantation et exécution d'un sous-programme en langage machine :
  • Mémoriser HIMEM,
  • Implanter des routines en langage machine au-delà de HIMEM,
  • Exécuter ces routines sous BASIC,
  • Restituer le HIMEM pour profiter pleinement du BASIC.

100 S = HIMEM 'Mémo @ RAM la plus haute utilisee par BASIC
110 MEMORY XX 'On baisse cette adresse
120 'Implantation de programmes en LM entre XX et S
130 'Execution de ces programmes LM
140 MEMORY S 'Retour a l'espace RAM maximum utilisable sous BASIC
150 'Les sous-programmes ASM pourront maintenant etre écrasés par BASIC
160 'Si la mémoire utilisee par le BASIC est supérieure a XX

HIMEM

Donne l'adresse RAM supérieure utilisée par le BASIC. Cette adresse n'évolue pas en cours de programme sauf si vous utilisez les ordres de redéfinition de caractères « SYMBOL AFTER ».

UtilisationImplantation et exécution d'un sous-programme en langage machine :
  • Mémoriser HIMEM,
  • Implanter des routines en langage machine au-delà de HIMEM,
  • Exécuter ces routines sous BASIC,
  • Restituer le HIMEM pour profiter pleinement du BASIC.

100 S = HIMEM 'Mémo @ RAM la plus haute utilisee par BASIC
110 MEMORY XX 'On baisse cette adresse
120 'Implantation de programmes en LM entre XX et S
130 'Execution de ces programmes LM
140 MEMORY S 'Retour a l'espace RAM maximum utilisable sous BASIC
150 'Les sous-programmes ASM pourront maintenant etre écrasés par BASIC
160 'Si la mémoire utilisee par le BASIC est supérieure a XX

INP (Adresse)

Donne la valeur courante du port d'entrée/sortie spécifié par l'adresse.

Cette adresse est exprimée sur 16 bits et permet donc un adressage de 2A16 ( = 65536) ports.

En réalité, très peu de ports sont accessibles en entrée sur l'AMSTRAD de base. La fonction « INP » n'est donc pas très utilisée (voir Partie 2, chap. 3 pour avoir plus de détails sur les ports d'entrée/sortie).

MEMORY < Adresse >

Définit l'adresse RAM la plus haute utilisée par le BASIC.

Cette instruction a pour but de protéger une zone mémoire afin d'y installer des programmes en langage machine ou des données en étant sûr qu'ils ne seront pas écrasés par le BASIC.

Si l'adresse fournie est trop petite ou trop grande, le message « Memory Full » apparaîtra et l'instruction n'aura aucun effet.

OUT< Adresse de sortie >, < Valeur >

Permet d'envoyer la valeur spécifiée sur le port d'entrée/sortie spécifié.

L'adresse doit être exprimée sur 16 bits (donc, 2A16 ports sont adressables). Sur l'AMSTRAD de base, peu de ports sont utilisables par la commande « OUT » (voir Partie 3 chap. 3 pour plus de détails sur les ports d'entrée/sortie).

Remarque :

Une erreur sur cette instruction peut avoir des conséquences graves comme le « plantage »¹> de l'unité centrale, ou l'écriture intempestive sur l'unité de cassette ou de disquette.

¹) L'unité centrale est « plantée » lorsqu'elle n'est plus sous le contrôle du programmeur.

PEEK (< Adresse >)

Permet de lire dans la mémoire RAM ou ROM à l'adresse spécifiée. Reportez-vous à l'ordre POKE pour connaître la répartition de la mémoire sur les ordinateurs CPC.

UtilisationCet ordre peut être très utile si vous désirez faire communiquer des programmes ASSEMBLEUR et des programmes BASIC. Imaginons que vous désiriez incorporer une routine ASSEMBLEUR dans un programme BASIC, pour des raisons de vitesse d'exécution par exemple. La routine ASSEMBLEUR pourra faire des calculs et les communiquer au programme BASIC par des mémoires RAM. Le programme BASIC lira ces données avec l'ordre PEEK.
POKE < Adresse >, < Entier >

Permet d'écrire dans la mémoire RAM à l'adresse spécifiée la valeur spécifiée qui doit être comprise entre 0 et 255.

Remarque :

Une erreur sur cette instruction peut avoir des conséquences graves comme le « plantage » de l'unité centrale, ou l'écriture intempestive sur l'unité de cassette ou de disquette.

La RAM occupe les 64 kilo-octets d'adresse 0 à &FFFF de la manière suivante :

  • &0000 à &003F : Copie conforme du ROM BIOS
  • &0040 à &3FFF : Espace de travail pour le langage utilisé
  • &4000 à &BAFF : RAM utilisateur
  • &BB00 à &BFFF : Zone des variables système et table des points d'entrée des routines du FIRMWARE.
  • &C000 à &FFFF : RAM écran.
Reportez-vous en partie 2 chapitre 2 pour avoir plus de détails sur la mémoire.
UtilisationVous pouvez insérer les codes en langage machine d'un programme écrit en assembleur dans un programme BASIC et mettre ces codes en mémoire RAM de la façon suivante :

100 FOR I = 0 TO NB 'Nombre de codes hexa
110 READ A:POKE &9000 + I, A 'Lecture du LM et implantation en RAM
120 NEXT I
130 DATA Donnees Hexa

Autre utilisationVous pouvez modifier la valeur d'une variable en utilisant l'ordre « POKE » pour écrire dans la zone RAM où elle est stockée. Reportez-vous à l'ordre « VARPTR » pour avoir plus de détails.
VARPTR (Adresse)

Donne l'adresse où est implantée une variable BASIC.

FormatAD = @VAR

— « VAR » est une variable entière, réelle, alphanumérique ou élément de tableau.

— AD sera l'adresse de la variable sur 16 bits.

Son contenu est fonction du type de variable fournie.

AD-1 contient le type de la variable :

  • Variable AD-1
  • entière  1
  • alphanumérique  2
  • flottante  4
AD-2 contient le dernier caractère du nom de la variable dont le bit de poids fort a été mis à 1 (OR & 80).

AD-3 à AD-n contiennent les autres caractères du nom de la variable si celle-ci comporte n lettres.

• Variable entière :

AD : 8 bits LSB
AD + 1 : Bits 8 à 15 : 7 bits MSB
   Bit 16 : Signe = 1 si < 0
        = 0 si > = 0

• Variable réelle (flottante) :

Codée sur 5 octets (AD à AD+ 4)

Bit 7 de AD + 3 : Signe = 0 si > = 0
        = 1 si <0

AD + 4 = Log2(m) + &81 ou m représente le nombre réel.

Les bits 0 à 6 de AD + 3 et les octets AD, AD + 1 et AD + 2 sont codés en sens inverse : le MSB est le bit 6 de AD + 3 et le LSB le bit 0 de AD. Ils représentent :

— bit 6 de AD + 3 = ½ (AD + 4) qui doit être ajouté à AD + 4 pour donner m,

— bit 5 de AD + 3 = 1/4 (AD + 4) qui doit être ajouté à AD + 4 pour donner m,

— bit 4 de AD + 3 = 118 (AD + 4) qui doit être ajouté à AD + 4 pour donner m,

etc.,

— bit 0 de AD = ½~31 (AD + 4) qui doit être ajouté à AD + 4 pour donner m.

• Variable alphanumérique :

AD = longueur de la chaîne en nombre d'octets ;

AD + 1 = LSB de l'adresse où se trouve la chaîne AD + 2 = MSB de l'adresse où se trouve la chaîne

• Variable tableau :

Une dimension :
AD = Adresse du pointeur sur VAR(0)
AD - 1 et AD - 2 = MSB et LSB de la dimension du tableau
AD - 3 = Dimension de VAR - 1
AD - 4 et AD - 5 = MSB et LSB de l'offset entre deux variables
AD - 6 = Type de variable :

1 si entière
2 si alphanumérique
4 si flottante

AD - 7 = (Valeur ASCII de la dernière lettre) OR &80
AD - 8 = (Valeur ASCII de l'avant-demière lettre) OR &80
AD - n - 4 = (Valeur ASCII de la première lettre) OR &80

x dimensions (x > 1) :

AD - n = (Valeur ASCII de la dernière lettre) OR &80
AD - n + 1 = Type de la variable :

1 si entière
2 si alphanumérique
4 si flottante

AD-n + 2 et AD-n + 3= Longueur offset entre 2 variables
AD - n + 4 = Nombre d'indices
AD - n + 5 et AD-n + 6= Nombre d'éléments du 1er indice
AD-n + 7 et AD-n + 8 = Nombre d'éléments du 2e indice avec n = 6 + 2* Nombre d'indices.

Page précédente : 4/1.2.07 - Gestion des erreurs
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.732-desktop/c
Page créée en 123 millisecondes et consultée 1042 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.