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

4/2.12 MAXAM, assembleur/désassembleur RAM, ROM et Basic (29e Complément)Coding Classeurs Weka
4/2 - Assembleur Z80 : Définitions et rappels de base

4/2.12 MAXAM, assembleur/désassembleur RAM, ROM et Basic

Nous avons décidé de vous présenter, dans ce chapitre, l'assembleur qui, à nos yeux, semble être actuellement le plus intéressant actuellement sur CPC.

Ce logiciel est disponible, pour les trois versions de CPC (464, 664 et 6128) sous forme de disquette (MAXAM DISC) ou d'EPROM (MAXAM ROM).

Nous vous conseillons, vous ne le regretterez pas si vous avez décidé de faire du langage machine Z80 votre langage de prédilection, mais aussi pour vous initier, de disposer de celui-ci sous la présentation EPROM (abusivement appelée version ROM), car étant beaucoup plus souple d'emploi.

MAXAM est un logiciel édité par ARNOR Ltd, et distribué en France par Jessico - BP 693 - 06012 Nice Cedex - Tél. : 93 51 61 30.

Installer MAXAM

MAXAM DISC

MAXAM DISC s'installe comme un logiciel classique par l'instruction RUN "MAXAM", qui vous propose trois choix :

  • charger le programme complet ;
  • charger l'éditeur seulement ;
  • charger tout sauf l'éditeur.
Les options 2 et 3 permettent de gagner de la place mémoire, car le programme est relativement conséquent.

Les possibilités offertes par MAXAM

Pas question ici de faire double usage avec le mode d'emploi, fourni traduit et accompagné du mode d'emploi original (en anglais). Notre but est de vous faire découvrir les possibilités de ce logiciel, avec parfois quelques compléments d'informations n'apparaissant pas dans la documentation, et de vous permettre de retirer les pages correspondantes pour servir d'aide mémoire.

Les commandes EPROM

Ce paragraphe s'adresse uniquement aux possesseurs de MAXAM en version EPROM, car il résume les instructions RSX disponibles uniquement sur cette version.

|HELPPermet de donner les numéros, noms et versions de toutes les ROM connectées au CPC.
|MHELPFonctionne comme I MHELP, mais permet d'être spécifique à MAXAM, au cas où l'instruction |HELP existerait dans d'autres ROM.
|HELP, numéroPermet de lister toutes les commandes RSX disponibles dans une ROM déterminée par « numéro ». Ainsi, si MAXAM est installé en tant que ROM numéro 2, HELP, 2 vous listera toutes les commandes RSX de MAXAM. De même HELP, 7 liste toutes les commandes CP/M de la ROM AMSDOS.

Il est conseillé de réaliser le chargement de MAXAM après réinitialisation complète de votre CPC.

MAXAM ROM

MAXAM ROM est certainement la plus intéressante des deux versions car elle n'utilise que 260 octets de mémoire et est toujours disponible.

Pour installer l'EPROM contenant MAXAM, il est nécessaire que vous disposiez d'un support ROM, tel que la ROM-BOARD (voir Partie 8 chapitre 6.4).

Vous pouvez aussi installer l'EPROM sur tout autre interface possédant un support EPROM 16 kilo-octets telle l'interface série Amstrad, moyennant la perte du logiciel de celle-ci.

Nous vous déconseillons par contre de l'échanger contre l'EPROM de l'interface disquette VORTEX, celle-ci étant codée et en empêchant le fonctionnement.

|MHELP, numéroComme |HELP, numéro, mais spécifique à MAXAM.
|MAXOFFPermet de déconnecter la ROM MAXAM. Ceci permet de récupérer les 260 octets utilisés par le logiciel. Attention, le contenu de la mémoire est entièrement libéré, aussi, pensez à sauvegarder un éventuel programme en mémoire.
|MSLPlace la gestion et l'affichage de l'écran dans la partie de la mémoire située entre &4000 et &7FFF. Pour utiliser cette fonction, vous devez absolument avoir modifié le pointeur HIMEM par MEMORY &3FFF ou inférieur, sous peine d'obtenir le message d'erreur "HIMEM above &3FFF" (HIMEM au-dessus de &3FFF). Signalons que lors de son exécution, l'écran est entièrement effacé, ce qui est dommage.
|MSHRestitue la gestion et l'affichage de l'écran à son adresse d'origine, c'est-à-dire &C000 à &FFFF. Ici aussi, l'écran est effacé.
|ROMOFFDésactive toutes les ROM connectées au CPC.
|ROMOFF, numéro1, numéro2,...Désactive les ROM dont les numéros sont spécifiés.
Les commandes non spécifiques

Ce paragraphe décrit sommairement toutes les commandes disponibles sur les deux versions de MAXAM.

|ASSEMBLEInstruction à intégrer dans un programme Basic, qui provoque l'assemblage des codes opératoires du Z80, placés sous forme de commentaires, et affichant la génération des codes machines.
|ASSEMD'un fonctionnement identique à |ASSEMBLE, sauf que l'affichage à l'écran n'est pas effectué.
|CATAffiche le répertoire de la disquette placée dans le lecteur. Le fonctionnement de cette commande étant le même que l'instruction Basic "CAT", son intérêt réside dans la possibilité d'être utilisée sous l'interpréteur de commande externes.
|CLEAREfface de la mémoire le fichier source écrit avec l'éditeur.
|MCLEARComme |CLEAR, mais spécifique à MAXAM.
|FINDPermet de rechercher une chaîne de caractères dans un fichier source écrit dans des lignes de commentaire du Basic. Cette commande, particulièrement intéressante pour rechercher les étiquettes du programme assembleur, vous interroge sur la chaîne de caractère à rechercher, et vous affiche, si elle existe, les lignes dans laquelle elle se trouve.
|MFINDComme |FIND, mais spécifique à MAXAM.
|MAXAMCette commande vous propose le menu principal de MAXAM, dans le mode écran en cours.
|MAXAM,1 ou |MAXAM, 2Vous permet d'accéder au menu de MAXAM dans le mode écran spécifié (1 ou 2). Signalons que seul le bit de poids faible du mode écran demandé est testé, ce qui implique que I MAXAM, nombreimpaire et I MAXAM, nombrepaire donnent respectivement le même résultat que |MAXAM, 1 ou |MAXAM, 2.
|M, |M, 1 ou |M, 2Comme |MAXAM, |MAXAM, 1 ou |MAXAM, 2.
|MODE, 1 ou |MODE, 2Permet de changer le mode d'affichage de l'écran, comme l'instruction Basic "MODE". L'utilité de cette commande réside dans son utilisation sous l'interpréteurtJe commande. Tout comme MAXAM, la parité ou l'imparité du mode-écran provoque les mêmes réactions.
MAXAM sous Basic

La force certaine de MAXAM réside dans ses possibilités d'utilisation de l'assembleur directement sous Basic grâce aux commandes |ASSEMBLE et |ASSEM.

Le déboggage est assuré par la possibilité de recherche de chaînes de caractères (pouvant être des mnémoniques du Z80), mais aussi par la possible introduction de points d'arrêts, avec affichage automatique des registres.

Prenons plutôt un programme exemple :

10 MEMORY &7FFF : REM réservation mémoire pour le code machine
20 DEBUT = HIMEM + 1 : REM adresse de lancement
30 GOSUB 70 : REM assembler
40 CALL DEBUT : REM lancer le programme
50 END : REM fin
60 REM
70 -ASSEMBLE
80 'ORG &8000 ; origine d'assemblage
90 'LD B, 04 ; compteur pour boucle
100 '.BOUCLE ; début de boucle
110 'LD HL, MESSAG ; pointer message
120 '.AFFICH ; boucle d'affichage
130 'LD A, (HL) ; prendre caractère
140 'CP &FF ; fin message ?
150 'JR Z, SUITE ; alors voir la suite
160 'CALL &BB5A ; afficher caractère
170 'JR AFFICH ; au suivant
180 '.SUITE
190 'BRK ; stopper et afficher les registres
200 'DJNZ BOUCLE ; encore un affichage ?
210 'RET ; fin
220 '.MESSAG ; zone message
230 'DEFB "WEKA"
240 'DEFB &0A, &0D ; CR LF
250 'DEFB &FF ; fin message
260 'END 270 RETURN

En ligne 10, le programme déplace le pointeur HIMEM pour réserver la place au code machine.
La ligne 20 mémorise l'adresse de lancement du programme, située juste au-dessus de HIMEM.
La ligne 30 permet l'exécution de l'assemblage.
La ligne 40 exécute le programme en langage machine.
La ligne 70 contient la commande assurant l'assemblage, avec visualisation.
La ligne 80 contient la directive de début d'assemblage : ici l'origine est située en &8000. On remarquera sur cette ligne, comme pour toutes les suivantes jusqu'au END final que les termes de l'assembleur sont précédés de l'apostrophe ' pour signaler du texte à assembler.

