Le codec de compression

Annexe technique · Accueil · English

Utilisé par les flux .HUF et par G3.CON enregistrement 0x27 sous-enr. 9 et 10. Ce sont les deux seuls blocs .CON qui passent try_decompress. Tout cela est implémenté par maup_parse.py.

Routine EA Rôle
Lz_DecompressFar 0x19D92 entrée : AX = longueur basse, DX = longueur haute ; efface l'état, fixe la limite
Lz_Decompress 0x19C6A boucle principale, possède la fenêtre circulaire
Lz_ReadToken 0x19BD6 parcours de l'arbre jusqu'à un symbole
Lz_ReadDistance 0x19C14 décodage de la distance
Lz_ReadByte / Lz_ReadBit 0x19855 / 0x197F8 entrée
Lz_BitInit 0x198AF initialisation de l'arbre et du lecteur de bits
Lz_UpdateTree / Lz_RebuildTree 0x19ACE / 0x19958 mise à jour adaptative

Structure

Un flux commence par une longueur de sortie u32, sautée en 0x19C70. L'arbre est construit à l'exécution, il n'y a donc pas de table statique à trouver. Le décodage s'arrête quand le nombre d'octets produits atteint la longueur.

Bits

Bit de poids fort d'abord, via un registre de 16 bits (DS:303E, compteur en DS:3040).

Jetons et correspondances (vérifié)

tree: 314 symbols; token < 0x100 is a literal
match length = token - 0xFD (add ax,0FF03h at 0x19CF6)
c = ReadByte()
high = LzDist_ExtraBits[c] << 6        ; DS:2E3E
n = LzDist_BaseBits[c] - 2             ; DS:2F3E
acc = c; repeat n times: acc = acc*2 + ReadBit()
distance = high | (acc & 0x3F)

Fenêtre

Un anneau de 4 096 octets en DS:6754, dont les 0xFC4 premiers octets sont remplis d'espaces, l'écriture commençant en 0xFC4. Source d'une correspondance = (pos - distance - 1) & 0xFFF.

Le compteur 0x400 n'est pas un format par blocs

0x19D4F-0x19D69 ne fait qu'augmenter wLzProgressLimit de 0x400 quand la sortie le dépasse. Rien ne lit cela pour le décodage : la position d'entrée, l'état des bits, l'arbre et la fenêtre ne changent pas. maup_parse.py décode tous les flux correctement sans gérer de blocs.

Vérification

selftest décode les 29 flux MUS et les 28 flux SND ; les longueurs d'en-tête concordent et le remplissage final fait au plus 7 bits.

Précédent : Formats de fichiers, scènes et palettes · Suivant : Vidéo · Annexe technique · Accueil