Alpha: Koncepce počítače s procesorem 8080/8085

Připravuju pokračování své knihy Hradla, volty, jednočipy. Tentokrát se budu zabývat konstrukcí osmibitových počítačů. Kniha by měla vyjít v roce 2019 opět v Edici CZ.NIC.

Když jsem přemýšlel o tom, jak knihu pojmout, bylo mi jasné, že suchý výklad nebude stačit. Tedy, on by stačil, ale já nejsem zrovna příznivcem teoretických učebnic bez přesahu do praxe. Bylo mi tedy jasné, že nějakou konstrukci chci.

Ano, můžu vzít nějaký reálný osmibit a ukazovat na něm, jak se věci mají, možná čtenáře i ponouknout ke stavbě repliky, ale touto cestou se mi moc jít nechtělo. Říkám si, že na vlastní konstrukci, která bude tak jednoduchá, jak jen to lze, půjde ilustrovat požadované věci mnohem líp.

Zvolil jsem tedy cestu konstrukce naprosto jednoduchých počítačů, které mají splňovat několik bodů:

  1. Budou používat součástky, které se dají běžně koupit.
  2.  Nebudou se ortodoxně držet konstrukcí z 80. let – tedy když chci použít paměť, použiju moderní, třeba 128x8bit statickou RAM, což je jeden čip, a nebudu konstruovat zapojení z osmi čipů dynamické RAM a dalších tří IO kolem dokola.
  3. Budou v duchu starých osmibitových časů, tedy jednoduché periferie – klávesnice, displej, reproduktor – a minimální softwarové vybavení.
  4. Bude jednoduché psát pro ně software.
  5. Klidně vynechám samotný starý procesor a potřebné funkce si naemuluju v moderním jednočipu. Nebo použiju jednočip místo periferií. No stress.

Takže jsem sednul a připravil několik konstrukcí, které jsou vhodné i pro začátečníky a na kterých se dají vysvětlit principy stavby systémů s osmibitovými mikroprocesory.

Teď vám nabízím první konstrukci a jako ukázku postupně vydám několik zkrácených kapitol z rukopisu. A pokud se chcete předzásobit, tak se mrkněte na seznam součástek pro stavbu.

Koncepce počítače s procesorem 8080/8085

K tomu, abyste si postavili počítač, není potřeba nic moc extra. Stačí vám jen nepájivé kontaktní pole, propojovací vodiče, napájecí zařízení a pár součástek: procesor, paměť a nějaké periferie.

Ovšem budu upřímný: v případě procesoru 8080 to tak moc neplatí. Tedy ne že by to nešlo, samozřejmě že to jde, ale problém je v tom, že procesor 8080 vyžaduje tři napájecí napětí a také nějaké podpůrné obvody.

Z různých technologických důvodů nemá procesor 8080 na čipu integrované některé důležité součásti, především řízení sběrnice a generování hodinových pulsů. Slouží k tomu dvojice externích obvodů 8224 a 8228, a ačkoli je možné se bez nich obejít a postavit si vlastní alternativy, tak takový postup nedoporučuju.

Obvod 8224 slouží ke generování hodinového kmitočtu, ve správné fázi a se správnými poměry period, a k tomu synchronizuje RESET a některé další signály. Obvod bere připojený kmitočet a dělí ho devíti. To je pak pracovní kmitočet procesoru. Pokud má připojený generátor frekvenci 18 MHz, bude 8080 pracovat na frekvenci 2 MHz.

Obvod 8228 generuje z takzvaného stavového slova, které procesor posílá po datové sběrnici, a několika řídicích signálů plné řídicí signály /MEMR, /MEMW, /IOR a /IOW. Navíc dokáže fungovat jako jednoduchý řadič přerušení – má pouze jednu úroveň a při vzniku požadavku pošle na sběrnici instrukci RST 7 (tedy skok na adresu 0038h, jak si povíme později).

Teprve až tato svatá trojice, jak se těmto třem obvodům někdy přezdívá, tvoří samotný „mikroprocesor 8080“.

V tom nejjednodušším systému, kde není zapotřebí řešit přerušení ani pozastavování činnosti či přebírání sběrnice, stačí nepoužité vstupy HOLD a INT připojit na log. 0, vstup RDYIN na log. 1 a výstupy INTE, WAIT, HLDA a INTA ignorovat. Celý procesor pak komunikuje se zbytkem systému pomocí čtyř řídicích signálů /MEMR, /MEMW, /IOR a /IOW, které říkají, že procesor chce číst z paměti (MEMory Read), zapisovat do paměti (MEMory Write), popřípadě číst nebo zapisovat z/do vstupně-výstupních obvodů (Input/Output Read, Input/Output Write).

