M Z L I T E verze 2.13c - - - - - - - - - - - - - - - - Svatopluk Švec V Praze 9. 5. 1993 Obsah : -------- Úvod ..1 Popis základních funkcí ..2 Popis voleb ..3 Pro programátory ..4 Závěr ..5 Ú V O D ------- V současné době se skoro na všech typech počítačů vyskytují programy, které dovedou pomocí různých algoritmů komprimovat data, z nejznámějších např. PKZIP, ARJ, LHARC, na šestnácti bitech nebo ARC, LBR na osmi bitech. Tyto programy daná data kompresují do tzv. archívu, souboru, který v sobě obsahuje jeden nebo několik skompresovaných souborů. Když chceme poté tato data používat, je třeba nejprve archív dekompresovat (rozbalit). Nabízí se otázka : Co se spustitelnými soubory ? Buďto jsou sbalené v archívu a tudíž nepoužitelné nebo jsou na disku rozbalené, použitelné ale v této podobě zabírají zbytečně moc místa - sbalené ho budou zabírat určitě méně. Tento problém řeší programy, které spustitelný soubor - program sbalí a navíc na jeho začátek přidají krátkou rozbalovací rutinu, která sbalená data přímo v paměti rozbalí do původní podoby takže na konci to vypadá, jakoby byl program nahrán do paměti rozbalený a poté program sama spustí. Na PC toto provádí programy EXEPACK, LZEXE a PKLITE. EXEPACK používá metody zarážky,která nedosahuje dobrých výsledků, díky povaze dat které program představuje. LZEXE používá metodu LZW (hashovací strom), která je např. použita v grafickém formátu GIF.Je účinný,ale na 8 bitů díky rychlosti jak komprese tak dekomprese nepoužitelný. PKLITE používá část metody REDUCE z PKZIPu, funkce F,L,D, což je v podstatě hledaní shodných řetězců v souboru a jejich náhrada ukazately offsetu v daném souboru. Posledně jmenovanou metodu jsem použil po mírné modifikaci pro analogii PKLITE na CP/M - MZLITE. Bitový tok z PKLITE jsem nahradil jednodušším a rychlejším schematem užitým ke kompresi dat ve známé PC hře Eye of the Beholder a navíc jsem přidal vlastní metodu bitového pole a pak klasickou zarážkovou metodu pro případ, že se kompresuje program, který v sobě má grafická data. Jako výsledek nakonec vyšel program,který kompresuje data o 10 až 15 procent lépe, než ARC,navíc s rychlostí dekomprese asi 40kB / s, což je ve srovnání s ARCem (Dizzy4 : 12 s) opravdu jen mžik. Snad jedinou nevýhodou je poměrně dlouhá doba komprese, což je však dáno použitou kompresní metodou a je určitou daní za dobrý kompresní poměr (komprese je tak v rozmezí 80 až 40 procent původní délky vstupního souboru) a 'bleskovou' dekompresi. Popis základních funkcí ----------------------- MZLITE kompresuje jak soubory .COM, spustitelné v CP/M, tak soubory .MZF, spustitelné buď z MZRUNu nebo CM+ nebo po nahrání zpět na kazetu - přímo z kazety . Skompresovaný soubor se pozná podle toho,že má na začátku řetězec "MZLITE-3.12-CNL". Takto se můžeme lehce přesvědčit o tom, zda je daný soubor skomprimován, stačí jen vypsat daný .COM soubor pomocí TYPE,např. TYPE de.com. Pokud se objeví výše uvedený řetězec,je soubor už zkompresován. Specifikace souboru se zadává takto : mzlite -volba1 -volba2 ... s:jméno1.ext d:jméno2.ext přičemž jméno1 je jméno vstupního souboru,jméno2 je jméno výstupního souboru, s: a d: jména disků, kde se tyto soubory nachází. Povinné je jen jméno1, ostatní mohou být vypuštěna, lze je také kombinovat.Standardně ext je .COM s: a d: je aktuální disk. Specifikace může vypadat například takto : 1) mzlite de.com b:diskedit ( kompresuje de.com do b:diskedit.com) 2) mzlite a:de ( kompresuje a:de.com do de.com na aktuálním disku ) 3) mzlite de e: ( kompresuje de.com do e:de.com) 4) mzlite de ( komresuje de.com na aktuálním disku ) Popis voleb ----------- volba následuje po jménu MZLITE a je označena tak, že má před sebou čárku : "-" , po které následuje jedno z písmen v bodech A) až G). Voleb může být použito několik najednou. Přehled voleb ------------- A) bez volby : vstupní soubor ( dále jen vstup ) se kompresuje do výstupního souboru ( dále jen výstup ), dekompresní rutina se relokuje pod BDOS, který zjistí z obsahu adresy skoku do služeb BDOSu na adrese 0006h. B) -p : jako A), dekompresní rutina se relokuje pod LEC CCP, což je nutné pro programy, které při konci neprovádí teplý start systému ( např. POWER nebo NC ) a prostě se vrátí do CCP. C) -axxxx : jako A), dekompresní rutina se relokuje pod adresu xxxx (je chápána jako hexadecimální). Při zadání -aD400 (D400h je adresa začátku L.E.C. CCP) je shodná s volbou B). D) -x : zpětné rozbalení dříve sbaleného programu. Vhodné např. pro jeho modifikaci autorem (jakákoliv modifikace sbaleného programu by totiž samozřejmě skončila katastrofou - nemusím snad vysvětlovat proč..) Tato volba nefunguje pro extra kompresi. E) -e : extra komprese - sbalená data jsou navíc zabezpečena proti tomu, aby mohl být soubor zpětně rozbalen volbou D) a poté např. někým cizím zmodifikován Je také zabezpečeno to, aby rozbalený program nemohl být získán trasováním sbaleného programu v některém monitorovacím disassembleru. F) -rxxxx : Tato volba je vhodná pro programy, jež budou takto sbalený program volat v CMT. Zabrání aby se namapovaly ROM monitory a poté skočí na adresu xxxx,třeba zpět do volajícího programu. G) -o : MZLITE vytvoří pouze skompresovaná data, tedy bez dekompresní rutiny. O využití této volby : viz část "Pro programátory".. Pro programátory ---------------- K programu MZLITE je kromě tohoto popisu ještě přiložen zdrojový text dekompresní rutiny DELITE.MAC, napsaný pro makroassembler M-80 fi. Microsoft. Je určen pro ty kdož by chtěli při psaní vícekusových programů, jako jsou např. LAST NINJA,ROBOCOP atd. uspořit nějaký ten kilobajt. ( jen tak jsem zkusil diskový arkanoid : z 52kB 'zbylo' jen 28kB ..) Stačí jen sbalit daný "kus" nebo overlay volbou -o a pak do hlavního programu, "dispečera" dodat dekompresní rutinu zmodifikovanou podle potřeby. Rutina je volně relokovatelná - nezávislá na paměti. Vstupní a évýstupní body rutiny jsou popsány přímo ve zdrojovém textu , jinak rutina má dva vstupní parametry : v hl : adresu začátku zkompresovaných dat ,v de adresu paměti, kam se mají data rozbalit. Mělo by být de < hl, minimální rozdíl - 'mezeru' mezi de a hl vypíše MZLITE po oznámení konce komprese. Paměťový nárok na dekompresi se dá popsat rovnicí : Nárok = Délka_rozbaleného + 33 a vztah mezi startem Rozbalovaných dat a sbalených : Start_sbalených = Start_rozbalených + Pojistka Více o způsobu rozbalení viz. obrázek : a) začátek rozbalování : de hl |=> |-> ............................................................. b) v průběhu rozbalování : ===================> ------------> ............................................................. rozbalená data c) konec rozbalování : ( původní délka dat ) |===============================================| ............................................................. rozbalená data Teď je asi všem jasné, proč je minimální rozdíl potřebný : mohlo by se totiž stát ( kdyby rozdíl byl příliš malý ), že by rozbalovaná data přepsala sbalená data, která v dané chvíli ještě nejsou rozbalena. Z Á V Ě R --------- Veškeré připomínky k programu MZLITE jsou vítány na adrese : Š V E C S V A T O P L U K V O N D R O U Š O V A 1 1 7 3 / 1 5 1 6 3 0 0 P R A H A - 6 nebo ( raději ) na telefonním čísle : ( 0 2 ) 3 0 1 4 8 6 0 .. nebo na internet _ E-mailové adrese : svecsvat@saguaro.vscht.cz