Code: Select all
//Mouse.inc by SANiK
//License: Use as you wish, except to cause damage
byte mouse_cycle=0; //unsigned char
sbyte mouse_byte[3]; //signed char
sbyte mouse_x=0; //signed char
sbyte mouse_y=0; //signed char
//Mouse functions
void mouse_handler(struct regs *a_r) //struct regs *a_r (not used but just there)
{
switch(mouse_cycle)
{
case 0:
mouse_byte[0]=inportb(0x60);
mouse_cycle++;
break;
case 1:
mouse_byte[1]=inportb(0x60);
mouse_cycle++;
break;
case 2:
mouse_byte[2]=inportb(0x60);
mouse_x=mouse_byte[1];
mouse_y=mouse_byte[2];
mouse_cycle=0;
break;
}
}
inline void mouse_wait(byte a_type) //unsigned char
{
dword _time_out=100000; //unsigned int
if(a_type==0)
{
while(_time_out--) //Data
{
if((inportb(0x64) & 1)==1)
{
return;
}
}
return;
}
else
{
while(_time_out--) //Signal
{
if((inportb(0x64) & 2)==0)
{
return;
}
}
return;
}
}
inline void mouse_write(byte a_write) //unsigned char
{
//Wait to be able to send a command
mouse_wait(1);
//Tell the mouse we are sending a command
outportb(0x64, 0xD4);
//Wait for the final part
mouse_wait(1);
//Finally write
outportb(0x60, a_write);
}
byte mouse_read()
{
//Get's response from mouse
mouse_wait(0);
return inportb(0x60);
}
void mouse_install()
{
byte _status; //unsigned char
//Enable the auxiliary mouse device
mouse_wait(1);
outportb(0x64, 0xA8);
//Enable the interrupts
mouse_wait(1);
outportb(0x64, 0x20);
mouse_wait(0);
_status=(inportb(0x60) | 2);
mouse_wait(1);
outportb(0x64, 0x60);
mouse_wait(1);
outportb(0x60, _status);
//Tell the mouse to use default settings
mouse_write(0xF6);
mouse_read(); //Acknowledge
//Enable the mouse
mouse_write(0xF4);
mouse_read(); //Acknowledge
//Setup the mouse handler
irq_install_handler(12, mouse_handler);
}
It's been tested in Boch's, VMWare, and on real hardware and it works on all 3 platforms.
Due to the lack of PS/2 mouse documention, I offer this code as documention itself meaning there are no royalties and crap like that.
Credits:
Warmaster199/Hopeless for having me write the driver in the first place =P
Froggey and Journey for testing the countless lines of code.
Just having everyone reach equillibrium...
------
*edit*
------
http://www.osdever.net/forums/viewtopic.php?t=1395
VESA pmode detection routine. Easy and nothing trivial there.