-->

2017年4月4日火曜日

NES Classic Editionのコントローラの通信内容解析⑥

では、ダンプしてわかった「NES Classic Edition」のコントローラの通信内容をまとめます。以下は起動してから本体側から見た動作になります。
  • レジスタ"0xF0"にデータ"0x55"をライト
  • レジスタ"0xFB"にデータ"0x00"をライト
    この2つの手順が暗号化OFF設定らしい。
  • レジスタ"0xFE"にデータ"0x03"をライト
    この設定はよくわからない。デバイス識別子を書き換えている?
  • レジスタ"0xFA"から6Byteのデータ(デバイス識別子)をリード
    デフォルトコントローラなら"0x01 0x00 0xA4 0x20 0x03 0x01"が読み出される。これ以外の識別子が読み出されたときの動作は未調査。たぶん、動かないのではないかと思われる。そう考えると、アドレス"0xFE"に"0x03"をライトしたのはクラシックコントローラなどを使用してもデバイス識別子を似通ったものにするため?
  • レジスタ"0x00"から21Byteをリード
    この中にボタン情報が格納されている。該当箇所はアドレス"0x06-0x07"の2Byteっぽい。何故に21Byte?他のデータは何?など疑問は残るが深く考えずスルーすることも大人の知恵だったりする。
    ちなみに後日解析した結果、この21Byteのボタン情報以外のデータ部分にオール"0x00"を設定するとうまく動かないという現象が発生したので以下の値を使うのがよろしい。
    0x83 0x85 0x85 0x86 0x00 0x00 0xXX 0xXX 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
    ※XXはボタン情報の格納場所
    ※オール"0x00"にすると"NES Classic Edition"の起動時のゲーム選択画面では操作できるが、ゲーム選択後に操作不可能になるという謎の現象に陥る
  • 以降、レジスタ"0x00"からの21Byteリードが繰り返される
    リード間隔は約6.6ms。ということは秒間150回リード?120回でも180回でもなく、なんか中途半端な気が…。
ボタンの状態は2Byteの負論理で表される。負論理とはつまり、押していないときは"1"になる。
  • 何も押していないときは"0xFFFF"
    上でも書いているが、該当データはレジスタ"0x06-0x07"の場所のデータ。
  • 各ボタンの該当位置は以下の通り
    Right Down X Select X Start X X X B X A X X Left Up
    例えば、右キーを押している場合は"0x7FFF"、Bボタンを押している場合は"0xFFBF"、右キーとBボタンを同時に押している場合は"0x7FBF"となる。
以上で、「NES Classic Edition」のコントローラの通信内容解析を終わります。
てっきり暗号化していると思いこんでいたのでちょっとびっくりしました。この動作を真似すれば「NES Classic Edition」のコントローラを作成することができます。