QMEG 3 a QMEG 4 pro pokročilé

V tomto textu budu pokračovat popisem QMEGu - alternativního operačního systému pro 8bitová Atari od Stefana Dorndorfa.

Základy ovládání už by měl znát každý čtenář prvního dílu. Nyní se proto zaměřím na pokročilé funkce, konkrétně vestavěný Machine Language Monitor a také na Freezer, který je dostupný jen v QMEGu 4.

Připomenu ještě, že jedním z cílů tohoto seriálu je porovnání dvou u nás nejpoužívanějších verzí QMEGu, tj. verzí 3.2 a 4.04.

5. MLM

QMEG má vestavěný tzv. monitor strojového jazyka, neboli Machine Language Monitor, zkráceně MLM. QMEG 3.2 obsahuje MLM ve verzi 2.1, QMEG 4 potom MLM 2.3.

MLM umí např.:

Zjednodušeně řečeno, MLM je nástroj na zkoumání a změny obsahu paměti počítače a (nepřímo) i obsahu disku. Jde o nástroj velmi nízkoúrovňový, obdobně jako příkazy PEEK a POKE v BASICu.

Typickým příkladem použití monitoru je hackování her. Např. nastavení počtu životů, resp. "nesmrtelnosti". Stačí nahrát a spustit hru, skočit do monitoru, upravit potřebné místo v paměti a skočit zpět do hry.

Existují různé knihy a internetové zdroje se seznamem adres a hodnot, které je třeba v jednotlivých hrách změnit pro dosažení "nesmrtelnosti" či jiné výhody, viz např. [11], str. 197, a [12], str. 7.

Nyní se podíváme, jak MLM ve verzích 2.1 a 2.3 prakticky funguje.

5.1 Vstup do MLM a jeho opuštění

Nejsnadněji se do MLM dostaneme z hlavního menu QMEGu, a to stiskem klávesy Return. Další možností je z DOSu (či obdobného programu) vyvolat skok na adresu $E480 (58496).

Nový start (neboli reinicializaci) běžícího MLM lze provést příkazem "N" (následovaným Returnem) nebo opětovným skokem na adresu $E480 (58496).

Opuštění MLM je možné několika způsoby:

5.2 Uživatelské rozhraní MLM

5.2.1 Obsah obrazovky po startu

Po startu MLM se v horní části zobrazí uvítací informační řádek, který vypadá pro verzi 2.1 následovně:

 *** MLM 2.1  (c)'87 by S.Dorndorf
a ve verzi 2.3 takto:
 *** MLM 2.3  (c)'97 by S.Dorndorf

O dva řádky níže následuje vlevo znak $ (který plní funkci promptu) a vedle něj textový kurzor. A to je vše, co na obrazovce po spuštění vidíme.

Uživatelské rozhraní MLM je tedy velmi jednoduché. V podstatě jde o textový příkazový interpretr, principem obdobný Atari Basicu. Kurzor je jednoznakový a lze jím volně pohybovat po celé obrazovce.

Po zadání příkazu a jeho potvrzení Returnem se od následujícího řádku za kurzorem zobrazuje výstup. Pokud je výstup delší, než počet volných řádků na obrazovce, text po řádcích roluje.

Po ukončení výpisu se opět zobrazí prompt následovaný kurzorem. Tím MLM dává najevo, že je připraven k přijetí dalších příkazů.

5.2.2 Prompt

Prompt (tj. znak zobrazený před kurzorem na novém řádku) může nabývat těchto podob:

5.2.3 Chybová hlášení

Pokud nastane problém s identifikací či prováděním zadaného příkazu, zobrazí MLM jeden z následujících výstupů:

5.3 Číselné soustavy

5.3.1 Teorie

Pro neprogramátory si dovolím připomenout některé základní informace o číselných soustavách. Většina lidí pracuje přirozeně s desítkovou (neboli dekadickou) soustavou. Tzn. používají se číslice 0 až 9 a o řád výš se postupuje při čísle deset, které se zapisuje jako 10.

To ovšem není jediný způsob, jak chápat a zapisovat číselné hodnoty. Technické řešení drtivé většiny počítačů je předurčuje k práci v režimu ano/ne, neboli pravda/nepravda, neboli ony příslovečné jedničky a nuly.

Číselná soustava používající pouze 2 číslice (0 a 1) se nazývá dvojková (neboli binární). 0 má hodnotu nula, 1 je jedna. Víc číslic není, proto je třeba pro další hodnotu přejít o řád výš. Tzn. 10 znamená dva. Pokračujeme 11, což je 3 a opět musíme zvýšit řád. Binární 100 znamená čtyři, pětku zapíšeme jako 101, šestku 110 atd.

Odtud pochází i oblíbený IT vtip: Existuje pouze 10 typů lidí - ti, kteří znají binární soustavu a ti, kteří ne.

Binární zápis čísel má ovšem některé nevýhody, např. délku. Vždyť už číslo osm zapsané binárně potřebuje čtyři číslice (1000). Proto lidé pohybující se v počítačovém světě používají číselné soustavy, jejichž základem jsou mocniny čísla 2. Nejčastěji to bývá osmičková nebo šestnáctková soustava. Deset žel není mocnina dvou.

My se zaměříme na šestnáctkovou soustavu. Jak jsme si ukázali výše, charakteristickými rysy číselných soustav jsou použité číslice, jejich počet a hodnota vyjádřená zápisem 10.

Těmto pravidlům se nevymyká ani šestnáctková (tzv. hexadecimální) soustava. Používá šestnáct číslic. Jsou to (nám desítkovým tvorům dobře známé) 0 až 9, následované znaky A (hodnota deset), B (jedenáct) až F (patnáct). Zápis 10 má v hexadecimální soustavě hodnotu šestnáct.

Metodická poznámka: v tomto textu dodržuji konvenci, že všechna hexadecimální čísla jsou uvozena znakem "$".

5.3.2 Přepínání číselných režimů

Jak uvádím v 5.2.2, režim čísel je avizován znakem použitým pro prompt. Ten udává, v jaké soustavě (tedy šestnáctkové nebo desítkové) očekává MLM zadávaná čísla.

Číselné režimy lze přepínat těmito jednopísmennými příkazy:

MLM podporuje pouze tyto dva číselné režimy.

5.3.3 Jednorázové použití jiné soustavy

Ve zvoleném režimu (hexadecimální nebo dekadický) lze jednorázově použít i čísla z té druhé (aktuálně neaktivní) číselné soustavy. Docílíme toho následovně:

5.3.4 Rekapitulace

Šestnáctkový (hexadecimální) režim:

Desítkový (dekadický) režim:

5.4 Aritmetické operace

Ačkoli se to může zdát nadbytečné, MLM umí provádět základní výpočetní operace - sčítání a odečítání. To se hodí, když jsme v paměti na určitém místě a potřebujeme poskočit o určitý počet bytů (či kilobytů) vpřed nebo vzad.

Pro počítání se předpokládá použití adres paměti, tj. lze zadávat pouze celá čísla v rozsahu 0 až 65535 ($0000 - $FFFF). Překročení nebo podkročení tohoto rozsahu nevyvolá chybu. Čísla se jakoby donekonečna opakují, tj. nad 65535 se nachází 0, pod nulou naopak 65535. Např. při zadání 65535 + 2 tak dostaneme 1.

5.5 Operace s pamětí

5.5.1 Organizace počítačové paměti

Při práci s pamětí je nutné umět se v ní aspoň trochu orientovat. Paměť se skládá z bitů, což jsou nejmenší jednotky. Každý bit může nabývat hodnotu 0 (vypnuto) nebo 1 (zapnuto).

Bity jsou seskupeny po osmi, přičemž osmici po sobě jdoucích bitů nazýváme byte. Každý byte může nabývat tolika hodnot, kolik je vzájemných kombinací hodnot jeho osmi bitů (tedy 0 nebo 1), což lze matematicky vyjádřit jako osmou mocninu dvou (8 bitů po 2 hodnotách), a to je 256. Konkrétně jde o hodnoty od 0 do 255 (resp. od $00 do $FF).

