GoでCHIP-8 Emulatorを書いた

GoでCHIP-8 Emulatorを書いた

GoでCHIP-8のエミュレーターを実装しました(masu-mi/gochip-8)。コンテナイメージもkoで生成してDocker Hubに準備しました。 wikipediaから辿れるここを仕様の確認に使っています。ビープ音は未実装です。

chip-8-term --color 6 --rom 'path-to-rom' という感じで使えます。詳しくはREADMEとヘルプで確認できます。

感想

子育てと仕事の合間で1週間+αで作れました。難しくないし動くと嬉しいしで良い車輪の再発明でした。

使ったnsf/termbox-goはメンテナンスが予定されてないので時間があればdgamore/tcellに置き換えたい。こちらならビープ音もすぐに実装できそう。

スプライトの一部の仕様を読み飛ばしてしまい勝手に悩んでしまった。 ttyはキャラクタストリームなので、ttyをベースに実装するとキーボードの状態は扱えない。だからキーボードのキーが押されてるか判断する命令の実装で悩んだ。 結局、ttyからのイベント受信を元に数msが押されてる判定が続く仮想キーボードを作った。

最後に[ESC]でプログラム終了するためにcore.Cpuなどにcontext.Contextを渡すように変更しました。

1
2
3
func (chip *Chip8) Run(ctx context.Context) {
	chip.Cpu.Run(ctx, chip.Memory, chip.Display, chip.Keyboard, chip.Buzzer)
}

contextが標準ライブラリなためドメイン部分にトランザクションやアプリケーション状態を違和感なく渡せるので嬉しいですね。 今回はCPUとかChipの動作状況がアプリケーションに依存するのを標準ライブラリのインタフェースで逆転できてます。

chip-8-termというコマンド名にしたけど、なぜgochip-8にしなかったのか。。

gochip-8に変えました

comments powered by Disqus