29.3.2.2. Adresní módy

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

bitsymbolhodnotypopis
8R0-A, 1-Bvybírá jeden ze dvou střadačů A,B u instrukcí které pracují se střadači
7I1-IndirectPokud je tento bit nastaven, je použito nepřímé adresování. Na efektivní adresu operandu EA je použita operace: EA=mem[EA].
6Z0-Rel,1-ZPMá-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ódzápisnázevpopis
000nZero PageEA=0…0b5…b0; OP=mem[EA]
001(n)Zero Page indirectEA=0…0b5…b0; EA=mem[EA]; OP=mem[EA]
 (n)+ZP Post IncrementEA=0…0b5…b0; EA=mem[EA]; OP=mem[EA]; EA=EA+1; mem[0…0b5…b0]=EA
 -(n)ZP Pre DecrementEA=0…0b5…b0; EA=mem[EA]; EA=EA-1; mem[0…0b5…b0]=EA; OP=mem[EA]
 #0přímá konstantaOP = SignExtended(b5…b0)
010P,nP relativeEA=SignExtended(b5…b0); EA=EA+PC; if EA=0 then PC=PC+1; OP=mem[EA]
010 0…0#nnLong literalJiný zápis pro zvláštní případ P relative s posunutím 0.
011P,(n)P Relative IndirectEA=SignExtended(b5…b0); EA=EA+PC; if EA=0 then PC=PC+1; EA=mem[EA]; OP=mem[EA]
011 0…0P,(nn)P Relative IndirectEA=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ázevzápisvýznam
Zero PagenEA=(0,…0,b5…b0); OP=mem[EA]
Zero Page Indirect(n)EA=(0,…0,b5…b0); EA=mem[EA]; OP=mem[EA]
P RelativeP,nEA=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ázevzápisvýznam
Long Literal#nnEA=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ázevzápisvýznam
Short Literal#nOP=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í.

adresavýznam
0010…0017Speciální adresy. Při použití těchto adres se chovají módy Zero Page a Zero Page Indirect normálně.
0020…0027Př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…0037Př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 IndirectEA=SignExtended(b5…b0); EA=EA+PC; if EA=0 then PC=PC+1; EA=mem[EA]; OP=mem[EA]
Zero Page
Zero Page Indirect
Zero Page Indirect Pre Decrement
Zero Page Indirect Post Increment
P Relative
P Relative Indirect
Small Literal
Long Literal
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 .