Системное программное обеспечение персональных ЭВМ


Пример 2



Пример 2

/*== ПРИМЕР 10.1 ==*/ /*========== Чтение сектора средствами BIOS и DOS ========*/ #include <dos.h> /* типы и структуры данных */ #define byte unsigned char #define word unsigned int /* описание функций */ void Sect_to_Daddr(word sect,struct daddr *d); word Daddr_to_Sect(struct daddr *d); word get(word min, word max, char *name); struct daddr { byte h; /* головка */ word s, /* сектор */ t, /* дорожка */ ts; /* сектор, дорожка упакованные */ } a; /* физический дисковый адрес */ word ls; /* номер логического сектора */ /* параметры дискеты */ word nh=2, /* число головок */ ns=9, /* число секторов на дорожке */ nt=40, /* число дорожек */ s0=0, /* номер 1-го сектора */ nls=720; /* общее число секторов */ byte drive; /* номер логич.диска */ byte buff13[512]; /* буфер сектора */ byte buff25[512]; /* буфер сектора */ /*==== main ====*/ main() { union REGS rr; struct SREGS sr; byte fx, flag; byte mode; int i, i0, y;

for (fx=0; fx==0;) { printf("диск (A|B) >"); drive=getche(); if ((drive!='a')&&(drive!='b')) printf("\7"); else fx=1; } drive-='a'; for (flag=0; flag==0;) { printf("\nA - задание физического адреса;\n"); printf("S - задание номера сектора;\n"); printf("Q - конец работы.\n"); printf("--->"); mode=getche(); printf("\n"); switch(mode) { case 'q': flag=1; continue; case 'a': a.h=get(0,nh-1,"головка"); a.t=get(0,nt-1,"дорожка"); a.s=get(1,ns,"сектор"); a.ts=(a.t<<8)|a.s|((a.t&0x300)>>2); ls=Daddr_to_Sect(&a); break; case 's': ls=get(0,nls-1,"логич.сектор"); Sect_to_Daddr(ls,&a); break; default: printf("\7"); continue; } /* чтение сектора при помощи прерывания 13. */ rr.h.ah=2; /* функция ЧТЕНИЕ */ rr.h.al=1; /* секторов 1 */ rr.h.dl=drive; /* адрес диска */ rr.h.dh=a.h; rr.x.cx=a.ts; /* адрес на диске */ sr.es=FP_SEG(buff13); /* адрес в ОП */ rr.x.bx=FP_OFF(buff13); int86x(0x13,&rr,&rr,&sr); /* Проверка ошибок чтения */ if (rr.x.cflag) { printf("Ошибка при INT 13 : %u\n",rr.h.ah); exit(0); } /* Чтение при помощи прерывания DOS 25 */ rr.h.al=drive; /* логич.диск */ rr.x.cx=1; /* секторов 1 */ rr.x.dx=ls; /* номер сектора */ sr.ds=FP_SEG(buff25); /* адрес в ОП */ rr.x.bx=FP_OFF(buff25); int86x(0x25,&rr,&rr,&sr); /* Проверка ошибок чтения */ if (rr.x.cflag) { printf("\nОшибка при INT 25 : %u. ",rr.h.ah); exit(0); } /* дамп буферов */ clrscr(); printf(" INT 13 : гол=%d дор=%-2d сект=%d |", a.h,a.t,a.s); printf("| INT 25 : лог.сект=%d \n",ls); printf(" -------------------------------------|"); printf("|-------------------------------------\n"); for(i0=0,y=3;y<25; y++,i0+=12) { for (i=0; i<12; printf(" %02X",buff13[i0+i++])); printf(" "); for (i=0; i<12; printf(" %02X",buff25[i0+i++])); printf("\n"); } printf(" Нажмите любую клавишу..."); getch(); } } /*=== формирование физич.дискового адреса из # сектора ===*/ void Sect_to_Daddr(word sect,struct daddr *d) { /* sect - номер сектора, a - адрес на диске */ int s; d->s=sect%ns+1; s=sect/ns; d->h=s%nh; d->t=s/nh; d->ts=(d->t<<8)|d->s|((d->t&0x300)>>2); } /*=== формирование # сектора из физич.дискового адреса ===*/ word Daddr_to_Sect(struct daddr *d) { word s; s=((d->t*nh)+d->h)*ns+d->s-1+s0; return(s); } /*==== ввод какого-либо параметра ====*/ word get(word min, word max, char *name) { byte fx; word val; for (fx=0; fx==0;) { printf("%s >",name); scanf("%d",&val); if ((val<min)(val>max)) printf("\7"); else fx=1; } return (val); }




- Начало -  - Назад -  - Вперед -