//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); }