Vlastní počítač? Jak by mohl vypadat?

Ačkoli byl 8080 široce používaná „klasika“, pro novou konstrukci bych ho nedoporučil – minimálně kvůli třem napájecím napětím. Sáhl bych po lehce rychlejším a vylepšeném procesoru 8085, respektive jeho CMOS verzi 80C85 (vyrábělo hned několik výrobců). Procesor 8085 si vystačí s pouhým jedním napájecím napětím (standardních +5 voltů) a nepotřebuje speciální obvody pro generování hodin (stačí mu obyčejný hodinový puls, nebo dokonce jen připojit krystal s kondenzátory). Navíc má dva vývody pro sériový vstup a výstup a celkem pět přerušovacích vstupů – kromě INTR ještě vstup TRAP (nemaskovatelné přerušení) a tři vstupy RST (RST5.5, RST6.5 a RST7.5).

Ani 8085 nedokáže pracovat úplně bez vnějších obvodů: návrháři totiž kvůli nutnosti vejít se do pouzdra se 40 vývody sáhli k takzvanému multiplexovanému adresování. Procesor má vyvedených osm vyšších bitů adresy (A8-A15) a nižších 8 bitů se vede po datové sběrnici (vývody AD0-AD7). Adresu posílá procesor nadvakrát. K řízení slouží signál ALE (Address Latch Enable). Pokud je v log. 1, znamená to, že procesor posílá po AD0-AD7 dolních 8 bitů adresy. Pokud je v log. 0, fungují tyto vývody jako datová sběrnice.

Návrhář systému proto musí zajistit vnější obvod (osmibitový latch), který se postará o to, aby zachytil spodních 8 bitů adresy. Typicky lze použít třeba obvod 74573 (starší konstrukce používaly např. dva obvody 7475).

Vývody 8085

Vnitřní struktura 8085

Na první pohled se od 8080A moc neliší – i 8085 má sadu registrů B, C, D, E, H, L, akumulátor A, Stack pointer SP, programový čítač PC, ALU, řídicí obvody, řadič… Navíc proti 8080 je rozšířena část řízení přerušení (o vstupy RST a TRAP), část sériového výstupu (SID, SOD) a zabudovaný generátor hodin.

Dole je vidět zmíněné rozdělení adresní sběrnice na dvě části – samostatných 8 horních bitů A15-A8, a multiplex pro spodních 8 bitů adresy / 8 bitů dat (AD7-AD0).

Řídicí signály mají následující funkce:

