CODING ★ PROGRAMMATION : L'ASSEMBLEUR EN DOUCEUR (7e partie) ★

L'assembleur en Douceur (7/x) : Premier pas avec Devpac (Micro-Mag)Cours et Initiation MICROMAG

Ensemble nous avons tant appris, qu'il est temps d'envisager maintenant le travail sous Assembleur. Attention, certains ordres d'installation sdnt relatifs à l'Assembleur DEVPAC (pour un autre Assembleur, consultez votre manuel).

— Lancez DEVPAC.
— A la question «adresse», répondez 2000.
— «Do you want Use», répondez N.

Vous êtes maintenant sous Assembleur, tapez les caractères suivants en les validant par RETURN:

- W (Width = largeur): permet de passer du mode 1 au mode 2 ou vice-versa. Le mode 2 est préférable car il évite, lors du listage écran, les lignes dédoublées avec commentaires. Le manque de lisibilité du mode 2 est compensé par cette propreté du listing.

— H (Help = au secours): donne à l'écran une liste des commandes disponibles, avec une lettre majuscule dans chacune d'elles qui devra être donnée ? (suivie de RETURN) pour l'exécution.

-I10,5 (Insert): «I» permet la numérotation automatique des lignes du programme comme AUTO en basic. Les deux valeurs qui le suivent indiquent le premier numéro et
l'incrément pour les lignes suivantes.
(Les autres commandes seront détaillées lorsque le besoin s'en fera senti).

* Dès lors, derrière le 10 qui apparaît, commencez la frappe des lignes de programmation en respectant bien les espaces entre les numéros de lignes et les mnémoniques, puis entre les mnémoniques et les arguments qui les suivent. Remarquez qu'une virgule sépare les deux arguments et qu'un point virgule précède le commentaire. Ce dernier est l'équivalent du REM en basic, il sera ignoré lors de la compilation. Son rôle est capital en assembleur car il permet de s'y . retrouver dans un programme source écrit depuis des mois. Dans l'exemple qui Suit, il n'est employé que pour rappeler les différents modes d'adressage, mais nous verrons ensuite comment faire un commentaire de façon intelligente.

* Ne tapez pas d'espace entré le dernier argument et le point virgule, car sachez qu'en listant votre programme source, tout le texte se redisposêra automatiquement en tabula-tions. Si vous avec commis une erreur dans le genre, oubli du point-virgule devant un commentaire, vous le constaterez immédiatement par le défaut d'alignement.

Premiere routine
10 ORG 3000 ; adresse de l'implantation future
15 LD B,8 ; adressage immédiat
20 LD A,B ; adressage registres
25 LD (29990),A ; adressage étendu
30 LD HL,29991 ; adressage immédiat
35 LD (HL),15 ; adressage indirect
40 LD HL,49435 ; adressage immédiat
45 LD (29992),HL ; adressage étendu
50 LD IX,29989 ; adressage immédiat
55 LD A,(IX+1) ; adressage indexé
60 LD (29994),A ; adressage étendu
65 RET ; fin routine - retour basic

* Validez chaque ligne avec RETURN comme en Basic. A la fin de la saisie, sortez de la numérotation automatique en pressant la touche ESC.

* Listez maintenant à l'écran avec la commande «L». Celle-ci peut, si vous le désirez, admettre deux paramètres. 1-10,25 ne listera que tes lignes portant un numéro de 10 à 25.

Première compilation

L'étape suivante est donc la compilation en vue d'obtenir le code machine. Tapez «A» (Assemblage) puis RETURN. contentez-vous pour l'instant de répondre par une simple validation aux questions posées. L'assembleur effectue alors une première passe pour vérifier la syntaxe. S'il détecte une erreur comme par exemple ORC au lieu de ORG, il affiche la ligne fautive et le type d'erreur rencontré (voir manuel). On peut continuer pour voir les autres erreurs ou arrêter par ESC et corriger. La correction peut s'effectuer de plusieurs manières selon l'assembleur utilisé.

A ce propos, DEVPAC offre un système d'édition de lignes complet, mais son maniement est plutôt long à assimiler. On peut toujours retaper la ligne complète. Personnellement, j'emploie la même procédure qu'en basic: je liste la ligne erronée, supposant la 10 en tapant L10,10, puis, en pressant sur SHIFT, j'amène avec les touches de direction un second curseur sur la ligne 10. Je récupère toute la partie correcte en la dupliquant avec COPY sans prendre les espaces avant le point-virgule du commentaire, car le buffer n'accepte pas autant de caractères qu'en basic. Une fois les corrections de syntaxe exécutées, recommencez l'opération de compilation. Si tout est OK, le code machine est produit et installé en mémoire vive à l'adresse donnée après ORG.

Première sauvegarde

Voyons maintenant comment effectuer les sauvegardes. U (Upper) donne le dernier numéro de ligne, soit 65 pour notre exemple. Veillez à la présence de la cassette ou disquette, tapez P10,65,PROG1 et les lignes 10 à 65 seront sauvegardées sous le nom PROG1.
Si vous tapez Q10,65,PROG1, même résultat, mais avec un fichier sur disquette au format ASCII, sans intérêt pour l'instant On peut maintenant, si l'on veut, taper V,,PROG1. Cette commande vérifie que la sauvegarde s'est bien passée en comparant le programme actuel avec celui sauvé, c'est une sécurité de plus.
Ce fichier source que l'on garde est, répétons-le, fondamental. Par prudence, aucune exécution ne devra être tentée avant de l'avoir sauvé. Sûr de nous et de la validité de notre programme, nous pourrions cependant sauvegarder les codes machine par la commande O,,PROG1-B constituant ainsi un fichier binaire du programme objet (et vérifier éventuellement si tout s'est bien passé par V,,PROG1-B). Vous avez compris que dans toutes ces commandes sans numéros de ligne, c'est leur ensemble qui est considéré et que, bien sûr, PROG1 et PROG1-B sont donnés à titre d'exemple. Ne souriez pas, j'ai connu un débutant qui utilisait toujours Save «Nomfich.bas», procédure donnée en exemple dans le manuel! Un petit truc utile quand même: le «-B» qui permet de mémoriser la nature binaire du programme (codes machine du prog. objet).
Mais testons d'abord notre programme. B (Basic) validé par RETURN nous ramène sous basic. Tapez en direct CALL 30000. Vous êtes chanceux, tout se passe bien et vous récupérez le message READY. Si la machine est plantée, réinitialisez, relancez l'assembleur, récupérez le programme source avec la commande G,,PROG1 et recherchez ce qui ne va pas (lister sur imprimante devient quasiment indispensable pour des programmes conséquents!). Si le programme semble correct, il nous reste à vérifier, grâce à la fonction PEEK, que les valeurs stockées aux adresses 29990 et suivantes sont bien là. Tapez une à une les quatre lignes suivantes :

? peek (29990)
? peek (29991)
? peek (29992) + (peek (29993)*256)
? peek (29994)

Vous devez obtenir successivement 8, 15, 49435 et 8. Essayez de comprendre le pourquoi de ces valeurs en suivant le programme pas-à-pas et vous rappelant que:

* Une valeur entre parenthèse indique toujours une adresse. Ne vous laissez pas piéger par (HL), c'est la même chose. Remplacer mentalement HL par la valeur qu'il représente.

* Un registre simple, double ou une case-mémoire où qu'ils soient stockés, continuent à conserver leur valeur.

* Enfin, on ne répétera jamais assez qu'une valeur Î6 bits stockée en mémoire vive, occupe deux adresses sous forme inversée, poids faible, puis poids fort. Dans notre exemple, c'est bien la deuxième adresse, soit 29993 qui contient le poids fort de 49435. On doit donc multiplier la valeur chargée à cette adresse par 256.

Implantation de la routine

Voilà, reste à voir la procédure permettant d'implanter en mémoire vive, hors assembleur et pour nos utilisations ultérieures sous basic, le fichier objet qui contient nos codes machine. La première chose à faire est de garantir le non-écrasement de la routine par le basic, qui place ses variables alphanumériques (chaînes) en haut de la RAM. La commande Basic MEMORY va s'en charger. La règle, souvent énoncée, est que l'on fixe MEMORY à l'adresse d'implantation moins 1. Un MEMORY 29999 'préservera donc notre routine chargée en 30000. Afin de montrer que ce n'est pas toujours lé cas, j'ai volontairement choisi de stocker des valeurs dans la zone d'adresse 29990 et suivantes. Il se peut en effet que l'on ait à situer «avant» la routine, des graphismes codés ou un buffer (zone d'adresses réservées pour y ranger des valeurs). Auquel cas, cet endroit se doit d'être également protégé (soit MEMORY 29989 pour l'exemple ci-dessus).

Il ne reste plus qu'à loader le fichier PROG1-B et à lancer son exécution par un CALL, ce qui nous donne :

10 MEMORY 29989
20 LOAD "PROG1-B",30000
30 CALL 30000

Fin de la 1er étape

En principe, vous devriez avoir maintenant assimilé, tout au moins dans les grandes lignes, les connaissances (vue d'ensemble de l'architecture du CPC, système binaire et hexa, modes d'adressage et commandes de base de l'assembleur) nécessaires avant d'aborder l'étude des mnémoniques. En outre, sachez qu'il convient de maîtriser aussi parfaitement que possible les commandes de l'assembleur utilisé (ici, DEVPAC) par une étude approfondie du manuel.

Prochainement, nous découvrirons l'extraordinaire facilité de programmation qui nous est offerte par les routines systèmes de l'Amstrad. Bon travail!

Guy Poli , MICROMAG n°12

★ EDITEUR: MICROMAG
★ ANNÉE: ???
★ AUTEUR: GUY POLI
 

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Ali Gator - 01 les Caracteres de Controle (Micro-Mag)
» Coding » Ali Gator - 08. La mémoire écran (Micro-Mag)
» Applications » Hisoft Devpac80 v2
» Coding » Ali Gator - 09. Carte Mémoire CPC (Micro-Mag)
» Applications » Hisoft - Devpac80
» Coding » Ali Gator - 06. Les Fichiers Basic (MicroMag)
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 287 millisecondes et consultée 2133 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.