On remarquera aussi qu'il est possible d'insérer du commentaire après chaque instruction Z80, en le faisant précéder du point-virgule Si ce texte contient un point. Il sera nécessaire de mettre deux points virgules

La ligne 90 contient une opération Z80, avec commentaire.
La ligne 100 contient ce qu'on appelle un label, ou encore dénommé étiquette. Celui-ci sera toujours précédé d'un point..
Ligne 110 : encore une instruction.
Ligne 120 : encore une étiquette.
Lignes 130 à 210 : suite du programme. On remarquera en ligne 190 la directive de point d'arrêt BRK, qui arrêtera l'exécution du programme lors de son lancement, en affichant le contenu de tous les registres et l'instruction suivante. Un appui sur une touche autre que < ESC > permettra de continuer.
Lignes 220 à 250 : constitue la zone message.
La fin d'assemblage est signalée en ligne 260 par END.
La ligne 270 renvoie au programme principal.

Une fois le programme au point, on supprimera la ligne 190 (BRK), qui provoque l'arrêt après chacunes des autres affiches, et on remplacera la commande |ASSEMBLE de la ligne 70 par |ASSEM qui inhibe l'affichage lors de l'assemblage.

Bien qu'il soit possible d'intégrer l'assemblage dans n'importe quelle partie du programme principal, on préférera travailler en plusieurs modules, organisés en sous-programmes.

Pour passer brièvement en revue les possibilités de cet assembleur, signalons qu'il possède toutes les directives classiques d'un assembleur traditionnel, ainsi que les possibilités d'assemblage conditionnel (IF... ELSE... ENDIF), ainsi que la possibilité d'interrompre en plusieurs endroits l'assemblage, d'afficher la table des symboles, ou encore de formatter les affichages lors de l'assemblage.

Il est aussi possible d'intégrer dans le code source l'insertion de codes sources déjà sur disquette, ce qui permettra de se créer une bibliothèque de routines, ainsi que la sauvegarde automatique du code binaire, utilisable sous Basic et même par CP/M, en donnant l'extension .COM.

Seul regret : il n'est pas possible, sauf erreur de notre part, de générer des macro, mais nous nous en passerons, sachant qu'il est possible de transmettre au programme assembleur les variables du Basic, mais aussi de récupérer sous Basic les valeurs traitées par le programme assemblé.

Menu principal de MAXAM

Pour accéder au menu principal de MAXAM, il suffit d'entrer l'une des commandes MAXAM : |MAXAM, 1 ; |MAXAM, 2 ; |M ; |M, 1 ou |M, 2.

