Suivez-nous sur X
|
|
|
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
|
|
|
|
Programmation : GFA Basic - trackdisk.device
(Article écrit par Pierre-Philippe Launay et extrait d'Amiga News Tech - février 1992)
|
|
Il existe plusieurs fonctions très agréables pour lire les fichiers, mais elles sont insuffisantes pour
une véritable gestion des secteurs. Il faut alors utiliser les structures et les routines propres au système.
Vous savez que toutes les routines C ont été réécrites en GFA 3.52F, aussi nous ne serons pas vraiment dépaysés.
La démarche est tout à fait identique, voire un peu plus simple en GFA : le trackdisk.device utilise bien
sûr une structure d'entrée-sortie étendue (IOExtTD). Pour plus de détails, je vous conseille de lire
le message des Thaïlandaises de Max dans l'ANT 24,
ainsi que la Bible de l'Amiga pages 357, 543 et 687. Voici ce que cela donne pour notre programme :
Ainsi, une structure Message est associée à un message ne devant pas dépasser 64 ko. Ce nombre est
une limite qui peut avoir ses contraintes.
GFA et C, mon général !
Les bibliothèques et les périphériques logiques (devices) ont une logique de base assez semblable,
ou tout au moins assez similaire (gasp, j'ai dû dire la même chose). Les structures d'unité sont
également assez classiques et nous devons seulement savoir que nous disposons ici des unités DF0:
à DF3: et que nous écrirons pour cela 0, 1, 2 ou 3 dans l'IO.
- iodata contiendra l'adresse où débutent les données à lire. Attention, le système s'avère
ici particulièrement ségrégationniste : tout d'abord, celles-ci doivent avoir une taille au minimum
égale à 512 octets, ce qui élimine Super OctetoPhage. Le pauvre. Et ensuite on ne pourra les trouver
qu'en mémoire Chip (MALLOC).
- io_offset doit également toujours être un multiple de 512 octets. Il n'est donc pas
possible de se positionner à cheval sur deux secteurs en écrivant par exemple 300.
- iotd_count indique le nombre d'insertions et de retraits de disquettes dans le lecteur.
Cette valeur augmente de 2 pour un simple échange de disquettes. Or, comme la valeur de référence
correspond au dernier réamorçage du système, un nombre impair signalera immanquablement un lecteur
vide et un nombre pair, la présence d'une disquette.
- iotd seclabel doit avoir 16 octets d'un seul tenant et est soit réservé aux lettres du
droit d'auteur, soit rempli avec des 0. SuperOctetoPhage y écrit d'ailleurs un 0 par lettre
de son nom et comme il dit, personne ne pensera à les modifier.
Toujours du C, mon général !
Il reste à parler de la structure ReplyPort :
Et enfin du GFA, mon général !
Tout cela nous permet de savoir où nous allons et grâce aux remarques, le codage se laissera
ainsi déchiffrer très facilement.
On trouve d'abord l'adresse de notre propre tâche par la méthode "longue" : FindTask(0).
Il existe en effet la possibilité de remplacer cette ligne par un appel direct plus rapide à la
structure Exec à la position 276, appelé justement ThisTask, mais attention, ce procédé ne peut
fonctionner qu'avec la recherche de notre propre tâche car ce pointeur n'indique que la tâche
actuellement traitée et ne peut donc indiquer les autres tâches. Ouf, Super OctetoPhage peut
reprendre sa respiration après cette longue tirade. Nous modifions ensuite le pointeur mp_sigtask et
nous pouvons alors nous ajouter au système.
Et que le périphérique logique soit
L'ouverture du dispositif se fait bien entendu avec la fonction OpenDevice(). Voici les erreurs possibles :
- 0 IOERR_NOERROR
- -1 IOERR_OPENFAIL : l'a pas lu.
- -2 IOERR_ABORTED : fin provoquée par l'action ABORTIO().
- -3 IOERR_NOCMD : commande impossible.
- -4 IOERR_BADLENGTH : longueur impossible.
- 20 TDERR_NOTSPECIFIED : erreur du trackdisk non reconnue.
- 21 TDERR_NOTSECHDR : absence d'en-tête de secteur.
- 22 TDERR_BADSECPREAMBLE : mauvais préambule du secteur.
- 23 TDERR_BASECID : mauvaise interruption disquette dans le secteur.
- 24 TDERR_BADHDRSUM : mauvaise somme de contrôle du gestionnaire.
- 25 TDERR_BADSECSUM : mauvaise somme de contrôle du secteur.
- 26 TDERR_TOOFEWSECS : pas assez de secteurs sur la piste.
- 27 TDERR_BASECHDR : en-tête de secteur illisible.
- 28 TDERR_WRITEPROT : disquette protégée contre l'écriture.
- 29 TDERR_DISKCHANGED : lecteur de disquette vide.
- 30 TDERR_SEEKERROR : mauvaise position de la tête de lecture.
- 31 TDERR_NOMEM : pas assez de mémoire.
- 32 TDERR_BADUNITNUM : lecteur de disquette non connecté.
- 33 TDERR_BADDRIVETYP : mauvais lecteur de disquette.
- 34 TDERR_DRIVEINUSE : lecteur déjà en cours d'utilisation.
- 35 TDERR_POSTRESET : pas d'accès autorisé après réinitialisation.
Voilà. Nous lirons les données grâce à Io et celui-ci modifiera la structure diskio%
avant de se lancer avec ~DoIO(). L'affichage du secteur tient compte de quelques décalages spécifiques,
puis nous libérons le système.
|