CLAUDIA Lite

primitivní 4-bitový procesor/počítač sestavený z obvodů TTL 74xx




Programy pro Claudii Lite

Pro praktickou práci s Claudií Lite je vhodné mít po ruce instrukční soubor v přehledné tabulce. Třeba takovéto:


Instruction set summary


Níže jsou uvedeny odzkoušené programy demonstrující funkci Claudie Lite a jejího instrukčního souboru. Vzhledem k malé programové paměti s max. 16 programovými kroky se jedná opravdu o prográmky primitivní, jejichž účelem je demonstrovat činnost počítače a ukázat funkci jednotlivých instrukcí z jeho instrukčního souboru. Začneme od těch úplně nejjednodušších. Programy jsou psány ve "strojovém kódu" binárně jako ADRESA: DATA. V závorce je pak vždy uvedena tzv. mnemotechnická zkratka instrukce, která odpovídá zadanému operačnímu kódu. Za středníkem je pak komentář vysvětlující význam instrukce. Není-li na řádku závorka s instrukcí uvedena, jedná se o konstantu či adresu skoku patřící k předchozí instrukci. Všechny uvedené programy jsou na konci této stránky ve formátu PDF i ke stažení a vytištění pro snadné programování.



Přímý přepis vstupu na výstup:

Asi nejjednodušší smysluplný program. Program periodicky v nekonečné smyčce čte stav vstupního portu (přepínačů) a posílá jej na výstupní port. Čtení provádí instrukce IN A, která data ze vstupu načte do registru A. Následně jsou data z registru A pomocí instrukce OUT A přepsána do výstupního registru OUT. Poslední instrukcí je skok (JMP) zpět na začátek smyčky - adresu 0000:

ADDR: DATA
0000: 0110 (IN A) ;precti stav vstupniho portu a uloz do A
0001: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0010: 1000 (JMP 00h) ;skoc na zacatek a opakuj cyklus
0011: 0000

Postup programování je následující:

1) zapneme Claudii Lite a přepneme ji do režimu PROG
2) stiskneme a uvolníme RESET, aby došlo k vynulování registrů a PC
3) na páčkových spínačích nastavíme hodnotu 0110 a uložíme do RAM stiskem MW
4) inkrementujeme PC stiskem +ADDR
5) na páčkových spínačích nastavíme hodnotu 0111 a uložíme do RAM stiskem MW
6) inkrementujeme PC stiskem +ADDR
7) na páčkových spínačích nastavíme hodnotu 1000 a uložíme do RAM stiskem MW
8) inkrementujeme PC stiskem +ADDR
9) na páčkových spínačích nastavíme hodnotu 0000 a uložíme do RAM stiskem MW
10) chceme-li program zkontrolovat, vynulujeme PC stiskem RESET a tlačítkem +ADDR projdeme celý zapsaný program
11) stiskneme a podržíme RESET
12) přepneme řídící přepínač do režimu RUN
13) uvolníme RESET

Claudia nyní poběží v programovém režimu a bude periodicky číst vstupní spínače a přepisovat jejich stav na výstup OUT. Pochopitelně se stav vstupů bude objevovat i v registru A. Přepínač RUN/STEP musí být přepnut na RUN a přepínač FAST/SLOW by měl být na FAST, abychom u toho nestrávili mládí:-) Během programování kontrolujeme na LED zda se do RAM ukládají správná data a také kontrolujeme stav PC.



Přímý přepis vstupu na výstup a do registru B:

Program shodný s předchozím. Jediným rozdílem je přidání instrukce MOV BA, takže data načtená ze vstupu se nyní objevují v registrech A, B a OUT.

ADDR: DATA
0000: 0110 (IN A) ;precti stav vstupniho portu a uloz do A
0001: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0010: 0001 (MOV BA) ;prepis cislo z A do registru B
0011: 1000 (JMP 00h) ;skoc na zacatek a opakuj cyklus
0100: 0000



Přepis vstupu na výstup s negací vstupních dat:

Modifikace prvního programu s tím, že data zapisovaná na OUT jsou negovanou variantou vstupních dat. Negaci provedeme pomocí operace XOR, neboť výsledkem tohoto exkluzívního logického součtu vstupních dat se samými jedničkami (1111) jsou negovaná vstupní data. Před provedením operace XOR si nejprve musíme do registru B vložit samé jedničky (1111) - stačí jen jednou, takže začátek smyčky posuneme až na adresu 02h.

ADDR: DATA
0000: 0011 (LDB 0Fh) ;vloz do B binarni cislo 1111b
0001: 1111
0010: 0110 (IN A) ;precti stav vstupniho portu a uloz do A
0011: 0101 (XOR AB) ;proved A XOR B a uloz vysledek do A
0100: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0101: 1000 (JMP 02h) ;skoc na zacatek smycky a opakuj cyklus
0110: 0010



Přepis vstupu na výstup. Vstupní data zvětšená o jedničku:

Modifikovaný předchozí program. Data ze vstupu zvětšíme o jedničku na zapíšeme na OUT. Program demonstruje použití sčítačky a instrukce ADDC AB. Na počátku vložíme do registru B jedničku (0001) a tu potom přičítáme ke vstupním datům načteným do reg. A. Před provedením součtu je vždy nutné vynulovat příznak přenosu C, protože pokud by jednou došlo k jeho nastavení (při vstupních datech 1111), v následujících cyklech bychom nepřičítali 1, ale 2 (A+B+C).

ADDR: DATA
0000: 0011 (LDB 01h) ;vloz do B binarni cislo 0001b
0001: 0001
0010: 0110 (IN A) ;precti stav vstupniho portu a uloz do A
0011: 1110 (CLF) ;vynuluj priznaky C a Z
0100: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
0101: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0110: 1000 (JMP 02h) ;skoc na zacatek smycky a opakuj cyklus
0111: 0010



Přepis vstupu na výstup. Vstupní data zmenšená o jedničku:

Důkaz, že Claudia Lite umí i odčítat. Program je prakticky shodný s předešlým, ale namísto jedničky je do B registru vložen tzv. dvojkový doplněk jedničky, což v binární soustaně znamená -1. Sečtením vstupních dat s dvojkovým doplňkem jedničky de facto dojde k odečtení jedničky od vstupních dat. Opět je nutné vždy před operací ADDC nulovat příznak C. Tvorba dvojkového doplňku k libovolnému binárnímu číslu bude ukázána později.

ADDR: DATA
0000: 0011 (LDB 0Fh) ;vloz do B binarni cislo 1111b
0001: 1111
0010: 0110 (IN A) ;precti stav vstupniho portu a uloz do A
0011: 1110 (CLF) ;vynuluj priznaky C a Z
0100: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
0101: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0110: 1000 (JMP 02h) ;skoc na zacatek smycky a opakuj cyklus
0111: 0010



Nekonečné čítání (inkrementace) na výstupním portu:

Varianta 1 - přičítání jedničky z B registru k A registru. Příznak C=0.

ADDR: DATA
0000: 0010 (LDA 00h) ;nuluj reg. A (neni nutne, nuluje se automaticky)
0001: 0000
0010: 0011 (LDB 01h) ;vloz do reg. B binarni cislo 0001b
0011: 0001
0100: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0101: 1110 (CLF) ;vynuluj priznaky C a Z
0110: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
0111: 0000 (NOP) ;jen kvuli zpomaleni citani
1000: 1000 (JMP 04h) ;skoc na zacatek smycky a opakuj cyklus
1001: 0100


Varianta 2 - přičítání nastaveného příznaku C k A registru. Registr B=0.

ADDR: DATA
0000: 0010 (LDA 00h) ;nuluj reg. A (neni nutne, nuluje se automaticky)
0001: 0000
0010: 0011 (LDB 00h) ;nuluj reg. B (neni nutne, nuluje se automaticky)
0011: 0000
0100: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0101: 1111 (SEF) ;nastav priznaky C a Z
0110: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
0111: 0000 (NOP) ;jen kvuli zpomaleni citani
1000: 1000 (JMP 04h) ;skoc na zacatek smycky a opakuj cyklus
1001: 0100



Čítání 0000b až 1111b na výstupním portu:

Přičítání jedničky z B registru k A registru a přepis na výstupní port. Dosáhne-li hodnota na výstupním portu 1111, čítání se zastaví a program se zacyklí v nekonečné smyčce (skok na sebe sama)