Protože paměť počítače obsahuje opravdu velké množství bytů, existují i násobky jednotek. Podobně jako pro 1000 metrů máme kilometr. Pro počítače by ovšem bylo náročné přepočítávat adresy paměti v násobcích tisíců, protože to není mocnina dvou.

Jako kompromis mezi lidskou potřebou zjednodušení a predispozicemi počítačů byl zvolen Kilobyte (KiB), což není 1000 bytů (to by byl kilobyte, neboli kB), ale 1024 bytů. Podobně existují i vyšší jednotky jako Megabyte (MiB), což je 1024 KiB atd.

Ještě upozornění: byte je značen B (tedy velké písmeno), zatímco bit je značen malým b. Bit se používá nejčastěji při vyjadřování rychlosti přenosu dat. Např. 16 Kib/s (16 Kilobitů za sekundu) je osmkrát méně než 16 KiB/s (což je 128 Kib/s).

Operační (tj. přímo adresovatelná) paměť osmibitového počítače Atari má zpravidla velikost 64 KiB (krom modelů Atari 400, Atari 600 XL a Atari 800, které disponují RAM v rozmezí 8 až 48 KiB).

5.5.2 Paměťové adresy a jejich rozsahy

Každý byte v paměti má přiděleno jedinečné číslo, které se nazývá adresa. Adresa plní funkci pomyslného telefonního čísla, protože slouží k tomu, aby mohl procesor s konkrétním bytem paměti komunikovat.

Procesor 6502 (použitý v Atari) má adresovou sběrnici o velikosti 16 bitů. To je něco jako počet míst na displayi telefonu. Může tedy "vytáčet" adresy paměti od 0 ($0000) do 65535 ($FFFF), neboli 65536 různých hodnot.

16 bitů jsou 2 byty, z nichž každý může nabývat 256 hodnot. Paměť lze vnímat jako 256 bloků (tzv. stránek), z nichž každý má velikost 256 bytů. Jeden z bytů adresy (tzv. vyšší) udává číslo stránky paměti, tj. něco jako telefonní předvolbu. Druhý (tzv. nižší) byte adresy je pak číslo konkrétního bytu na dané stránce.

A 256 krát 256 je zase 65536, což odpovídá 64 KiB. A proto nemůže mít 8bitové Atari větší operační paměť. Namítáte, že existuje Atari 130 XE se 128 KiB RAM a různá rozšíření paměti až do 1 MiB? Ano, ale tuto rozšířenou paměť nelze adresovat přímo jako paměť operační. QMEG ji např. umí využít jako ramdisk.

Nás teâ zajímá, jak konkrétní byte paměti adresovat v MLM. To je snadné. Stačí napsat adresu příslušného místa paměti dekadicky nebo hexadecimálně (v závislosti na zvoleném režimu).

Vedle toho umí MLM pracovat i s rozsahem adres. Pokud chceme říci vše od $A000 do $AFFF, zapíšeme to tak, že mezi počáteční a konečnou adresu vložíme tečku, tedy $A000.$AFFF.

MLM 2.3 zavádí ještě jednu možnost zápisu, a to adresu paměti následovanou tečkou. To znamená zobrazit 128 bytů od zadané adresy (včetně). Např. $8000. znamená rozsah od $8000 po $807F.

5.5.3 Čtení obsahu paměti

Čtení obsahu paměti je důležité především pro kontrolu obsahu paměti na konkrétním místě. Jde o obdobu příkazu PEEK v Basicu. Čtení lze v MLM provádět několika způsoby:

Příklady použití:

$CFB0
 CFB0;26 2F 32 2D 21 34 34 29"&/2-!44)

$CFB0"
 CFB0"&/2-!44)

$CFB0'
 CFB0'FORMATTI

Dekadický výpis se mezi verzemi QMEGu drobně liší. QMEG 3 vypisuje jednotlivé hodnoty počtem číslic, který odpovídá jejich délce. QMEG 4 řadí hodnoty pod sebe tím, že všechny zobrazuje zarovnané nulami zleva na délku 3 číslic.
Příklad:

#100
 100;222 191 001 000 061 188 192 000

#100
 100;222 191 1 0 61 188 192 0

