Před časem jsem na Facebooku a Twitteru napsal, že připravuju druhou knihu, tentokrát o stavbě osmibitových počítačů, a ptal jsem se jich, jaký procesor by je nejvíc zajímal. Dal jsem na výběr osvědčené kousky: Zilog Z80, MOS 6502, Motorolu 6809 a Intel 8085.

Po pravdě jsem se nechtěl pouštět hned na začátku do Z80 nebo 6809, to jsou hodně mocné procesory. Měl jsem vizi, že začnu úplnou klasikou, buď 6502, nebo 8080 – a protože s procesorem 8080 a jeho podpůrnými obvody je mrzení on so many levels, od toho, že se špatně shání po to, že se konstrukce zbytečně zesložiťuje, tak jsem místo něj nabídl 8085.

Že skoro nikdo nechtěl 6809 není divu, tenhle procesor skoro nikdo nezná. Ale překvapilo mě, že Z80 nebyl tak jasný vítěz (na FB tedy ano, ale tam byly jen dvě možnosti) a že se 8085 dlouho drželo na prvním místě. Až jsem si říkal, jestli se hlasující nespletli a nemysleli si, že jde o 8086… No a 6502 doplatila na iracionální odpor, který k němu česká obec počítačová, odkojená Sinclairy a vůbec Intelskými procesory, asi pociťuje.

Takže jsem nakonec sáhl po 8085. Ten procesor je výrazně vylepšená 8080 a až na multiplex adres s daty je jednoduše použitelná. Navíc na rozdíl od 6502, odděluje paměti a periferie do samostatných prostorů, což trochu zjednoduší konstrukci.

A tak jsem jednoho krásného dne sedl a začal konstruovat.

Procesor semhle, paměti támhle, mezi to adresní latch, budič a oddělovač datové sběrnice, obvod ACIA MC6850, LED na výstup SOD, aby to blikalo, když to má blikat, a nakonec 8255. Na pohled krása nesmírná, tak jsem to chvilku routoval v Eagle ručně, ale pak jsem si řekl, že na to kašlu, že to stejně udělají Číňani za čtyři koruny kus, tak jsem dal Autorouter, nechal doběhnout, okem jsem se pokochal, zděsil jsem se nad tím zuřivým taháním linek, a – děj se bůle voží!

Po čase dorazily procesory a další součástky, a i balíček desek. No a minulý víkend jsem tedy začal pájet.

Oživení, den první

Začal jsem hezky zvolna: patice pro procesor (přesněji dvě dutinkové lišty, mám s nimi dobré zkušenosti), patice pro paměti (měl jsem tu dvě „přesné patice“ DIL 28), bižuterie okolo RESETu (tlačítko, kondenzátory, dioda), krystal a dva rezonanční kondenzátory.

Kámen úrazu číslo 1: Hodnoty kondenzátorů jsem bral z datasheetu 8085, ovšem pro CMOS verzi. A pak, když jsem se pořádně podíval, co že to Číňan poslal, tak mě málem omyli: M5L8085AP! Tedy NMOS verze. Naštěstí až do 6 MHz, což je gut, ale stejně! Problém je, že NMOS verze chce kondenzátory 6,8 pF.

Proměřil jsem patice, jestli je napájecí napětí tam, kde má být. Bylo. Zapojil jsem procesor. Díky plošnému spoji jsem se nemusel starat o přerušovací signály, ty byly neutralizované. Zajímalo mě jen jestli bude kmitat oscilátor a jestli na výstupu CLK bude něco zajímavého. Bylo, přátelé, bylo to tam! Ještě jsem zkusil RESET. Fungoval taky.

Takže jsem osazoval dál. Zkusil jsem minimální verzi, tedy s adresovým latchem, oddělovačem datové sběrnice a pamětí EEPROM, kde byl jednoduchý blikací program, co měl blikat LEDkou s frekvencí 1 Hz, ale bez použití podprogramů (neosazoval jsem RAMku).

No a nedělo se nic. Samozřejmě, jak jinak… Teda respektive na sběrnicích cosi probíhalo, ale úplně divně, a výstup SOD byl pořád 0. No a po čase se i to divné změnilo…

Co naplat, podívám se po příčině. Koukám do schématu na to zapojení EEPROMky. Správně tam vede /ROMCS, správně jsou připojené vývody, správně je připojený signál /RD, správně je připojený signál /WR – moment, cože? Co tam má co dělat signál /WR? Tam má být logická 1!

