RubyKaigi 2022 参加記 #10 - Megaruby - Running mruby/c programs on Sega Mega Drive (Day 3)
こんにちは!Wantedlyでエンジニアをしている江草です。
今回は、日本最大の Ruby に関するカンファレンスである RubyKaigi に Wantedly がスポンサードし、いくつかの講演を聴講しています。
本記事では、3日目の Megaruby - Running mruby/c programs on Sega Mega Drive について紹介します。
Megaruby - Running mruby/c programs on Sega Mega Drive
RubyKaigi 公式ページ: https://rubykaigi.org/2022/presentations/yujiyokoo.html
リポジトリ: https://github.com/yujiyokoo/mega-mrubyc
この発表は、 mruby/c を Mega Drive 上で動かすという内容でした。
まず、発表スライド自体が Mega Drive で動くソフトウェアとして実装されていて、 Mega Drive の実機を持ち込んで発表しているようでした。SD カードから発表用のソフトウェアを起動すると、「RUBY」の文字が画面に表示されて会場が盛り上がっていました。
Mega Drive とは
Mega Drive とはセガが1988年に発売したゲーム機です。簡単に Mega Drive のハードウェアの仕様を紹介します。
- CPU
- Motorola 68000
- Z80(主にサウンドの制御に使われる)
- メモリ
- 64KB
- Video Display Processor(画面を描画するためのプロセッサ)
mruby と mruby/c
mruby とは組み込み向けの軽量な Ruby 実装です。今回の発表では、 mruby よりもさらにメモリ使用量が削減された Ruby 実装である mruby/c が使われていました。
なぜ Mega Drive なのか
以下の3つの理由から Mega Drive で Ruby を動かすことを選んだそうです。
- SGDK というオープンソースの dev kit が存在する
- 互換機やエミュレーターが存在する
- アクティブなプロジェクトがたくさん存在する
mruby/c を Mega Drive で動かす際の難しさ
前述の通り、Mega Drive にはメモリが 64KB しかありません。mruby/c 自体少ないメモリの環境で動くように工夫されていますが、それでもメモリの最適化には苦労したようです。発表スライドを実装するときには、文字列を String として持ってそれを描画しようとするとメモリを使いすぎてしまう問題があったそうです。このため、レンダリング済みの画像を ROM に含め、DMA と呼ばれる方法を使って ROM から直接ビデオメモリへ画像を転送して問題を解決されていました。
また、Mega Drive にはデバッグ用のテキストを出力できる console なども存在しないため、通常の print デバッグのようなこともできません。画面にデバッグ用のテキストを表示しようとしたとしても、ソフトウェア側でフォントのレンダリングを実装する必要があります。このように実機で動かしながらデバッグを行うのは困難なため、デバッグ時にはエミュレーターを使っているようです。
開発の流れ
SGDK は Mega Drive のグラフィックやサウンド、コントローラーの読み取りなどの機能を C の API として使えるようにしたライブラリを含む dev kit です。Ruby で直接ハードウェアを制御する実装を書くのではなく、 C で書かれた SGDK の API を Ruby から呼び出して使っていました。
また、SGDK にはコンパイラやリンカなどのツール群が含まれているので、それらを使って C のコードをクロスコンパイルし Mega Drive で実行可能なバイナリを作成します。
デモ
実際に Ruby で実装された Crhome の恐竜ゲームのようなゲームや Wordle のようなゲームを、Mega Drive の実機で動かすデモがありました。
下のリンクが、Mega Drive で動く Wordle のようなゲームのコードへのリンクです。
https://github.com/yujiyokoo/mega-mrubyc/blob/master/src/game.rb
感想
このブログの筆者の江草はスーパーファミコンで動くソフトウェアをアセンブリ言語で書いたことがあるため、 Mega Drive で Ruby を動かす困難さも少しは想像できます。一方、オープンソースの Mega Drive 用 C コンパイラやリンカなどのツール群が整備されていることは意外でした。また、Ruby によるゲームの実装はとても Mega Drive で動くコードとは思えないほど普通に見え、そのギャップがとても面白いと感じました。
発表の後、発表者の Yuji Yokoo さん( https://twitter.com/yujiyokoo )がスポンサーブースに来ていただき、お話を伺うことができました。発表の内容について質問に答えてくださりありがとうございました。