TText editor : accède au menu de l'éditeur.
DDisassemble : permet un désassemblage d'une zone mémoire.
DPDisassemble to printer : désassemble une partie de la mémoire sur imprimante.
LList memory : donne les codes hexadécimaux et leur traduction ASCII d'une partie de la mémoire.
LPList memory to printer : donne les codes hexadécimaux et leur traduction ASCII d'une partie de la mémoire sur imprimante.
SSelect upper ROM : permet de sélectionner une ROM haute par son numéro.
OLower ROM on/off : permet de sélectionner ou non la ROM inférieure (système d'exploitation).
EEdit memory : permet d'éditer une partie de la mémoire pour y effectuer des modifications.
FFindstring : permet de rechercher une chaîne de caractère en mémoire.
FPFind string and print : recherche une chaîne de caractère en mémoire et imprime toutes les adresses auxquelles elle est rencontrée.
MMove memory block : déplace un bloc mémoire.
RRelocate block : reloge un bloc mémoire en recalculant les adresses.
IInitialise block : initialise un bloc mémoire avec une valeur donnée.
CCompare blocks : compare deux blocs mémoire.
CPCompare and print : compare deux blocs mémoire et imprime les différences.
XExtemal commands : permet d'exécuter une commande RSX.
BBasic : redonne le contrôle au Basic.

L'éditeur

Lors du choix T du menu précédent, vous accédez à un nouveau menu dont voici la signification :

EEdit text : permet d'éditer le texte source.
LLoad : charge un fichier ASCII depuis la disquette pour remplacer le texte source en cours.
LBLoad block : insère dans le texte source en cours, à la position du curseur, un fichier ASCII depuis la disquette.
SSave : sauve le texte source en mémoire sur disquette.
SBSave block : sauvegarde un bloc du texte source sur disquette.
PPrint : imprime le texte source.
PBPrint block : imprime un block du texte source.
MModify : modifie la présentation du texte source selon quatre options :
— option 1 : ajoute des numéros de ligne ;
— option 2 : ajoute des apostrophes sur chaque ligne ;
— option 3 : supprime les numéros de lignes ;
— option 4 : supprime les apostrophes.
MBModify block : modifie la présentation d'un bloc de texte source (voir Modify).
GGo to line : accède à l'éditeur sur une ligne spécifiée du texte source.
FFind : permet de rechercher une chaîne de caractères dans le texte source. < COPY > permet de continuer la recherche.
RFind & replace : recherche une chaîne de caractères et permet le remplacement par une autre.
TTabs : permet de définir les tabulations pour l'édition du texte source.
AAssemble text : assemble le fichier source.
JJump to code : permet l'exécution du code généré par l'assemblage.
XExternat commands : permet d'exécuter des commandes RSX.
QQuit : retourne au menu principal de MAXAM.
Mémento d'assemblage

Vous vous reporterez, pour la liste des codes opératoires du Z80 en Partie 4 chapitre 2.4 pages 1 à 4, par contre, voici la fiche résumée des principales directives et commandes d'assemblage (vous remarquerez que plusieurs directives correspondent à la même action, ceci pour garder une certaine compatibilité entre les différents assembleurs existant).

BRK Fixe un point d'arrêt.
BYTE

Permet de placer une suite de données sur huit bits, sous forme d'octets ou de chaînes de caractères.

CLOSE Ferme un fichier objet ouvert sur disque.
CODEAnnule la directive NOCODE.
DBPermet de placer une suite de données sur huit bits, sous forme d'octets ou de chaînes de caractères.
DEFB Permet de placer une suite de données sur huit bits, sous forme d'octets ou de chaînes de caractères.
DEFMPermet de placer une suite de données sur huit bits, sous forme d'octets ou de chaînes de caractères.
DEFS Réserve un bloc mémoire en cours d'assemblage.
DEFWPermet de placer des mots sur 16 bits en mémoire. Attention, les octets haut et bas seront inversés.
DSRéserve un bloc mémoire en cours d'assemblage.
DUMPPermet l'affichage de la table des symboles en fin d'assemblage.
DWPermet de placer des mots sur 16 bits en mémoire. Attention, les octets haut et bas seront inversés.
ELSEAssemble si la condition IF n'est pas réalisée.
ENDFin d'assemblage.
ENDIF Fin de condition IF.
EQU Directive d'équivalence de codes ou d'adresses.
GET Permet de passer des paramètres depuis le Basic vers le code machine (uniquement utilisable sous Basic).
IFAssemblage conditionnel avec condition vraie.
IF1Test de condition sur la première passe de l'assemblage.
IF2Test de condition sur la deuxième passe de l'assemblage.
IFNOTAssemblage conditionnel avec condition fausse.
LETAffecte un symbole, avec possibilité de redéfinition.
LIMITFixe l'adresse limite de génération du code (pour ne pas déborder sur un autre programme).
LIST Autorise le listing sur l'écran.
LISTPDéroule le listing vers l'imprimante.
NOCODESupprime la génération du code en mémoire.
NOLISTInhibe le listing.
ORG Défini l'origine d'assemblage pour la génération du code objet.
PAGEProvoque un saut de page.
PAUSEArrête l'assemblage et attend la frappe d'une touche.
PLENFixe la longueur des pages pour l'affichage ou l'impression.
PRINTAffiche un message à l'écran.
PUTRestitue une valeur au Basic (utilisable uniquement par assemblage sous Basic).
READLit un fichier source sur disquette.
RMEMRéserve un bloc mémoire en cours d'assemblage.
TEXTPermet de placer une suite de données sur huit bits, sous forme d'octets ou de chaînes de caractères.
TITLE Définit un titre sur chaque page de listing.
WIDTHFixe la largeur des pages pour l'affichage ou l'impression.
WORDPermet de placer des mots sur 16 bits en mémoire. Attention, les octets haut et bas seront inversés.
WRITEEcrit un fichier objet sur disquette.

Page précédente : 4/2.11 III - Les interruptions logicielles (SOFT)
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
Page créée en 095 millisecondes et consultée 510 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.