return.gifBack to the Blog Index

はじめに

0.jpg

執筆時点で、Zilog Z80プロセッサは1976年7月に公式に発売されてから50年が経過しました。これは人類が最後に月面を歩いてから4年足らず、何十年も第二次世界大戦から現在よりも近く、ケネディ大統領暗殺とベルリンの壁崩壊のおおよそ中間点、朝鮮戦争から9.11(それ自体が4半世紀前に起きた出来事)よりも近い時期です。(すみません…)

このプロセッサは非常に成功し、多くの8ビットマイクロコンピュータで使用されました。初期のパーソナルコンピュータ、ホーム&ホビーコンピュータ、さらには多くの組み込み・産業用途にも採用されました。

バイナリ互換性を持つ8080および8085とともに、8ビットマイコンの事実上のハードウェア標準を形成し、CP/MやMicrosoft BASICという事実上のソフトウェア標準の確立に寄与しました。

Z80自体は、長年にわたり多くのクローンや派生アーキテクチャを生み出しました。オリジナルGameBoyに使用されたSharp LR35902はその代表例です。Zilog自身は最終的に16ビットおよび32ビットの派生アーキテクチャのラインを放棄し、産業用途での継続使用を主目的としたZ80ベースのマイクロコントローラや、eZ80のようなパイプライン化されクロック周波数を高めたバリエーションに戻りました。

私自身はホームコンピューティングの時代を直接体験するにはあまりにも若かった(前述のGameBoyを除く)ですが、産業用途での広範な使用により、オリジナルZ80はZilogがわずか2年前に生産終了するまで現役で使用され続けていました。

私が初めてZ80に出会ったのは、10代後半に電子部品メーカーのカタログを閲覧していたときでした。まだ販売されていることに驚き、自分で小さなZ80コンピュータを設計し、学校の先生を説得して夜間に写真現像室を使わせてもらい、PCBをエッチングしました。

1.jpg

いく人かの元教師が何をしているのか興味を持ったことで、私は古いホームコンピュータやコンソールに関する興味深い逸話をたくさん聞くことになりました。また、Tupperwareの箱に入ったDIYワイヤラップコンピュータがCP/MとWordStarを実行し、"借りてきた"IBM端末に接続されて論文を書くために使われたという話もありました。やがて私は埃の積もった引き出しから多くの古いチップを譲り受け、それらを自分のDIYプロジェクトに組み込みました。MCS-85部品、複数のZ80、8085、6502、6522などが含まれていました。

この経験は、システムエンジニアリングに関する多くの興味深い教訓と、予想外の教訓を私に与えてくれました(信頼性の高いパワーオンリセットは意外と難しい、リンカを書くのはアセンブラを書くよりもはるかに難しい、コンパイラを書くことは実際にできることだ)。

ともあれ、これがZ80について回顧することを許される私の主張です。元々は8080から派生したZ80を自分の経験に基づいて技術的な詳細に限定するつもりでしたが、結局Computer History Museumのオーラルヒストリー・パネルに没頭し、関係者たちがこれらのチップの開発に関するさらに多くの逸話を語るのを聞くことになりました。「またブログ記事を書こう」というアイデアはすぐに規模が膨らみました。

2200から8008へ

かつて、Computer Terminal Corporation (CTC)は、新しいプログラム可能な端末であるDatapoint 2200を製造していました。この端末は個別のTTLチップで構成された8ビットプロセッサを搭載していました。当時IntelはCTCにシフトレジスタとメモリチップを供給していました。

TTLの墓場の一部をカスタムICに置き換えるというアイデアが浮上し、最終的には8ビットCPU全体を単一チップに収めることを検討するに至りました。最終的にこのタスクのために2つの異なる企業が契約されました。Texas InstrumentsとIntelです。

どちらの企業も設計を間に合わせることができませんでした。Intelがチップを完成させたとき、体系的な命名規則に基づいて当初1201と名付けられたこのチップは、CTCがすでにTTL設計に基づく端末を販売している時期でした。

CTCのエンジニアたちはチップの性能にも不満を持っており、次世代端末のアーキテクチャもすでに変更していました。

