ゲーム

「ゲームボーイがWi-Fi接続可能になるカートリッジ」を魔改造した猛者が登場


エンジニアのセバスティアン・スタークス氏は、1989年に発売された携帯ゲーム機であるゲームボーイそのものを改造するのではなく、ゲームボーイに挿すカートリッジを改造することで「ゲームボーイがWi-Fiに接続すること」を可能にしてしまいました。

There oughta be a WiFi Game Boy cartridge.
https://there.oughta.be/a/wifi-game-boy-cartridge

スタークス氏が作成したWi-Fi機能付きのゲームボーイカートリッジは、記事作成時点ではTelnetを利用した通信のデモンストレーションおよびWikipediaへのアクセスだけが可能という非常に機能が限られたものとなっています。

Wi-Fi機能付きのゲームボーイカートリッジは、Wi-Fi機能を追加するためのESP8266マイクロコントローラーを搭載したゲームボーイ用カートリッジです。このESP8266マイクロコントローラーはゲームボーイのために多くの事前処理を担っており、記事作成時点ではWikipediaしか利用できませんが、「TwitterクライアントやRedditブラウザを実装することも可能」とスタークス氏は語っています。

以下はWi-Fi機能付きのゲームボーイカートリッジを用いてWikipediaにアクセスしている様子。左の画像はWikipediaのデモアプリを起動したところで、IPアドレスなどが表示される簡易な画面となっています。真ん中はオンスクリーンキーボードを用いてWikipediaの特定のページを検索している様子、右は記事の出だし部分を表示した様子です。


当然このカートリッジではゲームをオンラインでプレイしたり、ネットワーク経由でROMライブラリにアクセスしたりすることはできません。このカートリッジではソフトウェアがマイクロコントローラーでプログラムできない通常のEEPROMから実行されるため、ESP8266マイクロコントローラーでプログラムができるように再設計する必要があったそうです。

そもそもゲームボーイカートリッジには16個のアドレスピンと8個のデータピンがあります。ゲームボーイではアドレスピンで読み書きを行うメモリアドレスを設定し、データピンで1バイトのデータの読み書きを行います。これらのアクセスはクロックピン(CLK)、読み取りピン(RD)、書き込みピン(WR)、チップセレクトピン(CS)によって制御されます。RDとWRはデータを読み取るか書き込むかを宣言するために使用されますが、CLKは読み書きのタイミング用に1MHzの基準クロック信号を送受信するために使用されます。連続した読み書きの間にRDあるいはWRがオフ状態に戻らないようにするための役割をCLKは担うわけです。そのため、CLKがないと読み書きのシーケンスを識別することが非常に難しくなるとのこと。


CSはカートリッジとはそれほど関係のないピンで、通常は同じバス上の異なるチップを切り替えるために、特定のチップを有効または無効化するために使用されます。ゲームボーイカートリッジの16個のアドレスピンでは64KiBのメモリをアドレス指定できますが、ROMには32KiBのみ割り当てられており、残りの32KiBは内部メモリとしてレジスタのアドレス指定に使用されます。

最新のマイクロコントローラーを使えばこれらすべてのピンに接続し、ソフトウェアで通信を行うことが可能になります。しかし、レベルシフターやバストランシーバーが必要な場合があり、ピンの数が多いと適切なマイクロコントローラーが制限されるという問題もあります。ただし、それ以外のケースであっても「最新の100MHzマイクロプロセッサーで、1MHzのデータバスでやり取りするゲームボーイのCPU(動作周波数4MHz)と問題なく通信することができた」とスタークス氏は記しています。実際、「STM32」と「RP2040」という2つの非正規のゲームボーイカートリッジで問題なく通信が可能だったことを確認しています。


