Suivez-nous sur Mastodon

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Dossier : Agencement des disquettes Amiga (v3.2)
(Article écrit par Gi@nts et extrait de sasfepu78.ddns.net - janvier 2025)
|
|
Le jargon technique
En français
En français, on utilise des termes comme : piste, bloc, secteur, face...
- Piste : 0 à 79. Certaines disquettes poussent jusqu'à 81, voire 82 pistes mais le standard reste quand
même 80 pistes (de 0 à 79).
- Face : 0/1 ou 1/2 ou A/B (dessus ou dessous tout simplement). Sur Amiga, nous avons deux faces
utilisées sur 99% des disquettes de jeux.
Chaque piste, pour un format standard "AmigaDOS", est composée de plusieurs blocs ou secteurs, en général
11 par face. Le terme "piste" peut désigner l'ensemble d'une piste (les deux faces, alias "sides", de la disquette),
ou uniquement une "face" d'une piste. Une piste standard AmigaDOS est découpée en plusieurs parties
appelées bloc, secteur.
En anglais
En anglais, on utilisera d'autres termes comme : sector, key, track, cylinder, head...
Le terme "track", par exemple, que l'on aurait vite fait de traduire par "piste", ne colle pas forcément
à notre description française. En général, le terme "track" désigne toujours une position sur la
disquette mais elle va de 0 à 159 (soit 160 tracks). Le maximum étant 160 et non 80 car on a deux faces
bien sûr, en fait, elle correspond à une piste sur une face.
Il peut néanmoins arriver que l'on utilise
dans des tutoriels anglo-saxons le terme tracks dans le sens "piste" en français (donc de 0 à 79 et non
de 0 à 159). Mais en règle générale, il a plutôt une plage de 0 à 160.
C'est le terme "cylinder" qui colle le plus à notre définition française de piste. En effet, il est
courant d'utiliser le terme cylinder pour désigner une position sur la disquette de 0 à 79.
Le terme "sector" ou "key", quant à lui, correspond au terme français "bloc" ou "secteur".
Sur une disquette au format AmigaDOS, nous avons 880 ko et nous avons 11 secteurs par face, par piste.
La taille d'une piste a une valeur physique maximum.
Le nombre maximum de sector sur une piste dépend assez logiquement de la taille de ses sectors.
Bref... il y a beaucoup de termes qui ne sont pas forcément utilisés dans leur sens propre, le mieux
est de lire un tutoriel et de comprendre quel sens l'auteur a voulu leur donner.
MFMWarp
Il existe aussi un autre type d'appellation, utilisé par exemple par le logiciel MFMWarp de Ferox.
C'est un programme qui examine la disquette en bas niveau et essaye d'en réaliser une copie.
On notera que :
- Le premier secteur (secteur 0) appelé aussi "bootblock", commence sur la "lowerSide" en piste 00
et se finit en piste 79 sur l'"upperside".
- Pour les "tracks", c'est le même système sauf que l'on terminera en track 179 et non 79.
- La piste zéro est celle située le plus à l'extérieur de la disquette.
- Le premier secteur logique, donc le premier bloc sur la disquette, se trouve en piste 0 secteur 0.
Les blocs se suivent physiquement mais ne sont pas forcément ordonnés, on parle aussi d'entrelacement.
- Le bloc 11 (si on part de 0, bien sûr) n'est pas le premier secteur de la seconde piste mais le
premier secteur de la face suivante (voir image ci-dessus).
- En format AmigaDOS, la taille d'un secteur est de 512 octets. Ce qui nous donne comme taille disponible :
512*11 secteurs*80 pistes*2 faces = 901 120 octets, soit 880 ko. Un "track" AmigaDOS
a une taille de 512*11 = 5632 en décimal, soit $1600 octets.
Mise en application avec Action Replay
Il existe deux commandes sous l'Action Replay qui permettent de charger et sauver des pistes, à savoir :
RT et WT. Elles fonctionnent de la même manière. L'une permet la lecture, l'autre l'écriture.
- #RT alias "Read Track". Permet le chargement de données situées sur la disquette vers la mémoire.
- La première valeur sera le track de départ [0 à 159] à indiquer en hexadécimal. Attention à ne pas confondre
avec "piste".
- La seconde valeur sera le nombre de demi-pistes (tracks donc) à copier à partir de là.
- #WT alias "Write Track". Permet la sauvegarde de données situées en mémoire vers la disquette.
Exemples
Start Track = $20 et taille à lire = 1.
On copiera donc la piste !16 (en décimal) face 0 en mémoire $50000.
Oui, car 20 est donné en hexadécimal, ce qui nous donne !32 en décimal mais il indique un track (de 0 à 159)
pas une piste. Pour avoir l'équivalent en piste, on divisera donc par 2 (car deux faces).
$20/2=$10 = !16 (en décimal donc) et comme il n'y a pas de retenue, on est sur la face 0.
Start Track = $21 et taille à lire = 2.
On copiera la piste !16 face 1 et la piste !17 face 0 en mémoire $50000.
21 est donné en hexadécimal, donc $21 = !33 en décimal. 33/2 = 16.5, donc piste 16 face 1
et comme on continue à lire/copier les données (taille à lire = 2), on continue la copie.
On change donc de track car on est déjà sur la face 1 (il n'existe que deux faces sur une disquette).
On arrive donc sur le prochain track, à savoir piste 17 en face 0, puisque que c'est la première face au
niveau structure, la face 0.
Les secteurs
On peut aussi adresser une disquette avec la notion de secteur. Comme on l'a vu au-dessus, une disquette
AmigaDOS fait 80 pistes (0-79), 2 faces et 11 secteurs par piste. Chaque secteur fait 512 octets.
Si on fait le calcul, cela nous donne : 80*2*11=1760 secteurs. Ainsi, on peut avoir une position
exacte en secteur sur une disquette Amiga avec une valeur entre 0 et 1759.
Exemple : "DiskBlock Position 520" correspond au secteur 03 de la piste 23 sur la face 1. On peut aussi
fonctionner en mode "RAW", directement en adressant en octet. Cela dépend du chargeur de piste/secteur (alias "trackloader") en question.
Nuances OFS/FFS et formats personnalisés
Il faut rappeler que sous OFS (Old File System), chaque bloc de données de 512 octets sacrifie 24 octets.
On a donc 488 octets réservés aux données utilisateur, les 24 octets restants étant occupés par des
en-têtes et des pointeurs de chaînage (vers le bloc précédent, le bloc suivant, etc.).
Le FFS (Fast File System), introduit avec le Workbench 1.3, corrige ce défaut majeur en utilisant les 512
octets complets du bloc pour les données, déportant la gestion des pointeurs dans les structures de
métadonnées. C'est ce qui améliore nettement le débit de transfert et gagne de l'espace utile.
La capacité réellement utilisable pour vos fichiers dépendra du ainsi du système utilisé :
- En FFS, l'espace de données brut approche les 880 ko, moins le bloc racine ("root block"), la table d'occupation
des bloc ("bitmap") et les en-têtes de fichiers ("file headers).
- En OFS, en raison du surcoût des 24 octets par secteur, la capacité utile maximale descend à environ 839 ko.
Petite précision sur le bloc racine mentionné ci-dessus : ce "Root Block" est positionné de façon très spécifique
au centre exact de la disquette : à la piste 40 (secteur 880). Ce choix d'ingénierie par Commodore n'était pas
un hasard : placer la table des matières au milieu réduisait de moitié le déplacement moyen de la tête de lecture
de l'Amiga lorsqu'elle devait chercher un fichier, optimisant ainsi les temps d'accès.
En outre, la très grande majorité des jeux Amiga n'utilisaient pas l'agencement AmigaDOS décrit dans cet article.
Pour des raisons de protection contre la copie et pour optimiser la vitesse de chargement, les développeurs
créaient leurs propres chargeurs de piste personnalisés. Ils s'affranchissaient des blocs de 512 octets pour
écrire une piste entière d'un seul bloc (parfois plus de 5500 octets d'un coup). C'est ce qui affichait le
célèbre message "DF0:NDOS" (Not a DOS disk) sur le Workbench, alors que le jeu fonctionnait parfaitement en
l'amorçant sur le lecteur de disquette.
Le format MFM (Modified Frequency Modulation) sur structure AmigaDOS
Sur Amiga, le format standard est de 11 secteurs. Il est géré par Paula (puce MOS 8364).
| Pre-Sync/Padding |
2 octets [4 octets MFM]
Au format MFM : $AAAA.
Avant le mot de synchronisation ("syncword") proprement dit, le lecteur a besoin d'une petite série d'octets
réguliers (souvent une suite de zéros) pour stabiliser son horloge interne sur
la vitesse de rotation de la disquette. C'est une zone de transition qui "prépare
le terrain" (le Pre-Sync) ou qui comble le vide en maintenant le signal stable
(le Padding). |
Sync (synchronisation) |
2 ou 3 octets (2 selon la documentation. 2 ou 3 en réel)
Le résultat nous donne : 2 x $4489
qui est le mot de synchronisation ("syncword"). Ce dernier est une séquence fixe
et unique de 2 octets, très souvent $4489 sur Amiga (format MFM).
Cette signature ne peut pas se retrouver par hasard dans les données normales.
Quand la tête de lecture physique du lecteur "voit" ce mot passer sous elle,
elle sait exactement où commence le premier bit du secteur.
Aucune donnée ne sera jamais convertie dans ce motif (en MFM).
Le système s'assure ainsi que, lors de la conversion des données en signaux
magnétiques, ce motif spécifique ne puisse jamais apparaître par hasard au
milieu d'une image, d'une musique ou d'un bout de code. Si cela arrivait, le
lecteur de disquette croirait à tort qu'un nouveau secteur commence en plein
milieu de vos données ! |
SectorHeader (en-tête du secteur) |
4 octets [8 octets MFM]
En-tête du secteur. C'est la zone qui contient les métadonnées du secteur
(comme son numéro, le numéro de la piste, la face de la disquette et la taille des
données).
- Track : numéro de piste (0-79). 1 octet.
- Side : tête (0/1). 1 octet.
- Sector : numéro de secteur (0-10). 1 octet.
- Length : taille secteur encodé*. 1 octet. (* $00=128, $01=256, $02=512, $03=1024).
|
Spécifique (Gap3a) (intervalle)
| 16 octets [32 octets MFM] - zone utilisée
C'est la zone technique de "write splicing" (synchronisation d'écriture).
"3a" fait référence à sa position exacte dans la norme ISO/IBM de formatage des disquettes.
Sert à stabiliser la tête, remplissage libre mais souvent $00. |
| HeaderChecksum (somme de contrôle de l'en-tête) |
4 octets [8 octets MFM]
Somme de contrôle de la zone d'en-tête.
Elle est calculée en utilisant un XOR et ne contient que des bits
de données ("databits"). Elle permet au lecteur de vérifier que l'en-tête n'est
pas corrompu avant de lire la suite. |
DataChecksum (somme de contrôle des données) |
4 octets [8 octets MFM]
Somme de contrôle de la zone de données ("data"). Elle est calculée en utilisant
un XOR et ne contient que des bits de données ("databits"). Même principe que le
précédent, mais appliqué au bloc de données principal. Si cette clé est fausse
lors de la lecture, l'ordinateur affiche une erreur de lecture. |
Data (zone de données) |
512 octets [1024 octets MFM]
Bloc de données. C'est le coeur du secteur, l'endroit où sont réellement stockés les octets utiles
du programme (généralement 512 octets par secteur). |
À noter qu'il n'y a pas d'espace intersectoriel ("gap") entre chaque
secteur. La documentation indique en fin de trame : Data puis DataCheckSump
mais, en réel, c'est l'inverse comme l'indique le tableau ci-dessus.
Le format MFM (Modified Frequency Modulation) sur structure classique, IBM, Atari
On fait un peu de hors-piste en regardant chez le voisin. La zone des données ("data")
sur les tracks d'une disquette à la structure standard est généralement
codées/décodées au format MFM mais le WD1772 (puce du contrôleur disque)
gère aussi le format FM. Contrairement à l'Amiga, le WD1772 traite les
secteurs comme des entités séparées, et pas comme un flux brut bit à bit
à reconstruire par le logiciel. Sur Atari ST, on trouve le plus souvent un
standard de 9 secteurs.
GAP1 (intervalle 1) |
50-80 octets
L'octet de remplissage est $4E. C'est une zone tampon initiale composée d'octets de remplissage neutres ($4E).
Elle protège le début du secteur contre les décalages physiques et les variations
de vitesse du moteur de la disquette. |
IDAM (marqueur d'adresse d'identification) |
3 octets
(A1) converti au format MFM et l'impulsion d'horloge ("clock pulse") n'est pas prise en
compte. Cela nous donne : $A1 A1 A1 + marque de début $FE. Équivalent du
mot de synchronisation. Elle sert de "top départ" ultra-précis pour avertir
le contrôleur qu'un en-tête de secteur commence immédiatement. |
SectorHeader (en-tête de secteur) |
4 octets
En-tête du secteur. Ce bloc contient la carte d'identité du secteur, détaillant son numéro de piste,
la face de la disquette, son propre numéro et sa taille. Ces informations permettent
à la tête de lecture de vérifier qu'elle se trouve bien au bon endroit sur la disquette.
- Track : numéro de piste (0-79). 1 octet.
- Side : tête (0/1). 1 octet.
- Sector : numéro de secteur (1-11). 1 octet.
- Size : taille du secteur encodé*. 1 octet. (* $00=128, $01=256, $02=512, $03=1024).
|
CRC Header (somme de contrôle de l'en-tête) |
2 octets
CRC16 sur IDAM + Header.
Il s'agit d'une clé mathématique de 2 octets calculée à partir des données
de l'IDAM et du SectorHeader. Le lecteur l'utilise pour s'assurer qu'aucune
interférence n'a corrompu les informations d'identification du secteur. |
GAP2 (intervalle 2) |
22 octets
Octets de remplissage avant données, l'octet de remplissage est $4E.
Cette zone intermédiaire isole l'en-tête du bloc de données à venir. Elle
offre un espace de sécurité indispensable lorsque le lecteur doit réécrire les
données sans risquer d'écraser l'en-tête qui précède. |
DAM (marqueur d'adresse de données) |
3 octets
$A1 A1 A1 + $FB pour données normales, $F8 pour lecture seule.
Semblable à l'IDAM, ce marqueur utilise trois octets $A1 modifiés suivis d'un
octet spécifique ($FB ou $F8). Il annonce officiellement au contrôleur que les
octets qui suivent immédiatement sont les données utiles de l'utilisateur. |
Data (zone de données) |
128-1024 octets
512 octets sur Atari ST standard. C'est le coeur utile du secteur qui stocke
le contenu réel du fichier/programme (généralement 512 octets sur Atari ST).
Sa taille peut varier de 128 à 1024 octets selon le codage défini dans l'en-tête. |
CRC Data (somme de contrôle des données) |
2 octets
CRC16 sur le marqueur d'adresse de données ("Data Address Mark") + zone des données (Data).
Cette dernière clé de 2 octets sécurise l'intégralité du bloc en vérifiant
conjointement le DAM et les données lues. Si le calcul ne correspond pas, le
système d'exploitation bloque la lecture et renvoie une erreur de disque. |
GAP3 (intervalle 3) |
Octets restants
Remplissage jusqu'au secteur suivant, $4E par convention.
C'est la zone finale de la piste qui utilise les octets restants (généralement
remplis de $4E) pour combler l'espace jusqu'au secteur suivant. Elle sert de
tampon dynamique pour absorber les infimes variations de vitesse du moteur de
la disquette d'un secteur à l'autre. |
La conversion en MFM est faite selon le principe suivant : prenez 2 bits de
données et ajoutez 1 d'horloge ("clock") entre les deux. Le bit d'horloge
est à "1" si les 2 bits de données sont à "0". Sinon, le bit d'horloge est à "0".
Ce système permet de ne pas avoir de longue série de 0 ou de 1 qui se suivent.
Un exemple
Bit de données : 0 0 0 1 1 0 1 1 ...
Bit d'horloge : ? 1 1 0 0 0 0 0 0...
Encodage MFM : ?0101001010001010...
|
Chaque octet est converti en mot ("word"). Comme l'extension d'octets est assez
compliquée à réaliser sur Amiga, les données sont d'abord divisées en deux moitiés.
Les impaires et les paires. Les premiers bits à être convertis sont les bits pairs
et ensuite les bits impairs.
Binaire : 01001110
Bits pairs : 0 0 1 1
Bits impairs : 1 0 1 0
|
Cela permet un traitement des données plus rapide car l'extraction des moitiés
paires et impaires peuvent être réalisées facilement via des opérations logiques
"AND".
Moitié pairs : DATA `AND' 0xAAAA
Moitié impairs : DATA `AND' 0x5555
|
Pour extraire les données d'une disquette, vous devez en premier trouver le
mot de synchronisation ("syncword") qui est l'endroit où démarre les données
sur le track. Le mot de synchronisation est en fait un marqueur.
Les spécifications d'un lecteur de disquette parfait
Un lecteur de disquette parfait aura :
- Une fenêtre de bit de 2 µs (intervalles physiques de 2 µs, 4 µs, 6 µs et 8 µs entre les impulsions).
- Une vitesse de rotation de 300 tr/min (soit 200 ms par rotation).
- 100 000 cellules de bit par rotation (flux brut/transitions magnétiques).
- 50 000 bits par rotation (après décodage MFM).
- 6250 octets par rotation.
Disquette Atari ST vierge :
Disquette Amiga vierge :
|