Minulé díly seriálu:
Kapitola 1 - Zpátky do roku 1960Kapitola 1 - ErrataKapitola 2 - Rat RaceKapitola 4 - Pomněnkový salátKapitola 8 - Ajn, cváj, policájKapitola 16 - Ententýky, dva špalíkyKapitola 32 - To ostatníMinipočítač TWELVEKapitola 64 - Jídelní lístekHladový hardware sám o sobě nedokáže nic, je potřeba ho něčím nakrmit, nejlépe programem a daty, aby měl co přežvykovat a věděl jak na to. Takže dnešní menu bude krmení TWELVE.
"Jamalalicha, paprťála, žbrluch."Tak tomuhle by počítač fakt nerozuměl, ten zná jenom jedničky a nuly. A ty je do něj potřeba nějak našťouchat, například pomocí přepínačů na čelním panelu. Takový panel by měl umět několik základních činností:
- Zobrazit obsah registru R7, tedy ukázat Program Counter.
- Zapsat do R7 libovolnou hodnotu, jako počáteční adresu pro Program Counter.
- Zobrazit obsah paměti na adrese z R7, a inkrementovat R7.
- Zapsat zadávaná data do paměti na adresu z R7, a inkrementovat R7.
Bod 1 není problém, prostě pár světýlek připojených přímo do registrové banky, které stále zobrazují to, co v R7 zrovna je. Pro další tři body se dá využít
ovládací I/O kanál 0, vyvedený na čelní panel, s několika dalšími funkcemi navíc. A ten čelní panel by mohl vypadat třeba nějak takhle, nebo dost podobně:
Úplně vpravo je volič režimu, který má čtyři polohy:
- OFF - vypnuto, odpojené napájení.
- RST - reset, zapne napájení a nastaví sekvencér v řadiči do počátečního stavu pro rozběh.
- PRG - režim programování, stroj se ovládá pomocí čelního panelu.
- EXE - režim provádění programu, stroj se rozeběhne od adresy která je v tom okamžiku nastavená v R7.
Mezi PRG a EXE se dá za běhu libovolně přepínat, pozastavovat běh programu a měnit cokoliv v paměti. Při přepnutí na PRG se dokončí právě rozpracovaná instrukce - sekvencér doběhne na konec, zastaví se, a pak řadič čeká na povel z panelu. Při EXE se automaticky rozběhne načtení a zpracování nové instrukce, pořád dokola.
Pokud program zatuhne, což se může stát například při čtení z nezapojeného kanálu, bude sekvencér čekat na potvrzení vstupu a dokončení instrukce donekonečna. V takovém případě stačí přepnout až na RST, tím se sekvencér zresetuje, provádění instrukce zruší, a v programu je možné zase pokračovat od následující instrukce nastavením režimu EXE.
Horní řada ukazuje stav příznaků
(bity F až C) a registru R7
(bity B až 0). Při běžícím programu v režimu EXE budou lampičky krásně blikat a ukazovat kde v paměti se program zrovna nachází, v režimu PRG je tady vysvícená adresa, kde se má program
(opět) rozběhnout. Tlačítko vpravo vedle ní podstrčí řadiči instrukci
READ R7 C0 a rozběhne sekvencér. Ten zpracováním instrukce načte z kanálu 0 stav přepínačů na čelním panelu, hodnotu zapíše do příznaků a R7, a po doběhnutí instrukce se opět zastaví. Popis
R7 vedle tlačítka je jednoznačný.
Druhá řada je výstup kanálu 0, takže co do něj program za běhu zapíše, to se tady rozsvítí a je to tam do té doby, dokud se do kanálu 0 nezapíše něco jiného. Nebo dokud se počítač nevypne. Tlačítko vedle druhé řady podstrčí řadiči instrukci
READ M7 C0 a rozeběhne sekvencér. Ten zpracováním instrukce načte z bubnu z adresy obsažené v R7 dvanáctibitové slovo, a spolu s příznaky ho pošle do kanálu 0. Přitom inkrementuje R7, aby se při dalším stisku provedlo totéž z následující adresy. Pak se také zastaví. Popis
OUT vedle tlačítka by také mohl napovědět.
Mezi druhou a třetí řadou je popis jednotlivých bitů, aby byl pěkně na očích.
Třetí řada je vstup kanálu 0. Běžící program si z něj může kdykoliv načíst do registru či paměti stav všech šestnácti přepínačů včetně příznaků. V režimu EXE tlačítko vedle třetí řady potvrzuje, že přepínače jsou nastavené na požadovanou vstupní hodnotu a lze je načíst kanálem 0, takže program může běžet dál. V režimu PRG tlačítko podstrčí řadiči instrukci
WRITE M7 C0 a spustí sekvencér. Ten zpracováním instrukce načte z kanálu 0 stav všech šestnácti přepínačů, podle nich zapíše do paměti příznaky a na buben na adresu z R7 dvanáctibitové slovo, přitom inkrementuje R7 na další adresu, a zastaví se. Popis
IN vedle tlačítka opět napovídá co provádí.
Tlačítka takhle pochopitelně fungují jenom v režimu PRG, asi by bylo zajímavé, kdyby se třeba dal měnit obsah R7 za běhu programu, ale generátor náhodných chyb radši přenechám M$ Windoze. Takže tímto bysme měli pohromadě základní funkce, a nic víc tak nějak ani není potřeba, tohle musí stačit k nacvakání krátkého programu nebo dat kamkoliv do paměti, opravě chyb, a spuštění běhu od libovolné adresy. Dál už je to jiný příběh.
"Což takhle dát si ... bity?"Instrukce TWELVE se skládají ze tří nibblů. První čtyři
přepínače F až C proto můžeme klidně přeskočit, ty se programového kódu vůbec netýkají, ale dají se pomocí nich měnit příznaky F až C. Operační kód instrukce je obsažený v horním nibblu dvanáctibitového slova, což jsou
přepínače B až 8. Instrukce samotné by bylo dobré trochu roztřídit a v instrukční sadě přehledně uspořádat, aby se v nich snadno vyznal člověk, ale také aby se v nich vyznal řadič počítače, který je musí před provedením dekódovat. A protože za ideální dekodér považuji žádný dekodér, musely se instrukce roztřídit opravdu důkladně! Jediná věc kterou jsem měl už brzy po začátku jasnou bylo, že instrukce
COPY R0 R0 se má kódovat jako
0000 0000 0000, a nahradit tak instrukci
NOP.
Začátky návrhu byly dost divoké, některé instrukce jsem postupně vypustil, další zase nahradily jiné instrukce, které uměly provést totéž odlišným způsobem, pár jich naopak ještě přibylo, a nakonec mi vyšlo těch šestnáct, které jsem popsal v
kapitole 1. Samotného mě pak trochu překvapilo, že právě osm z nich - přesně polovina - nějakým způsobem něco počítá, používá ADDER. A druhá polovina zase nic nepočítá, ta jenom přesouvá něco odněkud někam a používá k tomu všechno ostatní.
- Takže přepínač B určuje, která z těchhle dvou polovin to bude:
1 - nahoru jsou výpočty ve sčítačce,
0 - dolů jsou přesuny.
- Výpočty mohou být dvojího druhu. Buď se týkají aritmetiky s daty, nebo skoků v programu. To rozlišuje přepínač A, stejně jako předchozí:
1 - nahoru je aritmetika,
0 - dolů jsou skoky.
- Aritmetické výpočty se zase dělí na dvě skupiny, buď počítají se dvěma operandy, nebo s jedním operandem a konstantou. To se určí přepínačem 9, kde:
1 - nahoru je operand,
0 - dolů je konstanta.
- Druhý operand se může přičítat nebo odečítat, a o tom rozhoduje přepínač 8, který znamená:
1 - nahoru je ADD - přičítání, celkově 1111,
0 - dolů je SUB - odčítání, celkově 1110.
- Stejná věc se může provádět i s konstantou, tam přepínač 8 říká:
1 - nahoru je INC - zvýšení, celkově 1101,
0 - dolů je DEC - snížení, celkově 1100.
- Skoky se také dělí na dvě skupiny, ale jiným způsobem. Jsou zde tři podmíněné a jeden nepodmíněný. Je-li některý z přepínačů 9 a 8 zvednutý na 1, pomocí sčítačky se provede porovnání COMPARE a podle jeho výsledku se buď vykoná nebo přeskočí následující instrukce, což může být třeba relativní skok, nebo cokoliv jiného kromě NUMBER. Funkci komparátoru určuje maska nastavená přepínači 9 a 8, a ta se překrývá s výstupem sčítačky, viz kapitola 8:
1 1 - GREAT je porovnání WORK > DATA, celkově 1011,
1 0 - EQUAL je porovnání WORK = DATA, celkově 1010,
0 1 - LESS je porovnání WORK < DATA, celkově 1001.
Jsou-li oba přepínače 9 a 8 dole na 0, žádná maska není a provede se relativní skok o 0 až 127 slov přičtením nebo odečtením offsetu k R7:
0 0 - JUMP je nepodmíněný relativní skok, celkově 1000.
- Podle stavu přepínače 7 z následujícího nibblu se zvývajících sedm bitů z instrukce buď přičte nebo odečte:
1 - dopředu je větvení, celkově 10001,
0 - dozadu je cyklus, celkově 10000.
- Také přesuny jsou dvojí. Buď se při nich provádějí bitové operace, nebo jenom přesouvají data. To také rozlišuje přepínač A, takhle:
1 - nahoru jsou bitové,
0 - dolů jsou přímé.
- Bitové přesuny (či operace) se dělí podobně jako skoky. Je-li některý z přepínačů 9 a 8 zvednutý na 1, pracuje se s jednotlivými bity pomocí SWITCHe. Jsou-li oba dole na 0, provede se v SHIFTERu bitový posun - dělení. Bit ve slově nebo velikost posunu určuje Kubikova konstanta v nejnižším nibblu. Přepínač 9 vybírá:
1 - nahoru je nastavení zvoleného bitu na některou hodnotu,
0 - dolů je test zvoleného bitu nebo rotace dvanáctibitového slova a příznaku C vpravo.
- Má-li se bit nastavit, rozhoduje přepínač 8 o tom jak. A to celkem jednoduše, prostě se stav tohohle přepínače rovnou vrazí do určeného bitu, tak jak je. A nemusí se nic dekódovat:
1 - nahoru je ONE - nastavení na 1, celkově 0111,
0 - dolů je ZERO - nastavení na 0, celkově 0110.
- Má-li se bit testovat, je přepínač 8 zvednutý:
1 - nahoru je TEST - čtvrtý nepodmíněný skok, jediný který nepoužívá sčítačku, celkově 0101.
- Má-li se dělit, je přepínač 8 shozený:
0 - dolů je HALF - rotace přes CARRY, celkově 0100.
- Také přímé přesuny jsou dvojího druhu, a o tom jakého rozhoduje zase přepínač 9:
1 - nahoru je operace I/O, neboli přesuny vnější,
0 - dolů je kopírování slova z registru do registru nebo z programu do registru, neboli přesuny vnitřní.
- Směr vnějšího přesunu volí přepínač 8, číslo kanálu určuje zase nejnižší nibble:
1 - ven je WRITE - zápis do kanálu, celkově 0011,
0 - dovnitř je READ - čtení z kanálu, celkově 0010.
- Druh vnitřního přesunu volí také přepínač 8, :
1 - s parametrem je NUMBER - načtení čísla z programu do registru, celkově 0001,
0 - bez parametru je COPY - kopírování čísla z registru do registru, celkově 0000.
Jak je vidět, nakonec přesně podle počátečního požadavku vyšel na instrukci COPY kód 0000. A protože lepší než tisíc slov je jeden obrázek, můžeme si celé to větvení přehledně uspořádat do stromu, rozvětvujícího se zleva doprava, stejně jako jsou seřazené přepínače na čelním panelu:
A tím je konečně uspořádaná instrukční sada, přidělené operační kódy, a dané zapojení dekodéru sekvencéru. Pro rychlou orientaci v jednotlivých skupinách se dá použít také čtvercová tabulka se zvýrazněnými skupinami:
Ve složených buňkách je nahoře název instrukce, vlevo dole tučně první písmeno - zkrácený zápis pro assembler, a vpravo dole kurzívou šestnáctkový kód, stejně jako v předchozím stromu.
"Hlavní chod a přílohy."Hlavní chod je kód instrukce, rozebraný výše. Následuje první příloha - volba registru
WORK. Ten určuje prostřední nibble, zadávaný
přepínači 7 až 4:
Přepínač 7 volí ze které části paměti se bude číst a kam se bude také zapisovat:
- 1 - buben je nepřímo adresovaný slovem z vybraného registru,
- 0 - registr je přímo vybraný dalšími třemi bity.
Přepínače 6 až 4 volí číslo registru 0 až 7.
Druhá příloha je spodní nibble, zadávaný
přepínači 3 až 0. Ten má víc významů podle typu instrukce:
- registr DATA je volený stejným způsobem jako registr WORK, říká odkud se má načíst druhý operand,
- číslo kanálu je v rozsahu 0 až 15, pro READ a WRITE,
- Kubikova konstanta je buď v rozsahu 0 až 15 pro INC a DEC, nebo v rozsahu 0 až 12 pro HALF.
Oba dva nibbly dohromady tvoří kladný nebo záporný offset pro nepodmíněný relativní skok
JUMP.
Třetí příloha je následující celé dvanáctibitové slovo,které načítá instrukce NUMBER. Ta je proto celkově dlouhá dvě slova a tak se jako jediná nedá použít za podmíněnými skoky, které můžou přeskočit jenom jedno slovo.
"Dáme si nášup?"Vkládat čelním panelem celý program pokaždé, když se má spustit, by byla trochu otrava. Chce to nějaké trvanlivé médium, ze kterého se dá načítat opakovaně, větší rychlostí, a mnohem větší objem dat. Jako dostatečně primitivní a časuodolný materiál se osvědčil obyčejný papír, používaný pro analogové záznamy písmem několik tisíciletí a pro digitální záznamy dírkami několik staletí.
Takže úplně stejně jako přepínači na čelním panelu se dá program ručně naděrovat do dvanáctistopé děrné pásky. Do počítače se potom nacvaká jenom zavaděč, a ten se postará o načtení pásky do paměti, pomocí čtečky připojené na vstup kanálu 1. A na výstupu stejného kanálu by mohla být třeba děrovačka, pro snadné uložení zpracovaných dat, nebo třeba programového kódu přeloženého assemblerem. Ale to zase až někdy příště.