#!/usr/bin/perl # 2002.01.20 作成 mkus@sopia.or.jp # #注意!!! # # このコンテンツは、「単にファイルとして存在するもの」とし #て作成されています。それ以外の使い道は、しないでください。 # # PERLスクリプトとしてPERLインタプリタに与える事は、 #想定されていません!! # # #---- この先の「一見URLに見える文字列」は、URLではありません。 # # Active Perl の 5.6.0 で確認。 # http://www.ActiveState.com/ # perl.exe と perl56.dll だけ、c:\windows とか c:\winnt に #あればOK. ウチだと、c:\bin にある。困ったら、 # http://www.perl.com/ #にでも聞く。それでだめなら、 # http://www.leo.org/ # http://hobbes.nmsu.edu/ #あたりをさまよう。rsx とか emx とかいう言葉がたより。 # # しもた、10BASEのネットワーク経由で x4 on the fly 書き込みやってもた。 # =head1 CD−R/RWドライブ書き込み能力検証イメージ  このプログラムが作成するイメージーで山ほどエラーが出ても 気にする必要はありません。また、実際には「読み出しドライブ の読み出し能力」とペアで測定している事を忘れないでください。  つまり、CD上に刻まれたパターンには、読み出し難易度とい うものが存在しているのです。そして、焼きドライブによって、 同じデーターが異なる難易度のパターンに変換されるのです。も ちろん、「パターンを正しくCD上に作る」能力もドライブ(と メディア)によって異なります。そこが難しいところです。 =head2 概要 このスクリプトは、Perlバージョン5以降を対象とする。 作成時点で、9種類のイメージを作成。 内訳は、簡易診断用イメージが1つ。通常診断用イメージが8つ。 基本的に、イメージをCD−R/RWメディアに焼き、その後、 読み出しを行うことでチェックを行う。ISO9660ファイル システムを作らないのでCD−ROMとしては使えない。 MODE1/2048のイメージを作るので、この形式に対応し た環境で書き込む必要がある。             簡易診断用    通常診断用 診断セクタの種類  65536種類   8192種類 前置きセクタ        0個       0個 セクタ連続数        4個      10個 後置きセクタ        0個      10個 イメージサイズ     512MB    320MB 診断セクタは、0000〜FFFFの生成キーによって異なる 65536種類を生成可能。 生成キー  セクタの説明 7D65  世間一般でいうSD2.0セクタ 3F65  世間一般でいうSD2.0セクタ 1212  世間一般でいうSD2.5セクタ 14B9  世間一般でいうSD2.5セクタ B8B8  EFM変調表を見る限り、「まず」焼けないセクタ(*1) BABA  同上 FAFA  同上 (*1)ピット/ランド比がどちらかに偏る。結果、読み出し時のRF 信号からの復調に失敗しやすくなる。サブ・チャネルをうまく使い、 フレームの前半と後半でピット/ランド比を反転させてやればなん とかなるのかもしれない。  # 後は、ファーム側で「そういうパターンの時は、強引に  #C1エラー訂正を使うパターンを書込む」ようにしてもらう  #とか。  # ・・・既にそういうドライブあったりして・・・。  # 1EFMフレーム(588シンボル 28バイト)に対して、ピッ  #ト面積とランド面積を比較。大きく異なる場合は、面積  #がほぼ等しくなるように1バイトだけ書き換え。当然、  #C1エラーになるが、RF出力の中心がずれてPLL同期を見失  #うよりマシ。  # この段階なら、まだ後ろに C2 も RSPC も控えている  #ので影響は少ないと思うが、この処理は既に制御チップ  #内部だからなぁ・・・。 =head2 簡易診断用イメージ  読み取りエラーの発生したセクタ番号を4で割った値が、書き込 みに失敗したセクタを生成に用いたキー。 =head2 通常診断用イメージ  読み取りエラーの発生したセクタ番号を20で割った値が、その セクタの生成に用いたキー。 =head2 パターンファイルから作成した診断イメージ  1パターンあたり100セクタを使用。真ん中の20セクタが指定 パターンで作成したもの。1パターンあたり、200Kバイト食うの で、1枚のCDでは3000パターンが上限。 =cut # # # # sub GetScramblePat { local($i); $i = ''; $i .= "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80\x00\x60"; $i .= "\x00\x28\x00\x1e\x80\x08\x60\x06\xa8\x02\xfe\x81\x80\x60\x60\x28"; $i .= "\x28\x1e\x9e\x88\x68\x66\xae\xaa\xfc\x7f\x01\xe0\x00\x48\x00\x36"; $i .= "\x80\x16\xe0\x0e\xc8\x04\x56\x83\x7e\xe1\xe0\x48\x48\x36\xb6\x96"; $i .= "\xf6\xee\xc6\xcc\x52\xd5\xfd\x9f\x01\xa8\x00\x7e\x80\x20\x60\x18"; $i .= "\x28\x0a\x9e\x87\x28\x62\x9e\xa9\xa8\x7e\xfe\xa0\x40\x78\x30\x22"; $i .= "\x94\x19\xaf\x4a\xfc\x37\x01\xd6\x80\x5e\xe0\x38\x48\x12\xb6\x8d"; $i .= "\xb6\xe5\xb6\xcb\x36\xd7\x56\xde\xbe\xd8\x70\x5a\xa4\x3b\x3b\x53"; $i .= "\x53\x7d\xfd\xe1\x81\x88\x60\x66\xa8\x2a\xfe\x9f\x00\x68\x00\x2e"; $i .= "\x80\x1c\x60\x09\xe8\x06\xce\x82\xd4\x61\x9f\x68\x68\x2e\xae\x9c"; $i .= "\x7c\x69\xe1\xee\xc8\x4c\x56\xb5\xfe\xf7\x00\x46\x80\x32\xe0\x15"; $i .= "\x88\x0f\x26\x84\x1a\xe3\x4b\x09\xf7\x46\xc6\xb2\xd2\xf5\x9d\x87"; $i .= "\x29\xa2\x9e\xf9\xa8\x42\xfe\xb1\x80\x74\x60\x27\x68\x1a\xae\x8b"; $i .= "\x3c\x67\x51\xea\xbc\x4f\x31\xf4\x14\x47\x4f\x72\xb4\x25\xb7\x5b"; $i .= "\x36\xbb\x56\xf3\x7e\xc5\xe0\x53\x08\x3d\xc6\x91\x92\xec\x6d\x8d"; $i .= "\xed\xa5\x8d\xbb\x25\xb3\x5b\x35\xfb\x57\x03\x7e\x81\xe0\x60\x48"; $i .= "\x28\x36\x9e\x96\xe8\x6e\xce\xac\x54\x7d\xff\x61\x80\x28\x60\x1e"; $i .= "\xa8\x08\x7e\x86\xa0\x62\xf8\x29\x82\x9e\xe1\xa8\x48\x7e\xb6\xa0"; $i .= "\x76\xf8\x26\xc2\x9a\xd1\xab\x1c\x7f\x49\xe0\x36\xc8\x16\xd6\x8e"; $i .= "\xde\xe4\x58\x4b\x7a\xb7\x63\x36\xa9\xd6\xfe\xde\xc0\x58\x50\x3a"; $i .= "\xbc\x13\x31\xcd\xd4\x55\x9f\x7f\x28\x20\x1e\x98\x08\x6a\x86\xaf"; $i .= "\x22\xfc\x19\x81\xca\xe0\x57\x08\x3e\x86\x90\x62\xec\x29\x8d\xde"; $i .= "\xe5\x98\x4b\x2a\xb7\x5f\x36\xb8\x16\xf2\x8e\xc5\xa4\x53\x3b\x7d"; $i .= "\xd3\x61\x9d\xe8\x69\x8e\xae\xe4\x7c\x4b\x61\xf7\x68\x46\xae\xb2"; $i .= "\xfc\x75\x81\xe7\x20\x4a\x98\x37\x2a\x96\x9f\x2e\xe8\x1c\x4e\x89"; $i .= "\xf4\x66\xc7\x6a\xd2\xaf\x1d\xbc\x09\xb1\xc6\xf4\x52\xc7\x7d\x92"; $i .= "\xa1\xad\xb8\x7d\xb2\xa1\xb5\xb8\x77\x32\xa6\x95\xba\xef\x33\x0c"; $i .= "\x15\xc5\xcf\x13\x14\x0d\xcf\x45\x94\x33\x2f\x55\xdc\x3f\x19\xd0"; $i .= "\x0a\xdc\x07\x19\xc2\x8a\xd1\xa7\x1c\x7a\x89\xe3\x26\xc9\xda\xd6"; $i .= "\xdb\x1e\xdb\x48\x5b\x76\xbb\x66\xf3\x6a\xc5\xef\x13\x0c\x0d\xc5"; $i .= "\xc5\x93\x13\x2d\xcd\xdd\x95\x99\xaf\x2a\xfc\x1f\x01\xc8\x00\x56"; $i .= "\x80\x3e\xe0\x10\x48\x0c\x36\x85\xd6\xe3\x1e\xc9\xc8\x56\xd6\xbe"; $i .= "\xde\xf0\x58\x44\x3a\xb3\x53\x35\xfd\xd7\x01\x9e\x80\x68\x60\x2e"; $i .= "\xa8\x1c\x7e\x89\xe0\x66\xc8\x2a\xd6\x9f\x1e\xe8\x08\x4e\x86\xb4"; $i .= "\x62\xf7\x69\x86\xae\xe2\xfc\x49\x81\xf6\xe0\x46\xc8\x32\xd6\x95"; $i .= "\x9e\xef\x28\x4c\x1e\xb5\xc8\x77\x16\xa6\x8e\xfa\xe4\x43\x0b\x71"; $i .= "\xc7\x64\x52\xab\x7d\xbf\x61\xb0\x28\x74\x1e\xa7\x48\x7a\xb6\xa3"; $i .= "\x36\xf9\xd6\xc2\xde\xd1\x98\x5c\x6a\xb9\xef\x32\xcc\x15\x95\xcf"; $i .= "\x2f\x14\x1c\x0f\x49\xc4\x36\xd3\x56\xdd\xfe\xd9\x80\x5a\xe0\x3b"; $i .= "\x08\x13\x46\x8d\xf2\xe5\x85\x8b\x23\x27\x59\xda\xba\xdb\x33\x1b"; $i .= "\x55\xcb\x7f\x17\x60\x0e\xa8\x04\x7e\x83\x60\x61\xe8\x28\x4e\x9e"; $i .= "\xb4\x68\x77\x6e\xa6\xac\x7a\xfd\xe3\x01\x89\xc0\x66\xd0\x2a\xdc"; $i .= "\x1f\x19\xc8\x0a\xd6\x87\x1e\xe2\x88\x49\xa6\xb6\xfa\xf6\xc3\x06"; $i .= "\xd1\xc2\xdc\x51\x99\xfc\x6a\xc1\xef\x10\x4c\x0c\x35\xc5\xd7\x13"; $i .= "\x1e\x8d\xc8\x65\x96\xab\x2e\xff\x5c\x40\x39\xf0\x12\xc4\x0d\x93"; $i .= "\x45\xad\xf3\x3d\x85\xd1\xa3\x1c\x79\xc9\xe2\xd6\xc9\x9e\xd6\xe8"; $i .= "\x5e\xce\xb8\x54\x72\xbf\x65\xb0\x2b\x34\x1f\x57\x48\x3e\xb6\x90"; $i .= "\x76\xec\x26\xcd\xda\xd5\x9b\x1f\x2b\x48\x1f\x76\x88\x26\xe6\x9a"; $i .= "\xca\xeb\x17\x0f\x4e\x84\x34\x63\x57\x69\xfe\xae\xc0\x7c\x50\x21"; $i .= "\xfc\x18\x41\xca\xb0\x57\x34\x3e\x97\x50\x6e\xbc\x2c\x71\xdd\xe4"; $i .= "\x59\x8b\x7a\xe7\x63\x0a\xa9\xc7\x3e\xd2\x90\x5d\xac\x39\xbd\xd2"; $i .= "\xf1\x9d\x84\x69\xa3\x6e\xf9\xec\x42\xcd\xf1\x95\x84\x6f\x23\x6c"; $i .= "\x19\xed\xca\xcd\x97\x15\xae\x8f\x3c\x64\x11\xeb\x4c\x4f\x75\xf4"; $i .= "\x27\x07\x5a\x82\xbb\x21\xb3\x58\x75\xfa\xa7\x03\x3a\x81\xd3\x20"; $i .= "\x5d\xd8\x39\x9a\x92\xeb\x2d\x8f\x5d\xa4\x39\xbb\x52\xf3\x7d\x85"; $i .= "\xe1\xa3\x08\x79\xc6\xa2\xd2\xf9\x9d\x82\xe9\xa1\x8e\xf8\x64\x42"; $i .= "\xab\x71\xbf\x64\x70\x2b\x64\x1f\x6b\x48\x2f\x76\x9c\x26\xe9\xda"; $i .= "\xce\xdb\x14\x5b\x4f\x7b\x74\x23\x67\x59\xea\xba\xcf\x33\x14\x15"; $i .= "\xcf\x4f\x14\x34\x0f\x57\x44\x3e\xb3\x50\x75\xfc\x27\x01\xda\x80"; $i .= "\x5b\x20\x3b\x58\x13\x7a\x8d\xe3\x25\x89\xdb\x26\xdb\x5a\xdb\x7b"; $i .= "\x1b\x63\x4b\x69\xf7\x6e\xc6\xac\x52\xfd\xfd\x81\x81\xa0\x60\x78"; $i .= "\x28\x22\x9e\x99\xa8\x6a\xfe\xaf\x00\x7c\x00\x21\xc0\x18\x50\x0a"; $i .= "\xbc\x07\x31\xc2\x94\x51\xaf\x7c\x7c\x21\xe1\xd8\x48\x5a\xb6\xbb"; $i .= "\x36\xf3\x56\xc5\xfe\xd3\x00\x5d\xc0\x39\x90\x12\xec\x0d\x8d\xc5"; $i .= "\xa5\x93\x3b\x2d\xd3\x5d\x9d\xf9\xa9\x82\xfe\xe1\x80\x48\x60\x36"; $i .= "\xa8\x16\xfe\x8e\xc0\x64\x50\x2b\x7c\x1f\x61\xc8\x28\x56\x9e\xbe"; $i .= "\xe8\x70\x4e\xa4\x34\x7b\x57\x63\x7e\xa9\xe0\x7e\xc8\x20\x56\x98"; $i .= "\x3e\xea\x90\x4f\x2c\x34\x1d\xd7\x49\x9e\xb6\xe8\x76\xce\xa6\xd4"; $i .= "\x7a\xdf\x63\x18\x29\xca\x9e\xd7\x28\x5e\x9e\xb8\x68\x72\xae\xa5"; $i .= "\xbc\x7b\x31\xe3\x54\x49\xff\x76\xc0\x26\xd0\x1a\xdc\x0b\x19\xc7"; $i .= "\x4a\xd2\xb7\x1d\xb6\x89\xb6\xe6\xf6\xca\xc6\xd7\x12\xde\x8d\x98"; $i .= "\x65\xaa\xab\x3f\x3f\x50\x10\x3c\x0c\x11\xc5\xcc\x53\x15\xfd\xcf"; $i .= "\x01\x94\x00\x6f\x40\x2c\x30\x1d\xd4\x09\x9f\x46\xe8\x32\xce\x95"; $i .= "\x94\x6f\x2f\x6c\x1c\x2d\xc9\xdd\x96\xd9\xae\xda\xfc\x5b\x01\xfb"; $i .= "\x40\x43\x70\x31\xe4\x14\x4b\x4f\x77\x74\x26\xa7\x5a\xfa\xbb\x03"; $i .= "\x33\x41\xd5\xf0\x5f\x04\x38\x03\x52\x81\xfd\xa0\x41\xb8\x30\x72"; $i .= "\x94\x25\xaf\x5b\x3c\x3b\x51\xd3\x7c\x5d\xe1\xf9\x88\x42\xe6\xb1"; $i .= "\x8a\xf4\x67\x07\x6a\x82\xaf\x21\xbc\x18\x71\xca\xa4\x57\x3b\x7e"; $i .= "\x93\x60\x6d\xe8\x2d\x8e\x9d\xa4\x69\xbb\x6e\xf3\x6c\x45\xed\xf3"; $i .= "\x0d\x85\xc5\xa3\x13\x39\xcd\xd2\xd5\x9d\x9f\x29\xa8\x1e\xfe\x88"; $i .= "\x40\x66\xb0\x2a\xf4\x1f\x07\x48\x02\xb6\x81\xb6\xe0\x76\xc8\x26"; $i .= "\xd6\x9a\xde\xeb\x18\x4f\x4a\xb4\x37\x37\x56\x96\xbe\xee\xf0\x4c"; $i .= "\x44\x35\xf3\x57\x05\xfe\x83\x00\x61\xc0\x28\x50\x1e\xbc\x08\x71"; $i .= "\xc6\xa4\x52\xfb\x7d\x83\x61\xa1\xe8\x78\x4e\xa2\xb4\x79\xb7\x62"; $i .= "\xf6\xa9\x86\xfe\xe2\xc0\x49\x90\x36\xec\x16\xcd\xce\xd5\x94\x5f"; $i .= "\x2f\x78\x1c\x22\x89\xd9\xa6\xda\xfa\xdb\x03\x1b\x41\xcb\x70\x57"; $i .= "\x64\x3e\xab\x50\x7f\x7c\x20\x21\xd8\x18\x5a\x8a\xbb\x27\x33\x5a"; $i .= "\x95\xfb\x2f\x03\x5c\x01\xf9\xc0\x42\xd0\x31\x9c\x14\x69\xcf\x6e"; $i .= "\xd4\x2c\x5f\x5d\xf8\x39\x82\x92\xe1\xad\x88\x7d\xa6\xa1\xba\xf8"; $i .= "\x73\x02\xa5\xc1\xbb\x10\x73\x4c\x25\xf5\xdb\x07\x1b\x42\x8b\x71"; $i .= "\xa7\x64\x7a\xab\x63\x3f\x69\xd0\x2e\xdc\x1c\x59\xc9\xfa\xd6\xc3"; $i .= "\x1e\xd1\xc8\x5c\x56\xb9\xfe\xf2\xc0\x45\x90\x33\x2c\x15\xdd\xcf"; $i .= "\x19\x94\x0a\xef\x47\x0c\x32\x85\xd5\xa3\x1f\x39\xc8\x12\xd6\x8d"; $i .= "\x9e\xe5\xa8\x4b\x3e\xb7\x50\x76\xbc\x26\xf1\xda\xc4\x5b\x13\x7b"; $i .= "\x4d\xe3\x75\x89\xe7\x26\xca\x9a\xd7\x2b\x1e\x9f\x48\x68\x36\xae"; $i .= "\x96\xfc\x6e\xc1\xec\x50\x4d\xfc\x35\x81\xd7\x20\x5e\x98\x38\x6a"; $i .= "\x92\xaf\x2d\xbc\x1d\xb1\xc9\xb4\x56\xf7\x7e\xc6\xa0\x52\xf8\x3d"; $i .= "\x82\x91\xa1\xac\x78\x7d\xe2\xa1\x89\xb8\x66\xf2\xaa\xc5\xbf\x13"; $i .= "\x30\x0d\xd4\x05\x9f\x43\x28\x31\xde\x94\x58\x6f\x7a\xac\x23\x3d"; $i .= "\xd9\xd1\x9a\xdc\x6b\x19\xef\x4a\xcc\x37\x15\xd6\x8f\x1e\xe4\x08"; $i .= "\x4b\x46\xb7\x72\xf6\xa5\x86\xfb\x22\xc3\x59\x91\xfa\xec\x43\x0d"; $i .= "\xf1\xc5\x84\x53\x23\x7d\xd9\xe1\x9a\xc8\x6b\x16\xaf\x4e\xfc\x34"; $i .= "\x41\xd7\x70\x5e\xa4\x38\x7b\x52\xa3\x7d\xb9\xe1\xb2\xc8\x75\x96"; $i .= "\xa7\x2e\xfa\x9c\x43\x29\xf1\xde\xc4\x58\x53\x7a\xbd\xe3\x31\x89"; $i .= "\xd4\x66\xdf\x6a\xd8\x2f\x1a\x9c\x0b\x29\xc7\x5e\xd2\xb8\x5d\xb2"; $i .= "\xb9\xb5\xb2\xf7\x35\x86\x97\x22\xee\x99\x8c\x6a\xe5\xef\x0b\x0c"; $i .= "\x07\x45\xc2\xb3\x11\xb5\xcc\x77\x15\xe6\x8f\x0a\xe4\x07\x0b\x42"; $i .= "\x87\x71\xa2\xa4\x79\xbb\x62\xf3\x69\x85\xee\xe3\x0c\x49\xc5\xf6"; $i .= "\xd3\x06\xdd\xc2\xd9\x91\x9a\xec\x6b\x0d\xef\x45\x8c\x33\x25\xd5"; $i .= "\xdb\x1f\x1b\x48\x0b\x76\x87\x66\xe2\xaa\xc9\xbf\x16\xf0\x0e\xc4"; $i .= "\x04\x53\x43\x7d\xf1\xe1\x84\x48\x63\x76\xa9\xe6\xfe\xca\xc0\x57"; $i .= "\x10\x3e\x8c\x10\x65\xcc\x2b\x15\xdf\x4f\x18\x34\x0a\x97\x47\x2e"; $i .= "\xb2\x9c\x75\xa9\xe7\x3e\xca\x90\x57\x2c\x3e\x9d\xd0\x69\x9c\x2e"; $i .= "\xe9\xdc\x4e\xd9\xf4\x5a\xc7\x7b\x12\xa3\x4d\xb9\xf5\xb2\xc7\x35"; $i .= "\x92\x97\x2d\xae\x9d\xbc\x69\xb1\xee\xf4\x4c\x47\x75\xf2\xa7\x05"; $i .= "\xba\x83\x33\x21\xd5\xd8\x5f\x1a\xb8\x0b\x32\x87\x55\xa2\xbf\x39"; $i .= "\xb0\x12\xf4\x0d\x87\x45\xa2\xb3\x39\xb5\xd2\xf7\x1d\x86\x89\xa2"; $i .= "\xe6\xf9\x8a\xc2\xe7\x11\x8a\x8c\x67\x25\xea\x9b\x0f\x2b\x44\x1f"; $i .= "\x73\x48\x25\xf6\x9b\x06\xeb\x42\xcf\x71\x94\x24\x6f\x5b\x6c\x3b"; $i .= "\x6d\xd3\x6d\x9d\xed\xa9\x8d\xbe\xe5\xb0\x4b\x34\x37\x57\x56\xbe"; $i .= "\xbe\xf0\x70\x44\x24\x33\x5b\x55\xfb\x7f\x03\x60\x01\xe8\x00\x4e"; $i .= "\x80\x34\x60\x17\x68\x0e\xae\x84\x7c\x63\x61\xe9\xe8\x4e\xce\xb4"; $i .= "\x54\x77\x7f\x66\xa0\x2a\xf8\x1f\x02\x88\x01\xa6\x80\x7a\xe0\x23"; $i .= "\x08\x19\xc6\x8a\xd2\xe7\x1d\x8a\x89\xa7\x26\xfa\x9a\xc3\x2b\x11"; $i .= "\xdf\x4c\x58\x35\xfa\x97\x03\x2e\x81\xdc\x60\x59\xe8\x3a\xce\x93"; $i .= "\x14\x6d\xcf\x6d\x94\x2d\xaf\x5d\xbc\x39\xb1\xd2\xf4\x5d\x87\x79"; $i .= "\xa2\xa2\xf9\xb9\x82\xf2\xe1\x85\x88\x63\x26\xa9\xda\xfe\xdb\x00"; $i .= "\x5b\x40\x3b\x70\x13\x64\x0d\xeb\x45\x8f\x73\x24\x25\xdb\x5b\x1b"; $i .= "\x7b\x4b\x63\x77\x69\xe6\xae\xca\xfc\x57\x01\xfe\x80\x40\x60\x30"; $i .= "\x28\x14\x1e\x8f\x48\x64\x36\xab\x56\xff\x7e\xc0\x20\x50\x18\x3c"; $i .= "\x0a\x91\xc7\x2c\x52\x9d\xfd\xa9\x81\xbe\xe0\x70\x48\x24\x36\x9b"; $i .= "\x56\xeb\x7e\xcf\x60\x54\x28\x3f\x5e\x90\x38\x6c\x12\xad\xcd\xbd"; $i .= "\x95\xb1\xaf\x34\x7c\x17\x61\xce\xa8\x54\x7e\xbf\x60\x70\x28\x24"; $i .= "\x1e\x9b\x48\x6b\x76\xaf\x66\xfc\x2a\xc1\xdf\x10\x58\x0c\x3a\x85"; $i .= "\xd3\x23\x1d\xd9\xc9\x9a\xd6\xeb\x1e\xcf\x48\x54\x36\xbf\x56\xf0"; $i .= "\x3e\xc4\x10\x53\x4c\x3d\xf5\xd1\x87\x1c\x62\x89\xe9\xa6\xce\xfa"; $i .= "\xd4\x43\x1f\x71\xc8\x24\x56\x9b\x7e\xeb\x60\x4f\x68\x34\x2e\x97"; $i .= "\x5c\x6e\xb9\xec\x72\xcd\xe5\x95\x8b\x2f\x27\x5c\x1a\xb9\xcb\x32"; $i .= "\xd7\x55\x9e\xbf\x28\x70\x1e\xa4\x08\x7b\x46\xa3\x72\xf9\xe5\x82"; $i .= "\xcb\x21\x97\x58\x6e\xba\xac\x73\x3d\xe5\xd1\x8b\x1c\x67\x49\xea"; $i .= "\xb6\xcf\x36\xd4\x16\xdf\x4e\xd8\x34\x5a\x97\x7b\x2e\xa3\x5c\x79"; $i .= "\xf9\xe2\xc2\xc9\x91\x96\xec\x6e\xcd\xec\x55\x8d\xff\x25\x80\x1b"; $i .= "\x20\x0b\x58\x07\x7a\x82\xa3\x21\xb9\xd8\x72\xda\xa5\x9b\x3b\x2b"; $i .= "\x53\x5f\x7d\xf8\x21\x82\x98\x61\xaa\xa8\x7f\x3e\xa0\x10\x78\x0c"; $i .= "\x22\x85\xd9\xa3\x1a\xf9\xcb\x02\xd7\x41\x9e\xb0\x68\x74\x2e\xa7"; $i .= "\x5c\x7a\xb9\xe3\x32\xc9\xd5\x96\xdf\x2e\xd8\x1c\x5a\x89\xfb\x26"; $i .= "\xc3\x5a\xd1\xfb\x1c\x43\x49\xf1\xf6\xc4\x46\xd3\x72\xdd\xe5\x99"; $i = substr($i,16,2048) if $_[0] eq 'MODE1'; return $i; } $SCR2352 = GetScramblePat(); $SCR2048 = GetScramblePat('MODE1'); sub imx { local($file,*list,$pregap,$bodylen,$postgap) = @_; local(*HWRITE,$gap,$n,$sct,@a,$last,$m,$s,$f,$v,$a,$d,$i); # (0x0000,0x2000,0,10,10) open(HWRITE,">$file.CUE"); print HWRITE "FILE \"$file.BIN\" BINARY\n"; print HWRITE "TRACK 01 MODE1/2048\n"; print HWRITE " INDEX 01 00:00:00\n"; open(HWRITE,">$file.BIN"); binmode(HWRITE); $gap = pack('C',0) x 2048; $n = $bodylen; $sct = 0; @a = @list; $last = ($#a + 1) * ($n + $pregap+$postgap); push @a,-1; ($m,$s,$f) = (0,2,0); while(($a = shift @a) != -1) { $v = pack('v',$a); $d = $v x 1024; $d ^= $SCR2048; $i = 0; while($i < $pregap) { ++$sct; print STDERR "\r$sct/$last"; print HWRITE $gap; ++$i; } $i = 0; while($i < $n) { ++$sct; print STDERR "\r$sct/$last"; print HWRITE $d; ++$i; } $i = 0; while($i < $postgap) { ++$sct; print STDERR "\r$sct/$last"; print HWRITE $gap; ++$i; } ++$a; } print STDERR " Done"; close(HWRITE); print STDERR ".\n"; } sub imf { local($file,$patfile,$pregap,$bodylen,$postgap) = @_; local(*HREAD,@list); undef @list; open(HREAD,"<$patfile") || die "PTN File Not Found.\n"; while() { push @list,hex($1) if m/^([0-9a-fA-f]+)[\r\n]+$/; } close(HREAD); &imx($file,*list,$pregap,$bodylen,$postgap); } sub imm { local($file,$start,$end,$pregap,$bodylen,$postgap) = @_; local(@list); @list = ($start..$end); &imx($file,*list,$pregap,$bodylen,$postgap); return; } sub tinyimage { &imm('CDR-TEST',0x0000,0xFFFF,0,4,0); } sub loginfo2 { local($file,*list,$pre,$body,$post,$s,$e,$c) = @_; local(*HREAD,$blocksize,$ptc,$erc,$ern,$ptn,$pto,$sct); $c = 1 if $c == 0; $e = 99 if $e == 0; $blocksize = ($pre+$body+$post); ($ptc,$ern,$erc) = (0,0,0); unless(open(HREAD,"<$file")) { print "File Not Found.\n"; return; } printf("-FILE %s PAT(%d,%d,%d) PARA(%d,%d,%d)\n", $file,$pre,$body,$post,$s,$e,$c); while() { next unless m/^W/; next unless m/Failed/; s/[\r\n]+//; ($sct) = m/(\d+)$/; $ptn = int($sct/$blocksize); $pto = $sct - $ptn*$blocksize; next if $pto < $s; next if $pto > $e; $erc = 0 if $ern != $ptn; $ern = $ptn; ++$erc; next if $erc != $c; printf("%04x\n",$list[$ern]); ++$ptc; } close(HREAD); printf("- Found %d Error in %s.\n",$ptc,$file); } sub loginfo { local($file,$start,$pre,$body,$post,$s,$e,$c) = @_; local(*HREAD,$ptc,$erc,$ern,$ptn,$pto,$sct,$blocksize); $c = 1 if $c == 0; $blocksize = ($pre+$body+$post); ($ptc,$ern,$erc) = (0,0,0); unless(open(HREAD,"<$file")) { print "File Not Found.\n"; return; } printf("-FILE %s PAT(%d,%d,%d) PARA(%d,%d,%d)\n", $file,$pre,$body,$post,$s,$e,$c); while() { next unless m/^W/; next unless m/Failed/; s/[\r\n]+//; ($sct) = m/(\d+)$/; $ptn = int($sct/$blocksize); $pto = $sct - $ptn*$blocksize; next if $pto < $s; next if $pto > $e; $erc = 0 if $ern != $ptn; $ern = $ptn; ++$erc; next if $erc != $c; printf("%04x\n",$ern+$start); ++$ptc; } close(HREAD); printf("- Found %d Error in %s.\n",$ptc,$file); } sub loginfox { local($file,$patfile,$pre,$body,$post,$s,$e,$c) = @_; local(*HREAD,@list); if(!(-e $file)) { print "Not Found Log File ($file).\n"; exit 1; } if(!(-e $patfile)) { print "Not Found Ptn File ($patfile).\n"; exit 1; } open(HREAD,"<$patfile") || die "PTN File Not Found.\n"; while() { push @list,hex($1) if m/^([0-9a-fA-f]+)[\r\n]+$/; } close(HREAD); &loginfo2($file,*list,$pre,$body,$post,$s,$e,$c); } sub deldup { local($i); $i = ''; while() { next if $_ eq $i; $i = $_; print; } } sub compchk { local($file1,$file2) = @_; open(HREAD,"<$file1") || die "Can't open file ($file1).\n"; while() { next if substr($_,0,1) eq '-'; $i = hex($_); $f[$i] |= 1; ++$er1; } close(HREAD); open(HREAD,"<$file2") || die "Can't open file ($file2).\n"; while() { next if substr($_,0,1) eq '-'; $i = hex($_); $f[$i] |= 2; ++$er2; } close(HREAD); print "-- $file1 and $file2\n"; $i = 0; while($i < 65536) { $j = $i; ++$i; next if $f[$j]==0; printf("%04x %s %s\n",$j,($f[$j]&1) ? 'x' : 'o', ($f[$j]&2) ? 'x' : 'o'); } print "--Total $er1 and $er2 weak.\n"; } sub compchk2 { local($mode,$dummy,@file) = @_; @color = ('lavender','lavenderblush'); push @color,@color; push @color,@color; push @color,@color; push @color,@color; push @color,@color; @a = @file; while() { s/[\r\n]+//g; next unless m/^([0-9A-Fa-f]+) (.+)$/; $cmmt[hex($1)] .= ',' if $cmmt[hex($1)] ne ''; $cmmt[hex($1)] .= $2; # print STDERR "Set cmmt[$1] = $2\n"; } $n = 1; $m = 0; while($file = shift @a) { open(HREAD,"<$file") || die "Can't open file ($file).\n"; while() { next if substr($_,0,1) eq '-'; $i = hex($_); $f[$i] |= $n; ++$er[$m]; } close(HREAD); ++$m; $n += $n; } # 複数ファイルの読み込み. if($mode == 0) { print "-- ",join(',',@file),"\n"; print "--Total ",join(',',@er)," weak.\n"; } else { print ' CD-R/RW ドライブ苦手パターン表(仮)

