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

テストプレイのために0からDQ3をやり直す回数が増え、そのたびに「名前考えるの面倒臭いなあ」と思っていたので、登録所でスタートボタンを押すとデフォルトでセットした名前からランダムで選ばれたものがセットされるようにすることにしました。完全に自己満の世界の話です。ボタン入力の処理の部分なんてまじめに調べたこともないので0から調べるはめになりましたが、DQ6インターフェース改良パッチのさらなる変更のために経験を積むのもいいと思い手をつけてみました*1。結果として邪道な実装方法にはなったものの、当初の目的を達成することはできました。まずは、オリジナルのボタン周りの処理がどうなっているかを見て作業方針を決めます。

  • SR: $0006E1 パッド入力状態取得?
0006E1LDA $004212A=$004212
0006E5LSRA>>1
0006E6BCS #$F9if(c==on) goto $0006E1
0006E8LDA $004218A=$004218
0006ECSTA $7FF8$7FF8=A
0006EFLDA $004219A=$004219
0006F3STA $7FF9$7FF9=A
0006F6LDA $004016A=$004016
0006FALSRA>>1
0006FBBCS #$06if(c==on) goto $000703
0006FDSTZ $7FF8$7FF8=#$00
000700STZ $7FF9$7FF9=#$00
000703RTSreturn

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 ウィンドウ上入力処理
033253LDA #$F080A=#$F080RLXYA入力チェック
033256AND $2A68A&=$2A68
033259BNE #$2Eif(z==off) goto $033289
03325BLDA #$0060A=#$0060セレクトB入力チェック
03325EAND $2A68A&=$2A68
033261BNE #$14if(z==off) goto $033277
033263LDA #$000FA=#$000F上下左右入力チェック
033266AND $2A68A&=$2A68
033269BNE #$3Bif(z==off) goto $0332A6
03326BSTZ $2AA6$2AA6=#$00
03326ESTZ $2A6A$2A6A=#$00
033271JSL $C331B9SR: $0331B9
033275CLCc=off
033276RTLreturn何もしない処理
033277JSL $C331A3SR: $0331A3
03327BBCC #$F8if(c==off) goto $033275
03327DLDA #$0060A=#$0060
033280STA $2A6A$2A6A=A
033283LDX $2A9AX=$2A9A
033286JMP $347A ($03347A)goto $($03347A+X)
033289JSL $C331A3SR: $0331A3
03328DBCC #$E6if(c==off) goto $033275
03328FLDA #$F080A=#$F080
033292STA $2A6A$2A6A=A
033295JSR $3246SR: $033246
033298BNE #$06if(z==off) goto $0332A0
03329AJSL $C1E32ESR: $01E32E 引数:1#$003DBGM再生(「ピッ」という音)
0332A0LDX $2A98X=$2A98
0332A3JMP $34E3 ($0334E3)goto $($0334E3+X)
0332A6JSL $C33174SR: $033174
0332AABCC #$C9if(c==off) goto $033275
0332ACLDA #$0001A=#$0001
0332AFAND $2A68A&=$2A68
0332B2BEQ #$06if(z==on) goto $0332BA
0332B4LDX $2A96X=$2A96
0332B7JMP $32E4 ($0332E4)goto $($0332E4+X)
0332BALDA #$0002A=#$0002
0332BDAND $2A68A&=$2A68
0332C0BEQ #$06if(z==on) goto $0332C8
0332C2LDX $2A94X=$2A94
0332C5JMP $32EA ($0332EA)goto $($0332EA+X)
0332C8LDA #$0008A=#$0008
0332CBAND $2A68A&=$2A68
0332CEBEQ #$06if(z==on) goto $0332D6
0332D0LDX $2A90X=$2A90
0332D3JMP $32F0 ($0332F0)goto $($0332F0+X)
0332D6LDA #$0004A=#$0004
0332D9AND $2A68A&=$2A68
0332DCBEQ #$97if(z==on) goto $033275
0332DELDX $2A92X=$2A92
0332E1JMP $32F4 ($0332F4)goto $($0332F4+X)

DQ3においてスタートボタンは唯一何も役割のないボタンですが、たしかにこのSRを見るとスタートボタンについてはなにも処理がされていません。$2A90-Aあたりには、各入力に対して行う処理のアドレスリストへのオフセットがセットされるようで、カーソルが移動した直後にこれらの値が変わるようです(左端なら左が押されたら右端に移動するなどの処理)。決定系の処理は$03328F-A3で行われています。ここでジャンプする先の処理を見ると、「名前入力時のかな<->カナ入れ替え」などもジャンプ先として定義されています。というわけで次回から実装に移ります。

*1:実際ある程度理解の助けになりました

コメント

タイトルとURLをコピーしました