Motorola 68000

A Wikipédiából, a szabad enciklopédiából

A Motorola 68000 egy 16/32 bites[1] CISC mikroprocesszor mag (és konkrét processzor), amelyet a Freescale Semiconductor, azaz a Motorola korábbi félvezetőgyártó üzemága (Semiconductor Products Sector) tervezett és gyártott. Az 1979-ben bemutatott HMOS technológiájú processzor az első tagja volt a sikeres 32 bites m68k processzorcsaládnak, amely előre-kompatibilis volt a sorozat későbbi tagjaival, a 16 bites szélességű külső busz korlátai ellenére. 30 évvel később a 68000-es architektúra még mindig használatban van.

Kibocsátás előtti XC68000 chip, 1979-ből

Történet[szerkesztés | forrásszöveg szerkesztése]

Motorola MC68000 (CLCC tokozással)
Motorola MC68000 (PLCC tokozással)

A 68000-es a MACSS (Motorola Advanced Computer System on Silicon) projektből született, amely 1976-ban kezdődött egy teljesen új architektúra kifejlesztése céljából, a visszafelé kompatibilitás teljes mellőzésével. Ez inkább a már létező, 8 bites 6800-as vonal nagyobb teljesítményű testvére, kiegészítője lett volna, mint kompatibilis utódja. Végül a 68000-es megtartotta a busz-protokoll kompatibilis üzemmódját a létező 6800-as eszközökhöz, és elkészült egy 8 bites adatbusszal rendelkező verzió. Azonban a tervezők a jövőbe, az előre-kompatibilitásra koncentráltak, ami előnyt jelentett az M68K platformnak a későbbi 32 bites architektúrákkal szemben. Így pl. a CPU regiszterei mind 32 bit szélességűek voltak, még akkor is, ha a processzor belső adatstruktúrái ritkán működtek egyszerre mind a 32 biten. A MACSS fejlesztőcsapatot erősen befolyásolta a miniszámítógépek, azaz pl. a PDP-11 és VAX rendszerek processzorainak felépítése, amelyek mikrokódja hasonlóan működött.

Az 1970-es évek közepén a 8 bites processzorgyártók versenybe kezdtek a 16 bites generáció bevezetéséért. A National Semiconductor volt az első az IMP-16 és PACE processzorokkal 1973–1975-ben, de ezeknek sebességi problémáik voltak. 1977-ben az Intel 8086 nagy népszerűségre tett szert. A Motorola a konkurencia megelőzése érdekében döntött a hibrid 16/32 bites felépítés bevezetéséről és ezt következetesen véghez is vitte. A késői belépés a 16 bites arénába előnyökkel is járt: a processzorokba több tranzisztor került – kb. 40 000 aktív elem, szemben a 8086-os 20 000-es számával –, 32 bites makroutasítások és a beharangozott könnyű használat.

Az eredeti MC68000 3.5-mikronos csíkszélességű HMOS technológiával készült. Hivatalosan 1979 szeptemberében jelentették be,[2] az első minták 1980 februárjában készültek el, a forgalmazás ugyanazon év novemberében kezdődött.[3] Kezdetben 4, 6, és 8 MHz-es órajelű chipek készültek, a 10 MHz-es változat 1981-ben, a 12.5 MHz-es chipek 1982 júniusában[3] jelentek meg. Az MC68000 16.67 MHz-es "12F" jelű változata volt a leggyorsabb eredeti HMOS chip, ez az 1980-as évek végén jelent meg. Thomas Guntert, a Motorola visszavonult alelnökét a 68000-es atyjaként is emlegetik.

A 68000-es vált a Unix munkaállomások domináns processzorává. Ezek között voltak a Sun és az Apollo/Domain munkaállomások. Az asztali és mikrogépek területén is előretört, az Amiga, Atari ST, Apple Lisa és Macintosh gépek is 68000-es CPU-val készültek. Az első asztali lézernyomtatókat is ezzel a processzorral szerelték, beleértve az eredeti Apple Inc. LaserWriter és HP LaserJet nyomtatókat. 1982-ben a 68000-es új utasításkészlet-architektúrát kapott, amely lehetővé tette a virtuális memóriakezelést és megfelelt a Popek és Goldberg-féle virtualizációs követelményeknek. A korszerűsített chip a 68010 jelet kapta. Ennek egy továbbfejlesztett változata, a kisebb példányszámban gyártott 68012 31 bitre növelt címbuszt tartalmazott.

Olcsó rendszerek és kisebb memóriaigényű vezérlőalkalmazások számára a Motorola ugyancsak 1982-ben bevezette a 8 bites rendszerekkel kompatibilis MC68008 processzort: ez egy 68000-es mag 8 bites adatbusszal és keskenyebb, 20 bites címbusszal. 1982 után a cég a 68020 és 88000 projektekre helyezte a hangsúlyt.

Egyéb gyártók[szerkesztés | forrásszöveg szerkesztése]

Hitachi HD68000
Thomson TS68000

A Motorolán kívül a HMOS 68000 processzort gyártotta még a Hitachi: ez volt a HD68000 jelű chip, amely 2.7 mikronos csíkszélességgel készült és 12.5 MHz órajelet használt,[3] ezen kívül a Mostek (MK68000), Rockwell (R68000), Signetics (SCN68000), Thomson/SGS-Thomson (eredetileg EF68000, majd később TS68000 jelöléssel), és a Toshiba (TMP68000). A Toshiba gyártotta még a CMOS 68HC000 (TMP68HC000) változatot is.

CMOS változatok[szerkesztés | forrásszöveg szerkesztése]

A 68HC000 volt az első CMOS technológiával készült 680000-as. Ezt a Hitachi tervezte és a két cég közösen vezette be 1985-ben.[4] A Motorola változat jele MC68HC000, a Hitachié HD68HC000 volt. A 68HC000 verzió 8-tól 20 MHz-ig terjedő órajellel készült. A CMOS-alapú felépítéstől eltekintve ez a chip teljesen azonos a HMOS verzióval, de az áramfelvétele jóval kisebb. Az eredeti HMOS MC68000 teljesítményfelvétele kb. 1.35 watt körül volt, 25 °C környezeti hőmérsékleten, órajeltől függetlenül, míg a MC68HC000 fogyasztása csak 0.13 watt 8 MHz-en és 0.38 watt 20 MHz-en. (A CMOS áramkörökkel ellentétben a HMOS akkor is áramot fogyaszt, mikor nem csinál semmit, és az áramfelvétel csak kicsit változik az órajeltől függően). Az Apple a 68HC000 chipet választotta Macintosh Portable gépe processzorának.

A Motorola a MC68008-ast a MC68HC001-es chippel váltotta fel 1990-ben.[5] Ez a chip sok tekintetben a 68HC000-ra hasonlított, azonban az adatbusza képes volt mind 16-, mind 8 bites üzemmódban működni; az üzemmódot egy bemeneti lábon lehetett kapcsolni processzor-resetnél, így ez a processzor olcsóbb 8 bites memóriákkal is működhetett.

A 68000-as fejlesztése a későbbiekben a modern beágyazott vezérlőalkalmazások és a chipre integrált perifériák felé mozdult el. A 68EC000 chipben és SCM68000 magban a címbuszt 32 bitre terjesztették ki, megszüntették az M6800 perifériabuszt, és letiltották a MOVE from SR (adatmozgatás az állapotregiszterből) utasítás használatát a felhasználói módú programokban.[6] 1996-ban a Motorola a különálló magot egy teljesen statikus áramkörrel váltotta fel, amely mindössze 2 µW-ot fogyasztott alacsony áramfelvételű üzemmódban, ez volt a MC68SEC000 jelű chip.[7]

A Motorola 1996-ban beszüntette a MC68000 és MC68008 HMOS változatainak gyártását,[8] viszont a Motorolából kivált Freescale Semiconductor továbbra is gyártja a MC68HC000, MC68HC001, MC68EC000 és MC68SEC000 chipeket valamint a MC68302, MC68306 és a DragonBall mikrovezérlők különféle változatait. A 68000-es architektúra leszármazottai, a 680x0, a CPU32, és a ColdFire családok még mindig gyártásban vannak.

Mikrovezérlő mag szerepében[szerkesztés | forrásszöveg szerkesztése]

Miután bevált az "igazi" 32 bites mikroprocesszorok körében, a 68000-et különféle mikrovezérlők magjaként kezdték használni. 1989-ben a Motorola bemutatta az MC68302 jelű kommunikációs processzort,[9] ami elnevezése szerint egy ipari kommunikációs feladatokra, pl. ISDN hálózatokba szánt "integrált multiprotokoll processzor" (integrated multiprotocol processor, azaz IMP).[10]

68EC000[szerkesztés | forrásszöveg szerkesztése]

Motorola 68EC000 kontroller

A 68EC000 a 68000 olcsó változata, beágyazott vezérlő alkalmazásokhoz tervezték. A 68EC000 8- vagy 16 bites adatbuszt képes használni, és ezek között váltani is tud, egy reset segítségével.[11]

Különböző órajelen működő változatai vannak, közöttük a 8 és 16 MHz-es konfigurációk, melyek 2,100 és 4,376 Dhrystone-os teljesítmény nyújtanak. Ezekben a processzorokban nincs lebegőpontos egység és nehezen megoldható a koprocesszor (MC68881/2) illesztése, ugyanis az EC sorozatból hiányoznak a szükséges koprocesszor-utasítások.

A 68EC000 audioalkalmazásokban került felhasználásra kontrollerként, pl. Ensoniq hangszerekben és hangkártyákban, ahol a MIDI szintézer része.[12] Az Ensoniq hangvezérlőkben a kontroller számos előnyt nyújtott, összehasonlítva más gyártók CPU nélküli eszközeivel. A processzor lehetővé tette, hogy a hangvezérlő különböző audiofeladatokat végezzen, mint pl. MPU-401 MIDI szintézis vagy MT-32 emuláció, mindezt külső tárrezidens (terminate and stay resident, TSR) program nélkül. Ez javította a szoftverkompatibilitást, csökkentette a CPU használatot és szükségtelenné tette a gazdagép memóriájának használatát.

A 68EC000 magot később a Motorola/Freescale m68k-alapú DragonBall processzoraiba építették be. Ilyen a processzor volt a Sega Saturn játékkonzol hangvezérlőjében is, és a HP JetDirect LaserJet printerek Ethernet-vezérlőjében is az 1990-es években.

Alkalmazás[szerkesztés | forrásszöveg szerkesztése]

Két Hitachi 68HC000 CPU egy játékgép alaplapján

