static void ps2ms_int_handler( void *arg ) { (void) arg; static int inbytepos = 0; signed char mousedata = inb( PS2_DATA_ADDR ); SHOW_FLOW( 10 ,"%2X ", mousedata & 0xFFu ); switch(inbytepos) { case 0: // first byte has one in this pos if(1 && ! (0x8 & mousedata) ) { //inbytepos = -1; break; inbytepos = 0; return; } ps2ms_state_buttons = 0x7 & mousedata; xsign = 0x10 & mousedata; ysign = 0x20 & mousedata; break; case 1: xval = mousedata; break; case 2: yval = mousedata; break; case 3: break; case 4: break; } inbytepos++; inbytepos %= 3; //inbytepos %= 4; if(inbytepos != 0) return; xval = insert_bit9( xval, xsign ); yval = insert_bit9( yval, ysign ); ps2ms_state_xpos += xval; ps2ms_state_ypos += yval; if( ps2ms_state_xpos < 0 ) ps2ms_state_xpos = 0; if( ps2ms_state_ypos < 0 ) ps2ms_state_ypos = 0; if( ps2ms_state_xpos > video_drv->xsize ) ps2ms_state_xpos = video_drv->xsize; if( ps2ms_state_ypos > video_drv->ysize ) ps2ms_state_ypos = video_drv->ysize; //printf("ms %d %d %x\n", ps2ms_state_xpos, ps2ms_state_ypos, ps2ms_state_buttons ); ps2_insert_mouse_event( ps2ms_state_xpos, ps2ms_state_ypos, ps2ms_state_buttons ); }
static void ps2ms_int_handler( void *arg ) { (void) arg; static int inbytepos = 0; signed char mousedata = inb( PS2_DATA_ADDR ); SHOW_FLOW( 10 ,"%2X ", mousedata & 0xFFu ); switch(inbytepos) { case 0: // first byte has one in this pos if(1 && ! (0x8 & mousedata) ) { //inbytepos = -1; break; inbytepos = 0; return; } ps2ms_state_buttons = 0x7 & mousedata; xsign = 0x10 & mousedata; ysign = 0x20 & mousedata; break; case 1: xval = mousedata; break; case 2: yval = mousedata; break; case 3: break; case 4: break; } inbytepos++; inbytepos %= 3; //inbytepos %= 4; if(inbytepos != 0) return; xval = insert_bit9( xval, xsign ); yval = insert_bit9( yval, ysign ); ps2ms_state_xpos += xval; ps2ms_state_ypos += yval; if( ps2ms_state_xpos < 0 ) ps2ms_state_xpos = 0; if( ps2ms_state_ypos < 0 ) ps2ms_state_ypos = 0; if( ps2ms_state_xpos > video_drv->xsize ) ps2ms_state_xpos = video_drv->xsize; if( ps2ms_state_ypos > video_drv->ysize ) ps2ms_state_ypos = video_drv->ysize; //printf("ms %d %d %x\n", ps2ms_state_xpos, ps2ms_state_ypos, ps2ms_state_buttons ); if(NULL != video_drv) { video_drv->mouse_x = ps2ms_state_xpos; video_drv->mouse_y = ps2ms_state_ypos; struct ui_event e; e.type = UI_EVENT_TYPE_MOUSE; e.time = fast_time(); e.focus= 0; e.m.buttons = ps2ms_state_buttons; e.abs_x = ps2ms_state_xpos; e.abs_y = ps2ms_state_ypos; put_buf(&e); hal_sem_release( &mouse_sem ); } }