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.