home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 07 / ami37 < prev    next >
Text File  |  1997-04-15  |  9KB  |  311 lines

  1. POWER PACKER W AMOSIE
  2.  
  3. <lead>Od redakcji: ludzie zwiâzani z komputerami od dawna
  4. borykajâ sië z problemem wolnego miejsca na dyskietkach. Dlatego
  5. teû kilka mâdrych osób wymyôliîo kiedyô, ûe moûna zaoszczëdziê
  6. nieco miejsca na noônikach, upakowujâc zapisane na nich
  7. informacje. I tak powstaîy róûne programy, sîuûâce temu celowi. W
  8. artykule tym chciaîbym opisaê, w jaki sposób z poziomu AMOS-a,
  9. moûna rozpakowaê plik, spakowany Power Packerem.
  10.  
  11. <a>Îukasz Szelâg
  12.  
  13. <txt>Najpierw opiszë format spakowanych danych:
  14.  
  15. Identyfikator -- (4 bajty) -- 'PP20' lub 'PX20'.
  16.  
  17. Efektywnoôê -- (4 bajty) -- $09090909 -- najszybsza, $090a0a0a --
  18. ôrednia, $090a0b0b -- dobra, $090a0c0c -- bardzo dobra, $090a0c0d
  19. -- najlepsza
  20.  
  21. Suma kontrolna -- (2 bajty) -- tylko dla danych zakodowanych.
  22.  
  23. Spakowane dane (dîugoôê).
  24.  
  25. Fecrunch info -- (4 bajty).
  26.  
  27. Identyfikator informuje nas o tym, czy plik zostaî spakowany
  28. Power Packerem. Nas interesowaê bëdzie nagîówek 'PP20' ('PX20'
  29. odnosi sië do danych spakowanych i zakodowanych). Po
  30. identyfikatorze nastëpuje informacja o efektywnoôci, z jakâ
  31. zostaîy spakowane dane (w wypadku 'PX20' dochodzi jeszcze suma
  32. kontrolna, która sîuûy do sprawdzenia poprawnoôci wprowadzanego
  33. hasîa). Nastëpnie mamy spakowane dane, a po nich, tzw. decrunch
  34. info, które zawiera m.in. dîugoôê danych po rozpakowaniu.
  35.  
  36. Na samym poczâtku naszej procedury odczytamy z pliku informacjë o
  37. dîugoôci danych spakowanych oraz dîugoôci danych po rozpakowaniu.
  38. Dîugoôê danych spakowanych to po prostu dîugoôê pliku, który
  39. chcemy rozpakowaê. Moûna jâ odczytaê w nastëpujâcy sposób:
  40.  
  41. <l>Open In 1,_SOURCE$    : Rem otwieramy plik
  42.  
  43. PACK_LEN=Lof(1)    : Rem odczytujemy jego dîugoôê
  44.  
  45. Close 1    : Rem a teraz go zamykamy
  46.  
  47. <txt>Dobrze by byîo, ûeby nasza procedura sprawdziîa, czy ma do
  48. czynienia z formatem pliku spakowanego Power Packerem. Moûemy
  49. wiëc dopisaê linië:
  50.  
  51. <l>Open In 1,_SOURCE$    : Rem otwieramy plik
  52.  
  53. If Input$(1,4)<>'PP20' Then Pop Proc[-1]    : Rem sprawdzamy czy 'PP20'
  54.  
  55. PACK_LEN=Lof(1)    : Rem odczytujemy jego dîugoôê
  56.  
  57. Close 1    : Rem zamykamy plik
  58.  
  59. <txt>W wypadku, gdy plik nie byî spakowany, opuszczamy procedurë,
  60. która na wyjôciu poinformuje o bîëdzie (zmienna Param).
  61.  
  62. Teraz musimy jeszcze odczytaê, a wîaôciwie obliczyê dîugoôê
  63. danych po rozpakowaniu. Jak juû na poczâtku wspomniaîem (w
  64. trakcie omawiania formatu danych), 4 bajty, liczâc od koïca
  65. pliku, jest umieszczona informacja (pole decrunch info) o
  66. dîugoôci danych po rozpakowaniu. Informacja ta jest umieszczona
  67. na bitach od 8. do 31., tak wiëc po odczytaniu wartoôci z pola
  68. decrunch info, musimy të wartoôê przesunâê na pozycjë bitów od 0.
  69. do 23., inaczej mówiâc podzieliê przez 256.
  70.  
  71. Najpierw odczytajmy pole decrunch info. W tym celu musimy zmieniê
  72. pozycjë czytania z pliku na pozycjë dîugoôê pliku -- 4 i odczytaê
  73. 4 znaki:
  74.  
  75. <l>Pof(1)=_PACK_LEN-4    : Rem nowa pozycja czytania
  76.  
  77. A$=Input$(1,4)    : Rem odczytanie 4 znaków
  78.  
  79. <txt>Zmienna A$ zawiera 4 znaki, które po zamianie na liczbë
  80. 4-bajtowâ i podzieleniu przez 256, dadzâ nam dîugoôê danych po
  81. rozpakowaniu:
  82.  
  83. <l>_UNPACK_LEN=Leek(Varptr(A$))/256
  84.  
  85. <txt>Tak wiëc nasza procedura wyglâda nastëpujâco:
  86.  
  87. <l>Open In 1,_SOURCE$    : Rem otwieramy plik
  88.  
  89. If Input$(1,4)<>'PP20' Then Pop Proc[-1]    : Rem sprawdzamy czy 'PP20'
  90.  
  91. _PACK_LEN=Lof(1)    : Rem odczytujemy jego dîugoôê
  92.  
  93. Pof(1)=_PACK_LEN-4    : Rem nowa pozycja czytania
  94.  
  95. A$=Input$(1,4)    : Rem odczytanie 4 znaków
  96.  
  97. _UNPACK_LEN=Leek(Varptr(A$))/256    : Rem obliczamy dîugoôê 
  98.  
  99. Close 1    : Rem zamykamy plik
  100.  
  101. <txt>Nastëpna czynnoôê to przydzielenie pamiëci na bufor dla
  102. rozpakowania danych. Bufor ten powinien byê zwiëkszony o tzw.
  103. margines bezpieczeïstwa (8 bajtów). Wynika to z tego, ûe adres,
  104. pod którym bëdâ rozpakowane dane, musi byê wiëkszy o co najmiej 8
  105. bajtów niû adres spakowanych danych. Zatem bëdziemy potrzebowali
  106. _UNPACK_LEN+16 bajtów pamiëci (4 bajty identyfikatora plus 4
  107. bajty efektywnoôci plus dîugoôê danych po rozpakowaniu plus 8
  108. bajtów marginesu bezpieczeïstwa). Po przydzieleniu bufora pamiëci
  109. wczytamy do niego zawartoôê spakowanego pliku:
  110.  
  111. <l>Reserve As Chip Data _BANK,_UNPACK_LEN+16    : Rem przydzielenie pamiëci
  112.  
  113. Bload _SOURCE$,Start(_BANK)    : Rem wczytanie danych
  114.  
  115. <txt>Do rozpakowania danych w buforze sîuûy funkcja (z biblioteki
  116. powerpacker.library):
  117.  
  118. <l>ppDecrunchBuffer    (endcrun,decrbuf,efficiency,color)
  119.     A0      A1        A2       D0
  120.  
  121. <txt>Jak widaê, funkcja ta wymaga podania czterech parametrów:
  122.  
  123. endcrun (A0) -- adres przedostatniego bajtu spakowanych danych,
  124.  
  125. decrbuf (A1) -- adres, pod którym dane bëdâ rozpakowane,
  126.  
  127. efficiency (A2) -- efektywnoôê, z jakâ zostaîy spakowane dane,
  128.  
  129. color (D0) -- efekt, towarzyszâcy rozpakowywaniu:
  130.    
  131.     DECR_COL0    (0) -- kolor tîa,
  132.  
  133.     DECR_COL1    (1) -- kolor liter,
  134.  
  135.     DECR_POINTER (2) -- kolor wskaúnika,
  136.  
  137.     DECR_SCROLL  (3) -- przesuwanie ekranu na boki,
  138.  
  139.     DECR_NONE    (4) -- nic sië nie dzieje.
  140.  
  141. Najpierw otworzymy bibliotekë powerpacker.library za pomocâ
  142. instrukcji Lib Open (biblioteka ta powinna byê dostëpna dla
  143. systemu):
  144.  
  145. <l>Lib Open 1,"powerpacker.library",0    : Rem otwarcie biblioteki
  146.  
  147. <txt>Kolejnâ czynnoôciâ bëdzie wypeînienie rejestrów adresowych
  148. od A0 do A2 i rejestru danych D0 odpowiednimi wartoôciami. W
  149. rejestrze A0 powinien sië znaleúê adres przedostatniego bajtu
  150. spakowanych danych, natomiast w rejestrze A1 adres, pod którym
  151. dane bëdâ rozpakowane, a wiëc:
  152.  
  153. <l>Areg(0)=Start(_BANK)+_PACK_LEN    : Rem endcrun
  154.  
  155. Areg(1)=Start(_BANK)+16    : Rem decrbuf
  156.  
  157. <txt>Rejestr adresowy A2 powinien zawieraê adres efektywnoôci, z
  158. jakâ zostaîy spakowane dane. Pole efektywnoôê znajduje sië o 4
  159. bajty od poczâtku wczytanych danych, zatem:
  160.  
  161. <l>Areg(2)=Start(_BANK)+4    : Rem adres efektywnoôci
  162.  
  163. <txt>Pozostaje nam jeszcze wypeînienie rejestru D0 numerem efektu
  164. (0-4), który bëdzie towarzyszyî rozpakowywaniu danych:
  165.  
  166. <l>Dreg(0)=_EFFECT    : Rem numer efektu
  167.  
  168. <txt>Po tych czynnoôciach moûemy wywoîaê funkcjë ppDecrunchBuffer
  169. (jest ona umieszczona o 36 bajtów od bazy biblioteki):
  170.  
  171. <l>_ERROR=Lib Call(1,-36)    : Rem wywoîanie funkcji
  172.  
  173. <txt>Jeûeli operacja zostanie przeprowadzona bezbîëdnie, to
  174. zmienna _ERROR bëdzie zawieraê wartoôê $FFFF (65535).
  175.  
  176. I to juû wîaôciwie wszystko. Zamykamy naszâ bibliotekë, nagrywamy
  177. rozpakowane dane i zwalniamy przydzielonâ pamiëê:
  178.  
  179. <l>Lib Close 1    : Rem zamkniëcie biblioteki nagranie rozpakowanych danych
  180.  
  181. Bsave _DEST$,Start(_BANK)+16 To Start(_BANK)+Length(_BANK)
  182.  
  183. Erase _BANK    : Rem zwolnienie pamiëci
  184.  
  185. <txt>Wszystkim ûyczë miîego rozpakowywania, a poniûej
  186. przedstawiam kompletnâ procedurë.
  187.  
  188.  
  189. <l>Procedure _PPDECRUNCH_FILE[_SOURCE$,_DEST$,_EFFECT,_BANK]
  190.  
  191.    '
  192.  
  193.    '  **************************************************************    
  194.  
  195.    '  *  Coder  : Îukasz Szelâg                                    *
  196.  
  197.    '  *  Version: 1.0                                              *
  198.  
  199.    '  *  Date   : 1994.07.29                                       *
  200.  
  201.    '  *  Comment: Procedura rozpakowuje plik _SOURCE$ spakowany    *
  202.  
  203.    '  *           Power Packerem. Zmienna _DEST$ okreôla nazwë,   *
  204.  
  205.    '  *           pod jakâ zostanie nagrany rozpakowany plik,      *
  206.  
  207.    '  *           natomiast zmienna _EFFECT okreôla numer efektu,  *
  208.  
  209.    '  *           jaki towarzyszyê bëdzie rozpakowywaniu danych    *
  210.  
  211.    '  *           (0-kolor tîa, 1-kolor liter, 2-kolor wskaúnika,  *
  212.  
  213.    '  *           3-przesuwanie ekranu na boki, 4-bez efektu).     *    
  214.  
  215.    '  *           Zmienna _BANK, okreôla numer banku pamiëci,      *
  216.  
  217.    '  *           jaki bëdzie wykorzystany na wczytanie danych.    *
  218.  
  219.    '  *           W przypadku wystâpienia bîëdu zmienna Param      *
  220.  
  221.    '  *           na wyjôciu z procedury zwróci wartoôê ujemnâ.    *
  222.  
  223.    '  **************************************************************
  224.  
  225.    '
  226.  
  227.    ' odczytanie z pliku informacji o dîugoôci danych
  228.  
  229.    ' spakowanych i dîugoôci danych rozpakowanych
  230.  
  231.    '  
  232.  
  233.    Open In 1,_SOURCE$
  234.  
  235.    If Input$(1,4)<>'PP20' Then Pop Proc[-1]
  236.  
  237.    _PACK_LEN=Lof(1)
  238.  
  239.    Pof(1)=_PACK_LEN-4
  240.  
  241.    A$=Input$(1,4)
  242.  
  243.    _UNPACK_LEN=Leek(Varptr(A$))/256
  244.  
  245.    Close 1
  246.  
  247.    '    
  248.  
  249.    ' zarezerwowanie pamiëci na bufor i wczytanie danych   
  250.  
  251.    Reserve As Chip Data _BANK,_UNPACK_LEN+16
  252.  
  253.    Bload _SOURCE$,Start(_BANK)
  254.  
  255.    '
  256.  
  257.    ' otwarcie biblioteki
  258.  
  259.    Lib Open 1,"powerpacker.library",0
  260.  
  261.    '
  262.  
  263.    ' adres poprzedzajâcy ostatni bajt spakowanych danych
  264.  
  265.    Areg(0)=Start(_BANK)+_PACK_LEN
  266.  
  267.    '
  268.  
  269.    ' adres, gdzie bëdâ rozpakowywane dane (musi byê przynajmniej o
  270.  
  271.    ' 8 razy wiëkszy niû poczâtek spakowanych danych)  
  272.  
  273.    Areg(1)=Start(_BANK)+16
  274.  
  275.    '
  276.  
  277.    ' adres efektywnoôci, z jakâ zostaîy spakowane dane
  278.  
  279.    Areg(2)=Start(_BANK)+4
  280.  
  281.    '
  282.  
  283.    ' efekt, jaki bëdzie uûyty podczas rozpakowywania
  284.  
  285.    Dreg(0)=_EFFECT
  286.  
  287.    '
  288.  
  289.    ' wywoîanie funkcji ppDecrunchBuffer 
  290.  
  291.    _ERROR=Lib Call(1,-36)
  292.  
  293.    '
  294.  
  295.    ' zamnkniëcie biblioteki 
  296.  
  297.    Lib Close 1
  298.  
  299.    '
  300.  
  301.    ' nagranie rozpakowanych danych i zwolnienie pamiëci 
  302.  
  303.    Bsave _DEST$,Start(_BANK)+16 To Start(_BANK)+Length(_BANK)
  304.  
  305.    Erase _BANK
  306.  
  307.    '
  308.  
  309. End Proc[65535-_ERROR]
  310.  
  311.