APPLICATIONSPROGRAMMATION ★ "REM-OFF" OU LA SUPPRESSION DES COMMENTAIRES ★

REM-OFFApplications Programmation
Pour compacter un programme après sa mise au point, rien ne vaut un bon utilitaire éliminant les instructions qui ne sont pas nécessaires à son fonctionnement.

Comme chacun sait, la mise au point des programmes Basic sans utilisations des commentaires (instruction REM) est une chose difficile et peu recommandée. Pourtant, qui ne s'est pas trouvé un jour confronté au dilemme qui nous conduit à utiliser avec parcimonie et retenue ces fameux REM, afin de ne pas trop ralentir une exécution et ne pas encombrer inutilement ses disquettes.

En effet le rôle du REM pour un langage interprété n'a d'autre but que celui d'aider l'auteur dans l'écriture de son programme. Mais passé ce rôle, en exécution, cela n'a plus d'intérêt, dans le sens où chaque caractère ASCII occupe un octet non fonctionnel. Ceci est à opposer aux langages compilés (Pascal, Fortran...) qui eux, à partir d'un programme source, fournissent après compilation un programme objet directement exécutable et entièrement écrit dans le langage du microprocesseur. Cela signifie que les commentaires utilisés par l'auteur ne passent pas le cap du développement et n'existent plus dans le fichier objet.

Triste résignation, pensez-vous ? Plus pour longtemps, car nous vous proposons ce mois-ci un programme intitulé « REMOFF.BIN », qui se charge de détruire toutes les lignes de REM. Voyons comment s'effectuent les opérations. Il vous suffit d'indiquer le nom du fichier Basic à compacter, le programme va alors chercher ce dernier sur disquette, le charger en mémoire, détruire les REM et le replacer enfin sur la disquette. Le tout sera effectué en prenant soin de laisser le programme initial stocké dans une version « .BAK » afin de laisser à l'utilisateur le loisir de revenir sur sa décision.

Structure d'un programme

Etudions maintenant la structure du programme. Nous noterons tout d'abord que le programme « REMOFF.BIN » est entièrement autonome et ne nécessite pas d'être appelé par un programme Basic. Cette remarque est importante car sans précautions particulières un programme binaire lancé directement ne peut pas, sur l'Amstrad, appeler à son tour un autre programme sur disquette. L'ordinateur cherche en effet dans tous les cas à charger un logiciel sur cassette. Une première solution pour résoudre ce problème est de placer à la base des modules appelant un programme Basic. C'est une solution pratique mais peu élégante, car elle nous conduit à avoir un programme Basic chargeur, qui, aussi petite que soit sa taille, nécessitera pour son stockage sur disquette au minimum 1 K-octet (2 secteurs de 512 octets). La seconde solution qui est celle retenue va nous permettre d'expliciter ce curieux et non moins sibyllin problème.

Dans le cas de figure où un programme binaire est directement exécuté, l'ordinateur sans crier gare déconnecte la partie ROM correspondant au contrôle du disque (équivalent en cela au :tape en Basic). Ainsi, lorsqu'une sauvegarde (ou un chargement) est demandée, l'ordinateur se voit contraint de faire celle-ci sur cassette pour la raison suivante : lors de la conception du système, les ingénieurs de chez Amstrad ont prévu le lecteur de cassette dans la version de base (cela est vrai pour le 464, mais ne l'est plus pour les versions 664 et 6128); ce qui explique l'affichage on ne peut plus rationnel, mais ô combien déroutant, de l'intempestif :

« PRESS PLAY THEN ANY KEY ».

Mais, vous demandez-vous, comment y remédier ? Nous vous livrons sans plus tarder la solution au problème : pour initialiser et rendre à nouveau active la ROM disque, il suffit de faire un CALL &BCCE (KL INIT BACK) avec dans le registre C le numéro de la ROM, dans DE l'adresse du premier octet utilisable en mémoire vive et dans HL le dernier octet utilisable (consulter le listing du programme figure 1 pour connaître ces valeurs). Et voilà, le tour est joué.

Le fonctionnement du programme

Nous allons maintenant nous attarder sur le fonctionnement et la structure du programme. Celui-ci se compose de cinq blocs principaux (fig. 2) : le bloc de présentation et d'initialisation, le bloc de saisie du nom du programme à traiter, le bloc de chargement du programme Basic, le bloc de destruction des lignes de REM et enfin les instructions de sauvegarde de la nouvelle version.


Fig. 2. - Organigramme décrivant les phases principales du logiciel.

Chaque bloc est lui-même décomposable en sous-éléments. Nous nous contenterons dans cet article de faire l'analyse du bloc de destruction des lignes de REM (fig. 3). Cependant, nous engageons fortement le lecteur à étudier de lui-même la structure des autres blocs. En effet, le propos de cet article n'étant pas de faire une initiation au langage assembleur Z80, nous nous bornerons à dire que les méthodes utilisées sont des plus classiques et sont, par conséquent, largement commentées et décortiquées dans tout bon livre d'initiation. Pour illustrer ce paragraphe, nous citerons l'exemple du XOR A, qui permet en un octet de mettre à zéro le registre A, alors que l'on ne retrouve que trop souvent (et pas seulement chez les « amateurs ») un LD A,0, qui, lui, tient sur deux octets.

