2012-04-05 3 views
0

나는 사전 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); 
} 

어떤 생각을 왜? 블록에서 잘못 변환합니까?

+2

와! Pre-ANSI C! 내가 그걸 본 이후로 꽤 오래되었습니다 ... –

+1

이 질문의 첫 번째 코드 샘플이 도움이되는지보십시오. 그는 또한 당신이 구글 검색을 할 수 있습니다 무엇을 참조 할 수 있습니다 : http://cboard.cprogramming.com/cplusplus-programming/59310-reading-floppy-disk-sector.html –

+0

@DietrichEpp : 적절한 작업을 감안할 때 적절한 것 같습니다 : D –

답변

0

아니요, 디스크가 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; 
} 

의 출력은 다음과 같습니다

if ((sector = (++sector % 18)) == 0) 
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 + 1) % 18)) == 0) 

하지만, 괜찮아해야합니다. 그러나 이 실행중인 환경에서 올바른 값인 을 제공하는지 확인해야합니다. 그것이 내 버전 gcc에서 수행한다는 사실이 그것이 귀하의 경우에 해당된다는 것을 의미하지는 않습니다.

위의 제안 된 양식을 사용하거나 인 경우에만 사용할 수 있습니다.

당신이 가진 실패 지점은 헤드 나 실린더 사이의 전환점 근처에 있지 않으므로 랩핑 문제는 아닌 것으로 생각하지만 가능한 경우 사용자 환경의 값을 인쇄해야합니다.

"네 번째 섹터를 읽을 수 없습니다."라고 말하면 정확히을 지정해야합니다. 기계가 멈 춥니 다. 디스크 오류가 발생합니까? 쓰레기라고 생각하는 것을 반환합니까?

디스크가 올바르게 포맷되지 않았거나 결함이있을 가능성이 있습니다. 데이터가 예상대로 표시되지 않을 수도 있습니다. 플로피를 DOS/Windows /로 포맷하고 프로그램에서 무엇을하는지 확인하는 것이 가치가 있습니다.

+0

"나는 약간 걱정이된다. if ((sector = (++ sector % 18)) == 0) construct"- 당신은 그것에 대해 많이 염려해야한다. 비록 그것이 당신과 당신에게 올바른 가치를 주지만, 내일은 그렇지 않을 것입니다. 아니면 누가 아는가, 아마 오늘 그에게 올바른 가치를 부여하지 못했을 수도 있고 아마도 그것이 그의 문제 일 수도 있습니다. –

+0

그 (것)들을 검사하는 나의 코멘트. 더 읽기 쉬운 버전 (IMNSHO)으로 쉽게 (필요하든 그렇지 않든) 고정되어 있기 때문에 시퀀스 포인트가 없어서 정의되지 않았는지 확인하기 위해 눈을 돌려 보지 않아도됩니다. 하지만 K & R 스타일의 비 프로토 타입 함수를 사용한다는 점을 감안할 때 (나중의 컴파일러에서) 내일 작동하지 않는다고 걱정하지 않아도됩니다 :-) – paxdiablo

+0

OK, 나는 섹터에 두 개의 과제가 있다는 것을 즉시 알았습니다. 그 사이의 시퀀스 포인트. K & R은 어떤 과제가 "승리"할지를 말하지 않았습니다. –