-1

OS前の状態からフロッピーを読み取る必要があり、読み取る機能がありますが、4番目のセクターを超えて読み取ることができないようです...

void get_block(blk, buf) int blk; char buf[]
{
   int cyl, head, sector;

   cyl = ((blk*2) / 18) / 2;
   head = ((blk*2) / 18) % 2;
   sector = (blk*2) % 18;

   // Read first sector <<Dies here if blk > 2>>
   diskr(cyl, head, sector, buf);

   // Increment
   if ((sector = (++sector % 18)) == 0)
      if ((head = (++head % 2)) == 0)
         cyl++;

   // Read second sector <<Dies here if blk == 2>>
   diskr(cyl, head, sector, buf+512);
}

理由はありますか?ブロックからの変換が間違っていますか?

4

1 に答える 1

2

いいえ、ディスクが 1.44M の「フロッピー」(80 シリンダー、2 ヘッド/シリンダー、18 セクター/ヘッド、512 バイト/セクター) であると仮定すると、次のプログラムに示すように、これらの計算は問題ないはずです。

#include <stdio.h>
int main (void) {
    int blk, cyl, head, sector;
    for (blk = 0; blk <= 18; blk++) {
        cyl = ((blk*2) / 18) / 2;
        head = ((blk*2) / 18) % 2;
        sector = (blk*2) % 18;
        printf ("%2d (a) -> %2d %2d %2d", blk, cyl, head, sector);
        if ((sector = (++sector % 18)) == 0)
            if ((head = (++head % 2)) == 0)
                cyl++;
        printf (" (b) -> %2d %2d %2d\n", cyl, head, sector);
    }
    return 0;
}

その出力は次のとおりです。

 0 (a) ->  0  0  0 (b) ->  0  0  1
 1 (a) ->  0  0  2 (b) ->  0  0  3
 2 (a) ->  0  0  4 (b) ->  0  0  5
 3 (a) ->  0  0  6 (b) ->  0  0  7
 4 (a) ->  0  0  8 (b) ->  0  0  9
 5 (a) ->  0  0 10 (b) ->  0  0 11
 6 (a) ->  0  0 12 (b) ->  0  0 13
 7 (a) ->  0  0 14 (b) ->  0  0 15
 8 (a) ->  0  0 16 (b) ->  0  0 17
 9 (a) ->  0  1  0 (b) ->  0  1  1
10 (a) ->  0  1  2 (b) ->  0  1  3
11 (a) ->  0  1  4 (b) ->  0  1  5
12 (a) ->  0  1  6 (b) ->  0  1  7
13 (a) ->  0  1  8 (b) ->  0  1  9
14 (a) ->  0  1 10 (b) ->  0  1 11
15 (a) ->  0  1 12 (b) ->  0  1 13
16 (a) ->  0  1 14 (b) ->  0  1 15
17 (a) ->  0  1 16 (b) ->  0  1 17
18 (a) ->  1  0  0 (b) ->  1  0  1

次の未定義の動作の性質について少し心配しています。

if ((sector = (++sector % 18)) == 0)

次のようなものを好みます。

if ((sector = (sector + 1) % 18)) == 0)

しかし、正しい値が得られれば問題ありません。ただし、実行している環境で正しい値得られることを確認する必要があります。私のバージョンの でそれが行われるという事実は、あなたの場合になるという意味ではありません。gcc

または、上記で定義されている提案されたフォームを使用することもできます。

あなたが持っている障害点は、ヘッドまたはシリンダー間の切り替えの近くにないため、ラッピングの問題ではないと思いますが、可能であれば環境の値を出力する必要があります.

「第 4 セクターを超えて読めない」と言うとき、それが何を意味するのかを正確に指定する必要がありますか? マシンがフリーズしたり、ディスク エラーが発生したり、ゴミと思われるものを返したりしますか?

ディスクが正しくフォーマットされていないか、ディスクに障害がある可能性があります。また、期待するデータがそこにない可能性もあります。フロッピーを DOS/Windows などでフォーマットし、それがプログラムで何をするかをチェックする価値があるかもしれません。

于 2012-04-05T02:11:39.547 に答える