enable mouse interrupt

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
hmachine
Posts: 9
Joined: Sat Mar 08, 2008 11:47 am

enable mouse interrupt

Post by hmachine »

My english is bad so ...

I'm enable this stuff :
1:mouse interrapt writing to status register at 0x64
2:mouse interface -||-
3:mouse reporting
Problem is: My handler is never called!
Maybe must enable irq 2, if so how i to do that?
I have keyboard handler, and that works fine.
I'm programming os in real mode.
Thanx :idea:
Last edited by hmachine on Sat Mar 08, 2008 3:33 pm, edited 1 time in total.
User avatar
lukem95
Member
Member
Posts: 536
Joined: Fri Aug 03, 2007 6:03 am
Location: Cambridge, UK

Post by lukem95 »

Code: Select all

/* CakeOS */
#include <system.h>

//Mouse Driver
//Some code based on code by SANiK
volatile unsigned char mouse_cycle=0;
volatile char mouse_byte[3];
volatile int mouse_x=0;
volatile unsigned char mouse_y=0;
static int dx, dy;
static char cursor[8] = {0xf0, 0xe0, 0xe0, 0x90, 0x8, 0x0, 0x0, 0x0};

//Static functions prototypes
static void mouse_wait(unsigned char a_type);
static unsigned char mouse_read();
static void mouse_write(unsigned char a_write);

extern int graphical_mode;
extern int g_wd, g_ht;


//Mouse functions
static void mouse_handler(registers_t regs)
{
  if(!graphical_mode)
       return;
  switch(mouse_cycle)
  {
    case 0:
      mouse_byte[0]=inb(0x60);
      mouse_cycle++;
      break;
    case 1:
      mouse_byte[1]=inb(0x60);
      mouse_cycle++;
      break;
    case 2:
      mouse_byte[2]=inb(0x60);
      //mouse_x=mouse_byte[1];
      //mouse_y=mouse_byte[2];
      mouse_cycle=0;
      
      dx = (mouse_byte[0] & 0x10) ? mouse_byte[1] - 256 : mouse_byte[1];
      dy = (mouse_byte[0] & 0x20) ? -(mouse_byte[2] - 256) : -mouse_byte[2];

      if (dx > 5 || dx < -5)
	     dx *= 4;
      if (dy > 5 || dy < -5)
	     dy *= 4;

       mouse_x += dx;
       mouse_y += dy;

       if (mouse_x > g_wd) mouse_x = g_wd;
       if (mouse_x < 1) mouse_x = 1;
       if (mouse_y > g_ht) mouse_y = g_ht;
       if (mouse_y < 1) mouse_y = 1;
      
      break;
  }
  
  int i, l;
  int j = mouse_x;
  int h = mouse_y;
  int c;
  
  //Print mouse - TODO: mouse
  refresh_screen();
  	for (l = 0; l < 8; l++)
	{
		for (i = 8; i > 0; i--)
		{
			if ((cursor[l] & (1<<i)))
				c = 9;
			else
				c = g_read_pixel(j, h);		// Don't overwrite background
			g_put_pixel(j++, h, c);
		}
		h++;
		j = mouse_x;
	}
}

static void mouse_wait(unsigned char a_type)
{
  unsigned int _time_out=100000;
  if(a_type==0)
  {
    while(_time_out--) //Data
    {
      if((inb(0x64) & 1)==1)
      {
        return;
      }
    }
    return;
  }
  else
  {
    while(_time_out--) //Signal
    {
      if((inb(0x64) & 2)==0)
      {
        return;
      }
    }
    return;
  }
}

static void mouse_write(unsigned char a_write)
{
  //Wait to be able to send a command
  mouse_wait(1);
  //Tell the mouse we are sending a command
  outb(0x64, 0xD4);
  //Wait for the final part
  mouse_wait(1);
  //Finally write
  outb(0x60, a_write);
}

static unsigned char mouse_read()
{
  //Get's response from mouse
  mouse_wait(0);
  return inb(0x60);
}

void init_ps2_mouse()
{
  unsigned char _status;
 
  //Enable the auxiliary mouse device
  mouse_wait(1);
  outb(0x64, 0xA8);
 
  //Enable the interrupts
  mouse_wait(1);
  outb(0x64, 0x20);
  mouse_wait(0);
  _status=(inb(0x60) | 2);
  mouse_wait(1);
  outb(0x64, 0x60);
  mouse_wait(1);
  outb(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
  register_interrupt_handler(IRQ12, &mouse_handler);
} 

int detect_ps2_mouse()
{
    unsigned char tmp = mouse_read();
    if(tmp != 0xFA)
         return 0; //No mouse
    else
         return 1; //Mouse there
}
This is my ps/2 mouse code. It works fine for me, hope it helps you
~ Lukem95 [ Cake ]
Release: 0.08b
Image
hmachine
Posts: 9
Joined: Sat Mar 08, 2008 11:47 am

Enable mouse

Post by hmachine »

Thanx.I wrote some code in asm for my mouse handler:

install_int0x12:
cli
push es
xor ax,ax
mov es,ax
mov [es:0x12*4],m_hn
mov [es:0x12*4+2],cs
pop es
sti
;m_hn is address of handler label

Is this code ok?
User avatar
Dex
Member
Member
Posts: 1444
Joined: Fri Jan 27, 2006 12:00 am
Contact:

Re: Enable mouse

Post by Dex »

Yes and no try this address:

Code: Select all

 
install_int0x12:
cli
push ds
xor ax,ax
mov ds,ax
mov  WORD[ds:74h*4+0],m_hn
mov WORD[ds:74h*4+2],cs
pop ds
sti
;some more code here
;m_hn is address of handler label
Here is a realmode basic mouse driver, i code for MiniDOS, written in fasm, it may help ?.
It user's direct hardware, no int 33h.
Attachments
Mouse Code.zip
Realmode mouse code
(38.32 KiB) Downloaded 138 times
hmachine
Posts: 9
Joined: Sat Mar 08, 2008 11:47 am

Re: Enable mouse

Post by hmachine »

Dex wrote:
Here is a realmode basic mouse driver, i code for MiniDOS, written in fasm, it may help ?.
It user's direct hardware, no int 33h.
thanx. I'll try that.
My pc is gone to heaven(power supply stop working...),so when I fix that, vmware will be in full speed (my fency toshiba is without fdd).
Sorry 4 bad english...
hmachine
Posts: 9
Joined: Sat Mar 08, 2008 11:47 am

enable mouse

Post by hmachine »

Here is some resources that i use to learn about programming keyboard and mouse:
http://www.computer-engineering.org/ps2keyboard/
On this page you can find scan code sets(1,2,3).
http://www.computer-engineering.org/ps2mouse/
This page contain informations about ps/2 mouse and extended mouse(mouse with 5 buttons).

Hope this will help someone.[/url]
Post Reply