Příkaz pro zobrazení lze zadat i bez adresy, tj. jen samotný středník, uvozovky, apostrof, L nebo jen "naprázdno" stisknout Return. V tom případě se zobrazí hodnoty dalších 8 bytů (resp. 20 řádků u L) od posledně zobrazené adresy.

Místo jednotlivé adresy můžeme určit rozsah adres ve formě adresa1.adresa2, např. 32100.32200;.

Speciálním typem rozsahu adres je znak * (hvězdička). Je to zkratka pro zápis "až do konce paměti". Pokud za hvězdičku uvedeme adresu, začne se zobrazovat od ní; jinak od posledně zobrazené adresy + 1. Hvězdičku lze použít v kombinaci se středníkem, uvozovkami, apostrofem i L.

Pokud délka výpisu přesahuje výšku obrazovky, začne výpis rolovat. Ubíhající text můžeme pozastavit kombinací kláves Control+1 a stejnou kombinací ho pak nechat pokračovat. Výpis můžeme také kdykoli ukončit klávesou Break.

MLM 2.3 zavádí ještě jednu možnost pozastavení rolujícího výpisu, a to klávesu Shift. Pokud stisknete v průběhu výpisu Shift, výpis se pozastaví do okamžiku, kdy Shift pustíte. Na rozdíl od Control+1 přeruší držení Shiftu výpis vždy po ukončení řádku, tj. poslední zobrazený řádek je vždy celý.

Vedle zobrazení na obrazovce můžeme poslat výstup i na tiskárnu. Toho dosáhneme předřazením znaku "^" (stříška) před adresu, např. ^$D000 nebo ^$A000.$A3FFL. Tisknout lze ovšem jen číselné hodnoty nebo disassemblovaný k˘d. Nedá se tedy použít v kombinaci s " nebo '.

5.5.4 Prohledávání paměti

Vedle přímého čtení konkrétní adresy je často velmi užitečné mít možnost v paměti nějakou hodnotu či přímo řetězec znaků vyhledávat. Možnosti jsou obdobné jako při výpisu obsahu paměti:

MLM vypíše seznam adres, na kterých našel shodu (pokud k nějaké došlo).

5.5.5 Zápis hodnot do paměti

Pokud nechceme paměť počítače jen pasivně číst nebo prohledávat, ale aktivně ji měnit, potřebujeme mít možnost do paměti zapisovat. To je obdoba příkazu POKE v Basicu. MLM to provádí následovně:

Nutno upozornit, že některé části paměti RAM mohou být překryty pamětí ROM (operační systém, Basic, cartridge). Zápis do těchto oblastí nebude mít žádný efekt. Původní hodnoty zůstanou nezměněny, ale MLM zároveň neohlásí žádnou chybu.

5.5.6 Kopírování části paměti

MLM umožňuje vzít část paměti a její obsah zkopírovat na jiné místo paměti. Zápis takového příkazu je následující:

adresa1.adresa2 M adresa3

Obsah paměti od adresy 1 po adresu 2 (mínus 1 byte) se překopíruje na místo od adresy 3. Stejný obsah tedy potom bude na dvou místech.

Příklad:

E000.E200 M 3000

Zkopíruje znakovou sadu operačního systému do paměti RAM od adresy $3000.

5.5.7 Porovnávání dvou oblastí paměti

Také velmi užitečná funkce. Syntaxe je podobná jako při kopírování:

adresa1.adresa2 V adresa3

Obsah paměti od adresy 1 po adresu 2 (mínus 1 byte) se porovná se stejně dlouhým úsekem paměti od cílové adresy 3. Pro každý byte, jehož hodnota se liší je vypsán 1 řádek obsahující zdrojovou adresu, hodnotu na zdrojovém místě a hodnotu na cílovém místě.

5.5.8 Plnění paměti

Příkaz pro plnění zadané části paměti má pouze MLM 2.3. Jeho syntaxe je následující:

adresa1.adresa2 = hodnota

Obsah paměti od adresy 1 po adresu 2 (mínus 1 byte) bude vyplněna zadanou hodnotou, která musí být v rozsahu 0 až 255. Hodnotu lze zadat pouze jednu, takže není možné vyplnit takto část paměti opakující se skupinou hodnot.

