Mail Archives: djgpp/1999/01/22/19:21:56
From: | "Matthew Conte" <spam AT someone DOT else>
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Problems with keyboard ISR?
|
Lines: | 107
|
X-Newsreader: | Microsoft Outlook Express 4.72.3155.0
|
X-MimeOLE: | Produced By Microsoft MimeOLE V4.72.3155.0
|
Message-ID: | <sr8q2.622$Y_1.7007@typhoon.nycap.rr.com>
|
Date: | Sat, 23 Jan 1999 00:10:00 GMT
|
NNTP-Posting-Host: | 24.92.58.97
|
X-Complaints-To: | abuse AT nycap DOT rr DOT com
|
X-Trace: | typhoon.nycap.rr.com 917050200 24.92.58.97 (Fri, 22 Jan 1999 19:10:00 EDT)
|
NNTP-Posting-Date: | Fri, 22 Jan 1999 19:10:00 EDT
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
Reply-To: | djgpp AT delorie DOT com
|
[email address is munged to thwart spam bots - please reply to group]
Hello, I have a number of ISRs running in my application - sound, mouse,
keyboard and timer. I am having a terrible problem upon exit of my
application, unfortunately- I will either get a crash traceback, (under
Windows98) a little "Application has executed an illegal instruction" pop-up
dialog box, or my computer will spontaneously reboot.
Now, I don't know if the problem lies in the keyboard ISR - from all
perspectives my code looks fine, but when I symify the traceback it tells me
that the crash was generated by the call to _go32_dpmi_free_iret_wrapper.
Sorry I can't post the exact crash frame, my computer usually ends up
rebooting.
Anyway, here's the keyboard ISR code that I'm using - I'd appreciate it if
someone could tell me if they spot anything wrong with it.
Thanks,
Matt.
// Thanks, Allegro!
#define END_OF_FUNCTION(x) static void x##_end(void) {}
#define LOCK_VARIABLE(x) _go32_dpmi_lock_data((void*)&x,sizeof(x))
#define LOCK_FUNCTION(x) _go32_dpmi_lock_code(x,(long)x##_end-(long)x)
#define KEYBOARD_INT 9
#include <go32.h>
#include <dpmi.h>
#include <dos.h>
#include "types.h"
#include "osdep/msdos/keyboard.h"
static _go32_dpmi_seginfo old_key_handler;
static _go32_dpmi_seginfo new_key_handler;
static uint32 keys_updated;
static uint8 key_table[128];
// Return a pointer to the keyboard array
uint8 *KeyboardState(void)
{
return key_table;
}
// TRUE if keyboard has been updated
uint32 KeyboardUpdated(void)
{
if (FALSE == keys_updated)
return 0;
keys_updated = FALSE;
return 1;
}
// ISR for keyboard
static void key_handler(void)
{
uint8 raw_key;
raw_key = inportb(0x60);
// Key has been released
if (raw_key & 0x80)
key_table[raw_key & 0x7F] = 0;
// Key has been pressed
else
key_table[raw_key & 0x7F] = 1;
// Indicate generic end of interrupt
outportb(0x20, 0x20);
keys_updated = TRUE;
}
END_OF_FUNCTION(key_handler);
// Set up variables, lock code/data, set the new handler and save old one
void InitKeyboard(void)
{
uint32 key;
for (key = 0; key < 128; key++)
key_table[key] = 0;
keys_updated = 0;
LOCK_VARIABLE(key_table);
LOCK_VARIABLE(keys_updated);
LOCK_FUNCTION(key_handler);
_go32_dpmi_get_protected_mode_interrupt_vector(KEYBOARD_INT,
&old_key_handler);
new_key_handler.pm_offset = (int)key_handler;
new_key_handler.pm_selector = _go32_my_cs();
_go32_dpmi_allocate_iret_wrapper(&new_key_handler);
_go32_dpmi_set_protected_mode_interrupt_vector(KEYBOARD_INT,
&new_key_handler);
}
// Restore old keyboard handler
void TrashKeyboard(void)
{
_go32_dpmi_set_protected_mode_interrupt_vector(KEYBOARD_INT,
&old_key_handler);
_go32_dpmi_free_iret_wrapper(&new_key_handler);
}
// EOF
- Raw text -