CODING ★ INITIATION A CP/M - CPC n°23 ★

Initiation a CP/M (15/xx) (CPC Revue n°22)
Ce mois-ci nous continuons notre étude des fonctions du BDOS de CP/M et nous arrivons aux fonctions de gestion des fichiers.

Avant de poursuivre nous allons décrire les éléments utilisés dans cette gestion.

STRUCTURE DU CATALOGUE

Chaque disquette CP/M contient une zone utilisée par le BDOS qui s'appelle le catalogue. Cette zone est subdivisée logiquement en "enregistrements CP/M" c'est-à-dire en "secteurs logiques" de 128 octets. Comme sur un CPC les secteurs ont une taille physique de 512 octets, chaque secteur physique contient donc 4 secteurs logiques. Chaque secteur du catalogue est divisé en 4 postes de 32 octets. Un poste de 32 octets correspond à une partie ou au tout d'un fichier présent sur la disquette. En effet, chaque poste de 32 octets est divisé en 2 zones de 16 octets. La première contient l'indentification du poste et la deuxième les numéros des blocs succès sifs alloués. En voici la description détaillée :

– octet 0 : numéro d'utilisateur (0 à 1 5 correspondant au numéro de USER) ou 0E5H si le poste est vide, c'est-à-dire libre pour la création d'un nouveau poste. Note : les autres valeurs correspondent en CP/M Plus à des postes alloués pour autre chose qu'un poste de fichier ;
– octets 1 à 8 : nom du fichier éventuellement complété par des blancs ;
– octets 9 à 11 : extension du fichier éventuellement complété par des blancs. Attention les bits 7 de ces trois octets correspondent à des bits d'état, seuls les bits 6 à 0 correspondent à l'extension ;
– octet 12 : numéro d'extension ;
– octets 13 et 14 : réserves ;
– octet 15 : nombre d'enregistrements de 128 octets correspondant à ce poste
Si cet octet vaut 80H (128) le fichier comprend d'autres extensions ;
– octets 16 à 31 : numéro des blocs successifs alloués à ce poste. Remarque : il n'y a aucun lien entre l'extension de 3 lettres, qui désigne en fait un type de fichier et l'extension qui est un poste de catalogue supplémentaire à un poste de fichier.

FONCTIONNEMENT DU SYSTEME D'ALLOCATION DES BLOCS

Les blocs d'allocation ont une taille de 1K, ce qui donne 16K d'allocation par poste de catalogue. Donc un fichier de 36K aura 3 extensions, 2 de 16K et une de 4K. Après formatage tous les blocs de données d'une disquette sont libres et lors de la création d'un fichier ils seront alloués séquentiellement.

Mais un fichier peut très bien être sur les blocs 10 à 1 5 puis 20 à 25, tandis qu'un autre, créé en même temps aura les blocs 16 à 19 et 26 à 31. Si on supprime le premier fichier les blocs qui lui étaient alloués deviennent libres. Lors de la création d'un nouveau fichier on réutilisera ces blocs en commençant par les premiers utilisables. Ce système qui stocke les numéros des blocs dans les postes du catalogue a été déterminant dans la faillite de CP/M lors de l'évolution des matériels. En effet, parfaitement adapté aux systèmes de faibles capacités, car plus fiable qu'un système avec table d'allocation comme MSDOS, celui-ci se révèle vite peu performant lorsque les fichiers ont des tail les très importantes. En effet, un fichier de 160K aura 10 postes dans le catalogue et il faudra passer de l'un à l'autre lors d'accès dits "directs", ce qui ralentira considérablement la recherche d'un enregistrement par son numéro relatif, en entraînant l'équivalent d'une nouvelle ouverture de fichier chaque fois que l'on passe d'une zone de 16K à une autre.

STRUCTURE DU BLOC DE CONTROLE FICHIER (FCB: File Control Block)

Toute opération sur un fichier utilise une zone de travail utilisée par CP/M et qui s'appelle un FCB. En voici la description :

