GFA et compacteurs
Par THYREX / NLC
Cet article est la suite logique à l'article de l'ami THE BEAST
sur les compacteurs. Donc aprés les statistiques, voici un peu de
technique. Le but est d'exploiter les routines en assembleur
fournies avec la plupart des compacteurs.
En effet, quoi de plus embétant que de devoir charger un fichier
trop gros pour etre 'mergé' en inline... Par exemple, certaines
musiques soundchip occupent environ 40000 octets, ça ne passe pas
en inline !!! Voila pourquoi j'ai décidé un jour, avec l'aide de
mon eternel ami CTS,d'adapter les routines assembleurs pour pouvoir
les appeler à partir d'un programme en GFA basic.
Comment ça marche une routine en assembleur ?
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
La majorité des routines en assembleur attendent de recevoir
l'adresse où se trouve le fichier compressé. La plupart du temps
cette information est transmise par le registre 'A0'.
Voilà le probleme. Comment peut on modifié un registre en GFA ?
Bein !!! On peut pas... Par contre, on peut transmettre des
information à une routine assembleur en passant par la 'PILE' ou
'A7'... Alors on modifiera la petite routine assembleur de façon à
ce que le contenu de la pile soit transmit au registre utilisé
('A0')...
(voir listing 1)
Une fois le listing assembleur modifié, on l'assemble pour en
tirer un programme de quelques octets (entre 200 et 2000). Ensuite,
on lancent le GFA (pas trop fort quand meme),on réservé de l'espace
pour notre fichier compacté qui pour l'intant est en 'inline', on
transfert le fichier compacté dans l'espace réservé (qui au passage
doit etre de la taille du fichier décompacté) puis on appel la
routine assembleur en luis précisant où se trouve le fichier
compacté. C'est là qu'intervient Zorro... euh.. non !!! la fonction
' VOID C:rout%(L:fichier%) '. Cette fonction appelera la routine
'rout%' en envoyant sur la pile l'adresse de notre fichier compacté
'fichier%' (sur un mot long d'où le 'L:')
(voir listing 2)
Il existe deux types de décompression. La premiere conserve le
fichier compressé intacte, la deuxième l'écrase. La routine
ci-dessous fait partie de la deuxième catégorie. C'est meme l'une
des meilleure d'aprés THE BEAST et mon expérience personnelle
aussi... J'ai quand meme mis d'autres routines assez courantes
(ICE, ATOMIK).
J'espére que cet article vous sera utile dans vos programmes.
Cela peut etre utile dans un player de soundchips par exemple...
hein THE BEAST !!!. Si vous avez des problémes ou si vous voulez
discuter GFA, GRAPHS, DEMOS, n'hésitez pas à me contacter !!!
*****************************************************
* UNPACK source for SPACKERv3 (C)THE FIREHAWKS'92 *
* ------------------------------------------------- *
* in a0: even address start packed block *
* out d0: original length or 0 if not SPv3 packed *
* ================================================= *
* Use AUTO_SP3.PRG for multiblk packed files *
*****************************************************
* Modified for GFA basic by THYREX / NLC *
*****************************************************
movea.l 4(a7),a0 Voila la seule ligne à ajouter,
on met le contenu de A7 sur le
registre utilisé (ici A0)
unpack:
Ci-suis la routine de décompression
'
' Routine de decompactage en GFA pour le SPEED PACKER 3
'
' routine assembleur original: The FIREHAWKS
' adaptation + code GFA : Thyrex / NLC / TOXIC TEAM
'
'
INLINE rout%,1638 ici on merge notre routine asembleur modifié
FILESELECT "d:\*.sp3","",nom$ on peut charger le fichier compacté
ou aussi le merger en inline.
fre%=FRE(0)
RESERVE 100000
image%=MALLOC(32034) buffer pour le fichier compacté,
xb%=XBIOS(2) ici on utilise une image
'
BLOAD nom$,image% la on charge l'image
'
super%=GEMDOS(32,L:0)
'
routine%=rout%+28 on saute le 'header' de la routine
'
VOID C:routine%(L:image%) ! on appel la routine en donnant
' ! image% comme adresse à décompacter
BMOVE image%+34,xb%,32000
VOID XBIOS(6,L:image%+2)
DO
VSYNC
LOOP UNTIL PEEK(&HFFFC02)=57
'
~GEMDOS(32,L:super%)
~MFREE(image%)
RESERVE fre%
~XBIOS(5,L:xb%,L:xb%,res%)
EDIT
[ Retour au sommaire ]