Registry AGC, instrukční sada, přerušení a čítače
Kapitoly článků
Centrální registry
AGC disponoval čtyřmi primárními 16bitovými registry:
- A - akumulátor; pro obecné výpočty
- Z - programový čítač; obsahoval adresy následujících vykonávaných instrukcí
- Q - k podržení DV instrukce a podržení návratové adresy po TX instrukci (viz dále)
- LP - podržené low-power výstupů po MP instrukcích (viz dále)
Dále zde byly čtyři lokace v hlavní paměti, na adresách 20 až 23, takzvané přípravné lokace, kde se nacházely věci pro budoucí výpočetní kroky (vždy posouvané o jeden bit).
Další registry
Zbývající registry byly interně využívány v procesu výpočetních operací:
- S - 12bitový registr paměťových adres
- Bank/Fbank - 4bitový ROM bank registr; vybíral 1kibislovo v ROM při adresování zafixovaném ve fixed-switchable módu
- Ebank - 3bitový RAM bank registr vybírající 256slovní RAM banku při adresování v erasable-switchable módu
- Sbank (super-bank) - 1bitové rozšíření Fbank (poslední 4kibislova z 36kibislovové ROM nebyly dosažitelné z Fbank
- SQ - 4bitový sekvenční registr nesoucí aktuální instrukci
- G - 16bitový registr paměťového bufferu uchovávající datová slova jdoucí do/z paměti
- X - držel jeden ze dvou vstupů do sumátoru (ten se používal pro veškerou jednorozměrnou aritmetiku a k inkrementování programového čítače (Z registru))
- Y - držel druhý vstup sumátoru
- U - ne přímo registr, šlo o výstup ze sumátoru (jednorozměrný výsledek z obsahu registrů X a Y)
- B - buffer registr pro všeobecné použití, také používaný pro pre-fetch příští instrukce. Na začátku další instrukční sekvence byl horní bit z B (obsahující příští operační kód) zkopírován do SQ a nižší bit (adresa) putoval do S.
- C - jiný výstup z B registru
- IN - čtyři 16bitové vstupní registry
- OUT - pět 16bitových výstupních registrů
Instrukční sada
Z dnešního pohledu byla „jednoúčelová“ instrukční sada AGC v podstatě primitivní, ale svůj účel plnila skvěle.
Formát instrukcí byl 3bitový pro operační kódy a 12bitový pro adresy. První verze AGC měla 11 instrukcí: TC, CCS, INDEX, XCH, CS, TS, AD, MASK, SU, MP a DV. Prvních osm byly základní isntrukce přímo dostupné 3bitovými operačními kódy, zbývající tři byly speciální dostupné pouze vykonáním speciálního typu INDEX instrukce zvaného EXTEND, a to hned před instrukcí.
- TC (transfer control) - návratová adresa automaticky putuje do Q registru, TC instrukce tak šla použít pro subrutinní volání.
- CCS (count, compare, and skip) - velmi komplexní instrukce, jejíhož dlouhého popisu vás ušetřím.
- INDEX - přidává data z poslední instrukcí specifikované adresy příští instrukci.
- RESUME - speciální instance INDEXu (INDEX 25) používaná jako návrat z přerušení.
- XCH (exchange)
- CS (clear and subtract) - plní registr A data odkazovanými ze specifické adresy paměti.
- TS (transfer to storage) - přesunutí registru A na specifikovanou adresu paměti. TS také detekovala a korigovala přetečení a tomu uzpůsobovala chování.
- AD (add)
- MASK - provádí booleanovské operace nad registrem A, kde poté ukládá výsledek
- MP (multiply)
- DV (divide)
- SU (subtract)
Instrukce byly implementovány ve skupinách po 12 krocích zvaných „časovací pulsy“. Každý set 12 pulsů byl označován jako instrukční subsekvence. Jednoduché instrukce jako TC se vykonávaly v jedné subsekvenci, komplexnější vyžadovaly více subsekvencí. Například MP používala 8 subsekvencí: prvotní zvanou MP0, následovalo šest subsekvencí MP1 a nakonec přerušení subsekvencí MP3. V pozdější verzi AGC bylo toto redukováno na tři subsekvence.
Každý časovací puls v subsekvenci (připomenu že jich bylo 12) mohl spustit pět kontrolních pulsů. Každý puls byl právě tím, co dělalo z dané instrukce skutečnou práci jako načítání obsahu registru na sběrnici, zápis dat ze sběrnice do registru atd. (pro představu: zde se již bavíme na nejelementárnější úrovni jednotlivých pulsů elektrického signálu na vodičích a v čipech).
Přerušení a nedobrovolné čítače
AGC měl pět vektorových přerušení:
- Dsrupt bylo voláno v pravidelných intervalech kvůli updatu zobrazení
- Erupt bylo generováno při rozličných hardwarových poruchách a alarmech
- Keyrupt signalizovalo zmáčknutí klávesy na klávesnici
- T3Rrupt bylo generováno v pravidelných intervalech z hardwarového časovače, který updatoval real-time hodiny
- Uprupt bylo generováno vždy, když se do AGC nahrávalo 16bitové slovo
Na každé přerušení reagoval AGC tak, že pozastavil aktuálně vykonávaný program, spustil krátkou servisní rutinu pro přerušení a potom obnovil běh přerušeného programu.
AGC také měl 20 „nedobrovolných“ čítačů. Ty pracovaly „na zakázku“ jiných částí systému jako up/down čítače, posuvné registry atd. Mohly inkrementovat, dekrementovat, nebo posouvat hodnoty v závislosti na interních vstupech. Inkrementace (Pinc), dekrementace (Minc), nebo posuv (Shinc) byl spravován jednou subsekvencí mikroinstrukcí vkládaných během dvou běžných instrukcí programu.
Přerušení mohla být spouštěna i během přetečení čítačů. T3rupt a Dsrupt přerušení byla produkována jejich vlastními čítači a řízena 100Hz hardwarovými hodinami, kdy k přetečení docházelo při vykonání příliš mnoha Pinc subsekvencí. Uprupt přerušení se volalo když spuštěná Shinc subsekvence posunula 16bitů vstupních dat do AGC.