– octet 0 : code disque : 0 = disque courant, 1 = A: , 2 = B:, etc. ;
– octets 1 à 8 : nom du fichier complété par des blancs ;
– octets 9 à 11 : extension ;
– octet 12 : 0 à l'ouverture, contient en cours de traitement le numéro de l'extension courante ;
– octets 13 à 14 : réserves, à mettre à 0 à l'ouverture ;
– octet 15 : 0 à l'ouverture, nombre d'enregistrements dans l'extension courante en cours de traitement ;
– octets 16 à 31 : réserves, à mettre à 0 à l'ouverture ;
– octet 32 : numéro courant d'enregistrement en mode séquentiel ;
– octets 33 à 35 : numéro d'enregistrement relatif de 0 à 65535, octets 33 et 34 étant une valeur 16 bits. Octet 35 à 0.

REMARQUE SUR LA MISE AU POINT DES PROGRAMMES

1- La protection contre le "déplombage" Si vous êtes un petit curieux et que vous essayez l'exécution de certaines des commandes travaillant sur des fichiers ou surtout le catalogue, vous aurez la désagréable surprise de vous apercevoir que sous DDT ou SID, en mode trace ou en exécution avec point d'arrêt, le système ou se plante et revient au Basic (CP/M 2.2) ou termine votre programme et redonne la main au CCP. Ce n'est pas le meilleur de ce qu'a ajouté Amstrad à CP/M ! Est-ce par peur du piratage ou autre chose toujours est-il que cette protection est bien gênante pour la mise au point des programmes honnêtes !

Car en effet ça marche normalement à condition d'exécuter le programme à partir du CCP, mais l'exécution est impossible sous un Debugger. 2 Le mode de traitement des erreurs en CP/M Plus.

Nous le verrons plus tard avec la fonction 45, mais sous CP/M Plus il y a plusieurs modes de fonctionnement possible lorsqu'il se produit une erreur grave. Par défaut il est important de le savoir, en cas d'erreur grave le BDOS affiche un message d'erreur, termine votre programme et rend la main au CCP. Ainsi pas question d'essayer la fonction 14 pour savoir combien de disques sont en ligne, dès la demande de sélection d'une unité inconnue votre programme se terminera i

Si vous êtes certain de ne faire fonctionner votre programme que sous CP/M

Plus vous aurez la possibilité avec la fonction 45 de modifier cet état par défaut de façon à ce que le système rende la main à votre programme même lors de ce genre d'erreur.

REINITIALISATION DU SYSTEME DISQUE

Cette fonction permet de réinitialiser le système de gestion des disques dans un état équivalant à celui obtenu après le démarrage de CP/M. Son utilité essentielle est de permettre le changement de disquette dans un lecteur sans faire tomber la disquette dans un état de lecture seule. En effet, pour ne pas risquer d'écrire des informations d'une disquette sur une autre lors des mises à jour de catalogue, CP/M effectue un contrôle sur le contenu du catalogue de la disquette en ligne par rapport à la disquette lue à l'origine dans le même lecteur. Si le contrôle décèle que la disquette a été changée, le disque passe alors en "Read Only" c'est-à-dire que toute opération d'écriture sur la disquette est refusée. Cette fonction doit donc être exécutée chaque fois que l'on veut permettre le changement de disquette dans l'un des lecteurs. (Voir exemple 1).

En entrée : C = 13
En sortie : pas de retour.

SELECTION D'UNE UNITE DE DISQUE

Cette fonction est utilisée pour mettre en ligne une disquette qui se trouve dans le lecteur désigné. Après la première exécution de cette fonction, la disquette est disponible en lecture et écriture avec contrôle d'identification et le disque devient le disque courant. Une resélection, après sélection d'un autre disque, ne permet pas le change ment de disquette, mais considère que le lecteur contient toujours la disquette de la première sélection. Si un changement de disquette est constaté par ailleurs dans le cours du traitement, le disque passe alors en "lecture seule".

Cette sélection précède toutes les fonctions accédant directement au catalogue du disque courant (voir exemple 2).

En entrée : C = 14 E = numéro du disque (A: = 0 B: = 1, etc.)
En sortie : CP/M 2.2 pas de code retour. CP/M Plus l'accumulateur A est non nul si une erreur s'est produite.
Le registre H contient un code d'identification de l'erreur :
– 01 : erreur lecture/écriture sur le disque ;
– 04 : numéro du disque invalide.