Signál Funkce
A8-A15 (výstup, třístavový) Horní část adresy. Během stavů HOLD, HALT a při RESETu je ve stavu vysoké impedance
AD0-AD7 (vstup/výstup, třístavový) Nižších osm bitů adresy, popřípadě satová sběrnice
ALE (výstup) Address Latch Enable. Oznamuje, že na vývodech AD0-AD7 je nižší část adresy (1). Pokud je 0, znamená to, že AD0-AD7 funguje jako datová sběrnice
S0, S1 (výstupy) Stavová informace. Spolu se signálem IO/M říká, jestli procesor čte instrukci, jestli čte / zapisuje data do paměti, jestli komunikuje s periferií, jestli obsluhuje přerušení nebo že je zastaven. V jednoduchých konstrukcích se nepoužívají.
IO/M (výstup) Oznamuje, jestli procesor hodlá komunikovat s pamětí (0), nebo s periferiemi (1)
/RD (výstup, třístavový) Pokud je 0, procesor čte data z vnějšího zařízení (paměti, portu). Vnější zařízení musí požadovaná data poslat na datovou sběrnici.
/WR (výstup, třístavový) Pokud je 0, procesor chce zapsat data, co poslal na datovou sběrnici, do portu nebo do paměti.
READY (vstup) V dobách, kdy paměti a periferie byly pomalejší než procesor, mohly poslat během cyklu čtení nebo zápisu signál „počkej, než budou data připravena“. Slouží k tomu právě vstup READY. Pokud je 1, procesor jede na plný výkon. Pokud je 0, procesor po nastavení signálu /RD či /WR počká, dokud nebude READY zase 1, pak teprve pokračuje dál. My ho klidně připojíme na 1 a budeme věřit, že moderní paměti jsou dost rychlé…
HOLD (vstup) Normálně 0. Pokud je nastaven na 1, procesor dokončí nejnutnější operaci (cyklus čtení nebo zápisu) a odpojí svoji datovou sběrnici, adresní sběrnici a signály /RD, /WR a IO/M. Odpojením mám na mysli přepnutí do stavu Z (vysoké impedance). Jakmile je procesor odpojen, potvrdí, že je vše hotovo, signálem HLDA. Jednoduché systémy tento signál nepoužívají, můžete jej připojit na log. 0
HLDA (výstup) Za normálního provozu 0. Pokud byl dán požadavek HOLD, tak se po dokončení nezbytných operacáí a odpojení sběrnic tento signál nastaví do log. 1.
INTR (vstup) Interrupt request, tedy Požadavek na přerušení. Procesor testuje stav tohoto signálu na konci každé instrukce a také ve stavu HALT (po instrukci HLT) a HOLD. Pokud je 0, nic se neděje, pokud je 1, začne proces obsluhy přerušení. Procesor přečte z datové sběrnice hodnotu a považuje ji za instrukci, kterou vykoná. Nejčastěji se posílají jednobytové instrukce RST, ale je možné poslat i tříbytovou instrukci CALL. O poslání instrukce se musí postarat vnější obvody, takzvané řadiče přerušení. Programem je možné zakázat vyvolání přerušení tímto signálem.
/INTA (výstup) Interrupt Acknowledge. Po příchodu požadavku přerušení INTR použije procesor výstup /INTA k načtení výše zmíněné instrukce (namísto signálu /RD)
RST5.5, RST 6.5, RST 7.5 (vstupy) Přímé vstupy přerušení. Fungují podobně jako signál INTR, ale nevyžadují celý ten opruz s načítáním instrukce pomocí /INTA. Místo toho si samy interně zařídí skok na patřičná místa. Stejně jako INTR dokážou „probudit“ procesor ze stavu HALT a HOLD. Programátor může tyto signály ignorovat pomocí speciální instrukce („maskování přerušení“)
TRAP (vstup) TRAP je podobný signálům RST x.5 s tím rozdílem, že toto přerušení nemůže programátor zamaskovat.
/RESET IN (vstup, Schmitt KO) Vstup nulování. Po startu systému nebo při havárii by měly vnější obvody tento signál, který je normálně v log. 1, přepnout do log. 0. Tím započne interní proces inicializace: procesor odpojí sběrnice, nastaví programový čítač na adresu 0000h, ukončí všechny případné čekací cykly a začne pracovat „od začátku“. Tento vstup je vybavený Schmittovým klopným obvodem, to znamená, že je možné k němu připojit přímo oblíbený obvod s rezistorem a kondenzátorem, který se postará o RESET při zapnutí napájecího napětí.
RESET OUT (výstup) Indikuje, že je procesor ve stavu RESET. Tento signál je synchronizovaný s hodinami a můžete ho použít jako systémový RESET pro zbytek systému.
X1, X2 (vstupy) Slouží k připojení hodinového krystalu. Jeho frekvence je interně vydělena dvěmi a výsledek dává systémový takt. Vstup X1 může být použit i jako vstup hodinového signálu z externího obvodu.
CLK (výstup) Systémové hodiny. Jejich frekvence je poloviční proti frekvenci na vstupu X1 (tedy třeba proti frekvenci připojeného krystalu)
SID (vstup) Sériový vstup. Hodnota na tomto vývodu je načtena do nejvyššího bitu akumulátoru pomocí instrukce RIM.
SOD (výstup) Sériový výstup. Hodnota na tomto vývodu je nastavena nebo nulována pomocí instrukce SIM.
Vcc Napájecí napětí. Nominálně 5 voltů, u CMOS verze může být někde mezi 3V a 6V.
GND Zem

V datasheetu (je jich spousta různých od různých výrobců, já bych doporučil datasheet od OKI, jejich čip nesl název MSM80C85AH) najdete i velmi důležitý graf, který ukazuje průběhy signálů na sběrnici. Podívejme se na něj spolu:

