Who has made their own PS/2 mouse driver *AND* keybaord driver in protected mode?
I made a keyboard driver that worked just fine
by itself. I hooked IRQ 1 to INT 21h and had no problems. Then, I enabled the mouse interrupt (IRQ 12) and hooked it to INT 2Ch and that is when the problems started. When I move the mouse, INT 2C is trigged just ONCE and never again!! Not only that but my keyboard
ISR stops running as well, once I touch the mouse.
I'm doing this at the end of EVERY ISR:
mov al,20h
mov dx,20h
out dx,al
That is supposed to allow another interrupt, correct?
Does anyone have any idea what is going on? If it is not simple to explain, could you please provide me with a simple mouse driver sample and keyboard driver
sample?
Thanks!
Paul
IRQ 12 - HELP PLEASE!
Re:IRQ 12 - HELP PLEASE!
You need to send an EOI (End of Interrupt) to PIC1 and PIC2 for IRQ8-15.
mov al, 0x20 ; EOI Command
out 0x20, al ; Send it to Master!
out 0xa0, al ; Send it to Slave!
hope this helps.
mov al, 0x20 ; EOI Command
out 0x20, al ; Send it to Master!
out 0xa0, al ; Send it to Slave!
hope this helps.
Re:IRQ 12 - HELP PLEASE!
Would you be willing to share the code that sets up the PS/2 mouse?
I tried just unmasking the mouse IRQ and nothing happened at all, so I guess there is some initialization that must have to be done first.
thanks.
I tried just unmasking the mouse IRQ and nothing happened at all, so I guess there is some initialization that must have to be done first.
thanks.
Re:IRQ 12 - HELP PLEASE!
Friend:
THANKS SO MUCH! That was the problem! You need to send the command to 0xa0 as well as 0x20!
PlayOS:
Here is how I enabled the mouse....
You need to first enable it so port 0x60 get ps/2
data, and you also have to set a bit in a register
to enable IRQ 12 interrupts. Look below...
setmouse:
mov bl,0a8h ; enable mouse cmd
call keyboard_cmd
call keyboard_read ; read status return
mov bl,0d4h ; next command is for mouse
call keyboard_cmd
mov al,0f4h ; enable mouse device
call keyboard_write
call keyboard_read ; read status return
;The chunk of code below enables IRQ 12
mov bl,0x20
call keyboard_cmd
call keyboard_read
or al,2
mov [tmp],al
mov bl,0x60
call keyboard_cmd
mov al,[tmp]
call keyboard_write
ret
keyboard_read:
push ecx
push edx
mov ecx,0ffffh
key_read_loop:
in al,64h
mov [mouse],byte 0
test al,32
jz short not32
mov [mouse],byte 1
not32: test al,1
jnz key_read_ready
loop key_read_loop
mov ah,1
jmp key_read_exit
key_read_ready:
push ecx
mov ecx,32
key_read_delay:
loop key_read_delay
pop ecx
in al,60h
xor ah,ah
key_read_exit:
pop edx
pop ecx
ret
keyboard_write:
push ecx
push edx
mov dl,al
mov ecx,0ffffh
kbd_wrt_loop1:
in al,64h
test al,20h
jz kbd_wrt_ok1
loop kbd_wrt_loop1
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok1:
in al,60h
mov ecx,0ffffh
kbd_wrt_loop:
in al,64h
test al,2
jz kbd_wrt_ok
loop kbd_wrt_loop
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok:
mov al,dl
out 60h,al
mov ecx,0ffffh
kbd_wrt_loop3:
in al,64h
test al,2
jz kbd_wrt_ok3
loop kbd_wrt_loop3
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok3:
mov ah,8
kbd_wrt_loop4:
mov ecx,0ffffh
kbd_wrt_loop5:
in al,64h
test al,1
jnz kbd_wrt_ok4
loop kbd_wrt_loop5
dec ah
jnz kbd_wrt_loop4
kbd_wrt_ok4:
xor ah,ah
kbd_wrt_exit:
pop edx
pop ecx
ret
keyboard_cmd:
mov ecx,0ffffh
cmd_wait:
in al,64h
test al,2
jz cmd_send
loop cmd_wait
jmp cmd_error
cmd_send:
mov al,bl
out 64h,al
mov ecx,0ffffh
cmd_accept:
in al,64h
test al,2
jz cmd_ok
loop cmd_accept
cmd_error:
mov ah,1
jmp cmd_exit
cmd_ok:
xor ah,ah
cmd_exit:
ret
Regards,
Paul
THANKS SO MUCH! That was the problem! You need to send the command to 0xa0 as well as 0x20!
PlayOS:
Here is how I enabled the mouse....
You need to first enable it so port 0x60 get ps/2
data, and you also have to set a bit in a register
to enable IRQ 12 interrupts. Look below...
setmouse:
mov bl,0a8h ; enable mouse cmd
call keyboard_cmd
call keyboard_read ; read status return
mov bl,0d4h ; next command is for mouse
call keyboard_cmd
mov al,0f4h ; enable mouse device
call keyboard_write
call keyboard_read ; read status return
;The chunk of code below enables IRQ 12
mov bl,0x20
call keyboard_cmd
call keyboard_read
or al,2
mov [tmp],al
mov bl,0x60
call keyboard_cmd
mov al,[tmp]
call keyboard_write
ret
keyboard_read:
push ecx
push edx
mov ecx,0ffffh
key_read_loop:
in al,64h
mov [mouse],byte 0
test al,32
jz short not32
mov [mouse],byte 1
not32: test al,1
jnz key_read_ready
loop key_read_loop
mov ah,1
jmp key_read_exit
key_read_ready:
push ecx
mov ecx,32
key_read_delay:
loop key_read_delay
pop ecx
in al,60h
xor ah,ah
key_read_exit:
pop edx
pop ecx
ret
keyboard_write:
push ecx
push edx
mov dl,al
mov ecx,0ffffh
kbd_wrt_loop1:
in al,64h
test al,20h
jz kbd_wrt_ok1
loop kbd_wrt_loop1
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok1:
in al,60h
mov ecx,0ffffh
kbd_wrt_loop:
in al,64h
test al,2
jz kbd_wrt_ok
loop kbd_wrt_loop
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok:
mov al,dl
out 60h,al
mov ecx,0ffffh
kbd_wrt_loop3:
in al,64h
test al,2
jz kbd_wrt_ok3
loop kbd_wrt_loop3
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok3:
mov ah,8
kbd_wrt_loop4:
mov ecx,0ffffh
kbd_wrt_loop5:
in al,64h
test al,1
jnz kbd_wrt_ok4
loop kbd_wrt_loop5
dec ah
jnz kbd_wrt_loop4
kbd_wrt_ok4:
xor ah,ah
kbd_wrt_exit:
pop edx
pop ecx
ret
keyboard_cmd:
mov ecx,0ffffh
cmd_wait:
in al,64h
test al,2
jz cmd_send
loop cmd_wait
jmp cmd_error
cmd_send:
mov al,bl
out 64h,al
mov ecx,0ffffh
cmd_accept:
in al,64h
test al,2
jz cmd_ok
loop cmd_accept
cmd_error:
mov ah,1
jmp cmd_exit
cmd_ok:
xor ah,ah
cmd_exit:
ret
Regards,
Paul