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 : Assembleur - Lister les types de périphériques logiques
(Article écrit par Max et extrait d'Amiga News Tech - juin 1991)
|
|
Une des possibilités les plus intéressantes d'AmigaDOS est de permettre la définition de périphériques
logiques (devices) destinés à faciliter la progression de l'utilisateur dans les méandres de ses répertoires.
Tous ceux qui programment le système de l'Amiga le savant maintenant : il n'y existe qu'une seule adresse fixe,
celle du pointeur sur la structure ExecBase. Toutes les autres structures importantes dont allouées dynamiquement
à l'initialisation de la machine et peuvent donc se trouver n'importe où en mémoire, suivant la configuration
actuelle (extensions, périphériques...). C'est pourquoi Exec est entièrement construit autour du principe fort,
simple mais très astucieux des listes a des noeuds : pour un type donné de structure chacune indique l'adresse
de sa "fille" (la suivante) et éventuellement, dans le cas des noeuds, celle de sa "mère" (la précédente).
Le seul inconvénient de ce système est que si la liste n'est pas triée suivant au moins un critère, il faut la
parcourir entièrement pour y retrouver un élément donné. Ceux qui ont déjà tâté des listes chaînées et autres
arbres binaires savent de quoi je veux parler.
AmigaDOS, malgré le handicap certain que lui procure sa parenté BCPL, est construit de la même manière. Dans
le cas qui nous intéresse, celui des périphériques logiques, la structure DosLibrary contient un pointeur,
le premier de la liste, qui pointe sur le second, lui-même pointant sur le troisième, etc.
Arrivé ici, il convient de faire la distinction entre les périphériques au sens Exec et les périphériques
au sens AmigaDOS. Pour le premier, un périphérique est une couche logicielle (un ensemble de
routines) destinée à gérer une partie du matériel : trackisk.device, audio.device, etc.
AmigaDOS, quant à lui, distingue trois type de périphériques :
- Les physiques. Ce sont les lecteurs de disquette DFx:, l'interface sérielle
SER: et parallèle PAR:. etc.
- Les logiques. Ce sont les répertoires qui ont été assignés avec la commande Assign
comme Libs: ou S:.
- Les volumes. Il s'agit ni plus ni moins que du nom réel de la disquette et/ou du
disque dur, comme "Workbench:", "Work:" ou "Extras:".
La relation entre les deux types est les périphériques logiques AmigaDOS font appel aux
périphériques logiques Exec. Ainsi, DF0: utilise le trackdisk.device. DH0:, le hddisk.device
ou le scsi.device... Certains font plutôt appel aux gestionnaires (handlers) que l'on trouve
dans le répertoire L: de la disquette Workbench : le Aux-Handler pour AUX:, le Speak-Handler
pour Speak:, etc. Ce sont alors ces gestionnaires qui se chargent de communiquer avec le
ou les périphériques logiques et bibliothèques adéquats, la seule exception étant RAM:
qui ne communique avec rien d'autre que la mémoire, et n'a donc pas besoin de périphérique
logique particulier.
Parcourir les listes
Comme on l'a dit plus haut, tous les périphériques logiques AmigaDOS chargés en mémoire sont
chaînés entre eux, afin de permettre au système de les trouver facilement.
Ainsi, pour savoir quels sont les périphériques logiques présents à un moment donné - par exemple,
dans le but de bâtir une requête de fichiers proposant un gadget pour chaque périphérique logique -
il suffit de parcourir la liste en filtrant éventuellement les données jugées inintéressantes.
Le début de cette liste se trouve dans la structure DosLibrary. On y trouve un pointeur sur
une structure RootNode contenant elle-même un pointeur BCPL sur une structure DosInfo, dans
laquelle on trouvera, enfin, un pointeur BCPL sur la structure DeviceList du premier
périphérique logique chargé. Cette structure DeviceList est en fait soit une structure DeviceNode,
soit une structure DevInfo, suivant le type du périphérique logique concerné. En C, on appelle
cela une union.
Toutes ces structures sont définies dans "libraries/dosextens.i" et "libraries/filehandler.i".
On y trouve au même décalage un mot long indiquant le type du périphérique logique qui peut être :
- DLT_DEVICE (0) : périphérique physique.
- DLT_DIRECTORY (1) : périphérique logique.
- DLT_VOLUME (2) : volume.
Le meilleur moyen de parcourir cette liste est donc de le faire en trois étapes,
une pour chaque type de périphérique logique. C'est ce que fait le programme
proposé ci-dessous.
Le programme
Son but est d'afficher dans la fenêtre CLI ou Shell courante, la liste de chaque type de
périphériques présents au moment de son exécution. L'affichage se fait en trois passes,
histoire de bien séparer les trois types. Pour les périphériques physiques (type DLT_DEVICE),
le nom du périphérique Exec ou du gestionnaire utilisé est également affiché.
Curieusement, c'est l'assembleur qui se prête le mieux à ce genre de manipulation, notamment à
cause de sa facilité à jouer avec les pointeurs et les chaînes de caractères BCPL.
Le même programme en C aurait obligé à faire appel à des routines de conversion
BSTR vers CSTR.
En bonus, vous y verrez comment gérer l'interruption utilisateur par l'appui sur Ctrl-C.
Rien, à part peut-être ma belle-mère, n'est plus énervant qu'un programme qui ne s'arrête
pas quand on le lui demande.
|