CODINGCLASSEURS 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 ùERACoding Classeurs Weka

9/8.6 Récupération d'un fichier effacé par la commande |ERA

Vous connaissez sans doute l'instruction IERA,"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 sup­prime physiquement de la disquette: il est seulement marqué « absent » dans le catalogue, et, de ce fait, il n'apparaît plus lorsque vous deman­dez 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 mar­que « 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.
–   Sur CPC, un secteur est divisé en quatre zones de taille égale appelées enregistrements (chaque zone fait donc 128 octets).
–   Un bloc est un ensemble de secteurs qui occupent une taille de 1 Koctets ou 2 Koctets. Les blocs permettent une gestion plus aisée des fichiers de taille importante. La taille des blocs est fixée sous CP/M.
Dans le répertoire figurent les numéros des blocs occupés par chaque fichier.

Sachant que :
–   la taille standard d'un bloc sous CP/M est de 1 Koctets,
–   chaque fichier occupe au minimum un bloc,
il est facile de conclure que chaque fichier, même s'il ne contient qu'un caractère, occupera une taille minimale de 1 Koctet sur la disquette.

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 :
–   nom des fichiers,
–   emplacement des fichiers sur le support.

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 don­nées permettant d'accéder à un fichier dans le répertoire.

Chaque entrée comporte 32 octets dont voici la signification :
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E OF 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F

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).
Octets 09 à 0B   :      Nom de l'extension.
Octet 0C                  ;  Numéro de l'extension (Cf. Octet 0F).
Octets 0D à 0E   :      0
Octet 0F                  ;  Nombre d'enregistrements du fichier.

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 ;
–   si la disquette est au format data, le catalogue se trouvera sur la piste 0, secteurs 193 à 197 ;
–   si la disquette est au format Ibm, le catalogue se trouvera sur la piste 1, secteurs 1 à 5.

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 acces­sible, 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 dis­quette. 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 ».
Nous allons l'utiliser pour réécrire l'entrée lue par READ SECTOR dans le répertoire disquette, en ayant pris le soin de rectifier la valeur conte­nue dans le premier octet de l'entrée.

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 lec­ture 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.
Interfaçage de la routine KL FIND COMMAND

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.
En sortie, si la commande indiquée est trouvée :
–   l'indicateur « Carry » est positionné à un ;
–   le registre C contient l'adresse de ROM SELECT ;
–   le registre HL contient l'adresse de la routine. Si la commande indiquée n'est pas trouvée :
–   l'indicateur « Carry » est positionné à zéro ;
–   les registres C et HL contiennent des valeurs sans signification. Dans tous les cas :
–   les registres A, B et DE sont effacés ;
–   les autres registres sont intacts.

interfaçage du RESTART 24

Les registres C, D, E et HL sont utilisés en entrée. Ils doivent contenir les informations suivantes :
–   E = Numéro du lecteur de disquettes,
–   D = Numéro de la piste à accéder,
–   C = Numéro du secteur à accéder,
–   HL = Adresse d'un buffer de 512 octets nécessaire à la lecture ou à l'écriture d'un secteur.

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 uti­lisateur 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 pre­mier 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 nom du lecteur de disquette ( A ou B) ;
–   Je format de la disquette (Système, donnée ou Ibm).

Le fichier est recherché dans la totalité du catalogue. Si le fichier spéci­fié est rencontré dans le catalogue, le premier octet de l'entrée corres­pondante 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.
–   Lignes 1140 à 1250 : Entrée des données pour retrouver le fichier.
–   Lignes 1260 à 1310 : Constitution du nom du fichier à retrouver.
–   Lignes 1320 à 1350 : Mémorisation des données entrées pour l'interfaçage avec le programme Assembleur.
–   Lignes 1370 à 1540 : Lecture, modification éventuelle et écriture des entrées du répertoire.
–   Ligne 1560 : Affichage du résultat de la recherche.

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étail­lées dans l'algorithme précédent.
A noter que l'affichage du texte est fait par la routine AFALPH, et la sai­sie formatée de texte par la routine SAISIE. La routine SAISIE demande le nombre maximal de caractères à saisir, et fait un retour chariot auto­matique lorsque ce nombre est atteint. Une routine d'émission d'un beep sonore (BEEP) est également utilisée. (Voir Partie 6, chap. 5.2).

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).

Page précédente : 9/8.05.2 - Programme de Dump en Assembleur

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 869 millisecondes et consultée 1210 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.