| ★ APPLICATIONS ★ PROGRAMMATION ★ "REM-OFF" OU LA SUPPRESSION DES COMMENTAIRES ★ |
| REM-OFF | Applications 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.
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 :
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.
|