hackrom (ガチャポン戦士3と4)

3は幼少の頃にはまってたが、4の戦闘システムの変更や複雑化は小学生にはちょっと無理だった。

戦闘シーンに攻撃すると背景色が黒→赤→白となって、目に悪くて不快。今回は簡単なので mess の使い方も兼ねる。

パレットを探る

PPU の VRAM (sprite じゃないほう) の 0x3f00 に書き込む命令を見る。

>wpset 2006,1,w,wpdata==3f

$2006 は2度書きだが 0x3f を書くのは珍しいので戦闘シーンで書き込む場所を探る。そうすると着弾シーンの直後でひっかかるのでその命令の直後に ldy #$a0; lda $0320,y; sta $2007 が見つかる。

sta の実行前に A の中身が 0x16 (赤) なのを確認. そのまま同じ処理をかけて様子をみると 0x16 (赤) -> 0x30 (白) → 0x16 (赤) なので 0x0320 + 0xa0 への書き込み命令を watch する。

バッファを探る

VRAM の場合は都度書き込むことは少なく、普通の RAM にバッファ(ミラーといった方がいいのかな)を設けて、VBlank 割り込みなどのきっかけから一気に $2006, $2007 を write してデータを転送することが普通。

そのバッファは $0300-$03ff に設けることが多い。 $00xx 台は zeropage, $01xx 台は stack と CPU が決め込んでいるので使えず, $02xx 台はライブラリかサンプルソースの都合で OAM バッファにすることが普通. $03xx 台は VRAM バッファかサウンド算出用にするのが一般的。

話を戻して明るすぎる赤を設定する watchpoint を設定。

>wpset 3c0,1,wpdata==16

そうすると PC:$99e9 がかかるが、なんだかよくわからないので、 rts するまで step 実行させて様子を見る。(デバッガの画面はニュータイプストーリーのほう(SHI-45))


$99c8: rts の直後が正常な命令ではないのでデータとしてみると 0x0f,0x16,0x30,0x16 となる。 $99ba: lda $99c9,y なので色の設定値ということがほぼ確定。

ここからはバイナリエディタで "0x0f,0x16,0x30,0x16" のデータを探して1カ所だけでてきた。ここを好きな色に変更して動作確認。


OK. 先に SHI-45 をやったが SHI-3G も同じソースを使い回しているだけ(予想つきますね,一応 watch かけました)なので同様に "0x0f,0x16,0x30,0x16" を探して直すだけ。

やりたりない

パレットの変更は簡単すぎたんで、セーブデータの管理をやってみたい。キャンペーンとシナリオのセーブデータの共有はあまりにもひどい。
キャンペーンでZからやりたいので初代を飛ばしたいとか実装するのはどんなもんかしら。触る感じ3のプログラマが逃げて、4を締め切り直前に無茶実装したっぽいから修羅の道っぽいから、相当なやる気がないと無理でしょうけど。