このページは妄想の産物です。現実とは区別しましょう。


念のため、
  • パターンはスクランブル後の値
  • 前後のセクタを巻き込んでエラーになる可能性
  • たまたま良かった/駄目だった可能性
  • 知らなくても困らない事がたくさんある
です。備考はアレですが、それぞれ
ベル先生 セーフディスク2.5で確認された特殊セクタ
蒼ざめた セーフディスク2で確認された特殊セクタ
単一パターン EFM変調表を見た限り、作成可能なEFM変調出力が1パターンしか存在しない。 より正確には、EFM変調条件を満たすマージビット・パターンが1種類しか存在しない。 むろん、サブチャネルバイトやC2/C1エラー訂正ワード部分は、この限りではない。
a-b 第一バイト -> 第二バイトで取りうるマージビット・パターン数, 第二バイト -> 第一バイトで取りうるマージビット・パターン数の順。 a,bは、
1 とりうるパターンが1種類しかない
2A とりうるパターンは2種類で、そのうち一つは 000 である
2B パターンは2種類だが、000 を含まない。
3A パターンは3種類で、000 が含まれる。
3B パターンは3種類で、000 を含まない。
4 4種類ともとりうる
の各6種類。

'; print "\n"; print ""; $drivename = ''; @c = @color; for $x (@file) { $s = $x; $s = substr($s,0,index($s,'.')); $c = shift @c; printf('%c ',10,$c,$s); $drivename .= sprintf('%c ',10,$c,$s); } print ' '; $drivename .= ' '; @c = @color; print ""; for $x (@er) { printf('%c ',10,shift @c,$x); } print "\n"; } $i = 0; while($i < 65536) { $j = $i; ++$i; next if $f[$j]==0; ++$totalerr; $r = ''; $k = 1; $l = 0; @c = @color; $rs .= sprintf('%04x
',$j); while($k != $n) { if($mode == 0) { $r .= ($f[$j]&$k) ? ' x' : ' o'; } else { $c = shift @c; $rc = ''; if($f[$j]&$k) { $rc = '' if $rx[$l] == 0; $rx[$l] = 1; $rs[$l] .= sprintf('%sBAD
',$rc); } else { $rc = '
' if $rx[$l] != 0; $rx[$l] = 0; $rs[$l] .= sprintf('%sok
',$rc); } } $k += $k; ++$l; } if($mode == 0) { printf("%04x %s\n",$j,$r); } else { $cmmt[$j] ||= '-'; $rs[255] .= sprintf('%s
',$cmmt[$j]); ++$cnt; next if $cnt<10; @c = @color; substr($rs,-4) = ''; printf("\n",$rs); $k = 1; $l = 0; while($k != $n) { $c = shift @c; substr($rs[$l],-4) = ''; printf(' %c',$c,$rs[$l],10); $rs[$l] = ''; $rx[$l] = 0; $k+=$k;++$l; } substr($rs[255],-4) = ''; printf(' %c',$rs[255],10); $rs = $rs[255] = ''; $cnt = 0; ++$cnt2; next if $cnt2 < 2; $cnt2 = 0; print $drivename; } } if($cnt) { @c = @color; substr($rs,-4) = ''; printf("\n",$rs); $k = 1; $l = 0; while($k != $n) { $c = shift @c; substr($rs[$l],-4) = ''; printf(' %c',$c,$rs[$l],10); $rs[$l] = ''; $rx[$l] = 0; $k+=$k;++$l; } substr($rs[255],-4) = ''; printf(' %c',$rs[255],10); $rs = $rs[255] = ''; $cnt = 0; } if($mode == 0) { print "-- ",join(',',@file),"\n"; print "--Total ",join(',',@er)," weak.\n"; print "--$totalerr listed.\n"; } else { print ""; @c = @color; for $x (@file) { $s = $x; $s = substr($s,0,index($s,'.')); printf('%c ',10,shift @c,$s); } @c = @color; print ""; for $x (@er) { printf('%c ',10,shift @c,$x); } print "\n"; print "
Drive
 %s%s備考
 