Kámen úrazu číslo 2: Blbec!!! Třikrát na to koukám, RAM vlevo, ROM vpravo, a pak stejně zapojím /WR k jinému čipu. Takže RAM měla zakázaný zápis a ROM si vesele zapisovala. Strčil jsem EEPROMku do programátoru, pro forma ji přečetl – a tam byla tuna nesmyslů! Přepsal jsem si ji. Ale aspoň je vidět, že procesor nějak pracoval.

Přeškrábnul jsem jeden spoj a zapojil dva drátky. Furt nic.

Koukám na ta data, a pořád se mi zdálo, že na nich něco nesedí. Ven po datové sběrnici šly samé jedničky, dovnitř… ech… moment!

Kámen úrazu číslo 3: Blbec na kvadrát! Obousměrné budiče 245 mají povolovací vstup, ten jsem připojil na ALE, a pak vstup, co udává směr. Když je 0, tak pouští zleva doprava, když je 1, tak zprava doleva. Pamatuju se, jak jsem jedno oko upíral do datasheetu, druhé do Eaglu a přemýšlel: Když 1, tak data odsud sem, to znamená, že sem dám signál /RD, ten když je v 0, tak musí data jít takhle… Jdu se najíst, vrátím se, co jsem to… Jo aha, signál /WR, zapojím sem, moment, opravdu? No když je 0, tak… No a modří už vědí!

Přeškrábnul jsem spoj, zapájel drátek, spustil – SOD se nastavil do 1!

Aha, žije to! Juchů. Žije, ale neseje. Někde se to zacyklilo… Ale něco přeci proběhlo!

Vytáhl jsem logický analyzátor a začal měřit a detekovat. Pořád se mi zdálo, že tam je na sběrnici nějak moc FF. Tady mě mělo ťuknout – a taky ťuklo, ale jinam.

Vytáhnul jsem budič sběrnice a nahradil ho drátkama. Ať minimalizuju možná místa problémů. Pak jsem taky zkrátil program, jen na úplně nezbytnou smyčku, bez čekání. A běželo to! Ještě jsem přidal RAMku, abych mohl testovat složitější programy…

Už bylo deset večer, tak jsem další experimenty odložil na státní svátek.

Oživení, den druhý

Našel jsem ten zpropadený obvod 6850. Já věděl, že ho mám, věděl jsem i že ho mám v nepájivém poli, ale kde to pole je, to jsem netušil. Nakonec jsem ho našel a koukám, že to je verze MC6850. Tedy trabl, protože tato verze má garantovaný provoz do 1 MHz, a já tam cpu 1,8432 MHz. Potřebuju verzi MC68B50, která je určena pro provoz do 2 MHz. Grant Searle ale tvrdí, a já nemám důvod mu nevěřit, že mu na této frekvenci fungují i nonB verze. Tak uvidíme, zkusím to, a když ne, tak holt počkám na „béčkové“ čipy, co jsou už na cestě.

„Additionally, all of the standard 6850 chips that I have worked perfectly at the speeds required for this circuit even though the circuit requirement is faster than their specification. Therefore, you are unlikely to have any issues. However, I would recommend you buy the „B“ speed grade ACIA ie. 68B50 if possible.“ – Grant Searle

Připájel jsem tedy dutinkovou lištu coby patici pro 6850, do EEPROM nahrál „Hello world“ pro sériový port a jedeme testovat.

A samozřejmě že nic.

Logický analyzátor do ruky, osciloskop do druhé, popřipojovat, a jedeme!

Nakonec jsem sledoval adresy, jak jdou po adresní sběrnici, a data, co tam putují. A fakt: adresa 0, data $F3 – to je DI. Pak adresa 1, 2, 3 – LXI SP, $FFFF. Adresa 4, 5 – MVI A, $15. Takže to žije…

Na adresách 6 a 7 je OUT $DE – nastavení ACIA. Tady se na chvilku datová sběrnice rozkmitala…

Aha vlastně: ACIA už posílá data, ale neskončilo ALE. No jasně, oddělovač sběrnice tam není, jsou místo něj drátky. Drátky ven, oddělovač dovnitř, jedeme dál!

Všechno běží. 0, 1, 2, 3, 4, 5, 6, 7, $DE, 8, 9, A, B, C, D, E, D, D, C, B, 8, A, 9, 8, … A to je divné… Proč to počítá nahoru a dolů?

Na adresách 8, 9, A je LXI H, HELLO, na adresách B, C, D je CALL $1C. Jasně, E a D jsou adresy zásobníku v RAMce, kam si CALL ukládá návratovou adresu (protože jsem si inicializoval SP na hodnotu $FFFF a procesor nejdřív dekrementuje, pak ukládá). Pak je C – protože sleduju jen čtyři bity adresní sběrnice, tak to je 1D – a tam je instrukce MOV A,M.