A bevezetésekor a 68000-et eleinte drágább rendszerekben használták, pl. olyan többfelhasználós mikroszámítógépekben, mint a WICAT 150 [3], a korai Alpha Microsystems, Sage II / IV számítógépekben, Tandy TRS-80 Model 16-ban, és a Fortune 32:16-ban; ezen kívül egyfelhasználós munkaállomásokban mint pl. a Hewlett-Packard HP 9000 Series 200 rendszereiben, az első Apollo/Domain rendszerekben, a Sun Microsystems Sun-1 modelljében, és a Corvus Concept asztali gépben (ami egy vastag pizzás doboz méretű volt egy monitorral a tetején); továbbá grafikus terminálokban mint a DEC VAXstation 100 és Silicon Graphics IRIS 1000 and 1200 gépeiben. A Unix rendszerek rövidesen a 68k család későbbi, nagyobb teljesítményű tagjait kezdték alkalmazni, és ezek végig megőrizték népszerűségüket a piacon az 1980-as években.

Az 1980-as évek közepére a csökkenő termelési költségek miatt megnyílt az út a 68000-es személyi- és otthoni (mikro-) számítógépekben (home computer) történő felhasználása előtt, kezdve az Apple Lisa és Macintosh gépeivel, amelyeket a Commodore Amiga, Atari ST, és a Sharp X68000 követett. A 68008-at azonban viszonylag kevés mikrogépben használták. Ezek közül a Sinclair QL volt a kereskedelmileg legjelentősebb (bár a QL az ICL One Per Desk testvérgépe volt, amely szintén 68008-ast használt). A Helix Systems (USA, Missouri) az SWTPC SS-50 rendszerbusz általa tervezett kiterjesztése, az SS-64 alapján 68008-alapú rendszerek gyártásába kezdett.

Miközben a számítógépes fejlődés üteme miatt a 68000 CPU rövidesen elavulttá vált az asztali gépek és munkaállomások körében, a processzor tekintélyes helyet szerzett a beágyazott rendszerek terén. Az 1980-as évek elején a 68000-es processzorok már 30 USD alatt beszerezhetőek voltak. A videojáték-gyártók több 68000-es processzorra épülő játéktermi gépet, otthoni játékgépet és videojáték-konzolt készítettek, ilyen volt pl. az Ataritól az 1982-es Food Fight, az egyik első 68000-alapú játéktermi (arcade) gép. Ezt továbbiak követték: a Sega System 16, Capcom CP System és CPS-2, és a Neo Geo az SNK-tól. Az 1980-as évek végére a processzor ára annyira lecsökkent, hogy megérte az otthoni játékgépekbe beépíteni; így született a Sega Mega Drive (Genesis) konzol. 1993-ban a multiprocesszoros Atari Jaguar konzol 68000-es processzort használt támogató/kiegészítő chip szerepében, de a fejlesztők a 68000-ast elsődleges processzorként kezdték használni a programokban, közismertsége miatt.

A 68000 nagy sikert ért el beágyazott vezérlőként. Már 1981-ben megjelent a 68k vezérlésű Imagen Imprint-10 lézernyomtató. Az 1984-ben megjelent HP LaserJet nyomtatót 8 MHz-es Motorola 68000 processzor vezérelte. Más gyártók is követték a példát, így az Apple az 1985-ös LaserWriter-rel, amely az első PostScript lézernyomtató volt. A 68000-et az 1980-as évek során széles körben használták lézernyomtatókban, és később az 1990-es években olcsóbb nyomtatókban.

A 68000 sikeres volt az ipari vezérlés területén is. A sikeres 68k alapú PLC vezérlőrendszerek gyártói: az Allen-Bradley, a Texas Instruments és a TI részlegének felvásárlása után a Siemens. A vezérlőrendszerek felhasználói nem engedhetik meg azt a gyors elavulási tempót, ami a fogyasztói elektronikában megfigyelhető, ezért teljesen valószínű, hogy a 20 évvel ezelőtt telepített ilyen rendszerek megbízhatóan működnek még a 21. században is.

A 68000-es architektúrán alapuló 683XX mikrovezérlőket hálózati és telekommunikációs berendezésekben is használnak, továbbá tévékben, set-top boxokban, laboratóriumi műszerekben és orvosi berendezésekben, még kézi számológépekben is. Az MC68302 chip és származékai Cisco, 3com, Ascend, Marconi, Cyclades és más cégek telekommunikációs berendezéseiben működnek. A letűnt Palm PDA-k és a Handspring Visor DragonBall processzorra épültek, ami szintén a 68000 egy származéka. A Texas Instruments csúcskategóriás grafikus kalkulátorait, a TI-89, TI-92 sorozat tagjait és a Voyage 200-et szintén 68000 processzor vezérli. A korai verziók specializált mikrovezérlőt használtak statikus 68EC000 maggal; a későbbiek standard MC68SEC000 processzort használnak.

A 68000 egy módosított változata képezte a magját az IBM System/370 processzor PC-alapú IBM-kompatibilis hardver-emulátorának, az IBM XT/370-nek.

Architektúra[szerkesztés | forrásszöveg szerkesztése]

Az m68k architektúra igen fejlett jellemzőkkel rendelkezett, amelyek más felépítésekben csak sokkal később jelentek meg. Ilyenek például a privilégiumszintek vagy a fejlett kivételkezelés. Az m68k egy belsőleg 32 bites architektúra, amely azonban mindig tartalmazta a 16 bites rendszerekhez való illesztés lehetőségét.