Avant d'aller plus avant, commençons par étudier la structure d'un programme Basic en mémoire. Celle-ci obéit à un certain nombre de règles qu'il est bon de se rappeler :

  • Un programme se termine toujours par 3 octets nuls (valeur 0 binaire).
  • Deux lignes sont séparées par un octet nul.
  • Les deux premiers octets d'une ligne fournissent la longueur de la ligne (octet nul final compris).
  • Les octets 3 et 4 donnent le numéro de la ligne.
Il faut ensuite savoir que chaque mot clé est remplacé par un octet appelé token (encadré). A titre d'exemple, l'instruction PRINT correspond au token &BF. Dans l'exemple qui nous intéresse, nous devrons dans un premier temps détecter en mémoire les tokens correspondant aux instructions : « REM » et « ' » , qui sont respectivement &C5 et &01 &C0. Il est à noter que le symbole « ' », économique à l'écriture, ne l'est plus une fois écrit en mémoire, puisqu'il occupe 2 octets (le token &01 correspond en fait au deux-points de séparation « : », mais sa présence est obligatoire pour informer l'interpréteur qu'il s'agit d'une simple remarque équivalente au REM).


Fig. 3. - Organigramme de la fonction de suppression.

Une fois la détection faite, vient la phase de destruction. On effectue pour cela une sorte de décalage vers le bas qui vient écraser la ligne REM. La ligne REM étant repérée (on connaît son adresse et sa longueur), le programme peut alors se décomposer en trois parties : la partie qui précède la ligne REM, la ligne REM elle-même et enfin, la partie qui suit. Que fait alors le programme ? Il se contente de recopier la dernière partie à l'adresse où se trouvait la deuxième partie à l'aide de l'instruction LDIR, en prenant soin, bien évidemment, de recalculer la nouvelle longueur du programme (c'est-à-dire l'ancienne longueur diminuée de la longueur de la ligne détruite). Les lignes REM se trouvent donc à chaque fois écrasées par la partie du programme qui suit. Ainsi, comme vous pouvez le constater, le processus est simple mais conduit cependant à être très rigoureux dans les calculs d'adresses, car il ne faut en aucun cas altérer les parties utiles du programme. Les registres utilisés pour traiter l'opération sont clairement indiqués dans le listing du code source, et n'appellent donc pas de commentaires particuliers. Nous vous conseillons en conclusion de vérifier à chaque fois le bon fonctionnement du programme compacté. En effet, pour que celui-ci fonctionne sans heurt, il ne faut pas que les lignes REM soient des lignes de branchement (atteintes par GOTO ou GOSUB) car cela impliquerait un arrêt du programme. Bien que ce type de branchement ralentisse le déroulement d'un programme, certains programmeurs en usent systématiquement ; alors, avant de supprimer la version « .BAK » toujours présente, pensez à faire un contrôle.

Pour les lecteurs ne disposant pas d'un assembleur, nous fournissons figure 4 un programme Basic chargeur qui crée automatiquement l'utilitaire sur disque sous le nom REM-OFF. BIN.

STRUCTURE D'UNE LIGNE DE PROGRAMME EN MEMOIRE

Soit à titre d'exemple la ligne : 10 REM. Nous trouverons donc en mémoire (à l'adresse & 170 si c'est la première ligne du programme) les valeurs hexadécimales :

1D 00 0A 00 C5 20 63 65 63 69 20 65 73 74 20 75 6E 65 20 72 65 6D 61 72 71 75 65 2E 00

Avec :

256 *&00 + &1D = 29: longueur de la ligne.

256 *&00 + &0A = 10: numéro de la ligne.

&C5 : REM &20 : espace

&63... &2E : caractè ASCII.

&00 : octet de fin de ligne.

MS

★ PUBLISHER: Micro-Systemes
★ ANNÉE: 1986
★ CONFIG: 64K + AMSDOS
★ LANGAGE:
★ LiCENCE: LISTING
★ AUTEUR: Patrick DEVAUX


★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» REM-OFF    (Micro  Systemes)    FRENCH    LISTINGDATE: 2024-12-28
DL: 114
TYPE: PDF
SiZE: 996Ko
NOTE: 3 pages/PDFlib v1.6

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

Lien(s):
» Applications » Fakturem
» Applications » Locoscript, premiers pas ... (Amstrad Magazine)
» Applications » Beebug - Rembrandt
» Applications » Buffer - Imprimante 32 - 48 - 64k Jafer Remy (Amstrad Magazine)
» Applications » REM-Killer
» Applications » REM-Killer (Computer Schau)
Je participe au site:
» Pour ce titre nous ne disposons de fichier executable sur CPC (Dump, Saisie du listing) , alors si vous avez ça dans vos cartons ou vous désirez usé vos petit doigts boudinés sur votre clavier faites le nous savoir.
» Vous avez des infos personnel ?
» 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 097 millisecondes et consultée 349 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.