CpcAlive est un
environnement
de programmation
compatible
Amstrad CPC
pour création
d'animations
 graphiques.






Cpc en ligne

Les mots clés du basic Cpc

Les messages d'erreur du basic Cpc

La mémoire

La gestion des disquettes


La palette du cpc 6128 par défaut

Les couleurs affectées aux
crayons du cpc 6128 par défaut

Z80: opcodes et programmation

Installateur CpcAlive pour
Windows & DosBox


Documentation CpcAlive

SmallAsm est un assembleur Z80
pour Dos
















Cpc 6128 - Documentation


La mémoire


Dernières revues:
V1.16 - 16/12/2014 - correction assembleur Z80
V1.15 - 30/11/2014 - corrections
V1.14 - 20/11/2014 - affiche les fichiers sources dans le déboggeur Z80
V1.13 - 20/9/2014 - amélioration de la commande basic TRON (débogueur BASIC) + corrections
 
Le Cpc 6128 possède une mémoire RAM de 128Ko divisés en huit blocs de 16 Ko chacun, numérotés de 0 à 7. Seul quatre blocs peuvent êtres connectés simultanément.

valeur port &7F      position blocs
                &C0          0,1,2,3           
configuration standard
                &C1          0,1,2,7
                &C2          4,5,6,7
                &C3          0,3,2,7
                &C4          0,4,2,3
                &C5          0,5,2,3
                &C6          0,6,2,3
                &C7          0,7,2,3

Le système du Cpc n'exploite que le premier type de configuration. Dans cette configuration le bloc 0 occupe l'espace 0 à 03FFFh de la mémoire, le bloc 1 l'espace 04000h à 07FFFh, le bloc 2 l'espace 08000h à 0BFFFh, le bloc 3 l'espace 0C000h à 0FFFFh. L'écran exploite le bloc 3. La partie supérieure du bloc 2 contient les variables système. La partie inférieure du bloc 0 est utilisée par le système. Les programmes Basic sont chargés par le système à partir de l'adresse 0170h. Les données binaires peuvent êtres chargées à partir de l'adresse définie à l'aide de la commande Basic "MEMORY". S'il s'agit de programmes exécutables par le processeur, ils pourront être appelés grâce à l'instruction "CALL".


Le Cpc 6128 est pourvu en standard de 48Ko (3 blocs de 16Ko) de mémoires ROM. Un de ces blocs contient le système d'exploitation qui se connecte dans la zone 0 à 03FFFh (rom inférieure). Les deux autres blocs (BASIC et système disque) se connectent dans la zone 0C000h à 0FFFFh (roms supérieures). Le système peut exploiter dans cette dernière zone 252 blocs de 16Ko. Une particularité intéressante de ces roms est qu'elles peuvent recevoir des instructions BASIC programmables (Resident System eXtension).

Exemple de création d'une ROM contenant des instructions BASIC programmables (Resident System eXtension)

System memory map
System vectors


Appel d'un programme machine à partir de l'instruction Basic "CALL"

CALL <adresse>[,<liste de:<paramètre>]


COMMANDE: Appel d'un programme écrit en langage machine Z80. Afin de ne pas être écrasé par le basic, ce programme doit être placé au dessus de l'adresse définie à l'aide de la commande Basic "MEMORY". Les données fournies par la <liste de:<paramètre> doivent êtres des données entières (voir DEFINT).

Le programme machine reçoit les données du BASIC de la manière suivante: en entrée, le registre A du Z80 contient le nombre de paramètres fournis par la commande. Ce nombre ne peut pas dépasser 32. Le registre DE contient le dernier paramètre et le registre IX pointe sur une zone mémoire où sont disposés tous les paramètres. Chaque paramètre est constitué de 2 octets qui sont présentés sous la forme habituelle en Z80, poid faible d'abord, poid fort ensuite.

Un paramètre peut être:

- une constante ou variable entière
(ex: 12, &30, x, y,...). Dans ce cas la donnée reçue sera l'adresse mémoire où se situe la valeur de la constante ou de la variable.
- un pointeur de variable entière (ex: @x, @y...). Dans ce cas la donnée reçue sera l'adresse mémoire où se situe l'adresse de la valeur de la variable.
- une constante, une variable alphanumérique ou un pointeur de variable alphanumérique (ex: "TOTO", a$, b$, @a$, @b$,...). Dans ce cas, la donnée reçue pointe sur l'adresse mémoire où se situe les données de la chaîne de caractères. Le premier octet du bloc de données contient la longueur de la chaîne, vient ensuite l'adresse de la chaîne en mémoire.

