Jednodesková výzva: druhé kolo

Tak co, zkusili jste si jednoduchý obslužný program pro ovládání jednodeskového počítače přes sériovou linku?

Já ano. Zkusil jsem napsat obslužný program pro model s procesorem Z80. Ovládání je jednoduché – máte pouze dva příkazy M a G. Příkaz M slouží ke změně obsahu paměti. Po jeho zadání zadáte adresu (2 bajty, tedy 4 hexadecimální znaky), a pak vám systém vypíše adresu, stávající obsah a čeká na zadání. Pokud nezadáte nový obsah a stisknete enter, pokračuje se na další adresu beze změny. Pokud zadáte nový obsah, uloží se. Zadávání ukončíte stiskem mezery.

Příkaz G si jen vezme adresu a skočí na ni (JP). Nic víc.

Při zadávání hexadecimálních hodnot bere systém poslední dvě (popř. čtyři) hodnoty, takže když chcete zadat třeba 1234 a překlepnete se, tak neřešte žádné mazání, nic takového, prostě zadejte znovu: 12331234 – a systém vezme jen poslední zadané.

V programu jsem použil pár triků. Například pro velmi často používanou rutinu “pošli na terminál znak” jsem umístil příkaz skoku na adresu 8. Proč? No protože Z80 má osm instrukcí RST, které zabírají jen jediný bajt, a skáčou (podobně jako call) na některou z adres 0, 8, 10, 18, 20, 28, 30, 38 (hexadecimálně). Úspora svou bajtů pro každé volání.

Některé úspory jsou na první pohled méně patrné. Třeba rutina pro výpis dvoubajtové hodnoty, uložené ve dvojici registrů HL (PRINTADDR), obsahuje pouhé tři instrukce: přesune obsah registru H do registru A, zavolá rutinu “vypiš jednobajtovou hodnotu z registru A” (PRINTHEX), pak přesune do registru A hodnotu z registru L – a dál? No, dál pokračuje rutina PRINTHEX, protože je umístěná šikovně hned za PRINTADDR… Hezký trik, který ušetří jeden skok, ale je potřeba na to myslet, protože jakmile mezi PRINTADDR a PRINTHEX vložíte ještě něco, tak se PRINTADDR rozbije.

Taky je dobrý zvyk nedělat konstrukce typu CALL něco, RET, a místo toho použít rovnou JP něco – ušetříte tím nejen jednu instrukci, ale i dva bajty na zásobníku.

Ošidil jsem kontrolu hexadecimálních znaků, takže mi jako hexadecimální projde i to, co je v ASCII mezi 9 a A, třeba dvojtečka. To je ještě potřeba pořešit. Ještě bych udělal pár optimalizací, ale dostal jsem se do 256 bajtů, a to je snesitelné.

PS: Komentáře jsem psal třikrát, a třikrát mi spadnul prohlížeč. Tak tam nakonec nejsou. Pardon, to je velká chyba, já je tam dopíšu. 🙁

Tak. Pojďme na samotné druhé kolo. Přidáme si starou dobrou tlačítkovou klávesnici a sedmisegmentový displej.

Způsobů řešení displeje je mnoho, nejčastěji se používá multiplexované řízení, kdy se pravidelně posílá informace o tom, jaká pozice se adresuje a jaký obsah má mít. Já zvolil jednodušší řešení: každá pozice má vlastní registr a zapisuje se do ní přímo. Konkrétní adresy jsou 0x40, 0x41 atd… Zvolil jsem displej s osmi pozicemi, takže u Z80 to je 0x40 až 0x47 (zleva doprava). U 6502 je zase mapování do prostoru paměti, 0xA040 až 0xA047.

Klávesnice je řešená jako matice tlačítek. Minimálně jich je potřeba 16, pro každou hexadecimální hodnotu jedno tlačítko, ale pohodlnější práce je s maticemi 5×4 nebo 6×4. PMI-80 mělo matici 5×5 (ovšem mapovanou z obvodových důvodů na 3×9). Pro jednoduchost jsem zvolil matici 5×4, kam můžete namapovat 16 kláves s hodnotami a 4 řídicí, resp. funkční tlačítka.

