sobota 22. července 1995

Konverze souborů do assembleru

autor: Zbyněk Vanžura

Možná se vám již stalo, že jste něco programovali v assembleru, a tu z ničeho nic jste se rozhodli, že použijete nějakou ikonku, nebo masku pro obrázek, nebo něco podobného. Takový malý obrázek jako např. šipku a její masku si zapíšete do assembleru jako instrukci DEFB, nebudete ji přece pokaždé přihrávat (zvlášť když ještě třeba používáte kazeťák).

Taková malá šipka není tak složitá - přepočítáte pár binárních čísel a zapíšete do assembleru instrukcí DEFB (DB). Ale co takhle několik malých obrázků (tak cca 32*32 bodů), a v tu chvíli se začnete rozmýšlet jestli čísla přepočítat a zapsat do assembleru, a nebo raději tyto obrázky pokaždé před každým spuštěním a laděním přihrát. Pro ty jež mají disketovou jednotku od Didaktiku je pomoc snadná. Stačí obrázky někde předem nakreslit a uložit na disktetu. S tím vám asi moc nepomůžu snad jen doporučím Art-Studio (Screen Machine je sice lepší, ale znám jen jednoho člověka, který jej dokáže používat) a poté použít rutinku jíž napsal a popsal v ZXM ve svém článku AnimACE George K. jež slouží k vybrání kusu obrazu z celé obrazovky.

Tak a teď máte na disketě soubor přesně s tím, co chcete do assembleru zapsat. Je takto samozřejmě možno zapsat do assembleru i celý font (viz např. knížka, tentokrát pro změnu od Mr. Universum, Assembeler a ZX Spectrum II). Takže nyní opište následující program. Ten je pro změnu v BASICu (napsat ho ve strojovém kódu by zabralo nejen více času, ale i více místa a program by víceméně plnil stejnou funkci).

10 CLEAR 49999:INPUT "Vstupni soubor: ";LINE a$'"Vystupni soubor: ";LINE b$:OPEN #4,a$:OPEN #5,,b$:GOSUB 20:GOTO 30
20 LET c$=CHR$ 13+"00 DEFW ":LET e=0:RETURN
30 LET b$=INKEY$ #4:LET b=CODE b$:LET b$=INKEY$ #4:LET c=CODE b$:LET b$=STR$(c*256+b)
40 LET c$=c$+b$:LET e=e+LEN c$:IF e>26 THEN GOSUB 20:GOTO 40
50 INPUT INKEY$="Y":PRINT c$;:PRINT #5,c$;:OUT 143,0:LET c$=",":GOTO 30

Možná jste se zhrozili tohoto stylu BASICu. Ovšem jeho výhodou je malá spotřeba paměti (i na 48kB Spectru je možno pořídit assembler, který se jinak vejde třeba jen do 128kB Spectra).

A teď něco o použití programu. Po spuštění se vás program zeptá nejprve na jméno vstupního a poté i výstupního souboru. Odpovězte mu zadáním názvů souborů na jejichž konec připište přípnu B (např. Obrazek1.B), oba soubory však nesmí mít stejný název. Poté bude program chvíli pracovat a vypisovat na obrazovku jednotlivé řádky assembleru. A teď to přijde, v okamžiku, kdy bude program vypisovat už jen samé nuly, je pravděpodobné že soubor již skončil (MDOS to bohužel neumožňuje z BASICu zjistit), zastavte program klávesou BREAK a vložte příkaz CLOSE #. Nyní již můžete nahrát do počítače assembler PROMETHEUS (kdo na něj ještě nepřešel, má zase o důvod víc, aby se na tento program přeorientoval co nejdříve), a v něm napsali příkaz GENS za nímž následuje dvojtečka a název souboru (tentokrát bez přípony). Assembler nyní bude kontrolovat syntaxi jednotlivých řádků a vkládat je do programu (jako při normálním nahrání). Poté již jen vymazat přebytečné nuly a vše je hotovo. Snad jen poznámka, pokud má vstupní soubor lichý počet bytů, bude poslední nenulové číslo obsahovat jednu nulu navíc, protože do assembleru se ukládají čísla ve formě dvojbytů pro větší úsporu místa.

A teď ještě popis jednotlivých příkazů. Řádek 10 - příkaz INPUT si vynutí vložení názvů souborů, příkazy OPEN otevřou na kanálu 4 vstupní soubor a na kanálu 5 soubor výstupní. Řádek 20 - nastaví se do proměnné C$ začátek assemblerového řádku (dva byty pro číslo řádku, žádné návěstí, instrukce DEFW), a proměnná E (počítadlo délky řádku) se naství na 0. Řádek 30 - do proměnných B a C se přečtou dva po sobě jdoucí byty ze vstupního souboru, z nichž se vytvoří dvoubajtové číslo, jehož znakové vyjádření se zapíše do proměnné B$. Řádek 40 - do proměnné C$ se přidá B$ (znaková vyjádření dvoubytového čísla), dále se připočte do proměnné E délka čísla, a pokud je větší než 26 znaků tak se vytvoří nový řádek a pokračuje se jím. Řádek 50 - do klávesnicového buferu se zapíše znak "Y" (aby program neotravoval otázkou Scroll?), dále se vytiskne na obrazovku obsah proměnné C$ a tatáž proměnná se zapíše do výstupního souboru, poté se zastaví mechanika disketové jednotky (ne vždy se roztočí, ale jejím vypnutím vždy se nic nezkazí), dále se do C$ se uloží čárka pro oddělení jednotlivých čísel od sebe a pokračuje se dalším dvojbytem. Poslední příkaz, který se vkládá po násilném zastavením programu, CLOSE # zavře oba otevřené soubory (zapíše do FAT jejich délku a odpojí je od kanálů 4 a 5).

Žádné komentáře:

Okomentovat