Exemple:
A=1
B$="TOTO"
CALL adresse,&1234,A,@A,B$,@B$

Il y a 5 paramètres: le registre A du processeur contient 5

IX+0: pointe sur l'octet de poids faible de l'adresse du pointeur de B$
IX+1: pointe sur l'octet de poids fort de l'adresse du pointeur de B$
IX+2: pointe comme IX+0
IX+3: pointe comme IX+1
IX+4: pointe sur l'octet de poids faible de l'adresse de la valeur de A
IX+5: pointe sur l'octet de poids fort de l'adresse de la valeur de A
IX+6: pointe sur 1 (poids faible de 1)
IX+7: pointe sur 0 (poids fort de 1)
IX+8: pointe sur &34 (poids faible de &1234)
IX+9: pointe sur &12 (poids fort de &1234)



Les messages d'erreur du Basic Cpc

1     Unexpected NEXT    (NEXT inattendu)

Une commande NEXT à été rencontrée sans que la commande FOR n'ait lancé de boucle ou bien la variable suivant NEXT ne correspond pas à celle de la boucle FOR.

2     Syntax error (erreur de syntaxe)

le BASIC ne comprend pas la ligne â cause d'une construction non permise (très souvent une faute de frappe).

3     Unexpected RETURN     (RETURN inattendu)

Une commande RETURN survient sans qu'il y ait de sous-proramme en cours.