Az MC68000 főbb jellemzői:

  • 32 bites adat- és címregiszterek
  • 16 MiB lineárisan címezhető memória (24 bites címbusz)
  • 56 utasítástípus
  • öt alapvető adattípus
  • memóriába leképezett I/O (nincsenek külön I/O portok)
  • 14 címzési mód

A 68000 család bájtsorrendje big-endian. A big-endian bájtsorrendnél az egy word/dwordben tárolt bájtok logikai és fizikai sorrendje megegyezik, hasonlóan a hálózati bájtsorrendhez.

Az alapvető adattípusok: bitek, BCD számjegyek, bájt (8 bit), szó (16 bit), duplaszó (v. long, 32 bit).

Címbusz[szerkesztés | forrásszöveg szerkesztése]

A 68000 processzor elméletileg 24 bites címzést használt, de a 24 bites címet 23 bemeneti címvonal (A1-A23) és két vezérlőjel (UDS, LDS) segítségével határozta meg, amelyek az A0 értékét állították, így állt elő a 24 bites cím (A0-A23). Ezzel 16 MiB fizikai memóriát tudott megcímezni byte-os felbontásban. A címszámítás és tárolás minden esetben 32-bitet használt, csak a legfelső helyiértékű byte-ot nem vette figyelembe, a címvonalak fizikai hiánya miatt. Ez lehetővé tette a folytonos 32 bites címteret használó programok futtatását. A Motorola ezzel a belső 32 bites címtér előre-kompatibilitását igyekezett biztosítani, lehetővé téve a teljes 32 bites címzés használatát, amikor azt később megvalósítják.[13]

Ez azonban nem tartotta vissza a programozókat az előre-inkompatibilis kód írásától. A 24 bites szoftver, amely elhanyagolta a legfelső címbájtot vagy más célokra használta azt, hibát okozhatott a 32 bites 68k hardveren. Például a korai, 7.0 előtti Apple Mac OS verziók a memóriablokk fő pointereinek felső bájtját jelzőbitek tárolására használták (pl. 'zárt' v. 'törölhető'). A későbbi verziókban a jelzőbitek máshova kerültek és az Apple a Mac IIci 1989-es megjelenésével elkezdett "tisztán 32 bites" ROM-okkal ellátott gépeket szállítani.

A 68000 regiszterei[szerkesztés | forrásszöveg szerkesztése]

A 68000 processzorban a regiszterek 32 bitesek (néhány kivételtől eltekintve), az adat- és a címregiszterek külön vannak választva. Az adatregiszterek abban különböznek a címregiszterektől, hogy lehetővé teszik a 8- és 16 bites adatok írását úgy, hogy a magasabb helyiértéken lévő bitek értéke nem változik, míg a címregiszterek írásakor mind a 32 bit megváltozik, és azokba nem is megengedett a 8 bites írás. A regiszterkészlet:

  • 8 db 32 bites adatregiszter:
    • D0, D1, D2, D3, D4, D5, D6, D7
  • 7 db 32 bites címregiszter:
    • A0, A1, A2, A3, A4, A5, A6
  • Az A7 regiszter egyben a stack pointer, jele SP: az assemblerek ilyen néven is hivatkozhatnak rá. Az A7 felhasználói módban az USP, szupervizor módban a SSP regisztert címzi.
  • 4 speciális regiszter:
    • PC – 32 bites programszámláló (a 68000 processzorban 24 bites)
    • SR – 16 bites állapotregiszter, az alsó bájtjára CCR néven lehet hivatkozni (condition code register, feltételkód regiszter)
    • USP – 32 bites felhasználói stack pointer
    • SSP – 32 bites szupervizor stack pointer

A programszámláló belsőleg 32 bites, de a 68000 processzor 24 bites címbusza miatt a legfelső bájtot nem használja, így a PC értéke a 24 bites címtéren belül marad.

A regiszterek száma lehetővé teszi, hogy a processzor gyorsan reagáljon a megszakításokra, ilyenkor ugyanis a 8 adatregisztert (D0–D7) és 7 címregisztert (A0–A6) kell elmenteni, összesen 15-öt, viszont a normál működéshez is megfelelő a regiszterek száma. (Az A7 regiszter is menthető szupervizor módban).

Az állapotregiszter[szerkesztés | forrásszöveg szerkesztése]

A processzor állapotregisztere 16 bites és két bájtra osztható. Az alsó bájt, azaz a 0-7 bitek alkotják a "felhasználói bájt"-ot, amelyben a 68000 összehasonlító, számtani és logikai műveletei különböző biteket állítanak, amiket később feltételes utasításokban (pl. ugrásoknál) lehet felhasználni. Ezek: "zéró" (Z), "carry" (C), "túlcsordulás"/"overflow" (V), "extend" (X), és "negatív" (N) jelzőbitek. Az "extend" (X) jelző különbözik a "carry" átvitelbittől, a nem túlcsordulás okozta kilépő bitet tárolja. A 8-15 bitek alkotják a "rendszer bájt"-ot, ebben egyéb vezérlőbitek vannak, pl. a megszakítási maszk, szupervizor állapotjelző és a trace bit.

Regiszterek, összefoglaló táblázat[szerkesztés | forrásszöveg szerkesztése]

A Motorola 68000 regiszterei felhasználói üzemmódban:
31 16 15 8 7 0 – bitek
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D0 NYOLC
ADAT-
REGISZTER
 
 
 
    D1
    D2
    D3
    D4
    D5
    D6
    D7
31 16 15 8 7 0 – bitek
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ A0 HÉT
CÍM-
REGISZTER
 
 
 
    A1
    A2
    A3
    A4
    A5
    A6
    A7 USER
STACK POINTER
  (USP)
  PC PROGRAM
COUNTER
 
CCR STATUS
REGISTER
7 0 – bitek
A Motorola 68000 regiszterei felügyelői (supervisor) üzemmódban:
A D0–D7 és A0–A6 regiszterek szerepe nem változik.
31 16 15 8 7 0 – bitek
    A7' SUPERVISOR
STACK POINTER
  (SSP)
  CCR SR STATUS
REGISTER
15 8 7 0 – bitek

Forrás:[14]

Ez a modell a 68000 és a 68008 processzorokra érvényes, a 68010-nél már megváltozott, pl. megjelent a Vector Base Register (VBR) és egyéb regiszterek.

Utasításkészlet[szerkesztés | forrásszöveg szerkesztése]

A 68000 processzorcsalád egyik jellegzetes vonása a nagymértékben ortogonális utasításkészlet: majdnem mindegyik gépi utasítás használhat minden típusú címzést. Az utasítások 0, 1 vagy kétoperandusúak lehetnek. Egy kétoperandusú utasítás a következő alakú:

 CMD.S src, dst

ahol az CMD az utasítás mnemonikja, .S az adattípus utótagja, az src és dst az operandusok. Az .S utótag azt jelzi, hogy az utasítás milyen méretű adaton dolgozik: S helyett { B, W, L } állhat: a .B 8 bites (bájt), .W 16 bites (szó), .L 32 bites (long) adatot jelent. A kétoperandusú utasításoknál az src a forrásoperandust, az dst a céloperandust határozza meg.

Az utasításokat az utasításkód és címzési mód határozza meg, a minimális utasításméret 16 bit (2 bájt). Sok utasítás és címzéskombináció hossza ezt meghaladja, ekkor a teljes utasítás kiegészítő szavakat tartalmaz: az utasítások hossza egytől öt szóig terjedhet.

Címzési módok[szerkesztés | forrásszöveg szerkesztése]

Az operandusokban az alábbi 14 címzési mód használható (a 68000, 68008, 68010 processzoroknál):[15]

jelölés elnevezés példák
Regiszter direkt címzés
Dn adatregiszter CLR.B D0
An címregiszter MOVEA.W A0,A1
Abszolút adatcímzés
(xxx).W 16 bites abszolút memóriacím (absolute short) CLR.B ($8000).W
(xxx).L 32 bites abszolút memóriacím (absolute long) CLR.B ($11008000).L
PC-relatív címzés
d16(PC) PC-relatív 16 bites címeltolással CLR.B 22(PC)
d8(PC,Rn.s) PC-relatív 8 bites címeltolással és index-regiszterrel CLR.B 10(PC,A1.W)
Regiszter indirekt címzés
(An) regiszter indirekt CLR.B (A0)
(An)+ regiszter indirekt automatikus növeléssel (poszt-inkrementális) CLR.B (A0)+
-(An) regiszter indirekt automatikus csökkentéssel (pre-dekrementális) CLR.B -(A0)
d16(An) regiszter indirekt 16 bites címeltolással (offset) CLR.B 255(A0)
d8(An,Rn.s) regiszter indirekt cím 8 bites címeltolással és index-regiszterrel CLR.B $44(A0,D0.L)
Közvetlen címzés (immediate)
#xxx közvetlen (immediate, egy állandó érték) MOVE.L #15,D0
#d8 gyors közvetlen (quick immediate) MOVEQ.L #$80,D0
Beleértett címzés (implied)
nincs beleértett regiszter (pl. SR, USP, SSP, PC, VBR, SFC, DFC) PEA ; RTS

Ahol

  • n : regiszter száma, 0...7; Rn : valamilyen A vagy D regiszter
  • d8: 8 bites adat
  • d16: 16 bites adat
  • xxx: 16 v. 32 bites adat, az utasítástól függően

A 68000 assemblerek többsége a "$" jelet használja a hexadecimális számok jelölésére.

Abszolút vagy közvetlen címzésnél szimbolikus nevek is használhatók (ezt az assemblerek lehetővé teszik).

A csökkentés és növelés (pl. (A0)+ és -(A0) esetén) értéke függ az operandus méretétől: byte címnél 1, word esetén 2, long adatnál 4.

A PC-relatív címzés pozíciófüggetlen kód esetén haszos.

A gyors közvetlen módú címzésnél az érték magában az utasításkódban tárolt 8 biten van megadva, és előjelkiterjesztéssel lesz 32 bites értékre alakítva. A MOVEQ #0,D0 pl. gyorsabb, mint a CLR.L D0 (mindkettő nullázza a D0 regisztert). Az ADDQ, SUBQ utasításokban az érték csak 3 biten tárolódik, és a 0 8-nak felel meg.

Az m68k család fejlettebb processzoraiban – a 68020-tól kezdve – újabb, bonyolultabb címzési módok is megjelentek (pl. indirekt indexelt, PC-relatív indirekt indexelt).

