Tato část instrukce kóduje samotnou instrukci a formát instrukce. Máme k dispozici 8 kódů které a 1 instrukční formát.
11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+ | opcode | modifier | address/literal | +---+---+---+---+---+---+---+---+---+---+---+---+
V operačním kódu jsou kódovány instrukce, jenž potřebují přímý přístup do paměti, nebo přímou literální hodnotu. Vzhledem k omezenému počtu možností je třeba vybírat uvážlivě. Proto proberu jednotlivé možnosti.
Instrukce sčítání. Obvykle má procesor dvě základní instrukce sčítání a to ADD a ADC. První provádí sčítání A+val→C,A a druhá provádí C,A+val→C,A. Liší se tedy tím, jestli je do sčítání zahrnut i byt přenosu C (Cary). Domnívám se že v praxi se lze omezit jen na jednu formu instrukce a to ADC. Vhodného efektu dosáhneme tím, jestli před sčítání C bit nastavíme, smažeme nebo necháme být.
# Implementace ADD CLC AD value
Instrukce odečítání. Jako obvykle má procesor dvě základní instrukce pro odečítání a to SUB (A-value→C,A) a SBC/SBB (C,A-value→C,A). Vzhledem k nízkému počtu operačních kódů navrhuji tuto instrukci nazavádět. Lze ji totiž realizovat pomocí negace a sčítání.
# Implemantace SBC/SBB ST TMP # uschování -1 do TMP CLA # 0→A AD value NA # -A→A AD TMP
# Implementace SBC/SBB immediate (C,A - immediate → C,A)
AD -const
# Implementace SBC/SBB ST TMP LD value NA # -A→A AD TMP
Instrukce Load nahraje hodnotu do akumulátoru. (value→A). Tuto instrukci je možné realizovat softwarově, stejně tak jako u počítače PDP-8 který ji nemá v základním souboru instrukcí.
# LD pomocí AN CLA, NA # 7777→A (všechny bity 1) AN value
# LD pomocí AD CLA # 0→A (všechny bity 0) AD value
Instrukce BAL je jediná instrukce skoku. Je udělána tak, aby pokryla všechny potřeby skoků. Používá standardní adresní možnosti jako všechny základní instrukce. Funkce vykonává postupně následující operace.
1. Operand → MAR 2. P → L 3. MA → P
Uložení adresy instrukce následující za instrukcí skoku do registru L umožňuje realizovat podprogramy.
opcode | mnemo | popis |
---|---|---|
000 | AD | |
001 | AN | |
010 | OR | |
011 | LD | |
100 | ||
101 | ST | |
110 | BAL | |
111 | μcode |
Přemýšlím, které operační kód ještě do tabulky zahrnout. Jesli vložit OR,LD, jestli definovat instrukci pro „koprocessor“, atd.
Zbývajících 9 bitů instrukce od bitu 8 do bitu 0 určují operand. Horní tří bity 8-6 určují adresní mód a v závislosti na jejich hodnotě určují spodní bity přímou hodnotu, adresu nebo offset.
Mode | Name | Syntax | Effective Address | Operand Value |
---|---|---|---|---|
000 | Literal | #n | ??? | Sign Extended [b5…b0] |
001 | Zero Page Register | n | addr | mem[addr] |
010 | Zero Page Indirect | (n) | mem[addr] | mem[mem[addr]] |
011 | ZPI Post Increment | (n)+ | mem[addr]; Inc(mem[addr]) | mem[mem[addr]] |
100 | ZPI Pre Decrement | -(n) | Dec(mem[addr]); mem[addr] | mem[mem[addr]] |
101 | Register Indirect | A+offset | mem[A+offset] | |
110 | PC Relative | PC+offset | mem[PC+offset] | |
111 | PC Relative Indirect | mem[PC+offset] | mem[mem[PC+offset]] |
000 n ;ZP 001 (n) ;ZP 010 (n)+ ;ZP 011 -(n) ;ZP 100 #n 101 ((n)) ;ZP 110 ([n]) ;PC mem[n+PC] 111 [n] ;PC
Podrobný popis adresních módů.
Obsah adresního pole, bity b5…b0 je interpretován jako hodnota. Před použítím je znaménkový bit b5 replikován do všech bitů vyššího bajtu. Tedy dojde k rozšíření znaménka. Tímto způsobem je možné přímo zapsat hodnoty v rozsahu od -32 do 31.
M undefinedO ← Sign Extend b5…b0
M ← 000000b5…b0 O ← mem[M]
M ← 000000b5…b0 O ← mem[M] M ← O O ← mem[M]
M ← 000000b5…b0 O ← mem[M] M ← O O ← mem[M] ...
M ← 000000b5…b0 O ← mem[M] O ← O-1 mem[M] ← O M ← O O ← mem[M]
M ← O ← mem[M]
M ← O ← mem[M]
M ← O ← mem[M]