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

  textattr(11);

  cprintf("\n\r Программа tc_lab16 уже загружена."

              " Попытка повторной инсталляции!");

  textattr(7);

  cprintf("\n\r");

 }

 else{  /* Программа не резидентна */

 my_context();

 old9= _dos_getvect(9);

 disable();

 _dos_setvect(9,new9);

 rr.h.ah=0x48; rr.x.bx=2;

 intdos(&rr,&rr); jmp_segm=rr.x.ax;

 jmpar=(struct far_jmp far *)MK_FP(jmp_segm,0);

 old2F=_dos_getvect(0x2F);

 jmpar->jmp=0xea;

 jmpar->int_h=(void interrupt far (*)(...))new2F;

 _dos_setvect(0x2F,(void interrupt far(*)(...))jmpar);

 a_2F.segm=FP_SEG(old2F);

 a_2F.offs=FP_OFF(old2F);

 enable();

 text_print();

 rr.h.ah=0x31;

 rr.h.al=0;

 rr.x.dx=TSR_size;

 intdos(&rr,&rr);

 }

 return 0;

}

void my_context(void)

{

 tsr_stack.segm=_SS;

 tsr_stack.offs=_SP-100;

 rr.h.ah=0x2f;

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

 tsr_dta.segm=sr.es;

 tsr_dta.offs=rr.x.bx;

 /* сохранение своего PID */

 rr.h.ah=0x62;

 intdos(&rr,&rr);

 tsr_pid=rr.x.bx;

}

/* сообщение о установке резидентной программы */

void text_print(void)

{

 textattr(10);

 cprintf("\n");

 cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");

 cprintf("              Лабораторная работа N16             ");

 cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");

 cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");

 cprintf("               Резидентная программа              ");

 cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");

 textattr(14);

 cprintf("\n");

 cprintf("Нажимайте комбинацию клавиш [ L_Shift + R_Shift + F1 ]\n\r");

 textattr(11);

 cprintf("Клавиша [1] при этом то блокируется, то разблокируется.");

 textattr(7);

 cprintf("\n\r");

}

void interrupt new9(...)

{

  unsigned char c;

  unsigned char byte17;//,byte18;

  unsigned char mask=0x03;

  //unsigned char mask17=0x04;

  //unsigned char mask18=0x01;

  byte17=peekb(0x40,0x17);

  //byte18=peekb(0x40,0x18);

  textattr(15+4*16);

  if((inportb(0x60)==F1_code) && ((mask & byte17) && mask))

  {

    cputs("\7");

    if(f==0)

    {

       f=1;

       cout<<" Клавиша [3] заблокирована  ";

    }

    else

    {

       f = 0;

       cout<<" Клавиша [3] разблокирована ";

    }

    (*old9)();

  }

  if( (f==1) && (inportb(0x60)==key1_code) )

  {

    c=inportb(0x61);

    outportb(0x61,c|0x80);

    outportb(0x61,c);

    outportb(0x20,0x20);

  }

  else

    (*old9)();

}

#pragma argsused

void interrupt new2F(word bp,word di,word si,word ds,word es,

                    word dx,word cx,word bx,word ax,word ip,

                    word cs,word fl)

 {

  if ((ax>>8)==com_func)

  /* Указан номер функции, занимаемой нашей программой */

   if(!(ax&0xff))  /* проверка возможности установки */

   {

    ax|=0xff; /* запрет установки */

    es=FP_SEG(mark);/* В регистрах ES:BX возвращается */

    bx=FP_OFF(mark);/*адрес символьной строки tsr_mark*/

   }

   else

    ax=0xffff;

  else {

    /* возврат из нашего обработчика в старый обработчик */

   for (ast=(word far *)&bp;ast<=(word far *)&fl;  ast++)

     *(ast-3)=*ast;

   cx=a_2F.offs; bx=a_2F.segm;

   _SP-=6;

  }

}

/* Поиск свободных функций 2F или функции, */

/*          занятой tc_lab16               */

byte check_tsr(void) {

 byte a, b;

 char far *s1;

 char *s2;

  com_func=0;

  for (a=0xff; a>=0xc0; a--) {

    rr.h.ah=a; rr.h.al=0;

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

    b=rr.h.al;

    /* запоминание первого свободного номера функции */

    if (!(b+com_func)) com_func=a;

    if (b==0xff) /* функция занята */ {

      s1=(char far*)(MK_FP(sr.es,rr.x.bx));

      for (s2=tsr_mark; *s2; s1++,s2++)

       if (*s1!=*s2) break;

      if (*s2) continue;

      /* занята нами */

      com_func=a;

      return (0);

      }

    }

  return (1);

}

Результати роботи програми: Пiсля   iніціалiзації програми по першому натиску комбiнацiї клавiш   RShift+LShift+F1 програма переходить в режим блокування клавiшi 1, при другому - скасовує цей режим. Програма виконана в резидентному варiантi.