Mindennapi processzorunk rovat:
Intel D8086-2
A 8086 16-bites mikroprocesszor, amelyet az Intel 1978-ban mutatott be. Testvére az Intel 8088, amelyet 1979-ben mutattak be, s amely elindította a PC-forradalmat - de az egy másik történet.
Története
Háttér
Az első 8-bites mikroprocesszort, az i8008-at 1972-ben indította útjára az Intel. Utasításkészletét a Datapoint tervezte programozható CRT-terminálok számára, de általános célokra is megfelelt. Számos kisegítő IC-t igényelt ahhoz, hogy működőképes számítógép legyen belőle, részben a kis méretű, 18 tűs DIP tokozás okán, amely miatt az elkülönült adat/címbuszok megvalósítása lehetetlen volt. Az Intel fő profilja ekkor még a DRAM-gyártás volt.
Két évvel később jött a 8080, amiről már volt szó itt. Ez nem volt kompatibilis az elődjével sem fizikailag, sem operációs kód szintjén.
Az első x86 design
A 8086 megtervezésének eredeti célja az volt, hogy átmenetileg helyettesítse az ambiciózus iAPX 432 project-et, elvonva a figyelmet a konkurencia (pl. a Motorola, a Zilog és a National Semiconductor) kevésbé késésben levő processzorairól, valamint az is célkitűzés volt, hogy jobb legyen, mint a volt Intel alkalmazottak által tervezett Z80. Mind az architektúra tervezését, mind a fizikai kialakítást ennélfogva gyorsan végezték, és eléggé támaszkodtak a közvetlen előd 8085-ös bevált megoldásaira. Bár nem direkt kompatibilis a forráskódjuk , de a 8086-os assembly nyelvét úgy tervezték meg, hogy a 8085-ös forráskódja automatikusan volt közel optimális 8086-kóddá fordítható, minimális vagy éppen semmilyen kézi beavatkozást nem igényelve. A legfontosabb újítás az volt, hogy a 8086 teljes értékű támogatást nyújtott a 16-bites műveletekhez, szemben a 8080/8085-ösök korlátozott lehetőségeivel. A chipet HMOS technológiával gyártották, és kb. 20.000 aktív tranzisztorból állt (29.000, az összes ROM (mikrokód) és PLA tranzisztort is beleszámítjuk).
Bár kevésbé volt elterjedt, mint a 8088-as, az öröksége időtállóbb; még a legtöbb modern gépben is található hivatkozás rá a vendor ID bejegyzésekben az Intel eszközei között.
Részletek
Buszrendszer és működés
A processzor kívül-belül teljesen 16-bites. A címbusza 20-bites volt, amivel legfeljebb 1 MB fizikai memóriát tudott szegmentáltan megcímezni. (És, mint tudjuk, 640 kbyte-nak mindenre elégnek kell lennie.) 16-bites I/O címtartománya 64 kB elkülönített I/O területet biztosított.
Az adatbusz és a címbusz multiplexelt volt, de ez más tényezőkhöz képest ennek a chipnek az esetében kevésbé rontotta a teljesítményt; egy 16-bites információmennyiség átvitele 4 memória hozzáférési ciklust igényelt. Az utasításhossz 1 és 6 byte között változott. Következőleg az utasításlehívás és a végrehajtás konkurrens módon történt, és történik mind a mai napig az x86-os processzorokban. A busz interfész egy 6 byte-os előolvasó soron keresztül táplálta a végrehajtó egységet adatokkal (kezdetleges pipeline-ként is fel lehet fogni), ily módon felgyorsítva a végrehajtást a regiszterekben és a végrehajtó logikában, míg a memóriaműveletek lassabbá váltak (ezt a problémát 4 évvel később, a 80186-osban és a 80286-osban megoldották). A 16-bites felépítésből, az operandus vs. művelet jobb arányú ortogonalizálásából és más fejlesztésekből származó teljesítménytöbblet még így is figyelemreméltó volt, néhány esetet kivéve, ahol az öregebb chipek gyorsabbnak bizonyultak (ld. lentebb).
A lineárisan megcímezhető memória mérete 64 kB-ban volt maximálva egyszerűen azért, mert a belső regiszterek mind 16-bitesek voltak, tehát a programszámláló is. A teljes 1 MB-os memóriatartomány kihasználása némileg kényelmetlen módon szegmensregiszterek segítségével volt lehetséges - ez a 80386-osig így is maradt. Néhány vezérlő kivezetés több funkciót is elláthatott attól függően, hogy "min" módban, egyprocesszoros környezetben működött a chip, vagy "max" módban, többprocesszoros környezetben. A processzornak volt néhány új utasítása, ami a 8085-ben nem volt még meg, és amelyekkel jobban támogatta a veremalapú magas szintű programozási nyelveket, mint a Pascal vagy a C. A leghasznosabbak közül néhány a "push immed", a "push mem-op" és a "ret size" volt, és ezeket a későbbi 80186, 80286, és 80386 tervekben még számos hasonló követte.
Regiszterek és utasítások
A 8086-osnak nyolc, többé-kevésbé általános 16-bites regisztere volt (beleszámolva a veremmutatót, de a programszámláló, a státuszregiszter és a szegmensregiszterek nélkül). Négy közülük két-két 8-bites regiszterre volt felosztható.
A 8085 és más 8-bites CPU-k által inspirált kompakt kódolásnak köszönhetően a legtöbb utasítás egy- vagy kétcímű volt, ami azt jelenti, hogy az eredményt az operandusok egyike tárolta. A legtöbb esetben az egyik operandus lehetett a memóriában is, és ez akár céloperandus is lehetett, míg a másik, a forrásoperandus egyaránt lehetett regiszter vagy közvetlen címzésű. Egy egyszerű memóriarekesz szintén gyakran volt használható mind forrás-, mind céloperandusként, ami, többek között hozzájárult a kis méretű, a 8-bites gépek kódjával összevethető méretű végrehajtható kódok létrejöttéhez.
Noha a regiszterek és műveletek közötti ortogonalitás nagyobb mértékű volt, mint a 8085-ben, még mindig alacsony szintű volt, és a regisztereket néha implicit módon használták az utasítások. Bár az assembly-programozó számára ez tökéletesen érthető volt, a compilerek számára bonyolultabb volt, összevetve az egykorú 16-bites processzorokkal (pl. VAX és 68000); a másik oldalról jóval egyszerűbb kódgenerálásra volt lehetőség, mint a 8-bites CPU-kkal (8085 v. 6502) esetében.
Ahogy fentebb említettem, a 8086-os 64 kB-nyi 8-bites (vagy másként fogalmazva 32 k-nyi 16-bites, vagyis egyszavas) I/O tartománnyal bírt. Rendelkezésre állt egy szegmensnyi (64 kB) felülről lefelé épülő, hardveresen támogatott verem is; a veremre 2 byte-os szavak kerültek és a verem tetejére (illetve aljára) az SS:SP mutatott. 256 megszakítás volt, amelyek hardveresen és szoftveresen egyaránt kiválthatóak voltak. A megszakítások egymásba ágyazhatóak, a vermet használták a visszatérési adatok tárolására.
Szegmentálás
Négy darab, indexregiszterként is használható szegmensregisztere volt a 8086-osnak. A szegmensregiszterek lehetővé tették, bár elég különös módon, a CPU számára 1 MB memória elérését. A hiányzó bitekkel történő kiegészítés helyett, ahogy az a legtöbb szegmentált processzorban történik, a cím kiszámításakor a 8086-os eltolta a szegmensregiszter tartalmát 4 bittel balra, majd hozzáadta az offset címhez, így:
fizikai cím = szegmens×16 + offset
A fizikai memóriacím így 20-bites volt, bár mind az offset, mind a szegmens csak 16-bitesek voltak. Ennek a sémának az eredményeként a szegmensek 16 byte-onként átfedték egymást, és ugyanazt a byte-ot a memóriában összesen 4096-féle, különböző módon számított mutatóval lehetett megcímezni. Az assemblyben, ahol a szegmenseket teljes mértékben ellenőrizték, ez elfogadható volt, de a Pascal és C programozókat zavarta, és a legtöbbjük tervezési gyengeségnek tartotta, ami miatt teljesen új koncepciókat (pl. közeli és távoli kulcsszavak) kellett a nyelvekbe bevezetni. Az adatokat és/vagy a kódot vagy közeli, 16-bites szegmensekben kellett menedzselni, vagy, nagy adat/programstruktúrák esetén, távoli mutatókkal (szegmens:offset párokkal).
Mindenesetre megvolt a lehetőség, és a korai programok éltek is vele, hogy a szegmenseket figyelmen kívül hagyják, aminek köszönhetően a 8-bites szoftverek portolása a 8086-ra egyszerű volt. Az MS-DOS szerzői ebből előnyt kovácsoltak, amikor a CP/M-hez nagyon hasonló Alkalmazói Program Interfészt alkottak meg. Ez nagyon fontos volt akkor, amikor a 8086 még újnak számított, hiszen nagyon sok létező és bevált CP/M alkalmazást lehetett gyorsan elérhetővé tenni az új platformon.
Teljesítmény
Néhány tipikus utasítás végrehajtási ideje (órajelciklusban):
A megadott idők a legjobb esetet mutatják. A tényleges végrehajtást az utasításlehívás állapota és más tényezők is befolyásolták.
MOV reg,reg: 2, reg,im: 4, reg,mem: 8+EA, mem,reg: 9+EA, mem,im: 10+EA ciklus
ALU reg,reg: 3, reg,im: 4, reg,mem: 9+EA, mem,reg: 16+EA, mem,im: 17+EA ciklus
JMP reg: 11, JMP címke: 15, Jcc címke: 16 (cc = feltételes kód)
MUL reg: 70..118 ciklus
IDIV reg: 101..165 ciklus
EA: a tényleges cím kiszámításának ideje, 5-től 12 ciklusnyi ideig terjed.
Az adatokból látható, hogy a regisztereken végzett és a közvetlen címzésű műveletek gyorsak voltak (2 és 4 ciklus között), míg a memóriaműveletek és az ugrások lassúak; az ugrási műveletek több ciklusnyi időt igényeltek, mint a 8080-on vagy a 8085-ön, és a 8088-ast ez még inkább érintette a keskenyebb adatbusz miatt. Az okok, amik miatt a legtöbb memóriaművelet lassú volt:
* A végrehajtó és az utasításlehívó egység csak lazán kapcsolódott – ez jó a lehívásnál, de kevésbé optimális az ugrásoknál és a véletlenszerű memória eléréseknél.
* A címszámítások nagy részét mikrokódú rutinok végezték.
* Az adat- és a címbusz multiplexelt volt azért, hogy a standard 40 tűs DIP tokot lehessen alkalmazni.
Megjegyzem, hogy a memóriához való hozzáférést a következő generációs processzorokban drasztikusan felgyorsította az Intel; mind a 80186-os, mind a 80286-os hardveres címszámítást kapott a mikrokódos helyett, számos órajellel gyorsítva meg a végrehajtást; a 80286-os ezenkívül egymástól szétválasztott, nem multiplexelt adat- és címbuszt kapott.
Chipváltozatok
Az órajel eredetileg 5 MHz-es volt (az IBM PC 4.773 MHz-es volt, ami a standard 3.579545 MHz-es NTSC frekvencia 4/3-a), de a legkésőbbi HMOS változatok 10 MHz-et értek el. A CMOS-változatokat hosszú ideig gyártották (még a 1990-es években is) beágyazott rendszerek számára, noha az utód 80186/80188-as jóval népszerűbb volt az ilyen alkalmazásokban.
Kompatibilis, és néhány esetben továbbfejlesztett változatokat készített a Fujitsu, a Harris/Intersil, az OKI, a Siemens AG, a Texas Instruments, a NEC és az AMD. Példának okáért a NEC feljavított, 8086 kompatibilis processzorsorozatát (NEC V20, V25, V30 stb.) még mindig használják beágyazva.
A 8086/8088-asokat össze lehetett kapcsolni matematikai coprocesszorral, amivel a rendszer lebegőpontos képességeket nyert. A standard az Intel 8087 volt, 80-bites számokon végzett műveletekkel, de hamarosan az olyan gyártók, mint a már ismertetett Weitek, nagyobb teljesítményű alternatívákat kínáltak.
Klónok
A Szovjetunió elektronikai ipara mind kémkedés, mind visszafejtés útján elég információhoz jutott a 8086-osról ahhoz, hogy képes legyen az előállítására. Az eredmény a K1810BM86 jelű chip lett, ami lábkompatibilis volt az eredeti Intel 8086-tal és ugyanaz volt az utasításkészlete. Ez az IC volt a lelke az ES1840 és ES1841 típusjelű szovjet desktop gépeknek. Hardveresen azonban ezek a gépek jelentősen különböztek az autentikus nyugati prototípusaiktól (IBM PC és PC/XT): a K1810BM86 az Intel 8086 másolata volt, nem az Intel 8088-é, és az adat/címbusz áramköröket az eredeti IBM terméktől függetlenül tervezték meg és készítették el.
Egy érdekes páros a leszármazottak közül a NEC V20 és a NEC V30. Ezek hardveresen kompatibilisek a 8088-nal és a 8086-tal, de az utasításkészletük az Intel 80186-é. Upgrade célokra tervezték őket, a két chip révén egyszerűen, áttervezés nélkül lehetett az új utasításkészletet és a gyorsabb végrehajtást beépíteni, akár utólag is, a rendszerekbe.
Gyermekbetegség
Az 1982 előtt gyártott 8086-os CPU-kban komoly megszakítási hiba van. Az IBM díjmentesen cserélte az érintett PC-k processzorait. Emiatt az 1979-es, eredeti jelöléssel bíró processzorok ritkák, és természetesen a gyűjtők kedvencei.
A 8086-ost használó mikroszámítógépek
* A legfontosabb, természetesen, az IBM PC, ami a 8088-as jelzésű változatot használta.
* Az első kereskedelmi forgalomba került gép, ami a 8086-ra épült, a Mycron 2000 volt.
* Az IBM Displaywriter szövegszerkesztő gép és a Wang Laboratories Wang Professional Computer nevű terméke szintén a 8086-ost használta, akárcsak az AT&T 6300 PC (amit az Olivetti gyártott).
* Az első Compaq Deskpro 7,14 MHz-es 8086-ost használt, de képes volt a 4,77 MHz-es IBM PC számára tervezett bővítőkártyák használatára is.
* Az FLT86-ot, ami egy jól megvalósított oktatógép a 8086 CPU-ról, mind a mai napig gyártja a Flite Electronics International Limited az angliai Southampton-ban.
... a trip back in time is all I need ...