OUVERTURE D'UN FICHIER EXISTANT

Avant d'effectuer des lectures ou des écritures dans un fichier déjà existant il est nécessaire d'effectuer une opération que l'on appelle l'ouverture. Cette opération consiste en une recherche dans le catalogue d'un poste correspondant aux nom et extension de fichier indiqués, sur le disque indiqué et ayant le code USER actif, ou le code USER 0. Les fichiers USER 0 sont donc visibles quelque soit le USER courant.

En cas de succès CP/M initialisé dans le FCB ses zones de travail qui lui permettent lors des accès successifs de savoir où il se trouve dans le fichier en cours de traitement (voir exemple 3). En entrée : C - 1 5 DE = adresse d'un

FCB correctement initialisé ;

En sortie ; A contient le code retour.
Valeurs 0 à 3 indiquent une ouverture correcte (numéro relatif du poste dans le "secteur" du catalogue).
Valeur 0FFH indique une erreur.

En CP/M Plus le registre H contient le code de l'erreur :

– 0 pas d'erreur ;
– 1 erreur lecture/écriture sur unité de disque ;
– 2 le disque est en état "lecture seule" ;
– 3 fichier à lecture seule ou protégé par un mot de passe ;
– 4 numéro d'unité de disque invalide ;
– 7 erreur de mot de passe ;
– 8 fichier déjà existant ;
– 9 nom de fichier ambigu invalide dans cette fonction.

FERMETURE D'UN FICHIER OUVERT

Lorsque l'on a terminé un traitement sur un fichier, il est nécessaire, afin de mettre à jour les informations du catalogue s'y rapportant d'effectuer ce que l'on appelle la fermeture du fichier. Cette opération est indispensable lorsque l'on a effectué des créations de nouveaux enregistrements dans le fichier. Un fichier non fermé correctement peut être perdu en partie ou totalement. C'est pour cela qu'il est bon de prendre l'habitude de toujours fermer tous les fichiers ayant été ouverts, même si on n'a effectué que des lectures (voir exemple 4).

En entrée : C = 16 DE = adresse du FCB du fichier à fermer ;
En sortie : l'accumulateur A contient le code retour de fermeture qui est identique à celui d'une ouverture. Idem pour le registre H en CP/M Plus qui contient le code de l'erreur.

TROUVE PREMIER POSTE
DU FICHIER DANS CATALOGUE

Cette fonction n'est en général pas utilisée par un programme d'application, mais plutôt par un utilitaire système, comme un utilitaire de copie sélective ou de visualisation de catalogue, etc. En effet, le but n'est pas d'effectuer une quelconque opération sur un fichier mais uniquement une recherche dans le catalogue.

Le traitement du code USER est identique à une ouverture. En entrée : C = 17 De = adresse d'un FCB contenant une référence de fichier soit unique, soit ambiguë. {Nom, extension et numéro d'extension). En sortie : A contient code retour identique à une ouverture 0 à 3 si OK, OFFH

si aucun fichier trouvé. En CP/M Plus H contient code erreur. En plus, à l'adresse DMA courante (voir plus tard fonction 26) CP/M copie le secteur du catalogue contenant le fichier trouvé.

Référence ambiguë : vous avez la possibilité de mettre n'importe où dans le nom ou l'extension du fichier recherche des ?. Chaque position dans le nom ou l'extension qui contient un ? acceptera n'importe quel caractère lors de la comparaison effectuée pendant la recherche, ainsi une référence de type ESSAI ???.??? renverra un code retour OK dès que l'on trouve dans le catalogue un fichier comprenant les lettres ESSAI comme ,5 premières lettres du nom. Les fichiers ESSAI.TXT, ESSAIS.DOC, ESSAI 01 .BAS par exemple seront tous trouvés (voir exemple 5).

CHERCHE LE SUIVANT

Cette fonction suit normalement la précédente et permet de continuer la recherche dans le catalogue, en repartant de la position du poste précédemment trouvé. Est bien sûr utile surtout dans le cas d'une référence ambiguë (voir exemple 6)

En entrée : C = 18
En sortie : A contient le code retour (0 à 3 OK, OFFH si pas trouvé). En CP/M Plus H contient le code de l'erreur.

