PR 記事には広告が含まれています
スポンサーリンク
Translate

レトロフリークでUSBファミコンコントローラが正常に動作するようになりました

スポンサーリンク

レトロフリークに「ファミコンコントローラUSB化キット」でUSB化したファミコンの本物コントローラをつないでみたところ、左上が押されっぱなしの状態でした。

前回の記事はこちら

このUSB化キットは、WindowsとMacでの正常に動作することを確認してあります。

そこで、レトロフリークに付属の標準のコントローラと、USB化キットのコントローラで、何が違うのかUSBに流れるデータを見て、違いを確認してみたいと思います。

スポンサーリンク

USBパケットキャプチャ

USBパケットキャプチャは、パソコンとUSB機器との間の通信を受信し表示してくれるものです。

純正コントローラのパケット

これが標準で付いてくる純正コントローラで、何もキーを押さない時の、コントローラからパソコンへ送信されているUSBのパケットです。この中に、コントローラのボタンの状態が保存されています。

十字キーの上を押すと、四角で囲った部分が、0x80(10進数で128)から0x00(0)に変わりました。

十字キーの下を押すと、先ほどの部分が0xFF(255)になりました。

純正コントローラの十字キーの値
上:0x00 (0)
何も押さない:0x80 (128)
下:0xFF (255)
十字キーの値の範囲:0〜255

純正コントローラーの十字キーの値は、符号なしの8bitということがわかりました。

USB化キットのパケット

これがUSB化キットでの、何もキーを押さない時の、コントローラからパソコンへ送信されているUSBのパケットです。

十字キーの上を押すと、アンダーラインを引いたところの値が変わりました。2バイトで下位バイト、上位バイトの順のリトルエンディアンで格納されています。値は0x8001、2の歩数と考えると10進数で-32767。

十字キーの下を押すと、アンダーラインを引いたところの値が0x7FFF、10進数で32767となりました。

USB化キットの十字キーの値
上:0x8001 (-32767)
何も押さない:0x0000 (0)
下:0x7FFF (32767)
十字キーの値の範囲:-32767〜32767

USB化キットの十字キーの値は、符号付きの16bitということがわかりました。

十字キーの値の仕様

HIDデバイスの十字キーの値の仕様としては、以下の3通りがあるようです。

・符号なし 8bit
・符号付き 8bit
・符号付き 16bit

このどれを選ぶかは、コントローラの設計者の自由です。どれが選ばれたかは、USB機器をパソコンに接続した時に、USB機器からパソコンに送られるレポートディスクリプタという設定パラメータの中に書いてあります。パソコンはそこに書かれている情報から、十字キーが上記の3つのうちどれなのかを読み取って、動作を開始します。

パソコンの場合、上記の3つのどれであっても正常に動作します。

レトロフリークの場合、それぞれ試してみたのですが、符号付きで設定しても、符号なしとして処理しているようです。レトロフリークのHIDドライバにバグがあるのかもしれません。コントローラが符号付きで送信している場合、十字キーを何も押さない状態のは符号付きの0ですが、これを符号なしの0である「上」(または「左」)と勘違いしているようです。このため、十字キーを何も押さなくても、左上が押されっぱなしという症状になります。

スポンサーリンク

符号なしの8bitに変更

さて、原因がわかったので、符号なしの8bitにプログラムを変更し、マイコンに書き込みました。

また、レトロフリークでのボタンの設定のデフォルト値が

A:1
B:2
START:9
SELECT:10

となっていたので、USB化キットの設定も、同じようにしておきました。

さて、USBファミコンコントローラで、ゲームができるでしょうか。

動きました!!!!!

十字キーを押さないと、ちゃんとその場に止まってくれます。左は左、右は右に動きます。

本物のファミコンコントローラで、レトロフリークでファミコンができるようになりました!!

ファミコンコントローラUSB化キット」のファームウェアは、レトロフリーク対応のプログラムに書き直しておきたいと思います。本商品を既に購入済みで、レトロフリークでも使いたいという方は、ショップの商品ページにある問い合わせよりご連絡ください。対応させていただきます。

FCPad販売