ゲームボーイ版テトリスの解析とイルーム音楽

ほとんどの方にはまるで役に立たないゲームボーイ版テトリスの使用メモリ解析情報。
tetris_memory

このゲームの音楽データ(効果音を含まない)は、ROMから読み込まれた後、RAMのDF70番地から0x60バイト程度のエリアを使って制御されています。
内容は現在演奏中の音符位置へのポインタ、そのポインタへのポインタ、ボリュームとエンベロープ、休符フラグ、音長、音長のカウンタ、音程(周波数)などです。

具体的にはこんな感じ。カラー分けしてみた。
tetris_memory_color
DF90-9F 矩形波1
DFA0-AF 矩形波2
DFB0-BF 波形メモリ音源

  • 0-1 演奏中パートのアドレス
  • 2 音符のカウンタ(カウントダウン)
  • 3 音符の長さ
  • 4-5 演奏中の音符のアドレス
  • 6-8 音量やエンベロープ、duty比等
  • 9 音程
  • A 音程(たぶんオクターブ)
  • B 01の場合は休符
  • C-D 不明(未使用?)
  • E 音符カウンタ(カウントアップ)
  • F 不明

DFC0-CF ノイズ
これも上記3chと途中(4-5 演奏中の音符のアドレス)までは一緒

あと、上の画像中にはありませんが、
DFE9 演奏中の曲番号

  • 01 ネームエントリー
  • 03 タイトル画面
  • 04 ゲームオーバー
  • 05 TYPE-A コロブティカ
  • 06 TYPE-B
  • 07 TYPE-C フランス組曲第3番メヌエット

DFE0-E4 効果音(矩形波)で使用している模様
DFF9-FA 効果音(ノイズ)の処理用?

曲データの先頭アドレス(曲開始時にDFx0-x1に入る)
以下、面倒なので矩形波をsq、波形メモリ音源をws(Wavetable synthesis)と呼ぶ。
TYPE-A
sq.1 714C
sq.2 7142
ws 7156
noise 7162

TYPE-B
sq.1 72c6
Sq.2 72b8
Ws 72d4
Noise 7302

TYPE-C
Sq.1 7008
Sq.2 6ffa
※この曲は矩形波2音のみで演奏される

タイトル
Sq.1 763b
Sq.2 7633
Ws 7641
Noise 7663

ゲームオーバー
Sq.1 7600
Sq.2 75fc
Ws 7602

ネームエントリー
Sq.1 7cf9
Sq.2 7d01
Ws 7d11
Noise 7d21

これらの先頭アドレス(ポインタ)で示されるアドレスの音符データを演奏することになる。
その際、読み込んだバイトデータが9Dの場合、続く3バイトをそのままDFx6-DFx8の、音量・エンベロープ等のデータとして使用する。
TYPE-Bのリズム(ノイズ)なんて、「チッチキチッチ」の一小節をずっと続けてるだけなんですよね。今まで気付かなかった。すごいわ。

また、音楽とは直接関係がないけど、
C200-C203でMUSIC-TYPE、LEVEL選択時のカーソル位置、
C210-C213でGAME-TYPE選択時のカーソル位置(X,Yの座標)と選択中の項目を点滅させるために使用している。
曲開始時の処理を追うのに使えるかもしれない。

それにしても。ゲームボーイの音源周りはCPUがカスタムチップということもあり、実に使いやすくまとまっている。
YMZ294をいじるのに比べると本当に楽。

解析する過程でメモリの内容いじってバグった音楽(イルーム音楽)をニコニコ動画にアップしてありますので、よろしければどうぞ。

ヒテッマンリスペクト&用語まとめ Wikiでも項目を作って頂いた。ありがたやー。

(そいや、ゲーム機を使ってる訳ではないでしょうが、核P-MODEL – Big Brotherの前奏はかなりイルーム音楽に近いものがあります)

以下のサイトにお世話になりました。
オールドゲームROM研究の逆アセンブラを使わせて頂きました。ニーモニックやI/Oの解説資料が豊富で、コードの検索もしやすく、とても使いやすいです。
CBRK 803832 – 生成センター様のコードにもお世話になりました。手探りだけでメモリをいじってたら、どのアドレスが何なのかわかるのに多大な時間がかかっていた事でしょう。
ニコニコ大百科の「GB音源とは」の項目も非常に詳しいです。

コメントを残す