EFFACEMENT D'UN FICHIER DU CATALOGUE

Cette fonction permet de supprimer un fichier. Tous les postes associés à ce fichier sont libérés (premier octet à 0E5H) et les blocs alloués deviennent libres. Les données du fichier ne sont pas touchées. Cette opération ne met à jour que le catalogue. Si vous avez supprimé un fichier par erreur, sous réserve de n'avoir plus écrit aucun enregistrement nouveau dans aucun fichier, il est possible de le récupérer en effectuant une mise à jour directe du catalogue. Il suffit de remettre le premier octet de tous les postes correspondant au fichier à la valeur de son USER (0 à 15) (voir exemple 7).

En entrée : C = 19 DE = adresse d'un FCB contenant les nom et extension du fichier à supprimer.
En sortie : A = code retour 0 à 3 OK, 0FFH pas trouvé (Idem Ouverture). En CP/M Plus H contient code erreur.

Le mois prochain nous continuerons par les fonctions de lecture/écriture en séquentiel ainsi que la fonction de création que nous illustrerons par un exemple complet d'utilisation.

Exemple 1

mvi c,9 Affiche message demandant de mettre une disquette en A;
lxi d,MSG
call ;BDOS
Boucle:
mvi c,11 Attente d'une touche
call ;BDOS
ora a
jz ;Boucle
mvi c,13 Réinitialise système disque
call ;BDOS On peut maintenant accéder à la nouvelle disquette
MSG: ;db 'Mettre une disquette en A: puis taper une touche $'

Exemple 2

mvi c,14
mvi e,1 Sélectionne disque B:
call ;BDOS
ora a test code retour en CP/M Plus
jnz Erreur traitement des erreurs
;Suite du traitement

Exemple 3

mvi c,15
Ixi d,FCB1 Ouverture du fichier à traiter
call ;BDOS
inr a si A = 0FH passe à 0
jz ;Erreur Une erreur s'est produite
FCB1:
db ;0 Recherche sur disque courant
db ;'ESSAI' du fichier ESSAI.TX'T
db ;'TXT'
REPT ;36-($-FCB1)
db ;0 Zone de manœuvre
ENDM

Exemple 4

mvi c,16
lxi d,FCB1 Fermeture de notre fichier ESSAI.TXT
call ;BDOS
inr a
jz ;Erreur
FCB1:
db ;0
db ;'ESSAI'
db ;'TXT'
ds ;36-($-FCB1) Zones de travail de CP/M

Exemple 5

mvi c,17
lxi d,FCBBAS Y a-t-il des programmes Basic ?
call ;BDOS
inr a
jz ;Pastrouve Pas de fichier en .BAS
FCBBAS:
db ;2 Rercherche sur disque B:
db ;'?????'
db ;'BAS'
db ;0 extension 0, c'est-à-dire premier poste
ds ;36-($-FCBBAS!

Exemple 6

mvi a,1
sta NBBAS initialise compteur
Boucle:
mvi c,18 Continue recherche des fichiers .BAS
call ;BDOS
inr a
jz ;PlusDeFichier Plus de poste en .BAS
lda NBBAS Incrémente le compteur du nombre de fichiers
inr a
sta NBBAS
jmp Boucle
PlusDeFichier:

Exemple 7

mvi c,19
lxi d,FCBTEMP ; Suppression fichier temporaire
call ;BDOS
inr a
jz ;Erreur
FCBTEMP:
db ;0
db ;'TRAVAIL'
db ;'TMP'
db ;36-($-FCBTEMP)

CPC n°22

★ ANNÉE: ???
★ AUTEUR: Francis VERSCHEURE

Page précédente : Initiation a CP/M (07/xx)

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

Lien(s):
» Coding » Initiation a CP/M (18/xx) (CPC Revue n°25)
» Coding » Initiation a CP/M (02/xx) (CPC Revue n°8)
» Coding » Initiation a CP/M (16/xx) (CPC Revue n°23)
» Coding » Initiation a CP/M (07/xx) (CPC Revue n°13)
» Coding » Initiation a CP/M (04/xx) (CPC Revue n°10)
» Coding » Initiation a CP/M (19/xx) (CPC Revue n°27)
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 156 millisecondes et consultée 1673 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.