デュアルショックの更なる解析(ただし使ってるのはホリ振動パッドだったり)

振動問題で、一つ面白いことに気がついた。
事の発端はアーマード・コア(今頃PS版にはまった)。
こいつはePSXeでちゃんと設定しても振動しない。
「やっぱりePSXeのパッドエミュレーションはまだ甘いところがあるな……(ふっ)」と生意気な思いを抱いていたが、今日PCSX&Harakiriで改めて動かしてみたらHarakiriでも振動しなかった(自爆)。
……が、しかし、PSXLPTモードならばちゃんと振動するのである。
で、ログを調べてみて気がついたことをここに記載する。
(追記:後日、直にパッドを叩いてきちんと調べてみたところ、勘違いをしていた部分が発覚したのでさらに修正する)

寺川 愛印氏の「デュアルショック(SCPH-1200)の解析」によれば、振動の設定は

<< バイブレーションイネーブル(VIBRATION_ENABLE) >>
CMD=01,4D,00,00,01,FF,FF,FF,FF
DAT=--,F3,5A,FF,FF,FF,FF,FF,FF
ということになっている。

先に蛇足の話をするが、 はじめてバイブレーションイネーブルを実行した場合は
CMD=01,4D,00,00,01,FF,FF,FF,FF
DAT=--,F3,5A,FF,FF,FF,FF,FF,FF
となる。しかし、二度目以降の呼び出しは
CMD=01,4D,00,00,01,FF,FF,FF,FF
DAT=--,F3,5A,00,01,FF,FF,FF,FF
となるのである。
おそらく、既に設定された値がある場合はそれをそのまま返しているのではないかと予想される。

さて、問題というか本題のアーマード・コア。要点を箇条書きしてみよう。

バイブレーションイネーブル
CMD=01,4D,00,00,00,01,01,FF,FF (4,5ではなく、6,7バイト目のビットがオンであることに注目)
上記の振動設定以降のコントローラID
41→42 (デジタルモードでありながら、パラメータのバイト量が2バイト増える)
通常時のリードデータ
CMD=01,42,00,00,00,40,00 (なぜか、常時6バイト目が40に。この状態では振動なし)
(大モーターが振動する)リードデータ&バイブレートEX
CMD=01,42,00,00,00,40,XX (XXは大モーターの振動パラメータ(まず間違いなし))

なんと、大モーターの振動のパラメータが、5バイト目でなく7バイト目に送られていたのである。(そりゃ、Harakiriで振動するはずないわ……んなこと全然考慮に入れてなかった)

まとめると、
「バイブレーションイネーブルでは、振動のパラメータを送るのに使うバイトは01、そうでないバイトは00、まったく使わない(パラメータの範囲外の)バイトはffに設定されて送られてくる。また、振動に使用するバイト量によっては、コントローラIDの下位4ビットが変動する。」
というのが真相のようである。

……というのは間違っていました。(おい
パッドを直に叩いていろいろなパラメータを試行錯誤したみたところ、
「バイブレーションイネーブルでは、小モーターのパラメータを送るのに使うバイトは00、大モーターのパラメータを送るのに使うバイトは01、まったく使わない(パラメータの範囲外の)バイトはffに設定されて送られてくる。
そして、実際の動作に使われるのは、一番後ろで設定された00または01の位置のバイトのみである。
(また、振動に使用するバイト量によっては、コントローラIDの下位4ビットが変動する。)」

が正確なところのようです。

この説明文だけではちょっと分かり難いと思うので、具体例をいくつか提示します。
(SSは小モーターへ送るパラメータ、LLは大モーターへ送るパラメータが入るものとする)

VIBRATION_ENABLECMD=01,4D,00,00,01,FF,FF,FF,FF
READ_DATA_AND_VIBRATE_EXCMD=01,42,00,SS,LL
VIBRATION_ENABLECMD=01,4D,00,00,00,01,01,FF,FF
READ_DATA_AND_VIBRATE_EXCMD=01,42,00,00,SS,00,LL
VIBRATION_ENABLECMD=01,4D,00,00,00,00,00,01,01
READ_DATA_AND_VIBRATE_EXCMD=01,42,00,00,00,00,SS,00,LL
VIBRATION_ENABLECMD=01,4D,00,00,00,01,00,01,FF
READ_DATA_AND_VIBRATE_EXCMD=01,42,00,00,00,00,SS,LL,00

戻る