Přejít k navigační liště

Zdroják » Různé » Jednodesková výzva (nejen) pro milovníky osmibitů začíná

Jednodesková výzva (nejen) pro milovníky osmibitů začíná

Články Různé

Dámy a pánové, vítám vás u Jednodeskové výzvy, určené všem programátorům, co si troufají ukázat světu, jak to válí s osmibitem. Troufnete si napsat vlastní firmware pro jednodeskový osmibitový počítač?

Nálepky:

Text vyšel původně na webu retrocip.cz.

Jednodeskáč, tedy celým jménem „jednodeskový mikropočítač“, byl v 70. a 80. letech malý počítač, co se vešel na jednu desku. Dnes se na jednu desku vejde leccos, ale tehdy jste si moc vyskakovat nemohli. Většinou se tam vešel procesor, trocha paměti (typicky 1 kB RAM, 1 kB PROM), klávesnice (měla většinou okolo 20-25 tlačítek: 16 znaků 0-9 a A-F pro zadávání hexadecimálních číslic a několik ovládacích), displej (ze sedmisegmentovek) a nějaké vstupně/výstupní porty, které byly buď dostupné pro další rozšiřování, nebo na nich byly různé LEDky, motorky a podobně. (Hezky o jednodeskáčích píše Nostalcomp.)

V Československu se vyráběly dva známější jednodeskáče (a několik dalších, dnes už pozapomenutých): legendární PMI-80 a školní jednodeskový počítač TEMS 80-03A. Oba s procesorem 8080A a s plusmínus stejnou technickou výbavou. Několik jednodeskových počítačů vzniklo i péčí nadšenců (BOB85, SAVIA84), vznikaly i jako stavebnice (Petr)… Technicky vzato byl třeba i Ondra jednodeskový, ale pro nás budiž jednodeskáč počítač s omezenou klávesnicí a s displejem ze sedmisegmentovek.

Ve světě se prosadil asi nejvíc KIM-1, jednodeskový počítač od MOS Technology s procesorem 6502. Vznikla i „odlehčená“ verze Junior Computer. Další zajímavý jednodeskáč byl třeba Cosmac Elf nebo Heathkit ET3400. (A samozřejmě spousta dalších.)

PMI-80

Jako příklad si uvedeme PMIčko. Je totiž velmi dobře zdokumentované, hlavně díky sérii článků v Amatérském Radiu (výtah najdete zde). PMI-80 kromě procesoru 8080A obsahovalo 1 kB RAM, 1 kB ROM (a mohli jste si druhý kB přidat), klávesnici s 25 tlačítky, devítimístný displej z kalkulačky (obojí připojené přes periferní obvod 8255) a primitivní rozhraní pro magnetofon.

Já si kdysi udělal online emulátor PMI-80, a tak si můžete ověřit, jak to celé fungovalo.

ROM byla od adresy 0000 (logicky, po RESETu se spouštěl program od téhle adresy). RAM byla od adresy 1C00 do 1FFF. S periferiemi se komunikovalo na adresách F8, F9, FA a FB (klasická čtveřice registrů 8255 – PA, PB, PC, řídicí). Displej používal budič a dekodér 1-z-9 typu MH1082, připojený na port PC (=adresa FA), bity 0-3. Tímto bitem se vybírala pozice na displeji. Segmenty ovládal port PA (=adresa F8), a to bity 0-6 (bit 7 nebyl zapojený, desetinná tečka nefungovala).

Stejný budič používala i klávesnice, dokonce kvůli tomu byla zapojená do matice 3×9 (tlačítka I a RE, Interrupt a Reset, byly mimo matici a šly přímo k procesoru). Informace z řádků klávesnice se četly na portu PC, piny 4-6.

Displej tedy musel být pravidelně občerstvován procesorem; jakmile se program někde zasekl, zůstala svítit jediná pozice a klávesnice přestala reagovat.

Na magnetofon se vysílalo pomocí nosného kmitočtu na bitu 6 portu PA, klíčovaného bitem PA7. Z magnetofonu se data četla přes pin PC7.

Ovládání pmi-80

Displej byl, jako u většiny jednodeskáčů, rozdělen na část adresní (vlevo) a část datovou (vpravo). Rozdělení nebylo nijak dané, byla to čistě konvence. Klávesnice obsahovala 25 tlačítek, fyzicky rozmístěných do matice 5×5:

Tlačítko RE celý systém zresetovalo a na displeji se objevil nápis „PMI-80“. Po stisknutí libovolné klávesy (tedy kromě RE a I) se na displeji úplně vlevo objeví znak, co má být asi otazník, který říká, že PMI je připravené přijímat pokyny.