問題はカートリッジのメモリサイクルが1MHzしかないという点です。これは1サイクルあたりの読み書きが1バイトしかないということを意味します。これはCPUサイクルよりも用途が広いもののように感じられるかもしれませんが、これではCPUはアドレスピンをチェックしてその意味を解釈し、応答となるデータを取得または計算し、出力するという作業をすべて1サイクルで完了することはできません。しかし、ゲームボーイのCPUは実際に何もしていなくても、割り込みを処理することが可能です。なお、ゲームボーイの場合は割り込み処理のための時間が500nsしかありません。ただし、ゲームボーイでは内部メモリにアクセスする場合、常に読み書きイベントが発生するため、常に割り込み処理が発生しているということになります。

割り込み処理が起きているとはいえ、ある程度の予備処理時間が必要です。今回の場合、ゲームボーイでWi-Fiに接続してWikipediaにアクセスする必要があります。ただし、ゲームボーイ上で処理するデータはあくまでデータ出力分のみであり、WikipediaのJSON応答などはESP8266マイクロコントローラー上で処理するようプログラミングされているため、割り込み処理だけで問題なくデータの処理が可能になった模様。


また、マイクロコントローラーが処理しなければいけないメモリ要求の数と、マイクロコントローラーが管理しなければいけないピンの数を減らすことために、スタークス氏はカートリッジ全体をマイクロプロセッサーに置き換えるのではなく、日常的なメモリ要求を処理するのに理想的なコンポーネント32kiBのEEPROMとして使用することに決めたそうです。その理由をスタークス氏は「ほとんどのメモリ要求はゲームボーイで実行されている画像やバイトコードなど静的なものになるため、ESPからデータを取得する頻度は必然的に低くなる」と説明しています。

さらに、ESPからデータを取得するために、ゲームボーイのメモリスペースのうち2バイト分(0x7ffeと0x7fff)をESP8266にマップ。ゲームボーイ側からESPを読み込む場合は0x7ffeにアクセスし、書き込む場合は0x7fffにアクセスします。これらは通常の32kiB ROMスペースの最後にあり、32kiB全体を使用する場合にのみプログラムコードに干渉し、いくつかの論理ゲートで非常に簡単に認識できるためです。

なお、スタークス氏が作成したWi-Fi機能付きのゲームボーイカートリッジの回路図は以下の通り。


続けてソフトウェア面の開発に取り掛かったというスタークス氏。同氏は「作成する必要があるソフトウェアは2つあり、それは「ゲームボーイで実行するためにEEPROMに格納されるコード」と「ESP8266上で実行されるソフトウェア」です。「ゲームボーイで実行するためにEEPROMに格納されるコード」はゲームボーイ用のプログラムを開発するためのフリーウェアであるgbdk-2020を用いて書かれています。大変なのは「ESP8266上で実行されるソフトウェア」で、スタークス氏はArduino IDEを用いてソフトウェアをプログラミングしたとしています。

なお、Wi-Fi機能付きのゲームボーイカートリッジで使用されている2つのソフトウェアはどちらも以下のGitHubページ上にホストされています。

GitHub - Staacks/wifi-game-boy-cartridge: A WiFi cartridge for the original Game Boy.
https://github.com/Staacks/wifi-game-boy-cartridge


スタークス氏が作成したWi-Fi機能付きのゲームボーイカートリッジが実際に動作している様子は以下のムービーでチェックできます。

WiFi Game Boy Cartridge - YouTube

この記事のタイトルとURLをコピーする

・関連記事
ゲームボーイでビットコインをマイニングする猛者が登場、単3電池4本で採掘可能 - GIGAZINE

昔のゲームボーイカセットで遊べる新型ゲームボーイ「Ultra GB」爆誕 - GIGAZINE

ドリンクを注ぐと画面が点灯してティータイムが楽しくなりすぎるマグカップ「Game Boy Heat Change Mug」レビュー - GIGAZINE

ゲームボーイ型のおもちゃにRaspberry Pi Zeroを組み込んで「ゲームボーイカラー・ナノ」を完成させた強者が登場 - GIGAZINE

ゲームボーイにRaspberry Piをぶち込んでスーファミタイトルなどゲーム三昧な魔改造を施した「Game Boy Zero」 - GIGAZINE

in ハードウェア,   動画,   ゲーム, Posted by logu_ii

You can read the machine translated English article here.