20/08/2021

Un micro-ordinateur FLEX/6809 DIY - Partie 4

 Dans cet article on va s'intéresser aux lecteurs de disquettes et au format des disques Flex. On va également voir quelques outils qui vont nous permettre de créer le disque de démarrage de Flex09.



Les lecteurs de disquette

Au cours de l'histoire il y a eu différents formats de disquettes, les principaux étant 8 pouces, 5 pouces 1/4 et 3 pouces 1/2 (et on va citer 3 pouces juste pour ne pas fâcher les possesseurs d'Amstrad CPC !)

Mécaniquement une disquette est toujours faite de la même manière, avec un disque souple dans une enveloppe souple (8 et 5.25 pouces) ou rigide (les autres formats), avec une fenêtre permettant à la tête de lecture de parcourir le disque.

Il y a un index près du centre du disque permettant de savoir quand on a fait 1 tour et un autre indicateur sur le bord du disque que l'on peut ouvrir ou fermer pour indiquer que le disque est protégé en écriture.

Schéma d'une disquette (Le Haut-Parleur N°1687 - décembre 1982 - description du Tavernier 6809)

Dans la suite on va s'intéresser uniquement aux disques 3.5 pouces, qui sont ceux que l'on va utiliser dans cet ordinateur.

Un lecteur de disquette est un appareil assez "basique", ses principaux éléments sont :

  • un moteur CC qui permet de faire tourner le disque à 300 tours/minutes (vitesse asservie via l'index sur la disquette)
  • un moteur pas à pas qui permet de faire avancer ou reculer la tête de lecture sur les pistes
  • un détecteur pour savoir quand la tête est sur la piste zéro
  • une (ou 2) tête(s) de lecture, permettant de lire et écrire les données sur le disque. 

Et c'est à peu près tout ! L'intelligence est fournie par le contrôleur de disque connecté à l'autre bout de la nappe, dans notre cas c'est le WD1770.

La surface magnétique d'une disquette est divisée en pistes et en secteurs. Sur un disque 3.5 pouces il y a 80 pistes, qui vont être divisées en secteurs, ce qui va donner aux données une forme de "parts de camembert" (voir l'illustration en tête de cet article).

Contrairement à ce que l'on pourrait penser, les secteurs ne sont pas définis en fonction de leur position angulaire par rapport à l'index, mais ils sont plutôt définis logiciellement (outre atlantique on nomme cela "soft sectored"), avec un en-tête indiquant où se site chaque secteur sur la piste.

Voici un exemple tiré d'un Handbook Western Digital (http://www.bitsavers.org/components/westernDigital/_dataBooks/1986_Storage_Management_Products_Handbook.pdf)

Comme on le voit dans cet exemple le secteur occupe 598 octets pour 256 octets de données utiles, le reste servant à synchroniser le flux de données, identifier le secteur et contrôler son intégrité avec la somme de contrôle (CRC). 

Si on reprend l'illustration en tête d'article les données utiles sont représentées en vert, les données d'identification de secteur sont représentées en vert clair et les endroits "vides" sont en bleu foncé. 

L'opération de formatage d'une disquette consiste d'ailleurs entre grande partie à définir ces secteurs (le reste étant de définir la structure logique du disque, avec la liste des secteurs libres et un directory initialement vide).

Sur le disque en lui même, les données peuvent être stockées en simple densité ou bien en double densité. Dans le premier cas l'encodage utilisé sera le FM et dans le deuxième en MFM (Modified FM).

Encodage FM/MFM (Le Haut-Parleur N°1687 - décembre 1982 - description du Tavernier 6809)


L'encodage FM divise chaque cellule d'information en 2 impulsions :

  • une première toujours présente qui représente l'horloge
  • une deuxième qui est présente si le bit est à 1, et absente si il est à 0

L'encodage MFM est un peu plus compliqué. Par rapport au signal FM :

  •  on enlève le signal d'horloge et on ne garde que la deuxième impulsion correspondant au bit d'information
  • une exception : on conserve le signal d'horloge si le bit précédent était à 0 et que le bit courant est également à zéro

Cette complexité ajoutée permet de diminuer grandement le nombre d'impulsions, ce qui en pratique permet d'avoir le double d'informations dans le même espace.

 

Lire un fichier sur une disquette revient donc à lire un ensemble de secteurs répartis sur la surface du disque (on va voir tout de suite après comment ils sont organisés dans le cas de Flex). 

