Při výběru adresních módů jsem vycházel z návrhu adresních módů PDP-8. Procesor, který má jen jeden pracovní registr, v našem případě střadač A, potřebuje nedostatek registrů nějak kompenzovat. PDP-8 tak činí adresním modem s přístupem k nulté stránce paměti a s přístupem k aktuální stránce paměti. Tím se počet míst která jsou procesoru snadno dostupná a dají se považovat v určitém smyslu za registry podstatně zvýší. V případě PDP-8 je to 128 slov v nulté stránce a 128 slov v aktuální stránce.
Adresní mód nulté stránky mi plně vyhovuje, je to něco co se objevuje například i vprocesorech 6502 a 6800. Adresní mód přístupu k aktuální stránce je mi značně proti srsti. Hlavní námitku kterou proti němu mám lze ukázat na jednoduché věci. V následujícím kódu, který vznikl například po přidání instrukce nebo jiné změně která posunula instrukce TAD a AND, se instrukce AND již odkazuje na úplně jinou adresu než původně. Je to proto že se posunula do další stránky.
1016: VAR1: DW 6
1018: VAR3: DW 0
…
1176: CLA CLC
1177: TAD 16
; Změna aktuální stránky
1200: AND 18
…
Kód pro PDP-8 tedy není imunní vůči posouvání v paměti. Znamená to že se význam instrukce mění, podle toho kde se v paměti nachází. Vím že v případě PDP-8 se jedná o obrovské zjednodušení konstrukce. Dnes použiji místo tohoto adresního módu mód jiný, relativní k hodnotě čítače instrukcí. Toto řešení je hezčí pro programátora ale klade větší nároky na konstrukci procesoru a tak se vůbec nedivím že jej v době konstruování PDP-8 nepoužili. Asi by výrazně prodražil konstrukci.
Pokud budu ochoten obětovat určité zvýšení komplexity obvodu generování adresy a přístupu k operandu, dostanu se k následujícím adresním módům.
Obrázek 29.3. Pole bitů adresního módu počítače SOC-8
8 7 6 +---+---+---+ | R | I | Z | +---+---+---+
Bity v tomto poli mají následující význam.
Tabulka 29.8. Adresní módy instrukcí SOC-8
bit | symbol | hodnoty | popis |
---|---|---|---|
8 | R | 0-A, 1-B | vybírá jeden ze dvou střadačů A,B u instrukcí které pracují se střadači |
7 | I | 1-Indirect | Pokud je tento bit nastaven, je použito nepřímé adresování. Na efektivní adresu operandu EA je použita operace: EA=mem[EA]. |
6 | Z | 0-Rel,1-ZP | Má-li bit Z hodnotu 1 jsou bity b6-b0 adresou slova v nulté stráncee paměti. Má-li hodnotu nula jsou tyto bity znaménkově rozšířeny a přičteny k PC. |
Následující tabulka uvádí všechny uvažované adresní módy. Pouze některé budou použity a jsou jim přiděleny kombinace bitů.
Tabulka 29.9. Adresní módy instrukcí SOC-8
mód | zápis | název | popis |
---|---|---|---|
000 | n | Zero Page | EA=0…0b5…b0; OP=mem[EA] |
001 | (n) | Zero Page indirect | EA=0…0b5…b0; EA=mem[EA]; OP=mem[EA] |
(n)+ | ZP Post Increment | EA=0…0b5…b0; EA=mem[EA]; OP=mem[EA]; EA=EA+1; mem[0…0b5…b0]=EA | |
-(n) | ZP Pre Decrement | EA=0…0b5…b0; EA=mem[EA]; EA=EA-1; mem[0…0b5…b0]=EA; OP=mem[EA] | |
#0 | přímá konstanta | OP = SignExtended(b5…b0) | |
010 | P,n | P relative | EA=SignExtended(b5…b0); EA=EA+PC; if EA=0 then PC=PC+1; OP=mem[EA] |
010 0…0 | #nn | Long literal | Jiný zápis pro zvláštní případ P relative s posunutím 0. |
011 | P,(n) | P Relative Indirect | EA=SignExtended(b5…b0); EA=EA+PC; if EA=0 then PC=PC+1; EA=mem[EA]; OP=mem[EA] |
011 0…0 | P,(nn) | P Relative Indirect | EA=SignExtended(b5…b0); EA=EA+PC; if EA=0 then PC=PC+1; EA=mem[EA]; OP=mem[EA] |
Použití jen dvou bitů pro specifikování adresního módu, jak to má PDP-8 (I a Z), by příliš omezilo množství adresních módů.
název | zápis | význam |
---|---|---|
Zero Page | n | EA=(0,…0,b5…b0); OP=mem[EA] |
Zero Page Indirect | (n) | EA=(0,…0,b5…b0); EA=mem[EA]; OP=mem[EA] |
P Relative | P,n | EA=SignExtended(b5…b0); EA=EA+P; if EA=0 then PC=PC+1; OP=mem[EA] |
Mód P Relative má jednu zvláštnost, která je patrná na následující ukázce.
1234: 1x00 AD P,0 1235: 2345 DW 2345
Co instrukce AD na adrese 1234 provádí? V průběhu načítání instrukce z adresy 1234 byla zvětšena hodnota v registru P o jedničku, aby P ukazoval na následující instrukci. P tedy obsahuje hodnotu 1235. Co se děje dále? Při výpočtu efektivní adresy EA z výrazu P,0
s spočte EA=P+0=1235. Poté se z paměti přečte operand OP=mem[1235] což je 2345. Tímto způsobem můžeme snadno realizovat mód s velkými přímými literály. Samozřejmě že je to ideální mód pro skoky přes celou paměť a pro volání podprogramů. Například volání podprogramu na adrese 620 realizujeme instrukcí:
1252: 6x00 BL P,0 1253: 0620 DW 0620
Zvláštnost na kterou je třeba upozornit je to, že po ukončení instrukce ukazuje P na slovo 1235, v případě skoku na 1253. Na těchto adresách je očekávána další instrukce. Proto je v tomto zvláštním případě, kdy je čtena hodnota relativně k P s posunutím 0, provedena korekce P zvětšením o jedničku.
Tabulku adresních módů tedy mužeme rozšířit o další řádek, což není nic jiného než jiný zápis pro speciální variantu jiného adresního módu.
název | zápis | význam |
---|---|---|
Long Literal | #nn | EA=SignExtended(b5…b0); EA=EA+P; if EA=0 then PC=PC+1; OP=mem[EA] |
Dalším adresním módem, který považuji za velmi užitečný, je malý přímý literál. Tedy hodnota přímo zapsaná do instrukce. Dolních 6 bitů se v tomto módu interpretují jako malé číslo kterému se rozšíří znaménko do zbývajících bitů. Můžeme tedy do instrukce přímo zapsat malá čísla v rozsahu od -32DEC do +31DEC. Ačkoli bychom mohli použít právě zavedený mód Long Literal, vložení čísla přímo do instrukce zkrátí programový kód a rovněž jej zrychlí.
název | zápis | význam |
---|---|---|
Short Literal | #n | OP=SignExtended(b5…b0); EA není definováno |
Uvedené adresní módy, které pokrývají 4 základní kombinace se dají vyjádřit použitím pouhých dvou bitů. Mám tedy na vybranou, zdali se u těchto 4 (5) adresních módů zastavím, nebo zdali využiji třetí bit k jejich rozšíření.
Jedním z rozšíření adresních módů, které zavedli u PDP-8 je nepřímé adresování se zvětšním ukazatele před použitím. Tato varianta je zavedena pomocí zvláštních adres v adresním prostoru. Jedná se o adresy 0010 až 0017. Kdykoliv je čten obsah paměti prostřednictvím těchto adres, jsou tyto zvětšeny o 1. Je velmi lákavé zavést další dva adresní módy, a to Indirect Pre Decrement a Indirect Post Increment. Tyto módy by dovolovali velmi snadno realizovat zásobníky a práci s ukazateli. Na druhou stranu je možno použít přístup PDP-8 a realizovat oba módy vázáním na speciální adresy v paměti. Například mne napadá následující.
adresa | význam |
---|---|
0010…0017 | Speciální adresy. Při použití těchto adres se chovají módy Zero Page a Zero Page Indirect normálně. |
0020…0027 | Při odkazu na tyto adresy se ve skutečnosti přistupuje na adresy 0010…0017 s tím, že po ukončení čtení se obsah zvětší o 1. |
0030…0037 | Při odkazu na tyto adresy se ve skutečnosti přistupuje na adresy 0010…0017 s tím, že před čtením se obsah zmenší o 1. |
Uvedený přístup, jako jeden z možných, dovolí realizovat dodatečné adresní módy bez změny v procesoru navázáním speciálních vlastností na adresy v paměti. Výhodou je že není třeba měnit instrukční sadu a tím pádem procesor. Nevýhodou je že se sníží počet dostupných slov paměti v rozsahu nulté stránky. V tomto konkrétním případě dojde ke snížení počtu slov o 16DEC z celkových 64DEC což je nezanedbatelné číslo. Samozřejmě že je možné provést další optimalizaci, například místo adres 0010…0017 s navázáním speciálních funkcí na následující 0020…0037, Určit jako speciální jen adresy 0020…0027 s tím že při čtění dochází k Post Inkrementaci a s namapováním adresy 0030…0037 na 0020…0027 s tím že při čtení dochází k Pre Dekremantaci.
Oba dva módy, tedy Indirect Post Increment a Indirect Pre Decrement považuji za natolik důležité že je musím zavést. Otázkou zůstává jak. Volný bit v trojci bitů adresního módu totiž můžu využít tak, že jej přiřadím k datovému poli dolních 6-ti bitů, teré tak prodloužím na 7. V tom okamžiku si zvětším velikost nulté stránky na dvojnásobek tedy na 128DEC slov. To je velmi lákavé. Nebo můžu udělat úplně jinou věc. Rozšířit počet střadačů v procesoru z jednoho na dva. Toto by opět zvedlo možnosti v programování.
Pokud se omezím jen na zásobníky, lze ze specifickými registry zacházet tak, že je určen jeden rozsah, například od 0010 do 0017. Veškeré přístupy k těmto buňkám paměti se chovají normálně, speciální chování je navázáno jen na nepřímý adresní mód (n) Zero Page Indirect. Pokud zapisujeme do adresy buňkou určené, dojde před zápisem k dekrementaci hodnoty v buňce. Pokud naopak čteme, dojde po čtení k inkrementaci adresy v buňce. Tímto způsobem se nesnížíme počet použitelných buňek v nulté stránce paměti.
Domnívám se však, že pokud se mám podržet původní myšlenky jendoduchosti designu, kterou jsem dost narušil již zavedením módů P Relative, že nemá smysl zavádět další registr.
Pro tuto chvíli zanechám úvah na téma třetího bitu v adresním módu a tento bit ponechám „nevyužitý“ a volný pro případná další rozšíření počítače.
Tabulka 29.10. Adresní módy
000 | |||
001 | |||
010 | |||
011 | |||
100 | |||
101 | |||
110 | |||
111 | PC Relative Indirect | EA=SignExtended(b5…b0); EA=EA+PC; if EA=0 then PC=PC+1; EA=mem[EA]; OP=mem[EA] |