проблема по отлавливанию прерываний клавы
задание:
по комбинации правый shift + правый ctrl + f8 отключается клавиша "8" при повторном нажатии комбинации обратно включается
#include <stdio.h>
#include <dos.h>
#include <conio.h>
void (interrupt *old9)(void); /* Старый обработчик прерывания 9h */
void interrupt new9(void); /* Новый обработчик прерывания 9h */
/* void *readvect (int in); /* Чтение вектора */
/* void writevect (int in,void *h); /* Запись вектора */
unsigned char F8_code=119;
/* scan-code "F8" */
unsigned char key8_code=56;
/* scan-code "8" */
char f=0; /* Флаг */
union REGS rr;
struct SREGS sr;
/* Чтение вектора *
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);
}
/* Новый обработчик 9-го прерыванмя */
void interrupt new9()
{
unsigned char c,x,y;
unsigned char byte17;
unsigned char mask=0x01;
unsigned char mask17=0x04;
byte17=peekb(0x40,0x17);
if((inportb(0x60)==F8_code)&&(byte17&mask)&&
(byte17&mask17))
{
cputs("\7");
x=wherex();
y=wherey();
gotoxy(55,3);
textattr(0x1e);
if(f==0)
{
f=1;
cprintf("klavisha \"8\" block ");
}
else
{
f=0;
cprintf("klavisha \"8\" unblock ");
}
gotoxy(x,y);
textattr(0x07);
(*old9)();
}
if( (f==1) && (inportb(0x60)==key8_code) )
{
c=inportb(0x61);
outportb(0x61,c|0x80);
outportb(0x61,c);
outportb(0x20,0x20);
}
else
(*old9)();
/************/
void main(void)
char string[80]; /* Буфер для ввода текста */
clrscr();
cprintf(" Upravlenie klaviaturoy ");
old9=_dos_getvect(0x9);
_dos_setvect(0x9,new9);
textattr(0x0c);
cprintf("\n\n\r\"gorja4aja\" kombinacija: ");
textattr(0x0a);
cprintf("Right Shift, Right Ctrl, F8\n\r");
textattr(0x0b);
cprintf("Klavisha, kotoraja blokiruetsja: ");
cprintf("8");
cprintf("\r\nvvedite stroku simvolov>");
cscanf("%s",string);
_dos_setvect(0x9,old9);
}
:-?
Не уверен что печать из прерывания на екран, которая скорее всего юзает 21h прерывание - хорошая идея. А так - же не стал бы писать прерывание на С, сделай все хоть на встроеном асме + прямой вывод в видеобуфер. .
Кроме того, если ты запускаешь приложение под Windows(просто как консольное), то прога может тоже не работать - знаю на своём опыте:) . Поэтому испытывай программу либо в чистом DOS'e, либо запускай сессию, либо юзай оболочки вроде Norton comander'а.