テストプレイのために0からDQ3をやり直す回数が増え、そのたびに「名前考えるの面倒臭いなあ」と思っていたので、登録所でスタートボタンを押すとデフォルトでセットした名前からランダムで選ばれたものがセットされるようにすることにしました。完全に自己満の世界の話です。ボタン入力の処理の部分なんてまじめに調べたこともないので0から調べるはめになりましたが、DQ6インターフェース改良パッチのさらなる変更のために経験を積むのもいいと思い手をつけてみました*1。結果として邪道な実装方法にはなったものの、当初の目的を達成することはできました。まずは、オリジナルのボタン周りの処理がどうなっているかを見て作業方針を決めます。
- SR: $0006E1 パッド入力状態取得?
0006E1 | LDA $004212 | A=$004212 | |
---|---|---|---|
0006E5 | LSR | A>>1 | |
0006E6 | BCS #$F9 | if(c==on) goto $0006E1 | |
0006E8 | LDA $004218 | A=$004218 | |
0006EC | STA $7FF8 | $7FF8=A | |
0006EF | LDA $004219 | A=$004219 | |
0006F3 | STA $7FF9 | $7FF9=A | |
0006F6 | LDA $004016 | A=$004016 | |
0006FA | LSR | A>>1 | |
0006FB | BCS #$06 | if(c==on) goto $000703 | |
0006FD | STZ $7FF8 | $7FF8=#$00 | |
000700 | STZ $7FF9 | $7FF9=#$00 | |
000703 | RTS | return |
SNES関係の資料から追っていくと、パッドの入力状態が$7E7FF8-9にセットされていることがわかります。このアドレスをチェックしていると、さらに$7E2A68-9に値がコピーされています。最終的にどのSRで判定が行われているかというと、SR: $033253です。ここで、パッド入力がこのSR内でどう扱われているかを先に示します。
ウィンドウ表示中パッド入力値
7E2A68
- 01 右
- 02 左
- 04 下
- 08 上
- 10 スタート
- 20 セレクト
- 40 B
- 80 A
7E2A69
- 01
- 02
- 04
- 08
- 10 R
- 20 L
- 40 Y
- 80 X
- SR: $033253 ウィンドウ上入力処理
033253 | LDA #$F080 | A=#$F080 | RLXYA入力チェック |
---|---|---|---|
033256 | AND $2A68 | A&=$2A68 | |
033259 | BNE #$2E | if(z==off) goto $033289 | |
03325B | LDA #$0060 | A=#$0060 | セレクトB入力チェック |
03325E | AND $2A68 | A&=$2A68 | |
033261 | BNE #$14 | if(z==off) goto $033277 | |
033263 | LDA #$000F | A=#$000F | 上下左右入力チェック |
033266 | AND $2A68 | A&=$2A68 | |
033269 | BNE #$3B | if(z==off) goto $0332A6 | |
03326B | STZ $2AA6 | $2AA6=#$00 | |
03326E | STZ $2A6A | $2A6A=#$00 | |
033271 | JSL $C331B9 | SR: $0331B9 | |
033275 | CLC | c=off | |
033276 | RTL | return | 何もしない処理 |
033277 | JSL $C331A3 | SR: $0331A3 | |
03327B | BCC #$F8 | if(c==off) goto $033275 | |
03327D | LDA #$0060 | A=#$0060 | |
033280 | STA $2A6A | $2A6A=A | |
033283 | LDX $2A9A | X=$2A9A | |
033286 | JMP $347A ($03347A) | goto $($03347A+X) | |
033289 | JSL $C331A3 | SR: $0331A3 | |
03328D | BCC #$E6 | if(c==off) goto $033275 | |
03328F | LDA #$F080 | A=#$F080 | |
033292 | STA $2A6A | $2A6A=A | |
033295 | JSR $3246 | SR: $033246 | |
033298 | BNE #$06 | if(z==off) goto $0332A0 | |
03329A | JSL $C1E32E | SR: $01E32E 引数:1#$003D | BGM再生(「ピッ」という音) |
0332A0 | LDX $2A98 | X=$2A98 | |
0332A3 | JMP $34E3 ($0334E3) | goto $($0334E3+X) | |
0332A6 | JSL $C33174 | SR: $033174 | |
0332AA | BCC #$C9 | if(c==off) goto $033275 | |
0332AC | LDA #$0001 | A=#$0001 | |
0332AF | AND $2A68 | A&=$2A68 | |
0332B2 | BEQ #$06 | if(z==on) goto $0332BA | |
0332B4 | LDX $2A96 | X=$2A96 | |
0332B7 | JMP $32E4 ($0332E4) | goto $($0332E4+X) | |
0332BA | LDA #$0002 | A=#$0002 | |
0332BD | AND $2A68 | A&=$2A68 | |
0332C0 | BEQ #$06 | if(z==on) goto $0332C8 | |
0332C2 | LDX $2A94 | X=$2A94 | |
0332C5 | JMP $32EA ($0332EA) | goto $($0332EA+X) | |
0332C8 | LDA #$0008 | A=#$0008 | |
0332CB | AND $2A68 | A&=$2A68 | |
0332CE | BEQ #$06 | if(z==on) goto $0332D6 | |
0332D0 | LDX $2A90 | X=$2A90 | |
0332D3 | JMP $32F0 ($0332F0) | goto $($0332F0+X) | |
0332D6 | LDA #$0004 | A=#$0004 | |
0332D9 | AND $2A68 | A&=$2A68 | |
0332DC | BEQ #$97 | if(z==on) goto $033275 | |
0332DE | LDX $2A92 | X=$2A92 | |
0332E1 | JMP $32F4 ($0332F4) | goto $($0332F4+X) |
DQ3においてスタートボタンは唯一何も役割のないボタンですが、たしかにこのSRを見るとスタートボタンについてはなにも処理がされていません。$2A90-Aあたりには、各入力に対して行う処理のアドレスリストへのオフセットがセットされるようで、カーソルが移動した直後にこれらの値が変わるようです(左端なら左が押されたら右端に移動するなどの処理)。決定系の処理は$03328F-A3で行われています。ここでジャンプする先の処理を見ると、「名前入力時のかな<->カナ入れ替え」などもジャンプ先として定義されています。というわけで次回から実装に移ります。
*1:実際ある程度理解の助けになりました
コメント