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