チャレンジャー向けのソース改造 (playcd0d → playcd0d+)
- この改造はplaycd0dのみに有効です。stopコマンドがきかないドライブをきくようにできます。
 
- playcd0.cの471行目を少しだけ変更します。
 
            if (playaudio(drv, 0, i + 5) == 0)
 
            if (playaudio(drv, 1, i + 2) == 0)
 
- これだけでstopコマンドがちゃんときくようになると思います。
 
 
チャレンジャー向けのソース改造 (for playcd0c)
- playcd0bを使っている人はplaycd0cにバージョンアップしましょう。それでもだめなときにこの改造をしてみるといいかもしれません。
 
- drvコマンドでどうしても(03)エラーが出てしまう場合、もしかしたら次の方法で克復できるかもしれません。ASKA.ASKの_testatapi@8()を改造します。131-133行目を次のブロックと交換します。
 
    OUT(DX, AL);
    EDX ^= 0x200; /* 1f6など */
    AL = CL; 
    OUT(DX, AL);  ← この行は変わってない(旧131行目)
    EDX -= 0x200 + 5; /* 1f1など */
    AL = 0;
    OUT(DX, AL);
    EDX++;
    OUT(DX, AL);
    EDX++;
    OUT(DX, AL);
    EDX++;
    OUT(DX, AL);
    EDX++;
    OUT(DX, AL);
    EDX++; /* 1f6など */
    AL = CL;  ← この行も変わってない(旧133行目) 
- これで動いちゃうかもしれません(2003.08.03 13:19にパッチのバグを直しました)。
 
- これだけだと状況が改善したのかどうか分からないこともあるので、次の改造をするとさらにお得です。playcd0.cの326行目を次のように変更。
 
         status = testdrive(drv, 1, (unsigned char *) buf1024);
 
         { cputs("testatapi_OK\n", cons); status = testdrive(drv, 1, (unsigned char *) buf1024); } 
 
チャレンジャー向けのソース改造 (for playcd0a)
- こんなことするよりもplaycd0bを使うほうがいいです。
 
- うまくいかない&スーパーチャレンジャー用です。
 
- 260行目のstruct CONSOLE *cons;の頭に//をつけてコメントアウト。
 
- そして以下のデバッグルーチンを31行目に挿入。
 
    struct CONSOLE *cons;
    void dump(int i) {
        char s[4]; s[2] = 32; s[3] = 0;
        s[0] = "0123456789ABCDEF"[(i >> 4) & 15];
        s[1] = "0123456789ABCDEF"[i & 15];
        cputs(s, cons); return;
    } 
    if (testatapi(drv, buf1024))
        goto drv_err; 
    i = testatapi(drv, buf1024); dump(i); cputc('\n', cons);
    if (i) goto drv_err; 
- これで、何が出るかな?IRCでKに報告しよう。
- 00が出る:認識成功してるじゃん。
 
- 01が出る:drvataかplaycd同士の競合?
 
- 02が出る:ATA/ATAPIレジスタが検出できない。
 
- 03が出る:IDENTIFY PACKET DEVICEコマンドが受け付けられなかった。
 
 
- ↑で03が出る人へ。多分全く効果はないと思うけど、ひょっとしたら状況が改善するかもしれない改造を紹介します。
 
- 上記パッチの「if (i) goto drv_err;」を削除してみてください。
 
- まあたぶん改善しないと思いますが・・・。
 
- どうもむしろ悪くなるようです。やらないほうがいいみたいです。