Списки в оперативній пам'яті, операції над списками. Керування програмами. Керування таймером. Системні керуючі блоки. Управління пам’яттю: таблиця векторів переривань, страница 19

                                     преривання 13             */

void  Sect_to_Daddr(dword sect);  /* Формування фiзичноє дисковоє

                                     адреси з # сектора        */

dword Clust_to_Sect(word clust);  /* Пiдрахування номера  сектора

                                     з номера кластера         */

word  Next_Clust(word clust);     /* Вибiрка наступного  кластера

                                     за FAT                    */

char *Get_Name(char *s, char *d); /* Видiлення наступного елемен-

                               та з рядка-завдання       */

int   Find_Name();                /* Пошук iменi у каталозi    */

void  End_of_Job(int n);          /* Завершення  (при n=0-5 -

                                     аварiйне)                 */

/*-------------------------------------------------------------*/

/* Змiннi */

struct PART part;      /* поточний елемент роздiлу            */

byte buff1[512];       /* буфер MBR та boot                   */

struct MBR *mbr;       /* покажчик на таблицю роздiлiв        */

struct BootRec *boot;  /* покажчик на корньовий запис         */

byte buff2[512];       /* буфер каталога та текста            */

struct Dir_Item *dir;  /* покажчик на частину каталога        */

char *text;            /* покажчик на текстовий буфер         */

byte *fat;             /* покажчик на FAT                     */

char job[81];          /* рядок-завдання                      */

char *jobptr;          /* поточний покажчик у job             */

char cname[12];        /* поточне iм`я для пошуку             */

byte Fdisk;            /* фiзичний номер диска                */

daddr caddr;           /* поточна дискова адреса              */

dword sect;            /* поточний номер сектора              */

word clust;            /* поточний  номер кластера            */

byte fat16;            /* ознака формату FAT                  */

dword fsize;           /* розмiр файла                        */

int dirnum;            /* номер елемента у змiстi             */

dword FirstSect;       /* абс.сектор початку                  */

byte rootdir=1;        /* ознака корньового каталога

                          або пiдкаталога (1/0)               */

word lastsect;         /* останнiй сектор при читаннi         */

byte fatalloc=0;       /* ознака видiлення пам`яти            */

/*------------------------------------------------------------*/

int main() {

 int n,i;

  textattr(14);

  clrscr();

  /* ввод iменi файла */

  cprintf("  Просмотр таблицi FAT. ");

  cprintf("Вкажiть повне iм`я файла -->");

  scanf("%s",job);

  /* переклад у верхнiй регiстр */

  strupr(job);

  /* перевiрка вiрностi iдентифiкатора диска */

  if ((!isalpha(job[0]))||(job[1]!=':')||(job[2]!='\\')) {

    printf("%c%c%c -",job[0],job[1],job[2]);

    End_of_Job(0);

  }

  textattr(10);

  clrscr();

  printf("              Лабораторная робота N10");

  printf("           Дисковi структури даних DOS.");

  textattr(14);

  cprintf("Файл %s у FAT зймає такi кластери :\n",job);

  jobptr=job+3;

  if (job[0]>'A') {

    /* для жорсткого диска - фiзичний номер та читання MBR */

    Fdisk=0x80;

    Read_Mbr();

  }

  else  /* для гнучкого диска - фiзичний номер */

    Fdisk=job[0]-'A';

  Read_Boot(); /* читання boot-сектора */

  printf("\n%s\n",boot->FatForm);

  Read_Fat();  /* читання FAT */

  dir=(struct Dir_Item *)buff2;

  do { /* рух по каталогам */

    if (!rootdir) clust=dir[dirnum].cl;  /* початковий кластер */

    /* видiлення наступного елемента з рядка-завдання */

    jobptr=Get_Name(jobptr,cname);

    do { /* доки не дойдемо до останнього кластера */

      if (rootdir) {  /* корньовий каталог */

       /* поч.сектор корньового кат. та кiлькiсть секторiв */

       sect=boot->ResSect+boot->FatSize*boot->FatCnt;

       lastsect=boot->RootSize*32/boot->SectSize+sect;

      }

      else { /* пiдкаталог */

       sect=Clust_to_Sect(clust);