První řádek ukazuje hodinový signál. M1 je první strojový cyklus, T1 až T4 jsou jeho hodinové takty. Při vyzvedávání instrukce tedy procesor řídí výstupy takto:

  • T1: Nastaví horní část adresy instrukce na výstupy A8-A15, dolní část na výstupy AD0-AD7, a zároveň aktivuje signál ALE (Address Latch Enable). Tento signál řídí už zmíněný buffer mimo procesor, jehož úkolem je zapamatovat si právě spodní část adresy. Zároveň nastavuje signál IO/M do hodnoty 0, tedy „komunikace s pamětí“. Signály /RD a /WR jsou neaktivní, stavové signály nás nemusí zajímat. Se sestupnou hranou hodin v čase T1 se deaktivuje signál ALE a dolní část adresy zůstává zachycena v bufferu.
  • T2: Procesor přepíná signály AD0-AD7 na vstup dat a aktivuje signál /RD, což informuje okolní systém, že procesor hodlá číst (/RD) z paměti (IO/M je v log. 0). Paměť je připojena ke sběrnici a vybrána adresa.
  • T3: S náběžnou hranou hodin přečte procesor stav na datové sběrnici a začne jej vyhodnocovat coby instrukci. Poté deaktivuje signál /RD, takže se paměť může opět odpojit.
  • T4: Procesor dekóduje instrukci.

Dejme tomu, že instrukce potřebuje jeden osmibitový parametr. Ten je uložen, jak bývá zvykem, na následující adrese. Následuje tedy strojový cyklus M2, během něhož jsou čtena data z paměti. Když se podíváte zase na schéma, vidíte, že je téměř totožný s cyklem M1, až na to, že trvá pouhé tři takty – odpadá „dekódovací“ takt.

Přerušení

Pokud v systému nastane nějaká událost, která vyžaduje, aby se jí procesor bezodkladně věnoval (propukne požár, uživatel stiskne tlačítko, přijdou nová data, …), vyvolá takzvané přerušení. U 8085 k tomu slouží hned tři mechanismy.

První je identický jako u procesoru 8080 – vnější zařízení nastaví signál INTR, procesor si přečte z řadiče přerušení jednu instrukci a vykoná ji. Nepřekvapivě jde o instrukce skoku do podprogramu (pro programátory, zvyklé na vyšší jazyky: něco jako vyvolání handleru, volání funkce atd.) O správné poslání instrukce se musí postarat vnější obvody, většinou specializované obvody, nazývané řadiče přerušení.

U 8080 šlo tuto složitost zjednodušit pomocí obvodu 8228 – připojením jednoho z vývodů (INTA) přes rezistor 1K k napětí 12 voltů se z tohoto obvodu stal jednoduchý „řadič přerušení“, který po příchodu požadavku na přerušení poslal na sběrnici hodnotu FFh, což je hodnota, kterou si procesor dekóduje jako instrukci RST 7. (RST 7 uloží aktuální adresu na zásobník a udělá odskok na adresu 0038h, ale o tom víc později). 8085 tuto vymoženost nemá, takže buď použijete řadič přerušení, nebo si vystačíte s interními vstupy RSTx a TRAP.

Druhý způsob je použití vstupů RSTx. Jejich funkce je podobná té, co jsem popisoval u obvodu 8228 o odstavec výš – vygenerují si skokovou instrukci samy. Ono to není tak úplně doslova, protože mechanismus je lehce jiný, ale princip je stejný.

Vstupy RST 5.5 a RST 6.5 (asi klidně můžeme říkat pět a půl a šest a půl) jsou, podobně jako vstup INTR, pravidelně kontrolovány, a jsou-li ve stavu 1, procesor vyvolá přerušení.

Vstup RST 7.5 má, na rozdíl od předchozích, zabudovaný vnitřní klopný obvod, který reaguje na vzestupnou hranu. Výhoda je, že stačí jen krátký signál a procesor si jej inteně „podrží“ až do doby, kdy testuje přerušovací vstupy.

Třetí způsob je signál TRAP. Všechny předchozí způsoby přerušení může programátor zablokovat, „zamaskovat“ pomocí instrukce DI (Disable Interrupt) a povolit pomocí EI (Enable Interrupt). Pokud jsou přerušení zakázána (DI), procesor signály INTR a RST ignoruje. TRAP je výjimka, tento signál vyvolá přerušení i tehdy, když jsou zakázána. Proto se mu také říká nemaskovatelné přerušení.

Co se stane, když přijde naráz víc požadavků na přerušení? Procesor má zabudovaný jednoduchý mechanismus priorit, viz následující tabulka, a vykoná obslužnou rutinu pro požadavek s nejvyšší prioritou.

Signál Priorita Adresa, kde je uložena obslužná rutina Vyvoláno pomocí…
TRAP Nejvyšší (1) 0024h Vzestupná hrana nebo log. 1 během testování
RST 7.5 2 003Ch Vzestupná hrana (pozdržená)
RST 6.5 3 0034h Log. 1 během testování
RST 5.5 4 002Ch Log. 1 během testování
INTR Nejnižší (5) Podle poslané instrukce Log. 1 během testování

