Skip to content

Instantly share code, notes, and snippets.

@LucGoncalez
Last active January 2, 2018 12:24
Show Gist options
  • Save LucGoncalez/d2b7751a575fe7d6d533a47cac347afb to your computer and use it in GitHub Desktop.
Save LucGoncalez/d2b7751a575fe7d6d533a47cac347afb to your computer and use it in GitHub Desktop.
Mouse Stuff
/*
* **************************************************
* mouseHandler:
* Handler de mouse.
*
* *Importante:
* Se estamos aqui é porque os dados disponíveis no controlador 8042
* pertencem ao mouse.
* @todo: Essa rotina não pertence ao line discipline.
*
*/
#define MOUSE_X_SIGN 0x10
#define MOUSE_Y_SIGN 0x20
void mouseHandler()
{
//buffer
static int count_mouse=0;
static char buffer_mouse[3];
//coordenadas..
//isso pode ser global.
int posX = 0;
int posY = 0;
//local.
static int data = 0;
static int x = 0;
static int y = 0;
static int scroll = 0;
static int first_time=1; // Usado para ignorar a primeira IRQ12.
//cursor provisório.
static char mouse_char[] = "T";
// Se o mouse for muito sensível use uma variável de escala
static int scale = 4;
// FIX: Por algum motivo nós "perdemos" os dois primeiros valores...
// descarto o terceiro aqui para que obtenhamos os 3 "na ordem"...
if (first_time)
{
first_time = 0;
mouse_read(); //inportb(0x60);
goto exit_isr;
}
//buffer: definido como char.
buffer_mouse[count_mouse++] = mouse_read();
// Contagem de interruções.
if(count_mouse >= 3)
{
//
//@todo: Tentando encontrar os valores corretos das coordenadas.
//
//bytes: definidos como 'char'
data = buffer_mouse[0];
x = buffer_mouse[1];
y = buffer_mouse[2];
//scroll = buffer_mouse[3];
//++=======
if(data & 0x10)
{
//.x_neg:
//not al
//inc al
//sub [mouse_x], eax
posX = (int) posX - (256 - x) ;
}else{
//.x_pos:
//add [mouse_x], eax
posX = (int) posX + x;
};
//--=======
//++=======
if(data & 0x20)
{
//.y_neg:
//not al
//inc al
//add [mouse_y], eax
posY = (int) posY + (256 - y) ;
}else{
//.y_pos:
//sub [mouse_y], eax
posY = (int) posY - y;
};
//--=======
//update_mouse:
//.do_x:
//if( data & MOUSE_X_SIGN )
//{
// x = !x;
// x++;
// posX -= x;
//}else{
// posX += x;
//}
//.do_y:
//if( data & MOUSE_Y_SIGN )
//{
// posY -= y;
//}else{
// y = !y;
// y++;
// posY -= y;
//}
//#debug
//mostrando os resultados obtidos.
//printf("X={%d} Y={%d} \n",posX,posY);
//refresh_screen();
if( posX < 0 ){ posX = 0; }
if( posY < 0 ){ posY = 0; }
if( posX > (800 - 8) * scale){ posX = (800 - 8) * scale; }
if( posY > (600 - 8) * scale){ posY = (600 - 8) * scale; }
g_cursor_x = (unsigned long) (posX / scale);
g_cursor_y = (unsigned long) (posY / scale);
printf("%c", (char) 'T');
refresh_rectangle( g_cursor_x*8, g_cursor_y*8, 8, 8 );
//Zerando a contagem de interrupções de mouse.
count_mouse=0;
};
//
// *importante:
// Passamos a mensagem de mouse para o procedimento de janela do sistema.
// que deverá passar chamar o procedimento de janela da janela com o focod eentrada.
//
//Pegaremos aqui a janela com o foco de entrada e passaremos
//para o procedimento, que não deve pegar novamente.
struct window_d *w;
w = (void *) windowList[window_with_focus];
if( (void*) w != NULL )
{
// Envia as mensagens para os aplicativos intercepta-las
//so mandamos mensagem para um aplicativo no estavo válido.
if( w->used == 1 && w->magic == 1234 ){
//windowSendMessage( 0, 0, 0, 0);
};
//Chama o procedimento de janelas do sistema.
//O procedimento de janela do terminal está em cascata.
//system_procedure( w, (int) 0, (unsigned long) 0, (unsigned long) 0 );
};
exit_isr:
// EOI.
outportb(0xa0, 0x20);
outportb(0x20, 0x20);
//return;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment