décompresser une chaîne BZ avec le décompresseur intégré à la rom
Dans la rom de l'HP49g, il y a un
décompresseur qui permet de décompresser les
objets compressés avec BZ...
Ceci est très utile quand on programme en asm, et
qu'on utilise plein de données qui sont
compressées dans un souci de gain de mémoire...
En effet, si on n'utilise pas le décompresseur
intégré dans la rom, il est assez difficile de
décompresser un objet; il faut exécuter le
programme de décompression à partir d'un
programme en userRPL ou en sysRPL; ou si le
décompresseur est intégré à l'objet
compressé, il faut l'évaluer....; ou alors, il
faut décompresser tous les objets au début du
programme et les placer sur la pile (comme dans
LoftStory) ...
Tout ça c'est assez compliqué ...
Heureusement, un décompresseur est intégré à
la rom de l'HP49g
Et voici un petit programme qui vous permettra de
décompresser un objet, et de le placer sur la
pile
Ce programme n'est pas très utile en soi, mais
vous pourrez l'adapter pour décompresser des
objets au cours de l'exécution d'un programme
Voici le source commenté:
GOSBVL 0679B | On sauve les registres |
GOSUB DONNEES | On va au label
DONNEES; l'adresse de ce qu'il y a après le GOSUB DONNEES est stockée au niveau 1 de RSTK |
$C2A207E00024A5C010073000000C2000164C7 C447880A562B03D2622C8C92444787006C023C 2A207010074F4352465C4020363739324A014D3 0534A074F494E4340294E6475627A034D334B21 40214A04403D3028363030344414450302750303 9323A0D3143B213074F465C4E47402035313433 3A0A |
Voici les
données: c'est la chaîne BZ, qu'on a récupéré en hexadécimal en Tapant ->H, lorsqu'elle était au niveau 1 de la pile (la library 256 doit être attachée) |
*DONNEES | le label DONNEES |
C=RSTK | On récupère l'adresse de la chaîne BZ |
D1=C | On la "met" dans D1 |
D1+14 | On se positionne
sur la longueur de l'objet compressé |
C=DAT1 A | On met cette longueur dans C |
AD1EX | Dans A, on met
l'adresse du début de l'objet compressé |
R4=A W | On la sauve dans
R4 |
GOSBVL 05B7D | On réserve une chaîne de caractère de longueur C dans la RAM de la HP49g; l'adresse de la chaine réservée est dans R0 |
A=R4 W | On récupère
l'adresse de début de l'objet compressé |
AD0EX | On met cette adresse dans D0 |
D1=A | et dans A |
D1-10 | On positionne D1
sur le début de la chaine (au début du prologue) |
GOSBVL 26808 | On effectue la décompression qui met l'objet décompressé à l'adresse que contient R0 |
GOSBVL 067D2 | On restaure les registres |
D1-5 | On fait pointer D sur le niveau 1 de la pile |
D-1 A | On "signale" qu'on rajoute un objet sur la pile |
A=R0 W | On récupère l'adresse de l'objet décompressé |
DAT1=A A | On le met au niveau 1 de la pile |
GOVLNG 00A36 | On retourne au RPN |
@ | Ceci marque la fin d'un programme en asm |
L'utilisation du décompresseur intégré dans
la rom a un autre avantage:
la décompression est beaucoup plus rapide !
Lors d'un test comparatif entre TNT et BZ, j'avais
mesuré le temps de décompression du grob 131*64
que voici:
pour TNT, on obtenait 0.21 secondes
pour le décompresseur BZ qui n'est pas intégré
dans la rom : 0.23 secondes
et pour le décompresseur BZ intégré dans la
rom; on obtient, avec le programme commenté
ci-dessus: 0.14 secondes ! soit un gain de 36 % de
temps !
Sur un petit grob comme celui-là, c'est
négligeable, mais cela peut devenir beaucoup plus
important sur un objet plus conséquent ...
Un petit graphique sera plus clair
=>
voila; j'espère que vous avez tout compris
Si vous avez des questions, vous pouvez m'écrire
à superbebert2000@yahoo.fr
Je rappelle que pour décompresser un objet avec
cette méthode, l'objet en question doit avoir
été compressé avec BZ.
Si vous n'avez pas ce programme, vous pouvez le
télécharger sur mon site: www.lebebert.fr.st
ou sur www.hpcalc.org
Bebert