Obligement - L'Amiga au maximum

Jeudi 18 avril 2024 - 02:37  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in english


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : Assembleur - initilisation d'un gestionnaire
(Article écrit par Frédéric Delacroix et extrait d'Amiga News - mars 1998)


Le mois dernier, je vous ai tracé les grandes lignes de fonctionnement d'AmigaDOS. Il est temps aujourd'hui de passer à l'étude concrète du fonctionnement d'un gestionnaire de périphérique.

Structure d'un gestionnaire

J'en ai déjà un peu parlé, les gestionnaires sont des processus. Ils sont chargés, quand besoin est, par la routine LoadSeg() d'AmigaDOS depuis des fichiers exécutables, qui résident généralement dans le répertoire L:. Avant d'aborder l'écriture de ce programme, voyons comment il est déclaré au sein d'AmigaDOS. Vous le savez probablement, pour reconnaître un nouveau périphérique, le DOS a besoin d'une liste de montage ("mountlist"), ainsi nommée parce qu'elle est utilisée par la commande "mount". Au temps des DOS pré-2.1, tous les gestionnaires étaient identifiés dans le fichier (texte) Devs:Mountlist.

Les choses ont évolué depuis et la commande "mount" est devenue un peu plus intelligente, ces gestionnaires sont décrits dans des fichiers textes séparés, habitant dans le répertoire Devs:DOSDrivers.

Dans ce fichier on trouve principalement le nom du gestionnaire à charger (handler = L:machin-handler), la pile qui lui est nécessaire (stack...), la priorité, le vecteur global (j'en parlerai plus loin), et de nombreux autres paramètres, parmi lesquels "device=truc.device", dont la seule présence indique au DOS que le gestionnaire en question est un système de fichiers. La programmation d'un gestionnaire de fichiers étant une toute autre paire de manches, je laisserai cela de côté. Tous ces paramètres peuvent être dans le fichier lui-même, ou dans les types d'outil de l'icône (ceux-ci ont la priorité).

Le paramètre spécial "Mount" indique (=1) qu'il faut initialiser le gestionnaire tout de suite ou (=0) lors du premier accès. Mais en quoi consiste ce montage ? Le DOS répertorie simplement les informations de la liste de montage dans sa liste interne qui contient les spécifications de tous les périphériques, les volumes et les assignations. Cette liste est constituée de structures DosList, qui se déclinent en trois appellations (struct DeviceNode, Devinfo ou DeviceList). La première de ces structures est pointée par le champ dl_DevInfo de la structure DosInfo (c'est son seul champ documenté), elle-même pointée par le champ rn_Info de la structure Root-Node, qui peut être considérée comme une extension de la structure DosLibrary et pointée par le champ dl_Root de celle-ci (ouf).

Certains de ces pointeurs sont des BPTR. Attention donc, il faut les multiplier par 4 avant usage. D'ailleurs, depuis le Kickstart 2.0, l'accès à cette liste de DosList est protégée par un sémaphore, il ne faut donc pas aller se servir soi-même dans la liste de la dos.library. Il faut désormais passer par les fonctions GetDeviceProc() et FreeDeviceProc(). Elles peuvent également servir à résoudre des assignations ou obtenir des informations sur un volume, la fonction DeviceProc() étant considérée comme obsolète depuis le Kickstart 2.0. La fonction GetDeviceProc() obtient le sémaphore et retourne un pointeur sur une structure DevProc (ne vous mélangez pas les pinceaux avec toutes ces structures) qui contient, entre autres, un pointeur sur la structure DeviceProc (ou DosList) du gestionnaire.

Pour ce qui est de la structure DosList, on y retrouve essentiellement les informations de la liste de montage. Je ne vais parler que de ce qui concerne les gestionnaires. Le champ dol_Type indique s'il s'agit d'un périphérique (DLT_DEVICE), d'une assignation (DLT_DIRECTORY) ou d'un volume (DLT_VOLUME). Depuis la version 2.0 du système, il y a également les assignations déférées (DLT_LATE) et non liantes (DLT_NONBINDING), dont je parlerai peut-être dans un prochain article. Il y a aussi DLT_PRIVATE, qui comme son nom l'indique...

Le champ dol_Task pointe sur le champ pr_MsgPort de la structure Process du gestionnaire (c'est ce qu'on appelle le ProcessID), dol_Handler contient un pointeur BCPL sur le nom (chaîne BCPL) du fichier à charger pour activer le gestionnaire, dol_StackSize contient la taille de sa pile, dol_Priority sa priorité en tant que tâche Exec. Le champ dol_Startup sert à passer des paramètres au démarrage du gestionnaire : il correspond au champ spécial "Startup=" de la liste de montage. On peut y mettre ce que l'on veut (pour un gestionnaire de périphérique, toujours). Le champ dol_SegList contient la liste de segments du gestionnaire s'il a déjà été chargé. C'est le résultat de LoadSeg() qui servira à libérer la mémoire en cas de mort du gestionnaire. dol_Name contient (BSTR) le nom du gestionnaire et il reste le champ dol_GlobVec.

Ce fameux GlobVec est une réminiscence du BCPL, langage étrange s'il en est. Pour nous, il faut toujours mettre sa valeur à -1, ou éventuellement à -2 (depuis le Kickstart 2.0). La différence entre les deux se situe au niveau du verrouillage de la liste des DosLists pendant l'initialisation du gestionnaire : avec -1, la liste est totalement verrouillée et aucun accès n'est permis, ce qui peut poser des problèmes de blocage si le gestionnaire a besoin d'accéder à un autre gestionnaire pendant son initialisation. Avec -2, la liste est juste verrouillée en lecture seule, et de telles opérations deviennent possibles. Tout ceci se range dans la catégorie "haute sorcellerie".

Le message de démarrage

Donc, lorsqu'il est chargé depuis le disque, le programme du gestionnaire commence son exécution comme un quelconque programme. Pour savoir ce que le DOS compte faire de lui, il doit attendre et lire le message de démarrage spécial qui lui est envoyé à son port pr_MsgPort. Il s'agit d'un DosPacket, dont le contenu est le suivant : dp_Arg1 contient le nom du périphérique tel qu'il a été invoqué, dp_Arg2 le contenu du champ dol_Startup de la structure DosList et dp_Arg3 un pointeur BCPL sur la structure DosList.

Le gestionnaire doit alors procéder à toutes les initialisations nécessaires. Il peut également créer un nouveau processus (cas du gestionnaire de console). Quoiqu'il en soit, il doit, soit mettre dans le champ dol_Task son ProcessID, soit laisser ce champ à zéro et fournir un pointeur sur un autre port de message dans le champ dp_Arg4 du message de démarrage. Si toute l'initialisation se passe bien, il faut répondre au paquet avec DOSTRUE en dp_Res1. Sinon, c'est DOSFALSE en dp_Res1 et le code d'erreur en dp_Res2, et il faut quitter. Si tout se passe bien, il n'y a plus qu'à attendre l'arrivée de nouveaux DosPackets et à les traiter.

Ce sera l'objet le mois prochain de la dernière partie de cette série d'articles, avec (enfin) l'écriture d'un vrai gestionnaire de périphérique. Bon courage.


[Retour en haut] / [Retour aux articles] [Article précédent] / [Article suivant]