りんけーじ - 開発資料 - PSX - CD-ROM


この資料について

ここには FlareStorm の開発の際に PlayStation の CD-ROM の動きを解析した情報を載せていきます。
最初は psx.padua.org の CD-ROM の解析の情報をもとに進めてきました。以下の解析の情報はその資料をもとに、私自身が解析したものです。
一応書いておきますが、以下の情報は推測を含み、間違っているものもあるかもしれません。
解析は SCPH-1000 で行っています。
ビットは最下位ビットをビット 0 とします。

ハードウェアレジスタ

CD-ROM を制御するのに使われるのはこれら 4 つのレジスタです。全て 8 bit です。
名前はどこかの資料かなにかで見たものです。
アドレスこの資料での呼び名
0x1F801800モード, Mode
0x1F801801コントロール, Control
0x1F801802パラメータ, Param
0x1F801803割り込み, Clear
アドレスロード時ストア時
0x1F801800 下位 2 ビット(マスク 0x07) : 現在のモード
0x04 : 不明
0x08 : パラメータバッファが空
0x10 : 不明
0x20 : コマンドの結果(リザルト)あり
0x40 : データ転送レディ
0x80 : ビジー,保留された命令あり
下位 2 ビット(マスク 0x07) : モード
それ以外は不明
残りの 3 つのレジスタはモードによって動作が異なります。
モード主な目的
0パラメータセット, 命令送信
1データ受け取り, 割り込みクリア他
2,3CD-DA / XA Audio の制御

モード 0

アドレスロード時ストア時
0x1F801801 未確認 命令, ストアと同時に開始
0x1F801802 未確認 パラメータ
0x1F801803 ビット 5-7(マスク 0xE0) : 不明, 常に 0xE0 ?
ビット 4(マスク 0x10) : データ転送レディ ?
下位 4 ビット(マスク 0x0F) : 不明, 常に 0x07 ?
0x00 : 読み込みバッファから転送バッファへ転送 ?
0x80 : データ転送レディのフラグをセット, 転送準備 ?

モード 1

アドレスロード時ストア時
0x1F801801 命令の結果受け取り 未確認
0x1F801802 セクタバッファからの読み取り 未確認
0x1F801803 下位 4 ビット(マスク 0x0F) : 割り込み
上位 4 ビット(マスク 0xF0) : 不明, 常に 0x0E ?
下位 4 ビット(マスク 0x0F) : 割り込みクリア, INT = INT & ~x でクリアされる
上位 4 ビット(マスク 0xF0) : 不明, 機能無し ?

コマンドと割り込み

コマンドを書き込む手順は、モードを 0 にして、パラメータが必要なら順に書き込み、最後にコマンドを書き込む。
コマンドを書き込むと、割り込みが発生していなければ実行が開始される。
以前の割り込みがまだクリアされていない場合は、モードレジスタの ビジー フラグが立ち、命令は割り込みがクリアされるまで保留される。
命令が実行されると、パラメータバッファは自動的にクリアされる。

命令の結果の受け取り

命令の結果を受け取るには、モードを 1 にしてから読み込む。
コマンドが実行されると数バイトの結果が生成され、一バイトずつ読むことができる。これ以上データが無ければ、モードレジスタの 0x20 が消える。 ただし、この状態でさらに読み込むと、再び 0x20 のフラグが立つ。
バッファは 16 バイトで、その 16 バイトを読むと次からまた最初のデータを返してくる。ただし 0x20 のフラグは戻らない。

多くのコマンドが共通で返す結果に、CD のステータスがある。また、エラー時はステータスコード + エラーコードとなる。

CD のステータスコード

0x01 : エラー
0x02 : CD が最低回転数以上で回転している
0x10 : 最後のステータスチェック以降にフタが開いた
0x20 : リード中

エラーコード(括弧内はエラーを起こす代表的な命令)

0x20 : スタンバイ状態での standby
0x40 : 待っている命令がない状態での sync, 音楽 CD などへの readN
0x80 : カバーが開いている状態での setloc, readN, pause

割り込みの確認とクリア

コマンドの終了は通常は割り込みで行う。割り込みコードは 01 から 05 まである。
ほとんどの場合は 03 を発生させる。失敗時は 05 Error。
割り込みコードが 0 で無い間、次の命令や処理は行われないので、必要ない場合はクリアする。通常は 0x07 を Clear レジスタに書き込む。
現在の割り込みコードを INT、書き込んだデータを x とすると、INT = INT & ~x の演算が行われる。
特に 0x07 で無ければならないわけでは無く、00 になれば次の命令が処理できるようになるというだけ。

コマンド

命令コード 機能 パラメータ 結果 割り込み 備考
00 sync 前の命令の完了を待つ なし
01 nop No-operation. 何もしない。 なし ステータスコード 03
02 setloc Seek や Read, Play の目標をセットする m:s:f(絶対位置) ステータスコード 03
07 standby CD の回転を開始する なし ステータスコード 03, 02 既に回転している場合はエラー
08 stop CD の回転を停止する なし ステータスコード 03, 02
0D setfilter フィルタを設定をする File, Channel ステータスコード 03
0F getparam 現在の設定を返す なし ステータスコード + Mode + 00 + File + Channel 03
10 getlocl 最後に読んだセクタのヘッダを得る なし Header(4 バイト) + Subheader(4 バイト) 03
13 getTN トラック数を得る なし ステータスコード + 最初 + 最後のトラック番号 03
14 getTD トラックの開始時間を得る トラック番号 ステータスコード + トラックの開始時間 m + s 03
15 seekL 指定位置へシークする なし ステータスコード 03, 02
19 test (サブコマンドを参照)
1A id プロテクションステータスを得る なし プロテクションステータス(4 バイト) + ライセンサコード(4 バイト) 03, 02
1C reset ユニットをリセットする なし なし 03

19 Test のサブコマンド

コマンド 19 Test はパラメータに値をセットすることで、いろいろな動作をする。
ただしまだ調査中で、未確認、詳細不明のものが多い。
11 から 18 は CD 未挿入時のもの。
命令コード機能
01フタが開いていると、CD が逆回転。閉めて開け直しても止まらない。コマンド 1C Reset で戻る。
02CD が逆回転。01 と同じく止まらない。
10ピックアップ位置リセット, レーザー OFF
11ピックアップ位置上昇, レーザー ON
12ピックアップ位置降下, レーザー ON
13ピックアップレンズ外周側に移動, レーザー ON
14ピックアップレンズ内周側に移動, レーザー ON
15ピックアップユニット最外周に移動, レーザー ON
16ピックアップユニット最内周に移動, レーザー ON
17CD 回転モーター順方向回転, レーザー ON
18CD 回転モーター逆方向回転, レーザー ON
20コントローラチップの ID? 4 バイト
21(フラグ)CD 未挿入時:0x01 フタが開いている:0x02

修正・更新履歴