diff --git a/lib/mouse.c b/lib/mouse.c new file mode 100644 index 0000000..2cc2332 --- /dev/null +++ b/lib/mouse.c @@ -0,0 +1,135 @@ +#include "types.h" +#include "asm.h" +#include "mouse.h" +#include "keyboard.h" +#include "vga.h" +#include "video.h" + +bool initmouse() +{ +u16 i=1024; + +outkbd(0x64,0xA8); /* autorisé Aux */ + +outmseack(0xf3); /*sample*/ +outmseack(100); /*sample donnée*/ + +outmseack(0xe8); /*resolution*/ +outmseack(3); /*resolution donnée*/ + +outmseack(0xe7); /* echelle 2:1*/ + +outmseack(0xf4); /* Autorise peripherique */ + +outmsecmd(0x47); /* Autorise interruption */ + +while(i-->0) if (inb(0x60)==250) return 1; +return 0; +} + +static u8 bytepos=0,mousereplies=0; +static u8 mpacket[3]; +static s32 mousex=40, mousey=12; +static u16 oldx=0, oldy=0; +static u8 oldchar=0x00,oldattr=0x07; +static bool mousebut1=0,mousebut2=0,mousebut3=0; +static u8 speed=6; + + +void outmseack(u8 value) +{ +outkbd(0x64,0xD4); /* ecriture vers souris */ +outb(0x60,value); +mousereplies++; +} + +void outmsecmd(u8 command) +{ +outkbd(0x64,0x60); /* ecriture vers mode */ +outb(0x60,command); +} + +void mouse() +{ +u8 mbyte=inb(0x60); +s8 changex,changey; +cli(); + + if (mousereplies > 0) + { + if (mbyte == 0xFA) + { + mousereplies--; + goto endofint; + } + mousereplies = 0; + } + + mpacket[bytepos]=mbyte; + bytepos++; + +if(bytepos==3) { +bytepos=0; +if ( mpacket[1] == 0) + { + changex = 0; + } + else + { + changex = (mpacket[0] & 0x10) ? + mpacket[1] - 256 : + mpacket[1]; + } + if (mpacket[2] == 0) + { + changey = 0; + } + else + { + changey = -((mpacket[0] & 0x20) ? + mpacket[2] - 256 : + mpacket[2]); + } + + mousex+= (changex<=65535) { mousex=65535; } + if(mousey<0) { mousey=0; } + if(mousey>=65535) { mousey=65535; } + + u16 newx=(u32)mousex*getxres()/65536; + u16 newy=(u32)mousey*getyres()/65536; + + // Retrieve mouse button status from packet + mousebut1=mpacket[0] & 1; + mousebut2=mpacket[0] & 2; + mousebut3=mpacket[0] & 4; + +// printf("RX:%d\tRY:%d\tX:%d\tY:%d\tB1:%d\tB2:%d\tB3:%d\t\r\n",changex,changey,mousex,mousey,mousebut1,mousebut2,mousebut3); + +if ((newx!=oldx)||(newy!=oldy)) +{ + showchar(oldx,oldy,oldchar,oldattr); + oldx=newx; + oldy=newy; + oldchar=getchar(oldx,oldy); + oldattr=getattrib(oldx,oldy); + showchar(newx,newy,0xDB,0x0F); +} +} +endofint: +irqendmaster(); +irqendslave(); +sti(); +//asm("movl 0x2C(%esp), %ebx;movl 0x30(%esp), %esi;movl 0x34(%esp), %edi;movl 0x38(%esp), %ebp;addl $0x3C, %esp;iret;"); +asm("addl $0x18, %esp;popl %ebx;iret;"); +} + + + + + + +