【【【【【 デュアルショック(SCPH-1200)の解析 】】】】】 Ver. 1.00 1999/10/13                 Applause こと 寺川 愛印 applause@tky.3web.ne.jp 本ドキュメントは、読者があらかじめプレイステーションのコントローラ及びメモリ端 子の通信方式を熟知しているものとして書かれています。通信方式に関しては藤田氏に よる「プレイステーション・PAD/メモリ・インターフェースの解析」等を参照して ください。 【【 振動の制御方法/アナログコントローラ(SCPH-1150) 】】 アナログコントローラでは振動機能はデジタルモード及びアナログモードで使用可能で す。アナログジョイスティックモードでは使用できません。 あらかじめなんらかの設定をしておく必要はありません。 通常の読みとりコマンドの4および5バイト目でモータを制御します。 CMD=01,42,00,40,01(,00,00,00,00) と送信する事でモータがオンになります。 4バイト目は上位2ビットのみ、5バイト目は下位1ビットのみが参照されます。 上記以外の値を与えるとモータは停止します。 コマンドによってオフにしなくても数分の1秒後に停止します。 コマンド上はオン/オフを切り替えるものしかなく強弱の調節はソフトウェアでPWM等を 行うことになります。 【【 振動の制御方法/デュアルショック(SCPH-1200) 】】 【互換モード】 デュアルショックは電源投入直後はこのモードになっています。このモードではアナロ グコントローラと互換性があります。互換性のためにこのモードのデュアルショックは 大小2つあるモータのうち小さい方しか使用できません。 アナログコントローラと違い一度オンにするとコマンドによってオフにされるまでいつ まででも振動します。ユーザがボタンによりアナログ/デジタルを切り替えてもモータの オン/オフは保持されます。 【コンフィギュレーションモード】 デュアルショックではコンフィギュレーションモードと呼べるものが導入されており、 このモードに入って設定を行うようになっています。またこのモードに入ること自体が 互換モードからネイティブモードへの遷移を意味します。 コンフィギュレーションモードは制御仕様上のモードであり動作仕様上のモードである アナログモード、デジタルモード及びジョグコンモードとは違うものですので混同しな いように注意して下さい。 コンフィギュレーションモードではコントローラはIDとして'F3'と応答するようになり 、アナログ/デジタルモードに関わらず6バイトのパラメータを送受信するようになりま す。 【コンフィギュレーション項目】 コンフィギュレーションモードでは以下の操作が可能です。(判明している分) ・モードの問い合わせ (アナログorデジタルorジョグコン) ・コントローラの種類の問い合わせ (デュアルショックorジョグコン) ・モードの設定 (アナログorデジタル) ・ボタンによるモード切り替えを許可/禁止 ・バイブレーションの有効化 【コンフィギュレーションの有効期限】 ソフトウェアのハングアップやユーザーによる本体のリセットが有った場合、いつまで も現在のコンフィギュレーションが持続すると不都合が生じる恐れがあります。 そこで約3秒間本体から有効なコマンドが届かなかった場合パッドは自分自身をリセッ トします。リセット時にはバイブレーションが停止しデジタルモードでかつ互換モード に設定されます。 【モード切り替え検出機能】 一度コンフィギュレーションモードを使用するとそれ以降有効になる機能としてモード 切り替え検出機能があります。 ボタンによるモード切り替えが許可されているときユーザーのボタン操作によりモード が切り替わると、コントローラは読みとりコマンドへの応答の2バイト目を'00'にして これを通知します。(以後2バイト目をステータスバイトと呼ぶ) このとき1バイト目( ID)は切り替わったモードのものになります。 以降この状態がリセットされるまでステータスバイトは'00'のままになります。ユーザ ーの操作により再びもとのモードになっても'00'のままです。この状態でもボタン及び アナログスティックの状態は通常通り読みとることが出来ます。 一旦コンフィギュレーションモードに入ることでこの状態はリセットされます。 リセット自体にはコンフィギュレーションモードに入ってただ抜ければよく、他にコマ ンドを実行する必要はありませんが、モード切り替え時にバイブレーションが強制的に ディセーブルされるため、通常はバイブレーションイネーブルコマンドを送ることにな るでしょう。 【プロトコル】 振動制御のプロトコルは以下のようになります。 コマンドの詳細はリファレンスを参照のこと。 1. READ_DATA を発行してコントローラの接続を確認する ID または ステータスが異常 -> エラーを報告 & VSYNC後 1. へ 2. CONFIG_MODE_ENTER を発行してコンフィギュレーションモードに入る 3. QUERY_MODEL_AND_MODE を発行してデュアルショックであることを確認 ID=F3 ならば -> 5. へ。 ID=F3 でなければコンフィギュレーションモードのないモデル -> 4. へ 4. READ_DATA または READ_DATA_AND_VIBRATE を発行し振動出力を指定、データを得る ID 及び ステータスが正しい -> データを報告 & VSYNC後再び 4. へ ID または ステータスが異常 -> エラーを報告 & VSYNC後 1. へ 5. SET_MODE_AND_LOCK を発行しモード及びモードの固定を設定 6. VIBRATION_ENABLE を発行し振動を許可 7. CONFIG_MODE_EXIT を発行してコンフィギュレーションモードを抜ける 8. READ_DATA_AND_VIBRATE_EX を発行して振動出力を指定し入力データを得る SS=00 であれば、必要に応じて報告 2. へ SS=5A であれば、データを報告 & VSYNC後 8. へ こんなところでしょうか。すでに述べたようにREAD_DATA以外のコマンドは2回発行して 結果が等しくなることを確認する方が無難です。細かい実装は各自に任せます。 【コマンドリファレンス】 << コンフィギュレーションモードエンター(CONFIG_MODE_ENTER) >> CMD=01,43,00,01,00(,00,00,00,00) ※カッコ内はアナログモードの時のみ DAT=--,ID,SS,XX,XX(,XX,XX,XX,XX) この時点では通常の応答をする。 ID=41 --> デジタルモード ID=73 --> アナログモード (デュアルショックのみ) ID=E3 --> ジョグコンモード (ジョングコンのみ) SS=5A --> モード切り替えなし SS=00 --> モード切り替えあり ※詳細は「モード切り替え検出機能」を参照 XX=データ読みとりコマンドと同じ 付随効果としてこれ以降本体から有効なコマンドが約3秒以上断絶するまで デュアルショックとして動作するようになる。 << コンフィギュレーションモードイクジット(CONFIG_MODE_EXIT) >> CMD=01,43,00,00,00,00,00,00,00 DAT=--,F3,5A,00,00,00,00,00,00 << セットモード&ロック(SET_MODE_AND_LOCK) >> CMD=01,44,00,XX,YY,00,00,00,00 DAT=--,F3,5A,00,00,00,00,00,00 XX=01 --> アナログモード XX=00 --> デジタルモード YY=03 --> モード固定/ボタンにより切り替え不能 YY=03以外 --> ボタンにより切り替え可能 付随効果として強制的にバイブレーションがディセーブルされる。 << バイブレーションイネーブル(VIBRATION_ENABLE) >> CMD=01,4D,00,00,01,FF,FF,FF,FF DAT=--,F3,5A,FF,FF,FF,FF,FF,FF 5バイト目を'00'にしてもディセーブルされない。 応答の3、4バイト目が00,01の事もある? ちと不明。 << クエリーモデル&モード(QUERY_MODEL_AND_MODE) >> CMD=01,45,00,00,00,00,00,00,00 DAT=FF,F3,5A,01,02,MM,VV,01,00 VV=02 --> デュアルショック MM=01 --> アナログモード MM=00 --> デジタルモード VV=01 --> ジョグコン MM=01 --> ジョグコンモード MM=00 --> デジタルモード << リードデータ(READ_DATA) >> CMD=01,42,00,00,00(,00,00,00,00) DAT=--,ID,5A,XX,XX(,XX,XX,XX,XX) ID=41 --> デジタルモード ID=73 --> アナログモード (デュアルショックのみ) XX=読みとりデータ 詳細は文献1参照 << リードデータ&バイブレート(READ_DATA_AND_VIBRATE) >> CMD=01,42,00,MM,NN(,00,00,00,00) DAT=--,ID,5A,XX,XX(,XX,XX,XX,XX) ID=41 --> デジタルモード ID=73 --> アナログモード (デュアルショックのみ) MM の上位2ビットが 01 かつ NN の下位1ビットが 1 --> 小モータオン XX=読みとりデータ 詳細は文献1参照 アナログコントローラおよびデュアルショックのアナログコントローラ互換モード で使用。小モータしか振動させられない。 << リードデータ&バイブレートEX(READ_DATA_AND_VIBRATE_EX) >> CMD=01,42,00,WW,PP(,00,00,00,00) DAT=--,ID,SS,XX,XX(,XX,XX,XX,XX) ID=41 --> デジタルモード ID=73 --> アナログモード (デュアルショックのみ) ID=E3 --> ジョグコンモード (ジョグコンのみ) SS=5A --> モード切り替えなし SS=00 --> モード切り替えあり ※詳細は「モード切り替え検出機能」を参照 WW=00 --> 小モータオフ 互換モードとの違いに注意 WW=01 --> 小モータオン PP=00 --> 大モータオフ | PPには00〜FFを指定できるが、 PP=FF --> 大モータ出力最大 | あまり小さいと回転しないので注意 XX=読みとりデータ 詳細は文献1参照 コンフィギュレーション後はこちらのコマンドを使用。 コンフィギュレーション後はREAD_AND_VIBRATEは使えない。 【その他のコマンド】 前述のもの以外に以下のコマンドが観測されていますが機能は分かっていません。 CMD=01,4C,00,00,00,00,00,00,00 DAT=--,F3,5A,00,00,00,04,00,00 デュアルショック DAT=--,F3,5A,00,00,00,04,00,00 ジョグコン CMD=01,47,00,00,00,00,00,00,00 DAT=--,F3,5A,00,00,02,00,01,00 デュアルショック DAT=--,F3,5A,00,00,01,00,00,00 ジョグコン CMD=01,4C,00,00,00,00,00,00,00 DAT=--,F3,5A,00,00,00,04,00,00 デュアルショック DAT=--,F3,5A,00,00,00,04,00,00 ジョグコン CMD=01,4C,00,01,00,00,00,00,00 DAT=--,F3,5A,00,00,00,07,00,00 デュアルショック DAT=--,F3,5A,00,00,03,00,00,00 ジョグコン CMD=01,46,00,00,00,00,00,00,00 DAT=--,F3,5A,00,00,01,02,00,0A デュアルショック DAT=--,F3,5A,00,00,04,03,01,1E ジョグコン 【【備考】】 デュアルショックはACKの応答が速くてしかも短い(パルス幅が1μsec未満)ので、読みと ろうとするのは困難です。プレステの動作を観測しているとほとんどの場合同じコマン ドを連続して2回発行しているので、ACKは見ずに2回コマンドを発行して応答が同じで あるかどうかを検証してとるものと思われます。 【【用語】】 【デジタルモード】 ノーマルパッド互換モードのこと。アナログコントローラ、アナログジョイスティック 、デュアルショック、ジョグコンにおいてLEDが消灯しているときがデジタルモードであ る。14ボタン分の入力がある。 【アナログモード】 アナログコントローラ、デュアルショックにおいてLEDが赤く点灯しているときがアナロ グモードである。16ボタン4軸分の入力がある。 【【文献】】 文献1 「プレイステーション・PAD/メモリ・インターフェースの解析」 藤田 【【お願い】】 業務上の理由により、自分のホームページに掲載できなくなる恐れが出てきました。 リンクを張っていただくのももちろん歓迎しますが、積極的にミラーして頂けるよう お願いします。藤田氏の資料とマージできると一番良いですね。