 |
Noyau
du HP48GX |
 |
Sommaire
- Plan du noyau du HP48GX
- Pour modifier le noyau
- Pour changer l'affichage des erreurs :
- Pour changer le BEEP des erreurs
- Pour afficher des menus ronds sans assembleur
- Pour laisser un message en permanence (le
nom par exemple)
- Comment créer un noyau
- Programmes nécessaires
- ->PRG
- PRG->
- SYS
- Pour compiler un noyau
- Exemple
- Pour conclure
1.
Plan du noyau du HP48GX
#
385A7 Noyau :
# 385E8 Initialisation
# 071A2DO
# 40BC9 Clear Command Number
# 3866F Gestion des menus
# 386A1 Affichage :
# 38F41 If Stack à afficher
# 39B85 Stack :
# 42402?
# 03AF2?
# 38FB9?
# 629BC?
# 39BAD?
# 394A5?
# 38F28 If Header à afficher
# 3959 CHeader :
# 42402?
# 619AD?
# 395BA Affichage du Header :
# 1314D?
# 39B0A Affiche la Barre :
# 39B2D Grob 131*2 (LA Barre)
# 12635 RCL le grob courant
# 03FEF<0h>
# 0407B
# 11679 Repl1
# 3988B Affiche la deuxième ligne :
# 39AF1?# 03188?
# 39971 Renvoi 2 grob: un du PATH et de “…” ou de “ }”
# 60FBB?
# 61AD8 If Heure à afficher? :
# 398F4 Affiche l'heure :
# 12635 RCL le grob courant
# 64BD0<3Fh>
# 0402B<6h>
# 64D24<83h>
# 04035<7h>
# 11A6D Affiche un grob 1*? au dessus de l'heure
# 64BD0<3Fh>
# 04071
# 64D24<83h>
# 0407B
# 6389EAffiche un grob 1*? au dessous de l'heure
# 39A83 Affiche l'heure :
# 0CC0E DATE
# 0CFD9 ->STR
# 62BB0+
# 04193<2Ah>
# 53784?
# 619BC?
# 62BB0+
# 0CBFA TIME
# 0D06ASWAP +
# 62376+
# 11F801 ->GROB
# 12635 RCL le grob courant
# 64BD0<3Fh>
# 04035<7h>
# 11679 repl1
# 12635 RCL le grob courant
# 03FEF<0h>
# 0402B<6h>
# 64BD0<3Fh>
# 0407B
# 6389E Efface les répertoires en collant un grob
# 39958 Efface la deuxieme ligne
# 03223SWAP?
# 12635 RCL le grob courant
# 03FEF<0h>
# 04035<7h>
# 11679repl1
# 12635 RCL le grob courant
# 04014<4h>
# 03295?
# 619BC DROP?
# 03E2D BS 2 +
# 04035<7h>
# 11679? (ne pas lancer à partir de la pile ! !)
# 395E2 Affiche la première ligne :
# 39673 Chaîne à afficher de l'indic RAD et coordonnées
# 39632 repl2
# 396C8 Chaîne à afficher de l'indic POLAR et coordonnées
# 39632 repl2
# 3970E Chaîne à afficher de l'indic HALT et coordonnées :
# 1506B?
# 61AD8? (ne pas lancer à partir de la pile ! !)
# 3971D “HALT“
# 055DF“”
# 04175<27h>
# 04161<25h>
# 64B8A<38h>
# 39632 repl2
# 39748 chaîne à afficher des indics 12345 et coordonnées
# 39632 repl2
# 397BB chaîne à afficher de l'indic USER et coordonnées
# 39632 Repl2
# 3981B Chaîne à afficher de l'indic ALG et coordonnées
# 39632 repl2
# 39853 chaîne à afficher de l'indic PRG et coordonnées
# 39632 repl2
# 38FD2?
# 39523?
# 3947B?
# 38F5A If Cmd line à afficher
# 3A00D Cmd line# 38F73 If menus à afficher
# 3A1CA Menus :
# 42402?
# 619AD?
# 3A1E8? :
# 3A1FC?
# 39018?
# 394F9?
# 39144
Freeze?
# 4203C Wait Event :
# 42078?
# 420A0 wait
# 538F8?
# 61993?
# 3FE26?
# 619AD?
# 4203C Wait Event (retour récurent)
# 4248E?
# 06E97?
# 42475?
# 04E5E IFERR
# 40454 EVAL (C’est LE eval qui execute les programmes, les touches,…)
# 04EB8THEN
# 38728 Affichage des erreurs :
# 387BE Initialise la gestion des erreurs (sort des environnements
imbriqués)
# 04CE6 Ressort le numéro de l'erreur# 03FEF<0h>
# 618D3 If errn == 0
# 3881D Gestion de l'err0
# 64EFA<13Eh> (numéro de l’erreur due à un KILL)
# 618D3 If err == KILL
# 3875F Gestion du KILL
# 64E6E<123h> (numéro de l’erreur due à un ON)
# 618D3If err == ON
# 3875F Gestion de l'appui sur ON :
# 1506B?
# 63169?
# 3881D?
# 65080 (numéro de l’erreur due au déclenchement d’une alarme)
# 6186C If alarm
# 3894E Gestion de l'alarme
# 18802 Ressort last prg (Xlib)
# 04CE6 Ressort le numéro de l'erreur
# 3881D Ressort le ErrMessage
# 141E5 1400 .75 BEEP
# 3889F Ressort le nom du prg qui a fait l'erreur
# 1314D ?
# 13695?
# 1245B1 DISP
# 1246B 2 DISP
# 3902C1 FREEZE
# 071AB LOOP
# 04EB8 THEN (iferr)
# 17B86 Out Of Memory
REMARQUES
:
repl1 : Correspond à une fonction qui fait un REPL met avec des
arguments dans un ordre différent.
repl2 : Prend 4 arguments : Au niveau 4 : une chaîne et aux trois
autres des binaires-système ( ). Cette fonction Efface
une zone allant du pixel (X,Y) jusqu’au (Z,Y+6) puis colle la chaîne
au point (X,Y).
wait : 0 WAIT mais donne en sortie : <numéro de la touche
h> (moins de 50) et External (dont j'ignore la signification)
Insensible au ON.
<1h>… :Pour changer un réel (1,2, …) en un binaire-système (<1h>
par exemple) et bien tapez : 1 #18CD7 SYSEVAL.
Drop ?… :Les commandes suivies de ? (par exemple DROP? ou bien SWAP
?) signifie qu’ à vue de nez (le mien) elles jouent ce rôle mais
seulement dans ces conditions seulement. Attention donc si vous
voulez les réutiliser ailleurs.
# ?????C’est un entier binaire. ILS SONT TOUS EXPRIMES EN HEXADECIMAL
! (la commande pour passer dans ce mode est HEX). Les ? peuvent
alors prendre pour valeur 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E ou F. (Je
n’ai pas écrit le petit “h” en fin mais il DOIT y être).
Retour
au sommaire
2.
Pour modifier le noyau
Et
maintenant quelques petits morceaux pour écrire son propre noyau
et briller en société (pour ceux qui n’y comprennent rien voir 3.2)
:
1.
Pour changer l’affichage des erreurs :
A la place des adresses #1245B et #1246B mettre :
# 055DF “ ”
# 0518A Concaténation de deux chaînes
# 03223SWAP de deux chaînes
# 0518AConcaténation de deux chaînes
# 03FF9<1h>
# 03FEF<0h>
#64D24<83h>
#39632repl2
#1314D?
#39B0A Affiche LA barre
#3988BAffiche la seconde ligne
2.
Pour changer le BEEP des erreurs :
A la place de l’adresse #141E5 mettre :
#64C20<4Ah><1F4h>(Ce binaire système n’existe pas ailleurs dans
la machine, il n’a donc pas d’adresse, il faut alors le créer
(voir les remarques qui suivent))
# 141B2BEEP avec deux entiers systèmes
#64C20<4Ah>
# 141B2BEEP avec deux entiers systèmes
3.
Pour afficher des menus ronds sans assembleur :
Entre les adresses # 3A1FC et # 39018 insérer :
# 03AC0 Met false dans la pile
# 12645 Rcl le Grob menu sans newobGrob 131*8 Ce grob sera collé
avec un GXOR sur celui des menus. Pour avoir des menus ronds en
faire un avec comme seul points noirs les angles des menus (ils
seront ainsi effacés).
# 03FEF<0h>
# 03FEF<0h>
# 4F78CGX?OR (GXOR si false dans la pile sinon GOR)
#03244Drop
4.
Pour laisser un message en permanence (le nom par exemple) :
A la place d’une chaîne vide d’un indicateur mettez la votre.
(Remarque : j’ai détaillé l’affichage de l’indicateur HALT dans
ce but. Mettez votre nom à la place de la chaîne en #055DF) (le
nom ne doit pas être trop long sinon il n’est pas affiche en entier).
Retour
au sommaire
3.
Comment créer un noyau
1.
Programmes nécessaires :
1.
->PRG :
Ce programme est l’équivalent de ->LIST. On met dans pile n
objets plus le réel n et il compacte le tout en un programme.
« DUP DEPTH 1 - IF < THEN #18CD7h SYSEVAL #05445h SYSEVAL END
»
2.
PRG-> :
C’est l’inverse de ->PRG… un OBJ-> sur un programme quoi ! Il
faut donc mettre dans le niveau 1 le programme à casser. « DUP
IF TYPE 8 == THE #54AFh SYSEVAL #18DBFh SYSEVAL END »
3.
SYS :
C’est un SYSEVAL mais sans EVAL ; un RCL sur la mémoire de la
machine. Il suffit de mettre au niveau 1 de la pile l’adresse
de l’objet (par exemple #055DFh (à cette endroit est la chaine
vide)). « IF DUP TYPE 10 == THEN #05A03h SYSEVAL #09E1Ah SYSEVAL
DROP #715B1h SYSEVAL END »
2.
Pour compiler un noyau :
Tout
d’abord ce qu’il faut savoir c'est qu'à chaque fois que les
adresses sont décalées d’un cran vers la droite (dans le tableau
du début) cela signifie que j’ai détaillé la dernière adresse
avant le décalage contient les adresses qui suivent jusqu’à
ce qu’il y ait un décalage dans le sens inverse. Ainsi à l’adresse
#385A7 il se trouve un (sous-)programme comportant les
adresses #385E8 #071A2 etc.… etc.… .
Pour avoir le contenu des adresses, on utilise SYS et pour les
regrouper en programme c’est (justement !) ->PRG. Ainsi pour
avoir le noyau de base tapez : #385A7 SYS .
Pour créer proprement dit son noyau autant vous le dire c’est
long, faisable mais long. Il faut en fait recréer l’imbriquement
des programmes du noyau (l’astuce réside dans le fait qu’il
ne faut développer que les partie que l’on veut modifier). Par
exemple : toute les manipes à faire pour créer un noyau basic
(seulemnt les 3 adresses de bases) :
« # 385A7 SYS # 04EB8 SYS # 17B86 SYS 3 ->PRG »
C’est simple puisqu’il n’y a pas de sous-programme, il ne vous
reste plus qu’à le lancer sauf que là justement nous ne l’avons
pas modifier. Il n’y a donc rien à voir.
Par contre si on vise un cran plus loin en développant l’adresse
#385A7 :
« # 385E8 SYS
# 071A2 SYS
# 40BC9 SYS
# 3866F SYS
# 386A1 SYS
# 4203C SYS
# 04E5E SYS
# 40454 SYS
# 04EB8 SYS
# 38728 SYS
# 071AB SYS 11 ->PRG
# 04EB8 SYS
# 17B86 SYS 3 ->PRG
»
Là
la procédure est déjà plus longue ! Et nous n’avons encore rien
fait ! Par contre attention si vous vous êtes trompé dans la frappe
d’une adresse aïe ! C’est le premier Reset d’une longue lignée.
Si vous voulez créer votre noyau il suffit de remplacer un bout
de code par ici et en enlever un peu là mais attention :
Tout d’abord sauvegardez avant même de commencer la programmation
du noyau et puis à nouveau à chaque fois que vous lancez le fameux
noyau (encore au stade expérimental) car les « Try to recover
memory ? » deviennent tout à coup beaucoup plus fréquents !
Je vous conseille d’utiliser des adresses système (RPL-Sytem)
car le probleme des commandes en RPL c’est que tout d abord elles
sont plus rapides et elles ne stockent pas la pile dans LASTAGR
ou encore UNDO sinon ces commandes (LASTARG et UNDO) deviendraient
sans intérêt (elles seraient effacées à chaque éxécution du noyau).
Donc utilisez des adresses système !
3.
Exemple
Bon,
pour l’exemple il s’agit des 2 fichiers fournis avec ce *.doc
le premier (NOYAUEMPLE) est une liste et le second (~RPLS)est
un programme. J ai voulu faire en sorte que le noyau soit lisible
sur le HP (pour que vous puissiez plus facilement apprendre).
Il n’est donc pas exploitable par la machine sous cette forme
la. Il faut le compiler. Il faut donc placer NOYAUEMPLE (qui est
une liste) dans la pile et en suite lancer ~RPLS (qui est un peu
long je le conçois). Vous aurz alors le noyau dans la pile. Il
n’y a plus qu’à le lancer (ou si vous voulez l’enregistrer d’abord)
avec EVAL. Et pis voilà !! Pour arrêter les noyau, il faut faire
un redémarrage à chaud en préssant simultanément ON et la touche
C.
Pour ceux qui n’ont pas le cable de connexion HP/PC voici le contenu
des 2 fichiers. Juste avant de commencer je signale qu’il vous
taper des binaires-système… ce qui est bof : pour obtenir par
exemple <1h> il faut exécuter 1 #18CD7h SYSEVAL. Bon si vous avez
assez de courage pour le faire il faut en fait utiliser la commandes
->LIST (cette commande permet de créer une liste de n éléments.
Il faut alors dans la pile les n éléments et en plus un réel n).
Code
de NOYAUEXEMPLE :
{ { # 385E8h # 71A2h # 40BC9h # 3866Fh
{ # 38F41h # 39B85h # 38F28h
{ # 42402h # 619ADh
{ # 1314Dh # 39B0Ah # 3988Bh
{ # 39673h # 39632h # 396C8h # 39632h
{ # 1506Bh # 61AD8h # 3971Dh "CELL"
# 4175h
# 4161h # 64B8Ah
}
# 39632h # 39748h # 39632h # 397BBh
# 39632h # 3981Bh # 39632h # 39853h # 39632h
}
# 38FD2h # 39523h
}
# 3947Bh
}
# 38F5Ah # 3A00Dh # 38F73h
{ # 42402h # 619ADh
{ # 3A1FCh
{ # 3AC0h
# 12645h GROB 131 8
00000000000000000000000000000000001000050000410000500004100005000040
00000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000001000050000410000500004100005000040
# 3FEFh # 3FEFh # 4F78Ch # 3244h
}
# 39018h
}
# 394F9h
}
# 39144h
}
# 4203Ch # 4E5Eh # 0454h # 4EB8h
{# 387BEh # 4CE6h # 3FEFh # 618D3h
# 3881Dh # 64EFAh # 618D3h # 875Fh
# 64E6Eh # 618D3h # 3875Fh # 65080h
# 6186Ch # 3894Eh # 18802h # 4CE6h # 3881Dh
{ <4Ah> <1F4h> # 141B2h <4Ah> # 141B2h
}
# 3889Fh # 1314Dh # 13695h
{ # 627BBh # 6262Ah # 63259h ": " # 518Ah
# 3223h # 518Ah <1h> # 3FEFh # 64D24h
# 39632h # 1314Dh # 39B0Ah # 3988Bh
}
# 3902Ch
}
# 71ABh
}
# 4EB8h # 17B86h
}
Code de ~RPLS :
« « IF DUP TYPE 5 == THEN 1 ->p DOLIST OBJ-> ->PRG ELSE IF DUP
TYPE 10 == THEN SYS END END » -> ->p « 1 ->p DOLIST OBJ-> ->PRG
» »
Retour
au sommaire
4.
Pour conclure
Comme
d'hab' les adresses que je présente ici viennent de ce que j’ai
pu trouver au prix de nombreux 'Try to Recover Memory' et TOUT marche
sur ma GX et sur la G d’un pote malgré tout j’ai une version R et
je n’engage pas ma responsabilité en vous les donnant toutefois
si certaines sont défectueuses avertissez moi pour que je le spécifie
dans cette doc.. Merci d’avance.
Si vous avez une réflexion, question, suggestion ou autre à faire
ne vous gênez surtout pas je suis novice sur la HP.
cellophan@voila.fr
|