Cours On-Line : PHP, ASP, VB, C, C++ win32, HP48
CALCULETTES HP48G/GX cours de RPL Système
Comme expliqué sur la page précédente, le SYSRPL est une couche de plus bas niveau que le RPL utilisateur. C'est à dire que la couche RPL utilise des instructions de la couche SYSRPL pour fonctionner. Il faut noté que toutes les instructions du SYSRPL ne sont pas utilisable depuis le RPL ce qui permet donc aux petits curieux de farfouiller les doc des instructions SYSRPL pour découvrir des nouvelles fonctions secrètes cachées dans le coeur de leur HP48.
Sommaire
La programmation en SYSRPL offre de nombreux avantages:
- Accès au formes internes des instructions standard RPL non protégé par des vérifications de type ou de mémoire libre donc plus rapides.
- Possibilité d'utiliser des objets non disponibles en RPL comme les entiers systèmes , les réels long ...
- Possibilité de contourner certaines restrictions de la HP liées au constructeur
Par ailleurs il existe aussi des inconvénients:
- Risque d'erreur grand car sans vérification de type on peut facilement avoir des "memory clear"
- Utiliser une instruction SYSRPL qui n'existe pas peut avoir le même effet.
Finalement qu'est ce qu'une instruction SYSRPL? C'est une adresse suivit de l'instruction SYSEVAL qui exécuté la fonction SYSRPL localisée à l'adresse donnée en argument. En général l'adresse donnée en argument est une adresse HEXADECIMALE sur 20 BITS donc entre #00000h et #FFFFFh. Veuillez voir la section ASSEMBLEUR pour avoir un détails du contenu de la RAM et la ROM de la HP48.
Avant d'attaquer sur le SYSRPL en lui même il faut d'abord introduire deux chose importantes. Sur la hp les adresses et données au niveau de la mémoire vive sont codé à l'envers sur 8/16/32/64/20 bits... C'est à dire que l'adresse #15790h en hexa sera codé dans la HP dans la mémoire comme celà: 09751
La deuxième chose à savoir c'est que la HP reconnais un certains nombres d'objets. C'est à dire des éléments qui ferments soit des chaînes de caractères, soit des programmes, soit des entier et bien d'autre encore. Nous allons ici essayer de tous plus ou moins les découvrir.
Les objets sont codés eux aussi en hexadécimal inversé dans la HP48.
- Les différents types d'objets:
| Nom du type |
Adresse |
type |
| Nombre réel |
#02933h |
0 |
| Nombre complex |
#02977h |
1 |
| Chaîne de caractère |
#02A2Ch |
2 |
| Tableau de réel |
#029E8h |
3 |
| Tableau de complex |
#029E8h |
4 |
| Liste |
#02A74h |
5 |
| Nom global |
#02E48h |
6 |
| Nom local |
#02E6Dh |
7 |
| Programme |
#02D9Dh |
8 |
| Expressions |
#02AB8h |
9 |
| Entier binaire |
#02A4Eh |
10 |
| Objet graphique |
#02B1Eh |
11 |
| Objet taggué |
#02AFCh |
12 |
| Objet unité |
#02ADAh |
13 |
| Nom XLIB |
#02E92h |
14 |
| Répertoire |
#02A96h |
15 |
| Librairie |
#02B40h |
16 |
| Object backup |
#02B62h |
17 |
| Fonction intégrée |
#02D9Dh |
18 |
| Commande intégrée |
#02D9Dh |
19 |
|
|
|
| Entier système |
#02911h |
20 |
| Réel long |
#02955h |
21 |
| Complexe long |
#0299Dh |
22 |
| Linked Array |
#02A0Ah |
23 |
| Character |
#029BFh |
24 |
| Objet code |
#02DCCh |
25 |
| Library data |
#02B88h |
26 |
| EXT1 |
#02BAAh |
27 |
| EXT2 |
#02BCCh |
27 |
| EXT3 |
#02BEEh |
27 |
| EXT4 |
#02C10h |
27 |
| External |
................ |
27 |
Remarque: l'adresse écrite ici constitue en fait le PROLOGUE des types d'objets c'est une adresse pérmétant de savoir ce que va être l'objet avec lequel on va travailler.
La HP48 possède un processeur SATURN 4bits pour le bus de donnée et 20bits pour le bus d'adresses. Cela signifie qu'a une adresse donnée se trouve un paquet de 4bits de données. Le nombre d'adresse utilisable par la HP est donc 2^20 adresses différentes de #00000h à #FFFFFh. Ainsi la mémoire morte (ROM) de la HP48 est d'une taille de 2^20/2 (en octets) soit 2^19 => 512Ko de mémoire.
Une HP48G à 32Ko de mémoire vive (RAM la différence avec la ROM c'est que l'on peut écrire dedans) Une GX à 128Ko de RAM. Il faut savoir que la GX permet aussi de rajouter une carte en port1 de 128Ko et une carte en port2 de 4Mo par banc de 128Ko soir 32*128Ko. Ainsi la mémoire total d'une HP48GX serait: 512+128+128+(32*128)=4864Ko (4.75Mo)
Il est donc évident qu'en pouvant adresser 512Ko on puisse pas atteindre 4.75Mo... C'est pourquoi la HP48 permet d'utiliser certaines fonctions qui permette de choisir dans quel RAM ou ROM ou PORT on écrit à un instant donné en définissant un système de priorité et de superposition de la mémoire.
- Tableau des espaces mémoires:
On s'aperçoit que de #0h à #82000h il n'y à pas de problème de mémoire cachée mais de #82000h à #FFFFFh là mémoire ROM est cachée par la RAM, le port1 et le port2 (si jamais des cartes sont dans ces ports) Ainsi la HP48 possède une stratégie permettant d'échange le type de mémoire active pour accéder selon une priorité donnée soit au port1 soit au port2 soit à la RAM soit à la ROM. Le fait de pouvoir écrire ou lire dans une mémoire qui était cachée et qui ne l'est plus s'appelle le "bank switching".
Pour savoir à quoi servent les différentes sections mémoire, voir la partie ASSEMBLEUR.
Un bon nombre d'instructions SYSRPL se trouvent dans la ROM entre #82000h et #FFFFFh de ce fait manipuler le changement de banc de mémoire est totalement primordiale pour faire du SYSRPL.
Pour facilité le moyen d'obtenir une fonction en ROM cachée, on peut utiliser ce que l'on appelle des pointeurs d'accès. C'est à dire, les objets de type EXT1 (#02BAAh).
Les objet de type EXTI1 ont deux champs de 5 quartet codant l'adresse de l'objet à atteindre et l'adresse de la routine qui permet d'atteindre cet objet dans la dite mémoire (cachée). Si ce second champs est à #00000h c'est que l'objet à atteindre est en mémoire et qu'il n'est pas caché.
On remarque qu'il existe 3 zone couverte dans la HP48 donc il existe aussi 3 routines pour accéder aux objets de ces zones:
- Zone: #80000h, #8FFFFh routine en #726A1h
Cette zone est couverte par les 32Ko de RAM de la HP48G ou les 32 premiers Ko de la RAM de la GX.
- Zone: #90000h, #BFFFFh routine en #72386h
Cette zone est couverte par la fin de la RAM de la HP48GX.
- Zone: #C0000h, #FFFFFh routine en #70B38h
Cette zone est couverte par les PORT1 et 2. De plus il existe deux routines différentes selon que la carte est en PORT1 ou PORT2.
Pour le code sources des routines d'accès voir la section ASSEMBLEUR.
Sans l'utilisation de l'assembleur il est assez fastidieux d'essayer de programmer avec des SYSEVAL qui se situerais dans la mémoire cachée.
|