Nejzásadnější věc u jednodeskáče byla funkce prohlížení a měnění obsahu paměti. Po stisku tlačítka M (Memory) se vlevo objevilo „velké M“ (píšu to v uvozovkách, protože na sedmisegmentovém displeji to vypadá spíš jako obrácené velké U nebo ruské P), pak mezera a čtyři pozice adresy. Třeba: „M 1C00“ Pomocí hexadecimální klávesnice jste zadali adresu (pokud jste udělali chybu, prostě jste psali dál, systém bral jako platné pouze čtyři poslední znaky) a tlačítkem „=“ jste ji potvrdili. Na displeji se objevil za adresou znak „=“ a za ním dva znaky – obsah paměti na dané adrese. Třeba „M 1C00=00“. Teď můžete zadat nový obsah, zase pomocí hexadecimální klávesnice a zase se berou pouze poslední dva znaky, a tlačítkem „=“ potvrdíte změnu a přesunete se k další adrese.

Konec zadávání můžete buď způsobit tím, že stisknete klávesu, kterou program nečeká (třeba EX), nebo resetujete stroj (RE). Tady reset neznamená vymazání paměti, takže to, co jste zadali, v ní zůstává.

Pomocí EX jste program spustili. Po stisku EX zase systém očekává zadání adresy, a po jejím potvrzení tlačítkem „=“ spouští program.

Sofistikovanější podobu měla funkce Break (BR). Zde jste nejprve zadali adresu, na které se má program přerušit a skočit do monitoru, a v druhém kroku spouštěcí adresu. Jakmile program narazil na danou adresu, odskočil zpět do monitoru a vy jste si mohli zkontrolovat, zda je vše tak, jak má být.

K tomu vám dopomáhala třeba i funkce kontroly registrů – klávesa R. Po jejím stisknutí jste si vybrali, od jaké dvojice chcete prohlížet (AF, BC, DE, HL, SP – viz klávesnice). Zase můžete pomocí klávesnice obsah měnit, tlačítkem „=“ potvrzovat a přesunout se k další dvojici.

Poslední dvě funkce, S a L, fungovaly pro ukládání (save) a čtení (load) programů na pásek a z pásku.

Ve výše odkazovaném PDFku najdete i další informace, včetně některých užitečných rutin z ROMky. Další spoustu materiálů najdete na stránkách PMI-80 na Nostalcompu.

Materiály ke studiu

Jednodesková výzva

A nyní pár věcí k samotné výzvě: rozhodl jsem se, že bude mít několik kol, a že bude mít dvě hlavní kategorie. První kategorií je Z80/8080, druhá kategorie je 6502. V každém kole zadám úkol, hodně volně, abych nechal prostor vaší tvůrčí energii a neotřelým myšlenkám, a každý, kdo úkol splní, dostane za dané kolo bod. Pokud udělá věci „nad plán“, dostane další body. Dva z vás (z každé kategorie jeden), co projdou celou výzvou a získají nejvíc bodů, na konci ode mne dostanou přesně ten jednodeskáč, co budu v průběhu celé výzvy stavět…

Podmínky jsou prosté. Píše se v assembleru pro ten který procesor, a soutěžní příspěvky musí být zveřejněny jako assemblerovský zdroják (tedy žádný HEX) v nějaké otevřené podobě. Ideálně na GitHubu jako repo nebo jako Gist.

Odkaz pošlete do komentářů pod zadání, a do zdrojáku pak nějaký kontakt na sebe. Nezapomeňte uvést licenci (doporučuju BSD, MIT nebo CC) a nezapomeňte na nějaký návod k obsluze.

Zadání pro první kolo

Máte holý počítač. To znamená jen procesor, paměti a jeden sériový port. Máte 1 kB RAM, 4 kB ROM a sériový obvod 6850 (nebojte, je velmi jednoduchý). Počítač nepoužívá přerušení. Napište pro takový počítač jednoduchý obslužný program (monitor), který bude umožňovat základní činnosti, tedy měnit obsah paměti a spouštět programy. Pokud zvládnete i víc funkcí, třeba debugování, breakpoint apod., budou body navíc.

Inspirace: třeba sériové rozhraní KIM-1…

Stroje:

  • Z80: 4kB ROM (0000h-0fffh), 1 kB RAM (8000h-83ffh), 6850 zapojena na IO portech 00h (řízení/status) a 01h (data).
  • 6502: 4kB ROM (f000h-ffffh), 1kB RAM (0000h-03ffh), 6850 zapojena na adresách a000h (řízení / status) a a001h (data).

Pro jednoduchost prosím inicializujte 6850 pomocí zápisu hodnoty 15h do řídicího registru. Bližší info najdete třeba na Strojáku. Chybové stavy 6850 můžete ignorovat.

Vše je jasné? Tedy vzhůru do toho! Držím palce!

Příště: sedmisegmentovky a klávesnice.

PS: Můžete psát a ladit v online IDE ASM80.com – zde je návod, jak si nastavit virtuální stroj…

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.