CODING ★ Au COEUR DE L'AMSTRAD CPC ★

Au Coeur de l'Amstrad CPC

Le succès d'AMSTRAD est dû à la qualité de ses produits.  Les ingénieurs de la société anglaise ont conçu une gamme d'ordinateurs puissants et bon marché.
Nous allons, ici, essayer de vous livrer les secrets que renferme votre ordinateur préféré.

» Organisation interne du système AMSTRAD
» La ROM ( mémoire morte )
» La RAM ( mémoire vive )
» Un processeur vidéo
» Registre et mémoire de palette
» Principales fontions du processeurs vidéo
» Le circuit CRTC 6845
» Le PPI
» Programmation du PPI
» Les générateur de sons
» Les  registres  du générateur de sons
» Programmation du PSG
» Le contrôleur de disque
» L'erreur en programmation
» Le « plantage »
» Erreurs de chargement cassettes
» Mémoire pleine
» La Vitesse en cassettes
» A vos « bidouilles »

Introduction

Vous savez certainement que l'Amstrad est bâtît autour d'un Z80, microprocesseur utilisé dans de nombreuses machines et qui s'est taillé une solide réputation. Ce microprocesseur est un 8 bits fabriqué par ZILOG. Il peut adresser 64 Ko de mémoire (64 Ko = 65 536 octets ; un octet est constitué de 8 bits et un bit représente la plus petite unité binaire possible qui ne peut prendre que deux états 0 ou 1). Le Z80 est le descendant du 8080, utilisé dans les IBM 8 bits. L'Amstrad CPC 464 contient 64 Ko de RAM (Random Acess Memory = mémoire vive où l'on peut lire et écrire) et 32 Ko de ROM (Read Only Memory = mémoire à lecture seule). Le 664 contient, lui, 48 Ko de ROM avec aussi 64 Ko de RAM. Le 6128, quant à lui, renferme 128 Ko de RAM et 48 Ko de ROM. La différence de quantité de ROM, entre le 464 et ses successeurs, provient essentiellement de la ROM de 16 Ko contenant le gestionnaire du lecteur de disquettes. Les concepteurs de l'Amstrad ont utilisé une astuce pour organiser la mémoire du CPC car le Z80 ne peut gérer que 64 Ko de mémoire sans système particulier. Le procédé utilisé est le bank-switching (commutation de banques) qui permet, par logiciel, de sélectionner la mémoire voulue (ROM ou RAM). Sur le 6128, le même procédé est utilisé pour adresser les 64 Ko supplémentaires de RAM. L'organisation mémoire du CPC est donc : &0000 à &FFFF : RAM lorsque qu'aucune des ROM n'est sélectionnée.

&0000 à &3FFF : ROM contenant le système d'exploitation lorsque celle-ci est sélectionnée. &C000 à &FFFF : ROM contenant l'interpréteur basic. Il est possible de connecter 252 ROM supplémentaires d'extensions, dont celle contenant le gestionnaire du lecteur de disquettes. Chaque zone ROM de l'Amstrad prend 16 Ko de mémoire, ce qui fait bien 32 Ko pour le 464 et 48 Ko pour les 664 et 6128. Si vous avez un CPC 464 auquel vous avez connecté un lecteur de disquettes, la mémoire ROM de votre CPC est portée à 48 Ko du fait du gestionnaire du lecteur.

Organisation interne du système AMSTRAD

Le CPU, la ROM et la RAM constituent le système minimum d'un ordinateur mais ce n'est pas suffisant pour un CPC. L'Amstrad est constitué de :

  • un CPU (Control Process Unit = Unité de contrôle de procédure) : le Z80.;
  • une ROM ;
  • une RAM ;
  • un video gâte array (VGA) ;
  • un contrôleur d'écran ;
  • un PPI (Parallèle Peripheral Interface = Interface de Périphériques Parallèles) ;
  • un générateur sonore.

La ROM ( mémoire morte )

Dans le CPC 464, la ROM est composée de deux parties de 16 Ko.
La première (&0000 à &3FFF) est la ROM BIOS qui contient les routines principales de gestion de l'ordinateur et les fonctions mathématiques. La seconde est la ROM BASIC qui contient les routines de gestion du basic. Le microprocesseur ne comprenant que le langage machine (ou, plus exactement, le code binaire correspondant) a besoin d'une traduction du basic. Donc, lors de l'exécution d'un programme basic, le Z80 viendra chercher dans cette ROM les routines en langage machine correspondant aux instructions basic rencontrées. Si une erreur figure dans votre programme, c'est également d'ici qu'elle sera gérée. Dans les CPC munis de lecteur de disquettes, une troisième ROM est en parallèle avec la ROM BASIC. Elle contient toutes les routines nécessaires à la gestion du lecteur, ainsi que les routines d'interfaçage avec les circuits internes du CPC. Les ROM sont indépendantes, c'est-à-dire que vous pouvez en sélectionner seulement une ou bien les deux (ROM BIOS ou ROM BASIC). Bien sûr, vous ne pouvez avoir en même temps la ROM BASIC et la ROM contenant les routines propres au lecteur de disquettes. Si une ROM n'est pas sélectionnée, vous accéderez à la RAM.

La RAM ( mémoire vive )

En ce qui concerne la RAM, elle est structurée ainsi : de &00 à &3F : on trouve ici la même chose que dans la ROM BIOS. Ceci pour permettre aux instructions RST (restart) du Z80 d'être exécutables quel que soit le type de mémoire sélectionnée (ROM ou RAM).
A partir de l'adresse &40, la RAM contient des espaces de travail propres au BASIC. Les programmes Basic étant implantés à partir de &170.
La partie médiane de la RAM constitue l'espace principal de travail, lequel est toujours accessible directement. C'est ici que vous pouvez implanter vos routines en langage machine. La partie supérieure de la RAM contient les variables, puis les blocs de sauts fournissant les points d'entrées pour la plupart des routines importantes. Si vous élaborez un programme en langage machine qui doit être compatible avec les trois CPC, utilisez cette table, elle vous permettra de vous affranchir de certaines différences d'adresses d'accès aux routines principales dans les ROM des CPC. De &C000 à &FFFF : c'est ici qu'est situé l'écran (voir la partie concernant le contrôleur d'écran et le vidéo gâte array).

Un processeur vidéo

Nous allons maintenant aborder la fonction des autres principaux circuits constituant un Amstrad CPC.
Le Video Gâte Array : ce circuit est fabriqué pour AMSTRAD et n'est pas commercialisé. Ceux qui désirent faire des modifications dans leur CPC doivent donc prendre garde à ne pas endommager ce circuit car ils n'en trouveront que chez AMSTRAD et la garantie ne jouera plus puisque l'ordinateur aura été ouvert. Le VGA, comme son nom l'indique, gère l'écran en étant assisté par le CRTC 6845 de Motorola. Mais ce n'est pas sa seule tâche ; il est aussi chargé de réaliser la commutation des ROM, ainsi que la gestion des 128 Ko du CPC 6128. Ce circuit est accessible à partir d'un programme, par la commande OUT sur le port &7FXX (XX signifiant n'importe quelle valeur Héxa). Il peut être utile, lorsque l'on programme en langage machine, de pouvoir accéder directement à ce circuit, sans avoir à passer par les routines en ROM. Voici donc les paramètres nécessaires à une bonne utilisation de ce circuit : B7 à BO font référence aux bits constituant l'octet correspondant à la valeur binaire du nombre que vous allez envoyer sur le port &7FXX. B7 est le MSB (Most Significant Bit = bit le plus significatif). Pour ceux qui ne connaissent pas la structure d'un octet, vous pouvez utilement vous reporter au manuel de votre CPC.

B7  B6
0    0     Chargement   registre de palette.
0    1      Chargement mémoire de palette.
1    0     Commutation ROM et contrôle vidéo.
1    1      Utilisé sur le CPC 6128 pour  la  commutation des mémoires.

Commutation ROM et contrôle vidéo :

B7 = 1, B6 = 0, B5 = 0
B4 = 1 : remise à zéro du diviseur générant les interruptions.
B3 = 0:  ROM supérieure connectée.
B3 = 1 : ROM supérieure déconnectée.
B2 = 0 : ROM inférieure connectée.
B2 = 1 : ROM inférieure déconnectée.
B1 : contrôle vidéo MC1.
B0 : contrôle vidéo MC0.

MC1   MC0
0       0       Mode 0 (20 X 24).
0       1       Mode 1 (40x24).
1       0       Mode 2 (80 X 24).
1       1       Inutilisable.

Sur le CPC 6128, avec les valeurs suivantes, il est possible d'échanger la zone mémoire d'adresses &4000 à &7FFF de la banque 0 (banque d'origine) contre un bloc de 16 Ko de la banque 1 : &C0 : banque 0, bloc 1 (situation normale). &C4 à &C7 : banque 1, blocs 0 à 3.
Chaque banque a une capacité de 64 Ko et est divisée en quatre blocs de 16 Ko. Les valeurs &C1 à &C3 jouent un rôle en CP/M 3.0.

Registre et mémoire de palette

Registre de palette (un registre est une mémoire de lecture/écriture) :

B7 = 0, B6 = 0, B5 = 0.
B4 = 0 : chargement du numéro de couleur d'encre, codé par B3 à B0.
B4 = 1 : chargement de numéro de couleur de bord d'écran (B3 à B0 ne sont pas pris en compte). B3 à B0 : donnent le numéro d'encre (15 combinaisons possibles).
Mémoire de palette : B7 = 0, B6 = 1, B5 = 0. B4 à B0 : 31 valeurs possibles pour le décodage de la couleur du registre de palette. Le nombre de couleurs possibles est fonction du mode choisi.

Principales fontions du processeurs vidéo

Les fonctions principales du VGA sont les suivantes :

  • commande des accès à la RAM ;
  • commutation de la ROM en zones de mémoire ;
  • production des signaux vidéo et des informations RVB (Rouge Vert Bleu) pour le moniteur couleur ;
  • commande du mode d'écran ;
  • mémorisation des couleurs d'encres ;

Pour les électroniciens, sachez que ce circuit fournit aussi toutes les fréquences d'horloge nécessaires, ainsi que les signaux d'exploitation des RAM dynamiques et production de l'impulsion d'interruption.

Le circuit CRTC 6845

Le CRTC 6845 est un circuit intégré LSI (Large Scale Intégration = grand taux d'intégration) générant les signaux nécessaires à la production d'une image vdéo.
A partir d'un signal d'horloge unique, il produit tous les signaux nécessaires, pour le moniteur, fous ces paramètres nécessaires sont programmables. Voici les principales possibilités de ce circuit :

  • curseur .programmable (hauteur et clignotement) ;
  • fonctions du contrôle du curseur ;
  • matrice de points des caractères programmable ;
  • nombre de caractères par ligne programmable ;
  • nombre de lignes par écran programmable ;
  • accès à une zone de 16 ko ;
  • entrée stylo-optique.

Ce circuit comporte dix-neuf registres internes dont un, le registre adresse, est utilisé pour sélectionner celui sur lequel on désire travailler. Les dix-huit autres registres sont appelés registres de paramètres. L'accès à un registre se fait en deux temps :

-  Il faut d'abord fournir, au registre adresse, le numéro du registre auquel on veut accéder. Il y a dix-huit registres paramètres, donc cinq bits sont nécessaires pour les adresser. Le registre adresse est donc un registre cinq bits.
-  Écrire ou lire dans le registre sélectionné.

Les registres paramètres sont numérotés de R0 à R17 et peuvent être subdivisés en trois groupes principaux :

1 – R0 à R3 : Programmation du format horizontal.
2 – R4 à R9 : Programmation du format vertical.
3 – R10 à R17 : Contrôle du curseur, de la RAM et du stylo-optique.

Ces registres sont en général à écriture seule, à l'exception des deux registres de contrôle de la
position du stylo-optique qui sont, bien sûr à lecture seule, et des deux registres du contrôle de la position du curseur qui peuvent être utilisés en lecture ou en écriture.
La table suivante décrit la fonction des dix-huit registres paramètres :


0     Nb de caractères total en horizontal 0-255.
1     Nb de caractères affichés en horizontal 0-255.
2     Position de la synchronisation horizontale 0-255.
3     Longueur de la synchronisation 0-15.
4     Nb total de lignes en vertical 0-127.
5     Synchronisation  verticale 0-127.
6     Nb de lignes réelles affichées 0-127.
7     Position de la synchronisation verticale 0-127.
8     Mode entrelacé 0-3.
9     Nb de  lignes  par écran 0-31.
10   Position et forme du curseur 0-31.
11   Ligne de fin de curseur 0-31.
12   Adresse haute début RAM écran 0-63.
13   Adresse basse début RAM écran 0-255.
14   Adresse haute de la position du curseur 0-63.
15   Adresse basse de la position du curseur 0-255.
16   Adresse haute de la position du stylo-optique 0-63.
17   Adresse basse de la position du stylo-optique 0-255

Un exemple d'utilisation

Voici plus en détail l'utilisation du registre R10 :
Les bits 0 à 4 déterminent sur quelle ligne de la grille doit commencer le curseur. Les bits 5 et 6 fixent le curseur de la manière suivante :

Bits 6    5
0   0   Curseur non clignotant.
0   1   Curseur non représenté.
1   0   Curseur clignotant (env. 3 fois par sec).
1   1   Curseur clignotant (env. 1,5 fois par sec).

Quatre adresses de port sont nécessaires pour programmer le CRTC:

-  Le port &BCXX sert à écrire dans le registre adresse, donc à sélectionner le registre auquel on désire accéder.
-  Le port &BDXX qui sert à écrire dans le registre sélectionné.
-  Le port &BEXX, utilisé en lecture uniquement, sert à lire le registre d'état (registre status) du CRTC.
-  Le port &BFXX sert à lire le contenu du registre sélectionné auparavant par le port &BCXX. Seuls les registres 14, 15, 16 et 17 peuvent être lus.

Pour écrire 39 dans le registre 1 en Basic, il suffit de faire : OUT &BC00.1 :OUT &BD00.39 (si vous essayez ces valeurs, vous obtiendrez un écran en diagonale).

Attention, certaines valeurs peuvent « planter » l'ordinateur !

Le PPI

Abordons un circuit très intéressant, l'interface parallèle 8255 (PPI). Ce circuit a été développé à l'origine par INTEL pour le 8080. Il dispose de vingt-quatre canaux pouvant être utilisés comme entrées ou comme sorties. Chaque-groupe de huit bits constitue un port de huit bits. Le troisième port peut être divisé en deux moitié programmables. Voici les principales caractéristiques de ce circuit :

- trois ports programmables (A, B et C) ;
- trois modes de travail programmables ;
- chaque port programmable séparément.

Voyons maintenant son utilisation sur l'Amstrad :

Le port A :
Il permet la lecture du clavier et des manettes de jeux à travers le registre R14 du PSG (circuit générateur de sons).

Le port B :
Il est utilisé pour lire les données en provenance du lecteur de cassettes. Il teste également si l'imprimante connectée est en fonctionnement, grâce au signal BUSY. Il reçoit le signal VSYNC (interruption provenant du CRTC). Le bit B4 sert à la sélection du réseau 50/60 Hz (50 Hz en France donc B4 est à 0). Le bit B5 indique si une extension est connectée au CPC (B5 est relié à EXP du bus d'extensions). Les bits B3 à B1 sélectionnent le nom de l'ordinateur et sont programmés internement par des connexions sur la carte supportant les circuits électroniques.

Le port C :
Il a cinq fonctions :

- gestion du mode de fonctionnement du PSG ;
- sélection du PSG ;
- sélection des lignes de la matrice du clavier ;
- écriture des données sur cassettes ;
- contrôle du moteur du lecteur de cassettes (marche/arrêt).

Programmation du PPI

Pour programmer ce circuit, il faut ici encore utiliser les fonctions OUT et INP du Basic, ou leur équivalent en langage machine. Voici les adresses à utiliser, ainsi que leur fonction : &F4XX : lecture et écriture du port A.
&F5XX : lecture du port B. &F6XX : écriture dans le port C. &F7XX : écriture dans le registre de contrôle (8 bits). Voici la signification des huit bits du registre de contrôle :

Bit 7 : toujours 1 si c'est un mot de contrôle.
Bits 6 et 5 : sélectionnent le mode de fonctionnement du groupe A ; pour sélectionner le mode 0, les bits doivent se trouver à l'état logique 0.
Bit 4 : détermine le sens de fonctionnement du port A : 0 = sortie, 1 = entrée.
Bit 3 : détermine le sens de fonctionnement des bits B7 à B4 du port C.
Bit 2 : détermine le mode de fonctionnement   du   port   B :
0 = mode 0, 1 = mode 1. Il sera toujours à 0.
Bit 1 : détermine le sens de fonctionnement du port B : 0 = sortie, 1  = entrée. Il sera toujours à 1.
Bit 0 : détermine le sens de fonctionnement de la partie basse du port C (B3 à B0) : 0 = sortie, 1 = entrée. Si le bit 1 du registre de contrôle est à 0, le registre permet de positionner un par un les bits du port C. Alors, les bits 6,5 et 4 ne sont pas utilisés, les bits 3,2 et 1 donnent le numéro du bit à programmer et le bit 0 donne la valeur du bit positionner.

Exemple : pour mettre le moteur du lecteur de cassette en marche par l'intermédiaire du registre de contrôle, il faut positionner le bit 4 du port C à 1 : OUT &F700, &X00001001 Une autre solution est d'utiliser directement le port C donc d'utiliser l'adresse de port &F6XX : OUT &F600.&X00010000 De même, OUT &F600.0 arrête le moteur.

Les générateur de sons

Etudions maintenant le générateur de sons programmable AY-3-8912.
Ce circuit est originaire de chez General Instruments. Il a été développé pour les jeux électroniques afin de les doter d'un son plus réaliste. Pour pouvoir être employé le plus universellement possible, le PSG (Programmable Sound Generator) a été doté d'un grand nombre de possibilités pour influer sur le son. Les concepteurs de ce circuit ont pensé qu'il serait également souhaitable de pouvoir l'utiliser avec le clavier ou un joyskick, c'est pourquoi le PSG possède un port parallèle huit bits.

Ce PSG est composé des éléments suivants :

- générateurs sonores : il y en a trois qui produisent un signal rectangulaire dont la fréquence est programmable. Ce sont les canaux A,B et C, lequels sont indépendants entre eux ;
- générateur de bruit blanc : produit un son constitué par de nombreux signaux ;
-  mélangeur : il permet de mélanger les sorties des trois générateurs sonores et du générateur de bruit ;
- contrôleur d'amplitude : il sélectionne l'amplitude de sortie du signal, ce qui a pour effet de fixer le volume du son ;
- générateur d'enveloppe : il possède huit formes d'enveloppes et produit une enveloppe de modulation d'amplitude ;
- convertisseurs digitaux-analogiques : au nombre de trois, ils produisent des signaux pouvant prendre seize valeurs, déterminées par le contrôleur d'amplitude ;
- port d'entrée/sortie : il n'est pas utilisé pour la production de sons mais il s'occupe de la lecture du clavier et de la manette de jeux.

Les  registres  du générateur de sons

L'AY-3-8912 dispose de seize registres dont quinze peuvent être utilisés. Ils permettent de programmer toutes les possibilités sonores du circuit. Voici maintenant la fonction des différents registres du PSG :

Reg. 0,1 : ils déterminent la période (tonalité du son) sur le canal A. Les huit bits du registre 0 et les quatre bits inférieurs du registre 1 sont utilisés. Plus la valeur 12 bits de ces registres est petite, plus le son sera aigu. Reg. 2,3 : comme reg. 0,1 pour le canal B.

Reg. 4,5 : comme reg. 0,1 pour le canal C.
Reg. 6 : influence le générateur de bruit avec ses cinq bits inférieurs (32 combinaisons possibles).
Reg. 7 : registre multi-fonctions.
Reg. 8 : les quatre bits inférieurs fixent le volume sur le canal A. Si le bit 4 est mis, le contenu des bits 0 à 3 est ignoré et le volume est déterminé par le registre de courbe d'enveloppe. Reg. 9 : comme reg. 8 pour le canal B.
Reg. 10 : comme reg. 9 pour le canal C.
Reg. 11,12 : les seize bits de ces deux registres influencent la période de la courbe d'enveloppe.
Reg. 13 : les bits 0 à 3 de ce registre déterminent la forme de la courbe d'enveloppe.
Reg. 14 : il gère le port d'entrées/sorties qui s'occupe de la lecture du clavier et de la manette de jeux. Le bit 6 du registre R7 règle le sens de la transmission,  mais comme le port est utilisé en entrée, il suffit de mettre ce bit à 0.

Le registre 7 étant très important, voyons la fonction de chacun de ses bits;

Bit 0 : mettre/couper le son du canal A. (0 = mis/1 =non).
Bit 1 : même chose pour le canal B.
Bit 2 : même chose pour le canal C.
Bit 3 : mettre/couper le bruit du canal A. (0 = mis/1 =non).
Bit 4 : même chose pour le canal B.
Bit 5 : même chose pour le canal C.
Bit 6 : Port A comme entrée/sortie. (0 = entrée/1 = sortie).
Bit 7 : même chose que bit 6.

Programmation du PSG

Nous avons vu précédemment que le PSG n'est pas directement en contact avec le bus du Z80.
Sa programmation se déroule en quatre étapes :

1) Introduction sur le port A du PPI de l'adresse du numéro de registre du PSG à programmer.
2) Introduire, sur les deux bits de poids fort du port C (B6 et B7), la valeur 11 nécessaire pour adresser le PSG. L'adresse du registre du PSG est alors chargée.
3) Introduire, sur le port A du PPI, la valeur à charger dans le registre sélectionné.
4)  Positionner le PSG en mode écriture en introduisant la valeur
10 sur les bits 6 et 7 du port C.

Le contrôleur de disque

Vous connaissez maintenant le fonctionnement des principaux circuits d'un Amstrad CPC 464.
Il  reste encore un circuit très important, qui se trouve d'origine dans les CPC 664 et 6128 ainsi que dans le boîtier d'extension du lecteur de disquette du CPC 464. Ce circuit est le FDC 765 (FDC pour Floppy Disk Control-ler = contrôleur de disque souple, qui en fait contrôle les circuits annexes du lecteur).
Il constitue l'interface entre le Z80 et les lecteurs de disquettes. La puissance de ce circuit simplifie énormément la construction d'un lecteur. Il permet la réduction de l'électronique nécessaire ainsi que la taille (en Ko) du logiciel d'exploitation.

Ce logiciel se trouve dans l'une des ROM supérieures dont nous avons déjà parlé (ROM n° 7 pour les programmeurs en langage machine). Cette ROM est la ROM AMSDOS, d'une taille de 16 Ko, qui contient (dans environ 8 Ko) toutes les routines nécessaires à la gestion du lecteur de disquettes. C'est ici que se trouvent les routines Basic le concernant uniquement, ainsi que certaines routines concernant le lecteur de cassettes. Dans les 8 Ko restants, cette ROM renferme une partie de l'interpréteur LOGO, fourni sur la disquette CP/M 2.2.
Un interpréteur est un logiciel en langage machine qui traduit les ordres d'un langage évolué, tel le BASIC ou le LOGO ou encore le PASCAL, langage machine qui est, rappelons-le, l'unique langage compris par un microprocesseur, ici le Z80). Le FDC 765 exploité par NEC peut être considéré comme un microprocesseur très spécialisé. Il traite tous les signaux nécessaires pour exploiter les lecteurs du marché qui vont du lecteur 3" (se lit 3 pouces, ce qui correspond à la taille des disquettes utilisées) au lecteur 8" utilisé surtout dans les ordinateurs professionnels. Les signaux disponibles permettent aux développeurs de connecter le FDC à presque n'importe quel microprocesseur. Les concepteurs du CPC sont loin d'avoir utilisé toutes les possibilités de ce circuit tellement elles sont nombreuses. C'est pourquoi seulement deux lecteurs peuvent être connectés au lieu de quatre, ce qui était possible avec le FDC. Mais rassurez-vous, tout ce qui est utile au bon fonctionnement de votre lecteur de disquettes aété utilisé avec un minimum d'électronique ce qui augmente la fiabilité du matériel utilisé. Le FDC est situé sur les adresses de port &FB7E et &FB7F. A la première adresse se trouve le registre d'état principal, la deuxième appartient au registre de données. Une troisième adresse est occupée par la carte contrôleur. Cette adresse est &FA7E, où se trouve un circuit bascule qui commande les moteurs des lecteurs de disquettes connectés au CPC. Si on écrit 1 sur ce port par la commande Basic OUT &FA7E,1, les moteurs de tous les lecteurs connectés sont mis en marche. Si par contre, on écrit 0, tous ces
moteurs sont arrêtés.