Ale není. Podle dat tam je cosi, co má ve spodních bitech samé jedničky, tady $xF.

Tušení se stalo zřetelným! Z paměti to čte FF, což je instrukce RST 7. Ta uloží návratovou adresu na zásobník (C, B) a skočí na $0038. To je ta osmička. A tam se zase načte $FF, takže se zas ukládá na zásobník (A, 9)…

Paměť! Nejsou někde prohozené vývody? To vypadá na prohozené adresní vývody. Podle schématu je všechno OK, ještě to konzultuju s datasheetem. Všechno sedí…

Kámen úrazu číslo 4: Nepozornost! Koukám na plošný spoj, dívám se na nožičku po nožičce u EEPROMky, a – herdek, proč je propojené A4 a A5? A ke vstupu A5 nevede signál?! Aha, takže paměť místo adresy $1C, která byla správná, četla adresu $3C, kde už byly samé $FF!

Proškrábnutí, připájení drátku… Ještě to proměřím. Všechno sedí. Zasunu EEPROMku, ještě jednou to pro sichr proměřím a – moment, jeden vstup se mi zdá podivný! Jako by pískal tak napůl!

Kámen úrazu číslo 5: Pin v patici byl propojen, ale na nožičce paměti už signál nebyl. Na pinu jo, v nožičce ne. Herdek! Debilní „přesné patice“! Vypájet to už asi nepůjde. Ale pro příště a pro vás: Nepoužívejte je! Nejsem jediný, kdo před nimi varuje, a je moje blbost, že jsem varování nedbal!

Propojil jsem vývod paměti u poškozené dutinky se správným signálem a spustil stroj. Všechno běželo jak mělo, alespoň podle adres soudě.

Čímž se taky jaksi mimochodem vysvětlilo, proč blikání s časovací smyčkou neběželo, zato blikání plnou rychlostí ano: protože „full speed“ kód byl krátký a vešel se do 16 bajtů!

Připojil jsem jednu měřicí sondu na TxD – a tam se opravdu něco dělo!

Tak jsem, pln očekávání, připojil převodník USB-to-UART, pustil terminál – a nic…

Přitom podle měření to… echm… ale nějak pomalu… Tedy takty odpovídaly, jen ty časy, co ukazoval analyzátor, naznačovaly, že přenosová rychlost je 700 Bd. Jak je to možné?

No, dále viz Kámen úrazu 1. Oscilátor se rozkmital pomaleji. Stačilo vypnout a zapnout, a krásně to jelo na 28800. Ale budu muset snížit kapacitu, nebo počkat na CMOS verzi procesoru.

A když to jede mně, pojede to i vám! Od příštího týdne, jako takovou ochutnávku z nové knihy, zveřejním pár kapitol s konstrukcí tohoto počítače.

0000                          .ENGINE   alpha   
0000                          .ORG   0   
0000                          ; inicializace()
0000   F3           COLD:     DI   
0001   31 FF FF               LXI   SP,0FFFFh   
0004                          ; adresace sériového rozhraní
0004                ACIA:     EQU   0DEh   
0004                ACIAC:    EQU   ACIA   
0004                ACIAS:    EQU   ACIA   
0004                ACIAD:    EQU   ACIA+1   
0004                ACIA_TDRE:   EQU   02h   
0004                          ;inicializace ACIA
0004   3E 15                  MVI   A,15h   ; 115200 Bd, 8 bit, no parity, 1 stop bit, no IRQ
0006   D3 DE                  OUT   ACIAC   
0008                WARM:     
0008   21 2B 00               LXI   H,HELLO   
000B   CD 1D 00               CALL   STROUT   
000E   C3 08 00               JMP   WARM   
0011                SEROUT:   
0011   F5                     PUSH   PSW   
0012                SO_WAIT:   
0012   DB DE                  IN   ACIAS   
0014   E6 02                  ANI   ACIA_TDRE   ;bit TDRE - pokud lze vysílat, je =1
0016   CA 12 00               JZ   SO_WAIT   
0019   F1                     POP   PSW   
001A   D3 DF                  OUT   ACIAD   
001C   C9                     RET   
001D                STROUT:   
001D   7E                     MOV   A,M   
001E   E6 7F                  ANI   7Fh   
0020   CD 11 00               CALL   SEROUT   
0023   7E                     MOV   A,M   
0024   E6 80                  ANI   80h   
0026   C0                     RNZ   
0027   23                     INX   H   
0028   C3 1D 00               JMP   STROUT   
002B                HELLO:    
002B   48 45 4C 4C 4F 20 57 4F 52 4C 44 0D 8A .ISTR   "HELLO WORLD",0Dh,0Ah