K dalšímu čtení

http://saundby.com/electronics/8085/

http://www.nostalcomp.cz/cvicny8080.php

Zapojení procesoru 8085

Takto bude vypadat srdce celého počítače. Dovolte jen pár poznámek:

V roli adresového bufferu je obvod IC2 typu 74573 (ať už ve verzi HC, HCT nebo ALS). Funkčně je shodný s obvodem 74373, až na jeden rozdíl: 373 má vývody přeházené, 573 má hezky všechny vstupy na jedné straně pouzdra a výstupy na druhé. Hodinový vstup je připojen na vývod ALE, povolovací vstup OE jsem připojil natvrdo k zemi. Mohl bych ho připojit na vývod HLDA a zajistit tak odpojení adresní sběrnice ve stavu HOLD, ale tento stav nebude náš počítač používat.

Nebudeme používat ani HOLD, ani READY, ani přerušení, proto jsou tyto vstupy připojeny na neutrální úroveň (READY je 1 – stále připraveno, HOLD a přerušení na 0). Z výstupů jsem nepoužil stavové S0, S1, výstup RESET OUT, a logicky ani HLDA a INTA. Stejně tak nezapojené zůstalo i sériové rozhraní – vstup SID je připojen k zemi, výstup SOD je volný. Můžete si k němu připojit LEDku přes rezistor a zkoušet si třeba bliknout…

Vlevo od procesoru jsou dva obvody. Níž je generátor hodinových pulsů s krystalem a dvěma kondenzátory. Krystal jsem zvolil o frekvenci 3,6864 MHz. Proč? Proč ne 4 nebo, cojávím, 27?

Zaprvé – frekvence nesmí být nižší než 1 MHz. Píšou to v datasheetu. Zadruhé – neměla by být vyšší než 10 MHz. To tam taky píšou. Ideální je někde okolo 4 MHz, protože procesor pak běží na příjemně pomalé frekvenci okolo 2 MHz, tedy zhruba tak, jak běžela originální 8080A.

Proč ale 3,6864 MHz? No protože pak bude procesor běžet na frekvenci 1,8432 MHz, tedy na poloviční.

Dobře, ale proč ne třeba 4 MHz?

No protože 1843200 Hz / 96 = 19200 a 1843200 Hz / 192 = 9600. Už svítá? Správně, 19200 a 9600 jsou standardní frekvence pro sériovou komunikaci. Z frekvence 1,8432 MHz je odvodíme bez problémů pomocí dělení celým číslem. Kdybychom chtěli tyto frekvence získat třeba z 4 MHz, museli bychom hodiny dělit koeficientem např. 208,3333 nebo 416,6666, a v přenosu by byly chyby. Takže tady raději oželím trochu výkonu, když vím, že mi to usnadní další zapojování.

A poslední věc: kondenzátory u krystalu! Jsou důležité k tomu, aby krystal kmital na správné frekvenci. Jejich kapacitu můžete buď spočítat, nebo vyčíst z datasheetu. Já z datasheetu vyčetl 56 pF, což se mi tedy zdálo jako obrovská kapacita. Nasadil jsem 33 pF, a i to bylo moc. Nakonec jsem nechal jen jeden kondenzátor 33 pF u vstupu X2. Pak se ukázalo, že 56 pF bylo z datasheetu CMOS verze a já měl použitou NMOS, kde se doporučují při těchto frekvencích kapacity okolo 7 pF.

Nad generátorem hodin je obvod pro /RESET. Pomocí kondenzátoru k zemi a rezistoru k napájecímu napětí je po zapnutí napájení na vstupu /RESET IN logická 0, dokud se kondenzátor pomalu nenabije. Vhodný poměr odporu a kapacity si můžete buď spočítat, nebo experimentálně vyzkoušet. Myslím, že rezistorem 10K a kondenzátorem 10M nic nezkazíte. Dejte systému trochu času na start, protože po zapnutí napájení ještě chvíli napětí kolísá. Díky tomuto triku je v tu dobu procesor stále ve stavu RESET, a když nastartuje, je napětí už ustálené.

Ještě víc vlevo je tlačítko, které připojuje vstup na zem. Je to magické tlačítko RESET, které náš počítač přivede k rozumu, pokud se náhodou někdy zapomene a skončí třeba v nekonečné smyčce. Díky kondenzátoru jsou odfiltrované i zákmity…

Procesor tedy máme pořešený. S okolním světem komunikuje pomocí adresní sběrnice, datové sběrnice, signálů IO/M, /RD, /WR a hodinového signálu CLK. To je opravdu všechno, víc není pro jednoduchý počítač potřeba.

