Mail Archives: djgpp/1997/01/18/02:47:00
In article <32E045B5 DOT 4680 AT mail DOT idt DOT net>, Joseph Turian <turian AT mail DOT idt DOT net> wrote:
>Is it possible to hook an interrupt while in protected mode? I wanted
>to write a keyboard handler, but I am new to djgpp and only know how
>it is done in 8086 assembly
#include <go32.h>
#include <dpmi.h>
_go32_dpmi_seginfo old_keyboard_isr;
_go32_dpmi_seginfo keyboard_interrupt_holder;
int raw_scan_code;
void init_keyboard(void) {
while(kbhit())
getch();
_go32_dpmi_lock_code(keyboard_irq, (ADDRESS)end_keyboard_irq - \
(ADDRESS)_keyboard_irq);
_go32_dpmi_lock_code(key_asm, 30);
_go32_dpmi_lock_data(&raw_scan_code,sizeof(raw_scan_code));
_go32_dpmi_lock_data (ALL OTHER KEYBOARD IRQ VARIABLES)
_go32_dpmi_get_protected_mode_interrupt_vector(KEYBOARD_INT, \
&old_keyboard_isr)
keyboard_interrupt_holder.pm_offset = (ADDRESS)keyboard_irq;
_go32_dpmi_allocate_iret_wrapper(&keyboard_interrupt_holder);
_go32_dpmi_set_protected_mode_interrupt_vector(KEYBOARD_INT, \
&keyboard_interrupt_holder);
}
void uninit_keyboard() {
_go32_dpmi_set_protected_mode_interrupt_vector(KEYBOARD_INT, \
&old_keyboard_isr);
_go32_dpmi_free_iret_wrapper(&keyboard_interrupt_holder);
}
void keyboard_irq(void) {
key_asm();
DO SOMETHING WITH raw_scan_code;
}
int end_keyboard_irq(void) { // do something unique to guarantee \
//optimization doesn't overrride
return(4);
}
assembly part (I use nasm, your code may vary)
[BITS 32]
[GLOBAL _key_asm]
[EXTERN _raw_scan_code]
[SECTION .text]
_key_asm:
sti
xor eax,eax
in al,60h
mov dword [_raw_scan_code],eax
in al,61h
or al,82h
out 61h,al
and al,7fh
out 61h,al
mov al,20h
out 20h,al
ret
- Raw text -