Porting mruby/c for the SNES (Super Famicom)
RubyKaigi 2024, #rubykaigi
https://rubykaigi.org/2024/presentations/gedorinku.html#day3
ウォンテッドリーでエンジニアをしている @gedorinku です。5/15から5/17に沖縄で開催された RubyKaigi 2024 に参加して登壇してきました。
当日の発表スライドは以下で公開しています。
内容は、mruby/c という組み込み向けの Ruby ランタイムをスーパーファミコンに移植して動かしたというものでした。不安定な C コンパイラのデバッグやカセット内の特殊チップ(SA-1)を使った mruby/c VM の高速化といった mruby/c をスーファミで動作させるために必要なハックについて話しました。発表の中でも触れましたが、この取り組みは RubyKaigi 2022 で Yuji Yokoo さんの発表を聴いたことがきっかけとなっており、まさに KaigiEffect と言えると思います。
当日は発表会場が満席になってしまうほどの盛況ぶりで、僕の想定より多くの方に興味を持っていただけたようでとても嬉しいです。
スーパーファミコン実機を使ったデモの様子:
実は、RubyKaigi Day 0 にあたる14日の夜に那覇へ到着したときに土砂降りの雨に見舞われて、スーファミの入っているスーツケースが浸水するという事故が発生していたので、無事に動くデモを見せることができて良かったです。危うくスーファミの現地調達が必要になるところでした。
発表が終わった後に、PicoRuby などを開発した @hasumikin さんから mruby/c 御朱印帳をいただきました。ありがとうございます。
また、発表前後に「発表楽しみにしてます」「面白かった」といった感想や質問を Drinkup 等で何人もの方々からいただけて嬉しかったです。
この中で memory-mapped I/O について質問をいただくことが多く、発表では軽く流してしまった部分なので補足しておきます。スーファミには OS が載っておらずカセット内のソフトウェアが直接ハードウェアを制御することになります。ハードウェアの入出力が RAM と一緒にアドレス空間にマッピングされていて、それを読み書きすることで画面を出力したりします。発表では、カセット内に搭載されているチップで、本体の CPU と同じアーキテクチャである SA-1 で mruby/c を動作させる話をしましたが、このメモリマッピングは本体の CPU と SA-1 で異なっています。C コンパイラが出力するシンボルを修正したり本体の CPU へ処理を移譲する関数を実装したりなど、メモリマッピングの差への対応が必要でしたが、比較的少ない手間で SA-1 へ移植できています。
ウォンテッドリーでは12年目を迎えたサービスをさらに成長させつつ、新しい価値も生み出していくために、Web バックエンドエンジニアを募集しています。少しでも興味があれば「話を聞きに行きたい」ボタンから話を聞きに来ていただけるとうれしいです。