Tolkien

Z PMD 85 Infoserver

Tolkien


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 kompresný 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žiť 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é predvolené 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. Predvolené 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. Predvolené 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 praxi 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 regulerný návrat.