Device Trackdisk
Un article de GuruMed.
Par Iliak
Dans ce texte, nous allons étudier le trackdisk.device. Ce device permet de gérer de manière très précise les lecteurs de disquette.
Présentation
Le trackdisk.device gère directement les lecteurs de disquette (4 au maximum sur l'amiga : Df0:, Df1:, Df2:, Df3:). En temps normal, vous n'avez pas besoin d'y accéder si vous voulez écrire ou lire des données car ce device est dis de "bas niveau". En effet, le système accède à celui-ci directement et par aucun autre moyen. En plus des commandes classiques des devices, celui-ci en possède deux privées :
| TD_GETGEOMETRY | Obtient des informations sur le disque |
| TD_EJECT | Ejecte le disque |
La disquette standard pour l'amiga est la disquette 3,5 pouces. Elle est formée de 80 cylindres qui contiennent chacun 2 têtes. Sur une tête est lu un track. Un track comprends 11 (NUMSECS) secteurs de 512 (TD_SECTOR) octets plus 16 (TD_LABELSIZE) octets d'en-tête. Le nombre de tracks est obtenue en utilisant la commande TD_GETNUMTRACKS. Attention, le nombre de secteurs (NUMSECS) peut changer d'une disquette à l'autre ! Il faut utiliser TD_GETGEOMETRY pour déterminer le nombre de secteur (le résultat retourné est le nombre de tracks et non le nombre de cylindres).
Les commandes
Voici la liste des commandes reconnues par ce device :
| CMD_CLEAR | Marque le track invalide et force le track à être relue |
| ETD_CLEAR | vérifie l'insertion d'une nouvelle disquette. |
| CMD_READ | Lis un ou plusieurs secteur d'une disquette |
| ETD_READ | lis l'entête de secteur et vérifie l'insertion d'une nouvelle disquette |
| CMD_UPDATE | Vide le buffer et écrit le track si nécessaire |
| ETD_UPDATE | vérifie l'insertion d'une nouvelle disquette |
| CMD_WRITE | Ecris un ou plusieurs track |
| ETD_WRITE | écrit l'entête de secteur et vérifie l'insertion d'une nouvelle disquette |
| TD_ADDCHANGEINT | Ajoute une interruption à chaque insertion de disquette |
| TD_CHANGENUM | Retourne le nombre d'insertion de disquette utilisé par les commandes ETD_ |
| TD_CHANGESTATE | Indique si une disquette est présente ou non |
| TD_EJECT | Ejecte la disquette |
| TD_FORMAT | Formate un track avec les données fournis |
| ETD_FORMAT | initialise aussi le 'sector label area' |
| TD_GETDRIVETYPE | Retourne le type de disquette dans le lecteur |
| TD_GETGEOMETRY | Retour la table de géomètre de la disquette |
| TD_GETNUMTRACKS | Retourne le nombre de track utilisable sur la disquette |
| TD_MOTOR | Allume ou éteint le moteur du lecteur |
| ETD_MOTOR | vérifie l'insertion d'une nouvelle disquette |
| TD_PROSTATUS | Indique si la disquette est protégée ou non |
| TD_RAWREAD | Lis un track de données brutes |
| ETD_RAWREAD | vérifie l'insertion d'une nouvelle disquette |
| TD_REMCHANGEINT | Enlève une interruption précédemment installée |
| TD_SEEK | Bouge la tête de lecture à une position spécifique |
| ETD_SEEK | vérifie l'insertion d'une nouvelle disquette |
Ce device utilise deux types de requêtes d'Entrée/Sortie (E/S), IOStdReg et IOExtTD et deux types de commandes, les standards et les étendues. Une structure étendue est nécessaire pour l'utilisation des requêtes étendues (celles commençant par ETD_), mais celles-ci peuvent toute fois être utilisées pour les requêtes standard. Ainsi, il est recommandé de n'utiliser que des structures IOExtTD pour la gestion du trackdisk.device. Voici les structures IOStdReg et IOExtTD () :
struct IOStdReq
{
struct Message io_Message;
struct Device *io_Device; /* Pointeur vers le device */
struct Unit *io_Unit; /* Unité (spécifique au device)*/
UWORD io_Command; /* Commande du device*/
UBYTE io_Flags;
BYTE io_Error; /* Numéro de l'erreur */
ULONG io_Actual; /* Nombre d'octets actuellement transféré */
ULONG io_Length; /* Nombre d'octets demandé*/
APTR io_Data; /* Pointeur vers la zone mémoire */
ULONG io_Offset; /* Offset */
};
struct IOExtTD
{
struct IOStdReq iotd_Req; /* Structure standard */
ULONG iotd_Count; /* Nombre de changement de disquette */
ULONG iotd_SecLabel; /* Entête de secteur */
};
