
		  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
