ZigでChip-8エミュレーターをつくる

カテゴリー: PC
投稿日:
更新日:
書いた人: 山椒ねこまんま

ファミコンのエミュレーターをつくろうと思って調べていたところ「Chip-8 から始めるのがおすすめだよ」という記載を見つけたのでやってみます。

Chip-8について

Chip-8は4KiBのRAMと64x32のディスプレイ、16のキー入力をもつミニマムな仮想ゲームマシンです。 日本だと知名度が低いですが、海外だとエミュレーター入門の題材や、マイコンにのせて自作ゲーム機をつくったりと結構ポピュラーらしいです。

つくる

今回プログラミング言語として Zig を選んでみました。

ZigはポストC言語としてここ数年注目されている言語で、Null安全とエラーハンドリングが生えたC言語みたいなものらしいです。 未だベータ版ながら Bun に使用されていたりとなかなか面白い。

前々から「使いたいな〜」と思っていたのでちょうどいい機会だと思い、今回使ってみました。


さて、詳細な作り方の説明をする… つもりだったのですが、
ガイドがとてもわかりやすかったことと、Chip-8の仕様がシンプルだったこともあり、「別に書かなくてええか」となったので割愛させていただきます。

Cowgod's Chip-8 Technical Reference をメインに進め、よくわからないところを Guide to making a CHIP-8 emulator で補えば基本困ることはないと思います。 補足するところは命令の格納方式がビッグエンディアンなことくらいですかね。


一番大変だったのは「画面と音をどう出すか」とか「キー入力がきれいに読めない」とかの、Chip-8の仕様の外 のことでした。

Zig用の画面描画ライブラリはいくつかあるのですが、バージョン制約が厳しかったりドキュメントがなかったりでうまく使えず。
結局ビット列としてファイルに書き出してPythonから読み込むという力技で解決しました。 この方式ならほとんど全ての言語で使えるので、困った時の最終手段としておすすめです。

Chip-8の外のもろもろだけやったものを GitHub にアップしておいたので、Zigでやってみたいという方はよかったらどうぞ〜

こんな感じで矢印キー入力に応じて動き、y座標に応じて音の高さが変わります。

追記 (2025/12/28):いろいろあってテンプレートを改良しました。 詳しくはこちら

ROMを実行してみる

できたら早速ROMを実行してみましょう!

ROMは「Chip-8 IBM ROM」や「Chip-8 public domain ROM」で検索するとたくさん見つかります。 ただ、説明や使い方が見当たらなかったので実行画面つきで簡単にまとめてみました。

キーはキーボード左側の
1234
QWER
ASDF
ZXCV
に割当てた想定です。

IBM

IBMと表示されるだけです。 基本的な命令の確認に使うみたい。

15PUZZLE

4x4のスライドパズルです。 対応する位置のキーが空白になります。

BLINKY

パックマン風のゲームです。

Aで左 / Sで右 / 3で上 / Eで下

BLITZ

爆弾を落としてビルを破壊するゲームです。

1で開始 / Wで爆弾を投下

BRIX

ブロック崩しです。

Qで左 / Eで右

CONNECT4

下から積んでくタイプの丸バツゲームです。 先に4つを一列に揃えた方が勝ち。 判定はありません。

Qで左 / Eで右 / Wでドロップを設置

GUESS

1から63から1つ選び、それが表示されていれば Yes を、なければ No を選ぶのを繰り返すと数字を当ててくれます。

Wで Yes / それ以外で No

HIDDEN

神経衰弱です。

Qで左 / Eで右 / 2で上 / Sで下 / Wでめくる

INVADERS

インベーダーです。

Qで左 / Eで右 / Wで射撃

KALEID

万華鏡みたいなパターンを生成してくれます。

Qで左 / Eで右 / 2で上 / Sで下 / Xで反復

MAZE

自動で迷路みたいなパターンを生成してくれます。

MERLIN

点滅パターンを覚えて再現する脳トレです。

QW
AS
がそれぞれのタイルに対応しています。

MISSILE

自動で動く銃で球を打って当てるゲームです。

Sで射撃

PONG

ポンです。 エアホッケーみたいなゲームです。

プレーヤー1: 1で上 / Qで下
プレーヤー2: 4で上 / Rで下

PUZZLE

4x4のスライドパズルです。

Eで左 / Qで右 / 2で上 / Sで下のタイルが移動します。

SYZYGY

壁や体にぶつからずにリングをくぐって蛇を長くするゲームです。 「スリザリオ」というとピンとくるかもしれませんね。

Vで開始 / Aで左 / Sで右 / 3で上 / Eで下

TANK

シューティングゲームです。

Qで左 / Eで右 / Sで上 / 2で下 / Wで発射

TETRIS

テトリスです。

Wで左 / Eで右 / Qで回転 / Aで落下

TICTAC

丸バツゲームです。

123
QWE
ASD
がそれぞれのマスに対応しています。

UFO

15発で何点取れるかを競うシューティングゲームです。

Qで左 / Wでまっすぐ / Eで右に球を飛ばします。

VERS

壁にぶつかったら負けの2人対戦ゲームです。

プレイヤー1: 1で左 / 2で右 / Aで上 / Zで下
プレイヤー2: Cで左 / Vで右 / 4で上 / Rで下

WIPEOFF

ブロック崩しです。

Qで左 / Eで右



というわけで、ZigでChip-8のエミュレーターを作ってみました。 初めてのエミュレーター制作だったのでなかなか楽しかったです!

Chip-8はシンプルながらテトリスやインベーダーを動かすことができ、しっかり遊べるので確かに初めてのエミュレーターにはピッタリだなと思いました。 「エミュレーター制作に興味はあるけど何から始めたらいいのかわからない…」そんな方はぜひ挑戦してみてはいかがでしょうか!


正しく作れているかはいまいち確証は持てていませんが、ソースコードは GitHub にあげてあるのでよかったらどうぞ〜


アプリなどを作ったりしています! よかったらみていってください→ つくったもの
今のイチオシ↓

山椒ねこまんま
山椒ねこまんま

個人アプリ開発者、ブロガー。

UKキーボードのためだけにMacを選んでいる。