Tuto nevýhodu lze ovšem obejít jednoduchým trikem. Ten současně umožňuje vyplňovat paměť i v MLM 2.1.

Vysvětlíme si to na příkladu. Řekněme, že chceme oblast od $3000 po $30FF vyplnit posloupností hodnot $AA $BB $CC. Začneme tím, že na adresu $3000 (až $3002) tyto hodnoty ručně vložíme:

3000;AA BB CC

Nyní potřebujeme nakopírovat hodnoty z $3000 až $3002 periodicky do oblasti od $3003 po $30FF. Ačkoli to nezní intuitivně, udělá to za nás následující příkaz:

3000.30FD M 3003

To "30FD" není překlep. Protože kopírujeme posloupnost o délce 3 byty, musíme počítat s tím, že nám přeteče o 2 byty ($30FE a $30FF) za zadanou cílovou adresu (tj. $30FD). Kdybych tam nechal $30FF, přepsaly by se ještě adresy $3100 a $3101, což nechceme.

1 byte (hodnotu uloženou v $3000) bychom rozkopírovali do stejné oblasti takhle:

3000.30FF M 3001

5 bytů pak takto:

3000.30FB M 3005

Pravidla lze zobecnit následovně. Před tečku uvádíme adresu, od které budeme vyplňovat a kde současně leží počátek vyplňovaných hodnot. Za tečkou uvedeme adresu, kterou již nechceme přemazat, ovšem poníženou o délku (počet bytů) kopírované posloupnosti. Tuto délku musíme naopak přičíst k počáteční adrese a výsledné číslo uvedeme za M.

Vyplňování paměti lze samozřejmě použít i pro její mazání, a to tak, že určitou oblast vyplníme nulami (tedy ne znakem 0, ale hodnotou $00). Pokud nějakou oblast zkopírujeme a původní místo pak smažeme, docílíme vlastně přesunu původního obsahu.

5.5.9 Zakázané adresy

MLM je také jen program. Sice uložen v paměti ROM, přesto potřebuje pro svůj běh několik desítek bytů v paměti RAM. Z principu věci není vůbec dobrý nápad hodnoty na těchto adresách měnit. A které to jsou?

MLM 2.1 využívá tyto části RAM:

MLM 2.3 využívá tyto části RAM:

5.6 Operace s diskem

Vedle práce s pamětí umí MLM načíst či zapisovat i data na disku. Tyto operace není možné provádět po bytech. Je nutné pracovat s celými sektory.

Sektor má v případě formátů single a medium délku 128 bytů. U formátů double a quad (DS/DD) mají sektory 256 bytů. Sektory jsou číslovány od 1.

5.6.1 Načtení sektorů do paměti

Načítají se sektory z disketové jednotky 1, a to od uvedeného sektoru až dokud není dosaženo zadaného počtu načtených sektorů. Všechna načtená data se (byte po bytu) zapisují do paměti od určené adresy.

Syntaxe je následující:

adresa<od_sektoru.počet_sektorů

Příklad:

4000<100.12

Načte 12 sektorů počínaje sektorem 100 a získaná data ukládá od adresy 4000.

5.6.2 Zápis sektorů na disk

MLM zapíše obsah paměti od určené adresy v rozsahu stanoveném počtem sektorů na disketu č. 1. Počet sektorů musí být menši než 256, přičemž hodnota 0 znamená 255.

Syntaxe příkazu:

adresa>od_sektoru.počet_sektorů

Příklad:

4000>100.12

Zapíše data uložená v paměti od adresy 4000, a to v rozsahu 12 sektorů (tj. 1536 bytů ve formátu single nebo medium) počínaje sektorem 100.

5.7 Práce s registry

5.7.1 Registry procesoru

Vedle 65536 bytů operační paměti existuje ještě jedno místečko, kde lze uchovávat trošku informací. Tímto místečkem jsou registry přímo v procesoru 6502. Jde o pouhých 7 bytů rozdělených do 6 "chlívečků", zvaných registry.

