得られるデータは、4バイトのヘッダと、 1トラックが11バイトで表される連続したデータからなります。
ヘッダは、次のとおりです。
BYTE\bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
0 |
|
|||||||||
1 | ||||||||||
2 | 開始セッション番号 | |||||||||
3 | 終了セッション番号 |
滅多にありませんが、書き込みと消去を繰り返した結果、 多くのセッションに分割されていたり、 スキップするデータが大量にある可能性を考慮すると、 ヘッダの「TOCデータ長」を元に能動的にメモリを確保した方が 無難だと思います。 なお、「TOCデータ長」にはそれ自体のバイト数 (2バイト) が含まれていないことに 注意してください。
各トラックの内容は、次のとおりです。
BYTE\bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||
0 | セッション番号 | |||||||||||
1 | ADR | CTRL | ||||||||||
2 | TNO | |||||||||||
3 | POINT | |||||||||||
4 | MIN | |||||||||||
5 | SEC | |||||||||||
6 | FRAME | |||||||||||
7 | ZERO | |||||||||||
8 | PMIN | |||||||||||
9 | PSEC | |||||||||||
10 | PFRAME |
Ctrl | 4 or 6 | 4 or 6 | 4 or 6 | 4 or 6 | ||||
ADR | 1 | 1 | 1 | 1 | ||||
TNO | 0x00 | 0x00 | 0x00 | 0x00 | ||||
POINT | 0x01〜0x63 トラック番号 | 0xA0 | 0xA1 | 0xA2 | ||||
AMIN | 分 | CD内の 位置 | 分 | CD内の 位置 |
分 | CD内の 位置 | 分 | CD内の 位置 |
ASEC | 秒 | 秒 | 秒 | 秒 | ||||
AFRAME | フレーム (=1/75秒) | フレーム (=1/75秒) |
フレーム (=1/75秒) | フレーム (=1/75秒) |
||||
ZERO | 0x00 | 0x00 | 0x00 | 0x00 | ||||
PMIN | 分 | トラックの 開始時間 |
最初の トラック番号 |
最後の トラック番号 |
分 | リードアウトの 開始時間 |
||
PSEC | 秒 | ディスク タイプ | 0x00 | 秒 | ||||
PFRAME | フレーム (=1/75秒) |
0x00 | 0x00 | フレーム (=1/75秒) |
Ctrl | 4 or 6 | 4 or 6 | ||
ADR | 5 | 5 | ||
TNO | 0x00 | 0x00 | ||
POINT | 0xB0 | 0xC0 | ||
AMIN | 分 | 次の セッションの データの 開始位置 |
書込レーザー出力 | |
ASEC | 秒 | 予約 | ||
AFRAME | フレーム (=1/75秒) |
予約 | ||
ZERO | ADR=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 エラーが出ます。
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コマンドが追加されてる様ですが・・・
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 なり他のコマンドを試すようなプログラムを作った覚えがあります。
うろ覚えですみませんが、参考になればさいわいです。
実はUSBメモリにCDのイメージファイル(拡張子はiso)をコピーし、それをCDに見せれないかな?と思ってます。これですとUSBの口があれば、CDドライブがなくてもCDを再生できるので便利です。でもUSBメモリはTOCの情報がが書き込まれてないので、どの様に応答していいか四苦八苦してます。READ TOCコマンドでMSF=1の時はどんな値を返せばよいかご存知でしたら教えて頂けませんか?勝手なお願いで恐縮です。
実はUSBメモリにCDのイメージファイル(拡張子はiso)をコピーし、それをCDに見せれないかな?と思ってます。これですとUSBの口があれば、CDドライブがなくてもCDを再生できるので便利です。でもUSBメモリはTOCの情報がが書き込まれてないので、どの様に応答していいか四苦八苦してます。READ TOCコマンドでMSF=1の時はどんな値を返せばよいかご存知でしたら教えて頂けませんか?勝手なお願いで恐縮です。
それと、昔はCDドライブの情報をMode Sense(5Ah)のPage Code 2Aで刈り取っていた様ですが、今は使われてないようです。今はGET CONFIGURATIONが使われてるのでしょうか?
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 を使っていました。