L'erreur en programmation

Maintenant que vous connaissez mieux la structure de votre CPC, nous allons étudier certaines caractéristiques du BASIC de l'Amstrad et surtout les erreurs qui peuvent intervenir lors de l'écriture d'un programme. Tout d'abord, on peut regrouper toutes les erreurs possibles en deux groupes. Il y a des erreurs qui seront décelées par le BASIC et d'autres qui ne le seront pas. Le premier cas est celui où la correction est la plus simple car on connaît le type de l'erreur et l'endroit où elle se trouve. Il ne reste donc plus qu'à la corriger. Il faut savoir que l'interpréteur Basic donnera un message d'erreur, dès qu'il trouvera un mot inconnu, un ordre incomplet ou non-exécutable. Si, par exemple, vous tapez PRNT au lieu de PRINT, le BASIC vous donnera le message SYNTAX ERROR, ce qui signifie erreur de syntaxe. Si c'est dans un programme, il vous donnera aussi le numéro de la ligne dans laquelle une erreur est détectée. Cette partie du BASIC, qui affiche des messages d'erreur, est une très grande aide à la programmation. Utilisez-la au mieux et ne négligez jamais une erreur, même si elle vous paraît sans importance. Attention, ce n'est que lorsqu'un programme fonctionne correctement qu'il faut insérer la fonction ON ERROR GOTO, ensuite faites votre dernière sauvegarde du programme. Annulez cette fonction lorsque vous faites une modification dans le programme. Ceci a pour effet de ne pas masquer un éventuel message d'erreur qui vous signalerait un défaut dans le programme. Le deuxième type d'erreur est sans doute le plus sournois, aucun message d'erreur n'étant alors affiché. C'est la bête noire des programmeurs. Un simple "1" confondu avec un "I" empêchera le programme de fonctionner comme prévu. Alors, si votre programme ne fonctionne pas normalement et si aucun message d'erreur n'apparaît, vérifiez chaque instruction, chaque variable, car une erreur s'y est peut-être glissée. Sinon, c'est votre raisonnement qui est faux, l'erreur est humaine...

Le « plantage »

Nous avons parlé de programmes qui "plantent". Le terme planter signifie, dans le jargon informatique, qu'à la suite d'une erreur (appelée aussi un bug), le système est bloqué et qu'il n'est pas possible pour l'utilisateur de reprendre "la main", et de pouvoir revenir dans le programme. La seule solution dans ce cas est d'éteindre l'ordinateur puis de le rallumer et de recommencer. Cela arrive généralement lorsqu'on travaille en langage machine ou lorsque l'on accède à certains endroits de la mémoire vive (RAM), ce qui peut perturber le fonctionnement de l'ordinateur sans pour autant détériorer le matériel. C'est pourquoi, il faut TOUJOURS sauvegarder un programme qui contient des codes machine AVANT de le lancer.
Les endroits auxquels il vaut mieux éviter d'accéder sont, en général, les endroits réservés aux systèmes d'exploitation. Par exemple, il ne faut pas sans précaution faire de POKE dans la zone mémoire &0000 à &016F car, si une partie de la ROM a été recopiée ici, ce n'est pas pour rien.
Le système d'exploitation a besoin d'y accéder très régulièrement quelle que soit la mémoire sélectionnée, ROM ou RAM.

Erreurs de chargement cassettes

Certaints messages d'erreurs peuvent apparaître lors du chargement d'un programme sur cassette. Certaines sont déconcertantes, c'est le cas des READ ERROR provenant généralement, d'un défaut de la cassette ou du magnétophone. Sachez tout d'abord que les programmes sont sauvegardés bit par bit donc 0 ou 1. Le principe est simple, on fait correspondre une fréquence à la valeur du bit à sauvegarder. Celle d'un 0 est double de celle d'un 1. Vous avez certainement déjà écouté une bande contenant un programme pour votre CPC et vous avez entendu un son pas très mélodieux ; il est produit par ces fréquences qui ne peuvent être décodées que par votre Amstrad. Le READ ERROR A indique que la durée d'un bit lu a été trop longue par rapport à la valeur programmée en mémoire sur laquelle nous reviendrons plus tard. Cette erreur peut avoir pour cause la vitesse de rotation irrégulière de votre magnétophone ou encore une cassette en mauvais état qui coince lors de la sauvegarde et qui est fluide lors du chargement. Employez donc de bonnes cassettes. Le READ ERRROR B indique qu'une erreur a été décelée lors du chargement. Lorsque vous sauvegardez un programme, celui-ci est mis sous forme de blocs, chaque octet constituant un bloc est additionné aux autres et, à la fin, le total est sauvegardé. Lorsque, durant le chargement, le total ne correspond pas, le message READ ERROR B est affiché. Quelquefois, il suffit simplement de recommencer l'opération de chargement pour obtenir le programme, sans ce message d'erreur. Toutefois, il se peut que cela provienne d'un défaut de la cassette qui n'a pas correctement enregistré le signal, lors de la sauvegarde, ou lors de la lecture. Il se peut aussi que votre réglage de volume ne soit pas correct, auquel cas, le 8255 responsable de la lecture des données ne reconnaît pas le signal, son amplitude n'étant pas suffisante.

