Tento procesor může být realizován i jako virtuální stroj zakomponovaný do jádra Forthu.
Při návrhu vycházím z poznatků z procesorů SOP32, F18, ...
Tabulka 29.1. Registry procesoru
název | popis |
---|---|
IP | Ukazatel instrukcí (zvaný také PC). Ukazuje na následující instrukci |
IR | instrukční registr obsahuje právě dekódované instrukční slovo |
SP | datový zásobník |
RP | zásobník návratových adres (>R R> R@) |
A | adresní registr který používají instrukce A@+, … |
W | pomocný pracovní registr, není přímo přístupný |
Nejdříve instrukce. Z pohledu procesoru existují atomické instrukce, atomy a instrukční slova. Slovo obsahuje obvykle několik atomických instrukcí. Protože je nutno skloubit malý počet instrukcí a potřebu velkého počtu bitů pro adresu při volání poprpogramu, je instrukční slovo rozděleno do několika skupin bitů. Jedná se o dlouhé instrukční pole, a dva jednobitové příznaky, příznak návratu a příznak adresy (skoku).
Základní struktura instrukčního slova:
+------------------------+---+---+ | instrukční pole |Adr|Ret| +------------------------+---+---+
Tabulka 29.2. Struktura instrukčního slova
instrukční pole | A | R | popis |
---|---|---|---|
adresa | 0 | 0 | instrukce volání podprogramu |
adresa | 0 | 1 | instrukce skoku |
pole atomických instrukcí | 1 | 0 | atomické instrukce |
pole atomických instrukcí | 1 | 1 | atomické instrukce s návratem |
Při vytváření instrukční sady jsem vycházel z následujících úvah:
Potřeboval jsem se rozhodnout, jaký význam přidelím spodmín dvoum bitům. Protože jedna z potřebných informací je příznak návratu, rozhodl jsem se nevytvářet dvoubitové pole a jednotlivým kombinacím přidělovat význam, ale přimo přidělit význam jednotlivým bitům. Tyto dva bity jsem pojmenoval R — Return a A — Address a přidělil jim následující význam.
Bit | Název | Význam |
---|---|---|
0 | Ret | Implicitní return, je li v poli 1, dojde po vykonání instrukce/instrukcí k návratu z podprogramu. |
1 | Adr | Adresní bit, 0 - v instrukčním poli je adresa, 1 - v instrukčním poli jsou atomické instrukce |
Pak jsem si napsal jednotlivé kombinace bitů přehledně do tabulky abych se nad nimi mohl zamyslet.
b31-b2 (I) | b1 (A) | b0 (R) | mnemo | Význam |
---|---|---|---|---|
adresa | 0 | 0 | CALL | volání podprogramu na adrese |
adresa | 0 | 1 | JUMP | předání řízení na adresu |
atomy | 1 | 0 | atomické instrukce | |
atomy | 1 | 1 | atomické instrukce s návratem |
Tři kombinace my byly hned jasné, bylo to volání podprogramu a atomické isntrukce s návratem a bez. Nad čtvrtou kombinací jsem se na chvíli zamyslel. Uvědomil jsem si že ji můžu použít ve významu tail call. Což je technicky obyčejný skok na adresu. Takováto instrukce použitá na konci Forth slova způsobí že se předá řízení jjinému Forth slovu a již se nebude provádět návrat neb by to bylo zbytečné.
U tohoto konceptu jsem přemýšle, jestli nemá význam změnit pořadí polí Instrukce/Adresa, A a R. Zdá se mi, že pro hardwarovou realizaci je to naprosto jedno. Proto jsem raději zůstal u této kombinace.
Nyní k atomickým instrukcím. Vzhledem k počtu bitů jenž je kódují (30) se můžeme rozhodnou, kolik atomů a jak velikých v instrukci bude. Ostatní procesory podobného typu používají instrukce kódované minimálně 5 bity. Protože mi to tak pěkně vyšlo a 30 = 6 * 5, mohu se rozhodnout jestli v instrukci bude 6 atomů po pěti bitech, nebo 5 atomů po šesti bitech. Toto je ponecháno k dalším úvahám. Jediné co vyžaduji, aby kombinace kdy všechny bity jsou nulové měla význam instrukce NOP. V následující tabulce, do které si budu vepisovat jednotlivé atomické instrukce, počítám proto se 6-ti bity.
Tabulka 29.3.
b5 | b4 | b3 | b2 | b1 | b0 | mnemo | význam |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | NOP | žádná operace, nedělá se nic |
0 | 0 | 0 | 0 | 0 | 1 | ||
0 | 0 | 0 | 0 | 1 | 0 | ||
0 | 0 | 0 | 0 | 1 | 1 | ||
0 | 0 | 0 | 1 | 0 | 0 | ||
0 | 0 | 0 | 1 | 0 | 1 | ||
0 | 0 | 0 | 1 | 1 | 0 | ||
0 | 0 | 0 | 1 | 1 | 1 | ||
0 | 0 | 1 | 0 | 0 | 0 | ||
0 | 0 | 1 | 0 | 0 | 1 | ||
0 | 0 | 1 | 0 | 1 | 0 | ||
0 | 0 | 1 | 0 | 1 | 1 | ||
0 | 0 | 1 | 1 | 0 | 0 | ||
0 | 0 | 1 | 1 | 0 | 1 | ||
0 | 0 | 1 | 1 | 1 | 0 | ||
0 | 0 | 1 | 1 | 1 | 1 | ||
0 | 1 | 0 | 0 | 0 | 0 | ||
0 | 1 | 0 | 0 | 0 | 1 | ||
0 | 1 | 0 | 0 | 1 | 0 | ||
0 | 1 | 0 | 0 | 1 | 1 | ||
0 | 1 | 0 | 1 | 0 | 0 | ||
0 | 1 | 0 | 1 | 0 | 1 | ||
0 | 1 | 0 | 1 | 1 | 0 | ||
0 | 1 | 0 | 1 | 1 | 1 | ||
0 | 1 | 1 | 0 | 0 | 0 | ||
0 | 1 | 1 | 0 | 0 | 1 | ||
0 | 1 | 1 | 0 | 1 | 0 | ||
0 | 1 | 1 | 0 | 1 | 1 | ||
0 | 1 | 1 | 1 | 0 | 0 | ||
0 | 1 | 1 | 1 | 0 | 1 | ||
0 | 1 | 1 | 1 | 1 | 0 | ||
0 | 1 | 1 | 1 | 1 | 1 | ||
1 | 0 | 0 | 0 | 0 | 0 | ||
1 | 0 | 0 | 0 | 0 | 1 | ||
1 | 0 | 0 | 0 | 1 | 0 | ||
1 | 0 | 0 | 0 | 1 | 1 | ||
1 | 0 | 0 | 1 | 0 | 0 | ||
1 | 0 | 0 | 1 | 0 | 1 | ||
1 | 0 | 0 | 1 | 1 | 0 | ||
1 | 0 | 0 | 1 | 1 | 1 | ||
1 | 0 | 1 | 0 | 0 | 0 | ||
1 | 0 | 1 | 0 | 0 | 1 | ||
1 | 0 | 1 | 0 | 1 | 0 | ||
1 | 0 | 1 | 0 | 1 | 1 | ||
1 | 0 | 1 | 1 | 0 | 0 | ||
1 | 0 | 1 | 1 | 0 | 1 | ||
1 | 0 | 1 | 1 | 1 | 0 | ||
1 | 0 | 1 | 1 | 1 | 1 | ||
1 | 1 | 0 | 0 | 0 | 0 | ||
1 | 1 | 0 | 0 | 0 | 1 | ||
1 | 1 | 0 | 0 | 1 | 0 | ||
1 | 1 | 0 | 0 | 1 | 1 | ||
1 | 1 | 0 | 1 | 0 | 0 | ||
1 | 1 | 0 | 1 | 0 | 1 | ||
1 | 1 | 0 | 1 | 1 | 0 | ||
1 | 1 | 0 | 1 | 1 | 1 | ||
1 | 1 | 1 | 0 | 0 | 0 | ||
1 | 1 | 1 | 0 | 0 | 1 | ||
1 | 1 | 1 | 0 | 1 | 0 | ||
1 | 1 | 1 | 0 | 1 | 1 | ||
1 | 1 | 1 | 1 | 0 | 0 | ||
1 | 1 | 1 | 1 | 0 | 1 | ||
1 | 1 | 1 | 1 | 1 | 0 | ||
1 | 1 | 1 | 1 | 1 | 1 |
Tabulka 29.4. Základní instrukce pro umístnění do tabulky atomických instrukcí
instr. | zásobník | název | popis |
---|---|---|---|
! | n addr → | STORE | uloží hodnotu n do buňky na adrese addr, adresa musí respektovat zarovnání buňek v paměti |
@ | addr → n | FETCH | |
+ | n1 n2 → n | ADD | |
- | n1 n2 → n | SUB | odečte n2 od n1 |
>R | n → | uloží n do návratového zásobníku (Return Stack) | |
R> | → n | vyzvedne n z návratového zásobníku (Return Stack) | |
AND | n1 n2 → n | ||
OR | n1 n2 → n | ||
XOR | n1 n2 → n | ||
NOT | n → n | ||
DROP | n → | ||
DUP | n → n n | ||
OVER | n1 n2 → n1 n2 n1 | ||
SWAP | n1 n2 → n2 n1 | ||
[IF] | n → | ||
[CALL] | |||
[EXIT] | |||
[LIT] |