ADDR: DATA
0000: 0010 (LDA 00h) ;nuluj reg. A (neni nutne, nuluje se automaticky)
0001: 0000
0010: 0011 (LDB 01h) ;vloz do reg. B binarni cislo 0001b
0011: 0001
0100: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0101: 1110 (CLF) ;vynuluj priznaky C a Z
0110: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
0111: 1010 (JC 07h) ;je-li nastaven C, zacykli se
1000: 0111
1001: 0000 (NOP) ;jen kvuli zpomaleni citani
1010: 1000 (JMP 04h) ;skoc na zacatek smycky a opakuj cyklus
1011: 0100

Místo JC (1010) lze použít JZ (1100). Výsledek bude v tomto případě stejný.



Čítání na výstupním portu od 0000b do hodnoty nastavené na vstupním portu:

Přičítání jedničky z B registru k A registru a přepis na výstupní port. Dosáhne-li hodnota na výstupním portu hodnoty načtené ze vstupního portu (spínačů), čítání se zastaví a program se zacyklí v nekonečné smyčce (skok na sebe sama)

ADDR: DATA
0000: 0010 (LDA 00h) ;nuluj reg. A (neni nutne, nuluje se automaticky)
0001: 0000
0010: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0011: 0001 (MOV BA) ;prepis cislo z A do B (zaloha A)
0100: 0110 (IN A) ;precti stav vstupniho portu a uloz do A
0101: 0101 (XOR AB) ;porovnej cisla A a B
0110: 1100 (JZ 06h) ;jsou-li stejne (Z=1), zacykli se
0111: 0110
1000: 0010 (LDA 01h) ;vloz jednicku do A
1001: 0001
1010: 1110 (CLF) ;vynuluj priznaky C a Z
1011: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
1100: 1000 (JMP 02h) ;skoc na zacatek smycky a opakuj cyklus
1101: 0010



Nekonečná dekrementace na výstupním portu:

Nekonečné odečítání jedničky od registru A. V registru B máme hodnotu 1111, což je dvojkový doplněk čísla 1 a jeho přičtením k registru A de facto odečteme od A jedničku.

ADDR: DATA
0000: 0010 (LDA 0Fh) ;vloz do reg. A binarni cislo 1111b
0001: 1111
0010: 0011 (LDB 0Fh) ;vloz do reg. B binarni cislo 1111b
0011: 1111
0100: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0101: 1110 (CLF) ;vynuluj priznaky C a Z
0110: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
0111: 0000 (NOP) ;jen kvuli zpomaleni citani
1000: 1000 (JMP 04h) ;skoc na zacatek smycky a opakuj cyklus
1001: 0100



Nekonečné čítání tam a zpět 0001-1111-0001 na výstupním portu:

Zatím "nejsložitější" ukázkový program pro Claudii Lite. Na jeho fungování si už musíte přijít sami:-)

ADDR: DATA
0000: 0010 (LDA 01h) ;vloz do reg. A binarni cislo 0001b
0001: 0001
0010: 0001 (MOV BA) ;prepis data z A do B
0011: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0100: 1110 (CLF) ;vynuluj priznaky C a Z
0101: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
0110: 1100 (JZ 0Ah) ;je-li Z=1, skoc na 0Ah
0111: 1010
1000: 1000 (JMP 03h) ;skoc na zacatek a opakuj cyklus
1001: 0011
1010: 0010 (LDA 0Eh) ;vloz do reg. A binarni cislo 1110b
1011: 1110
1100: 0101 (XOR AB) ;A = A XOR B
1101: 1000 (JMP 02h) ;skoc na zacatek smycky a opakuj cyklus
1110: 0010



Běžící světlo na výstupním portu:

Sčítání dvou stejných čísel není nic jiného, než násobení dvěma. Claudia Lite umí i násobit:-)

ADDR: DATA
0000: 0010 (LDA 01h) ;vloz do reg. A binarni cislo 0001b
0001: 0001
0010: 0001 (MOV BA) ;prepis data z A do B
0011: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
0100: 1110 (CLF) ;vynuluj priznaky C a Z
0101: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
0110: 1010 (JC 00h) ;je-li C=1, skoc na 00h
0111: 0000
1000: 1000 (JMP 02h) ;skoc na zacatek smycky a opakuj cyklus
1001: 0010