Rubriky: Hardware | Štítky: , | Napsat komentář

Alpha: Seznam součástek

Níže najdete seznam součástek pro stavbu počítače Alpha. Integrované obvody seženete nejlépe na eBay nebo AliExpressu. Ty menší (74xx) i v ČR. Postupně začnu uveřejňovat návod na stavbu, tak si včas objednejte…

Kromě integrovaných obvodů budete potřebovat i pár diskrétních součástek.

Kondenzátory

2x 6,8pF keramický

1x 4M7 elektrolytický

10x 100nF keramický (filtrační k napájení)

Diody

1x 1N4004 nebo jiná „obyčejná“

1x LED

Rezistory

2x 330R

1x 10k

CPU

Rychlý klon 8085, třeba Mitsubishi M5L8085AP, ale nejlépe MSM80C85AHRS – CMOS verze. K němu krystal 3.6864 MHz

RAM

32k x 8 statická RAM typu 62256, výrobce např. Hitachi

EEPROM

Klasická Atmel 32kx8

Sériové rozhraní

MC68B50. Pokud neseženete verzi B, mohla by stačit i prostá MC6850

Logické obvody

Latch 74573, budič 74245 a NAND 7400. Všechno v HC/HCT/AC/ACT verzích

Volitelné

Paralelní rozhraní

Obvod 8255 v CMOS verzi, takže 82C55AP (vyrábí třeba NEC). K tomu jeden logický 74138, opět verze HC/HCT/AC/ACT

Rubriky: Hardware | Štítky: , , | Komentáře nejsou povolené u textu s názvem Alpha: Seznam součástek

Oživení

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.

 

Rubriky: Hardware | Štítky: , , , , | Komentáře nejsou povolené u textu s názvem Oživení

Klávesnice 2018

Avizoval jsem trošku retropočítačování. A k tomu patří i postavení pár retrokousků…

Nechtěl jsem použít PS/2 a nechtěl jsem se ani matlat s velkou deskou a membránovou klávesnicí. Nakonec jsem vzal sadu padesáti tlačítek s hmatníkem a univerzální desku

50sets/lot Tactile Push Button Switch with hat Momentary Tact 12x12x7mm DIP Through-Hole 4pin Free shipping

Je to jednoduché – udělal jsem si matici 5×8, jako mělo ZX81 nebo ZX Spectrum, a pak jsem si uvědomil, že vlastně můžu přidat poměrně jednoduše dalších osm tlačítek do matice 6×8. A tak jsem je tam nacvakal, připravil jsem si popisky (hmatníky jsou 10×10 mm), nařezal, připojil, a bylo. Teď už jen nadrátovat matici zespodu…

Škoda že už nezbylo místo, jinak bych na desku integroval obvod 74138, převodník 3-na-8, a připojoval bych to celé via 3+6 = 9 vodičů + napájení. Teď holt použiju 12žilový kablík.

Možná by šlo ještě udělat nějaký kryt, vytisknout na 3D tiskárně, ať se tlačítka neviklají. Mají poměrně malý zdvih, a čtvercové hmatníky ani nejsou kdovíjak hezké, přiznám se, že obdélníčky by mi seděly lépe. Ale co už.

Jo a dvě tlačítka, SHIFT a SPACE, jsem zdvojil – čímž jsem vyplácal plných 50 tlačítek.

Rubriky: Hardware | Štítky: | Komentáře nejsou povolené u textu s názvem Klávesnice 2018

ICS: Vítejte v roce 1984…

Bylo mi jedenáct a hltal jsem všechny články o počítačích, ke kterým jsem se dostal.

To nebyl takový problém: vycházely tehdy hlavně v Amáru a VTM, a obojí jsem odebíral a četl. To něco málo z ABC jsem taky přečetl. Jediné, co se ke mně nedostalo pravidelně, byla Sdělovací technika.

Hlavně články o domácích počítačích jsem měl rád. To se tak vždycky někdo utrhl a napsal článek o nějaké obskurní značce, jejíž leták sem kdosi přivezl ze zahraniční cesty do nespřáteleného zahraničí. Ofotila se reklamní fotka z toho letáku, v černobílém vydání na zeleném papíře přílohy AR Mikro to bylo obzvlášť krásné, a kolem toho byl text, který popisoval technické parametry. A na konec přišel ideový závěr, kam odvážnější autoři napsali, že „na takové stroje československé provenience budeme asi čekat ještě dlouho“, ti méně odvážní zmínili, že i v socialistických zemích vznikají kvalitní počítače, a ti, co měli nějaký škraloup, napsali, že „TESLA Horní Dolní chystá již v příští pětiletce výrobu domácího počítače, jehož parametry budou plně srovnatelné s těmi západními“.