4     DATA exhausted    (il n'y a plus de données DATA )

Une commande READ a fini de lire une ligne de DATA épuisée.

5     Improper argument     (argument incorrect )

Erreur d'ordre général. L'argument d'une fonction ou le paramètre d'une commande n'est pas acceptable.

6     Overflow     (dépassement arithmétique)

Se produit lorsqu'une opération arithmétique dépasse les limites.Le chiffre en virgule flottante est devenu trop grand (supirieur à 1.7E^38) ou a fait l'objet d'une tentative de conversion en un nombre entier trop grand.

7     Memory full     (mémoire saturée)

Le programme ou ses variables sont trop grands pour la ménoire ou la structure des boucles est trop compliquée (trop de GOSUB, WHILE et FOR imbriqués).

A chaque fichier ouvert est affeccté un tampon de mémoire ce qui peut être une cause de limitation pour la commande MEMORY.

8     Line does not exist     (ligne inexistante)

Le numéro de ligne référencé n'existe pas en mémoire.

9     Subscript out of range (indice hors limite)

Un des indices de votre tableau est trop grand ou trop petit.

10     Array already dimensionned    (tableau déjà dimensionné)

Un tableau d'une instruction DIM a déjà été défini.

11     Division by zero     (division par zéro)

L'ordinateur n'aime pas diviser par zéro, que ce soit réel, entier etc...

12     Invalid direct command (commande directe non valable)

La commande n'est pas acceptable en mode direct.

13    Type mismatch     (types de variable ne correspond pas)

On a donné une valeur numérique pour une chaîne alphanumérique ou vice-versa ou un nombre non valable a été découvert par une commande READ ou INPUT.

14     String space full    (l'espace réservé aux chaînes sature)

Il y a tellement de chaînes qu'il n'y a plus de place, même après une remise en ordre.

15     String too long    (chaîne trop longue)

Une chaîne a plus de 255 caractères, ce qui peut arriver lors d'une concaténation de chaînes.

16     String expression too complex    (chaîne trop compliquée)

Des expressions de chaînes peuvent produire des valeurs intermédiaires qui, si elles sont trop nombreuses, conduisent le BASIC à donner ce message.

17     Cannot continue     (on ne peut pas continuer)

Le programme ne peut pas poursuivre son exécution avec CONT, qui sert après une commande STOP, [ESC][ESC] ou une erreur. Notez que si le programme a été modifié entre-temps. il est impossible de le relancer par cette commande.

18     Unknown user function     (fonction inconnue au bataillon)

On a oublié de définir la fonction FN avec la commande DEF FN auparavant.

19     RESUME missing    (commande RESUME absente)

On a trouvé la fin de programme alors que celui-ci procédait à un traiteront d'erreur (à la suite d'une déclaration ON ERROR GOTO).

20     Unexpected RESUME    (RESUME inattendu)

On tombe sur une commande RESUME sans être dans un sous-programme de type ON ERROR GOTO.

21     Direct command found     (commande directe tombée du ciel !)

En chargeant un programme, une ligne sans numéro s'est présentée.

22     Operand missing    (opérande absent)

Le BASIC vient de tomber sur une expression incomplète.

23     line too long     (ligne trop longue)

Le BASIC n'accepte pas les lignes de plus de 255 caractères.

24     EOF met     (rencontre d'une fin de fichier)

EOF = End Of File = fin de fichier, le programme a effectué une tentative de lecture après une fin de fichier.

25     File type error     (erreur dans le type de fichier)

Le fichier n'est pas de type requis. OPENIN peut seulement ouvrir des fichiers de texte ASCII. LOAD, RUN, etc.., ne fonctionnent qu'avec des fichiers produits par SAVE.

26     NEXT missing    (NEXT manquant)

On ne peut pas trouver le NEXT qui corresponde à une commande FOR.

27     File already open     (fichier déja ouvert)

Une commande OPENIN ou OPENOUT est exécutée avant que le fichier déjà ouvert n'ait été fermé.

28    Unknown command    (commande inconnue)

Le BASIC ne trouve pas de références à cette commande externe.

29     WEND missing    (WEND manquant)

La boucle commencée par WHILE n'est pas terminé par WEND.

30     Unexpected WEND    (WEND inattendu)

Un WEND est découvert en dehors d'une boucle WHILE ou un WEND ne correspond pas au WHILE de la boucle.

31     File not open    (fichier non ouvert)

(Voir 
«Erreurs de disquette»)

32     Broken in    (interrompu)

(Voir «Erreurs de disquette»)





La gestion des disquettes

AMSDOS est une extension du BASIC AMSTRAD, ajoutant des commandes externes supplémentaires et redéfinissant certaines instructions existantes. Les nouvelles commandes externes sont identifiées par le symbole | (barre verticale).

Noms et genres des fichiers AMSDOS
Le nom est constitué de deux parties séparées par un point, la première partie de 8 lettres maximum et la seconde, de 3. La deuxième partie représente l'indicateur de type. Les noms de fichiers et leurs indicateurs peuvent être composés d'un mélange de lettres et de nombres mais ne peuvent contenir ni espaces, ni signes de ponctuation. L'indicateur de type, simple convention indiquant le type du fichier, ne joue aucun rôle précis, le système distinguant les fichiers entre eux grâce à une entête particulière. Dans le cas ou aucune extension n'est spécifiée lors d'une sauvegarde, AMSDOS détermine quelle extension attribuer de la manière suivante:

.<espace>  Type non spécifié. Peut-être un fichier de données créé par l'instruction OPENOUT"<nomfich>" (nom de fichier) ou un programme BASIC sauvegardé en utilisant une commande AMSDOS du style SAVE"<nomfich>",A

.BAS        Programme BASIC sauvegardé à l'aide de commandes AMSDOS du style SAVE"<nomfich>" ou SAVE"<nomfich>",P

.BIN
         Programme ou zone de mémoire sauvegardée par une commande AMSDOS du style 
SAVE"<nomfich>",B (<paramètres binaires>).

.BAK
       Ancienne version d'un fichier sauvegardé lors de la configuration d'une nouvelle version par AMSDOS. L'utilisateur peut ainsi récupérer l'ancienne version s'il en à besoin.

Si les indicateurs (par défaut) ne vous satisfont pas, vous avez la possibilité d'en spécifier un à votre convenance. Lors d'une demande de chargement avec un nom de fichier dépourvu d'indicateur de type, la commande LOAD AMSDOS, indépendemment du contenu de l'en-tête, cherche d'abord ce fichier sous le type:

.<espace>

... puis, si elle ne trouve rien:

.BAS

... et enfin:

.BIN

Le catalogue disquette comptabilise par unité de 1Kilo-octet et peut contenir jusqu'à 64 noms de fichiers.


Sommaire des principales commandes externes d'AMSDOS

|A
Dirige les entrées/sorties vers l'unité A. Equivalent à |DRIVE avec A pour paramètre.

|B
Dirige les entrées/sorties vers l'unité B. Equivalent à |DRIVE avec B pour paramètre.

|CPM
Charge et initialise le système d'exploitation contenu dans la disquette système.

|DIR
[<chaîne alphanumérique>]
ex: |DIR,"*.BAS"
Affiche le catalogue de la disquette (façon C/PM) et l'espace disponible.

|DRIVE,
<chaîne alphanumérique>
ex: |DRIVE,"A"
Dirige les entrées/sorties vers une des unités.

|ERA,
<chaîne alphanumérique>
ex: |ERA,"*.BAS"
Efface tous les fichiers qui correspondent à ce nom de fichier et ne sont pas en Ecriture seulement. Les jokers sont permis.

|REN,
<chaîne alphanumérique>,<chaîne alphanumérique>
ex: |REN,"NOUVEAU.BAS","ANCIEN.BAS"
Renome un fichier. Les jokers ne sont pas autorisés.


Erreurs de disquette

Plusieurs erreurs peuvent se produire lors du traitement des opérations d'archivage. Bien que le BASIC les regroupe sous le numéro d'ERReur 32, vous pouvez obtenir de plus amples informations en appelant la fonction DERR. Voici la signification des valeurs qu'elle renvoie:



Erreur AMSDOS          

Valeur DERR      
Source de l'erreur
0 0 ou 22 Activation de [ESC]
14 142 (128+14)  Etat du canal non valable
15 143 (128+15) Fin de fichier matérielle
16 144 (128+16) Mauvaise commande, généralement nom de fichier incorrect
17 145 (128+17) Fichier déjà existant
18 146 (128+18) Fichier non existant
19 147 (128+19) Catalogue saturé
20 148 (128+20) Disquette pleine
21 149 (128+21) Changement de la disquette avec fichiers ouverts
22 150 (128+22) Fichier en lecture seulement
26 154 (128+26) Fin de fichier logicielle


Si AMSDOS a déjà rapporté une erreur, le bit 7 a pris la valeur 1, décalant celle de DERR de 128.

Les autres valeurs rapportées par DERR proviennent du contrôleur de disquette, le bit 6 étant toujours sur 1. Le bit 7 indique si AMSDOS a rapporté l'erreur ou non (voir ci-dessus). Voici la signification de chacun des bits:

Bit        Signification
0           Adresse manquante
1           Ecriture impossible. Disquette protégée.
2           Pas de donnée. Secteur introuvable.
3           Unité non prête. Pas de disquette dans l'unité.
4           Surcharge
5           Erreur de donnée. Erreur CRC (cyclic redundancy check)
6           Toujours à 1 pour indiquer une erreur venant du contrôleur de disquette.
7           Sur 1 si AMSDOS a déjà rapporté l'erreur.



Le Clavier






La palette du cpc 6128 par défaut

No
Ink   Couleur

00    Noir
01    Bleu
02    Bleu Vif
03    Rouge
04    Magenta
05    Mauve
06    Rouge Vif
07    Pourpre
08    Magenta Vif
09    Vert
10    Turquoise
11    Bleu Ciel
12    Jaune
13    Blanc
14    Bleu Pastel
15    Orange
16    Rose
17    Magenta Pastel
18    Vert Vif
19    Vert marin
20    Turquoise Vif
21    Vert citron
22    Vert pastel
23    Turquoise Pastel
24    Jaune Vif
25    Jaune pastel
26    Blanc Brillant


Les couleurs affectées aux crayons du cpc 6128 par défaut

No     No

Pen    Ink couleur
Paper   1   Bleu
0          1   Bleu
1         24  Jaune Vif
2         20  Turquoise Vif
3          6   Rouge Vif
4         26  Blanc Brillant
5          0   Noir
6          2   Bleu Vif
7          8   Magenta Vif
8         10  Turquoise
9         12  Jaune
10       14  Bleu Pastel
11       16  Rose
12       18  Vert Vif
13       22  Vert Citron
14         1  Bleu                1ere couleur
           24  Jaune Vif         2eme couleur
15       11  Bleu Ciel          1ere couleur
           16  Rose                2eme couleur