Tyto registry nemají (na rozdíl od bytů v paměti RAM) adresy, ale jména. Jsou označeny X, Y, akumulátor, stavový registr (SR), ukazatel zásobníku (SP) a programový čítač (PC). Programový čítač má délku 16 bitů (2 byty), zatímco ostatní registry jsou 8bitové.

Registry mají specifický význam pro běh každého programu. V assembleru se používají např. pro početní operace či k podmíněným skokům. Více o assembleru si můžete přečíst např. v knize [9], více o registrech procesoru pak v knize [10].

5.7.2 Registr řízení paměti.

MLM 2.3 pracuje kromě registrů procesoru 6502 ještě s registrem řízení paměti, který je zajišťován obvodem PIA 6520. Tento registr je dostupný na adrese 54017 ($D301) a je označován jako PORTB (protože u Atari 400 a 800 obsluhoval 3. a 4. joystickový port).

U počítačů s přídavnou pamětí (včetně 130 XE) je PORTB používán k řízení práce s touto pamětí. Protože rozšířenou paměť není možné adresovat přímo, vezme se její část (16 KiB) a tou se překryje vyhrazená část operační paměti (adresy 16384 až 32767, tj. $4000 až $7FFF).

Podrobnější informace o registru PORTB lze najít např. v knize [2], strany 1 až 3, nebo v knize [5], strany 49 až 52.

5.7.3 Zjištění obsahu registrů

Ke zobrazení obsahu všech registrů slouží jednopísmenný příkaz "R". V MLM 2.3 vypadá výstup takto:

  PC MEM AC XR YR NV-BDIZC
 0000 FF 00 00 00 00

Význam jednotlivých hodnot (zleva):

PC = programový čítač,
MEM = reg. řízení paměti,
AC = akumulátor,
RX = registr X,
RY = registr Y,
NV-BDIZC = stavový registr.

Výstup MLM 2.1 se liší pouze tím, že v něm chybí sloupec MEM. Hodnoty registrů jsou vždy zobrazeny hexadecimálně (bez ohledu na zapnutý číselný režim).

5.7.4 Změna hodnot registrů

Hodnotu v některých registrech lze přímo měnit. V MLM toho docílíme zapsáním jednopísmenného označení registru, rovnítkem a 8bitovou hodnotou (0-255, resp. $00-$FF), kterou do něj chceme vložit.

Označení registrů v MLM je následující:

W - akumulátor
X - registr X
Y - registr Y
P - stavový registr
M - registr řízení paměti (jen
    v MLM 2.3)

Pokud tedy chceme do registru X vložit hodnotu $A0, napíšeme X=A0 a stiskneme Return. Hodnotu programového čítače přímo měnit nelze.

V MLM 2.3 není možné přímo měnit hodnotu na adrese 54017 ($D301). Změnu hodnoty PORTB lze docílit právě jen pomocí nastavení registru M.

5.8 Spuštění programu

Paměť počítače může obsahovat různé typy dat: čísla, text, obrázky, zvuky. Prostě cokoli, co se dá přepsat do číselné (digitální) podoby.

Speciálním druhem dat v paměti jsou instrukce strojového jazyka, neboli program. Jde o posloupnost příkazů pro procesor, z nichž většina je doplněna o parametry (např. adresa paměti, ze které se má číst hodnota).

Každá instrukce (resp. její identifikátor) zabírá v paměti 1 byte. Bezprostředně za instrukcí následují její parametry, také jednobytové hodnoty. Každý typ instrukce má přitom počet parametrů přesně stanoven, takže procesor ví, kolik jich má přečíst.

Hned za posledním parametrem první instrukce následuje k˘dové označení další instrukce a její parametry. A tak to jde pořád dál, dokud program neskončí.

Program se do paměti může dostat různými způsoby. Jednou z možností je vložit jej tam ručně. Další možností je načtení z disku, cartridge či jiného paměťového média.

Běh programu potom vypadá tak, že procesor načte první příkaz a vykoná jej s použitím jeho parametrů. Těch ví, kolik je, takže následně skočí za ně, kde najde další příkaz, který vykoná, skočí za jeho parametry atd.

