Files
TempleOS-Rijn/LT/Adam/KbdMouse.APZ
T
2018-09-08 21:45:20 +02:00

739 lines
17 KiB
Plaintext

time_stamp_freq=SYS_TIMER_FREQ*(
GetTimeStamp-time_stamp_start)/
(ReadSysTimer-sys_timer_start);
time_stamp_kHz_freq=time_stamp_freq/1000;
#help_index "Char/Input"
U8Fifo *scan_code_fifo=NewU8Fifo(128);
U8 last_down_scan_code=0;
void KbdCmdSend(U8 port, U1 val,BoolU4 *btimeout=NULL)
{
LTDate timeout=BootTime+LTDATE_FREQ/10;
do {
if (!(InP(KEYB_CTRL)&2)) {
timeout=0;
break;
}
} while (BootTime<timeout);
if (!timeout) {
OutP(port, val);
if (btimeout) *btimeout=FALSE;
} else
if (btimeout) *btimeout=TRUE;
}
I8 KbdCmdRead(BoolU4 *btimeout=NULL)
{
LTDate timeout=BootTime+LTDATE_FREQ/10;
do {
if (InP(KEYB_CTRL) & 1) {
if (btimeout) *btimeout=FALSE;
return InP(KEYB_PORT);
}
} while (BootTime<timeout);
if (btimeout) *btimeout=TRUE;
return -1;
}
void KbdCmdFlush(I8 Hz=50)
{
LTDate timeout;
if (Hz) {
timeout=BootTime+LTDATE_FREQ/Hz;
do InP(KEYB_PORT);
while (BootTime<timeout);
} else
while (InP(KEYB_CTRL)&1)
InP(KEYB_PORT);
}
void KbdSetLEDs(U8 sc)
{
BoolU4 old_preempt=Preempt(OFF);
U1 v=0;
AssignBit(&v,0,Bt(&sc,SCf_SCROLL));
AssignBit(&v,1,Bt(&sc,SCf_NUM));
AssignBit(&v,2,Bt(&sc,SCf_CAPS));
KbdCmdSend(KEYB_PORT,0xED);
KbdCmdSend(KEYB_PORT,v);
Preempt(old_preempt);
}
void KbdMouseCmdAck(U1 val,BoolU4 *btimeout=NULL)
{
U8 timeout=5;
BoolU4 my_btimeout=FALSE;
do {
KbdCmdSend(KEYB_CTRL,0xD4,&my_btimeout);
if (my_btimeout) goto here;
KbdCmdSend(KEYB_PORT,val,&my_btimeout);
if (my_btimeout) goto here;
if (KbdCmdRead==0xFA)
break;
here:
if (my_btimeout)
KbdCmdFlush;
} while (--timeout);
if (timeout) {
if (btimeout) *btimeout=FALSE;
} else {
if (btimeout) *btimeout=TRUE;
}
}
I1 ScanCodeToASCII(U8 sc)
{
I1 *table=NORMAL_KEY_SCAN_DECODE_TABLE;
if (sc & SCF_E0_PREFIX)
return 0;
if (sc & SCF_CTRL)
table=CTRL_KEY_SCAN_DECODE_TABLE;
else if (sc & SCF_SHIFT) {
if (!(sc & SCF_CAPS))
table=SHIFT_KEY_SCAN_DECODE_TABLE;
} else {
if (sc & SCF_CAPS)
table=SHIFT_KEY_SCAN_DECODE_TABLE;
}
sc&=0x7F;
if (sc>=0x50)
return 0;
else
return table[sc];
}
U1 scan_code_map[0x100]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,SC_SHIFT,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,SC_CR,SC_CTRL,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0x35,0,0,SC_ALT,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,SC_HOME,SC_CURSOR_UP,SC_PAGE_UP,0,SC_CURSOR_LEFT,0,SC_CURSOR_RIGHT,0,SC_END,
SC_CURSOR_DOWN,SC_PAGE_DOWN,SC_INSERT,SC_DELETE,0,0,0,0,0,0,0,0,SC_GUI,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
U1 num_lock_map[0x100]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,8,9,10,0,5,6,7,0,2,
3,4,11,0x34,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,SC_CR,SC_CTRL,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0x35,0,0,SC_ALT,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,SC_HOME,SC_CURSOR_UP,SC_PAGE_UP,0,SC_CURSOR_LEFT,0,SC_CURSOR_RIGHT,0,SC_END,
SC_CURSOR_DOWN,SC_PAGE_DOWN,SC_INSERT,SC_DELETE,0,0,0,0,0,0,0,0,SC_GUI,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
public void SetTypeMatic(U1 delay)
{
KbdCmdSend(KEYB_CTRL,0xA7); //Disable Mouse
KbdCmdSend(KEYB_CTRL,0xAE); //Enable Keyboard
KbdCmdSend(KEYB_PORT,0xF3);
KbdCmdSend(KEYB_PORT,delay); //Typematic rate
KbdCmdSend(KEYB_CTRL,0xA8); //Enable Mouse
}
#help_index "Char/Conversion"
public I1 *ASCIIToKeyName(I8 ch,BoolU4 include_ctrl=TRUE)
{
I8 i;
I1 buf[64];
*buf=0;
if (ch) {
if (ch<26) {
if (ch==CH_CR)
StrCat(buf,"ENTER");
else if (ch==CH_ESC)
StrCat(buf,"ESC");
else if (ch==CH_BACKSPACE)
StrCat(buf,"BACKSPACE");
else if (ch==CH_TAB)
StrCat(buf,"TAB");
else if (ch==CH_CURSOR)
StrCat(buf,"CURSOR");
else {
if (include_ctrl)
StrCat(buf,"CTRL ");
buf[i=StrLen(buf)]=ch-1+'A';
buf[i+1]=0;
}
} else if (Bt(printable_chars_bitmap,ch)) {
if (ch==CH_SPACE)
StrCat(buf,"SPACE");
else if (ch==CH_SHIFT_SPACE)
StrCat(buf,"SHIFT_SPACE");
else {
buf[i=StrLen(buf)]=ch;
buf[i+1]=0;
}
}
}
return NewStr(buf);
}
public I1 *ScanCodeToKeyName(I8 sc)
{
I8 ch=ScanCodeToASCII(sc);
I1 buf[64],*st;
*buf=0;
if (sc&SCF_CTRL)
StrCat(buf,"CTRL ");
if (sc&SCF_ALT)
StrCat(buf,"ALT ");
if (sc&SCF_SHIFT)
StrCat(buf,"SHIFT ");
if (ch) {
st=ASCIIToKeyName(ch,FALSE);
StrCpy(buf+StrLen(buf),st);
Free(st);
} else {
switch (sc.u1[0]) {
case SC_BACKSPACE:StrCat(buf,"BACK"); break;
case SC_CAPS: StrCat(buf,"CAPS"); break;
case SC_NUM: StrCat(buf,"NUM"); break;
case SC_SCROLL: StrCat(buf,"SCROLL"); break;
case SC_CURSOR_UP:StrCat(buf,"UP"); break;
case SC_CURSOR_DOWN:StrCat(buf,"DOWN"); break;
case SC_CURSOR_LEFT:StrCat(buf,"LEFT"); break;
case SC_CURSOR_RIGHT:StrCat(buf,"RIGHT"); break;
case SC_PAGE_UP:StrCat(buf,"PAGE_UP"); break;
case SC_PAGE_DOWN:StrCat(buf,"PAGE_DOWN"); break;
case SC_HOME: StrCat(buf,"HOME"); break;
case SC_END: StrCat(buf,"END"); break;
case SC_INSERT: StrCat(buf,"INSERT"); break;
case SC_DELETE: StrCat(buf,"DELETE"); break;
case SC_F1: StrCat(buf,"F1"); break;
case SC_F2: StrCat(buf,"F2"); break;
case SC_F3: StrCat(buf,"F3"); break;
case SC_F4: StrCat(buf,"F4"); break;
case SC_F5: StrCat(buf,"F5"); break;
case SC_F6: StrCat(buf,"F6"); break;
case SC_F7: StrCat(buf,"F7"); break;
case SC_F8: StrCat(buf,"F8"); break;
case SC_F9: StrCat(buf,"F9"); break;
case SC_F10: StrCat(buf,"F10"); break;
case SC_F11: StrCat(buf,"F11"); break;
case SC_F12: StrCat(buf,"F12"); break;
case SC_GUI: StrCat(buf,"WINDOWS"); break;
case SC_PRTSCRN1: StrCat(buf,"PRTSCRN1"); break;
case SC_PRTSCRN2: StrCat(buf,"PRTSCRN2"); break;
}
}
return NewStr(buf);
}
#help_index "Training"
I8 display_keys_row=TEXT_ROWS/2;
public BoolU4 kbd_display_special_keys=FALSE;
void DisplayKeysPopUp()
{
I8 i;
I1 *st;
InitLocalTask;
Fs->win_left=TEXT_COLS/2-8;
Fs->win_top=display_keys_row;
Fs->win_right=TEXT_COLS/2+8;
Fs->win_bottom=Fs->win_top;
Fs->text_attribute=(YELLOW<<4)+BLACK;
Fs->border_attribute=(YELLOW<<4)+BLACK;
Btr(&Fs->crt_flags,CRTf_HAS_CLOSE_WIN);
UseConsoleLtf(NULL);
Fs->cur_ltf->flags&=~LTFF_ATTR_BY_PARTITION;
Fs->aux_ltf->flags&=~LTFF_ATTR_BY_PARTITION;
Fs->cur_ltf->start_text_attribute=(YELLOW<<4)+BLACK;
Fs->aux_ltf->start_text_attribute=(YELLOW<<4)+BLACK;
st=ScanCodeToKeyName(last_down_scan_code);
PrintF("%s",st);
Free(st);
LtfRecalc(Fs->cur_ltf);
Bts(&Fs->crt_flags,CRTf_SHOW);
display_keys_row+=4;
for (i=0;i<1000;i++) {
WinToTop(Fs);
Sleep(1);
}
display_keys_row-=4;
}
void DisplaySpecialKeys(I8 sc)
{
I8 ch;
if (!(sc&SCF_KEY_UP) &&
sc&SCF_NEW_KEY ) {
ch=ScanCodeToASCII(sc);
if (!ch || (ch<CH_SPACE+1 && ch!=CH_CR && ch!=CH_ESC) ||
sc & (SCF_ALT|SCF_CTRL)) {
switch (sc.u1[0]) {
case SC_CTRL:
case SC_ALT:
case SC_SHIFT:
break;
case SC_BACKSPACE:
case SC_INSERT:
case SC_DELETE:
case SC_CURSOR_UP:
case SC_CURSOR_DOWN:
case SC_CURSOR_LEFT:
case SC_CURSOR_RIGHT:
case SC_PAGE_UP:
case SC_PAGE_DOWN:
if (sc&(SCF_CTRL|SCF_ALT|SCF_SHIFT))
Spawn(&DisplayKeysPopUp,"DISPLAY KEY");
break;
default:
Spawn(&DisplayKeysPopUp,"DISPLAY KEY");
}
}
}
}
#help_index "Char/Input"
void InitKbd()
{
sys_cur_scan_code=0;
KbdCmdFlush;
KbdCmdSend(KEYB_CTRL,0xA7); //Disable Mouse
KbdCmdSend(KEYB_CTRL,0xAE); //Enable Keyboard
KbdCmdSend(KEYB_PORT,0xF0);
KbdCmdSend(KEYB_PORT,0x02);
KbdSetLEDs(sys_cur_scan_code);
Btr(&sys_semas[SYS_SEMA_KEY_PRESSED],0);
OutP(0x21,InP(0x21)&~2);
}
void KbdHandler()
{
U8 ch,sc,sc2=0,sc3,sc_raw;
U1FifoRemove(kbdmouse_fifo,&sc2);
if (sc2==0xE0) {
U1FifoRemove(kbdmouse_fifo,&sc2);
AssignBit(&sc2,SCf_KEY_UP,sc2 & 0x80);
Bts(&sc2,SCf_E0_PREFIX);
} else {
AssignBit(&sc2,SCf_KEY_UP,sc2 & 0x80);
Btr(&sc2,SCf_E0_PREFIX);
}
sc=sys_cur_scan_code.u4[0]&~0x1FF;
sc_raw=sc2;
if (sc & SCF_NUM) {
if (sc3=num_lock_map[sc2.u1[0]])
sc2.u1[0]=sc3;
} else {
if (sc3=scan_code_map[sc2.u1[0]])
sc2.u1[0]=sc3;
}
if (sc2==SC_SHIFT) {
sc|=SCF_SHIFT;
goto new_key_done;
}
if (sc2==SC_SHIFT+SCF_KEY_UP) {
sc&=~SCF_SHIFT;
goto new_key_done;
}
if (sc2==SC_CTRL) {
sc|=SCF_CTRL;
goto new_key_done;
}
if (sc2==SC_CTRL+SCF_KEY_UP) {
sc&=~SCF_CTRL;
goto new_key_done;
}
if (sc2==SC_ALT) {
sc|=SCF_ALT;
goto new_key_done;
}
if (sc2==SC_ALT+SCF_KEY_UP) {
sc&=~SCF_ALT;
goto new_key_done;
}
if (sc2==SC_CAPS)
goto new_key_done;
if (sc2==SC_CAPS+SCF_KEY_UP) {
sc^=SCF_CAPS;
KbdSetLEDs(sc);
goto new_key_done;
}
if (sc2==SC_NUM)
goto new_key_done;
if (sc2==SC_NUM+SCF_KEY_UP) {
sc^=SCF_NUM;
KbdSetLEDs(sc);
goto new_key_done;
}
if (sc2==SC_SCROLL)
goto new_key_done;
if (sc2==SC_SCROLL+SCF_KEY_UP) {
sc^=SCF_SCROLL;
KbdSetLEDs(sc);
goto new_key_done;
}
if (sc & SCF_CTRL && sc & SCF_ALT) {
if (sc2==SC_DELETE) {
Bts(sys_flags,SYSf_CTRL_ALT_DEL);
goto mostly_done;
}
if (sc2==1) {
Bts(sys_flags,SYSf_CTRL_ALT_ESC);
goto mostly_done;
}
if (sc2==15) {
Bts(sys_flags,SYSf_CTRL_ALT_TAB);
goto mostly_done;
}
if (!(sc2 & SCF_KEY_UP)) {
if (ch=ScanCodeToASCII(sc2&0xFF)) {
if (ch>='a' && ch<='z') {
if (ctrl_alt_letter_routines[ch-'a']) {
CallInd(ctrl_alt_letter_routines[ch-'a']);
goto mostly_done;
}
}
}
}
}
new_key_done:
sc|=SCF_NEW_KEY;
mostly_done:
sys_cur_scan_code=sc|sc2|
(sc|sc_raw)<<32;
if (kbd_display_special_keys)
DisplaySpecialKeys(sys_cur_scan_code);
if (Btr(&sys_cur_scan_code,SCf_NEW_KEY)) {
Btr(&sys_cur_scan_code,32+SCf_NEW_KEY);
U8FifoInsert(scan_code_fifo,sys_cur_scan_code);
if (!(sys_cur_scan_code&SCF_KEY_UP))
last_down_scan_code=sys_cur_scan_code;
}
}
#help_index "Input Pointer"
public double mxx_scale=0.5,
myy_scale=0.5,
mzz_scale=1.0;
public I8 mxx_prescale=GR_WIDTH/mxx_scale/2.0,
myy_prescale=GR_HEIGHT/myy_scale/2.0,
mzz_prescale=0/mzz_scale;
public I8 mxx=GR_WIDTH>>1,
myy=GR_HEIGHT>>1,
mzz=0;
BoolU4 mouse_buttons[5];
BoolU4 mouse_installed=FALSE;
U8 mouse_install_attempts=0;
BoolU4 mouse_has_wheel=FALSE;
BoolU4 mouse_has_ext_buttons=FALSE;
BoolU4 mouse_evt=FALSE;
BoolU4 mouse_irqs_working=FALSE;
U8 mouse_pkt_size=3;
BoolU8 MouseGetDeviceType()
{
BoolU4 my_btimeout;
U1 b;
KbdMouseCmdAck(0xF2,&my_btimeout);
if (my_btimeout)
return FALSE;
b=KbdCmdRead;
if (b==3)
mouse_has_wheel=TRUE;
else if (b==4)
mouse_has_ext_buttons=TRUE;
return TRUE;
}
BoolU8 MouseReset()
{
I8 i;
BoolU4 my_btimeout,result=FALSE;
mouse_has_wheel=FALSE;
mouse_has_ext_buttons=FALSE;
KbdCmdFlush;
KbdCmdSend(KEYB_CTRL,0xAD,&my_btimeout); //Disable Kbd
if (my_btimeout) goto done;
KbdCmdSend(KEYB_CTRL,0xA8,&my_btimeout); //Enable Mouse
if (my_btimeout) goto done;
KbdMouseCmdAck(0xFF,&my_btimeout); //Reset
if (my_btimeout) goto done;
for (i=0;i<250;i++) {
KbdCmdRead(&my_btimeout);
if (!my_btimeout)
break;
}
KbdCmdRead(&my_btimeout);
KbdMouseCmdAck(0xF3,&my_btimeout);
if (my_btimeout) goto done;
KbdMouseCmdAck(200,&my_btimeout);
if (my_btimeout) goto done;
KbdMouseCmdAck(0xF3,&my_btimeout); // enable Mouse
if (my_btimeout) goto done;
KbdMouseCmdAck(100,&my_btimeout); // Set Rate
if (my_btimeout) goto done;
KbdMouseCmdAck(0xF3,&my_btimeout);
if (my_btimeout) goto done;
KbdMouseCmdAck(80,&my_btimeout); //Resolution
if (my_btimeout) goto done;
if (!MouseGetDeviceType) goto done; // enable Mouse
KbdMouseCmdAck(0xF3,&my_btimeout);
if (my_btimeout) goto done;
KbdMouseCmdAck(10,&my_btimeout);
if (my_btimeout) goto done;
if (!MouseGetDeviceType) goto done; // enable Mouse
KbdMouseCmdAck(0xE8,&my_btimeout); //Resolution
if (my_btimeout) goto done;
KbdMouseCmdAck(0x03,&my_btimeout);
if (my_btimeout) goto done;
KbdMouseCmdAck(0xE6,&my_btimeout);
if (my_btimeout) goto done;
KbdMouseCmdAck(0xF3,&my_btimeout); // Set Rate
if (my_btimeout) goto done;
KbdMouseCmdAck(100,&my_btimeout);
if (my_btimeout) goto done;
KbdMouseCmdAck(0xF4,&my_btimeout); // enable Mouse
if (my_btimeout) goto done;
result=TRUE;
done:
KbdCmdSend(KEYB_CTRL,0xAE); //Enable Keyboard
if (mouse_has_wheel || mouse_has_ext_buttons)
mouse_pkt_size=4;
else
mouse_pkt_size=3;
if (!result)
KbdCmdSend(KEYB_CTRL,0xA7); //Disable Mouse
return result;
}
void MouseHandler()
{
I8 i,dx,dy,dz,old_x=mxx,old_y=myy,old_z=mzz;
U1 mouse_buf[4];
BoolU4 old_buttons[5];
for (i=0;i<5;i++)
old_buttons[i]=mouse_buttons[i];
for (i=0;i<4;i++)
if (!U1FifoRemove(kbdmouse_fifo,&mouse_buf[i]))
mouse_buf[i]=0;
mouse_buttons[0] = mouse_buf[0] & 1;
mouse_buttons[1] = (mouse_buf[0] & 2) >> 1;
mouse_buttons[2] = (mouse_buf[0] & 4) >> 2;
mouse_buttons[3] = (mouse_buf[3] & 0x10) >> 4;
mouse_buttons[4] = (mouse_buf[3] & 0x20) >> 5;
if (mouse_buf[0] & 0x10)
dx=mouse_buf[1]-256;
else
dx=mouse_buf[1];
if (mouse_buf[0] & 0x20)
dy=256-mouse_buf[2];
else
dy=-mouse_buf[2];
if (mouse_buf[3] & 0x08)
dz=(mouse_buf[3]&7)-8;
else
dz=mouse_buf[3]&7;
mxx_prescale+=dx;
myy_prescale+=dy;
mzz_prescale+=dz;
mxx=mxx_prescale*mxx_scale;
myy=myy_prescale*myy_scale;
mzz=mzz_prescale*mzz_scale;
if (mxx < 0) {
mxx=0;
mxx_prescale=0;
}
if (mxx>=GR_WIDTH) {
mxx=GR_WIDTH-1;
mxx_prescale=mxx/mxx_scale;
}
if (myy < 0) {
myy=0;
myy_prescale=0;
}
if (myy>=GR_HEIGHT) {
myy=GR_HEIGHT-1;
myy_prescale=myy/myy_scale;
}
if (mxx!=old_x||myy!=old_y||mzz!=old_z)
mouse_evt=TRUE;
else
for (i=0;i<5;i++)
if (mouse_buttons[i]!=old_buttons[i]) {
mouse_evt=TRUE;
break;
}
}
U8 kbdmouse_timeout=0;
void ResetKbdMouse(I8 Hz=50)
{
Btr(&sys_semas[SYS_SEMA_KEY_PRESSED],0);
KbdCmdFlush(Hz);
U1FifoFlush(kbdmouse_fifo);
U8FifoFlush(scan_code_fifo);
kbdmouse_timeout=0;
OutP(0x21,InP(0x21)&~2);
}
BoolU8 InstallMouseDriver()
{
I8 i;
Preempt(ON);
mouse_installed=FALSE;
for(i=0;i<5;i++)
mouse_buttons[i]=0;
if (MouseReset)
mouse_installed=TRUE;
ResetKbdMouse;
mouse_install_attempts++;
mouse_evt=mouse_installed;
return mouse_installed;
}
void HandleKbdMouse()
{
U1 i;
if (U1FifoCnt(kbdmouse_fifo)) {
if (kbdmouse_timeout &&
GetTimeStamp>kbdmouse_timeout) {
ResetKbdMouse;
return;
}
if (Btr(&sys_semas[SYS_SEMA_KEY_PRESSED],0)) {
while (U1FifoCnt(kbdmouse_fifo)) {
if (U1FifoCnt(kbdmouse_fifo)==1) {
U1FifoPeek(kbdmouse_fifo,&i);
if (i==0xE0) {
if (!kbdmouse_timeout)
kbdmouse_timeout=GetTimeStamp+time_stamp_freq/50;
Bts(&sys_semas[SYS_SEMA_KEY_PRESSED],0);
return;
}
}
kbdmouse_timeout=0;
KbdHandler;
OutP(0x21,InP(0x21)&~2);
}
} else {
if (!mouse_installed)
U1FifoFlush(kbdmouse_fifo);
else {
if (U1FifoCnt(kbdmouse_fifo)>=mouse_pkt_size) {
kbdmouse_timeout=0;
mouse_evt_time=GetTimeStamp;
while (U1FifoCnt(kbdmouse_fifo)>=mouse_pkt_size)
MouseHandler;
} else
if (!kbdmouse_timeout)
kbdmouse_timeout=GetTimeStamp+time_stamp_freq/50;
}
}
} else
kbdmouse_timeout=0;
}
#define KBDMOUSE_POLL_RATE 500
U8 last_kbdmouse_poll_time=GetTimeStamp;
extern void PollKbdMouse();
TssStruct *poll_kbdmouse_tss=NULL;
void PollKbdMouseTsk()
{ //Poll for a minute
I8 i;
for (i=0;i<KBDMOUSE_POLL_RATE*60;i++) {
PollKbdMouse();
Sleep(1000/KBDMOUSE_POLL_RATE);
}
poll_kbdmouse_tss=NULL;
}
void PollKbdMouse()
{
U8 poll_time=GetTimeStamp;
if (poll_time-last_kbdmouse_poll_time<time_stamp_freq/KBDMOUSE_POLL_RATE)
return;
if (poll_time-last_kbdmouse_poll_time>time_stamp_freq/KBDMOUSE_POLL_RATE*4) {
last_kbdmouse_poll_time=poll_time;
ResetKbdMouse(0);
if (!poll_kbdmouse_tss)
poll_kbdmouse_tss=Spawn(&PollKbdMouseTsk,"Poll KbdMouse");
} else {
last_kbdmouse_poll_time=poll_time;
while (InP(KEYB_CTRL)&1) {
U1FifoInsert(kbdmouse_fifo,InP(KEYB_PORT));
HandleKbdMouse;
}
}
}
#help_index ""
InitKbd;
Spawn(&InstallMouseDriver);