Dvojkový doplněk ke vstupním datům na výstupní port:

Ukázka tvorby dvojkového doplňku binárního čísla, které zadáváme na vstupním portu (spínačích). Dvojkový doplněk je nutný pro odečítání, jehož ukázka je v dalším programu. Dvojkový doplněk vloženého čísla utvoříme tak, že se nejprve invertují všechny bity čísla a následně se přičte jednička. K inverzi bitů s výhodou využijeme funkci XOR se samými jedničkami. Hotový dvojkový doplněk, neboli záporné komplementární číslo k zadanému číslu, následně vypíšeme na výstupní port OUT.

ADDR: DATA
0000: 0011 (LDB 0Fh) ;vloz do reg. B binarni cislo 1111b
0001: 1111
0010: 0110 (IN A) ;precti stav vstupniho portu a uloz do A
0011: 0101 (XOR AB) ;A = A XOR B (negace A)
0100: 0011 (LDB 01h) ;vloz do reg. B binarni cislo 0001b
0101: 0001
0110: 1110 (CLF) ;vynuluj priznaky C a Z
0111: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
1000: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
1001: 1000 (JMP 00h) ;skoc na zacatek smycky a opakuj cyklus
1010: 0000



Rozdíl (odečítání) 15 - vstupní data na výstupní port:

Ukázka odečítání přičtením dvojkového doplňku. Budeme odečítat číslo (menšitel) zadané na vstupních spínačích od čísla (menšenec) 15 vloženého do B registru (lze vložit libovolné jiné číslo). Zadaný menšitel nejprve převedeme na jeho dvojkový doplněk (viz. předchozí program) a sečteme ho s menšencem. Tím provedeme odečítání klasickou binární sčítačkou.

ADDR: DATA
0000: 0011 (LDB 0Fh) ;vloz do reg. B binarni cislo 1111b
0001: 1111
0010: 0110 (IN A) ;precti stav vstupniho portu a uloz do A
0011: 0101 (XOR AB) ;A = A XOR B (negace A)
0100: 0011 (LDB 01h) ;vloz do reg. B binarni cislo 0001b
0101: 0001
0110: 1110 (CLF) ;vynuluj priznaky C a Z
0111: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
1000: 0011 (LDB 0Fh) ;vloz do reg. B binarni cislo 1111b
1001: 1111
1010: 1110 (CLF) ;vynuluj priznaky C a Z
1011: 0100 (ADDC AB) ;proved A+B+C a uloz vysledek do A
1100: 0111 (OUT A) ;prepis cislo z A do vystupniho registru OUT
1101: 1000 (JMP 00h) ;skoc na zacatek smycky a opakuj cyklus
1110: 0000

To, že prostřednictvím sčítačky je možné i odečítat, je důkaz, že sčítání je naprosto základní aritmetickou operací v binární soustavě. Vždyť i násobení se dá převést na postupné sčítání a dělení zase na postupné odečítání, které ale převedeme opět na sčítání s dvojkovým doplňkem menšitele:-)



Tak a to je prozatím vše. Pochopitelně si můžete vymýšlet prográmky vlastní, ale ono už se toho moc smysluplného naprogramovat nedá. 16 programových pozic v paměti programu 7489 je zkrátka málo. Ale stále je nutné opakovat, že Claudia Lite měl být od počátku výukový stroj a má sloužit k pochopení základních principů procesorů a počítačů. A to se myslím podařilo splnit na 100%:-)

Pro pohodlnější programování a hrátky s Claudií Lite si můžete všechny výše uvedené prográmky stáhnout a vytisknout z následujícího PDF:


Programy pro Claudia Lite


Pokud jste z nějakého důvodu nedošli na stránku s instrukčním souborem a nechápete význam instrukcí, můžete se vrátit.


Instrukce

Finální provedení


RET



Odladěno na MS IE 8.0 a Firefoxu při rozlišení min. 1024 x 768 pixelů
www.NOSTALCOMP.cz    2010  -  2019