Základní představou bylo navhrnout jednoduchý, procesor inspirovaný proceosry/počítači CDC 160 a 63.1.2 – „PDP-8“. Výchozími požadavky je, aby byl použitelný alespoň v takovém rozsahu jeko zmiňované dva počítače. Dalším požadavkem bylo vyhnout se některým aspektům navrhu PDP-8 a CDC-160 které mi velmi vadily. Začnu tedy postupný sled úvah jenž mají vyvrcholit konstrukcí simulátoru.
Jak jsem již začal, inspirovali mne 12-ti bitové počítače. Oba dva mají v základní charakterístice 12-ti bitové datové slovo a schopnost adresace 4KiW operační paměti 12-ti bitovou adresou. V prvním plánu neuvažuji o nějakém rozšíření operační paměti o mechanismus paměťových bank.
Stejně jako předlohy z nichž vycházím, i SOC168 bude mít minimum registrů. Tyto jsou:
Registr | Obsah | Popis |
---|---|---|
P | Program Counter | Ukazatel instrukcí programu. Ukazuje vždy na instrukci která je následující po právě zpracovávané instrukci. |
A | Accumulator | Střadač. Cíl všech artimeticko-logických instrukcí. |
L | Link Address | Speciální registr kam je ukládána návratová adresa při volání podrogramu. |
PSW | Program Status Word | Registr příznaků a dalších nastavení. |
Nedostatek registrů chci kompenzovat machanismem přístupu k takzvané Zero Page. Oblasti na začátku paměti. Tato paměť je dostupná tak snadno že ji leze považovat za registry.
A postupně se dostávám k instrukcím. Velmi se mi líbí jednoduchost instrukcí počítače PDP-8 jehož instrukční slovo má velmi jednoduchou strukturu.
+--------+------+--------------+ | op | mode | addr | +--------+------+--------------+
Počet bitů pole op
je v případě PDP-8 3 v případě CDC-160 4. To u PDP-8 dává prostor pro 8 instrukcí. PDP-8 jich má jen 7. Kód osmé instrukce má dolišný význam. Z těchto 7 instrukcí jsou 2 aritmeticko/logické (ADD a AND), 1 (STORE) ukládá obsach akumulátoru do paměti, 3 instrukce skoku (JSZ, JMS a JMP) a poslední je I/O instrukce IOT.
Minimalizace instrukčního souboru je velmi chytrá. Čím míň instrukcí, tím jednodušší realizace obvodů ALU a dekodéru instrukcí. Velmi hezké je vypuštění instrukce LOAD jenž se dá nahradi dvojicí instrukcí.
CLA / 0→AC TAD M / A + mem(M)→ A
Mohli bychom také požít jinou dvojci instrukcí, založenou nikoliv na sčítání ale na operaci AND.
STA / 7777→AC AND M / A and mem(M)→AC
Před dalšími úvahami se pokusím napsat seznam naprosto nezbytných instrukcí. PDP-8 má celkem 8 instrukčních kódů. Jsou to: AND, TAD, ISZ, DCA, JMS, JMP, IOT a OPR. Osobně se domnívám, že lze instrukce JMS A JMP sjednotit do jedné instrukce skoku a to BAL s následující sémantikou:
PC→LINK; addr→PC
Kód na který se skáče má pak možnost obsah registru LINK ignorovat, Nebo v případě že se jedná o proceduru jej uschovat.
BAL FCE … FCE: LINK→AC ST STACK-- # Kód podprogramu LD ++STACK AC→LINK RET # LINK→PC
Dalším možným zdrojem úspory v operačních kódech je změnit fungování I/O z instrukce IOT na práci s pamětí. Prostě zrušit kompletně IOT a nahradit ji periferiemi mapovanými do adresního prostoru.
Po všech změnách se pak můžeme dostat k následujícímu seznamu instrukcí.
opcode | mnemonic | popis |
---|---|---|
000 | ADD | operand + AC → AC |
001 | AND | operand ∧ AC → AC |
010 | ST | AC → memory(operand) |
011 | BAL | PC→LINK; operand→PC |
100 | OR | |
101 | XOR | |
110 | MOP | Bitfield µcode operation |
111 | CO | Coprocessor operation. |
µOP | ||
---|---|---|
opcode | mnemonic | popis |
0xx xxx xxx | MO1 | Rotate operations |
10c ccc fff | MO2 | Conditional operations |
11x xxx xxx | MO3 | Extended operations |
MO0 | ||
---|---|---|
opcode | mnemonic | popis |
000 000 000 | NOP | No Operation |
010 000 000 | CLA | 0→A |
001 000 000 | CLC | 0→C |
000 100 000 | NOTA | ¬A→A |
000 010 000 | NOTC | ¬C→C |
000 001 000 | IA | A+1→A |
000 000 100 | ROR | Rotate CA Right |
000 000 010 | ROL | Rotate CA Left |
000 000 001 | T | Rotate Twice if ROR or ROL |
000 000 001 | BSW | Byte Swap A if not ROR or ROL |
MO1 | ||
---|---|---|
opcode | mnemonic | popis |
10c ccc fff | MO2 | |
Conditions | ||
100 000 fff | Never | |
100 001 fff | ||
100 010 fff | ||
100 011 fff | ||
100 100 fff | ||
100 101 fff | ||
100 110 fff | ||
100 111 fff | ||
101 000 fff | ||
101 001 fff | ||
101 010 fff | ||
101 011 fff | ||
101 100 fff | ||
101 101 fff | ||
101 110 fff | ||
101 111 fff | Always | |
Functions | ||
10c ccc 000 | ||
10c ccc 001 | S | Skip on condition |
10c ccc 010 | ||
10c ccc 011 | ||
10c ccc 100 | TLA | L←A |
10c ccc 101 | TAL | A←L |
10c ccc 110 | RET | L→P |
10c ccc 111 | HLT | Halt |
MO1 | ||
---|---|---|
opcode | mnemonic | popis |
110 000 000 | MO2 | |
110 000 001 | ||
110 000 010 | ||
110 000 011 | ||
110 000 100 | ||
100 000 101 | ||
100 000 110 | ||
100 000 111 | ||
100 111 111 | HLT | Halt processor. |
Pokusím se nejprve navrhnout instrukční slovo. Zkusil jsem vyjít z PDP-8 s tím že:
Výsledek těchto změn je vidět na následujícím obrázku.
11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | | | | | |---+---+---+---+---+---+---+---+---+---+---+---| | OP | M |D/I|Z/R| Address/Literal | |-----------+---+---+---+-----------------------| | OP |D/I|Z/R| Address/Literal | |---------------+---+---+-----------------------| | OP | Microcode | |---------------+-------------------------------+ OP - 4-bit opcode D/I - Direct/Indirect Z/R - Zero(Direct) Page / PC Relative M - modifier Address/Literal - 6 bit address / 6 bit sign extended literal Microcode - Bit filed microcode similar to PDP-9 OPR
EDITMARK:
Instrukční slovo sestává z několika částí. Spodních 6 bitů slouží jako hodnota, adresa či offset. Záleží na jendotlivých instrukcích ale hodnota zde by měla být v rozsahu od -32 do 31 vyjádřená dvojkovým doplňkem. Horních 6 bitů tvoří operační kód. Tento je v případě některých instrukcí dále strukturován.
Tabulka 29.16. Tabulka Instrukcí SOC-168
Opcode | Mnemonic | Popis |
---|---|---|
000 0mm xxx xxx | unused | |
000 1mm xxx xxx | unused | |
001 0mm aaa aaa | LD | Load AC |
001 1mm aaa aaa | ST | Store AC |
010 0mm aaa aaa | AND | Value ∧ AC → AC |
010 1mm aaa aaa | OR | Value ∨ AC → AC |
011 0mm aaa aaa | XOR | Value xor AC → AC |
0111 mm aaaaaa | Value oper AC → AC | |
1000 mm aaaaaa | ADD | Value oper AC → AC |
1001 mm aaaaaa | SUB | Value oper AC → AC |
1010 mm aaaaaa | Value oper AC → AC | |
1011 mm aaaaaa | Value oper AC → AC | |
1100 mm aaaaaa | Value oper AC → AC | |
1101 mm aaaaaa | Value oper AC → AC | |
1110 mm aaaaaa | Value oper AC → AC | |
1111 mm aaaaaa | Value oper AC → AC | |
110 cc m | Jump and Link | |
111 | nevyužito, rezerva |
Zvažoval jsem různé adresní módy pro instrukce. Z úvah vyšlo že chci určite mód přímý (immediate) při kterém je 6 bitů adresního pole chápáno jako přímá hodnota v rozsahu od -32 do 31. Bit 5 slouží jako znaménko a pro účely instrukcí se replikuje do bitů 6 až 11 na 12-ti bitovou hodnotu.
Dále potřebuji adresovat hodnoty přímo v paměti. 6 bitů ovšem umožňuje adresovat jen 64 slov. Velmi se mi líbí relativní adresní mód kdy je těchto 6 bitů po rozšíření na 12 přičteno k čítači instrukcí a takto vzniklá adresa je použita k získání hodnoty z adresovaného slova.
Třetí možnost, Zero Page, "rozšiřuje" počet registrů o snadno dosažitelných 64 slov na začátku paměti na adresách 0000-0077.
Poslední, čtvrtá možnost, kombinace adresních bitů 11 není zatím implementována a je určena pro budoucí rozšíření.
Tabulka 29.17. Význam bitů pole adresního módu instrukce SOC-168
bity Z,I | název | význam |
---|---|---|
00 | Direct Page | mem(DP+Address) → AC |
01 | Direct Page Indirect | mem(mem(DP+Address)) → AC |
10 | Immediate | sign extended(Literal) → AC |
11 Addr≠0 | PC Relative Indirect | mem(PC+Address) → AC |
11 Addr=0 | Immediate 12bit Literal in following Word | mem(PC)→AC; PC+1→PC |
Adresní mód PC Relative má jednu zvláštnost. Pokud je hodnota adresního pole 0, tedy když se odkazuje na slovo následující za právě vykonávanou instrukcí, dojde po načtení hodnoty z tohoto slova k automatické inkrementaci čítače instrukcí PC.
xxx r 01 000000 Instruction PC-Relative 0 vvvvvv vvvvvv Přímá 12-ti bitová hodnota
V krátké tabulce instrukcí je jen jedna instrukce skoku. Tato se používá nejen jako instrukce skoku ale také jako instrukce volání podporgramu. Funguje tak že obsah čítače instrukcí PC se uloží do speciálního registru LINK a poté je do PC nahrána cílová adresa. Podprogramy pak mají možnost hodnotu registru LINK uschovat, například na zásobník.