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

       lastsect=boot->ClustSize+sect;

      }

      /* посекторне читання усього корньового каталога

        або одного кластера пiдкаталога */

      for (; sect<lastsect; sect++) {

       Sect_to_Daddr(sect);

       Read_13(dir);

       /* пошук iменi у прочитаному секторi */

       if ((dirnum=Find_Name())>=0) goto FIND;

      }

      /* до останнього кластера пiдкаталога */

    }

    while (clust = Next_Clust(clust));

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

    printf("%s -",cname);

    if (jobptr==NULL) End_of_Job(4);

    else End_of_Job(5);

FIND: /* iм`я знайдено */

    rootdir=0;

  }

  while (jobptr!=NULL);

  /* знайдено iм`я файла */

  /* iз змiсту отримуємо 1-й кластер */

  clust=dir[dirnum].cl;

  textattr(7);

  gotoxy(10,4);

  cprintf("Натискуйте будь-яку клавiшу ");

  cprintf(" доки не з`явиться <КIНЕЦЬ ФАЙЛА>.");

  textattr(12);

  gotoxy(1,5);

  cprintf("╒<ПОЧАТОК ФАЙЛА>");

  gotoxy(1,6);

  cprintf("└─>");

  i=0;

  int ecls = clust;

  do {

    i++;

    if((i%10)==0) getch();

    textattr(14+16);

    cprintf("%4x",clust);

    textattr(2);

    cprintf("───>");

    ecls = clust;

  }while (clust = Next_Clust(clust));

//-----------------------------------------------------------

 //-------------------------------------------------------------

  char  *buf; buf = new char[512];

  for(int ind=0;ind < 10;ind++)

       buf[ind]=0;

  /*sect=Clust_to_Sect(ecls);

  Sect_to_Daddr(sect);

  Read_13(buf);

  printf ("%s",buf);

  getch();

  */

  sect=Clust_to_Sect(ssss);

  Sect_to_Daddr(sect);

  Read_13(buf);

  int aa= ((*(char *)(buf+1)))&0x0fff;

  printf ("%x\n",aa);

  delete[] buf;

  textattr(12);

  cprintf("<КIНЕЦЬ ФАЙЛА>\n");

  gotoxy(1,wherey());

  textattr(15+3*16);

  cprintf("Кiлькiсть кластерiв, якi займає файл: %u ",i);

  End_of_Job(7);

  return 0;

}

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

/* Читання MBR та пошук потрiбного роздiлу */

void Read_Mbr(void) {

 int i;

 char ndrive;

 word *EndList;

  caddr.h=0;

  caddr.ts=1;

  ndrive='C';

  mbr=(struct MBR *)buff1;

NEXT: Read_13(buff1);

  for (EndList=(word *)&mbr->rt[(i=0)];

      (*EndList!=0xaa55)&&(mbr->rt[i].Size>0L);

      EndList=(word *)&mbr->rt[++i]) {

    if (mbr->rt[i].SysCode==5) {

      caddr.h=mbr->rt[i].Begin_Hd;

      caddr.ts=mbr->rt[i].Begin_SecTrk;

      goto NEXT;

    }

    if (ndrive==job[0]) {

      movmem(&mbr->rt[i],&part,sizeof(struct PART));

      return;

    }

    else ndrive++;

  }

  /* потрiбуний роздiл не знайдено */

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

  End_of_Job(1);

}

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

/* Читання boot-сектора */

void Read_Boot(void) {

  if (Fdisk<0x80) {

    caddr.h=0;

    caddr.ts=1;

  }

  else {

    caddr.h=part.Begin_Hd;

    caddr.ts=part.Begin_SecTrk;

  }

  Read_13(buff1);

  boot=(struct BootRec *)buff1;

  Get_First();

}

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

/* Читання FAT */

void Read_Fat(void) {

dword s, ls;

byte *f;

  fat=(byte *)malloc(boot->FatSize*boot->SectSize);

  if (fat==NULL) {

    printf("Розмiщення FAT -");

    End_of_Job(3);

  }

  fatalloc=1;

  s=boot->ResSect;

  ls=s+boot->FatSize;

  for (f=fat; s<ls; s++) {

    Sect_to_Daddr(s);

    Read_13(f);

    f+=boot->SectSize;

  }

  /* встановлення формату FAT */

  if (Fdisk>=0x80)

    if (part.SysCode==1) fat16=0;

    else fat16=1;

  else fat16=0;

}

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

/* Читання сектора за допомогою преривання 13 */

void Read_13(void *mem) {

/* mem - адреса у ОП */

union REGS rr;

struct SREGS sr;

  rr.h.ah=2;

  rr.h.al=1;

  rr.h.dl=Fdisk;

  rr.h.dh=caddr.h;

  rr.x.cx=caddr.ts;

  sr.es=FP_SEG(mem);

  rr.x.bx=FP_OFF(mem);

  int86x(0x13,&rr,&rr,&sr);

  /* Перевiрка помилок читання */