summaryrefslogtreecommitdiff
path: root/kernel/mouse.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-09-09 11:46:49 +0200
committerMichal Idziorek <m.i@gmx.at>2014-09-09 11:46:49 +0200
commitc3b38e3665207d029f617fc67bc9d19142ce5cd7 (patch)
treea1d62efc9536f75cff078f9149f7a4fce32cab1d /kernel/mouse.c
parent3833f53a60748c63153139511fd75be74fd1d9c0 (diff)
mouse support
Diffstat (limited to 'kernel/mouse.c')
-rw-r--r--kernel/mouse.c48
1 files changed, 40 insertions, 8 deletions
diff --git a/kernel/mouse.c b/kernel/mouse.c
index bee595c..d000b30 100644
--- a/kernel/mouse.c
+++ b/kernel/mouse.c
@@ -11,9 +11,9 @@
static volatile uint8_t mouse_cycle;
-static volatile int8_t mouse_byte[3];
-static volatile uint8_t mouse_x;
-static volatile uint8_t mouse_y;
+static volatile uint8_t mouse_byte[3];
+volatile int16_t mouse_x;
+volatile int16_t mouse_y;
static volatile uint8_t mouse_a;
@@ -30,7 +30,8 @@ int8_t mouse_get_y()
void mouse_init()
{
- mouse_cycle=mouse_x=mouse_y=0;
+ mouse_x=mouse_y=0;
+ mouse_cycle=1;
uint8_t _status; //unsigned char
@@ -62,7 +63,41 @@ void mouse_init()
void mouse_log()
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d delta x: %d delta y: %d ",mouse_a, mouse_x,mouse_y);
+ //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%02x / %02x / %02x ",mouse_byte[0], mouse_byte[1],mouse_byte[2]);
+
+ if(mouse_byte[0]&0x80||mouse_byte[0]&0x40)return; //skip packet on overflow
+ if(!(mouse_byte[0]&0x8))panic(FOOLOS_MODULE_NAME,"mouse packets out of sync!?"); // this bit is always 1, otherwise panic!
+
+ //
+ if(mouse_byte[1]>127){
+ mouse_x-=256;
+ mouse_x+=mouse_byte[1];
+ }
+ else
+ {
+ mouse_x+=mouse_byte[1];
+ }
+ if(mouse_byte[2]>127){
+ mouse_y-=256;
+ mouse_y+=mouse_byte[2];
+ }
+ else
+ {
+ mouse_y+=mouse_byte[2];
+ }
+
+
+
+
+ if(mouse_x<0)mouse_x=0;
+ if(mouse_y<0)mouse_y=0;
+ if(mouse_x>800)mouse_x=800;
+ if(mouse_y>600)mouse_y=600;
+
+
+ //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d / %d / %02x ",mouse_x, mouse_y,mouse_byte[2]);
+ PutFont('X', mouse_x,600-mouse_y, 0xffffff);
+
}
//Mouse functions
void mouse_handler()//struct regs *a_r) //struct regs *a_r (not used but just there)
@@ -81,9 +116,6 @@ void mouse_handler()//struct regs *a_r) //struct regs *a_r (not used but just th
break;
case 2:
mouse_byte[2]=x86_inb(0x60);
- mouse_a=mouse_byte[0];
- mouse_x=mouse_byte[1];
- mouse_y=mouse_byte[2];
mouse_cycle=0;
mouse_log();
break;