VRChatでゲームボーイのアーキテクチャについてLTしてきたよ+補足

先日(4/23)、VRChat CS集会にてゲームボーイアーキテクチャについてLTをしてきたので補足とかふりかえりの記事です。

当日聞きに来ていただいた方は本当にありがとうございました。 緊張しましたが、たくさんの人に聞いていただけてうれしかったです。 終わったあとも夜遅くまで話が盛り上がり楽しかったです。

なお、アーカイブは後日CS集会のDiscordにて公開されるとのことなので、気になる方はぜひCS集会Discordサーバに入ってみてください。

なお、スライドのPDFはウェブサイトで公開しています。
ウェブサイト: https://kimkim0106.net

ダウンロードはウェブサイトからどうぞ

補足

5ページ: ゲームボーイのハードウェア

前回のLTに引き続き、基本的に Pan Docs からの引用です。情報がまとまっていて非常にありがたいサイトです。

ゲームボーイアドバンス任天堂公式サイトにスペックが書かれています。 CPUの型番はgbadocからの引用です。

ただ、ゲームボーイがSTN液晶ということはここには書いていなかったので、出典について補足しておきます。
www.itmedia.co.jp

6〜8ページ: 分解してみた・チップの詳細

LT後の雑談中、残っていた人たちと写真を見返していたところ、初代ゲームボーイのほうは、抵抗やコンデンサがチップではないということに気づきました。 どういう理由かはわからないですが、80〜90年代ごろはチップ抵抗があまり使われていなかったのでしょうかね?

ゲームボーイの基板

9〜11ページ: ゲームボーイのCPUは何なのか・CPUの違い

SHARP SM83 という表記は、Pan Docs だったり、Game Boy: Complete Technical Reference あたりにかかれています。

また、8080なのかZ80なのかみたいな議論については、こちらの記事が詳しいです。 8080相当の機能があれば十分 + 複雑な拡張機能を削ることで回路を小さくできるので、削ったのではないだろうかという説は納得できます。

www.wizforest.com

25ページ: ロゴチェック

ロゴチェックによって、法的に非正規のロムを取り締まれるかどうかという話は、Pan DocsのPower-Up Sequence のページで説明がされています。

gbdev.io

27ページ: サウンドの仕様

カートリッジの音声入力端子を使った市販ソフトはないらしいですが、非公式なものだと実装例が存在します。 自分が発見したものをいくつかリンクを貼っておきます。

orangeglo.github.io github.com

28ページ: 波形メモリ

サンプルに貼った波形メモリの音色ですが、これはポケモン金・銀・クリスタルのエンディングの主旋律で使われているものです。

波形のパターンはbgbのDebuggerにあるIO mapを使うと簡単に確認できます。 メモリのFF30~FF3Fを見てもいいのですが、再生中だと正しく読み取れません。 詳しくは Pan Docs の Audio Registers の FF30–FF3F — Wave pattern RAM あたりを読んでみてください。

gbdev.io

32ページ: ゲームボーイで色がつく仕組み

質問タイムでスーパーゲームボーイはどうなっているのかという話をいただきました。 その場で仕組みが違うという話をしましたが、こちらについて少し補足をします。

1枚目はゲームボーイカラー(以下GBC)、2枚目はスーパーゲームボーイ(以下SGB)ですが、SGBのほうがパレットが少ないことがわかります。 GBCは背景のタイルやスプライトのタイルに色をつけられるのですが、SGBだとモノクロのゲームボーイのようになってしまっています。

ゲームボーイカラーの画面とパレット
スーパーゲームボーイの画面とパレット

SGBからスーパーファミコン側に送られるのはモノクロ4階調の画像なので、基本的に画面全体に対して色をつけることしかできないためです。 ところが、戦闘中の画面はカラフルでゲームボーイカラーと変わらない表示になっています。 これはどういうことかといいますと、SGBは画面の一部範囲に別のパレットを指定できるのです。 今回の場合、体力ゲージのあたりはSGB0もしくは1、敵のグラフィックはSGB3、といった感じでパレットを指定しているわけですね。

スーパーゲームボーイの戦闘画面
ゲームボーイカラーの戦闘画面

ゲーム画面下の「SGB packet」というウインドウに表示されているのは、SGBのCPUからスーパーファミコン側に送られる制御コマンドです。 実際に解読してみようかと思いましたが、これだけで一本記事が書けそうだったのでここでは止めておきます。 ざっくり解説しますと、ATTR_BLKでどの範囲にどのパレットを割り当てるかを指定して、PAL01とPAL02でパレットの色情報を送信しています。

ただし、画面上の位置でパレットの範囲指定をしているので、フィールド画面などスクロールには使えないので、4色表示になってしまうというわけですね。

33ページ: 同時発色数は本当に56色?

こちらのスライドについて、何FPS出ているのですかという質問をいただきました。 その場の回答は、サンプルプログラムのソースコードをじっくり読んでみないとわからないというのと、画像なのでリフレッシュレートはそんなに関係なさそうみたいなことを言ったように覚えています。

次のスキャンラインの描画までにパレットを書き換えが間に合っていることを考えると、60FPS出そうな気もしますが、あくまで想像なので、そのうちちゃんとソースコードを読んでみます。

github.com

ふりかえり

良かった点

アーキテクチャ」というタイトル通り、広く浅くにはなりましたが一通り詰め込むことができました。

あと、前回の振り返りを活かして、内容を気持ちマイルドにしてみましたが、どうでしたかね? 最初に「ゲームボーイ知ってる人~?」みたいな感じで聞いてみたのは、一方的になりすぎず良かったように思います。 スライド1枚あたりの情報量というか文字を減らすみたいなのも少し気をつけたポイントではあります。 スライドの場合、図をたくさん入れておくと、全部口で喋らなくていいので楽だしわかりやすそう。

前回の発表についてはこちらの記事もご覧ください。 kimkim0106.hatenablog.com

反省点

スライドを作るのがぎりぎりになってしまったので、もうちょっと余裕を持って準備をすればよかったなとはおもいました。 時間があれば、もうちょっとは最適化できたかもしれない。

と、おもいつつ Lightning Talk なのでもうちょい気軽にしたほうがいいんだろうなと思ったので、そんなに頑張らなくていいのかもしれない。 研究発表でもないし。

あとは、もうちょい勉強しないとなと思いました。

その他

次のLTはどこで何を話そうかな…