A PDP–8 egy 12 bites számítógéptípus, a PDP számítógép-család tagja volt az 1960-as években. A Digital Equipment Corporation (DEC) cég a típust 1965. március 22-én vezette be. Ez a gép volt az első széles körben elterjedt miniszámítógép: több mint 50 000 példányt adtak el belőle, így a legnagyobb példányszámban eladott számítógép volt a maga korában.[1][2] Sikerének titka – saját korához viszonyított – kis mérete (elfért egy asztalon) és alacsony ára volt (piacra kerülésekor 20 000 dollárba, öt évvel később 5000 dollárba került).
A gépet kifejezetten kisméretű, olcsó és nagy sebességű tudományos számítógépnek tervezték, amely a lehető legkevesebb hardverrel felépíthető. A tervezési célok között elsődleges volt, hogy a géphez a hagyományos be-/kimeneti perifériák csatlakoztathatók legyenek és képes legyen együttműködni a mérési és szabályozási alkalmazásokban használt különféle analóg mérőeszközökkel. A gép emellett önállóan egy általános célú kisszámítógépként működött.[3]
A gép vezető tervezője Edson de Castro, a Data General cég későbbi megalapítója volt.[4]
Az első, informálisan „Straight–8” néven emlegetett PDP–8 modell ún. flip chip kártyákra szerelt, dióda-tranzisztor logikájú áramköri panelekből épült fel, maga a gép egy kisebb hűtőgép méretű volt.
Ezt követte a PDP–8/S modell, amely asztali és fiókos (rack-mount) változatokban jelent meg. A PDP–8/S kisebb és olcsóbb, ugyanakkor mérhetetlenül lassúbb is volt az elődjénél, a benne alkalmazott egybites soros ALU megvalósításnak köszönhetően. Ehhez a géphez egyetlen háttértároló eszköz volt elérhető, a DF32 jelű lemezegység.
A későbbi rendszerekben (PDP–8/I és /L, PDP–8/E, /F, és /M, valamint a PDP–8/A) már visszatért a gyorsabb párhuzamos megvalósítás, ami azonban az olcsóbb TTL MSI logikán alapult. A legtöbb mai napig fennmaradt PDP–8-as ebből az időszakból származik. A legáltalánosabb modell a PDP–8/E, mivel ehhez I/O eszközök sokasága volt elérhető és gyakran általános célú számítógépnek használták.
A személyi számítógépek 1975-ös megjelenésétől kezdve az olcsó mikroprocesszorokra épülő rendszerek, mint pl. a MITS Altair, majd később a TRS–80, Apple II és mások, kezdték uralni az általános célú kisszámítógépek piacát.
Az utolsó forgalomba került PDP–8 az 1979-es "CMOS–8s" nevű modell volt, ez már egy egyedi CMOS mikroprocesszort tartalmazott. A gép üzletileg megbukott, a versenyképtelen árazás miatt. A CMOS–8s sírját az 1981-ben megjelent IBM PC ásta meg, amely gyorsan beterítette az általános célú kisszámítógép-piacot.
A mikroprocesszort és kiegészítő csipjeit az Intersil egészen 1982-ig forgalmazta, az Intersil 6100 család tagjaiként. A kis energiaigényű CMOS csipeket katonai beágyazott rendszerekben használták.
A PDP–8 sok ötletet vett át néhány korábban megvalósított 12 bites számítógépből, leginkább a Wesley A. Clark és Charles Molnar által 1962-ben tervezett LINC laboratóriumi gépből, amelynek terveire viszont nagy hatással volt Seymour Cray még korábbi 1960-as CDC 160 miniszámítógépe.[5][6] A gép közvetlen elődje a DEC PDP–5 számítógépe volt.[7][8] A PDP–8 lényegében a PDP–5 továbbfejlesztése volt, amelyben a PDP–5 egyes hiányosságait javították és amellyel sikerült megvalósítaniuk a gépi összeszerelést, amellyel nagy mértékben csökkenthető volt az előállítási költség. A gép vezető tervezője Edson de Castro volt. A gép 1965-ben jelent meg a piacon.[4]
A PDP–8 családba tartozó eladott gépek számát 300 000 fölöttire becsülik. Az alábbi típusok készültek:[9]
A PDP–8-as gépet igen könnyű emulálni, mivel utasításkészlete sokkal egyszerűbb a modern számítógépekénél. A rajongók teljes PDP–8-as gépeket is építettek egyetlen FPGA áramkörrel.
A PDP–8-as több szoftveres szimulációja is elérhető az interneten. Ezek közül a jobb minőségűek pontosan hajtják végre a DEC operációs rendszert és a diagnosztikai programokat. A szoftver-szimulációk gyakran a PDP–8s modellt szimulálják a hozzá való összes lehetséges perifériával, de még ezek a szimulációk is csak egy kis részét foglalják le egy modern személyi számítógép kapacitásának.
A KFKI Elektronikus Főosztályának munkatársai a PDP–8 gépet alapul véve kezdték el fejleszteni a TPA típusú számítógépeket 1966-ban. Az 1968-ban bemutatott TPA–1001 a PDP–8 újraimplementálása volt, a DEC által közreadott utasításkészlet és ismertető alapján. A TPA–1001 ugyan klón, de egy független megvalósítása a PDP–8 utasításkészletének.[10][11][12]
A gép CPU-ja alapján egy egycímes, akkumulátoros rendszerű CISC felépítésű számítógép – az utasításkészletében összetett parancsok találhatók, amelyek a regisztert memóriaoperandusokkal kombinálják (pl. TAD a # AC = AC + MEM[a], stb.), ami a CISC felépítésre jellemző.
A gép tára 12 bites szavakból áll – a tervezők úgy ítélték meg, hogy ez a szóhossz elégséges a mérési és szabályozási alkalmazásokban. Ennek megfelelően a gép regiszterei is 12 bitesek. A gépi szót tehát egyszerűen 12 bites adatként definiálták, így nem volt külön kijelölt előjelbit, a mennyiségek egyszerű előjel nélküli egészként kezelhetők. Az előjeles értékek kezelésére a programokban szubrutinokat kellett alkalmazni, amely lehetővé tette a kettes komplemens ábrázolásmód használatát.
A központi tár mérete általában 4096 szó (azaz 212), ez egyes modellekben bővíthető volt; a bővített tárat lapozással (memóriabank-váltással) lehet elérni a programokból. A tár ferritmagos memória volt, 1,5 mikroszekundumos frissítési idővel, ezáltal a tipikus kétciklusos (fetch, execute) utasítások használatával a gép elérhette a 0,333 MIPS sebességet is.
A gép minden utasítása 12 bites, amelyben 3 bit szolgál az utasítás kódolására (opkód), 2 bit szolgál a címzési módok jelölésére, a maradék 7 bit pedig a címet határozza meg (ofszetcím, eltolás). Minden utasítás egyszavas. A 3 bit nyolc utasítás kódolását engedi meg. A nyolc utasítás közül a bináris „1112” kódú utasítás egy bővítőutasítást határoz meg (OPR), amellyel mikrokódolt részműveletek sorozatát lehet végrehajtani, így ezzel végezhetők a különféle bitmanipulációs és vezérlési műveletek (eltolás, komplemensképzés, növelés, törlés, szorzás, osztás és feltételes átlépő utasítások) – ezek olyan utasítások, amelyeknek nincs szükségük operanduscímekre, így az egész címrész felhasználható a műveletek kódolására.
Az utasításkészlet egy másik utasítása a be-/kimeneti műveletet jelöli, így az utasításkészletben az általános utasítások számára 6 lehetőség marad.
7 bittel 128 szó címezhető, ezáltal a 4096 szavas memóriaterület 128 szavas lapokra van felosztva és a 7 bites cím egy lapon belül érvényes. A cím vagy az aktuális lapon, vagy a 0. lapon elhelyezkedő szóra mutathat, a 4. „Z” bit értékétől függően. Az utasításkészletben indirekt címzés is rendelkezésre áll.
A PDP-8 regiszterei | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A gép regiszterkészlete igen kicsi, az AC akkumulátorregiszterből és a PC programszámlálóból áll. Ezek mind 12 bitesek, tehát a PC a teljes 4096 szavas memóriabankot képes megcímezni. Az adatok tárolására a memóriát, főleg annak 0. lapját használták. A két kisegítő regiszter a memóriaelérésnél játszik szerepet, ezek programból nem elérhetőek. Az „L” link-regiszter a túlcsordulásbitet tárolja.
A szorzás és osztás műveletekkel együtt egy további regisztert is bevezettek a „kiterjesztett számolóelem” (Extended Arithmetic Element, EAE) elnevezésű opcionális kiterjesztésben „szorzó/hányados regiszter” (Multiplier/Quotient) avagy MQ regiszter néven. Az EAE kiterjesztés választható összetevő volt az eredeti PDP–8-ban[13] valamint a 8/I és 8/E modellekben,[14] az Intersil 6100 mikroprocesszor pedig már beépítve tartalmazta azt.
A gépnek nincs hardveres verme, ezt szubrutinnal lehet megoldani.
A PDP–8-asnak egyetlen megszakítási vonala van. A megszakítást a processzor a 00008 címre való ugrással kezeli (valójában a visszatérési címet helyezi el a 00008 címen és a végrehajtást a 00018 címen kezdi meg, a JMS szubrutinhívó utasításnak megfelelően) és minden további megszakítást letilt a kiszolgálás idejére. Emiatt nehéz reentráns (újrabeléptethető) szubrutinokat írni és egymásba ágyazott megszakításokat kezelni – ezeket a technikákat általában nem is alkalmazták.
A be-/kimeneti rendszer kétfajta interfész csatlakoztatását engedi meg. A lassú készülékek esetén a be-/kimeneti művelet megszakítással kezelhető a felhasználói programban; a műveletet egy kiszolgálóprogram végzi el. Gyorsabb készülékek esetén úgynevezett „cikluslopásra” van lehetőség, ami azt jelenti, hogy a készülék és a tár között adatmozgatás történik, amit nem a programutasítások, hanem a készülék vezérművei vezérlik. A cikluslopás a memóriafrissítési ciklusok alatt történik, és több szó átvitelét teszi lehetővé.[3]
0 | 2 | 3 | 4 | 5 | 11 | ||||||
Művelet | I | Z | offszetcím |
A be-/kimeneti utasítások kódja a 68, mnemonikus kódja pedig az IOT, ami az Input-Output Transfer (bemeneti és kimeneti átvitel) rövidítése. A PDP–8 processzor maga kevés be-/kimeneti átviteli utasítást tartalmazott, ám ehelyett egy teljes keretrendszert definiált. A legtöbb IOT utasítást az egyedi be-/kimeneti eszközök határozták meg.
0 | 2 | 3 | 8 | 9 | 11 | ||||||
6=IOT | készülék | funkció |
Az IOT utasítás 3–8. bitje a be-/kimeneti készüléket, eszközt választják ki. Néhány ilyen eszközcímet szabványosítottak megállapodás szerint:
A 0 eszközhöz tartozó utasítások magát a processzort érintik. Például az ION (6001) utasítás engedélyezi a megszakításkezelést és az IOFF (6002) letiltja azt.
Az IOT utasítás 9–11. bitje választja ki a műveletet, amit az eszköz végrehajt. Az egyszerű eszközök, mint pl. a papírszalagolvasó és lyukasztó, konzol-billentyűzet és nyomtató, a biteket szabványos módon értelmezik:
Ezek a műveletek szabályos sorrendben hajtódnak végre, amelyek hasznos eredményt adnak több bit beállítása esetén is.
A bonyolultabb eszközök, mint pl. a lemezvezérlők, ezt a 3 bitet eszközspecifikus módon használják. Tipikusan egy eszköz a 3 bittel 8 lehetséges funkciót kódolhat.
Az OPR egy különleges kiterjesztőutasítás, amivel a szűkös utasításkészlet bővítését oldották meg. Ezek az utasítások nem vonatkoznak közvetlenül operandusokra, így az azokat kódoló biteket más célra lehet felhasználni. Minden kiterjesztőutasítás első számjegye 78, az utasítás fennmaradó bitjei különleges jelentéssel bírnak. Az OPR utasítások körébe tartoznak a feltételes végrehajtású programvezérlő utasítások is, amelyek tipikusan a következő utasítás átlépésével járnak, ami egy JMP lehet.
Az OPR utasítást „mikrokódolt utasításnak” is nevezték, ami azonban nem a mikrokód mai értelmezését jelenti, tehát hogy egy alacsonyabb rendű programot olvas és értelmez az OPR utasítás, hanem azt, hogy az utasítás minden bitje egy bizonyos akciót határoz meg, és a programozó egyszerre több ilyen akció végrehajtását írhatja elő egyetlen utasításciklus alatt, az utasítás bitjeinek beállításával. A bitekhez mnemonikok vannak hozzárendelve és az assembler készíti el ezekből az OPR bináris kódját. Több be-/kimeneti eszköz alkalmazott „mikrokódolt” IOT utasításokat is.
A mikrokódolt akciók egy jól meghatározott sorrendben hajtódnak végre, amelyet a maximális hatékonyság céljából alakítottak ki.
Az OPR utasítások három csoportra oszlanak, a 3., 8. és 11. bitek határozzák meg a csoportokat, így nem lehetséges a különböző csoportok akcióinak keveredése, a különböző csoportokba tartozó akciók nem kombinálhatók.
00. 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. bitek ___________________________________________________________ | 1 | 1 | 1 | 0 | | | | | | | | | |____|____|____|____|____|____|____|____|____|____|____|____| | CLA CLL CMA CML RAR RAL BSW IAC Végrehajtási sorrend: 1 1 2 2 4 4 4 3
A „7012” kódú utasítás két RAR műveletet végez egymás után, ezt a BSW bit 1-re állítása jelzi. Hasonlóan működik a „7006” kód is, amelyben a RAL és BSW bitek vannak beállítva.[15]
Ebbe a csoportba tartozik a NOP utasítás is, ami nem más, mint a „7000” kód, amelyben a 3.–11. bitek értéke mind 0.
00. 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. bitek ___________________________________________________________ | 1 | 1 | 1 | 1 | | | | | 0 | | | 0 | |____|____|____|____|____|____|____|____|____|____|____|____| | CLA SMA SZA SNL OSR HLT Végrehajtási sorrend: 2 1 1 1 3 3
Ha a 8. bit üres, akkor a processzor végrehajt egy skip műveletet, azaz átlépi a következő utasítást, ha a feltétel teljesül. Például a "SMA SZA", opkódja „7540”, átlép, ha az AC ≤ 0.
A 2. csoport 4.–11. bitjeinek 0 állása egy másik NOP utasítást kódol.
00. 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. bitek ___________________________________________________________ | 1 | 1 | 1 | 1 | | | | | 1 | | | 0 | |____|____|____|____|____|____|____|____|____|____|____|____| | CLA SPA SNA SZL OSR HLT Végrehajtási sorrend: 2 1 1 1 3 2
Mikor a 8. bit be van állítva, az átugrási feltétel a VAGY csoporthoz képest megfordul: a skip nem történik meg, ha a 2. (VAGY) csoport feltételei közül akármelyik teljesül, ami azt jelenti, hogy az összes skip feltételnek teljesülnie kell. Például a "SPA SNA", opkódja „7550”, ugrik, ha az AC > 0. Ha az 5.–7. bitek közül egyik sincs beállítva, akkor az egy feltétel nélküli skip utasítás.
Az OPR fennmaradó bitkombinációi alkotják a harmadik csoportot, amely főleg az MQ (Multiplier/Quotient, szorzó/hányados) regisztert érintik.
00. 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. bitek ___________________________________________________________ | 1 | 1 | 1 | 1 | | | | | | | | 1 | |____|____|____|____|____|____|____|____|____|____|____|____| | CLA MQA SCA MQL \__ CODE __/ Végrehajtási sorrend: 1* 2 2 2 3
Tipikusan a CLA és MQA használatos az MQ értékének AC-be mozgatásához. Egy másik hasznos kombináció az MQA és MQL, ami kicseréli a két regiszter tartalmát.
Három bit („CODE”) a végrehajtandó szorzás/osztás műveletet határozza meg:
Az alábbi példák a PDP-8 assembly nyelvén készültek, a PAL-III assemblernek megfelelően.
/Y és X memóriaoperandusok
DCA Y /Az Y értékét betölti az AC-ba
CIA /Komplemensképzés és AC növelése 1-gyel. Eredmény: -AC azaz -Y (kettes komplemens, negatív szám)
TAD X /X-Y => AC
Az alábbi példa azt mutatja, hogy mi szükséges két szám összehasonlításához:
/Az OPD1 és OPD2 memóriahelyeken álló két szám összehasonlítása
CLA CLL /Kiindulás: az AC és L nullázása
TAD OPD1 /Az első operandus betöltése AC-ba (0-hoz való hozzáadással); a L még 0
CIA /AC komplemense és növelése 1-gyel; azaz AC negálása
TAD OPD2 /Az AC tartalma most OPD2-OPD1; ha OPD2≥OPD1, az összeg túlcsordul és az L értéke 1 lesz
SZL /A következő utasítás átugrása (skip), ha L = 0
JMP OP2GT /Ugorjon el valahova, ha az OPD2≥OPD1 feltétel teljesül;
/Egyébként folytassa a kódot innen.