Adresaci jsem zvolil (u Z80) trochu zvláštní: řádky se čtou z různých adres tak, že adresa je vždy 0x80 + 16*číslo řádku. Tedy 0x80 pro první řádek, 0x90 pro druhý řádek, … Pokud není žádné tlačítko stisknuté, je přečtená hodnota 0xFF, pokud je, jsou na pozici bitů 0 až 3 nuly tam, kde jsou stisknutá tlačítka. (Nepřekvapí, že u klávesnice je to 0xA800, 0xA900, 0xAA00, 0xAB00, 0xAC00…)

Já si navrhl čtyři funkční tlačítka M, G, EX a =, ale vy si klidně navrhněte jiné podle funkcí, které chcete nabídnout. Ale než se k tomu dostaneme…

Jestli můžeme – pojďme si nejprve procvičit práci s klávesnicí a displejem úplně jednoduchým příkladem: Udělejme hexadecimální kalkulačku – přesněji sčítačku, která bude sčítat zadaná čísla. Budete potřebovat jen dvě funkční klávesy: CLR a + Čísla si můžeme omezit, ať se to líp počítá, na dvoubajtové hodnoty. Funkce bude jednoduchá: CLR vynuluje součet, zadáním čísla a + se tato hodnota přičte k mezisoučtu, a ten se zobrazí. 1234 + 21 + 52 + 75 + 3A + 2BFF + …

Ještě moje EMU soubory pro ASM80 jako gist.

Ať se daří

Rubriky: ASM80.com, Emulace, Hardware, Stroják | Štítky: , | Napsat komentář

A je to tady!

Přiznání je polehčující okolnost, a já už před časem říkal, že nemám retro ducha. Teď se mi to potvrzuje.

Teda, možná to je tím, že prodejci na Aukrech zvlčili a nevědí, co by za to chtěli, a tak se i banalita, které jsou plné eBaye, draží za tři tisíce. Nakašlat vám na to!

Navíc já už nevím, jaký další počítač bych si pořídil. Byl by fajn nějaký československý, z těch tu mám jen PMD-85, ale dát za „IQ151, nálezový stav, netestováno, nevím jak“ víc než tři stovky se mi fakt nechce, nota bene když je na fotce vidět, že to někdo skladoval v kurníku a používal jako líheň pro kuřata.

A tak jsem dal průchod svým starým novým a investoval do ZX Spectra Next. No jasně, je to moderní klon, zrobený ve FPGA. Jak jinak. Duchaři jistě frflají, já jásám.

Ale než bude Spectrum Next, tak si pohraju s těmi svými experimenty. Já totiž zjišťuju, že to, co mě na starých počítačích láká a baví nejvíc, je vlastně stejná věc, jaká mě baví na modelech parních strojů: je to úplně jednoduché, pochopitelné a tak, tak nepraktické! Takže to je opravdu koníček.

Mně se to teď spojuje s tou knihou o elektronice. Ne, neodložil jsem ji, naopak, už ji píšu a už je připravený i vydavatel. Někdy se člověku zdravotní obtíže k něčemu hodí. A ačkoli můžu psát tak tři hodiny denně, tak práce pokračují.

A při tom psaní si tak říkám, že se vlastně mentálně vracím do doby, kdy mi bylo těch 12 a já s katalogem elektronických součástek Tesla Eltos ležel o prázdninách někde ve stínu a snil o tom, že si jednou fakt postavím ten počítač – klidně i s jedním kilem RAMky a bez displeje a jednodeskáč, nějaký 8080MC od pana Sojky.

Dneska už stejný počítač nejen dokážu navrhnout, ale co víc: já ho dokážu i postavit, a bude mě to stát pár stokorun. A celý koncept si klidně ověřím v Arduinu. Nevěříte? Chcete se vsadit, že postavím (lépe řečeno naprogramuju) celý 8080MC v Arduinu Uno? 😉

