Mindennapi processzorunk rovat:
Thomson EF6800P és Fujitsu MB8861N (Motorola MC6800 klónok)
A 6800 típusjelzésű mikroprocesszort a Motorola tervezte. Röviddel az Intel 8080-as CPU-ja után került piacra, 1974 végén. 78 db utasítást ismert, beleszámítva az elhíresült, ám dokumentálatlan utasítást is, a „Halt and Catch Fire (HCF)” buszteszt opkódot.
Talán ez volt az első indexregiszterrel is rendelkező mikroprocesszor. Tipikus tokozása 40-tűs DIP (dual-inline package) volt.
Az 1970-es években számos első generációs mikroszámítógép, amelyeket készletben vagy összeszerelt állapotban lehetett megrendelni, erre a CPU-ra épült. Például a MEK6800D2 fejlesztői lap, az SWTPC 6800 (ami az első 6800-alapú gép volt), a MITS Altair 680 (amit a MITS az Intel 8080 alapú Altair8800 alternatívájaként kínált), továbbá számos Ohio Scientific szerkezet, Gimix, Smoke Signal Broadcasting, Midwest Scientific gépek és a Newbear 77/68.
A Tektronix 4051-es típusjelzésű rendszere professzionális célú, grafikus BASIC fejlesztőkörnyezet volt, 6800-as processzorral, memóriakártyával, beépített kijelzővel és kazettás magnóval. Nyomtatásra külső hőnyomtatót lehetett hozzá csatlakoztatni.
A 6800-asnak számos leszármazottja van, a közvetlen utódok között a „csúcs” a 6809-es, ami jelentős továbbfejlesztésen esett át, és részben kompatibilis volt elődjével. Számos mikrokontrollert is adott ez a család, pl. a Motorola 6801/6803, 6805, RS08, 68HC08, 68HC11 és 68HC12.
A Hitachi Ltd. számos Motorola CPU klón gyártója volt, és piacra dobta saját variánsait, a 6301-est és a 6303-ast, amelyek képesek voltak a 6800-ra írott kódokat futtatni. Ezeknek a mikroprocesszoroknak volt egy halom saját, extra utasításuk is a 6800-as készletén felül.
Amint arról már volt szó korábban, architekturálisan a MOS Technology 6502-es CPU-családja volt még versenytársa a 6800-asnak. A 6502-esnek nem volt 16-bites regisztere az egy szál PC-n (Program Counter) kívül, de többféle címzési módot ismert, és jelentősen olcsóbb volt.
A 6800-as családot a Motorola 68000-es család váltotta le, amit viszont az Apple Macintoshokban és a Commodore Amigákban használtak nagy tömegben, mielőtt az IBM kifejlesztette a PowerPC-t, amit együttműködési megállapodás alapján a Motorola is gyárthatott.
Programozási modell
A 6800-as regiszterkészlete az alábbiakból állt:
A - akkumulátor A (8 bites)
B - akkumulátor B (8 bites)
X - index regiszter (16 bites)
PC – programszámláló (Program Counter, 16 bites)
SP – veremmutató (Stack Pointer, 16 bites)
CCR – Feltételes kód regiszter (Conditional Code Register): Félátviteli bit (Half carry), megszakítási maszk bit (Interrupt mask), negatív bit, zéró bit, túlcsordulási bit (oVerflow) és átvitel (Carry).
A 6800-as egy standard 8-bites, kettes komplemens alapú mikroprocesszor, mint az Intel 8080. Adatbusza, aritmetikai regiszterei 8 bitesek, a címbusza 16-bites, amiből egyenesen következik a legfeljebb 64 kB-nyi egyszerre, egyidőben megcímezhető fizikai memória. A programokat akár ROM-ba is lehetett helyezni. A korszak miniszámítógépeihez, különösen a PDP-8-ashoz képest ez fontos tulajdonság.
A 6800-as 16-bites veremmutatója lehetővé tette, hogy a verem bárhol helyet kaphasson a memóriában, és akár annak teljes kapacitását elfoglalja. Ez előny volt a nagy versenytárs 6502-eshez képest, amelynek csupán 8-bites volt a veremmutatója, és a verme csak az 1-es lapon foglalhatott helyet (a 256 – 511 közötti címeken).
Akárcsak a 8080-as, a 6800-as is támogatja a többszörös pontosságú aritmetikát az átvitel bit, valamint az ADC (összeadás átvitellel - add with carry) és az SBC ( kivonás átvitellel - subtract with carry) utasítások segítségével. A decimális aritmetika szintén támogatott volt, a 8080-ashoz hasonló módon: a DAA (decimális kiigazítás az akkumulátorban) utasítás korrigálta a kettes komplemens ADD (összeadás) utasítás eredményét, ha azt BCD számokon végezték el. A 6502-essel ellentétben a 6800-asnak volt átvitel nélküli összeadási és kivonási utasítása (ADD és SUB) is.
Az aritmetikai utasítások beállították a szokásos kettes komplemens jelzőbiteket: az előjel, a zéró, a túlcsordulás és az átvitel bitet. A 8080-assal és a 6502-essel ellentétben a 6800-asnak komplett feltételes ugróutasítás-készlete volt, ami alapjaiban hasonlított a PDP-11-es ugróutasításaira. Előjeles és előjel náélküli mennyiségek egyaránt összehasonlíthatóak voltak. Például ha össze akarták hasonlítani i-t és j-t, i-t betöltötték mondjuk az A akkumulátorba, (LDAA i), összehasonlították j-vel, vagy kivonták belőle azt (CMPA j vagy SUBA j) és aztán jött az elágazás:
BEQ – Ugrás, ha i egyenlő j-vel
BNE - Ugrás, ha i nem egyenlő j-vel
BHI - Ugrás, ha i nagyobb, mint j (előjel nélkül)
BHS - Ugrás, ha i nagyobb vagy egyenlő j-vel (előjel nélkül)
BLO - Ugrás, ha i kisebb, mint j (előjel nélkül)
BLS - Ugrás, ha i kisebb, vagy egyenlő j-vel (előjel nélkül)
BGT - Ugrás, ha i nagyobb, mint j (előjellel)
BGE - Ugrás, ha i is nagyobb vagy egyenlő j-vel (előjellel)
BLT - Ugrás, ha i kisebb, mint j (előjellel)
BLE - Ugrás, ha i kisebb, vagy egyenlő j-vel (előjellel)
BPL - Ugrás, ha plusz (pozitív vagy zéró)
BMI - Ugrás, ha mínusz
BCC - Ugrás, ha a carry bit 0 (ugyanaz, mint a BHS)
BCS - Ugrás, ha a carry bit 1 (ugyanaz, mint a BLO)
BVS - Ugrás, ha a túlcsordulás bit 1
BVC - Ugrás, ha a túlcsordulás bit 0
BRA – Feltétel nélküli ugróutasítás
A PDP-11-gyel, a 6502-essel és a 8080-assal ellentétben a 6800-as CPU ún. „big endian”, akácsak az IBM 360-as, vagyis több byte-on reprezentálható értékek esetén a nagyobb helyiértékű byte-ot tárolta alacsonyabb címen.
A PDP-11-gyel és a 6502-essel ellentétben, de a 8080-assal megegyező módon a 6800-as ún. „kölcsön” átvitelbitet használt: a carryt a CPU beállította, ha kivonás során átvitel (angolul borrow, azaz kölcsön) keletkezett, ahelyett, hogy törölte volna. Ezt a fajta átvitelbitet használják a modern processzorok is.
A 8080-assal, és különösen a PDP-8-assal ellentétben, de a PDP-11-essel megegyezően a 6800-asnak nincsenek különleges célú I/O utasításai. Ehelyett minden I/O eszköz ugyanazt a címtartományt használhatta memóriaként.
A 8080-astól eltérően a 6800-asnak volt indexelése, ami lehetővé tette adatstruktúrák közvetlen támogatását. Az adatstruktúra báziscímét az indexregiszterbe töltötték, ezután egy 8-bites előjel nélküli ofszetet adtak hozzá a, ami az indexelő utasítások második byte-ja volt, így lehetett a struktúra különböző elemeit elérni.
A 6800-asnak négyféle címzésmódja volt: azonnali, indexelt, kiterjesztett és közvetlen (vagy nulláslap címzés). A nulláslap címzés a 6502-eshez hasonlóan a memória első 256 byte-jához engedett meg gyorsabb hozzáférést (mintegy a regiszterkészlet kiterjesztéseként fogva fel a nulláslapot), de a 6502-es ezt a koncepciót még tovább vitte a nulláslap indirekt címzési módjaival.
Az utasításkészlet mnemonikjai nagy hasonlóságot mutatnak a PDP-11 mnemonikjaival, és mintegy bele is égtek számos assembly programozó és számítógép-fejlesztő elméjébe. Számos CPU, beleértve az ARM-ot, nagyon közel áll a 6800-as mnemonikformájához.
A 6800 buszrendszere
Mint a 8080-as, a 6800-as is definiálta saját buszát, és központja volt egy periféria IC-családnak (ld. alább).
A 6800-as busz különösen egyszerű volt: a perifériák általában csak három vezérlőjelet igényeltek a cím- és adatvonalakon túl:
Φ2 vagy E (az MC6802-esből): az órajelciklust az E két egymást követő lefutó éle határozta meg.
R/W olvasási ciklust jelentett magas, vagy írási ciklust alacsony állapotban.
CS a chip kiválasztó jel, ha alacsony (dekódolva a címvonalakból és a VMA-ból).
A busz órajelezett volt: a beállítási és kitartási idők az E lefutó éléhez kötődtek. A 8080 busza impulzus alapú volt: a beállítási és kitartási idők a MEM_RD, MEM_WR, IO_RD and IO_WR, felfutó éleihez kötődtek, amiket a 8228-as rendszerkontroller chip generált.
Órajelezés, feszültség
Háromféle sebességgel készült a CPU: a 6800-as 1 MHz-en futott, a 68A00 1,5 MHz-en, míg a 68B00 2 MHz-es volt. Az utasítások végrehajtási ideje 2-től (az azonnali címzésmódú LDAA esetén) 12 ciklusig (az SWI utasítás esetén) terjedt.
Akárcsak az i4004-es és i8008-as, a 6800-as is két, egymást nem átfedő bemenő órajelet kívánt: Φ1 és Φ2. A 6800 dinamikus logikát használt: a Φ1 és Φ2 maximális ideje 9,5 μs volt. Számos kiegészítő chip volt elérhető ezeknek a jeleknek az előállítására: az MC6870 (beépített kristállyal), az MC6871 (beépített kristály órajelnyújtó logikával lassú eszközök számára) és az MC6875 (külső kristály, órajelnyújtás és reset szinkronizáló).
Az MC6802 egy 6800-as volt beépített órajelgenerátorral. A kvarckristályt közvetlenül a chiphez lehetett kötni. Az MC6802-esnek volt még 128 byte beépített RAM-ja, és az MC6846-ossal együtt egy komplett kétchipes mikroszámítógépet tudott alkotni..
A 6800-as szimpla 5V-os tápellátást igényelt. Ez sokkal kényelmesebb volt, mint a 8080-as, aminek +12V, +5V és -5V is kellett.
Hátrányok
Sok olyan probléma volt a chippel, amit a későbbi eszközökben, mint a 6809 és 6811, orvosoltak:
- Egyetlenegy mutatóregiszter. Bár a stack pointert is lehetett használni szigorúan másolási ciklusokhoz, de ez kényelmetlen volt, és a megszakításokat ehhez a trükkhöz le kellett tiltani. A 6800-as legfontosabb versenytársa, a 8080-as három mutatóval is bírt (de nem volt indexelése).
- A veremutasítások utólagos dekrementálást használtak PUSH esetén és utólagos inkrementálást POP esetén. Sokkal természetesebb lett volna a fordított megvalósítás. Ez akkor mutatkozott meg, amikor a veremmutatót áttöltötték az indexregiszterbe: a veremben az 1-es offszeten lehetett ekkor megtalálni az első adatot.
- Az indexregisztert nem lehetett közvetlenül a veremre tolni, vagy onnan feltölteni.
- Az akkumulátorok és az indexregiszter eltérő méretűek voltak, emiatt nem voltak utasítások a közöttük elvégzendő műveletekhez. Például nem lehetett az egyik akkumulátort sem, vagy akár egy konstansot közvetlenül hozzáadni az indexregiszterhez. A későbbi processzorokban ezt helyrehozták az "ABX" (add B to X) és a "LEA" (load effective address) utasításokkal.
- A CPX (compare X) utasítás nem befolyásolta az átvitelbitet, emiatt direkt mennyiségi összehasonlítás az indexregiszterrel nem volt lehetséges.
- A DAA (Decimal Adjust after Addition) utasítás csak összeadás után működött, kivonás után nem. Csomagolt decimálisok kivonásához kilences komplemenst kellett végrehajtani az összeadásuk után. Más mikroprocesszorokban ezt változatos módokon ugyan, de megoldották: a 6502-esnek volt egy decimális mód jelzőbitje, amit beállítva az összeadási és kivonási utasítások BCD-módban működtek; a Z80-asnak volt egy kivonás bitje a státusz byte-ban, és ha az utolsó utasítás kivonás volt, ez a bit beállt, aminek alapján a Z80-as DAA utasítása tudta, hogy másképp kell működnie. A 8086-osnak külön DAS (Decimal Adjust after Subtraction) utasítása volt.
A tervezők
Nem világos, hogy volt-e vezető tervezője. A 6800-as tervezői közül néhányan a MOS Technology-hoz igazoltak át, ahol a 6502-est alkották meg. Köztük volt Chuck Peddle, valamint Bill Mensch is, aki az MC6820-ast is tervezte.
Fejlesztői rendszerek
- A Motorola Exorciser egy 6800 fejlesztői rendszer volt. 86 érintkezős plug-in kártyákat használt, és MDOS-t (Motorola Disk Operating System) futtatott 8 hüvelykes floppylemezről.
- A MIKBUG egy korai debugger volt, amit ROM-ba égettek. Lehetőséget adott a memória feltöltésére S19 formátumú papírszalagokról.
- A RASM relokálható assembler volt MDOS alá.
- Az MPL (Motorola Programming Language) egy PL/M-szerű PL/I klón volt.
További gyártók
- AMI
- Fairchild
- Fujitsu
- Thomson
... a trip back in time is all I need ...