TIが最終的に設計を中止したのに対し、Intelは自社バージョンを80084004と同様にマーケティングによって改名)として成功裏に商品化しました。

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つのレジスタがあります:ABCDEHLAは指定されたアキュムレータで、他のレジスタはオペランドまたはスクラッチとして使用できます。名前の示すように、HLはメモリポインタのHigh部とLow部を形成します。メモリへのアクセスは、HLが指すメモリバイトを表す8番目の擬似レジスタMを通じて行われます。

プロセッサは内部でALUの状態(Carry、Parity、Zero、Sign)をいくつかのフラグビットで追跡し、これらに基づいて条件付きジャンプ(コールとリターンを含む)を実行できます。

プログラムカウンタPCは直接見えることはほとんどありません。専用のファンクションコール&リターン命令がありますが、プロセッサは8レベル深さの内部リターンアドレススタックを使用します。この理由は、Datapoint 2200が元々シリアルメモリを使用する予定だったため、メモリ内のコールスタックがパフォーマンスのボトルネックになると考えられたためです。

メモリアドレスは14ビット幅で、合計32のI/Oポートを持つ別個のI/Oアドレス空間があります(アドレスは常に即値で、オペコードにビット詰めされます)。

割り込み処理では、8つのスロット(0x00、0x08、0x10、0x18、...、0x38)のいずれかにコールする特殊な「restart」命令があります。スロットインデックスはRSTオペコード自体にビット詰めされます。割り込みが発生すると、プロセッサは周辺機器にヒントを得たことを通知し、その後データバスの現在の内容を盲目的に実行します。その内容はRST命令である必要があります。

ここから少し複雑になります。CPUにはレジスタを安全に保存できる汎用スタックがなく、すべてのメモリアクセスにHLが必要ですが、割り込みハンドラでHLを上書きしたくはありません。これを解決するための意図された方法は、I/Oバス上の外部ラッチを通じてスクラッチレジスタとして機能させることでした。

全体として、このアーキテクチャはかなり単純で、約3500トランジスタを必要とし、DIP18パッケージを使用していました。アドレスとデータは多重化されており、外部ラッチが必要でした。内部のデコード/実行状態は外部に露出しており、ラッチを駆動し、プロセッサが何をしようとしているか(メモリまたはI/Oバスからの読み取りまたは書き込み)を判断するためにデコードする必要がありました。

プロセッサは2つの位相がずれたクロック信号(500kHzで動作)、+5V正電源、-9V負電源を必要としました。

8008から8080へ

Datapoint 2200由来の8008アーキテクチャの欠点は開発中にすでに知られており、典型的なエンジニアリングの慣習として、開発が完了する前から改善されたアーキテクチャのアイデアが投げかけられていました。

Federico Faggin4004プロジェクトから移り、改善版の開発を開始することを推進しましたが、経営陣はまず2つのマイクロプロセッサに対する市場の反応を見ることを主張しました。競合他社が最終的に自社の8ビット設計を発表し、遅延によりIntelは合計9ヶ月のリードタイムを失いました。

プロジェクトが最終的に承認される前でさえ、Federico FagginはMasatoshi ShimaBusicomから引き抜いて8080設計に取り組む許可を得ました。CTCが8008の開発に関与したのと多くの点で似ており、Busicomは4004の開発に関与し、元々は電卓用のカスタムチップセットを求めていました。

8008がデモンストレーションされた潜在的顧客からの批判とフィードバックも8080の設計に影響を与え、バイナリ互換性を放棄することが早期に決定されました。

8080アーキテクチャ

A F
B C
D E
H L
SP
PC

8080は本質的に8008と同じレジスタセットを持っていますが、内部リターンアドレススタックをメモリ上に存在しスタックポインタレジスタ(SP)を介してアクセスされる外部スタックに置き換えています。

スタックポインタはHLとの間で交換または移動でき、レジスタはペアでスタックにプッシュまたはポップできます。HL以外に、他のレジスタペアはBCDE、およびAF(アキュムレータとALUフラグ)ですが、8080アセンブリでは後者を「プログラムステータスワード」PSWと呼びます。

メモリアドレスは完全な16ビットに引き上げられ、マシンに64kのアドレス空間を与えます。I/Oポートは256に引き上げられます。BCDEは基本的な間接参照(アキュムレータのロード/ストア)を許可し、アキュムレータとHLは即値宛先にロード/ストアできます。

レジスタペアで動作するいくつかのダブルバイト算術演算が追加され(例:インクリメント/デクリメント)、主にポインタ算術と16ビットカウンタを可能にするためです。AFでこれらの命令を使用すると、実際にはSPに作用します。

割り込み処理はrestart命令を使用する点でほぼ同じ方法で動作しますが、割り込みをソフトウェアで有効/無効にできる機能が追加されました。明示的なスタックにより、I/Oハードウェアを使用してレジスタを保存する必要がなくなりました。

以下はWikipediaページから少し修正したメモリコピー例で、BCに格納されたバイト数をDEからHLにコピーします。

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
    

ここで注目すべき点がいくつかあります。レジスタペアに作用する命令は常にニーモニックとして両方のレジスタに単一のレジスタを使用し、「INX」の「X」は単一レジスタバイトの「INC」と区別するためのダブルバイトインクリメントです。Intel 8080アセンブリはニーモニックからオペコードへのほぼ1:1のマッピングを持ち、非常に解析しやすく、アセンブラの実装を容易にします。ある程度、これは人間の可読性を犠牲にしています。

さらに、ダブルバイト算術はALUフラグに影響を与えず、独立したファンクションブロックです。BCをデクリメントした後、両方のレジスタがゼロかどうかを手動で確認する必要があります。

電気的インターフェース

速度を向上させるため、8080はNMOSロジックを使用しました。これの欠点は、CPUが3つの異なる電源電圧(-5V、+5V、+12V)を必要としたことです。また、2つの位相がずれたクロック信号(9Vから12Vの範囲)を使用し続けたため、チップ周りの電気設計は少し面倒でした。

40ピンパッケージ(Fagginが承認を得るために uphill battle だったと回想するもの)のおかげで、CPUはデータラインとアドレスラインを多重化する必要がなくなりました。しかし8008と同様に、内部プロセッサ状態を外部に露出させ、実際の制御状態をデータバス上で多重化し、外部ラッチとデコードが必要でした。

Intelはもちろん状態デコード、クロック生成などのサポートチップを販売していました。さらに、割り込みコントローラやプログラマブルインターバルタイマ(DRAMリフレッシュを駆動するため)、および便利なIntel DMAコントローラのいずれかを使用することを望むかもしれません。

Intelは少なくとも一部の欠点を8085で解決し、単一の5V電源と単一の5Vクロック信号のみを必要としました。解放されたピンは追加の制御信号を露出させます。しかし一部の特殊なサポートチップは依然として必要でした。

ZilogとZ80

Intelでの経験、遅延、および8080プロジェクトの承認を得るための経営陣との uphill battle に不満を持ったFederico Fagginは、最終的にIntelを辞めてRalph Ungermann(当時のマイクロプロセッサ部門責任者)と一緒に自分の会社を立ち上げることを決めました。

当初は方向性が定まっていませんでしたが、Fagginは最初にマイクロコントローラの設計を検討しましたが、ファブレス半導体スタートアップにとってマージンが小さすぎて経済的ではないことに気づきました。

最終的に彼は8080の改善版を設計することに落ち着き、「Super 80」とニックネームが付けられ、後にZilog Z80となりました。Exxonから資金を確保し、IntelからMasatoshi Shimaを引き抜いて設計に取り組ませ、後にレイアウト、ソフトウェアシミュレーションなどを担当するチームを合計11人に拡大しました。

Z80の設計は8080とバイナリ互換性を保ちながら、レジスタ、アドレッシングモード、新しい命令を追加し、6800などの他の同時代機から着想を得ることを意図していました。また、よりシンプルな電気的インターフェースと8080よりも高い速度も目指しました。

