★ CODING ★ CLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★ |
9/8.06 - Récupération d'un fichier effacé par la commande ùERA | Coding Classeurs Weka |
9/8.6 Récupération d'un fichier effacé par la commande |ERAVous connaissez sans doute l'instruction |ERA,"nomfic.ext" du Basic Amstrad qui vous permet d'effacer un fichier sur une disquette. Lorsqu'une telle commande est activée, le fichier spécifié n'est pas supprime physiquement de la disquette: il est seulement marqué « absent » dans le catalogue, et, de ce fait, il n'apparaît plus lorsque vous demandez le répertoire de la disquette. Partant de cette remarque, il vient tout de suite à l'esprit qu'un fichier supprimé par la commande IERA peut être restitué en effaçant la marque « absent » du répertoire. C'est effectivement le cas si aucune opération d'écriture sur la disquette n'a été faite depuis l'effacement. Effectivement, les commandes d'écriture sur disquettes sont autorisées à écrire sur les fichiers marqués « absent » (sinon, à quoi ia commande IERA servirait-elle ?). Voyons en détails la façon de procéder pour récupérer un fichier effacé. Définitions – On appelle secteur un certain nombre d'octets consécutifs situés sur la disquette (512 octets pour Amstrad CPC). Un secteur est la quantité minimale d'informations accédée à chaque lecture sur disquette ou disque dur. Sachant que : Structure détaillée du catalogue Une des fonctions fondamentales d'un système d'exploitation, quel qu'il soit et quelles que soient ses origines, est de faciliter la gestion des fichiers sur les supports de sauvegarde de masse (lecteurs de disquettes ou de disques durs). Pour ce faire, les systèmes d'exploitation font appel à un répertoire (souvent appelé catalogue sur les ordinateurs CPC) qui contient les informations nécessaires pour retrouver rapidement les fichiers sur le support mémoire. Ces informations sont les suivantes : Examinons en détails les données enregistrées dans le répertoire pour chaque fichier. Par la suite, nous appellerons entrées l'ensemble des données permettant d'accéder à un fichier dans le répertoire. Chaque entrée comporte 32 octets dont voici la signification : Octet 00 ;: Numéro de USER du fichier (00 à 0F), ou indicateur de fichier « absent » (effacé par une commande |ERA). Lorsqu'un fichier a été effacé, cet octet contient la valeur #E5. Octets 01 à 08 : Nom du fichier, complété par des caractères « Espace » (#20) si nécessaire (si la longueur du nom est inférieure à 8 caractères). Si cet octet vaut #80 (128), une « extension « suit car une entrée ne peut référencer que 16 Koctets (effectivement, une entrée ne peut comporter que 16 numéros de blocs, donc 16 Koctets. (Cf. Octets 10 à 1F.) Octets 10 à 1F : Numéros de blocs occupés par le fichier. Précisons encore que la position du répertoire dépend du format de la disquette. Une disquette peut être formatée en « Système », « Data »ou « Ibm ». – si la disquette est au format système, le catalogue se trouvera sur la piste 2, secteurs 65 à 69 ; Ainsi l'octet 0 d'une entrée contiendra la valeur #E5 si ce fichier a été effacé, ou un numéro d'USER. Pour qu'un tel fichier soit à nouveau accessible, il suffira de charger l'octet 0 de l'entrée correspondante avec la valeur 0. Utilisation des instructions « KL FIND COMMAND », « READ SECTOR » et « WRITE SECTOR » Instruction « READ SECTOR » (&84) du lecteur de disquettes Une des instructions cachées du lecteur de disquette est « READ SECTOR ». Cette instruction permet d'accéder à un secteur quelconque de la disquette. Nous allons l'utiliser pour lire ta valeur d'une entrée dans le répertoire. Instruction « WRITE SECTOR » (&85) du lecteur de disquettes Une autre instruction cachée du lecteur de disquettes est « WRITE SECTOR ». Accès aux instructions « READ SECTOR » et « WRITE SECTOR » à travers la macro instruction KL FIND COMMAND L'instruction « KL FIND COMMAND » du Firmware est située à l'adresse #BCD4. Elle permet de trouver l'adresse d'une instruction de type RSX ou d'une commande externe de la ROM basse de l'Amstrad. Elle permet, en outre, de trouver les adresses des commandes de lecture et d'écriture « READ SECTOR » et « WRITE SECTOR ». L'instruction « KL FIND COMMAND » combinée à un RESTART 24 permettra d'activer la lecture ou l'écriture d'un secteur de la disquette. L'adresse en mémoire où se trouve le nom de la commande à accéder doit être fournie en entrée de cette routine dans le registre HL. interfaçage du RESTART 24 Les registres C, D, E et HL sont utilisés en entrée. Ils doivent contenir les informations suivantes : Nous pouvons maintenant réaliser assez facilement des programmes en assembleur de lecture et d'écriture d'un secteur de la disquette. Ces deux programmes respecteront la logique suivante : Lecture d'un secteur sur disquette
Ecriture d'un secteur sur disquette
Ces programmes élémentaires vont être agrémentés d'une interface utilisateur qui permettra d'entrer le nom et l'extension du fichier effacé à retrouver. Ce fichier sera cherché sur la disquette spécifiée, et le premier octet de son entrée dans le répertoire sera modifié si nécessaire. Si le fichier spécifié n'est pas trouvé dans le répertoire, le message 'Fichier non trouvé' sera affiché à l'écran. Le programme de restitution est présenté dans deux versions : totalement assembleur et basic plus assembleur. Interface utilisateur Cette interface consiste à lire : – le nom et l'extension du fichier à retrouver ; Le fichier est recherché dans la totalité du catalogue. Si le fichier spécifié est rencontré dans le catalogue, le premier octet de l'entrée correspondante est comparé à #E5. S'il est égal à cette valeur, il est mis à 0 pour être accessible sous un numéro d'USER quelconque. Si le fichier spécifié n'est pas trouvé dans le catalogue ou s'il est trouvé mais avec le premier octet de son entrée différent de #E5, le message 'Fichier non trouvé' est affiché et le répertoire est laissé intact. Ces diverses actions sont résumées dans l'algorithme suivant. Restitution d'un fichier effacé Programme de restitution de fichiers en version Basic * Les ordres « KL FIND COMMAND », « READ SECTOR » et « WRITE SECTOR » ne peuvent pas être utilisés facilement en Basic, c'est pourquoi nous allons développer un petit programme en assembleur pour lire et écrire un secteur quelconque de la disquette.
Ce programme en Assembleur est en effet une concaténation des deux précédents. Il est implanté en # 9375 pour être identique au programme de restitution écrit totalement en Assembleur présenté par la suite. * Le programme Basic de restitution est relativement court, mais assez lent, c'est pourquoi on pourra référer une version assembleur.
– Lignes 1000 à 1130 : Implantation du programme Assembleur en mémoire. Le détail des lignes 1370 à 1540 est donné dans l'algorithme suivant : Programme de restitution de fichiers en version Assembleur Le programme Assembleur de restitution reprend les opérations détaillées dans l'algorithme précédent. Les routines de lecture et d'écriture d'un secteur sont implantées aux mêmes adresses que dans le programme Basic.
Chargeur Basic du programme Assembleur de restitution Si vous ne voulez pas entrer le listing assembleur précédent, tout en conservant la vitesse d'exécution de l'assembleur, vous pourrez entrer le chargeur que nous présentons ici.
Pour être sûr que le programme fonctionnera au premier essai, nous vous donnons la liste des codes de vérification à utiliser avec le programme de checksum (Voir Partie 9, chap. 8.4).
|