Možná bych to měl dát do té knížky. Nebo napsat druhou: Stavíme staré počítače z nových čipů. Jenže na tu by se našlo ještě míň čtenářů, než na tu první. Ne, ne, to má čas, teď pojďme řešit ty základy číslicové techniky. Právě teď píšu kapitolu o tom, jaký je rozdíl mezi paralelním a sériovým zapojením…

Rubriky: Hardware | Štítky: , , , | Komentáře nejsou povolené u textu s názvem A je to tady!

Jednodeskový počítač s procesorem 65816

To, že se 6502 stále ještě neodebrala do věčných lovišť asi víte. A asi víte, že existuje něco jako procesor 65816, což byl procesor, který ve WDC vyvinuli jako 16bitovou variantu 6502. Dokonce se používal v nějakých turbo kartách pro Commodora nebo v Applech. A jestli tohleto všechno víte, tak vězte i to, že se oba kousky stále vyrábějí, a dokonce jsou i ve variantě „mikrokontrolér“.

WDC vyrábí a dodává i devkity – asi nejrozumnější jsou ty řady SXB (Xxcelr8r). Buď si vyberete verzi s holým procesorem, okolo kterého je několik obvodů (VIA, PIA, ACIA), k tomu paměť a USB konvertor, a zaplatíte 200 USD, nebo si vyberete verzi s mikrokontrolérem, kde jsou porty a časovače integrované s jádrem, takže na desce je už jen paměť a USB převodník, a ušetříte docela slušný raneček peněz.

Já zvolil variantu W65C265SXB: tenhle mikrokontrolér má jádro 65C816, které samozřejmě funguje i v režimu 65C02, a k němu jsou připojené 4xUART, 8x časovač a RTC. Přivítal bych nějaké SPI/I2C, ale není. Nevadí. Na desce je 32kb SRAM, mapovaná v rozsahu 00:0000 až 00:7FFF, a je tam i patice na 128k FLASH. 65C816 má 24bitovou adresu, dokáže tedy přímo adresovat až 16MB paměti. Hezké je, že všechny vývody jsou vyvedené na pinové lišty.

Programování je jednoduché – přes USB. Uvnitř mikrokontroléru je „Mensch Monitor“, tedy klasický monitor, jak si jej pamatujeme. Využívá jednu ze sériových linek, připojenou k FTDI převodníku, takže vy potřebujete jen sériový terminál, a nastavit ho na 9600 Bd. Můžete si pak prohlížet paměť, měnit ji, spouštět programy, nahrávat soubory ve formátu S28 a tak…

WDC k tomu dodává softwarové nástroje. Je trochu trága se k nim dostat, protože web zůstal duchem v dobách největší slávy procesoru 6502. Přímé odkazy na stažení nástrojů vedou na 404, popřípadě se neobjeví, co by se objevit mělo, ale nakonec jsem po nějakých děsných experimentech dosáhl svého a stáhnul jsem dev tools. Ty jsou duchem v téže době. Nejmodernější je asi EasySXB, což by měl být takový jako že sériový terminál, který ale umožňuje snazší ovládání – třeba výpis registrů máte přehledně v panelu. Bohužel už při připojení to po vás chce zadat port, kde je SXB připojené, a nenabídne ani seznam COM portů, které jsou aktivní. Takže si to musíte někde najít a opsat.

Nakonec jsem použil TeraTerm, a ten šlapal bez problémů. Zkusil jsem si udělat jednoduchý program na blikání LEDkou, přeložil jsem ho svým ASM80, a ejhle- fungoval! Ta radost…

Jinak je to moc hezká destička a udělala mi radost. Až bude čas, udělám k ní nějaké příjemnější programovadlo, třeba jako Chrome plugin.

Rubriky: Hardware | Štítky: , | Komentáře nejsou povolené u textu s názvem Jednodeskový počítač s procesorem 65816

Rockwell 18R jako jednodeskáč

Ani nevím, co mě to popadlo a jak mě to napadlo, ale jednoho dne jsem si řekl: Když je PMI-80 postavené na klávesnici a displeji ze staré kalkulačky, tak proč by nešlo vzít starou kalkulačku s LEDkovým displejem a klávesnicí, a zabudovat dovnitř PMI-80? No dobře, tak ne přímo PMI, ale třeba něco menšího, jiného, KIM-1 třeba… A začal jsem se porozhlížet po starých vrakových kalkulačkách.