Jak ale procesor ví, kdy a hlavně odkud má začít číst instrukce? To je součást procesu, kterému říkáme spuštění programu neboli skok na adresu.

MLM k tomu používá příkaz GO, před který je nutné napsat adresu, od které má procesor začít programový k˘d vykonávat.

Pokud tedy máme strojový program uložený v paměti od adresy $3000, spustíme jej příkazem

3000 GO

Program potom běží, dokud nenarazí na svůj konec (instrukce RTS) nebo dokud uživatel nestiskne Reset (nebo nevypne počítač). Narazí-li program na RTS, vrátí se zpět do MLM.

6. QMEG Freezer

Tato nová a zajímavá funkce je dostupná pouze v QMEGu 4. Freezer (znamená anglicky "mrazák") způsobí, že běh procesoru převezme pod kontrolu QMEG. Do té chvíle běžící program přitom jakoby zamrzne - obraz i zvuk zůstanou zaseknuté.

K čemu je to dobré? Zamrznutý obsah paměti (zpravidla při běhu nějakého programu) lze pozměnit nebo odložit do rozšířené paměti. Odtud lze paměť uložit na disk a někdy později obnovit stav přesně v okamžiku zamrazení.

6.1 Freezer-Poke

Tato funkce je pojmenována po známém příkazu POKE z Basicu. Pro jistotu připomenu, že POKE slouží k uložení hodnoty do paměti, neboli změně obsahu konkrétního bytu paměti.

Takže Freezer-Poke nám umožní po zmrazení běžícího programu změnit libovolný byte v paměti RAM a "odmrazit" program, aby mohl dále pokračovat.

Pokud chceme tuto funkci využít, nejprve spustíme požadovaný program a uvedeme jej do stavu, kdy chceme provést změnu.

Nyní musíme program zmrazit, což provedeme kombinací kláves Control+Help. Aktivace freezeru je avizována krátkým zvukem. Pokud zůstává znít zamrazený zvuk programu, můžeme jej vypnout pomocí mezerníku.

Nyní můžeme začít měnit obsah paměti. Každá změna se zadává sekvencí šesti hexadecimálních číslic (tj. znaky 0 až 9 a A až F). První 4 zadané číslice představují adresu paměti a poslední 2 pak hodnotu, která se má na danou adresu zapsat.

Zadávané hodnoty se nezobrazují. Jednotlivé stisky kláves jsou ale avizovány krátkým zvukem. Pokud se dopustíme překlepu, můžeme posledně zadanou číslici smazat klávesou Delete.

V případě potřeby je možné smazat i celou (dosud neodeslanou) sekvenci, a to klávesou Clear.

Pokud šestici zadáme úspěšně (nebo si to aspoň myslíme), odešleme ji ke zpracování. Jak jinak než Returnem. Změna se okamžitě provede.

Nyní můžeme pokračovat další změnou paměti, tj. zadáním další šestice, nebo ukončit freeze klávesovou zkratkou Control+Help či jenom Help.

Prakticky si to můžeme ukázat např. na hře Qausimodo. Nejprve hru nahrajeme. Na úvodní obrazovce zmáčkneme Control+Help, zadáme šestici 2DB300, potvrdíme Returnem a odmrazíme Helpem. Nyní můžeme hru Startem spustit a jsme nesmrtelní!

6.2 Freezer a ramdisk

Druhým způsobem využití freezeru je uložení celé operační paměti do ramdisku. Později můžeme takto uložený obraz paměti načíst zpět do RAM a tím vrátit počítač do stavu v okamžiku uložení.

Asi není třeba upozorňovat, že při ukládání obrazu paměti bude obsah ramdisku přepsán.

Jak na to? Až dostaneme počítač do stavu, který chceme uložit, nejprve aktivujeme freezer známou kombinací Control+Help.

Paměť do ramdisku uložíme klávesovou zkratkou Control+S. Operace trvá zhruba 2 sekundy. Systém odmrazíme opětovným stiskem Control+Help (nebo jen Help).

Budeme-li chtít stav paměti z ramdisku obnovit, postupujeme obdobně. Nejprve aktivujeme freezer (Control+Help), následuje klávesová zkratka pro načtení (což je Control+L) a operaci ukončíme stiskem Control+Help nebo Help.

