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 ]