Obligement - L'Amiga au maximum

Lundi 29 mai 2017 - 15:19  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

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

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


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


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


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Soutien

N'hésitez pas à soutenir le projet Obligement



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 de l'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() de l'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 de l'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]