Z80で自作PCするための調査

に公開

最近は趣味・業務共に Claude CodeCodex CLI などのコーディングエージェントを使って開発を行うことが多くなってきました。
コーディングエージェントはたまに失敗することもありますが、コーディング速度が圧倒的に早く、見ていて面白いところがあります。

そんな中、趣味ではもう少し趣向性の高いプログラミングをやってみたくなりました。

今回はそれを叶える実行環境として、以前から気になっていた Z80 をベースにしたコンピューターについて調査してみます。

個人的には、コンパイラが一般的ではなかった時代にハンドアセンブルでコンピューターを動かすという体験にとても憧れがあり、それを目指したいと思っています。
メモリ価格も高騰しているのでZ80ベースでの自作PCもアリではないでしょうか。


Z80エミュレーターで動作を試す

まずは実機を検討する前に、Z80 のエミュレータを使って Z80 を体験してみることにします。
z80pack というリポジトリが、アセンブラや Z80 のエミュレータなど一通り揃っていて便利そうなので使ってみます。

Hello World を動かす

; Bare-metal hello world for z80sim
; Uses port 1 for console output; stops with HALT
        org     0000h

start:
        ld      hl, message
loop:
        ld      a, (hl)
        cp      '$'
        jr      z, done
        out     (1), a          ; write char to console
        inc     hl
        jr      loop

done:
        halt                    ; stop CPU after printing

message:
        db      'Hello from z80sim!', 13, 10, '$'

アセンブルと実行

# Hello World HEX を生成
./z80asm/z80asm -fh -oz80sim/HELLO-Z80SIM.HEX z80sim/hello_z80sim.asm

# 実行
./z80sim/z80sim -x z80sim/HELLO-Z80SIM.HEX

実行結果:

z80sim では IO ポート 1 がコンソール出力に割り当てられているようで、
A レジスタの値を out (1), a することで標準出力ができました。

Hello World をしただけですが、なかなか面白いです。


Z80のハードウェアについて調査

今回は基板への実装がしやすい DIP・40pin の Z80 を採用することにします。
Z80 のピンアサインは大まかに次の4つのグループに分けられます。

  1. アドレスバス(A0–A15)
  2. データバス(D0–D7)
  3. 各種制御信号
  4. 電源・クロック

アドレスバス(A0–A15)

80 は 16 ビットのアドレスバスを持ち、
A0〜A15 の 16 本の信号線で最大 64 KiB のアドレス空間を指定します。
右側の A0〜A10/左側のA11〜A15という形で2つのまとまりに分かれて配置されています。
どのピンも出力専用で、CPUからメモリやIOデバイスに対して「いまアクセスしている番地」を伝える役割があります。

データバス(D0–D7)

データバスはD0〜D7の8本で構成され、CPUとメモリ/IOデバイス間でデータをやり取りするために使われます。データバスは双方向で、CPUが読み書きするときだけ有効になります。

制御信号

アドレスとデータだけでは「何をしたいのか」が分からないため、Z80は多くの制御ピンを持っています。主なものは次の通りです。

  • MREQ / IORQ:メモリ/I/O アクセスの区別
  • RD / WR:読み出し/書き込み
  • M1:命令フェッチサイクル
  • RFSH:DRAM リフレッシュアドレス出力中
  • RESET:一定時間 Low で CPU を初期化
  • INT / NMI:割り込み(マスク可/不可)
  • WAIT:外部がウェイトを要求
  • BUSRQ / BUSACK:DMA がバスを占有する際のハンドシェイク

電源・クロック

  • VCC(+5V)
  • GND
  • CLK(クロック入力)

これだけのピンへうまく配線をして、動作させるのはかなり大変なように感じますが、アドレスバスへLEDを接続しタイマーIC555でクロックを入力することで、Z80の動作を確認する方法もあるようです。
https://www.youtube.com/watch?v=9arsE2lfd2c

既存の Z80 コンピューターを調査

Z80を採用しているコンピューターで、パッと思いつくのはPC-8001ZX Spectrumがあります。
これらは、モニターと接続してコーディングを行う(RaspberryPi 400みたいなスタイル)ことができますが、僕の理想としては持ち運びが出来てそれ単体で遊べることを目指したいです。

調べてみると、CPUはZ80では無く8080互換なのですがTK-80というのがあり、これがかなり作りたいものの形として理想でした。アドレス・データの表示と16進+コマンドキーという必要最低限といったコンピューターの構成ですがコンパクトに実現できそうです。
これにアドレスバス表示や制御可能なLEDや、ストックしてあるけど使えてないニキシー管などが使えると見てて楽しいものになりそうです。

今回の調査はここまでになりますが、次回は秋月電子でセールされていたAKI-80を実際に動かしたり、Z80+タイマーIC555でNOPを観測したりできたらと思います!

ちゅらデータ株式会社

Discussion