- LA DISQUETTE -

I. Présentation

La disquette est un support magnétique. Elle est donc constituée d'une succession de pôles nord et de pôles sud. La tête de lecture-écriture récupère les signaux inscrits sur le support par induction électromagnétique et inscrit les données par magnétisation du support.

Une disquette est physiquement divisée en pistes et en secteurs (voir schéma ci-dessous). Les pistes sont des divisions circulaires concentriques et les secteurs des divisions angulaires. Une disquette peut disposer aussi d'une ou de deux faces (une ou deux têtes).

L'intersection d'une piste et d'un secteur, et cela sur une face donnée, donne lieu à un secteur relatif. Celui-ci est la plus petite unité d'allocation que l'on puisse disposer.

Les pistes sont numérotables de 0 à n-1 (0 étant la piste la plus extérieure), n étant le nombre maximal de pistes disponibles sur ce support. Les secteurs sont également numérotables de 1 à i, i étant le nombre maximal de secteurs formatés.

On peut déterminer ainsi la capacité d'une disquette :

Capacité = nombre de têtes x nombre de pistes par face x nombre de secteurs par piste x taille d'un secteur relatif.

On peut aussi calculer le nombre de secteurs relatifs présent sur la disquette:

Nombre de secteurs = nombre de têtes x nombre de pistes par face x nombre de secteurs par piste.

II. Le hardware

1/ Le support

