⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2mouse.c

📁 ps2鼠标驱动程序
💻 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 + -