最初の動作するプロトタイプまでのプロセッサ開発全体のコストは約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という2つのインデックスレジスタを追加しました。これらはオペコードプレフィックス付きでHLの代わりに使用でき、即値オフセットも使用できます。

AFBCDEHLレジスタペアはバンク切り替え可能で、よりシンプルで高速な割り込み処理を可能にします。

割り込みについて言えば、Z80には3つの異なる処理方法があります。8080互換方式(モード0)、常に固定位置にコールする方式(モード1)、コールテーブルを通じてディスパッチする方式(モード2)で、バスの番号をインデックスとして使用します。テーブルベースの位置を特定するために追加のレジスタが使用されます。

Z80はまた、ビットローテート、ビットテスト&セット命令、BCD算術、組み込みループ命令(BCをカウンタとして使用)、自己繰り返しブロック転送、ブロック比較、文字列演算を追加しました。

Intelがアセンブリニーモニックの著作権を主張したため、Z80は独自のアセンブリ言語を使用することになり、議論の余地はあるもののよりクリーンな構文になりました。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の外部ラッチ/デコードされた状態の多くはチップによって明示的に露出されます。例えばメモリまたはI/Oアクセスを示すMREQIORQ、まさに名前の示すことを示すRD/WR信号、現在のメモリアクセスが命令フェッチであることを示すM1信号などです。これらの信号は(E)EPROM、RAM、UARTコントローラを駆動するために単一の74xx138のようなシンプルなものに接続できます。アドレスラインとデータラインをZ80に直接接続すれば、本質的に動作するコンピュータが完成します!

使用中のRAMがDRAMの場合、Z80は内部リフレッシュカウンタを使用してDRAMリフレッシュも処理できます。このカウンタは命令デコードサイクル中にアドレスバスに配置され、外部デコードロジックにDRAMリフレッシュを行うよう指示する制御ラインをアサートします。

割り込みモード1(CPUが常にハードワイヤード位置にコールする)では、外部割り込みコントローラなしでシンプルな設計が可能です。単一のデバイスを割り込みピンに接続するか、74xx148(優先度エンコーダ)とラッチのようなシンプルなものを使用します。

その後の展開

Z80が1976年7月に最終的にリリースされる前でさえ、16ビットZ8000アーキテクチャの大まかな設計作業はすでに始まっていました。Z8000は1979年にリリースされ、Intel 8086の後、Motorola 68000の前でした。

8086と同様にセグメント化メモリを使用しましたが、8086とは異なりバス上にセグメント番号を露出させ、外部MMUチップがリニアアドレスに変換し(境界と権限をチェックする)ことを想定していました。

8080の共通遺産は8086命令セットに明確に見られますが、Z80の機能のいくつかも引き継がれました。例えば自己繰り返しブロックと文字列演算、ループ命令などです。Z8000 MMUの設計は286の16ビットプロテクトモードのディスクリプタテーブルベースの設計にも影響を与えました。

Zilogがコンピュータ指向の市場をターゲットにしていたにもかかわらず、マイクロプロセッサがロジック置換と見なされていた初期の段階でさえ、ExxonとのつながりがIBMが自社PCにZilogプロセッサを採用せず、Intel 8088を選択する一因となりました。

Exxonが最初にZilogに興味を持った理由の一部は、IBMに対抗する独自のコンピューティング帝国を構築する意図でした。彼らは戦略的に投資した他の企業(例:タイプライター、ワードプロセッサ、プリンタメーカー)があり、その中にはZilog部品を基にした製品を設計した企業もあり、すべて競合するIBM製品の市場シェアを侵食していました。

Exxonとの緊密なつながりは最終的にFagginとUngermannの間の摩擦を引き起こし、後者は1980年にZilogが完全なExxon子会社になる前にZilogを去りました。

Zilogは1989年にExxonから分離し、1991年に株式公開し、その後何度か所有者が変わり、プライベートエクイティと実際の電子機器会社の間を行き来し、現在はLittelfuseの所有となっています。

Z80は組み込みプロセッサとして長く使用された後、2024年6月に最終的に生産終了となりました。

リンクと参考文献