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 */
};