
Vous n'êtes pas identifié.
Pages: 1
Voila g tapé tt ca ce soir, et en plus g perdu quelques neurones... lisez si vous en avez le courage, et dites moi ce qui va pas (ou bien)
Le format ROMDISK de la Casio Graph100/Algebra FX 2/FX 1 (+)
version 2 - mastermage <mastermage AT bluelab DOT net>
____________________ Intro :
Le format ROMDISK, utilisé par ROM-DOS pour le stockage des fichiers sur
graph100, n'est autre qu'une déclinaison du système de fichiers FAT de
Microsoft pour MS-DOS.
J'expliquerai ici les differentes parties de ce système de fichiers, mais
vous pouvez toujours aller voir la documentation officielle de Microsoft.
____________________ Generalites :
Les processeurs Intel utilisent un mode de stockage appelé Litte Endian
(par opposition au Big Endian). Pour des raisons historiques (MS-DOS
ayant ete cree sur des PC) le systeme de fichiers FAT est lui aussi en L.E.
Mais qu'est-ce que le Little Endian ? C'est tout simplement de mettre en mémoire
l'octet le moins significatif (le LSB pour Less Signifiant Byte, en anglais)
en premier, et l'octet le plus significatif en dernier (le MSB, le Most
Signifiant Byte).
exemple: la valeur 0x1D4EF28C sera en mémoire 8C F2 4E 1D.
Je ne sais pas pourquoi cette organisation plutôt que l'autre (le Big Endian
est tout simplement le contraire) mais il faut juste s'y habituer.
D'autre part ca signifie que sur une machine de type Intel vous n'aurez rien a
changer (vu que la plupart des gens ont un PC) mais dans le cas d'un Mac par
exemple il faudra faire l'inversion des octets !
Les valeurs précédées d'un 0x sont en hexadecimal, les autres valeurs sont en
décimal.
____________________ Structure d'un lecteur ROMDDISK :
Un système de fichiers de type FAT est composé de quatre zones (dans l'ordre) :
0 - une zone reservée
1 - la zone contenant la File Allocation Table, ou FAT (d'où le nom du système
de fichiers)
2 - la zone du répertoire racine (Root Directory)
3 - la zone des dossiers et fichiers
____________________ Secteur de Boot /BPB :
La première partie importante d'un volume FAT, c'est sa zone reservée, contenant
le BPB (BIOS Parameter Block) qui est situé dans le tout premier secteur du
volume, le secteur communément appelé secteur de boot.
Le BPB est une structure contenant beaucoup d'information très utiles sur le
systeme de fichiers.
j'utiliserai les noms donnés par Microsoft, parce que d'une part ils sont bien
choisis et d'autre part pour s'y retrouver par rapport à d'autres documentations
sur le systeme de fichiers FAT.
Name Offset (octets) Longueur (octets) Description
BS_jmpBoot 0 3 Instruction de saut vers le code de Boot, peut
prendre deux formes differentes:
jmpBoot[0] = 0xEB, jmpBoot[1] = 0x??,
jmpBoot[2] = 0x90
ou
jmpBoot[0] = 0xE9, jmpBoot[1] = 0x??,
jmpBoot[2] = 0x??
0x?? veut dire qu'on peut placer n'importe
quelle valeur dans cet octet. En fait c'est
une instruction de saut inconditionnel, dans le
langage machine x86 (et donc du V30 qui équipe
les graph100s), vers une routine d'
initialisation du systeme d'exploitation.
C'est d'ailleurs le code de Boot qui occupe le
reste de la zone reservee apres le BPB.
La premiere version est plus frequemment
utilisée.
BS_OEMName 3 8 Sur graph100 c'est "DLRDISK" (suivi de la
valeur 0 pour occuper les 8 octets). La
documentation de Microsoft affirme que ce champ
n'est qu'une chaine sans importance indiquant
quel système a formatté le volume , mais aussi
que certains pilotes (drivers) y font
attention. Dans l'incertitude par rapport à la
graph100 mieux vaut utiliser "DLRDISK".
BPB_BytsPerSec 11 2 Nombre d'octets par secteur. Ce champ peut
prendre les valeurs suivantes: 512, 1024, 2048
ou 4096, mais pour un maximum de compatibilité
mieux vaut opter pour 512, ce qui est de toute
façon le meilleur choix sur graph100 vu la
taille des volumes.
BPB_SecPerClus 13 1 Nombre de secteurs par unité d'allocation (ou
cluster). Sur graph100 ce champ est à 1 car le
système de fichiers est sur ROM ou FLASH.
BPB_RsvdSecCnt 14 2 Nombre de secteur constituant la zone reservée
au debut du volume (c'est la zone où nous nous
situons actuellement). Ce champ ne doit pas être
nul, et devrait toujours être à 1 pour des
raisons de compatibilité a cause des drivers ne
faisant pas attention à cette valeur.
(je ne sais pas si la graph100 y fait attention,
mais normallement elle devrait pouvoir utiliser
des valeurs autres que 1)
BPB_NumFATs 16 1 Nombre de structures FAT sur le volume.
Normallement ce champ contient 2 pour avoir une
FAT redondante (en cas de défaillance du disque
dur par exemple) mais sur graph100 il n'y en a
pas besoin vu que le système de fichiers est sur
ROM ou FLASH.
BPB_RootEntCnt 17 2 Ce champ contient le nombre maximal d'entrées de
32 octets dans le répertoire racine (Root
directory) que nous aurons le loisir de voir
plus tard. Cette valeur, multipliée par 32, doit
donner un multiple de taille de secteur (voir
plus haut BPB_BytsPerSec).
BPB_TotSec16 19 2 Ce champ correspond au nombre de secteur du
volume. ce champ ne doit pas etre egal à 0 sur
graph100.
BPB_Media 21 1 La valeur standard de ce champ est 0xF8, ce qui
veut dire que le Media (le support du volume)
est fixe (ne peut pas être enlevé du système),
et c'est le cas pour la graph100.
L'autre point important, c'est le fait que cette
valeur doit être aussi mise dans le premier
octet (Low Byte) de la FAT.
BPB_FATSz16 22 2 Ce champ correspond au nombre de secteur occupé
par une FAT. Il ne doit pas être égal à 0 sur
graph100.
BPB_SecPerTrk 24 2 Secteurs par piste, normallement utilisé par
l'interruption 0x13 pour la géometrie des
disques. C'est inutile pour la graph100, et
cette valeur est à 0xF000.
BPB_NumHeads 26 2 Même remarque que pour le champ précédent.
La valeur sur graph100 est 1.
BPB_HiddSec 28 4 Nombre de secteurs cachés avant la FAT, aussi
utilisé par l'interruption 0x13. Inutile sur
graph100, doit être mis à 0.
Je rappelle que ma description est spécifique à la graph100, certaines remarques
ne sont pas valables pour d'autres materiels.
Une autre chose très importante pour le premier secteur du système de fichiers
FAT: sector[510] = 0x55 et sector[511] = 0xAA. ET CELA QUELLE QUE SOIT LA TAILLE
D'UN SECTEUR (qui de toute facon a une taille supérieure ou égale à 512) !
Enfin, sur graph100, les zones non utilisées sont remplies avec la valeur 0xFF.
____________________ La structure de la FAT (File Alocation Table) :
La seconde partie importante su système de fichiers FAT, c'est la FAT elle-même.
Cette structure définit une simple liste chainée (eh oui il faut revoir vos
algorithmes et structures de données) pour mémoriser les differents emplacements
des morceaux d'un même fichier (la défragmentation sert à optimiser la FAT et l'
emplacement des fichiers, pour qu'un même fichier ne soit plus eparpillé sur
tout un disque dur).
Les fichiers et les dossiers sont traités exactement de la même facon: un
dossier n'est ni plus ni moins qu'un fichier contenantun liste d'autres
fichiers, chaque entrée etant sur 32 octets. La FAT gère des clusters, et le
premier cluster de données est le cluster 2 (on verra pourquoi ensuite)
Sur graph100 1 cluster contient 1 secteur donc il n'y a pas de difference de
taille, mais le secteur 0 est le secteur de boot, alors que le cluster 2 est le
premier secteur de données. Il ne faut pas confondre ces deux termes.
On calclude le premier secteur de données comme ceci sur graph100
(une seule FAT) :
FirstDataSector = BPB_ResvdSecCnt + BPB_FATSz16 + RootDirSectors;
avec RootDirSectors le nombre de secteurs occupé par le répertoire racine, qu'on
peut calculer de la manière suivante :
RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec - 1))
/ BPB_BytsPerSec;
Le type de FAT : Sur graph100 la FAT c'est de la FAT12. Le type de FAT est
déterminé en fonction du nombre de clusters qu'elle doit gérer. Ainsi, pour un
nombre de clusters < 4085 (strictement), le type de FAT est FAT12.
Vu la taille des volumes sur graph100, le systeme de fichiers est
OBLIGATOIREMENT FAT12 ! si vous voulez plus de précisions sur ce genre de chose,
réferrez vous a la documentation officielle.
La FAT12 est plus compliquée a gérer que la FAT16 ou même la FAT32, car alors
que pour ces deux derniers chaque entrée de la FAT est sur 2 ou 4 octets, pour
la FAT12 chaque entrée est codée sur 1.5 octets.
Pour trouver le bon emplacement, il faut faire :
FATOffset = N + (N / 2);
Avec N le numéro du cluster recherché.
Et en termes de secteur :
NumeroSecteur = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
OffsetSecteur = FATOffset % BPB_BytsPerSec;
Il faut maintenant recuperer le numéro de cluster sur 12 bits en mémoire, et ce
n'est pas évident, sachant que les valeurs 12 bits sont codées en L.E., tou en
étant les unes à la suite des autres :
ainsi les valeur 0x012 et 0x345, respectivement 12 0 et 5 43 (on met le 5 a part
car seulement 4 bits pourront être placés dans le premier octet) en L.E. seront
à la suite sous cette forme en mémoire : 12 50 34
On peut proceder de la sorte :
si N est impair: Valeur = Valeur << 4;
si N est pair: Valeur = Valeur & 0x0FFF;
avec N l'index de la valeur qui a servi a calculer FATOffset.
El suffit ensuite de ranger cette valeur 16 bits dans la FAT, à l'endroit
calculé avec FATOffset (attention a effacer les bits correspondants, si N est
impair: c'est & 0x000F et si N est pair: c'est & 0xF000, il suffit
ensuite de faire un OU sur la FAT avec la valeur. )
Et inversement pour récuperer la valeur:, on va chercher dans la FAT la valeur
16 bits, puis:
si N est impair: Valeur = Valeur >> 4;
si N est pair: Valeur = Valeur & 0x0FFF;
avec N l'index de la valeur qui a servi a calculer FATOffset.
Maintenant voila l'organisation de la FAT par rapport aux fichiers :
- le premier octet est la valeur du champ BPB_Media, c'est a dire 0xF8.
- les deux octets suivants sont mis à 0xFF
- ensuite on suit les règles évoquées plus haut : à un numéro de cluster
est associé le numéro du cluster suivant du fichier sauf si c'est le dernier
cluster du fichier auquel cas on mettre comme valeur 0xFFF. (un cluster
defectueux aura la valeur 0xFF7, mais sur graph100 ca n'a aucun intérêt).
Attention ! Les index de cluster commencent à 2 (surement pour pouvoir calculer
plus facilement les adresses en FAT12)
Ce qui donne en pratique: ValeurCluster(NumeroCluster) = NumeroClusterSuivant ou
FinFichier ou SecteurDefectueux.
Voila le principe de la FAT !
____IMPORTANT !____
==> un des meilleurs moyens de comprendre est de regarder une image ROMDISK <==
==> avec un editeur hexadecimal. <==
==> D'autre part les lecteurs généres par les outils de création de lecteur <==
==> ont leurs fichiers sur des clusters contigus. <==
___________________
____________________ La structure des Repertoires - le root
Un dossier dans le systeme de fichiers FAT n'est rien d'autre qu'un "fichier"
composé d'une liste d'entrées de 32 octets. Un seul Dossier doit être TOUJOURS
présent, c'est le répertoire racine (Root Directory). dans le cas de la
graph100, le root est situé dans un emplacement spécial, après la FAT, et n'est
pas compris dans les cluster de données, ceux-ci démarrant APRES le root. La
taille du root est déterminée par le champ BPB_RootEntCnt dans le secteur de
boot.
Son secteur est :
FirstRootDirSecNum = BPB_ResvdSecCnt + BPB_FATSz16;
Voici la structure d'une entrée de 32 octets dans une liste de fichiers :
Name Offset (octets) Taille (octets) Description
DIR_Name 0 11 Nom du fichier
DIR_Attr 11 1 Attributs du fichier :
ATTR_READ_ONLY 0x01
ATTR_HIDDEN 0x02
ATTR_SYSTEM 0x04
ATTR_VOLUME_ID 0x08
ATTR_DIRECTORY 0x10
ATTR_ARCHIVE 0x20
Les deux derniers bits (les plus signifiants)
doivent être mis à 0 lors de la création
du fichier (ils sont censés être resevrés par le
systeme d'esploitation mais sur graph100 ils
sont inutiles car inmodifiables)
DIR_NTRes 12 1 La documentation de microsoft annonce :
"reservé pour WindowsNT". On ne s'en occupe pas
et on met ce champ à 0.
DIR_CrtTimeTenth 13 1 Champ pour les dixièmes de secondes qui sert
pour les... centièmes de seconde.
La précision du champ DIR_CrtTime est de deux
secondes, donc DIR_CrtTimeTenth sera entre 0 et
199 dixiemes de seconde inclus pour combler
cette lacune.
DIR_CrtTime 14 2 L'heure à laquelle le fichier a été créé.
Le format de l’heure, codée sur 16 bits est
Bits 0-4: Secondes/2, 0-29 inclus,
(0-58 secondes)
Bits 5-10: Minutes, 0-59 inclus.
Bits 11-15: Heures, 0-23 inclus.
DIR_CrtDate 16 2 La date à laquelle le fichier a été créé.
le format de la date, codé sur 16 bits est
Bits 0-4: Jour du mois, 1-31 inclus
Bits 5-8: Mois de l'année, 1 = Janvier,
1-12 inclus.
Bits 9-15: Années depuis 1980, 0-127 inclus
(1980-2107).
DIR_LstAccDate 18 2 Date du dernier accès au fichier (il n'y a pas
la gestion de l'heure du dernier acces au
fichier) autant en lecture qu'en ecriture. Si c'
est en ecriture cette date doit être la même que
DIR_WrtDate.
DIR_FstClusHI 20 2 Mot le plus signifiant du numero du premier
cluster du fichier. Toujours à 0 sur un système
de fichiers FAT12 et donc sur graph100.
DIR_WrtTime 22 2 Heure de la dernière écriture sur le fichier. La
création du fichier est considérée comme une
écriture.
DIR_WrtDate 24 2 Date de la dernière écriture sur le fichier. La
création du fichier est considérée comme une
écriture.
DIR_FstClusLO 26 2 Mot le moins signifiant du numero du premier
cluster du fichier, c'est lui seul qui determine
le premier cluster du fichier en FAT12 (et donc
sur graph100)
DIR_FileSize 28 4 Taille du fichier sur 32 bits.
Quelques précision :
- Les attributs de fichier :
ATTR_READ_ONLY L'ecriture sur ce fichier devrait échouer.
ATTR_HIDDEN Le fait de lister un repertoire de doit pas afficher les
fichiers/dossiers cachés.
ATTR_SYSTEM Le fichier appartient au système d'exploitation.
ATTR_VOLUME_ID Il ne doit y avoir qu'un seul "fichier" sur le volume
ayant cet attribut, et ce fichier doit être dans le root
Le nom de ce fichier est le nom du volume. DIR_FstClusHI
et DIR_FstClusLO doivent toujours être a 0 pour le nom
du volume, car aucun cluster n'est associé à cette
entrée.
Sur Graph100, le nom de volume est "ROM-DISK"
ATTR_DIRECTORY Ce ficher est un Dossier, il contient d'autres fichiers.
ATTR_ARCHIVE Cet attribut est mis sur un fichier lorsqu'il a été
modifié, et ce pour que les utilitaires d'archivage
compression puissent déterminer quels fichiers ont été
modifiées depuis le dernier archivage.
- Les dates :
Seuls DIR_WrtTime et DIR_WrtDate sont obligatoires, les autres champs
sont optionnels et peuvent être mis à 0.
- Les noms de fichier :
Considérons DIR_Name comme une tableau de caractères :
* si DIR_Name[0] == 0xE5, alors l'entrée dans le répertoire est libre.
* si DIR_Name[0] == 0x00, alors l'entrée dans le répertoire est libre (comme
pour 0xE5),et il n'y a plus d'entrées allouées
après celle-ci (tous les octets de toutes les
entrées apres celle-ci sont mis à 0).
La valeur 0 indique au système de fichiers que le reste des entrées n'a pas
besoin d'être analysé car elles sont toutes libres.
DIR_Name est constitué de deux parties: le nom(8 caractères) et l'extension
(3 caractères). Les caractères non utilisés sont remplis par le caractère
espace (0x20).
DIR_Name[0] ne doit pas être égal à 0x20 :
Il y a un caractère '.' implicite character entre le nom et l'extension dans
DIR_Name.
Les caractères minuscules ne sont pas autorisés.
Les valeurs suivantes ne sont pas autorisés :
* Valeurs inférieures à 0x20.
* 0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
0x5B, 0x5C, 0x5D, et 0x7C.
____________________ Spécificités des dossiers :
Lors de la création d'un dossier, il faut mettre ATTR_DIRECTORY dans ses
attributs, puis mettre son champ DIR_FileSize à 0 (DIR_FileSize est inutilisé et
toujours mis à 0 avec ATTR_DIRECTORY), on determinera alors la taille d'un
dossier en calculant le nombre de clusters qu'il occupe grâce à la FAT.
Un cluster est alloué au dossier et on modifie le champ DIR_FstClusLO pour qu'il
pointe sur le cluster alloué, puis on place une marque de fin de cluster sur le
cluster du dossier dans la FAT. Ensuite on initialise tous les octets du cluster
à 0.
On doit ensuite créer deux entrées :
le première doit avoir pour nom "." et la deuxième "..", c'est la seule
exception à la rêgle des noms de fichiers.
Le champ DIR_FileSize de ces deux entrées est mis à 0, et tous les champs de
date et d'heure de ces entrées sont mises aux mêmes valeurs que pour le dossier
que l'on vient juste de créer, puis on fait pointer DIR_FstClusLO de "." sur le
cluster du nouveau dossier, et DIR_FstClusLO de ".." sur le cluster du dossier
parent (0 si le dossier parent est le root)
____________________ Spécificités des fichiers :
Si un secteur n’est pas completement utilise par un fichier, il faut le combler
avec la valeur 0xFF.
____________________ Historique /Remerciements / etc ... :
Version 2 - plus de précisions :)
Version 1 - Incomplet, plein d'erreurs...
Merci à mes doigts, ma tête, le café, Superna qui a retrouvé la premiere version de ma doc, 2072 (Touche parce que je le vaux bien),
microsoft (c'est tres rare, mais bon la doc sur le FAT ca vient de chez eux),
et tous les autres...
Hors ligne
____________________ Spécificités des dossiers :
Si un secteur n’est pas completement utilise par un fichier, il faut le combler
avec la valeur 0xFF.
tu t planté de titre a la fin !
et de rien d'avoir retrouvé ton ancienne doc.......
Hors ligne
Voila c rectifié
lol c vrai superna... MERCI :mrgreen:
Hors ligne
Dommage Mastermage que tu donnes ceci un peu tard, parce que moi g cherché tout seul avec un éditeur héxadécimal pour savoir comme ca marche 
Hors ligne
bon et interressant document, mais faudrait peut ètre des images pour illustrer un peu... mais a part ça c' est niquel!
Hors ligne
je vais le faire en html
dada: au moins maintenant tu as la doc complete !
Hors ligne
ds secteur de boot /BPB:
"beacoup"->"beaucoup"
à BPB_bytspersec
"facon"->"façon"
à BPB_rsvdseccnt
"actuellment"-> "actuellement"
dans DIR_CrtTimeTenth13
tu te delire un peu trop... mais bon ça passe si on réécrit le texte ainsi :
DIR_CrtTimeTenth13 1 Champ pour les dixièmes de secondes qui sert
pour les... centièmes de seconde.
La précision du champ DIR_CrtTime est de deux
secondes, donc DIR_CrtTimeTenth sera entre 0 et
199 centièmes de seconde inclus pour combler
cette lacune.
à attr-archive
"archvage"->"archivage"
après -les noms de fichier...
"une tableau"->"un tableau"
puis les valeurs autorisées...
"and"->"et"
et enfin à la fin de spécif des dossiers ton texte est en anglais...
voilà tout ce que j'ai remarqué...
sinon très bien j'ai apris des trucs interessents !
Hors ligne
enfin un qui a lu jusqu'au bout
merci beacoup ronanker, c'est corrigé
Hors ligne
Pages: 1