DQ3 登録中にスタートボタンを押すとプリセットの名前を自動入力する1

テストプレイのために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

  1. 01 右
  2. 02 左
  3. 04 下
  4. 08 上
  5. 10 スタート
  6. 20 セレクト
  7. 40 B
  8. 80 A

7E2A69

  1. 01
  2. 02
  3. 04
  4. 08
  5. 10 R
  6. 20 L
  7. 40 Y
  8. 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:実際ある程度理解の助けになりました