Системное программное обеспечение персональных ЭВМ


Пример 2



Пример 2

/*== ПРИМЕР 7.2 ==*/ /*============ Прерывание от клавиатуры ================*/ #include <dos.h>

void interrupt (*old9)(); /* Для сохр. старого вектора */ void interrupt new9(); /* Описание нового обработчика */ unsigned char a_code=0x1e; /* Скан-код клавиши "a" */ union REGS rr; struct SREGS sr; void *readvect(int in); void writevect(int in, void *h); /*==== main ====*/ main() { char string[80]; /* Перехват вектора 9 */ old9=readvect(9); writevect(9,new9); printf("\nВводите строку символов>"); scanf("%s",string); /* Ввод строки */ /* Восстановление вектора 9 */ writevect(9,old9); printf("%s\n",string); } /*==== Обработчик прерывания 9 ====*/ void interrupt new9() { unsigned char c; /* Чтение scan-кода и сравнение его с "горячим" */ if (inportb(0x60)==a_code) { /* Если горячий код - подтверждение приема... */ c=inportb(0x61); outportb(0x61,c|0x80); outportb(0x61,c); /* и сброс контроллера прерываний. */ outportb(0x20,0x20); } else (*old9)(); /* Если нет - вызов сист.обработчика */ } /*==== Получение старого вектора ====*/ void *readvect(int in) { rr.h.ah=0x35; rr.h.al=in; intdosx(&rr,&rr,&sr); return(MK_FP(sr.es,rr.x.bx)); } /*==== Запись нового вектора ====*/ void writevect(int in, void *h) { rr.h.ah=0x25; rr.h.al=in; sr.ds=FP_SEG(h); rr.x.dx=FP_OFF(h); intdosx(&rr,&rr,&sr); }




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