Tyhle články mě naplňovaly nadějí, že počítače jsou vlastně za rohem a že jednou si i já takový výdobytek na vlastní kůži vyzkouším. Že třeba uvidím „velmi jemnou grafiku v rastru 256 x 192 bodů a s osmi barvami“. No, to jsem po pravdě neviděl, protože jsem sice měl Spectrum od roku 1986, ale u černobílé televize. Nebo že třeba uvidím ten počítač s disketovým drivem společnosti Commodore, jehož zvukový obvod pracuje v rozsahu téměř osmi oktáv.

Těšil jsem se opravdu moc, a těšení mi nijak neusnadňovaly ani katalogy Quelle, kde byly všechny ty počítače vyfocené. A nejen ty, ale i herní konzole a tři stránky obrázků z her s magickými a poutavými názvy, jako třeba Zaxxon.

A jak jsem se těšil, tak jsem si maloval i to, že bych jednou mohl pro takové počítače psát programy! Tak jsem si založil sešit a krasopisně, podle šablony, jsem ho nadepsal: „Industry Computer Software“, tedy zkráceně ICS. Jako že počítače a programy coby průmyslové odvětví, rozumíme si? Nekladl jsem si malé cíle, jak vidno, ale zase: bylo mi jedenáct!

V sešitu jsem pak popustil uzdu fantazii! Co list, to reklamní leták, případně článek. Vždycky jsem si nakreslil velmi futuristický tvar počítače a k tomu dopsal text ve stejném duchu a podobným stylem jako měly ty články v Amáru a VTM.

Začal jsem skromně, počítačem s jedním KB paměti a procesorem 8080, s alfanumerickým displejem a programovacím jazykem FORTH. Na dalším letáku (stránce) jsem nabídl zákazníkům modul pro rozšíření paměti na 16 kB. Další leták přinesl Univerzální Sběrnici US-1, do níž se dalo zapojit několik rozšiřujících modulů, a zároveň i moduly s jazyky BASIC a PROLOG. Samozřejmě vyvinuté přímo společností ICS.

Ta neusnula na vavřínech, a postupně představila několik dalších modelů svých počítačů, s grafikou, s joysticky, se zvukovým výstupem, s vlastní technologií pro ukládání programů (něco mezi disketou a Microdrivem)… Ty poslední modely už měly procesor Z80 a 128 kB operační paměti. No prostě děla! Kdyby mě nezastavili, asi bych postupně došel k dvoumegovým obludám!

Samozřejmě jsem navrhnul i univerzální sběrnici US-2, která „umožňovala připojení modulů pro procesory 8080 i Z80“ – a to proto, že měla jak signály Z80 (RD, WR, MREQ), tak i 8080 (MEMR, MEMW)! Moje další periferie, včetně čtečky děrných pásek a různých herních ovladačů, tak mohly být připojené ke všem typům počítačů ICS…

Jak vidíte, hojně jsem využíval floskule, vyčtené z dobových recenzí. Vše se dělo „za podpory“ – počítač generoval zvuk za podpory speciálního obvodu pro generování zvuku třeba. Nebo jsem se nevyhýbal ani hodnotícím adjektivům: velikost paměti byla „nevídaná“, programovací jazyk FORTH byl, samozřejmě, „bleskurychlý“, a vývoj software byl „s jeho pomocí velmi efektivní“. Počítače pak jejich uživatelé hodnotili jako „velmi povedené“ a „kladně přijali zejména možnost propojit až 8 počítačů do tzv. sítě, což přináší další výhody, především v profesionálním nasazení“.

Samozřejmě jsem nezapomínal ani na to „software“, takže jsem připravil pro zákazníky několik sad programů – kancelářských, databázových, ale i her.

No a pak jsem sešit asi na dva roky odložil. Vrátil jsem se k němu až někdy v létě 1986, když jsem měl k dispozici manuály k PMD-85 – hlavně ten systémový. Zase mě napadlo, že by se dala spousta periferií připojit k těm vývodům vzadu, už jsem navíc i věděl, jak fungují 8255 a 8251, takže jsem oprášil ideu například joysticku nebo úložiště dat, ale tentokrát jsem to už rozpracoval podrobněji – blokové schéma, popis příkazů, programátorský manuál…

