29.6.2. Úvahy, jimiž se konstrukce SOC168 řídila

29.6.2.1. Strukturovaný soubor instrukcí
29.6.2.2. Tak trochu odlišný přístup
29.6.2.3. RISC like Load/Store architektura
29.6.2.4. Jednoduchost návrhu

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:

RegistrObsahPopis
PProgram CounterUkazatel instrukcí programu. Ukazuje vždy na instrukci která je následující po právě zpracovávané instrukci.
AAccumulatorStřadač. Cíl všech artimeticko-logických instrukcí.
LLink AddressSpeciální registr kam je ukládána návratová adresa při volání podrogramu.
PSWProgram Status WordRegistr 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í.

opcodemnemonicpopis
000ADDoperand + AC → AC
001ANDoperand ∧ AC → AC
010STAC → memory(operand)
011BALPC→LINK; operand→PC
100OR 
101XOR 
110MOPBitfield µcode operation
111COCoprocessor operation.
µOP
opcodemnemonicpopis
0xx xxx xxxMO1Rotate operations
10c ccc fffMO2Conditional operations
11x xxx xxxMO3Extended operations
MO0
opcodemnemonicpopis
000 000 000NOPNo Operation
010 000 000CLA0→A
001 000 000CLC0→C
000 100 000NOTA¬A→A
000 010 000NOTC¬C→C
000 001 000IAA+1→A
000 000 100RORRotate CA Right
000 000 010ROLRotate CA Left
000 000 001TRotate Twice if ROR or ROL
000 000 001BSWByte Swap A if not ROR or ROL
MO1
opcodemnemonicpopis
10c ccc fffMO2 
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 001SSkip on condition
10c ccc 010  
10c ccc 011  
10c ccc 100TLAL←A
10c ccc 101TALA←L
10c ccc 110RETL→P
10c ccc 111HLTHalt
MO1
opcodemnemonicpopis
110 000 000MO2 
110 000 001  
110 000 010  
110 000 011  
110 000 100  
100 000 101  
100 000 110  
100 000 111  
100 111 111HLTHalt 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

OpcodeMnemonicPopis
000 0mm xxx xxx unused
000 1mm xxx xxx unused
001 0mm aaa aaaLDLoad AC
001 1mm aaa aaaSTStore AC
010 0mm aaa aaaANDValue ∧ AC → AC
010 1mm aaa aaaORValue ∨ AC → AC
011 0mm aaa aaaXORValue xor AC → AC
0111 mm aaaaaa Value oper AC → AC
1000 mm aaaaaaADDValue oper AC → AC
1001 mm aaaaaaSUBValue 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,Inázevvýznam
00Direct Pagemem(DP+Address) → AC
01Direct Page Indirectmem(mem(DP+Address)) → AC
10Immediatesign extended(Literal) → AC
11 Addr≠0PC Relative Indirectmem(PC+Address) → AC
11 Addr=0Immediate 12bit Literal in following Wordmem(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.

Licence Creative Commons
Elektronika a počítače, jejímž autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .