Информатика и технология программирования


Реентерабельность и проблемы резидентных программ в DOS - часть 5


{ // Если был прерван BIOS ...


putstr("Wait BIOS",40,1);
WAITBIOS=1; // Взводим флаг и выходим


return;
}
}
FORKH++; // Взводим флаг выполнения процесса


SETCONTEXT(); // Переключаемся на контекст процесса


switch(NKEY) // обработчика прерывания, оставленного


{ // от main() резидентной программы


case 53: PROCESS1();
break; // Реакция на ALT+?


}
RESTORECONTEXT(); // Восстанавливаем контекст


NKEY=0; // Сбрасываем скан-код - обработка выполнена


FORKH--; // Сбрасываем флаг выполнения процесса


}



int i;
&#35define ALT 8
int kbval;
char SCAN[]={53,80,72,75,77,71,78,74,82,79,0};


// Обработчик прерываний от клавиатуры


void interrupt KB(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs)
{
SAVE; // Переключить стек


kbval=peekb(0,0x417); // Байт состояния клавиатуры из DOS


for (i=0; SCAN[i] !=0; i++) // Проверка скан-кода


if (inportb(0x60)==SCAN[i]) break;
if (SCAN[i] !=0)
{ // Это скан-код из списка при нажатой ALT


if ((kbval &#38 ALT) !=0) // Снять код с клавиатуры - он " наш"


{
kbval=inportb(0x61);
outportb(0x61,kbval | 0x80);
outportb(0x61,kbval);
outportb(0x20,0x20);
switch(SCAN[i])
{
case 71: break; // Моментальная реакция на скан-коды


case 80: break; // без переключения процессов


case 72: break;
case 75: break;
case 77: break;
case 78: break;
case 74: break;
case 53: if (NKEY!=0) break; // Старый код еще не обработан -


// выйти с потерей запроса


// Иначе - обработка с переключением


NKEY=SCAN[i]; PROCKEY(); break;
}
RESTORE;
return;
}
}
RESTORE; // Восстановить стек


(*KBSAV)(); // Обработчик прерывания DOS по цепочке


}



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


void interrupt DOSOK(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs)
// Прерывание DOS O.K., которое вызывается DOS-ом, когда


// разрешено использование всех функций DOS, несмотря на


// взведенный флаг занятости DOS (т.е. DOS находится в


// состоянии ожидания, например при вводе с клавиатуры).


{
(*DOSOKSAV)(); //Вызвать по старому вектору DOS O.K.




Начало  Назад  Вперед



Книжный магазин