A do třetice ještě jedna funkce související s ramdiskem - výměna. QMEG totiž umí v režimu freezeru zaměnit obsah operační paměti a ramdisku, tj. co bylo v RAM přesune se do ramdisku a opačně. K tomu slouží klávesová zkratka Control+E.

Všechny tři funkce, tak jak jsme je popsali (tj. s použití klávesy Control), pracují s prvním ramdiskem, označovaným písmenem X.

Pokud však máme k dispozici paměti více (128 nebo 192 KiB), můžeme ji rozdělit do 2 ramdisků (X a Y) a potom pro Freezer využít i druhou část (Y).

Princip fungování je stejný jako při využití ramdisku X. Jediný rozdíl je v klávesových zkratkách. Místo Control se používá Shift, tj. Shift+S (ulož do Y), Shift+L (načti z Y) a Shift+E (vyměň obsah RAM a Y).

Ještě jedno upozornění: Program obnovený načtením z ramdisku nemusí fungovat dokonale. Stav počítače totiž vedle obsahu paměti definují i hodnoty hardwarových registrů. Ty ovšem spolu s pamětí uloženy nejsou.

Dalším omezením jsou programy (např. některé hry nebo dema), které vypínají operační systém. Ty pak samozřejmě služeb OS (včetně QMEGu a jeho freezeru) využívat nemohou.

6.3 Uložení zmrazené paměti na disk

Uložení stavu (moderně bychom řekli snapshotu) do ramdisku je hezké, ale co když chceme uchovat tento "snímek" na delší dobu než do vypnutí počítače? Můžeme si ramdisk zapsat na externí disk.

Toho docílíme v menu QMEGu bez zapnutého freezeru (tj. bez Control+Help). Stačí prostě klávesy "R" a "W", jak bylo popsáno v prvním díle tohoto textu (část 2.8.1 a 2.8.2).

Lepší je ovšem použít Shift+W (pro zápis) a Shift+R (pro načtení). Tak dojde k zapsání, resp. načtení, pouze nezbytného počtu sektorů. Rozdíl je patrný také ve stavovém řádku, kde se vpravo zobrazí navíc písmeno F (jako Freezer). Použití Shift+W a Shift+R je nezbytné pro počítače s pouze 64 KiB rozšířené paměti (typicky 130 XE).

Shift+R a Shift+W (stejně jako "R" a "W") berou jako cílový, resp. zdrojový, vždy jen ramdisk X. Chceme-li ovšem přesunout obsah X (uložený ve freezeru pomocí Control+S) do Y, najedeme kurzorem na disk přidělený Y (defaultně 7 a 8), stiskneme Shift+W a následně Start. Naopak pro přesun obsahu z Y do X najedeme na Y a stiskneme Shift+R.

Uložení zmrazené paměti z X na disketu provedeme tak, že najedeme kurzorem na příslušný disk (např. 1), stiskneme Shift+W a potom Start. Pro načtení uložené paměti v budoucnu najedeme na jednotku s uloženým obsahem a stiskneme Shift+R (následovaný startem).

A to je pro tentokrát vše, přátelé.

Bohdan Milar
2018

Zdroje:

[2] Ramdisk (práce s rozšířenou pamětí); R. Kudla, Z. Burian, L. Burian. 1992. Flop, Rožnov pod Radhoštěm
[4] Adresy paměti počítačů ATARI 600 XL/800 XL 1; P. Dočekal. 1987. ČSVTS OKP Liberec
[5] Adresy paměti počítačů ATARI 600 XL/800 XL 2; P. Dočekal. 1987. ČSVTS OKP Liberec
[9] Asembler; R. Kudla. 1992. Flop, Rožnov pod Radhoštěm
[10] Mikroprocesor 6502 - popis instrukcí. 1992. Atari klub Olomouc
[11] ATARI Manuály II; I. Drastich. 1989. Klub mikroelektroniky při ČSVTS Ostrava
[12] Flop Bulletin 2/94. 1994. Flop, Rožnov pod Radhoštěm