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 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.