Chip-8 a SuperChip-8

Osmibitový virtuální herní stroj.

Nebudu zabíhat do historie procesoru RCA 1802 (píše se o něm jako o jednom z prvních RISC procesorů, i když tehdy to tak úplně nebylo) a počítače COSMAC ELF (COSMAC není označení firmy, ale použitého procesoru RCA 1802).
Pro Chip-8 je důležité, že další počítač, COSMAC VIP, s úžasnou monochromatickou grafikou v rozlišení 64×32 pixelů (ano, i v tomto rozlišení bylo možné provozovat Tiny Basic) byl vybaven několika hrami napsanými v kódu virtuálního procesoru Chip-8, který byl na počítači interpretován jednoduchým interpretem (protože si hry do počítače vkládal uživatel sám jako sled čísel, měl výrobce zájem na tom, aby kód samotné hry byl co nejkratší, a použil raději interpretovaný pseudokód, než skutečný strojový kód).
(c) old-computers.com
Později dokonce vznila i herní konzole RCA Studio II založená na stejném hardware a obsahující v ROM interpret umožňující spouštět právě hry napsané pro Chip-8.

Kromě klasických programů pro Chip-8 vznikají i nové hry a dokonce dema (například od Revival Studios).
Třeba na hru AstroDodge se můžete podívat ZDE.

Chip-8 interpreter, a tedy i v něm psané hry, lze spustit i na osmibitech – najdete jej ve verzi pro Commodore 64, pro Atari 800 i se zdrojákem, pro ZX spectrum 48 je potom ke stažení od Rusů nezkompilovaný zdroják.

Základní Chip-8 zná 35 instrukcí.

Má 16 osmibitových registrů V0-VF a 16bitový pointer do paměti I.
VF má speciální použití – slouží jako carry flag a detektor kolize “spritů”.

Interakce se zvukem a grafikou jsou řešeny následovně:

Chip-8 zná dva časovače, které se odečítají s každým půlsnímkem (60 Hz na NTSC) do nuly. Jeden z časovačů (ten druhý) určuje dobu trvání tónu (když se vynuluje, tón ztichne). Výšku tónu ovlivnit nejde.

Do rastru 64×32 bodů kreslí jen dvě instrukce instrukce – 00E0 maže obrazovku a Dxyn kreslí do obrazovky “sprite” – široký vždy 8 bodů (jeden byte) o výšce “n” bajtů (a tedy mikrořádků) na souřadnice určené registry Vx a Vy. Při překročení hranic obrazovky pokračuje na opačné straně (obrazovka je jakoby “zamotána od sebe”).
Sprity se kreslí pomocí XOR, při překreslení (smazání) již nakresleného pixelu se nastaví VF do jedničky (jako příznak kolize spritů).
Zvláštním případem “spritů” jsou číslice 0-F v rastru 4×5 pixelů, jejichž bitmapa je součástí samotného interpretu Chip-8 (jejich adresu nastavuje instrukce Fx29, která sama ovšem do obrazovky nevykresluje).

Jako vstup se předpokládá “hexadecimální” klávesnice s 16 tlačítky 0-F, obvykle se jako směry používají klávesy 2, 4, 6, 8.

Paměť 0000-01FF je vyhrazena pro samotný interpret Chip-8 (ten se tedy v kódu procesoru 1802 vešel do 512 byte), programy pro něj obvykle začínají na adrese 0200.
Paměť 0F00-0FFF (256 byte) byla na originálním hardware vyhrazena jako buffer pro videoRAM, ale moderní implementace to nevyužívají.
Paměť původně vyhrazená pro interpret se v moderních implementacích využije jen pro uložení dat fontů (znaky 0-F v rastru 4×5 pixelů a pro SuperChip-8 znaky 0-9 v rastru 8×10 pixelů).

“Instrukce” Chip-8 jsou dvoubajtové.
Operační kódy instrukcí jsou:

0nnn – skočí na strojovou rutinu v kódu procesoru RCA 1802 na adrese 0nnn.
00E0 – smaže obrazovku.
00EE – návrat z podprogramu.
1nnn – skok na adresu nnn.
2nnn – skočí na podprogram na adrese nnn.
3xnn – podmíněný skok, přeskočí následující instrukci, když registr Vx=nn.
4xnn – podmíněný skok, přeskočí následující instrukci, když registr Vx<>nn.
5xy0 – podmíněný skok, přeskočí následující instrukci, když registr Vx=Vy.
6xnn – uloží do registru Vx číslo nn.
7xnn – přičte k registru Vx číslo nn.
8xy0 – uloží do registru Vx obsah registru Vy.
8xy1 – Vx= Vx OR Vy.
8xy2 – Vx= Vx AND Vy.
8xy3 – Vx= Vx XOR Vy.
8xy4 – Vx= Vx + Vy. VF je nastaven na 0, při přetečení na 1.
8xy5 – Vx= Vx – Vy. VF je nastaven na 1, při podtečení na 0.
8xy6 – rotuje Vx doprava, do VF “přeteče” “vyteklý” nejnižší bit.
8xy7 – Vx= Vy-Vx. VF je nastaven na 1, při podtečení na 0.
8xyE – rotuje Vx doleva, do VF “přeteče” “vyteklý” nejvyšší bit.
9xy0 – podmíněný skok, přeskočí následující instrukci když Vx<>Vy.
Annn – ukazatel I nastaví na hodnotu nnn.
Bnnn – skočí na adresu nnn+V0.
Cxnn – do registru Vx uloží náhodné číslo (0-255) ANDované 8bitovou maskou nn.
Dxyn – na souřadnice obsažené v registrech Vx a Vy vykreslí n-řádkový “sprite”, jeden mikrořádek odpovídá jednomu byte, data čerpá z adresy určené ukazatelem I, po skončení kreslení je I nezměněn, při “kolizi spritů” (při smazání již nakresleného pixelu XORem s původními obrazovými daty) nastaví VF na 1, jinak na 0.
Ex9E – přeskočí následující instrukci při stisku klávesy, jejíž kód je uložen v registru Vx.
ExA1 – přeskočí následující instrukci, když není stištěna klávesa, jejíž kód je uložen v registru Vx.
Fx07 – do registru Vx načte hodnotu prvního časovače.
Fx0A – čeká na stisk klávesy, její kód uloží do registru Vx.
Fx15 – nastaví první časovač na hodnotu uloženou v registru Vx.
Fx18 – nastaví druhý časovač (délku tónu) na hodnotu uloženou v registru Vx.
Fx1E – I= I + Vx.
Fx29 – nastaví ukazatel I na bitmapu (4×5 pixelů) znaku (v rozsahu 0-F) v registru Vx.
Fx33 – uloží obsah registru Vx od adresy I jako BCD (stovky na adresu I, desítky na I-1, jednotky na I+2).
Fx55 – uloží obsahy registrů V0-Vx (včetně Vx) do paměti od adresy určené ukazatelem I.
Fx65 – naplní registry V0-Vx (včetně Vx) obsahem paměti od adresy určené ukazatelem I.

I s těmito pár instrukcemi se dají vytvořit hry jako Tetris, Pacman, Pong a další.
Přidáním několika instrukcí a zjemněním grafiky na 128×64 pak vznikne interpret SuperChip-8.

SuperChip-8 přidává nebo upravuje tyto instrukce:

00Cn – scroll celého obrazu o daný počet mikrořádek dolů.
00FB – scroll celého obrazu o 4 pixely doprava.
00FC – scroll celého obrazu o 4 pixely doleva.
00FD – opustí interpret SuperChip-8 a vrátí se do systému (UserRPL na kalkulačkách HP 28, 48, 49, 50).
00FE – nastaví základní grafický režim 64×32 pixelů.
00FF – nastaví rozšířenou grafiku 128×64 pixelů.
Dxyn – funguje jako v Chip-8, ale při n=0 vykreslí sprite 16×16 pixelů.
Fx30 – nastaví ukazatel I na bitmapu (8×10 pixelů) znaku (v rozsahu 0-9) v registru Vx.
Fx75 – uloží obsahy registrů V0-Vx (včetně Vx) do uživatelských flagů (předá je jako parametry programovacímu jazyku kalkulaček HP).
Fx85 – naplní registry V0-Vx (včetně Vx) obsahem uživatelských flagů (načte parametry předané programovacím jazykem RPL na kalkulačkých HP).

Poslední dvě instrukce slouží na kalkulačkách HP 28, 48, 49 a 50 k předávání parametrů mezi systémem UserRPL a interpretem Chip8, na ostatních platformách nebudou mít zvláštní využití a lze je považovat “jen” za instrukce uschovávající obsah registrů mimo hlavní dostupnou paměť Chip-8.

Původně měl tento článek sloužit jako inspirace k vytvoření implementace Chip-8 pro mikropočítač Tesla Ondra SPO-186.
Ovšem podle posledních informací už Martin K. má část instrukcí hotovu a pokračuje dál.