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

  if (rr.x.cflag&1) {

    printf("%u -",rr.h.ah);

    End_of_Job(2);

  }

}

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

/* Визначення абс.номера сектора початку лог.диска */

void Get_First(void) {

 word s, t;

  if (Fdisk<0x80) FirstSect=0;

  else {

    /* формування # сектора з фiзич. дисковоє адреси */

    t=(part.Begin_SecTrk>>8)|((part.Begin_SecTrk<<2)&0x300);

    s=part.Begin_SecTrk&0x3f;

    FirstSect=(((dword)t*boot->HeadCnt)+part.Begin_Hd)*

    boot->TrkSecs+s-1;

  }

}

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

/* Формування фiзичноє дисковоє адреси з # сектора */

void Sect_to_Daddr(dword sect) {

/* sect - номер сектора, caddr - адреса на диску */

dword s;

  if (Fdisk>=0x80) sect+=FirstSect;

  caddr.s=sect%boot->TrkSecs+1;

  s=sect/boot->TrkSecs;

  caddr.h=s%boot->HeadCnt;

  caddr.t=s/boot->HeadCnt;

  caddr.ts=(caddr.t<<8)|caddr.s|((caddr.t&0x300)>>2);

}

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

/* Пiдрахування номера сектора з номеру кластера */

dword Clust_to_Sect(word clust) {

/* clust - номер кластера, повертає номер сектора */

 dword ds, s;

  ds=boot->ResSect+boot->FatSize*boot->FatCnt+

  boot->RootSize*32/boot->SectSize;

  s=ds+(clust-2)*boot->ClustSize;

  return(s);

}

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

/* Вибiрка наступного кластера з FAT */

word Next_Clust(word clust) {

/* clust - номер кластера, повертає номер наст.кластера

   або 0 - якщо наступного нема */

 word m, s;

  if (rootdir) return(0);

  if (!fat16) {

    m=(clust*3)/2;

    s=*(word *)(fat+m);

    if(clust%2)      /* непарний елемент */

    {

      s>>=4;

    }

    else    /* парний елемент */

    {

      s=s&0x0fff;

    }

    if (s>0x0fef)

    {

       ssss = s;

       return(0);

    }

    else

    {

       return(s);

    }

  }

  else {

    m=clust*2;

    s=*(word *)(fat+m);

    if (s>0xffef)

    {

    ssss = s;

    return(0);

    }

    else return(s);

  }

}

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

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

char *Get_Name(char *s, char *d) {

/* s - рядок завдання, d - видiлений елемент, повертає

   покажчик на новий початок рядка завдання. */

char *p,*r;

int i;

  for(i=0;i<11;d[i++]=' ');

  d[11]='\0';

  if ((p=strchr(s,'\\'))==NULL) {

    /* останнiй елемент рядка - iм`я файла */

    /* перезапис iм`я */

    for(r=s,i=0; (i<8)&&*r&&(*r!='.'); i++,r++) *(d+i)=*r;

    /* перезапис поширення */

    if (*r) for(i=0,r++; (i<3)&&*r; i++,r++) *(d+8+i)=*r;

    return(NULL);

  }

  else {

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

    *p='\0';

    for(r=s,i=0; (i<11)&&*r; i++,r++) *(d+i)=*r;

    return(p+1);

  }

}

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

/* Пошук iменi у каталозi */

int Find_Name() {

 int j;

/* cname - iм`я, яке знайдено; повертає iндекс знайденого

   елемента у масивi dir або (-1) */

    for (j=0; j<boot->SectSize/sizeof(struct Dir_Item); j++) {

      if (dir[j].fname[0]=='\0') {

        /* кiнець використаних елементiв каталога */

        printf("%s -",cname);

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

        else End_of_Job(5);

      }

      if ((byte)dir[j].fname[0]!=0xe5) {

       if (memcmp(dir[j].fname,cname,11)==0) {

         /* якщо iм`я збiгається, то:

           - при пошуку файла елемент не повинен мати атрибутiв

             "пiдкаталог" або "мiтка тому",

          - при пошуку пiдкаталога елемент повинен мати атрибут

             "пiдкаталог" */

           if (jobptr==NULL)

             if ( !(dir[j].attr&0x18) ) return(j);

           else

              if (dir[j].attr&0x10) return(j);

        }

      }

    }

  return(-1);

}

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

/* Завершння (при n=0-5 - аварiйне) */

void End_of_Job(int n) {