Utasítások[szerkesztés | forrásszöveg szerkesztése]

A 68000 processzornak 56 utasítása van. Az utasítások az alábbi csoportokba oszthatók:

  • Adatmozgató utasítások: adatok mozgatására az univerzális MOVE utasítás szolgál, amely lehetővé teszi tetszőleges típusú adat mozgatását (másolását) a memóriában, memórából regiszterbe és fordítva, és regiszterek között. A címmozgató utasítások szavas és duplaszavas adatok átvitelét teszik lehetővé. Az általános adatmozgató utasításokon kívül speciális változatai is léteznek: MOVEM (több regiszter mozgatása), MOVEP (perifériás adat mozgatása), EXG (regiszterek cseréje), SWAP (bájt-csere regiszterben), LEA, PEA (effektív cím betöltése, tárolása), LINK (verem előkészítése paraméterátadáshoz), UNLK (verem felszabadítása), MOVEQ (gyors adatmozgatás). A veremkezelés is MOVE utasításokkal végezhető.
  • Aritmetikai műveletek: ADD, ADDX, SUB, SUBX, MULU (előjel nélküli szorzás), MULS (előjeles szorzás), DIVU, DIVS, CLR (törlés), NEG, NEGX (additív negáció), és CMP (összehasonlítás, amely a kivonáshoz hasonlóan állítja az állapotbiteket, de az eredményt nem tárolja), EXT (előjel-kiterjesztés), TAS, TST (tesztek). Ide tartoznak a gyors ADDQ, SUBQ utasítások is.
  • BCD aritmetika: ABCD, SBCD, NBCD (BCD negálás)
  • Logikai: AND, OR, NOT (logikai tagadás, invertálás), EOR (kizáró vagy)
  • Léptető/eltoló és rotáló utasítások: (logikai, azaz pl. a jobbra tolásnál a felső bitre 0 kerül) LSL, LSR, (aritmetikai eltolások, azaz előjelkiterjesztéssel a felső bitre) ASR, ASL, (körkörös eltolás ill. rotálás kiterjesztéssel (X) és anélkül) ROXL, ROXR, ROL, ROR
  • Bitkezelő utasítások a memóriában: BSET (1-re állít), BCLR (0-ra állít), BCHG (bit ellentettje) és BTST (ellenőrzés: az állapotregiszter Z bitjét 1-re állítja, ha a vizsgált bit 0)
  • Multiprocesszoros üzemmódot támogató utasítás: TAS, test-and-set: ez egy nem megszakítható buszművelet, amely lehetővé teszi szemaforok használatát szinkronizációhoz, közös memóriát használó processzorok számára.
  • Folyamatvezérlő utasítások: JMP (ugrás), JSR (szubrutinhívás), BSR (relatív című szubrutinhívás), RTS (visszatérés szubrutinból), RTE (visszatérés kivételkezelőből, azaz megszakításból), TRAP (szoftveres kivétel kezdeményezése, szoftvermegszakításhoz hasonló), CHK (feltételes szoftveres kivétel).
  • Elágazások: BRA (feltétlen elágazás, PC-relatív "goto"), Bcc (feltételes elágazások, branch, ahol a "cc" 16 különböző feltétel ellenőrzését jelölő kód lehet, a feltételek az állapotregiszter bitjeire és azok kombinációira vonatkoznak, ilyenek: BCC, BCS, BEQ, BGE, BGT, BHI, BLE, BLS, BLT, BMI, BNE, BPL, BVC, BVS; a BHS a BCC, a BLO a BCS szinonimája. A feltételes elágazások nincsenek hatással a feltételbitekre.)
  • Csökkentés-és-elágazás: DBcc (ahol a "cc" ugyanaz mint a feltételes elágazásoknál): ez az utasítás csökkenti egy adatregiszter értékét, ezután elugrik, ha a feltétel értéke még igaz és a regiszter tartalma még nem érte el a -1-et. A -1 használata megkönnyítette olyan ciklusok írását, amelyeket egyszer sem kellett végrehajtani, ha a ciklusszámláló kezdőértéke 0, ezzel a ciklus kezdete előtti ellenőrzést ki lehetett hagyni. A DBcc ciklusok könnyen egymásba ágyazhatók.
  • Rendszervezérlő műveletek: privilegizált utasítások (RESET, RTE, STOP, ORI to SR, MOVE USP, ANDI to SR, EORI to SR, MOVE EA to SR), csapda-generáló utasítások (TRAP, TRAPV, CHK) és állapotregisztert használó utasítások (ANDI to CCR, EORI to CCR, MOVE EA to CCR, ORI to CCR, MOVE SR to EA) tartoznak ide.

A felsorolás nem teljes. Az utasításkészletet részletesen leírják a 68000 programozói kézikönyvek.

A 68k processzoroknak nincsenek külön veremkezelő utasításai, az általános adatmozgatásra használt MOVE utasítás, megfelelő operandusokkal történő használata nyújtja a megoldást erre a feladatra. Például az x86 architektúra PUSH <regiszter> utasításának itt a MOVE.L Rn,-(SP) utasítás felel meg, amely csökkenti a veremmutatót a mozgatott adat mennyiségével (itt 4-gyel: ezt a .L utótag jelzi; adattípus long), majd a veremmutatóban tárolt címre beírja a megadott regiszter tartalmát. Az alkalmazott pre-dekrementált címzésmód bármely címregiszter esetén használható, nem csak a veremmutató esetében.

Működés[szerkesztés | forrásszöveg szerkesztése]

Privilégium-szintek[szerkesztés | forrásszöveg szerkesztése]

A CPU és később az egész processzorcsalád két privilégium-szintet valósított meg. A felhasználói mód (user mode) mindenhez hozzáférést adott a megszakítási szintek vezérlését kivéve. A szupervizor privilégium szint mindent megengedett. A megszakítások végrehajtása mindig szupervizor módban történt. A szupevizor módot a szupervizor bit jelezte a státuszregiszterben, ami látható volt a felhasználói módú programok számára is.

Az előnye ennek a rendszernek, hogy a szupervizor szint egy külön veremmutatóval (stack pointer) rendelkezett. Ez lehetővé tette a többfeladatos (multitasking) rendszereknek, hogy igen kicsi vermeket foglaljanak a feladatok (taszkok) számára, tehát a tervezőknek nem kellett külön nagyméretű memóriaterületet lefoglalni, amely képes befogadni az összes veremkeretet maximális számú megszakítás kiszolgálása esetén.

Megszakítások[szerkesztés | forrásszöveg szerkesztése]

A CPU 7 megszakítási szintet ismer. A szintek 1-től 7-ig szigorúan priorizáltak, tehát a magasabb szintű/számú megszakítás mindig meg tudja szakítani az alacsonyabb számú megszakítás kiszolgálását. Egy privilegizált utasítás szolgál az aktuális minimum megszakítási szint beállítására az állapotregiszterben, így blokkolhatók az alacsonyabb prioritású megszakítások. A 7. szint a nem maszkolható megszakítás (non-maskable interrupt, NMI). Az 1. szintet bármely magasabb szint képes megszakítani. A 0. szint azt jelenti, hogy nincs megszakítás. A megszakítási szint értéke az állapotregiszterben van tárolva és a felhasználói szintű programok számára látható.

A hardvermegszakítások kérésére a CPU felé három bemeneti vonal (láb) szolgál, amelyek kódolják a legmagasabb függőben lévő megszakítási prioritást. A megszakítások kódolására általában egy külön megszakításkezelő szükséges, bár azok a rendszerek, amelyeknek nincs szükségük háromnál több hardvermegszakításra, közvetlenül csatlakoztathatók a megszakításvezérlő bemenetekre, kissé komplexebb megszakításkezelő szoftver árán. A megszakításvezérlő lehet akár egy egyszerű 74LS148 prioritáskódoló, vagy a VLSI perifériacsip része lehet, mint pl. a MC68901 multifunkciós perifériában, amit az Atari TT030-ban használtak, és amelyben volt UART, timer, és párhuzamos I/O is.

A "kivétel-táblázat", azaz a megszakítási vektorok (megszakításkezelők által használt címek) helye rögzített a 0-tól 1023-ig terjedő memóriaterületen, ez 256 db. 32 bites címet biztosít a megszakítások számára. Az első vektor a kezdő veremcímet, a második az indítókód kezdőcímét tartalmazza. A 3-tól 15-ig terjedő vektorok különböző hibák kezelőire mutatnak: buszhiba, címhiba, illegális utasítás, nullával való osztás, CHK és CHK2 vektor, privilégiumsértés; néhány fenntartott vektor a "1010 kód emulátor" és "1111 kód emulátor" számára (ezek a hexadecimális A és F kódokkal kezdődő, később bevezetendő utasítások, pl. koprocesszor-utasítások emulálására szolgálnak), és hardveres töréspont vektora. A 24-es vektor kezdte a valódi megszakítások sorát: hamis megszakítás (amikor nincs hardveres nyugtázás), az 1-től a 7. szintig terjedő autovektorok, ezek után 16 db. TRAP (csapda) vektor, ezek után néhány fenntartott, végül a felhasználói vektorok találhatók.

Mivel induláskor vagy resetkor legalább a kezdőkód címvektornak érvényesnek kell lennie, a rendszerek általában valamilyen állandó memóriát (pl. ROM) alkalmaztak a 0. címen, amelyek tartalmazták a vektorokat és az kezdeti indítókódot (bootstrap code). Azonban az általános célú rendszerekben kívánatos, hogy az operációs rendszer képes legyen változtatni a vektorokat futási időben. Ezt vagy úgy érik el, hogy a ROM-ban lévő vektorok egy már a RAM-ban lévő ugrási táblázatra mutatnak, vagy valamilyen memóriaváltási mechanizmust alkalmaznak, amely a ROM-bankot egy RAM-memóriabankra váltja futási időben.

A 68000 nem felelt meg a Popek és Goldberg-féle virtualizációs követelményeknek a teljes processzor virtualizáció tekintetében, mert tartalmazott egy MOVE from SR utasítást, amely lehetővé tette a felhasználói módú szoftverek számára a csak-olvasható hozzáférést a privilegizált állapot egy kis részletéhez.

