2006年08月18日

READ Full TOC Format=0010b

セッションの情報を含めた詳細な TOC を入手するには、READ TOC/PMA/ATIP コマンドの FORMAT に 0010B をセットします。

得られるデータは、4バイトのヘッダと、 1トラックが11バイトで表される連続したデータからなります。

ヘッダは、次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
TOCデータ長
(LSB)
1
2開始セッション番号
3終了セッション番号


滅多にありませんが、書き込みと消去を繰り返した結果、 多くのセッションに分割されていたり、 スキップするデータが大量にある可能性を考慮すると、 ヘッダの「TOCデータ長」を元に能動的にメモリを確保した方が 無難だと思います。 なお、「TOCデータ長」にはそれ自体のバイト数 (2バイト) が含まれていないことに 注意してください。

各トラックの内容は、次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0セッション番号
1ADRCTRL
2TNO
3POINT
4MIN
5SEC
6FRAME
7ZERO
8PMIN
9PSEC
10PFRAME

Ctrl4 or 64 or 64 or 64 or 6
ADR1111
TNO0x000x000x000x00
POINT0x01〜0x63
トラック番号
0xA00xA10xA2
AMINCD内の
位置
CD内の
位置
CD内の
位置
CD内の
位置
ASEC
AFRAMEフレーム
(=1/75秒)
フレーム
(=1/75秒)
フレーム
(=1/75秒)
フレーム
(=1/75秒)
ZERO0x000x000x000x00
PMINトラックの
開始時間
最初の
トラック番号
最後の
トラック番号
リードアウトの
開始時間
PSEC ディスク
タイプ
0x00
PFRAMEフレーム
(=1/75秒)
0x000x00 フレーム
(=1/75秒)

Ctrl4 or 64 or 6
ADR55
TNO0x000x00
POINT0xB00xC0
AMIN次の
セッションの
データの
開始位置
書込レーザー出力
ASEC 予約
AFRAMEフレーム
(=1/75秒)
予約
ZEROADR=0x05 の数 予約
PMINデータを
書込み可能な
最後の位置
最初の
リードインの
開始時間
PSEC
PFRAMEフレーム
(=1/75秒)
フレーム
(=1/75秒)

この他、スキップするデータを示すために POINT=0xB1, 0xB2〜0xB4, 0x01〜0x40, それと POINT=0xC1 が用意されていますが、割愛します。

値が BCD でないことを除けば、Qチャネルから直接読み取られた値と同じです。


DVD、HD-DVD、Blu-ray などのCD以外のメディアでは、このコマンドは定義されていません。 SK=5, ASC=24, ASCQ=00, ILLEGAL REQUEST/INVALID FIELD IN CDB エラーが出ます。
posted by 七癖 at 10:27| Comment(6) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
CDの説明が分かりやすく載ってるので参考になります。READ TOCコマンドのFormat=0000bとFormat=0010bで教えてください。
Windows 2000/XPはFormat=0000bを使ってますが、おそらくはレガシーな仕様(SFF8020, version 1.2で定義されたコマンドのByte9のBit7-6)だと思われます。
Windows VistaはFormat=0001bを使ってるようです。
Format=0010bを出してくるOSは今のところ不明です(個人で調べた範囲では)
そのため、READ TOCの応答フォーマットでPOINT=A0/A1/A2を返す機会がありませんが、OSはどの様にしてこの情報を取りにくるのでしょうか?
最新のOSは訳の分からないSCSIコマンドが追加されてる様ですが・・・
Posted by CDマニア at 2009年06月08日 18:45
これを書いていたころ、Windows ME の WNASPI32.DLL を使ってプログラムをしており、OS標準のソフトウェアがどうやっているのか調べたことがありません。
CD Manipulator では Format=0010b を使っています。
参考にした SCSI Multi-Media Commands のおそらく最新版 mmc6r02a.pdf
(リンクが切れていたので、
http://www.t11.org/t10/drafts.htm
からダウンロード)
によると、Format=0001b はセッションの数を知るためのもので、この後、Format=0000b か Format=0010b を使っていると勝手に推測します。
ただ、これらのコマンドに対応しているかどうかは、光学ドライブ次第であり、メーカーによっては空いた番号に独自のコマンドを用意してあったと思います。ですから、対応コマンドを調べたり、Format=0010b を使ってみて駄目なら Format=0000b なり他のコマンドを試すようなプログラムを作った覚えがあります。

うろ覚えですみませんが、参考になればさいわいです。
Posted by 七癖(管理人) at 2009年06月08日 19:55
ご回答ありがとうございました。参考になりました。
実はUSBメモリにCDのイメージファイル(拡張子はiso)をコピーし、それをCDに見せれないかな?と思ってます。これですとUSBの口があれば、CDドライブがなくてもCDを再生できるので便利です。でもUSBメモリはTOCの情報がが書き込まれてないので、どの様に応答していいか四苦八苦してます。READ TOCコマンドでMSF=1の時はどんな値を返せばよいかご存知でしたら教えて頂けませんか?勝手なお願いで恐縮です。
Posted by CDマニア at 2009年06月11日 11:32
ご回答ありがとうございました。参考になりました。
実はUSBメモリにCDのイメージファイル(拡張子はiso)をコピーし、それをCDに見せれないかな?と思ってます。これですとUSBの口があれば、CDドライブがなくてもCDを再生できるので便利です。でもUSBメモリはTOCの情報がが書き込まれてないので、どの様に応答していいか四苦八苦してます。READ TOCコマンドでMSF=1の時はどんな値を返せばよいかご存知でしたら教えて頂けませんか?勝手なお願いで恐縮です。
それと、昔はCDドライブの情報をMode Sense(5Ah)のPage Code 2Aで刈り取っていた様ですが、今は使われてないようです。今はGET CONFIGURATIONが使われてるのでしょうか?
Posted by CDマニア at 2009年06月11日 11:40
音楽CDのイメージファイルの場合、TOCは cueシート、ccd、cdiのフッタ、mdf、などに書かれています。仮想ドライブならそこから読み出せばよいのですが、USBメモリは見当もつきません。

isoファイルのように、データトラック一つだけの CD-ROM の TOC を、Format=0000b、MSF=1 で読み出した例を挙げておきます。

Data Length = 18
First Track No. = 1
Last Track No. = 1

Track No.= 1
channel = 0
type = 1
copy = 0
emphasis = 0
start address(MSF) = 00:02:00

Track No. = 170 (AAh)
channel = 0
type = 1
copy = 0
emphasis = 0
start address(MSF) = 03:52:44

このディスクを ImgBurn で読み込むと、(((3*60+52)*75+44) - (2*75))*2048 = 34,795,520 バイトのisoファイルが作成されます。

なお、MSFは CD で最大 79:59:74、DVD で最大 255:59:74 (約2G)までしか表示できません。

ドライブの情報ですが、OSは知りませんが、私の場合、INQUIRY(12h)、GET CONFIGURATION(46h)、それとバッファサイズの取得に Mode Sense(5Ah)の 2A を使っていました。
Posted by 七癖(管理人) at 2009年06月11日 23:46
ご回答ありがとうございました。参考になりました。これからも頑張ってください。
Posted by CDマニア at 2009年06月12日 15:46
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック