L'article qui s'en vient provient de HPisteurs N°4. ______________________________________________________________________________ Notre ami Kernel : le noyau. Lorsque vous allumez votre HP, qu'est ce qui la fait marcher, comment se fait il que nous ayons un bel affichage, que lors des appuis sur les touches, le texte s'inscrive sur l'écran... C'est le noyau. On appelle noyau le programme qui tourne en permanence et qui permet de se servir de sa HP. Ce programme see trouve bien évidemment en ROM. Mais cela ne veut pas dire qu'il faille laisser tomber et passer à autre chose. Il est très facile de récupere ce programme et de le modifier de manière à personnaliser sa HP. Le noyau se trouve en #3858Eh. C'est ce programme External: PRG $ 385A7h @noyau en lui-même $ 04EB8h @THEN (iferr) $ 17B86h @Out Of Memory END C'est à dire que un IFERR est effectué en ASM avant de lancer ce programme, il exécute le programme en #385A7h qui réalise l'affichage et tout le reste. Si le #385A7h provoque une erreur (obligatoirement un Insufficient Memory), le 17B86 est lancé (c'est le programme qui fait le Out of Memory). Voyons donc en détails le $ 385A7h qui le coeur du noyau. C'est aussi un programme External. PRG $ 385E8h @Initialisation $ 071A2h @DO $ 40BC9h @Clear Command Number $ 3866Fh @Gestion des menus $ 386A1h @Affichage $ 4203Ch @Wait Event $ 04E5Eh @IFERR $ 40454h @Eval $ 04EB8h @THEN $ 38728h @Affichage des erreurs $ 071ABh @LOOP END A l'initialisation, la machine crée un grand entier qui servira à récupérer de la mémoire en cas de Out of Memory (elle le purgera). Puis elle arme tous ses flags, et enfin, elle teste s'il n'y a pas une erreur du type Memory Clear ou Alarms ou Warning invalid card datas, et si elle existe, elle l'affiche. Puis vient le DO, c'est un d"but de boucle sans fin! Le 40BC9 réinitialise le gestionnaire d'erreur. L'external de gestion des menus vérifie si l'on a pas changé de menus, et le cas échéant recherche les objets à afficher dans chacunes des 6 cases. Et vient ensuite l'affichage. Il sera décrit plus en détails plus tard. Le Wait Event est le programme de gestion des touches. Principalement, il attend un évenement (alarme, appui sur une touche, auto OFF, entrée RS232) et le gère. Si l'évènement est un appui sur un etouche, il pause le programme à executer sur la pile. Ensuite, vient la structure IFERR... L'évaluation est très particulière. En effet elle est dépendante du type. Par exemple, si c'est un caractère qui est sur la pile, le EVAL le mettra dans la ligne de commande qu'il créera le cas échéant. Si c'est un XLIB, ile RClera et recommencera l'opération, si... Le EVAL est donc le véritable coeur du noyau, c'est lui qui fait tout. En cas d'erreur lors de l'exécution du Eval, c'est le 38728 qui est lancé, il sortira alors de l'environnement, sauf si l'erreur est un Invalid Syntax, il fera un Garbage Collector et affichera l'erreur. On en finit par le LOOP qui revient au DO! La boucle est bouclée. Voyons maintenant ce qu'on peut faire de ce programme. La première idée (le plus simple) est de faire un petit BEEP à chaque appui sur une touche. il suffira pour ce faire de placer un 1000 .01 BEEP (en External bien entendu, l'emploi de RPL étant déconseiller pour sa lenteur et le fait qu'il stocke sans arret les Xlib Name pour les message d'erreurs) juste après le 4203C. Il faut alors recompiler et lancer. C'est magique, ça marche (pourvu que le flag -56 soit désarmé). On pourrait aussi faire un petit programme qui inverse la touche des menus sur laquelle on appui! C'est simple, il suffit de faire un petit programme qui teste si le programme posé sur la pile par le 4203C est l'un des 6 programmes associés à l'appui sur une touche de menu et dans ce cas de l'inverser (le plus simple est de faire le programme en assembleur. Il suffit alors de tester si l'adresse du programme dans la pile et l'une des six adresses et alors d'inverser directement le sous grob du graphique des menus) Nous allons maintenant creuser l'affichage PRG $ 38F41h @IF Stack à afficher $ 39B85h @stack $ 38F28h @IF Header à afficher $ 3959Ch @Header $ 38F5Ah @IF Cmd Line à afficher $ 3A00Dh @Cmd Line $ 38F73h @IF Menus à afficher $ 3A1CAh @Menus $ 39144h @freeze END La HP commence par tester si elle doit réafficher la pile. Il n'y a pas besoin de la réafficher si on vient juste de rajouter un caractère (qui n'est pas toujours un retour à la ligne) dans la ligne (déjà existante) de commande (ouf, comme vous pouvez le voir, ce n'est pas si simple que ça). Puis le cas échéant, elle affiche la pile. Ensuite, c'est le même problème pour le header puis pour la ligne de commande et enfin pour les menus. La machine remet ensuite à jour les flags system qui servent à indiquer si on doit ou non réafficher les différentes zones. Pour modifier de façon sensible l'affichage, il suffit donc de modifier ce programme. Par exemple, le header (qui le plus simple à modifier). Un petit programme assembleur à la noix commançant par afficher un GROB en haut de l'écran puis une série d'information est très simple à réaliser. On pourrait par exemple facilement indiquer la mémoire libre. L'affichage de la pile peut très facilement être modifier pour afficher en 5 lignes (ou plus). Mais si on veut gérer le multi-lignes, c'est tout de même plus compliqué!!! Par contre, il est déconseiller de toucher à l'affichage de la ligne de commande car elle n'est pas entierement affiché ici. En effet, lors de l'ajout de caractères, la machine l'affiche dans le 40454 et met un freeze pour éviter l'affichage ici. Votre routine ne serait donc appelée qu'une fois sur deux, ce qui ne serait pas toujours du meilleur effet. Il est évidemment possible d'enlever la gestion des freezes et d'afficher votre ligne de commande à chaque fois. Il suffit d'avoir une routine assez rapide (il n'est de toutes manières pas difficiles de faire plus rapide que HP!!!). Les menus, sont eux très facilement modifiables. Vous pourriez par exemples afficher des cases rondes au lieu des horribles cases carrées! Voyons maintenant un dernier programme facilement modifiable, la gestion des erreurs: PRG $ 387BEh @ 'Initialise' la gestion des erreurs (sort des environement imbriqués) $ 04CE6h @ ressort le numero d'erreur ¤ 0h $ 618D3h @ si c'est l'erreur 0 $ 3881Dh @ gestion de l'erreur 0 ¤ 13Eh $ 618D3 @ si c'est l'erreur KILL $ 3875Fh @ Gestion du KILL ¤ 123h $ 618D3h @ Si c'est un appui sur ON $ 3875Fh @ Gestion de l'appui sur ON ¤ DFFh $ 6186Ch @ si c'est une alarme $ 3894Eh @ Gestion de l'alarme $ 18802h @ ressort last prg(xlib) $ 04CE6h @ ressort le numero de l'erreur $ 3881Dh @ ressort le Errmessage $ 141E5h @ 1400 .074 BEEP $ 3889Fh @ ressort le nom du programme qui a provoqué l'erreur $ 1314Dh @ TEXT $ 13695h @ TEXT $ 1245Bh @ 1 DISP $ 1246Bh @ 2 DISP $ 3902Ch @ Freeze Header END Si l'on désire par exemple que l'affichage des erreurs se fasse dans le menu, ce n'est pas compliqué! On peut aussi faire un affichage des erreurs en video inverse! Il suffit après le deuxième DISP de mettre le programme assembleur suivant: GOSBVL 0679B GOSBVL 01C31 LC 21 *Boucle A=DAT0 W A=-A-1 W DAT0=A W D0=D0+ 16 C=C-1 B GONC Boucle GOSBVL 067D2 A=DAT0 A D0=D0+ 5 PC=(A) Voilà, j'espère voir fleurir une masse de petits noyaux tous plus beaux les uns que les autres!!! May the SATURN power be with YOU HP mâd ______________________________________________________________________________ vala: bah juste à titre de complèment (il y aurait encore beaucoup à dire et à approfondir, mais je vous laisse ça) on trouve en #7067Eh (sur S/Sx) l'adresse du kernel... Mânu