Pour faire cela au niveau du contrôleur de disquette il faut lui envoyer trois commandes différentes :

  • Restore, qui va tout simplement positionner la tête de lecture sur la piste zéro (vu qu'on ne sait pas sur quelle piste se situe la tête lorsqu'on allume l'ordinateur !)
  • Seek, qui prend en paramètre la piste et le secteur, et va effectuer 2 actions :
    1. positionner la tête de lecture sur la bonne piste
    2. chercher sur la piste le secteur demandé, éventuellement renvoyer une erreur s'il ne le trouve pas
  • Read, qui comme son nom l'indique va renvoyer les 256 octets de données du secteur

 Le contrôleur WD1770 ne gère pas sur quelle face du disque on effectue l'opération, c'est pourquoi ce rôle est effectué par le PIA 6821 (PSIDESELECT) et va directement sur le connecteur du lecteur de disquette.


Les disquettes Flex

Le format d'une disquette Flex est relativement simple. 

Sur une disquette 5 pouces 1/4, chaque piste est divisée en 10 secteurs contenant 256 octets de données utiles. On peut avoir les données sur une ou deux faces, en simple ou double densité. Une petite subtilité : en double densité la piste 0 reste en simple densité, ce qui facilité la lecture du disque (toutes les informations importantes étant sur cette piste, il n'est du coup pas nécessaire de gérer 2 densités différentes pour y accéder). Et on peut avoir des lecteurs de disques avec 40 ou 80 pistes.

Cela donne les capacités suivantes (SF/DF simple face/double face, SD/DD simple densité/double densité, 40/80 40 ou 80 pistes), sur quelques exemples :

  • SF/SD/40 : 100Ko
  • DF/SD/40 : 200Ko
  • DF/SD/80 : 400Ko
  • DF/DD/80 : 800Ko

 Les secteur ne sont pas contigus sur une piste, mais ils sont décalés d'un "demi-tour", c'est à  dire que le secteur 1 est en face du secteur 2, le secteur 3 en face du secteur 4, etc.. Cela donne un ordre physique des secteurs de 1,3,5,7,9,2,4,6,8,10. 

L'idée est de laisser à l'ordinateur du temps (une demi-rotation du disque) pour "digérer" le contenu d'un secteur avant de lire le suivant, afin de lui éviter d'avoir à attendre un nouveau tour complet pour lire le secteur qui suit.

Dans le cas d'un disque double-face, les secteurs de la première face sont numérotés de 1 à 10, et ceux de la deuxième face de 11 à 20. Comme on le verra cela permet d'ajouter très peu de code au pilote de disque pour passer d'une gestion simple à double face.


La piste 0 est décomposée comme suit :

  • secteur 1 : boot sector
  • secteur 2 : suite du boot sector (si il ne tient pas dans le secteur 1)
  • secteur 3 : informations générales sur le disque
  • secteur 4 : non utilisé
  • secteurs 5 à 10 : directory

A noter que dans la documentation on nous dit que sur la piste 0 les secteurs sont numérotés à partir de 0 et qu'il n'y a pas de secteur 2. Ce n'est pas ce que j'ai vu sur quelques dumps de disquettes que j'ai pu faire, donc dans mon système j'ai numéroté les secteur de la piste 0 de 1 à 10.

 Reprenons chaque élément en détail :

Le secteur de boot

Ce secteur contient le code machine permettant de charger en mémoire le contenu du fichier FLEX.SYS, ou plus précisément le contenu du fichier commençant à la piste/secteur référencée par les octets 5 et 6 du secteur de boot. 

Une fois le fichier chargé, la dernière instruction du secteur de boot est un saut vers le point d'entrée de Flex.

256 octets peuvent paraître peu pour faire tout cela, mais c'est largement suffisant (le code du secteur de boot que j'utilise fait 206 octets !)

On reverra cela plus en détail dans la prochaine partie.


Informations sur le disque

Il s'agit d'une suite d'enregistrements décomposés comme suit :

  • $10 à $1A : Nom du volume
  • $1B/$1C : Numéro de volume (bit de poids fort en premier)
  • $1D : première piste utilisateur libre
  • $1E : premier secteur utilisateur libre
  • $1F : dernière piste utilisateur
  • $20 : dernier secteur utilisateur
  • $21/$22 : nombre total de secteurs
  • $23 : mois de création
  • $24 : jour de cration
  • $25 : année de création (sur un octet, bug de l'an 2000 ....)
  • $26 : max piste
  • $27 : max secteur

 Les octets $1D/$1E (premier piste/secteur utilisateur libre) sont le début d'une liste chaînée, sur un disque vide cela sera initialisé à piste 1/Secteur 1. Ensuite chaque secteur vide commence par 2 octets indiquant les coordonnées du prochain secteur vide.

Les octets $26/$27 donnent la plus grand numéro de piste/secteur disponible, permettant d'en déduire la géométrie du disque

Le directory

Les secteurs du Directory sont composés des champs suivants :

  • $00 : prochaine piste
  • $01 : prochain secteur
  • $02 à $0F : vide
  • Une série de champs de 24 octets décrivant une entrée de fichier

Une entrée de fichier est composée des champs suivants :

  • $00 à $07 : nom du fichier (8 caractères)
  • $08 à $0A : extension (3 caractères)
  • $0D : première piste du fichier
  • $0E : premier secteur du fichier
  • $0F : dernière piste du fichier
  • $10 : dernier secteur du fichier
  • $11/$12 : nombre total de secteurs du fichier
  • $13 : indicateur si le fichier est à accès aléatoire
  • $15 : date de création
  • $16 : jour de création
  • $17 : année de création

On remarque qu'il n'y a nulle part la taille du fichier en octets, et effectivement un fichier Flex a toujours une taille multiple d'un secteur, c'est au logiciel d'ignorer les derniers octets inutiles.

Les fichiers

Les informations fournies dans le directory permettent de lire le contenu d'un fichier. Une fois la bonne entrée trouvée (avec le nom du fichier), on récupère le contenu du secteur pointé par les octets $0D/$0E. 

Un secteur de fichier ressemble à cela :

  • $00 : prochaine piste
  • $01 : prochain secteur
  • $02/03 : numéro de séquence
  •  $04-$FF : contenu du fichier

Pour lire un fichier il faut donc récupérer le contenu à partir du 4ème octet du secteur. La suite du fichier se trouve à la prochaine piste/secteur indiquée dans les octets $01/$02 (c'est encore une liste chaînée). Ces octets contiennent 0/0 si on est arrivé à la fin du fichier.

Le numéro de séquence commence à 1 et est simplement incrémenté à chaque nouveau secteur lu. Si tout va bien à la fin du fichier on a lu le nombre de secteurs indiqué dans l'octet $10 de l'entrée de directory, et le dernier couple piste/secteur qu'on a lu correspond aux valeurs indiquées dans les octets $0F/$10

Créer une disquette Flex

Pour pouvoir démarrer Flex, il va nous falloir une disquette bootable contenant le système d'exploitation.

On va déjà s'occuper de créer la disquette, on la rendra bootable par la suite.

Pour commencer il faut trouver un disque Flex, j'ai pour cela utilisé le disque TSCFLX09.DSK récupéré dans l'archive disponible sur le site https://www.simonwynn.com/flex 

C'est une image disque de 88Ko (SF/SD/35 pistes) qui contient un fichier très important : FLEX.COR. Il s'agit du code exécutable de Flex sans les drivers disque et console, et qui va permettre de réaliser le portage du système vers ma carte.

Dans le guide d'adaptation de Flex, ce fichier est censé se trouver à la piste 1/secteur 1. Ce n'est pas le cas sur cette image disque (et sur à peu près aucune autre où j'ai trouvé le fichier FLEX.COR ...). Ce n'est pas grave car on va recréer un nouveau disque "sur mesure".

J'utilise pour cela le programme FlexPlorer (https://flexemu.neocities.org/) C'est un outil qui permet de lire et écrire des images disque au format Flex.

On va faire la version la plus simple en simple face/simple densité/40 pistes. Pour cela sélectionner File > New Container et indiquer que l'on veut 40 pistes et 10 secteurs par piste :

 
Ensuite charger le fichier TSCFLX09.DSK(File > OpenContainer) :
 

Pour créer le disque, il suffit de glisser-déposer en premier le fichier FLEX.COR dans le disque vide, puis de faire la même chose pour les autres fichiers. Ainsi on est sûrs que FLEX.COR sera sur la piste 1/secteur 1. On peut omettre le fichier FLEX.SYS vu qu'on va le recréer.

 

Il n'y a pas d'option de sauvegarde dans FlexPlorer, le conteneur se met à jour à chaque opération. Il suffit de fermer le logiciel une fois les opérations terminées.

On va maintenant passer sur un deuxième outil pour retraiter ce fichier et en faire une image que l'on va pouvoir écrire sur un vrai disque. Il s'agit de HxC http://hxc2001.free.fr/floppy_drive_emulator/ , qui est le logiciel accompagnant l'émulateur de disque du même nom.

Tout d'abord une petite subtilité qui m'a fait chercher quelques jours : j'ai indiqué qu'une piste contient 10 secteurs, et sur mon système Flex je vais utiliser des disquettes 3 pouces 1/2. Si on regarde comment est faite une disquette au format DOS, on constate qu'une piste comporte seulement 9 secteurs.

Si on essaie d'écrire sans précaution le fichier dsk que l'on vient de créer, HxC ne va rien dire mais va générer des pistes un peu trop longues qui vont rendre le dernier secteur de chaque piste illisible !

Un autre point d'attention est la numérotation des secteurs qui va commencer à partir de zéro par défaut, et du coup rien ne va fonctionner car on va être décalé de 1 secteur (j'ai testé !).

HxC permet de gérer tout cela via l'option 'Load Raw Image'. On va ici lui expliquer à quoi doit ressembler la géométrie du disque :

  • Track Type : IBM FM
  • Number of Track : 40 ou 80
  • Numer of Side : 1 ou 2
  • Sector per track : 10 (simple face) ou 20 (double face)
  • Sector ID start : 1
  • Interleace / Skew /Side Based : 5 / 0 / Side Based coché
  • GAP3 lenght : 9 (c'est ce paramètre qui permet aux 10 secteurs de tenir sur une piste)

J'ai également fait quelques profils tout prêts à récupérer sur le github (dans software/hxc) et à charger via le bouton "Load config" du formulaire.

 
Puis cliquer sur "Load RAW file" et sélectionner le fichier créé avec FlexPlorer.

On peut aller faire un tour dans le menu "Track Analyzer" pour observer l'image disque. Tout d'abord en sélectionnant le View mode "Track view" on peut regarder le contenu de chaque secteur :
 

 Sur la piste 0 par exemple, on voit bien l'ordre des secteurs 1,3,5, etc ... Et on voit que dans le secteur 5 (en haut à droite) on a bien le fichier FLEX.COR en premier, piste 1 secteur 1.
 
Sur la vue  '3"1/2 135 TPI' on peut observer la géométrie physique du disque et la répartition des 10 secteurs sur sa surface.
 

Enfin, l'option 'Export' permet de créer l'image. J'utilise une carte Kryoflux https://www.kryoflux.com pour écrire mes disques depuis un PC, donc je sélectionne le format d'export "KF Stream File"

 

La Kryoflux est une petite carte qui se connecte d'un côté en USB sur le PC et via une nappe standard sur un lecteur de disquette. Son utilisation principale est l'archivage de disquettes anciennes, car cette carte sait faire des images "parfaites" de disques en enregistrant directement les changements de phase du flux magnétique, sans se soucier du format des données.

La carte permet également d'écrire en retour les données sur une disquette, si on lui fournit dans son format natif.

Pour écrire notre disque Flex, il faut donc brancher un lecteur de disquettes 3 pouces 1/2 sur la Kryoflux, et lancer la commande suivante :
 
dtc -w -f<le fichier raw> -e80
 
Je n'ai pas essayé d'autres moyens pour générer le disque. Il y a encore du logiciel à écrire mais à terme on devrait pouvoir le faire directement avec la carte 6809 !

Un dernier point important, le disque est en double densité : pour pouvoir le relire avec un lecteur 3 pouces 1/2 standard (prévu pour de la haute densité) et des disquettes "récentes" de 1.44Mo, il faut boucher l'ouverture en haut à gauche sur la disquette. 

Sur certains lecteurs cela peut aussi se faire via des jumpers, pour ça il faut trouver la documentation technique correspondant.

Conclusion

Et voilà nous sommes en possession d'une disquette de boot de Flex au bon format mais qui n'est pour l'instant pas bootable et ne contient pas non plus le fichier FLEX.SYS nécessaire au lancement du système d'exploitation

Nous allons remédier à tout cela dans le prochain épisode !

Ressources