ptn / Weak%s
%s%s%s
%s%s%s
Drive%s
ptn / Weak%s
\n"; print "$totalerr 種類の苦手セクタ候補を出力.\n"; print ' '; } } sub helpmsg { print 'for Perl 5.x>perl rwtest.pl [-mode] mode -tiny 簡易診断用イメージの作成 (512MB) -0 〜 -7 通常診断用イメージの作成 (各320MB) -0 0000〜1FFF -1 2000〜3FFF -2 4000〜5FFF -3 6000〜7FFF -4 8000〜9FFF -5 A000〜BFFF -6 C000〜DFFF -7 E000〜FFFF -it[s] ログファイル名 簡易診断用イメージを CloneCD 2.7.8.1 で読み込んで作成した      ログから、苦手パターン・リストを作成する. -its は、より多くの苦手セクタを報告. -i0 〜 -i7 ログファイル名       通常診断用イメージ用の、苦手パターン・リスト作成 -um イメージ名 リストファイル名 -ui ログ名 リストファイル名 -uis ログ名 リストファイル名 -it などで作成した、苦手パターンリストを読み込んで      イメージを作成&ログを診断します。(-uis は、-ui より      エラー判断が厳しい) 診断イメージは、 CDR-TEST.BIN / CDR-TEST_[0-7].BIN の名前で作成. その他は、スクリプトを参照.'; } # 分岐. $f = 0; &tinyimage() if $ARGV[0] eq '-tiny' && ($f=1); &imm('CDR-TEST_0',0x0000,0x1FFF,0,10,10) if $ARGV[0] eq '-0' && ($f=1); &imm('CDR-TEST_1',0x2000,0x3FFF,0,10,10) if $ARGV[0] eq '-1' && ($f=1); &imm('CDR-TEST_2',0x4000,0x5FFF,0,10,10) if $ARGV[0] eq '-2' && ($f=1); &imm('CDR-TEST_3',0x6000,0x7FFF,0,10,10) if $ARGV[0] eq '-3' && ($f=1); &imm('CDR-TEST_4',0x8000,0x9FFF,0,10,10) if $ARGV[0] eq '-4' && ($f=1); &imm('CDR-TEST_5',0xA000,0xBFFF,0,10,10) if $ARGV[0] eq '-5' && ($f=1); &imm('CDR-TEST_6',0xC000,0xDFFF,0,10,10) if $ARGV[0] eq '-6' && ($f=1); &imm('CDR-TEST_7',0xE000,0xFFFF,0,10,10) if $ARGV[0] eq '-7' && ($f=1); &loginfo($ARGV[1],0x0000,0,4,0,1,2,2) if $ARGV[0] eq '-it' && ($f=1); &loginfo($ARGV[1],0x0000,0,4,0,0,3,1) if $ARGV[0] eq '-its' && ($f=1); &loginfo($ARGV[1],0x0000,0,10,10,5,10,3) if $ARRV[0] eq '-i0' && ($f=1); &loginfo($ARGV[1],0x2000,0,10,10,5,10,3) if $ARRV[0] eq '-i1' && ($f=1); &loginfo($ARGV[1],0x4000,0,10,10,5,10,3) if $ARRV[0] eq '-i2' && ($f=1); &loginfo($ARGV[1],0x6000,0,10,10,5,10,3) if $ARRV[0] eq '-i3' && ($f=1); &loginfo($ARGV[1],0x8000,0,10,10,5,10,3) if $ARRV[0] eq '-i4' && ($f=1); &loginfo($ARGV[1],0xA000,0,10,10,5,10,3) if $ARRV[0] eq '-i5' && ($f=1); &loginfo($ARGV[1],0xC000,0,10,10,5,10,3) if $ARRV[0] eq '-i6' && ($f=1); &loginfo($ARGV[1],0xE000,0,10,10,5,10,3) if $ARRV[0] eq '-i7' && ($f=1); # 追加、任意パターン作成. &imf($ARGV[1],$ARGV[2],40,10,50) if $ARGV[0] eq '-um' && ($f=1); &loginfox($ARGV[1],$ARGV[2],40,10,50,39,60,5) if $ARGV[0] eq '-ui' && ($f=1); &loginfox($ARGV[1],$ARGV[2],40,10,50,39,60,1) if $ARGV[0] eq '-uis' && ($f=1); &deldup() if $ARGV[0] eq '-dd' && ($f=1); &compchk($ARGV[1],$ARGV[2]) if $ARGV[0] eq '-cmp' && ($f=1); &compchk2(0,@ARGV) if $ARGV[0] eq '-cp2' && ($f=1); &compchk2(1,@ARGV) if $ARGV[0] eq '-cp3' && ($f=1); # &helpmsg() if $f == 0; exit 0; __END__ 1212 ベル先生 14B9 ベル先生 7D65 蒼ざめた 3F65 蒼ざめた B8B8 単一パターン BABA 単一パターン FAFA 単一パターン # ここまでは、覚えている奴.