Egy második generációs számítógép

Bemutatjuk egy jellegzetesnek tekinthető második generációs tudományos célú számítógép, az IBM 7094 felépítését (némileg egyszerűsítve). Elsősorban az előző fejezetben ismertetett IAS számítógéptől való lényegesebb eltérésekre térünk ki.

Az információ tárolási formája

A gép 36 bites szavakat használt, mindegyik szó egy fixpontos számot, egy lebegőpontos számot vagy egy utasítást tartalmazhatott.

A fixpontos számok alakja megegyezett az IAS-nál tárgyalttal, csak négy számjeggyel rövidebb számokat tudott tárolni ez a gép.

A lebegőpontos számok mantisszája 27 bites volt, a karakterisztikája 8 bites (a 36. bit az előjel).

Input-output utasításoknál egy szó tartalmát 6 db 6 bites karakterkódként is lehetett értelmezni.

Az utasítások első 21 bitje volt a végrehajtandó művelet kódja, a jobb oldali 15 bit pedig az operandusz címe (tehát ez a gép is egycímes volt). Ezzel 32 kilószó memóriát lehetett közvetlenül megcímezni.

A CPU felépítése

A CPU felépítése nagyban hasonlít az IAS számítógép CPU-jához, az azonos funkciójú regisztereket azonos módon jelöltük.

Az IBR (utasításpuffer) szerepe magyarázatra szorul, hiszen itt egy szóban csak egy utasítás van. A gép memóriája két, egymástól függetlenül működő modulra volt osztva. Egyik a páros, másik a páratlan címeket tartalmazta és egyidőben el lehetett őket érni. Egy memóriából való olvasás mindig két egymás utáni tárcím tartalmát olvasta be a processzorba (egyik nyilván az egyik memória-modulban volt, a másik a másikban), így az egyik utasítást félre kellett tenni addig, amíg a másikat végrehajtják. Erre szolgált az IBR. A címek fentihez hasonló szétosztását független memória-modulok között átlapolásnak (interleaving) nevezik.

Az operátori konzol (vezérlőpult) nem a processzor része a szó szoros értelmében, de közvetlen hozzáférést biztosít az egyes alkatrészekhez.

Az IBM 7094-es processzor fő újítása az indexregiszterek használata. A gépnek 7 db 15 bites indexregisztere volt. Az utasításkódokban egy 3 bites rész adta meg, hogy kell-e használni indexregisztert, és ha igen, akkor melyiket. Ha szükség volt indexelésre, akkor a tényleges tárcímet úgy kapták meg, hogy az AR címregiszter tartalmából a címkiszámító áramkörök kivonták a megadott indexregiszter tartalmát. Az indexregiszterek használatával már úgy lehetett ciklust szervezni, hogy a program eredeti utasításai nem változtak meg, csak az indexregiszter tartalmát változtatta a program.

A gép egy másik hasznos lehetősége az indirekt címzés. Ha ez volt előírva az utasításban, akkor a gép a fent leírt módon ért el egy memóriacímet, de az utasítást nem annak a tartalmával hajtotta végre, hanem az ott lévő adatot egy újabb címként értelmezte, és ezen az újabb címen lévő adattal hajtotta végre az utasítást.

A gép utasításkészlete

A 7094-es utasításkészlete több mint 200 utasításból állt. A következőképpen csoportosíthatók ezek az utasítások:

Fontos adottság a szubrutinhívás lehetősége. A 7094-esben erre egy TSX kódú utasítás (Transfer and Set indeX) szolgált. A gép assembly nyelvén leírva:

HIVAS TSX SUB,4

Ez az utasítás a saját, HIVAS-sal címkézett címét beteszi a 4-es indexregiszterbe és átadja a vezérlést a SUB címkéjű címre, ott kell kezdődnie a szubrutinnak. A szubrutin végén a hívó programba való visszatéréshez ekkor például a

TRA 1,4

utasítást kellett kiadni (az utasításkód a transfer szó rövidítéséből származik). Ez a 4-es indexregiszter tartalmához hozzáad 1-et és az így kapott címre, tehát a fenti HIVAS címke utáni szóra adja a vezérlést. Természetesen a szubrutinnak gondoskodni kell róla, hogy visszatéréskor a 4-es indexregiszter még mindig a megfelelő adatot tartalmazza.

Ez a megoldás lehetővé tette a szubrutinnak való paraméterátadást is: ha pl. két paramétert kell átadni, akkor az aktuális értékeket le lehet tenni a HIVAS címke utáni két szóba, ezeket a helyeket a szubrutin a 4-es indexregiszter segítségével megtalálja. A szubrutin végén természetesen ekkor a

TRA 3,4

utasítást kell kiadni, hogy az adatok utáni címre adódjon a vezérlés.

Az input-output végrehajtása

A perifériákkal való adatforgalom lebonyolítására a gépnek külön input-output processzorai (IOP) voltak. Ezek speciális input-output (IO) utasításokból álló IO programot hajtottak végre. Ezek a programok is az operatív tárban voltak elhelyezve.

Amikor a CPU egy program végrehajtása során adatátviteli utasításhoz érkezett, akkor a megfelelő IOP-nak elküldte a használandó periféria azonosítóját és a végrehajtandó műveletet leíró IO program kezdőcímét. Az IO program egyes utasításai megadták az átviendő szavak számát és a tárolásukra szolgáló memóriaterület kezdőcímét. Az adatátvitel az IOP és a memória között 36 bites szavanként, az IOP és a periféria között 6 bites karakterenként történt. Az ehhez szükséges átalakításra az IOP-nak külön “daraboló” áramköre volt. Az IO program tartalmazhatott az ilyen adatátviteli utasításokon kívül eszközvezérlő utasításokat (pl. a mágnesszalag visszatekercselése, sordobás a nyomtatón, stb.) és az IOP-nak szóló vezérlő utasításokat is.

Az egyes IO utasítások befejezésének tényéről és sikeres vagy sikertelen voltáról egy állapotregiszter tartalmazott információt. A processzor időnként lekérdezhette e regiszter tartalmát, de a művelet befejezésekor az IOP egy speciális jelet, interruptot is küldhetett a processzornak. (Az interrupt használata nem volt általánosan jellemző a második generáció gépeire.)

Ahhoz, hogy a CPU és az IOP egymástól függetlenül hozzáférhessen az operatív tárhoz, szükség volt egy memóriavezérlő egységre. Ez szabályozta, hogy az egyes processzorok igényei közül melyiket szolgálja ki a memória. Mivel a perifériák sokkal lassúbb működésűek, mint a CPU, a memória-elérési igények nagy része a CPU-tól érkezik. Amikor néha befut egy igény az IOP-tól, akkor a CPU igényét függeszti fel egy memóriaciklus idejére a memóriavezérlő, és ezalatt kiszolgálja az IOP-ot. Az IO ilyen szervezésű végrehajtását cikluslopásnak (cycle stealing) nevezik.