Osud mi jako první přihrál Rockwell 18R. Zas taková vzácnost to není, takže mě moc netrápí, že ji předělám. Ale má krásný „bublinkový“ displej, 8 pozic, a klávesnici 5×4. Teď jen aby to nebylo uvnitř nějaké divoké…

Stačilo odšroubovat čtyři šroubky, a ukázaly se vnitřnosti v plné kráse. Nádhera! Klávesnice zapojená jako ta nejprostší matice, dokonce i fyzicky odpovídalo umístění vývodů, a k tomu jeden plošňák, který je seskládal hezky dohromady. A nad tím vším malá destička s displejem a něčím, co vypadalo jako konektor.

Hledal jsem, kde je procesor, a při bližším zkoumání se ukázalo, že to, co vypadalo jako konektor, je plastová krytka. A pod ní byl čtvercový čip, a k němu byly tenkými drátky připájené vývody.

Takže – devět vývodů od klávesnice (5 řad, 4 sloupce), 16 vývodů od displeje, navíc s krásnými pájecími ploškami – těch 8 nalevo jsou jednotlivé segmenty, a po desce jsou pak porůznu rozmístěné katody pro jednotlivé pozice.

Takže stačí odpojit ten čip (bohužel, nebyla to 6502, jak jsem trošku doufal, ale nějaký specializovaný obvod, jak jinak), a připojit displej a klávesnici k vlastní konstrukci.

Asi nejjednodušší způsob bude použít nějaký malý jednočip na desce. Pokud slyšíte „Arduino Nano“, slyšíte správně – mám jich tu haldy, tak proč je nepoužít, že? Jen mám trošku problém. Počítejte se mnou:

Displej má 16 vývodů. 8 segmentů + 8 pozic. Klávesnice 9. To máme dohromady 25 vývodů. Arduino Nano 328 má… počkejte…

Jestli dobře vidím, tak 14 digitálních a 8 analogových, tedy 22 celkem, a z toho A6 a A7 víceméně docela pofidérní – jako vstupy maximálně. Hm, hm, hm. Co s tím? Když si řeknu, že třeba KIM-1 používal jen šest pozic, ušetřím 2 vodiče, takže mi jich stačí zapojit 23. Což je pořád o jeden víc, než jich mám k dispozici.

Proto použiju stejný trik, jako byl v tom PMI-80 (a nejen tam). Využiju toho, že displej pravidelně občerstvuju, pozici po pozici, a připojím řádky klávesnice na pět pozic displeje. A protože to jsou katody, budou vlastně „spínané k nule“. Což se mi hodí, protože připojím sloupce klávesnice přímo na digitální vstupy a nastavím jim interní pullupy. Takže ve výsledku to máme: 8 segmentů + 8 pozic (z toho 5 řádkových vodičů) + 4 sloupcové = 20 vývodů. A jsme na svých. Trošku harakiri může nastat na TX/RX, když do toho bude zvenčí pindat USB/UART převodník, ale uvidím, jak se to v praxi vyvrbí. Přinejhorším obětuju dvě pozice.

Klávesnice má 20 tlačítek. 16 jich nechám pro hexadecimální znaky, zbývají 4. Což je pro KIM-1 málo, tak to budu muset vymyslet nějak chytřeji. Možná se inspiruju u Heathkitu ET3400 – ten si vystačil s 16 klávesami a RESETem a klávesy měly vždy dvě funkce.

A kdyby mě snad jednodeskáč znudil, tak vždycky můžu nasadit firmware z Calcuina.

Rubriky: Hardware | Štítky: , | Komentáře nejsou povolené u textu s názvem Rockwell 18R jako jednodeskáč

ASM80 z příkazového řádku

Čtenáři jistě znají ASM80 – online assembler / IDE pro osmibitové procesory. Udělal jsem i několik odvozených verzí, třeba single page překladače, embedded verzi překladače (použil jsem ji v tutoriálu Stroják.cz), nebo třeba stand alone IDE. Logickým pokračováním je tedy stará dobrá utilita pro překlad z příkazového řádku.

Předpokladem je mít funkční prostředí Node. Není to nic složitého, existuje pro všechny hlavní platformy, a stáhnout si ho můžete zde: nodejs.org. Při instalaci se nainstaluje i správce balíčků, zvaný npm.

NPM slouží k instalaci balíčků a knihoven. Pro instalaci ASM80 stačí spustit příkazový řádek a napsat:

npm i -g asm80

Parametr -g způsobí, že se asm80 nenainstaluje jako knihovna (to ani nedává smysl), ale jako systémový nástroj. Pak půjde spouštět jako klasická utilita pro příkazový řádek:

asm80 test.a80

spustí překlad souboru test.a80, a výsledkem budou dva soubory: test.hex s výstupem a test.lst s protokolem o překladu. Přípona .a80 napovídá, že překladač má použít instrukční sadu procesoru 8080.

Chování lze ovlivnit pomocí parametrů. Lze nastavit jméno výstupního souboru, potlačit generování .lst, nebo explicitně určit typ procesoru a formát výstupního souboru (kromě HEX a SREC lze generovat například i .COM soubory pro CP/M, .PRG pro emulátory C64, nebo SNA a TAP pro ZX Spectrum). Parametry jsou popsány na stránce NPM balíčku ASM80.

Přehled syntaxe a direktiv naleznete na GitHub Pages.

Ještě mám pár námětů na vylepšení, chtěl bych znát váš názor…

  • Vytvořit systém knihoven, tak, jak ho mají klasické assemblery, co oddělují překlad a linkování. Tedy možnost udělat knihovnu subrutin, z níž by se includovaly pouze ty části kódu, které jsou potřebné pro správnou funkci. Mohli byste si pak udělat třeba něco jako „clib“ pro svůj systém…
  • Mít možnost přilinkovat rovnou veřejně publikované knihovny, například na GitHubu.
  • … další procesory? Systémy?

Díky za tipy a návrhy. Můžete je rovnou posílat do Issues (a klidně i česky)

Rubriky: ASM80.com, Stroják | Štítky: , , , , , , | Napsat komentář

Nový starý… funkční!

Přišly prototypové desky na Nový Starý (krycí název Jess). Mám velkou radost, protože návrh obsahoval jen tři chybné spoje. Jasně, jsem blbec, namapoval jsem výstup na pin, který může být jen vstup. Ale co, můžu si za to sám. Ale jinak na první zapojení fungoval.

Vzal jsem Multicomp od Granta Searla, generátorem jsem si vytvořil Microcomputer.vhd v sestavě 6809 / Full external SRAM / 10MHz / Serial, upravil jsem mapování pinů FPGA, nahrál výsledek do EPCS4, spustil, a na terminálu se objevilo to, co se objevit mělo. Půl hodinky od nažhavení pájky, dobrý výsledek! A tak jsem si i zaprogramoval:

jess1

Krok 2: Zapájet DAC pro VGA (no, šest rezistorů) a ověřit klávesnici. Mezitím už se mi dělají opravené PCB. Na nich bude i místo pro konektory JTAG/AS (teď je deska přes ně a je to nepohodlné).

No a pak už je jen krok 3, totiž profit. Tedy pardon – krok 3 je samozřejmě úprava podle těch mých plánů, co jsem nastínil minule.

20161022_144721

Rubriky: Hardware | Štítky: , | Komentáře nejsou povolené u textu s názvem Nový starý… funkční!

Iotta.cz

Technické hlášení: začalo se mi motat tady na Retročipu hraní s IoT a jinými moderními technologiemi se starými počítači a osmibity. Takže jsem se rozhodl, že IoT pošlu na vlastní doménu, kam přesunu i obsah. Dejte si do bookmarků Iotta.cz.

Nominace do Křišťálové Lupy 2016 to trochu urychlila… 🙂

Rubriky: IoT | Komentáře nejsou povolené u textu s názvem Iotta.cz