Il existe deux tailles principales de disquettes souples sur PC : le format 3"1/2 et 5"1/4 (Le 8" est mort avant le PC). Hormis la différence que présente leur boîtier, la principale réside en réalité en la finesse de la granulation du matériau magnétique utilisé. Il en est de même pour les différent types de disquettes.

Format Type Nombre de têtes Secteurs/ Piste Piste/ Face Secteurs / Disque Taille secteur relatifs Capacité (en Ko) Débit en Kbit/s Media descriptor
5"1/4 Simple Densité 1 4 40 160 512 80 125 /
5"1/4 Simple Densité 2 4 40 320 512 160 125 /
5"1/4 Double Densité 1 8 40 320 512 160 250 FEh
5"1/4 Double Densité 2 8 40 640 512 320 250 FFh
5"1/4 Double Densité 1 9 40 360 512 180 250 FCh
5"1/4 Double Densité 2 9 40 720 512 360 250 FDh
5"1/4 Double Densité 1 8 80 640 512 320 250 FAh
5"1/4 Double Densité 2 8 80 1 280 512 640 250 FBh
5"1/4 Haute Densité 2 15 80 2 400 512 1 200 500 F9h
3"1/2 Double Densité 1 8 80 640 512 320 250 FAh
3"1/2 Double Densité 2 8 80 1 280 512 640 250 FBh
3"1/2 Double Densité 2 9 80 1 440 512 720 250 F9h
3"1/2 Haute Densité 2 18 80 2 880 512 1 440 500 F0h
3"1/2 Extra Haute Densité 2 36 80 5 760 512 2 880 1 000 F0h
3"1/2 LS-120 2 ??? ??? ??? 512 120 000 3 000 F8h
??? ZIP 100 64 32 96 196 576 512 100 000 // ou USB ? F8h
??? ZIP 250 ??? ??? ??? ??? 512 250 000 // ou USB ? F8h

Les principaux formats de disquettes.

Ce tableau n'est pas exhaustif. Il comporte seulement les types de disquettes les plus couramment utilisées. Il est néanmoins possible de surformater une disquette, c'est-à-dire amener le nombre de pistes ou de secteurs en dehors des plages conseillées par le constructeur.
De ce fait, il est possible de réaliser des formats de disquettes bâtards. Ceux-ci ne fonctionneront généralement que sur le PC qui les a formater, de plus ils nécessitent un drivers pour que le DOS puissent reconnaître le format et donc l'exploiter.
Je rappelle que l'opération du formatage consiste à créer physiquement les pistes et les secteurs.

Disquette vue avant

Disquette vue arrière

Disquette vue interieur

1 Étiquette.
2 Volet de protection.
3 Protection en écriture.
4 Encoche de détection disquette HD (Haute Densité).
5 Encoche de rotation du disque.
6 Encoches de positionnement de la disquette.
7 Support magnétique qui contient les données.
8 Piste magnétique.
9 Secteur physique.
10 Secteur relatif.

Schéma interne et externe d'une disquette 3"1/2.

Nous avons découvert la disquette. Penchons nous maintenant vers son lecteur.

2/ Le lecteur

Nous allons nous intéresser à son aspect électronique, son aspect mécanique ne nous intéressant pas.
La partie électronique qui gère le lecteur disquette est très vaste. Mais parmi les plus importants composants figure le NEC uPD765 (ou équivalent). C'est le contrôleur de disquette qui s'est imposé comme standard depuis des années. Il est très conseillé de baser la programmation du contrôleur de disquette sur les fonctions du NEC 765A d'origine car tout les contrôleurs ultérieurs sont 100 % compatibles avec celui-ci.

Contrôleurs Marque

Description

uPD765A NEC Le contrôleur de disquette d'origine. 15 commandes de lecture, écriture et formatage.
uPD72065A NEC Amélioration du modèle précédent, 3 commandes supplémentaires pour la réinitialisation et la mise en veille.
uPD72065B NEC Une nouvelle commande qui détermine la version de la puce.
8272A INTEL Clone du 765.
82077AA INTEL Amélioration du 8272 possédant un mode FIFO et le support des lecteurs 2.88 Mo (8 commandes). 
82078 INTEL Totalité des commandes du 82077AA avec le support des lecteurs bandes 2 Mbps/s et ajout de fonctions d'identification matériel.

Liste des principaux contrôleurs que l'on peut trouver sur le marché.

 

Les contoleurs 8272 et uPD765A

Brochage du UPD765A de Nec et du 8272 d'Intel, 2 contrôleurs de disquette très utilisés.

III. Le Software

1/ Accés par le BIOS

Dans un chapitre ultérieur j'aborderais la programmation directe du lecteur de disquette qui nécessite des boucles de synchronisations complexes et la programmation du canal DMA n°2.

N° de sous-fonction Intitulé Description
00h Réinitialisation Permet de réinitialiser le lecteur en cas d'erreurs ou lors de la première utilisation.
01h Lecture de l'état Permet de connaître l'état du lecteur de disquette.
02h Lecture Lit et met en mémoire un ou plusieurs secteurs logiques.
03h Écriture Écrit un morceau de mémoire sur un ou plusieurs secteurs logiques.
04h Vérification Vérifie un ou plusieurs secteurs.
05h Formatage Formate plusieurs pistes.
08h Lecture des paramètres disque Lit le bloc des paramètres disque.
15h Déterminer le type du lecteur Détermine le type du lecteur.
16h Détection ouverture lecteur Détecte l'ouverture du lecteur.
17h Fixer format disquette Fixe le format de la disquette en fonction des formats standards.
18h Fixer format disquette Fixe le format de la disquette.

Fonctions disponibles en utilisant l'interruption 13h du BIOS.

Pour simplifier sa programmation, le BIOS a été pourvue de plusieurs fonctions. Celles-ci étant logées dans l'interruption n°13h. Le DOS est également pourvue de fonctions de lecture-écriture, notamment avec l'interruption 26h et 27h. Mais il va falloir oublier le DOS quand on créé un système d'exploitation.
Nous allons seulement détailler les fonctions 00, 02h et 03h. Ces fonctions réalisent respectivement l'initialisation du lecteur de disquette, la lecture de secteurs et l'écriture de secteurs.

Fonctions Réinitialisation sur lecteur disquette.
Interruption 13h.
Sous fonction 00h.
Entrées AH 00h
DL Numéro du lecteur de disquette.
Sorties AH Code d'erreur si Flag Carry.
Flag carry = 0 Pas d'erreur. AH = 0
Flag carry = 1 Code d'erreur dans AH.
Remarques Appel de cette fonction nécessaire lors de la première utilisation du lecteur de disquette.
 
Fonctions Lecture sur lecteur disquette.
Interruption 13h.
Sous fonction 02h.
Entrées AH 02h
DL Numéro du lecteur de disquette.
DH Numéro de face.
CH Numéro de piste.
CL Numéro de secteur.
AL Nombre de secteurs à lire.
ES Segment du buffer.
BX Offset du buffer.
Sorties AH Code d'erreur si Flag Carry.
Flag carry = 0 Pas d'erreur. AH = 0
Flag carry = 1 Code d'erreur dans AH.
Remarques On ne peut lire que des secteurs consécutifs. 
 
Fonctions Écriture sur lecteur disquette.
Interruption 13h.
Sous fonction 03h.
Entrées AH 03h
DL Numéro du lecteur de disquette.
DH Numéro de face.
CH Numéro de piste.
CL Numéro de secteur.
AL Nombre de secteurs à lire.
ES Segment du buffer.
BX Offset du buffer.
Sorties AH Code d'erreur si Flag Carry.
Flag carry = 0 Pas d'erreur. AH = 0
Flag carry = 1 Code d'erreur dans AH.
Remarques On ne peut écrire que des secteurs consécutifs. 

Détail des fonctions 00h, 02h et 03h.

Après chaque accès au lecteur de disquette par ces fonctions, il est conseiller de vérifier le Flag Carry avec l'instruction JC et il faut immédiatement identifier la raison de l'erreur si erreur il y a. EX:

ReadBootSector:                 ;Sous-programme qui lit le secteur de boot

mov  ah,00h                ;Fonction 0 de l'interruption 13h
int  13h                   ;Exécution de l'initialisation
jc   Erreur                ;Si erreur alors on saute au label erreur
mov  ax,0201h              ;Lire un secteur à partir :
mov  dx,0001h              ;Du lecteur n°1 sur la face 0,
mov  cx,0001h              ;secteur 1 et piste 0.(Secteur de BOOT)
push cs
pop  es
mov  bx,offset Buffer      ;Et mettre le secteur lu en CS:buffer. (ES:BX)
int 13h
jc  Erreur
ret

Erreur:
 < CODE A EXÉCUTER SI ERREUR >

Buffer db 512 dup (0)           ;Allocation de 512 octets pour contenir le secteur lu

Code d'erreur Signification
01h N° de fonction appelée non supporté.
02h Marque d'adresse non trouvée.
03h Tentative d'écriture sur un disque protégé en écriture.
04h Le secteur est introuvable.
06h La disquette est à été enlevée, changée ou n'est pas présente.
08h Dépassement de capacité du DMA. Le transfert est trop lent.
09h Débordement DMA. Un transfert est sortie d'une page de 64 Ko.
0Ch Le type de support est introuvable.
10h Erreur de CRC. Les données lus sont erronées.
20h Erreur sur le contrôleur de disquette.
40h Echec de l'opération de recherche. La piste n'a pas été trouvée.
80h Erreur de time-out. Le lecteur ne réagit pas.

Codes d'erreur renvoyé en AH lors de l'appel d'une fonction disquette de l'interruption 13.

2/ Accés par les ports d'E/S

A suivre............

3/ La Table des paramètres disque/ette (Disk Parameter Table)

Le bios à besoin de tout une série d'informations concernant le lecteur de disquette pour effectuer la programmation du contrôleur.  Celui-ci dispose donc en ROM d'une table pour chaque lecteur existant et chaque format de disquette supporté. Cette table, appelé vulgairement DPT (Disk Parameter Table) est accessible via un pointeur situé dans le vecteur d'interruption 1Eh. A l'adresse mémoire 0000h:1Eh*4, soit en 0000h:0078h est donc situé l'adresse de la DPT. Il est donc possible de modifié cette adresse pour pointer sur une nouvelle table adaptée à nos besoins !!

Le seul intérêt présenté par une personnalisation de la DPT est d'optimiser l'accès au lecteur de disquette ou éventuellement de gérer un lecteur particulier (2.88 Mo). Cette table comprend 11 octets :

ADRESSE CONTENU TYPE EXEMPLE (HD 3"1/2)
00h (bit 0 à 3) Temps de monté de la tête exprimé en multiple de 16 ms. 4 bits
1111b
00h (bit 4 à 7) Vitesse de progression (0Fh=1ms, 0Eh=2 ms, 0Dh=3ms...) 4 bits

1101b

01h (bit 0) État Dma. Ce bit doit rester à 0, il indique que le BIOS utilise le canal DMA n°2 pour ce lecteur. 1 bit
0b
01h (bit 1 à 7) Temps de descente de la tête exprimé en multiple de 2 ms. 7 bits
000001b
02h Temps avant extinction moteur exprimé en multiple de 55 ms (Nombre d'appels de l' interruption 08h). 1 octets
25h
03h Taille du secteur relatif. 1 octets
02h
04h Nombre de secteur par piste. 1 octets
18h
05h Taille du GAP3 en lecture/écriture. 1 octets
1Bh
06h Longueur du transfert de données. 1 octets
FFh
07h Taille du GAP3 en formatage. 1 octets
54h
08h Octet utilisé comme caractère de formatage. 1 octets
F6h
09h Temps de repos des têtes (ms). 1 octets
0Fh
0Ah Temps de montée en vitesse du moteur exprimé en multiple de 125 ms. 1 octets

08h

Pour un total de 11 octets.

Contenu de la DPT, des données sensibles !

Peu de ces champs on d'utilité à être changé, seul le les temps peuvent êtres raccourcis pour optimiser les accès au/x lecteur/s. Je déconseille fortement la modification des autres données. Malgré cela, l'accès à la DPT est très facile, voici une technique très simple :

AccesDpt:

xor ax,ax             ;Met ax à zéro (je rappelle que xor nb,nb est toujours égal à zéro)
mov ds,ax             ;initialise DS à zéro
lds si,ds:[0078h]     ;Récupère l'adresse située en 0000h:0078h dans DS:SI,
                      ;DS:SI pointe sur  la DPT.

Pour optimiser les paramètres de la DPT il faut réaliser une copie de cette dernière dans une partie résidente de la mémoire (Le BIOS doit toujours y avoir accès) puis ensuite il suffit d'altérer les paramètre à notre convenance.

TRAVAUX PRATIQUES
- exercice  n°2 -

Ø Exercice au format TASM O Exercice au format NASM

Étape n° 1  Téléchargez l'exercice qui correspond à votre assembleur.
Étape n° 2  Puis complétez le programme ALTERDPT.ASM avec les valeurs qui vous intéressent.
Étape n° 3  Ø Assemblez-le avec TASM avec la ligne de commande  TASM ALTERDPT/M4/X/T.
O Assemblez-le avec NASM avec la ligne de commande NASM ALTERDPT.ASM -F BIN -O ALTERDPT.COM
Étape n° 4  Ø Liez-le avec TLINK avec la ligne de commande TLINK ALTERDPT /X/T.
O Pas d'opération de linkage.
Étape n° 4  Exécutez TESTDISK, le programme vous donnera un indice de rapidité de votre lecteur.
Étape n° 5  Exécuter ALTERDPT, celui-ci altérera les paramètres de la DPT pour optimiser les accès au lecteur de disquette.
Étape n° 8  Ensuite relancez encore un test avec TESTDISK et comparez les résultats ! 
Étape n° 9  Si les résultats sont satisfaisant, vous pouvez inclure la ligne <Chemin>ALTERDPT.com dans votre autoexec.bat. A chaque démarrage, automatiquement, ALTERDPT modifiera la DPT pour l'optimiser.