Mémoire pleine

Un autre message d'erreur apparaît assez souvent : le MEMORY FULL II indique qu'il n'y a pas suffisamment d'espace mémoire libre (mémoire pleine). Il se peut donc que le programme à charger soit trop grand pour la mémoire disponible ou encore qu'il s'implante à un endroit réservé, ce qui pourrait aussi saturer la mémoire.

La Vitesse en cassettes

Vous connaissez l'instruction basic SPEED WRITE qui fixe la vitesse d'écriture des données sur la cassette à 1 000 ou 2 000 bauds (1 baud = 1bit par seconde). Ces vitesses ne sont pas les seules possibles, vous pouvez en effet programmer une vitesse d'écriture variant entre 700 et 3 600 bauds grâce à une routine du système d'exploitation située à l'adresse &BC68. Elle fixe la vitesse en fonction de deux paramètres.
Le premier fixe la vitesse et est déterminé par la formule : vitesse = 666666/longueur d'un bit nul. La valeur ainsi trouvée doit être transmise à la paire de registre HL du Z80 (l'utilisation de cette routine demande une connaissance du langage machine).

Cela donne, pour 1 000 bauds, une vitesse de 666 s pour un bit nul et exactement le double pour un bit 1.
L'électronique utilisée dans le lecteur de cassette possède une particularité : si des bits 0 et des bits 1 sont lus tour à tour, elle essaye de combler les différences de durée, les bits 1 devenant plus courts et les bits O plus longs. Il est donc nécessaire qu'une compensation anticipée soit exécutée. Les durées nécessaires pour cette compensation sont transmises à la routine dans l'accumulateur.
Pour fixer la vitesse la plus rapide, qui est aussi la moins fiable, il faut mettre, dans l'accumulateur, la valeur 10 ainsi que la valeur 93 dans les registres HL. Ce qui nous donne :

LD HL, 93
LD A, 10
CALL &BC68
RET

Vous pouvez faire varier les valeurs dans HL et dans l'accumulateur pour déterminer les différentes vitesses possibles. Si les valeurs sont trop petites, le CPC ne peut tenir les durées voulues et il affichera le message d'erreur WRITE ERROR A. Nous vous rappelons que plus la vitesse d'écriture est grande, moins la fiabilité est bonne. Il vaut donc mieux attendre un peu plus longtemps, mais obtenir un chargement sans erreur due à une vitesse excessive.

A vos « bidouilles »

Nous avons découvert ensemble les différents circuits et les possibilités des Amstrad CPC. Cette base pourra nous servir à aborder des sujets plus complexes, à poursuivre la découverte de votre machine ou à programmer en assembleur. N'ayez pas peur d'essayer des routines, des programmes aux résultats farfelus, d'expérimenter. Elles ne souffriront pas de vos maladresses. Elles sont faites pour ça, profitez en !

Les Cahiers de l'AMSTRAD MAGAZINE n°5, septembre/1986

★ ANNÉE: ???
★ AUTEUR: Eric Mistellet

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 244 millisecondes et consultée 2946 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.