Zilog Z80発売50周年
(goliath32.com)- 1976年7月に発売された Zilog Z80 は、パーソナル/ホビー向けコンピュータから組み込み・産業機器まで広く使われ、8ビットマイクロプロセッサ時代を代表する存在となった
- Intel 8080とのバイナリ互換性を維持しつつ、レジスタ、アドレッシング、命令、割り込み機能を拡張し、電気的接続はよりシンプルに設計された
- 8008の制限のあるスタックと14ビットアドレス空間は、8080でメモリスタックと16ビットアドレス空間へ改善され、Z80はそこにインデックスレジスタ、代替レジスタバンク、ブロック命令を追加した
- 単一5V電源・単一クロックと MREQ・IORQ・RD・WR 制御信号、内蔵DRAMリフレッシュにより、少ない周辺チップでコンピュータを構成できた
- Z80ファミリはGame BoyのSharp LR35902やeZ80など多くの派生製品を生み、オリジナルのZ80は長い産業用途での寿命を経て 2024年6月に生産終了 となった
Datapoint 2200からIntel 8008へ
- Computer Terminal Corporation(CTC)は、個別TTLチップで作られた8ビットプロセッサを搭載した Datapoint 2200 プログラマブル端末を開発した
- TTL回路の一部をカスタムICに置き換える計画は、CPU全体を単一チップに収める方向へ拡大し、Texas InstrumentsとIntelがそれぞれ設計を担当した
- 両社とも期限内に設計を完成できず、Intelのチップが準備できた時点でCTCはすでにTTLベースの端末を販売していた
- CTCのエンジニアはチップ性能にも満足しておらず、次世代端末のアーキテクチャも変更済みだった
- TIは設計を中止したが、Intelは当初 1201 だった製品をマーケティング名の 8008 に変更して商用化した
8008の構造と限界
- 8008は A・B・C・D・E・H・L の7つのレジスタを提供する
- Aはアキュムレータで、HとLはメモリポインタ HL を構成する
- 擬似レジスタMは、HLが指すメモリバイトを表す
- ALU状態はCarry・Parity・Zero・Signフラグとして保持され、条件付きジャンプ・呼び出し・復帰に使われる
- プログラムカウンタは直接扱いにくく、関数呼び出しにはプロセッサ内部の 8段の復帰アドレススタック を使用した
- Datapoint 2200がシリアルメモリを使う予定だったため、メモリベースの呼び出しスタックがボトルネックになり得るとの判断による設計だった
- メモリアドレスは14ビットで、別アドレス空間に 32個のI/Oポート を提供する
- 割り込みが発生すると、周辺機器がデータバスにRST命令を載せ、CPUがそれを実行する
- RSTはアドレス空間先頭部の8つのスロットのいずれかを呼び出す
- 汎用メモリスタックがなく、すべてのメモリアクセスにHLが必要なため、割り込み処理中にレジスタを保存するには、I/Oバス上の外部ラッチを一時レジスタとして使う必要があった
- 約 3,500個のトランジスタ とDIP18パッケージを使用し、アドレスバスとデータバスを多重化していた
- 外部回路がバスをラッチし、CPUの内部状態信号を解釈する必要があった
- 500kHzの位相の異なる2つのクロックと、+5V・-9V電源が必要だった
8008から8080へ
- 8008の開発が終わる前から限界を改善する議論は始まっていたが、Intel経営陣はまず市場の反応を確認しようとした
- Federico Faggin は改良型の開発を推進したが、競合の8ビット製品発表まで待った結果、Intelは9か月の先行期間を失った
- Fagginはプロジェクト承認前からBusicomの Masatoshi Shima を招聘し、8080設計に投入した
- 潜在顧客が8008のデモで寄せた批判やフィードバックも反映し、初期段階から8008とのバイナリ互換性を放棄することを決めた
8080アーキテクチャ
- 8080は8008と似たレジスタ構成を維持しつつ、内部の復帰アドレススタックをなくし、SPが指すメモリスタック を導入した
- BC・DE・HL・AFレジスタペアをスタックにプッシュ/ポップできる
- IntelアセンブリではAFをプログラムステータスワードである PSW と呼ぶ
- アドレス空間は16ビットの 64KB、I/Oポートは256個に増えた
- BCとDEによる限定的な間接アクセスが可能になった
- アキュムレータとHLを、即値で指定したアドレスから読み出したり保存したりできる
- レジスタペアのインクリメント/デクリメントなど16ビット演算が追加され、ポインタ計算と16ビットカウンタを扱えるようになった
- この演算ブロックはALUフラグに影響しないため、BCをデクリメントしたあと2バイトがともに0かどうかを別途検査する必要がある
- 割り込みはRSTベースの方式を維持しつつ、ソフトウェアで有効化・無効化できるようになった
- 明示的なメモリスタックにより、レジスタ保存用のI/Oハードウェアは不要になった
- Intel 8080アセンブリはニーモニックとopcodeがほぼ1対1で対応し、アセンブラ実装は容易だった が、人間が読むには不便なこともあった
- レジスタペア命令は片方のレジスタ名だけを使い、INXのXで単一バイトのINCと区別する
8080の電気的インターフェース
- 速度を高めるためNMOSロジックを使用し、-5V・+5V・+12V の3電源と位相の異なる2つのクロックが必要になった
- 40ピンパッケージによりアドレス線とデータ線は分離されたが、制御状態の一部をデータバスに多重化していたため、外部ラッチとデコーダは依然として必要だった
- Intelは状態デコードとクロック生成のためのサポートチップを販売し、システムによっては割り込みコントローラ、タイマ、DMAコントローラも必要だった
- プログラマブルタイマは、少なくともDRAMリフレッシュの駆動に活用できた
- 後継の 8085 は単一5V電源と単一5Vクロックを使い、一部の制御信号を追加したが、それでも専用サポートチップが必要だった
Zilog設立とZ80開発
- 8080プロジェクトの承認遅延とIntel経営陣との対立に不満を感じたFagginは、マイクロプロセッサ部門責任者の Ralph Ungermann とともにIntelを離れ、会社を設立した
- 当初はマイクロコントローラを検討したが、ファブレス半導体スタートアップが担うにはマージンが低いと判断した
- その後、8080の改良型である Super 80 を設計することにし、この製品がZilog Z80へとつながった
- Exxonから資金を確保し、ShimaもIntelから招聘した
- レイアウトやソフトウェアシミュレーションなどを担当するチームは計11人に拡大した
- 目標は8080とのバイナリ互換性を維持しながら、レジスタ、アドレッシング方式、命令を追加し、6800のような同時代プロセッサの特徴を取り入れることだった
- 8080より高速で、電気的接続を単純にすることも目標とした
- 動作する最初のプロトタイプまでに約 40万ドル がかかり、Exxonから確保した50万ドルの予算より少ない費用でスケジュールを満たした
- 生産は当初契約したSynertekとの対立後、Mostek に依存した
- その後Exxonの追加投資で自社ファブを建設したが、Z80の複数供給は継続した
Z80アーキテクチャの拡張
- Z80は 8080命令セットと完全にバイナリ互換 である
- 6800に着想を得た16ビットインデックスレジスタIXとIYを追加した
- opcodeプレフィックスを使ってHLの代わりに使うことができ、即値オフセットもサポートする
- AF・BC・DE・HLレジスタペアには代替バンクがあり、割り込み処理時に高速に切り替えられる
- 割り込みは3つのモードを提供する
- モード0は8080互換方式である
- モード1は常に固定アドレスを呼び出す
- モード2はバス上の値をインデックスとして使い、呼び出しテーブルへ分岐し、別レジスタがテーブルのメモリ基準アドレスを指定する
- ビットの回転・検査・設定、BCD演算、BCをカウンタとして使う反復命令、ブロック転送・比較・文字列演算を追加した
- バイトコピーのループ全体を、自己反復命令である LDIR 1つに置き換えられる
- Intelがアセンブリニーモニックの著作権を主張したため、Z80は独自の構文を採用した
- オペランドをより明示的に書き、基本ニーモニックをオーバーロードして、8080構文より読みやすく構成した
シンプルになったバス設計
- Z80は 単一5V電源と単一クロック だけを必要とする
- 8080で外部回路がラッチして解釈していた状態を、専用信号として直接提供する
- MREQとIORQはメモリ/I/Oアクセスを区別する
- RDとWRは読み出し/書き込みを表す
- M1は現在のメモリアクセスが命令フェッチであることを知らせる
- アドレス線とデータ線を直接接続し、74xx138を1つ使ってEEPROM・RAM・UARTを選択する程度の回路だけで、基本的なコンピュータを作れる
- 内部リフレッシュカウンタが命令デコード周期中にアドレスバスへ値を出力し、制御線を有効にして DRAMリフレッシュ を処理する
- 割り込みモード1を使えば、外部割り込みコントローラなしで単一デバイスを割り込みピンに接続できる
- 複数デバイスは74xx148優先順位エンコーダとラッチのような単純な回路で処理できる
Z80以後の展開
- Z80が1976年7月に発売される前から、16ビット Z8000 の初期設計が始まっており、製品はIntel 8086の後、Motorola 68000の前にあたる1979年に発売された
- Z8000は8086のように分割メモリを使ったが、セグメント番号をバスに出力し、外部MMUが線形アドレス変換と範囲・権限チェックを担当した
- 8086命令セットには8080の系譜とともに、Z80の自己反復ブロック・文字列・ループ命令の特徴も反映された
- Z8000のMMU設計は、286の ディスクリプタテーブルベースの16ビット保護モード にも影響を与えた
Exxon、IBM PCとZilogの変化
- Zilogは、マイクロプロセッサが論理回路の代替品と見なされていた時期からコンピュータ市場を狙っていたが、Exxonとの関係は、IBMがPCにZilogではなく Intel 8088 を選んだ理由の1つとなった
- ExxonはIBMに対抗する独自のコンピューティング事業群を作ろうとし、タイプライター、ワードプロセッサ、プリンタメーカーなどに戦略的に投資した
- その一部はZilog部品ベースの製品を設計し、IBM製品の市場シェアを侵食した
- Exxonとの緊密な関係はFagginとUngermannの間にも対立を引き起こし、UngermannはZilogが1980年にExxonの完全子会社となる前に退社した
- Zilogは1989年にExxonから再び分離され、1991年に上場した
- その後、プライベートエクイティと電子企業の間で何度も所有者が変わり、現在は Littelfuse が所有している
- Z80は長期間にわたり組み込みプロセッサとして使われた後、2024年6月に生産終了 となった
個人的なZ80体験と長期的影響
- Z80とバイナリ互換の8080・8085は、8ビットマイクロコンピュータの事実上のハードウェア標準形成に貢献し、CP/MとMicrosoft BASIC が事実上のソフトウェア標準として定着する基盤となった
- Z80は初期のパーソナルコンピュータ、家庭用・ホビー向けコンピュータ、さまざまな組み込み・産業システムに使われた
- 初代Game Boyの Sharp LR35902 をはじめ、クローンや派生アーキテクチャも登場した
- Zilogは16・32ビット派生製品群を断念した後、パイプラインと高クロックを採用した eZ80 など、Z80ベースのマイクロコントローラへ回帰した
- 10代後半、電子部品カタログでまだ販売されていたZ80を見つけて小型コンピュータを設計し、夜に学校の写真室を借りてPCBをエッチングした
- 教師たちから、古い家庭用コンピュータやコンソール、Tupperwareの箱の中にワイヤラッピングで作られCP/M・WordStarを実行したコンピュータなどの体験を聞いた
- MCS-85部品とZ80・8085・6502・6522チップも譲り受け、自作プロジェクトに使った
- この過程で、安定したパワーオンリセットは予想以上に難しいこと、リンカはアセンブラよりはるかに実装が難しいこと、個人でもコンパイラを実際に作れることを学んだ
1件のコメント
Hacker News のコメント
1978年にアセンブリ言語でプログラミングを始め、ソフトウェアだけでなくハードウェアの動作原理も知りたかった。
Z80キットを組み立てたあと、ロジックプローブとオシロスコープでデジタル電子工学を学び、マニュアルを読み込んで命令セットを覚えた。今ではもう70歳近いが昨日のことのように鮮明で、Z80は本当に素晴らしいCPUだった。
授業も本もなしにROMを逆アセンブルし、Motorolaのサマリーカードを参照しながら独学したが、その後いくつものスタートアップを創業し、成功したキャリアを築いた。コンピュータを最下層の第一原理から学ぶことには、今なお代替できない価値がある。
NANDゲートで基本回路を作り、機能ユニットと命令デコーダを組み合わせてチューリング完全なアーキテクチャを構築し、自分で定義したアセンブリ言語でプログラミングするデジタル論理シミュレーションゲーム。新しいオペコードが必要なら自分で実装でき、難しいが大きなやりがいがある。正式リリースが近づいており、予告編も公開されている。
FORK86-64のようなものを出してくるところを見てみたい。12歳のとき、テレビ番組「Klein Microcomputer Sebstgebaut und Programmiert」のキットでZ80コンピュータを組み立てた。
Märklinの変圧器を電源に、Telefunkenのテープレコーダーをデータ保存装置として使い、月着陸船ゲームをZ80機械語で入力したあと、プログラムを失うのが怖くて2週間電源を切らなかった。
ZX Spectrumの1980年代に戻ったような感じで、当時128KB RAMは手の届かないぜいたく品だった。今とも少し似ている。
https://spectrumcomputing.co.uk/entry/2000237/Book/Mastering...
http://www.primrosebank.net/computers/zxspectrum/docs/Comple...
ZX-81のユーザーマニュアル末尾にあるZ80命令リファレンス表を見て、何も理解できなかった記憶がある。BASICのような高水準の抽象化とは違い、CPUが実際にプログラムを実行する仕組みを把握するまでかなり時間がかかった。
JPはGOTO、CALLはGOSUB、CPはIF、JP ZはTHEN GOTO、LDはLETに対応していた。「Z80は8080命令セットと完全にバイナリ互換である」という表現は、フラグレジスタまで考慮すると正しくない。一部の演算でパリティフラグの動作が異なっていた。
また、8080の未定義オペコードを利用したプログラムは任意の方法で実行され得たが、Z80はそのオペコードを新しい命令に再利用した。
そのおかげでパリティフラグをオーバーフローフラグとして再利用でき、これは非常に有用な拡張だった。Datapoint 2200、Intel 8008、Intel 8080、RISC-Vは、ハードウェアがオーバーフローを検出しない珍しい命令セットだが、単純で安価な初期設計とは違ってRISC-Vには言い訳の余地がなく、これが最大の失敗だと思う。
1983年初め、TRS-80 Model IでZ80アセンブリ言語によるプログラミングに入門した。Bill Bardenの本と、80 Micro誌に載っていたHardin Brothersの連載「The Next Step」が道を開いてくれ、その当時の経験をこの記事にまとめた。
子どもにも理解できるほど明快で最初から最後まで読んだ。実際にZ80を触ったことはなかったが、6502や8051・PICのような初期のマイクロコントローラも難なく理解する土台になった。今でも現代のマイクロプロセッサをZ80になぞらえて理解しているように思うし、普通の人が全体を把握できるほど単純な8ビットマイクロプロセッサの学習をおすすめする。
高級言語コンパイラは高価で、シェアウェアも今日のオープンソースほど簡単には手に入らなかった時代にZ80で始めた。マシンに何をさせているのかを理解するには、誰でもアセンブリ言語を少しは学ぶべきで、Z80は推論するのに十分単純だった。
35年前は、プログラムを手でアセンブルして16進の機械語をボードに入力しなければならなかった。それを楽にするために自分でアセンブラを書き、その経験が開発ツール分野を経て主要なC++コンパイラの作業につながった。
今も米国の学生数百万人が使っており、BASICでプログラミングできるTI-84電卓が抜けている。白黒モデルはZ80、カラー画面モデルはeZ80を使っている。
友人たちとTI-BASICで小さなプログラムを作って見せ合い、多くの時間を過ごしたが、Z80アセンブリ言語までは学べなかった。TI-84 Plus用のZ80アセンブリ言語マニュアルを全部印刷して読み始めたが、まだ1行も書けていない。