Tolkien
Z PMD 85 Infoserver
Tolkien | |
Autor: | Roman Bórik |
---|---|
Verzia: | v1.1 (08/2017) |
Operačný systém: | windows | unix |
Lokalizácia: | angličtina |
Licencia: | Copyright © 2017 RM-TEAM |
Download: | tolkien11.zip - ZIP archív obsahujúci binárky pre win32 konzolu a Linux + zdrojové texty |
Tolkien je PC konzolová utilita určená pre pakovanie textov (do textoviek). Utilita bola napísaná podľa rovnomenného programu Tolkien 5.0 pre ZX Spectrum, ktorý si pre vlastnú potrebu napísal George K. niekedy okolo roku 1992. Tolkienom boli spakované texty do jeho textovky Heroes (Heroes).
Spakovaný text je absolútne nečitateľný a pre jeho rozpakovanie stačí krátka rutinka. Text sa však nerozpakuje celý, ale iba konkrétna veta. V pamäti tak nezaberá cenné miesto a pre rozpakovanie stačí malý buffer o veľkosti najdlhšej vety. Podľa vtedajšieho vyjadrenia George K. pakuje Tolkien text až na 50% pôvodnej dĺžky textu. Tu je však treba poznamenať, že to samozrejme záleží od "charakteru" samotného textu. Na jednej strane sa kompresý pomer zvyšuje s narastajúcou dĺžkou zdrojového textu, ale znižuje sa s rastúcim počtom rôznych znakov v texte.
Obsah |
Použitie
Tolkien je konzolová utilita, takže sa dá s výhodou použíť v dávkových súboroch. Požadované chovanie utility sa volí príslušnými prepínačmi. V hranatých zátvorkách sú uvedené defaultné hodnoty parametrov, pokiaľ sa daný prepínač nepoužije.
Príkazový riadok: tolkien [prepinace] vstupny_subor.ext
- -o vystup.ext
určuje názov výstupného súboru. Pokiaľ sa neuvedie, výstupný súbor bude mať názov podľa vstupného súboru a príponu v závislosti od ďalších parametrov. - -append
spôsobí, že výsledok sa pripojí na koniec výstupného súboru. Pokiaľ nie je nastavený, existujúci výstupný súbor sa prepíše. - -dtp
zdrojový súbor je vo formáte programu Desktop - -lc
veľké písmená sa zmenia na malé písmená (iba pre -dtp) - -no-crlf
odstráni zalomenia riadkov CR/LF - -crlf-spc
zalomenia riadkov CR/LF v texte nahradí medzerou - -only-cr
ponechá v texte zalomenia riadkov iba ako CR - -only-lf
ponechá v texte zalomenia riadkov iba ako LF - -z80
vloží pred spakovaný text rozpakovaciu rutinu Z80 - -i8080
vloží pred spakovaný text rozpakovaciu rutinu i8080 - -a adresa
určuje adresu rozpakovacej rutiny. Defaultné hodnoty sa líšia pre Z80 a i8080 a sú obvyklé pre ZX Spectrum, či PMD 85. [32768 (z80) / 0 (i8080)] - -pa adresa
určuje adresu "print" rutiny. Defaultné hodnoty sa líšia pre Z80 a i8080 a sú obvyklé pre ZX Spectrum, či PMD 85. [16 (z80) / 8500h (i8080)] - -ptp
výsledok sa uloží do PTP súboru pásky pre Emulátor PMD 85. - -tap
výsledok sa uloží do TAP súboru pásky pre ZX Spectrum emulátory. - -n meno
určuje meno súboru v hlavičke (max. 8 (PTP) / 10 (TAP) znakov). - -ct konvtab.ext
určuje názov súboru s konverznou tabuľkou znakov. - -x od do
extrahovanie viet OD-DO z pakovaného súboru (OD=0 - všetky).
Ak nie je prepínač -o zadaný, vety sú vypísané na konzolu.
Ak sú prepínače -o a -dtp zadané, vety sa zapisujú do súboru vo formáte Desktopu. - -vb
Tolkien bude pri pakovaní "ukecanejší". - -h
zobrazí "help"
Zdrojový text
Zdrojový text sa skladá z viet, ktoré vždy začínajú tzv. oddeľovačom, teda znakom, ktorý sa inak v žiadnej vete nevyskytuje. Oddeľovač naviac musí byť posledným znakom na konci textu za poslednou vetou, čím sa označí koniec textu. Ak si zvolíme za oddeľovač napríklad znak #, tak náš text by vyzeral napríklad takto:
#Prvá veta textu. #Druhá veta textu. #Tretia veta textu. #
Jednotlivé vety môžu mať neobmedzenú dĺžku. Vety môžu byť fyzicky na jednotlivých riadkoch a aj presahovať cez viac riadkov a utilita umožňuje zalomenia riadkov odstrániť, nahradiť medzerou alebo ponechať len niektorý zo znakov CR/LF.
Ak zdrojový text pochádza priamo z Desktopu, pred pakovaním sa text transformuje na "obyčajný" text. Vynechávajú sa riadiace kódy vrátane odkazov na obrázky, kódy opakovania znaku sa rozvinú a veľké písmená sa menia na malé, ak je to požadované. Kód konca riadku CR sa nahradzuje medzerou, ale iba ak posledný znak na riadku nie je '|' alebo '\'.
Zdrojový text môže byt v ľubovoľnom 8-bitovom kódovaní a môže byť pred pakovaním prekonvertovaný na iné kódovanie. Na to slúži prepínač -ct, ktorým Tolkienovi povieme, akú prevodnú tabuľku má použiť. Viď popis súboru s konverznou tabuľkou.
V zdrojovom texte nie je dovolený znak s kódom 255 (0FFh).
Formát súboru s konverznou tabuľkou
Súbor s konverznou tabuľkou je textový súbor, ktorý obsahuje v jednotlivých riadkoch vždy po dva desiatkové kódy znakov. Naľavo je zdrojový kód, ktorý sa mení na cieľový, ktorý je v riadku napravo. Jednotlivé čísla môžu byť oddelené jedným a viac medzerami alebo tabulátormi. Súbor môže obsahovať komentár, ktorý sa začína bodkočiarkou a je pri čítaní súboru ignorovaný. Kódy znakov môžu byť v intervale <1,254>. Jeden príklad namiesto ďalších slov...
; CP1250 -> Universums`s Desktop SK 233 128 ; é 201 129 ; É 228 130 ; ä 196 131 ; Ä 154 132 ; š 138 133 ; Š 232 134 ; č 200 135 ; Č 224 136 ; ŕ 192 137 ; Ŕ 158 138 ; ž 142 139 ; Ž 253 140 ; ý 221 141 ; Ý 225 142 ; á 193 143 ; Á 237 144 ; í 205 145 ; Í 239 146 ; ď 207 147 ; Ď 242 148 ; ň 210 149 ; Ň 243 150 ; ó 211 151 ; Ó 157 152 ; ť 141 153 ; Ť 244 154 ; ô 212 155 ; Ô 250 156 ; ú 218 157 ; Ú 190 92 ; ľ na \ 188 124 ; Ľ na | 229 126 ; ĺ na ~ 197 94 ; Ĺ na ^
Algoritmus pakovania
Po nutných konverziách sa už čistý text prejde a spočíta sa počet rôznych znakov vrátane oddeľovača. Ich maximálny počet môže byť 126. Ak je ich viac, je to chyba a Tolkien sa ukončí. Jednotlivým znakom, tak ako ich Tolkien stretol, sa priradia kódy od 0 po N, takže oddeľovač má kód 0. Tento zoznam písmen je potom súčasťou rozpakovacej rutiny a je jedinou "čitateľnou" časťou spakovaného textu. Celý text sa následne prejde a jednotlivé znaky sa nahradia ich novými kódmi - tým sa stane text nečitateľný.
V tomto okamihu začína pakovací proces. Text sa opäť celý prejde a vytvorí sa zoznam dvojíc znakov zotriedený podľa výskytu. Dvojici znakov s najväčším počtom výskytov sa priradí nový kód N+1 a urobí sa v celom texte nahradenie danej dvojice novým kódom. Tým sa text skráti o počet výskytov. Zjednodušene, toto sa opakuje, kým sa už nenájdu vhodné dvojice znakov, alebo sa vyčerpajú kódy (max. 254).
Rozpakovanie textu
Rozpakovanie textu, respektíve získanie konkrétnej vety, je veľmi jednoduché. Stačí do registra DE zadať číslo vety od 1 do N a zavolať rozpakovaciu rutinu.
ld de,cislo_vety ; LXI D,cislo_vety call TolkienUnpack
Rozpakovacia rutina si so sebou nesie všetky potrebné informácie o spakovanom texte vrátane tabuľky kódovania znakov a dvojíc znakov, takže je priamo viazaná na konkrétny spakovaný text. Rozpakovacia rutina je napísaná tak, že pre každý "rozbalený" znak skáče na adresu rutiny, ktorá má tento znak spracovať (vytlačiť, resp. niekam zapísať). Na konci rozpakovacej rutiny je inštrukcia jmp ADDR, kde ADDR je práve adresa rutiny, ktorá má znak spracovať - prepínač -pa. Predvolene je to štandardná rutina na vytlačenie znaku na PMD 85, resp. na ZX Spectre, ale v reále budete mať zrejme vlastnú rutinu, ktorá bude jednotlivé znaky postupne zapisovať do nejakého buffra a až potom text vytlačí. Rutina musí zachovať hodnotu registra DE a musí mať samozrejme regulérny návrat.