A 68000 nem volt képes a virtuális memória egyszerű támogatására, amelynél szükség van a hibás memóriahozzáférések elfogására és az ez utáni helyreállításra. A 68000-nál van ugyan buszhiba kivétel, ami használható a hiba elfogásához, de ez nem ment el elég információt a processzor állapotáról, ami lehetővé tenné a program folytatását a hibát okozó utasítás után, miután az operációs rendszer lekezelte a kivételt. Több cég is készített 68000-alapú virtuális memóriát használó Unix munkaállomásokat, amelyekben két párhuzamosan, de eltérő fázisú órajellel futó 68000 processzorral oldották meg ezt a problémát. Mikor a "vezető" 68000 hibás memóriahozzáféréssel találkozott, egy külön hardver megszakította a "fő" 68000 futását, megakadályozva ezzel, hogy az a memóriahibával találkozzon. Ez a megszakítási rutin kezelte a virtuális memóriafunkciókat és indította újra megfelelő állapotban a "vezető" processzort, hogy folytassa a megfelelően szinkronizált végrehajtást mikor a "fő" processzor visszatér a megszakításból.

Ezeket a problémákat kijavították a 68k architektúra következő nagyobb revíziójában, amely az MC68010 megjelenésével indult. A buszhiba és címhiba kivételek elég állapot-adatot helyeztek a szupervizor-verembe, lehetővé téve a helyreállítást, és a MOVE from SR utasítás privilegizált lett. Helyette a felhasználói módú szoftverek egy új nem-privilegizált MOVE from CCR utasítást használhattak, és az operációs rendszer elfoghatta és emulálhatta a felhasználói módú MOVE from SR utasítást, amennyiben erre szükség volt.

Koprocesszor használata[szerkesztés | forrásszöveg szerkesztése]

Az MC68000, MC68008, MC68010 nem tartalmaz koprocesszor-interfészt, azonban mégis lehetőség van a Motorola 68881 matematikai koprocesszor használatára.[16] Ezeknél a processzoroknál a koprocesszor egy perifériavezérlő processzorként illeszthető a rendszerbe, amelynél a (lebegőpontos) regiszterek a memóriába vannak leképezve, és a koprocesszor interfész szoftveresen emulálható. Erre a célra rendelkezésre áll az "1111 kód emulátor" csapda,[17] amely minden hexadecimális F kóddal kezdődő opkód észlelésekor végrehajtja a megszakítást. A megszakításkezelőben emulálható a teljes lebegőpontos utasításkészlet, vagy meghajtható a fizikailag jelenlevő matematikai koprocesszor.

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

  1. Motorola Literature Distribution, Phonenix, AZ. M68000 Family Programmer's Reference Manual. [motorola], 1–1. o (1992). ISBN 0-13-723289-6 
  2. [1]
  3. ^ a b c [2] DTACK GROUNDED, The Journal of Simple 68000/16081 Systems Issue # 29 - March 1984 p9
  4. "Company Briefs", The New York Times, September 21, 1985, available from TimesSelect (subscription).
  5. "68HC001 obsoletes 68008.", Microprocessor Report, June 20, 1990; available from HighBeam Research (subscription).
  6. "Motorola streamlines 68000 family; "EC" versions of 68000, '020, '030, and '040, plus low-end 68300 chip.", Microprocessor Report, April 17, 1991; available from HighBeam Research (subscription).
  7. "Motorola reveals MC68SEC000 processor for low power embedded applications", Motorola press release, November 18, 1996; archived by Internet Archive on March 28, 1997.
  8. comp.sys.m68k Usenet posting, May 16, 1995; also see other posts in thread. The end-of-life announcement was in late 1994; according to standard Motorola end-of-life practice, final orders would have been in 1995, with final shipments in 1996.
  9. "Multiprotocol processor marries 68000 and RISC.", ESD: The Electronic System Design Magazine, November 1, 1989; available from AccessMyLibrary.
  10. Motorola: MC68302 / Integrated Multiprotocol Processor User’s Manual (angol nyelven) (pdf) pp. SECTION 1. Motorola, 1995. (Hozzáférés: 2012)
  11. Boys, Robert. M68k Frequently Asked Questions (FAQ), comp.sys.m68k, October 19, 1994.
  12. Soundscape Elite Specs. from Fax Sheet, Google Groups, April 25, 1995.
  13. http://www.freescale.com/webapp/search/Serp.jsp?QueryText=68020
  14. Motorola: M68000 8-/16-/32-Bit Microprocessors User’s Manual / Ninth Edition (angol nyelven) (PDF) pp. 2–2. Motorola, 1993. (Hozzáférés: 2013)
  15. MOTOROLA M68000 FAMILY / Programmer’s Reference Manual (angol nyelven) (pdf). Motorola. (Hozzáférés: 2012) A.1.2 MC68000, MC68008, and MC68010 Addressing Modes ; pg. A-16 ; "The MC68000, MC68008, and MC68010 support 14 addressing modes as shown in Table A-5."
  16. Motorola: MC68881 Floating-point Coprocessor as a Peripherial in an M68000 System (angol nyelven) (pdf). Application Notes pp. 1-37. Motorola, 1987. (Hozzáférés: 2012)
  17. Starnes, Thomas W.: Design Philosophy Behind Motorola's MC68000 (angol nyelven) pp. Table 2. EASy68K.com, 1983. June. (Hozzáférés: 2012) line 1111 emulator : attempt to execute an op code that starts with "1111"

Források[szerkesztés | forrásszöveg szerkesztése]

Hivatkozások[szerkesztés | forrásszöveg szerkesztése]

Commons
A Wikimédia Commons tartalmaz Motorola 68000 témájú médiaállományokat.

Kapcsolódó szócikkek[szerkesztés | forrásszöveg szerkesztése]