www.delorie.com/archives/browse.cgi   search  
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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019