はじめに Rubyでゲームボーイのエミュレータを作って、rubyboyという名前のgemで公開しました! (スターをいただけると嬉しいです!)
Rubyでゲームボーイのエミュレータを作りました!
カラー対応やWasmでブラウザ対応もやっていきたい💪
GitHub: https://t.co/hFwmZD6FNp pic.twitter.com/qWbx8v4mef
— sacckey (@sacckey) March 17, 2024 この記事 RUBY BOYの実装手順を説明しながら、ハマった点や工夫した点を紹介します。 またRUBY BOYの高速化のためにやったことを紹介します。
なぜゲームボーイのエミュレータをつくったのか なにか個人開発をしたいが、Webサービスは維持費がかかるので無料で維持できるものを作りたい 業務でRubyを使っていることもあり、以前からRubyのgemを作ってみたかった ゲームのエミュレータ開発は「ゴールが明確&動くと楽しい」ので、モチベを維持しやすそう 特にゲームボーイには思い入れがある → Rubyでゲームボーイのエミュレータを作って、gemで公開しよう!
エミュレータの概要 以下は、ゲームボーイのアーキテクチャです。
"Game Boy / Color Architecture - A Practical Analysis" by Rodrigo Copetti, Published: February 21, 2019, Last Modified: January 9, 2024. Available at: https://www.copetti.org/writings/consoles/game-boy/. Licensed under Creative Commons Attribution 4.0 International License. これらのハードウェアを模倣したプログラムを実装することを目指します。 RUBY BOYのクラス図と各クラスの役割は以下の通りです。
Console: mainクラス Lcd: 画面描画を行う Bus: メモリマップドI/Oを実現するためのコントローラ。Cpuから各種ハードウェアの設定値の読み書きを中継する Cpu: Romから命令を読み込み、解釈して実行する Registers: レジスタの読み書きを行う Cartridge: カセット内のROMやRAMの読み書きを行う。MBCチップの種類ごとに実装が異なる(後述) Apu: オーディオデータの生成を行う Rom: カートリッジ内のゲームプログラムを読み込む Ram: カートリッジ及びゲームボーイ内のRAMデータの読み書きを行う Interrupt: 割り込みを管理する。割り込みは次の3クラスから行われる Timer: サイクル数をカウントする Ppu: ディスプレイに描画するピクセル情報を生成する Joypad: ゲームボーイのボタン入力を受け取る RUBY BOYでは、Cpuが命令を実行し、実行にかかったサイクル数だけPpu, Timer, Apuのサイクル数を進めていくことでコンポーネント間の同期をとります。 そのためメインループの中身は以下のようになります。...