return.gif返回部落格索引

簡介

0.jpg

截至撰寫本文時,Zilog Z80 處理器已於 50 年前,也就是 1976 年 7 月正式推出,距離人類最後一次踏上月球不到 4 年,數十年前於第二次世界大戰,距離現在的時間比距離第二次世界大戰還要近,約莫落在甘迺迪遇刺與柏林圍牆倒塌的中間點,比韓戰更接近 9/11,而 9/11 本身也已是四分之一世紀前的事件。(抱歉……)

該處理器極為成功,被廣泛應用於許多 8 位元微電腦,包括早期的個人電腦、家用及興趣用電腦,以及許多嵌入式、工業應用。

與其二進位相容的 8080 及 8085 共同促成了 8 位元微電腦的硬體事實標準,也讓 CP/M 與 Microsoft BASIC 成為軟體事實標準。

Z80 本身也衍生出許多相容晶片與架構,其中最著名的便是原版 GameBoy 所使用的 Sharp LR35902。Zilog 最終放棄了 16 位元與 32 位元的衍生架構,重新回歸以 Z80 為基礎的微控制器與變體,例如管線化且時脈更高的 eZ80,主要供工業應用持續使用。

我自己年紀太輕,沒有親身經歷家用電腦的時代(除了前述的 GameBoy 之外),但 Z80 在工業應用上的普及,意味著原版 Z80 至今仍持續被使用,直到 Zilog 才在兩年前正式停產。

我第一次接觸 Z80 是在青少年晚期,當時我在瀏覽一家電子公司的產品目錄,驚訝地發現它們仍在販售。於是我自行設計了一台小型 Z80 電腦,並說服學校老師讓我晚上使用相片實驗室來蝕刻 PCB。

1.jpg

由於幾位以前的老師對我在做什麼感到好奇,我聽到了許多關於老式家用電腦、遊戲主機,以及用保鮮盒裝著以線纏繞方式自製、執行 CP/M 與 WordStar、接上「借用」的 IBM 終端機來撰寫論文的有趣軼事。久而久之,我收到了許多從抽屜裡翻出的舊晶片,這些晶片後來都進入了我的 DIY 專案,包括一批 MCS-85 系列零件、數顆 Z80、8085、6502 與 6522。

整個過程讓我學到了許多系統工程方面的有趣經驗,也有一些意想不到的收穫(可靠的電源開啟重置 surprisingly 困難;撰寫連結器比撰寫組合器困難許多,撰寫編譯器其實是可以做到的事)。

無論如何,這就是我有資格回顧 Z80 的理由。雖然我原本只想根據自身經驗,針對 Z80 與其衍生自的 8080 做一些技術細節比較,後來卻一頭栽進 Computer History Museum 的口述歷史座談會,聽到參與者回憶更多關於這些晶片開發的軼事。「我想再寫一篇部落格文章」的想法,很快便膨脹成更大的規模。

從 2200 到 8008

曾經, Computer Terminal Corporation (CTC) 打造了一台新的可程式化終端機, Datapoint 2200,搭載以個別 TTL 晶片組成的 8 位元處理器。當時 Intel 正向 CTC 供應移位暫存器與記憶體晶片。

有人提議以客製化 IC 取代部分 TTL 堆疊,最後甚至考慮將整個 8 位元 CPU 放在單一晶片上。最終有兩家公司受託完成這項任務:德州儀器(Texas Instruments)與 Intel。

兩家公司都未能如期完成設計。當 Intel 準備好晶片時,原本依照系統命名慣例命名為 1201,CTC 已經開始銷售基於 TTL 設計的終端機。

CTC 的工程師也對晶片的效能感到不滿意,而且他們已經為下一代終端機修改了架構。

雖然 TI 最終放棄了他們的設計,Intel 卻繼續將其商業化,改名為 8008(與 4004 一樣,由行銷部門重新命名)。

8008 架構

        ___   ___
-9V ---|1  |_| 18|- IRQ
AD7 ->|2      17|- READY
AD6 ->|3      16|- CLK1
AD5 ->|4      15|- CLK2
AD4 ->|5      14|-> SYNC __
AD3 ->|6      13|-> S0     |
AD2 ->|7      12|-> S1      > State
AD1 ->|8      11|-> S2   __|
AD0 ->|9      10|-- +5V
       |_________|
         
A
B
C
D
E
H L
PC
C P Z S

8008 擁有 7 個暫存器:ABCDEHL。其中 A 是指定的累加器,其他暫存器可用作運算元或暫存。顧名思義,HL 共同組成記憶體指標的 High 與 Low 部分。記憶體存取透過第 8 個虛擬暫存器 M 進行,代表 HL 所指向的記憶體位元組。

處理器內部以幾個旗標位元追蹤 ALU 狀態(Carry、Parity、Zero、Sign),並可據此執行條件跳躍(包含呼叫與返回)。

程式計數器 PC 幾乎從不直接可見。有專用的函式呼叫與返回指令,但處理器使用 內部 的返回位址堆疊,深度為 8 層。原因是 Datapoint 2200 原本預計使用序列記憶體,若在記憶體中實作呼叫堆疊可能成為效能瓶頸。

記憶體位址寬度為 14 位元,另有獨立的 I/O 位址空間,共 32 個 I/O 埠(位址皆為立即值,並以位元方式塞入操作碼)。

中斷處理方面,有一條特殊的「restart」指令,可呼叫至位址空間開頭的 8 個位置(0x00、0x08、0x10、0x18、...、0x38)。位置索引以位元方式塞入 RST 操作碼。當中斷發生時,處理器會通知周邊裝置已收到提示,然後盲目執行資料匯流排上的內容,該內容最好是一條 RST 指令。

接下來事情變得有點棘手。CPU 沒有通用堆疊可供保存暫存器,所有記憶體存取都需要 HL,但你又不想在中斷處理常式中破壞 HL。解決方法是透過 I/O 匯流排上的外部鎖存器,作為暫存器使用。

總體而言,該架構相當簡潔,大約需要 3500 個電晶體,使用 DIP18 封裝。位址與資料多工,需要外部鎖存。內部解碼/執行狀態會被輸出,必須經過解碼才能驅動鎖存器並判斷處理器正在嘗試做什麼(讀取或寫入記憶體,或是 I/O 匯流排)。

處理器需要兩相位移的時脈訊號(運作於 500kHz)、+5V 正電源與 -9V 負電源。

從 8008 到 8080

Datapoint 2200 衍生而來的 8008 架構的缺點在開發期間就已知曉,以典型的工程思維,在開發尚未完成前,就已經有人提出改進架構的想法。

4004 專案被調來的 Federico Faggin 推動啟動改進版本的開發,但管理層堅持要先觀察市場對他們兩款微處理器的反應。競爭對手最終宣布正在開發自己的 8 位元設計,延遲讓 Intel 失去了總計 9 個月的領先優勢。

甚至在專案正式核准前,Federico Faggin 就已獲准從 Busicom 挖角 Masatoshi Shima 來參與 8080 設計。與 CTC 參與 8008 開發的方式類似,Busicom 也參與了 4004 的開發,原本是希望為其計算器打造客製化晶片組。

潛在客戶對 8008 的批評與回饋也影響了 8080 的設計,且很早就決定放棄二進位相容性。

8080 架構

A F
B C
D E
H L
SP
PC

8080 本質上擁有與 8008 相同的暫存器組,但以存在於記憶體中的外部堆疊取代內部返回位址堆疊,並透過堆疊指標暫存器(SP)存取。

堆疊指標可以與 HL 交換或移入/移出,暫存器可以成對推入或彈出堆疊。除了 HL 之外,其他暫存器對還有 BCDEAF(累加器與 ALU 旗標),但 8080 組合語言偏好將後者稱為「程式狀態字組」PSW

記憶體位址提升至完整的 16 位元,給予機器 64k 的位址空間。I/O 埠增加至 256 個。BCDE 現在也支援基本的間接定址(載入/儲存累加器),累加器與 HL 可以載入/儲存至立即定址的目的地。

新增了少數雙位元組算術運算,可對暫存器對進行運算(例如遞增/遞減),主要用於指標算術與 16 位元計數器。在 AF 上使用這些指令實際上會作用於 SP

中斷處理方式大致相同,使用 restart 指令,但新增了可在軟體中啟用/停用中斷的功能。有了明確的堆疊,也不再需要使用 I/O 硬體來保存暫存器。

以下是來自維基百科頁面稍作修改的記憶體複製範例,它會將 DE 指向的位元組複製到 HL,複製的數量由 BC 決定。

memcpy:
    PUSH    B           ; pushes BC
    PUSH    D           ; pushes DE
    PUSH    H           ; pushes HL

loop:
    LDAX    D           ; A := *(DE)
    MOV     M, A        ; *(HL) := A
    INX     D           ; ++DE
    INX     H           ; ++HL
    DCX     B           ; --BC

    MOV     A, B        ; A := B
    ORA     C           ; A |= C
    JNZ     loop        ; jump if not zero

    POP     H
    POP     B
    POP     D
    RET
    

這裡有幾點值得注意:作用於暫存器對的指令總是使用單一暫存器作為兩個暫存器的助憶符,「X」用來區分雙位元組遞增與單一位元組的「INC」。Intel 8080 組合語言的助憶符與操作碼幾乎是一對一對應,非常容易解析,讓組合器容易實作。但某種程度上,這是以降低人類可讀性為代價。

此外,雙位元組算術運算不會影響 ALU 旗標,它是一個獨立的運算區塊。在對 BC 進行遞減後,我們需要手動檢查兩個暫存器是否皆為零。

電氣介面

為了提升速度,8080 使用了 NMOS 邏輯。其缺點是 CPU 現在需要三種不同的電源電壓(-5V、+5V 與 +12V)。它仍然使用兩相位移的時脈訊號(電壓範圍在 9V 至 12V),使得晶片周邊的電路設計有點麻煩。

由於採用 40 腳封裝(Faggin 回憶這是一場 uphill battle),CPU 不再需要多工資料與位址線。但與 8008 一樣,它仍會將內部處理器狀態向外輸出,將實際的控制狀態多工在資料匯流排上,需要外部鎖存與解碼。

Intel 當然會販售用於狀態解碼、時脈產生等的支援晶片。此外,你可能還會想要購買中斷控制器,以及像是可程式化間隔計時器之類的晶片,至少用來驅動 DRAM 刷新,也許還會用到其中一顆方便的 Intel DMA 控制器。

Intel 至少解決了部分缺點,推出了只需要單一 5V 電源與單一 5V 時脈訊號的 8085。釋放出來的腳位提供了更多控制訊號。但仍然需要一些專用支援晶片。

Zilog 與 Z80

對在 Intel 的經驗感到不滿意,包括延遲以及為了讓 8080 專案獲得核准而與管理層不斷爭鬥,Federico Faggin 最終決定離開 Intel,與當時微處理器部門主管 Ralph Ungermann 共同創立自己的公司。

最初方向不明確,Faggin 一開始考慮設計微控制器,但後來發現對一家無晶圓廠的半導體新創公司來說,利潤太薄,無法經濟生產。

他最終決定設計 8080 的改進版本,暱稱「Super 80」,後來成為 Zilog Z80。他們從 Exxon 獲得資金,並將 Masatoshi Shima 從 Intel 挖角過來參與設計,後來團隊規模擴大到 11 人,負責布局、軟體模擬等工作。

Z80 的設計目標是與 8080 二進位相容,同時新增暫存器、定址模式、新指令,並從其他同時代產品如 6800 汲取靈感。它也致力於簡化電氣介面並提升速度。

從開發到第一個可運作原型,整個處理器的開發成本約為 40 萬美元,按時且在預算內完成(他們從 Exxon 獲得了 50 萬美元)。

Zilog 委託 Mostek 製造處理器(在與最初簽約的 Synertek 發生一些衝突後)。他們後來從 Exxon 獲得更多資金以建立自己的晶圓廠,但仍持續委託第二來源生產 Z80。

Z80 架構

A F A' F'
B C B' C'
D E D' E'
H L H' L'
IX
IY
SP
PC

Z80 完全與 8080 指令集二進位相容。

受到 6800 啟發,它新增了兩個索引暫存器 IXIY,可用來取代 HL(使用相同的編碼,但加上操作碼前綴),並支援立即偏移量。

AFBCDEHL 暫存器對可進行銀行切換,讓中斷處理更簡單且更快。

說到中斷,Z80 有三種不同的處理方式:與 8080 相容的方式(模式 0)、永遠呼叫至固定位置的方式(模式 1),以及透過呼叫表分派的方式(模式 2),使用匯流排上的數字作為索引。額外的暫存器用來定位記憶體中呼叫表的基底。

Z80 也新增了許多位元旋轉、位元測試與設定指令、BCD 算術,以及內建的迴圈指令(使用 BC 作為計數器)、自我重複的區塊傳輸、區塊比較與字串操作。

由於 Intel 聲稱對組合語言助憶符擁有著作權,Z80 最終使用了自己的組合語言,語法 arguably 更乾淨。Z80 組合語言更明確地表達運算元,並使用基本助憶符的多載變體。

以下是同樣的程式,使用更具表達力的 Z80 組合語言:

memcpy:
    PUSH    BC             ; full name of the register pair
    PUSH    DE
    PUSH    HL

loop:
    LD      A, (DE)        ; explicit 2 argument syntax
    LD      (HL), A
    INC     DE
    INC     HL
    DEC     BC

    LD      A, B            ; overloaded name
    OR      C
    JP      NZ, loop        ; overloaded name, condition is an argument

    POP     HL
    POP     BC
    POP     DE
    RET
    

當然,在 Z80 上,整個位元組複製迴圈也可以用單一條自我重複的指令取代:LDIR

改良的匯流排設計

Z80 只需單一 5V 電源與單一時脈訊號。8080 許多需要外部鎖存/解碼的狀態,現在都由晶片明確輸出,例如 MREQIORQ 表示記憶體或 I/O 存取,RD/WR 訊號明確表示讀取或寫入,以及 M1 訊號表示目前的記憶體存取是指令提取。這些訊號可以直接連接到單顆 74xx138 來驅動 (E)EPROM、某種 RAM 與 UART 控制器。將位址與資料線直接連接到 Z80,你基本上就擁有一台可運作的電腦!

如果使用的 RAM 是 DRAM,Z80 也可以處理 DRAM 刷新,使用內部刷新計數器,在指令解碼週期將其輸出到位址匯流排,並驅動控制線通知外部解碼邏輯進行 DRAM 刷新。

使用中斷模式 1(CPU 永遠呼叫至硬接線位置)時,簡單的設計可以不需要外部中斷控制器,只要將單一裝置連接到中斷腳位,或使用像是 74xx148(優先權編碼器)與鎖存器之類的簡單元件即可。

故事的後續發展

甚至在 Z80 於 1976 年 7 月正式發布前,16 位元 Z8000 架構的粗略設計工作就已經開始。Z8000 於 1979 年發布,晚於 Intel 8086,但早於 Motorola 68000。

與 8086 一樣,它使用分段記憶體,但與 8086 不同的是,它會在匯流排上輸出段號,由外部 MMU 晶片負責轉換為線性位址(並檢查邊界與權限)。

雖然 8086 指令集清楚可見 8080 的共同血統,但 Z80 的許多功能也被帶入,例如自我重複的區塊與字串操作,或迴圈指令。Z8000 MMU 的設計也影響了 286 16 位元保護模式基於描述元表的設計。

儘管 Zilog 將產品瞄準電腦導向市場,即使在微處理器仍被視為邏輯替換的早期,他們與 Exxon 的關係最終成為 IBM 選擇 Intel 8088 而非 Zilog 處理器作為 PC 處理器的原因之一。

Exxon 當初對 Zilog 感興趣的部分原因是他們打算建立自己的運算帝國,與 IBM 競爭。他們策略性投資了許多其他公司(例如打字機、文字處理器或印表機製造商),其中有些甚至設計了基於 Zilog 元件的產品,這些產品都在侵蝕 IBM 競爭產品的市占率。

與 Exxon 的密切關係最終也導致 Faggin 與 Ungermann 之間產生摩擦,後者於 1980 年 Zilog 成為 Exxon 全資子公司前離開 Zilog。

Zilog 最終於 1989 年從 Exxon 分拆出來,並於 1991 年上市,之後多次易手,在私募股權與實際電子公司之間來回,最終由 Littelfuse 擁有。

Z80 在作為嵌入式處理器歷經漫長生命後,終於在 2024 年 6 月停產。

連結與參考資料