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


Пример 1



Пример 1

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

#define byte unsigned char void interrupt (*old9)(); /* Для сохр. старого вектора */ void interrupt new9(); /* Описание нового обработчика */ byte SC[100]; /* Массив - накопитель скан-кодов */ byte Nsc=0; /* Счетчик скан-кодов */ byte eoj_flag; /* Флаг окончания */ void *readvect(int in); void writevect(int in, void *h); union REGS rr; struct SREGS sr; main() { int i; /* Перехват вектора 9 */ old9=readvect(9); writevect(9,new9); printf("\n\nНажимайте на калавиши \n"); printf("Esc - конец работы\n"); /* В этом цикле происходит обработка нажатых клавиш */ for (eoj_flag=0; eoj_flag==0;); /* Восстановление вектора 9 */ writevect(9,old9); /* Вывод на экран введенных скан-кодов */ for (i=0; i<Nsc; printf("%x ",SC[i++]) ); } /*==== Обработчик прерывания 9 ====*/ void interrupt new9() { byte scan; /* Скан-код */ byte c; /* Состояние порта 61 */ /* Чтение scan-кода. */ scan=inportb(0x60); /* По Esc (скан - 1) устанавливается признак окончания */ if (scan==1) eoj_flag=1; /* Запоминается скан-код */ SC[Nsc++]=scan; /* Устанавл.признак окончания при заполнении массива */ if (Nsc>99) eoj_flag=1; /* Подтверждение приема. В порт 61 на короткое время выставляется "1" по шине старшего разряда. */ c=inportb(0x61); outportb(0x61,c|0x80); outportb(0x61,c); /* Сброс контроллера прерываний. */ outportb(0x20,0x20); } /*==== Получение старого вектора ====*/ 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); }

Программный пример 7.2 иллюстрирует технику обработки "горячей клавиши", часто применяемую в резидентных программах. Такие программы перехватывают прерывание 9 и распознают код некоторой закрепленной за ними клавиши. При распознавании "горячей клавиши" программа выполняет какие-то свои действия, обработку всех остальных клавиш программа "отдает" системе. Для нашей программы "горячей" является клавиша "a", действия нашей программы по клавише "a" - пустые, что приведет к исчезновению буквы "a" из вводимого потока. Эта программа, как и предыдущая, также перехватывает прерывание 9. Обработчик прерывания читает скан-код, но не спешит посылать в клавиатуру подтверждение, а анализирует код. Если это скан-код клавиши "a", то обработчик удаляет его из клавиатуры и сбрасывает контроллер прерываний. В противном случае вызывается системный обработчик, который повторно прочитает тот же код из порта 0x60 и распорядится им по-своему. Вы можете убедиться в том, что в символьную строку, вводимую функцией scanf основной программы, не будут включаться буквы "a".




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