Pak už jsem se k sešitu ICS nikdy nevrátil a na nákresy počítačů, co mohly v 80. letech změnit svět počítačové techniky, minimálně v Československu, kdyby byly bývaly vznikly, padal prach.

Proč o tom píšu? No, má to souvislost, jak jinak, s chystanou druhou knihou. Po Hradlech voltech jsem si řekl, že dokončím původní plán, popíšu, jak vypadá ten osmibitový počítač a zároveň ukážu, jak si ho postavit doma. A ne jeden, ale rovnou několik různých.

Když jsem tak v duchu přemítal, jak je koncipovat a jaké by měly mít jednotlivé typy parametry, aby se na nich dalo ukázat co nejvíc, tak jsem zažil silné deja vu. Zase mi v hlavě naskakovaly zaprášené vzpomínky… „Nejnovější přírustek do řady počítačů představí jemnou grafiku 256 x 192 bodů a programovací jazyk FORTH. Jeho průmyslovému nasazení napomůže možnost snadného připojení periferií přes standartní (sic! V 80. letech nebylo výjimkou narazit na stránkách technického časopisu na tento tvar…) rozhraní RS-232C s rychlostí až 9600 Bd.“

Připravovaný typ pak přinese možnost spouštět programy pro oblíbený operační systém MIKROS (obdoba západního CP/M).

A samozřejmě „doufáme, že se takovéto stroje dostanou k československým zájemcům o výpočetní techniku už v tomto či následujícím roce!“

Rubriky: Hardware, Jen tak | Štítky: , , , , | Komentáře nejsou povolené u textu s názvem ICS: Vítejte v roce 1984…

Monitor ke starým počítačům za pár korun

Já vím. Taky mám doma starou barevnou televizi, opečovávanou jak oko v hlavě, protože na ní fungují všechny ty staré počítače bez problémů. Tam, kde nová obří LED televize řekne jen NO SIGNAL, protože staré počítače se s přesností časování moc nemažou, tam tenhle starej CRT bazmeg drží a zobrazuje…

Jenže je to těžký a velký a neskladný, a až to odejde, tak co?

Nejdřív jsem si říkal, že koupím scandoubler, nebo jak se ty převodníky „video -> VGA“ jmenují. Tak jsem ho koupil a jako upřímně: ne že by to nefungovalo vůbec, ale z toho obrazu jsem byl intenzivně nenadšený. Hledáme dál.

Svého času byl populární monitor PSOne – Sony to prodávalo k nějakýmu PlayStationu, a byla to v podstatě LCD televize s úhlopříčkou nějakých 7 palců či tak něco… Objevil jsem kdysi návod na připojení téhle televize k ZX Spectru, postnul jsem to do nějakého diskusního fóra o Spectru, a než mě vypičovali a odešel jsem, tak jsem zahlédl, že si to někdo opravdu postavil a fungovalo mu to.

Ale PSOne už není moc k sehnání, a když je, tak je drahá, ergo zase nic. Tak jsem zase hledal, hledal, až jsem zahlídnul tohle:

Ano, vidíte dobře: ZX81, k tomu nějaký miniaturní monitor… Chvilku jsem hledal, a nakonec jsem našel. Skrývá se to pod kódovým označením LCD TFT displej k palubní kameře do auta

Objednal jsem, samozřejmě. Ale taky jsem hledal dál a našel menší variantu, navíc levnější:

4.3-inch color TFT LCD display Car parking camera PAL/NTSC

A tak přišla první.

Nelenil jsem a vyzkoušel. Napájí se to z adaptéru 12 voltů a má to dva vstupy s CINCHem. Nejdřív jsem zkusil ZX Spectrum Plus – mám u něj vypnutý TV modulátor a vyvedený přímo kompozitní video signál. Chvilka hraní – a voila, funguje!

Displej se zapne až ve chvíli, kdy přijde signál. Do té doby je černý. Trochu mě to zmátlo. Ale nakonec dobré. Pomocí tří tlačítek na zadní straně můžete nastavit klasické parametry: jas, kontrast, sytost atd. Můžete taky přepnout poměr stran – buď 4:3, nebo 16:9. Zkusil jsem si naťukat jeden jednoduchý prográmek, a docela to ujde, ne?

Pak jsem zkusil i Atari 130 XE – to má kompozitní video přímo na konektoru, takže bez problémů:

Narazil jsem zatím jen u C64, tam se signál nějak nechytil…

Rubriky: Hardware | Štítky: , , , , , | Komentáře nejsou povolené u textu s názvem Monitor ke starým počítačům za pár korun

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ář