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

                                  } DOS4;

                       } var;

} *DFCB;

/* змiннi */

//byte DOS;              /* Номер версi• DOS                */

int DFCB_size;         /* Розмiр DFCB                     */

word sft_seg, sft_off; /* Сегм.,змiщ. початку              */

int files;             /* Лiчильник файлiв                  */

int need_mem_size;     /* Обсяг пам`ятi для розширення     */

                      /*   системно• таблицi файлiв */

union REGS rr;

struct SREGS sr;

void main()

{

 char i,j;                /* допоможнi змiннi   */

 char f_name[10];         /* iм`я файла                    */

 char std_name[4]="file"; /* Стандартна частина iм`я      */

 int in[50],              /* 50 iдентифiкаторiв файлiв    */

     axx;                 /* Сегментний адрес розширення  */

 char *msgf={"ЗАПИСАНО 50 ФАЙЛЎВ"}; /* записуїться у кожний файл*/

 p_psp = (psp far *) MK_FP (_psp,0x0);

 clrscr ();

 cout << "Old JFT:" << endl;

 ViewJFT ();

 if(inc_JFT(60)==0)

 {

  DFCB_size=(_version > 3)?59:53;

  /* Отримання адреси першо• таблицi файлiв */

  get_SFT();

  files=0; /* Лiчильник файлiв */

  while(FP_OFF(sft)!=0xffff)

  { /* змiщення FFFF - ознака кiнця списка  */

   files+=sft->n_files;

   sftx=sft;

   if(FP_OFF(sft->next)==0xffff)

     break;

   sft=sft->next;

  }

  cout << "JFT after resizing:" << endl;

   ViewJFT ();

  need_mem_size=16    +(60-files)*DFCB_size;

  if (files < 60)

  {

   rr.h.ah=0x48;

   rr.x.bx=need_mem_size/16+1;

   intdos(&rr,&rr); /* Видiляїмо дод. пам`ять */

   axx=rr.x.ax;     /* Адреса сегменту видiлено• пам`ятi */

   if(rr.x.cflag){

    printf("Помилка видiлення пам`ятi\n");

    if(rr.x.ax==7)

      printf("Керуючi блоки пам'ятi зруйнованi! \n");

    else

      if(rr.x.ax==8)

       printf("Недостатньо пам'ятi! \n");

      else

       printf("Код помилки: %d",rr.x.ax);

        exit(0);

   }

   sft->next=(SFT*) MK_FP(axx,0);

   sft=sft->next;

   sft->next=(SFT*) MK_FP(axx,0xffff);

   sft->n_files=60-files;

   DFCB=(struct DFCB *)((byte *)(sft+1));

   for (i=0; i<sft->n_files; i++)

    DFCB[i].n_handles=0;

  }

  /* Створюїмо 50 файлiв */

  strcpy(f_name,std_name);

  _fmode=O_BINARY;

  for(i=1;i<51;i++)

  {

   /* Формування iм'я чергового файлу */

         j=i/10;

          f_name[4]=j+48;

          j=i%10;

          f_name[5]=j+48;

          f_name[6]='\0';

          /* Створення файла */

          in[i-1]=_creat(f_name,0);

          if (in[i-1] < 0)

                   cout << "ERROR";

  }

  for(i=1;i<51;i++)

   write(in[i-1],msgf,19);

   cout << "JFT after added new file:" << endl;

   ViewJFT ();

  for(i=0;i<50;i++)

  _close(in[i]);

   cout << "JFT closed new file:" << endl;

   ViewJFT ();

 textattr(0x0C);

  gotoxy(55,9);

  sftx->next=(SFT*) MK_FP(0,0xFFFF);

  rr.h.ah=0x49;

  sr.es=axx;

  intdosx(&rr,&rr,&sr);

  getch();

  exit(0);

 }

}

int inc_JFT(int num){

 if(_version > 2) {

        rr.h.ah=0x67;

        rr.x.bx=num;

        intdos(&rr,&rr);

        if(rr.x.cflag)

        {

                  printf("Помилка функцi• DOS 67h:\n");

                  switch(rr.x.ax)

                  {

                          case 0x04:printf("Занадто багато вiдкритих файлiв!\n");break;

                          case 0x08:printf("Недостатньо пам`ятi!\n");break;

                          case 0x12:printf("Невiрний формат!\n");break;

                          default:printf("Error code ->%xh",rr.x.ax);

                  }

                  return(-1);

         }

         else

         return(0);

 }

 return -1;

}

void get_SFT(void)

{

  rr.h.ah=0x52;

  intdosx(&rr,&rr,&sr);

  sft_off=peek(sr.es,rr.x.bx+4);

  sft_seg=peek(sr.es,rr.x.bx+6);

  sft=(struct SFT *)MK_FP(sft_seg,sft_off);

}

void ViewJFT ()

{

       for (int i = 0; i < p_psp->JFT_size; i++)