摩托羅拉68000

摩托羅拉68000型中央處理器，或稱MC68000，680x0，m68000，m68k，68k；是由美國摩托羅拉公司上基本與隨後的純32位產品保持相容。歷史.摩托羅拉公司於1976年起動MACSS計畫，打算開發一款與以前產品完全不相容的全新微處理器。根據計劃，新CPU應該是對當時摩托羅拉主流8位CPU6800的一個高階互補產品，而不會考慮兩者間的相容性。不過，當68000設計出來後，它還是被保留了一個可相容6800外部的匯流排協定模式，並且專門有8位匯流排的產品被生產出來。當然，設計人員還是更在意於其向後相容性，這為68000確立在32位CPU領域的領先優勢奠定了基礎。比如，68000使用32位暫存器和內部匯流排，僅管其本身的結構很少直接操作長字。小型電腦諸如PDP-11和VAX—二者採用了類似的微編碼—對68000的設計有深遠的影響。在20世紀70年代中期，8位微處理器製造商紛紛競爭匯入下一代16位CPU。國家半導體在1973年到1975年間首先開發出了IMP-16和PACE，但其速度並不理想。英特爾公司於1977年推出8086，迅速受到歡迎。此時，為確保競爭上的領先，摩托羅拉意識到其MACSS計劃必需跳過16位系統，而直接推出16/32位混合型CPU。到1979年，摩托羅拉68000，即MC68000，才告姍姍來遲。由於比8086晚兩年，其電晶體數目更多，並因其易用性得到了好評。最初的MC68000使用3.5微米HMOS技術製造。1979年釋出了工程樣品，次年產品型面世，速度有4、6、8、10兆赫茲多種。最快的16.67MHz版本到80年代末才面市。MC68000在早期得到了很多高階產品的青睞。在昇陽公司的Sun workstation等多種Unix工作站中，MC68000一度佔領導地位。市場領先的其他一些電腦，包括Amiga，以及第一代雷射印表機，如蘋果公司的LaserWriter，都使用MC68000。1982年，摩托羅拉進一步更新了MC68000的指令集以支援虛擬記憶體，並使其能夠符合由Popek和Goldberg於1974年提出的虛擬化標準。為支援低成本系統和使用較少記憶體的應用，摩托羅拉於1982年還推出了面向8位外部匯流排的MC68008。1982年以後，摩托羅拉開始把更多的注意力投向68020和88000。其他製造商.由日立公司設計，1985年兩公司聯合推出了使用CMOS技術的68HC000。68HC000的速度有8到20MHz多個版本。儘管除了使用CMOS電路，68HC000與基於HMOS的MC68000完全一致，但正是因此其能耗得到大幅下降。MC68000在25攝氏度環境下能耗大約為1.35瓦，而8MHz的68HC000則為0.13瓦，較高頻率的版本則能耗也相對提高。後於1990年摩托羅拉又推出了MC68008的CMOS版本，並將其改進為可相容8/16位兩種匯流排模式。其他HMOS版68000的製造商包括：Mostek、Rockwell。應用.68000首先被應用於許多高階產品中，如多使用者微型計算機WICAT 150及阿爾法微系統的一些早期計算機等。單使用者工作站如惠普公司的HP 9000/200、太陽微系統的Sun-1；圖形終端如DEC的VAXstation 100和Silicon Graphics的IRIS 1000均使用68000。許多Unix系統也開始使用68K系列CPU。在80年代中期，68000又成為首先應用於個人/家庭計算機的CPU。先後有蘋果的Apple Lisa與麥金塔、雅達利ST及夏普的Sharp X68000採用68000。68000最主要的成功在於控制器領域。早在1981年Imagen公司就把68000用作其鐳射印表機Imprint-10外部控制器的CPU。惠普於1984年釋出的第一款LaserJet印表機亦使用一片8MHz的68000作為內建控制器。類似的基於68000的整合控制器也被廣泛用在其他多款印表機中。到90年代，68000仍在許多低端印表機中被使用。除了傳統商業和家用計算應用，68000在工業控制系統中也取得了巨大成功。Allen-Bradley、德州儀器及西門子公司生產的可程式設計邏輯控制器即使用68000。一般來說，這類工業系統的使用者更重視產品的可用性，而不是向家庭使用者一樣過於在意其是否過時。所以，仍有許多使用68000的系統，在被安裝二十多年後，在生產一線提供著持續而可靠的服務。隨著技術的進步，68000在計算機單機市場漸被淘汰，但其應用仍活躍於消費和嵌入式領域。遊戲機製造商使用68000作為許多街機和家用遊戲機的處理器。雅達利在1983年推出的Food Fight便是使用68000的代表街機遊戲。世嘉的System 16、卡普空的CPS-1和CPS-2以及SNK的Neo Geo也都使用68000。在80年代末到90年代初，一些遊戲機廠商使用68000作為家用遊戲平臺的中央處理器。這包括世嘉的Mega Drive和Neo Geo家用版和Super A'Can。到了90年代，儘管街機遊戲開始使用更加強大的CPU，68000還在世嘉的32位CPU遊戲機Sega Saturn中用作聲音控制器。基於68000的683XX系列微控制器則廣泛應用於許多應用領域中，包括網路和電話裝置、電視機機頂盒、實驗室與醫療裝置等。思科、3Com等公司曾在他們生產的通訊裝置中使用MC68302及其衍生產品。Palm公司曾使用DragonBall系列CPU作為其PDA的處理器，直到基於RISC的ARM處理器開始統治PDA市場。此外，AlphaSmart公司在其行動式文字處理器中使用DragonBall。德州儀器在一些高階圖形計算器，如TI-89和TI-92中，使用68000。這些裝置早期使用以68EC000為核心的專門化微控制器，後來則改用封裝好的MC68SEC000。作為微控制器核心.在被純32位CPU取代後，68000開始被用作許多微控制器的核心。1989年，摩托羅拉釋出了MC68302通訊處理器。兩年後又推出獨立處理器晶片MC68EC000。1996年的MC68SEC000便使用了這款晶片。1996年摩托羅拉停產HMOS MC68000和MC68008，但其分離出來的半導體部門，飛思卡爾公司，仍在生產MC68HC000等68K家族系列產品。68000架構的後代，680x0、CPU32以及Coldfire系列，也仍在生產。架構.地址匯流排.68000地址匯流排為24位，故支援16MB最大物理記憶體。在使用32位長字對地址進行儲存和計算時，高位的一個位元組會被自動忽略。這種設計使得其具備相當的向前相容性，可以直接執行為後續的純32位CPU編寫的軟體。也因此，根據現今的定義，68000應稱得上是一款32位CPU。摩托羅拉使用32位內部匯流排的目的在於希望能夠在68000上編寫可以被將來的後續產品直接使用的軟體，而相關指令不必作位數上的調整。然而，程式工程師還是有可能編寫出無法與後續產品相容的軟體。倘若這種24位軟體丟棄高位位元組，或將該位元組用作定址以外的目的，它就有可能在32位68K系列CPU上執行失敗。這就是說，對於希望支援向前相容的軟體，必須始終使用32位長字定址，並且將最高位位元組置零。內部暫存器.68000包含8個32位通用暫存器，也有足夠的暫存器來進行快速計算。儘管兩種暫存器並存有時會比較麻煩，但在實踐中並非難於掌握。據稱，這還使得CPU的設計者們可以透過對地址暫存器組使用輔助計算單元，從而實現較高程度的並行機制。儲存內容高位位元組在前，與x86相反。狀態暫存器.68000比較、算術和邏輯操作會在狀態暫存器SR的低端位元組。儘管許多時候值是相同的，X與C依然是兩個不同的標誌位。這就允許算術、邏輯和移位操作的多餘位與邏輯控制/連線造成的進位區別開。指令集.68000的指令集基本上是正交的。大部分指令被劃分成操作和地址模式兩部分，並且大部分地址模式都對幾乎全部指令可用。這種近似正交性在程式設計人員當中譭譽參半。程式設計者會清楚地發現，他/她所書寫的指令可能被彙編成幾種不同的二進位制操作碼。這實際上是一種不錯的妥協：一方面，在便利性上與純粹的正交指令系統相仿；一方面，CPU設計者可以有更多的自由來設計操作碼錶。對於一臺16位時代的機器而言，由56條指令構成的最小指令集仍顯巨大。此外，許多指令和定址模式會在指令後邊加入地址/定址模式碼。許多設計者確信MC68000體系結構應基於成本考量使用較精簡的指令碼，特別是使用編譯器自動生成時。這種認識為對其設計上的成功加分不少，並且使之成為一種經久不衰的體系結構。這一信條持續地保證了整個系列指令集的設計優勢，直到ARM體系結構引入同樣精簡的Thumb指令集。特權級.68K系列CPU包含兩個特權級。超級使用者模式。後者相比於前者只是禁用了中斷級控制。中斷總會使CPU進入超級使用者態。超級使用者標誌位儲存於狀態暫存器SR中，並對使用者可見。超級使用者態下會有一個分離的棧指標用於中斷處理。中斷.68000可以識別7級中斷，從級別1到級別7。7級中斷嚴格按優先順序排列，一個高階中斷總是能巢狀於一個低階中斷。可以使用專門的特權指令在SR內設定最小中斷級別，從而遮蔽所有小於此級別的中斷。但如果設定為0，表示不接受中斷。級別7不可被遮蔽，即NMI。級別1總是可以被高階中斷打斷。硬體中斷源將中斷訊號以編碼方式透過三條輸入線傳送給CPU。一般會使用專門的中斷控制器來彙總各外部裝置，並將中斷訊號按級編碼與CPU硬連。中斷控制器可以使用簡單如74LS148優先順序編碼器，複雜如MC68901多功能外設等各種電路模組。在記憶體低1K位置儲存中斷向量表，共支援256條中斷向量。部分中斷向量有特殊用途：向量1為初始棧地址；向量2為初始程式碼地址；向量3到15用於錯誤報告，包括匯流排錯誤、定址錯誤、非法指令、除零異常、優先權違反等。從向量24起處理真正的中斷，包括偽中斷、針對級別1到級別7的預設處理向量，多達15個自陷向量，以及使用者定義向量。由於必須在重啟時保證向量1和2的內容有效，所以68000系統通常包含在地址底部使用非易失性儲存器。由於包含一條非特權指令MOVE from SR，允許一般使用者只讀地訪問某些特權狀態，68000並未完全滿足波佩克與戈德堡虛擬化需求。該需求指出了為構建某一CPU之等價虛擬機器而對CPU提出的若干要求。MC68000對虛擬記憶體缺乏方便的支援。一款支援虛擬記憶體的CPU應能在記憶體訪問失敗後自陷並恢復。不過，68000確實提供了一個匯流排錯誤異常來使CPU自陷，儘管還不能儲存足夠的狀態資訊以便於異常處理之後的恢復。為此，一些Unix工作站透過使用兩塊68000來解決虛擬記憶體問題。兩塊CPU的執行時鐘存在相位差。當第一塊遇到定址異常後，特殊的硬體會設法向第二塊發出中斷，以防止其也訪問錯誤地址。中斷例程在第二塊CPU上處理完記憶體換頁後，會按之前的狀態重啟第一塊CPU，從而再次使兩CPU同步。不過，以上這些問題在MC68010被徹底解決。在MC68010中，匯流排異常和地址錯誤均會使大量狀態資訊壓入系統棧，以便於之後的恢復。MOVE from SR也被修正為特權指令。原本用於訪問SR低端位元組的程式碼可由新指令MOVE from CCR取代。指令集細節.標準定址模式.68000提供多種定址模式，並統稱為有效定址有效定址。指令字尾.大部分指令都有表示操作長度的字尾：.B、.W或.L，分別表示這一操作在位元組上進行。運算的過程和結果都會受到字尾的影響。在運算過程中，只有屬於操作長度範圍的部分才會參與運算。比方說，執行MOVE.B D2,D1會把D1的最低一位元組複製到D2的最低一位元組處，而兩者的其餘位元組均不受影響。對於CCR，各標誌位的值會由操作長度的最高有效位決定。如果某次ADD.B使得結果的第7Bit位為1，則CCR的N位會置1；如果某次ADD.L使得結果的第7Bit位為1，並且第15Bit不為1，則CCR的N位不會置1。在後一種情況下，CCR的N位只受第15Bit，即一個字的最高有效位影響。另一個例子是在自增/自減定址中，自增/自減的長度因操作字尾而異。如果操作為MOVE.B，則自增/自減1；W為2；L為4。常用指令.大部分68000的指令都是二元的。目的運算元在前，源運算元在後。