📄 ps2mouse.c
字号:
#include "includes.h"
#include "i8259.h"
#include "ps2mouse.h"
#include "ps2kb.h"
#include "display/disp.h"
#include "display/graphics.h"
INT8U mousetype;
MOUSE_STRUC mouse;
extern WINDOW win;
extern XWINDOW xwin;
extern far INT16U PwrOn;
int InitPs2Mouse(void)
{
INT8U v;
setvect(PS2MOUSE_VECT, Ps2MouseInt);
setvect(0x33, int33);
outportb(PS2MOUSE_PORT_D, 0xae);
if(PwrOn!=0x55aa){
ps2get(PS2MOUSE_PORT_D, 0xffffUL); // AA self-test passed (at power on)
ps2get(PS2MOUSE_PORT_D, 0xffffUL); // 00 mouse ID(at power on)
}
putch('.');
/* send 3 times reset commands */
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xff); // reset command
v = ps2get(PS2MOUSE_PORT_D, 0xffff); // FA Acknowledge
if(v==0xff)
return -1;
}while(v!=0xfa);
if(ps2get(PS2MOUSE_PORT_D, 0)==0xff) // AA self-test passed
return -1;
if(ps2get(PS2MOUSE_PORT_D, 0)==0xff) // 00 mouse ID
return -1;
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xff); // reset command
v = ps2get(PS2MOUSE_PORT_D, 0); // FA Acknowledge
if(v==0xff)
return -1;
}while(v!=0xfa);
if(ps2get(PS2MOUSE_PORT_D, 0)==0xff) // AA self-test passed
return -1;
if(ps2get(PS2MOUSE_PORT_D, 0)==0xff) // 00 mouse ID
return -1;
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xff); // reset command
v = ps2get(PS2MOUSE_PORT_D, 0); // FA Acknowledge
if(v==0xff)
return -1;
}while(v!=0xfa);
if(ps2get(PS2MOUSE_PORT_D, 0)==0xff) // AA self-test passed
return -1;
if(ps2get(PS2MOUSE_PORT_D, 0)==0xff) // 00 mouse ID
return -1;
/* Attempt to Enter Microsoft scrolling Mouse mode */
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf3); // set sample rate
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
putch('.');
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xc8);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf3);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0x64);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf3);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0x50);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf2);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
mousetype = ps2get(PS2MOUSE_PORT_D, 0); // Response 03 if microsoft scrolling mouse, Response 00 if not
if(mousetype==0xff)
return -1;
putch('.');
/* Attempt to Enter Microsoft 5-button scrolling mouse mode */
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf3);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xc8);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf3);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xc8);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf3);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0x50);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf2);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
mousetype = ps2get(PS2MOUSE_PORT_D, 0); // Response 04 if 5-button scrolling mouse
if(mousetype == 0xff)
return -1;
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf3);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0x0a);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf2);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
if(ps2get(PS2MOUSE_PORT_D, 0)==0xff) // 00 mouse ID
return -1;
putch('.');
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xe8);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0x03);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xe6);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf3);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
putch('.');
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0x28);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
do{
ps2sndcmd(PS2MOUSE_PORT_D, 0xf4);
v = ps2get(PS2MOUSE_PORT_D, 0);
if(v==0xff)
return -1;
}while(v!=0xfa);
putch('.');
return 0;
}
void interrupt Ps2MouseInt(void)
{
INT8 *mv;
INT8 i, Bytes;
Bytes = 3;
mv = (INT8*)&mouse;
if(mousetype)
Bytes = 4;
for(i=0;i<Bytes;i++){
while(!(inportb(PS2MOUSE_PORT_S)&1));
*mv++ = inportb(PS2MOUSE_PORT_D);
}
if(Bytes==3)
*mv = 0;
xwin.mcurx += mouse.XMovement;
xwin.mcury -= mouse.YMovement;
if(xwin.mcurx<xwin.left)
xwin.mcurx = xwin.left;
if(xwin.mcurx>=xwin.right)
xwin.mcurx = xwin.right;
if(xwin.mcury<xwin.top)
xwin.mcury = xwin.top;
if(xwin.mcury>=xwin.bottom)
xwin.mcury = xwin.bottom;
mouse.leftclickcnt += mouse.LeftBtn;
mouse.rightclickcnt += mouse.RightBtn;
mouse.middleclickcnt += mouse.MiddleBtn;
eoi();
}
#pragma argsused
void interrupt int33(INT16U bp, INT16U di, INT16U si,
INT16U ds, INT16U es, INT16U dx,
INT16U cx, INT16U bx, INT16U ax)
{
switch(ax){
case 1:
if(!mouse.visible){
GraCursor(xwin.mcurx, xwin.mcury, xwin.crsp);
xwin.oldmcurx = xwin.mcurx;
xwin.oldmcury = xwin.mcury;
mouse.visible = 1;
}
break;
case 2:
if(mouse.visible){
GraCursor(xwin.oldmcurx, xwin.oldmcury, xwin.crsp);
mouse.visible = 0;
}
break;
case 3:
bx = 0;
bx = mouse.LeftBtn | (mouse.RightBtn<<1) | (mouse.MiddleBtn<<2);
cx = xwin.mcurx;
dx = xwin.mcury;
break;
case 4:
xwin.mcurx = cx;
xwin.mcury = dx;
xcursor();
break;
case 5:
case 6:
ax = mouse.LeftBtn | (mouse.RightBtn<<1) | (mouse.MiddleBtn<<2);
if(bx==0)
bx = mouse.leftclickcnt;
else if (bx==1)
bx = mouse.rightclickcnt;
else if (bx==2)
bx = mouse.rightclickcnt;
cx = xwin.mcurx;
dx = xwin.mcury;
mouse.leftclickcnt = 0;
mouse.rightclickcnt = 0;
mouse.middleclickcnt = 0;
break;
case 7:
xwin.left = cx;
xwin.right = dx;
break;
case 8:
xwin.top = cx;
xwin.bottom = dx;
break;
case 9:
/*
* 光标数据格式说明: 此图形光标数据格式不兼容标准鼠标数据格式
* 支持小光标(8*y)和大光标(16*y), y的值不定
* 数据格式:
* 第一个字指明本光标是8*y还是16*y
* 如果是8*y则第一个字数据为0001, 否则为0002
* 其他为鼠标数据字节
*
*/
xwin.mcurx = bx;
xwin.mcury = cx;
xwin.crsp = MK_FP(es, dx);
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -