*/
If you have a PH account, you can customize your PH profile.
*/

View SRC\MKEY.C

BOBOLI THE MIGHTY KNIGHT Networked Medieval Conflict

Submitted By: Unknown
Rating: starstarstar (Rate It)


/* MKEY
   keyboard interface unit
*/


#include <dpmi.h>
#include "mkey.h"

#define _KB_intr 9

keyarray oldkeyb,keyb;
static _go32_dpmi_seginfo old_rm_kb_vector,
                          new_rm_kb_vector,
                          old_pm_kb_vector,
                          new_pm_kb_vector;

unsigned char keyspressed[20];
unsigned char numkeyspressed;
unsigned char keyevent;

static _go32_dpmi_registers _kb_r;

void pm_kb_handler(void);
void rm_kb_handler(void);

void kb_clearbuf()
{
  numkeyspressed=0;
}

void kb_init()
{
  new_pm_kb_vector.pm_selector=_go32_my_cs();
  new_pm_kb_vector.pm_offset=(int) pm_kb_handler;
  new_rm_kb_vector.pm_selector=_go32_my_cs();
  new_rm_kb_vector.pm_offset=(int) rm_kb_handler;
  keyevent=0;
  memset(keyb,0,128);
  memset(oldkeyb,0,128);
  disable();
  _go32_dpmi_get_protected_mode_interrupt_vector(_KB_intr,
    &old_pm_kb_vector);
  _go32_dpmi_chain_protected_mode_interrupt_vector(_KB_intr,
    &new_pm_kb_vector);
  _go32_dpmi_allocate_real_mode_callback_iret(&new_rm_kb_vector, &_kb_r);
  _go32_dpmi_get_real_mode_interrupt_vector(_KB_intr,
    &old_rm_kb_vector);
  enable();
}

void kb_exit(void)
{
  disable();
  _go32_dpmi_set_real_mode_interrupt_vector(_KB_intr,
    &old_rm_kb_vector);
  _go32_dpmi_set_protected_mode_interrupt_vector(_KB_intr,
    &old_pm_kb_vector);
  _go32_dpmi_free_real_mode_callback(&new_rm_kb_vector);
  enable();
}

unsigned char keypress()
{
  unsigned char k;
  k=keyevent;
  keyevent=0;
  return k;
}

unsigned char keystate(unsigned char k)
{
  unsigned char ok;
  ok=oldkeyb[k];
  oldkeyb[k]=keyb[k];
  if(ok==0) {
    if(keyb[k]==0) return open;
    return pressed;
  }
  if(keyb[k]==1) return held;
  return released;
}

void pm_kb_handler(void)
{
  unsigned char b;
  disable();
  b=inportb(0x60);
  while(kbhit()) getch();
  if((b<128)&&(numkeyspressed<20)&&(oldkeyb[b]==0))
    keyspressed[numkeyspressed++]=b;
  memcpy(oldkeyb,keyb,128);
  if(b>127) keyb[b-128]=0;
  else keyb[b]=1;
  if(b<128) keyevent=1;
  memset(&_kb_r, 0, sizeof(_kb_r));
  _kb_r.x.cs = old_rm_kb_vector.rm_segment;
  _kb_r.x.ip = old_rm_kb_vector.rm_offset;
  _kb_r.x.ss = _kb_r.x.sp = 0;
  enable();
  _go32_dpmi_simulate_fcall_iret(&_kb_r);
}

void rm_kb_handler(void)
{
  unsigned char b;
  disable();
  b=inportb(0x60);
  while(kbhit()) getch();
  if((b<128)&&(numkeyspressed<20)&&(oldkeyb[b]==0))
    keyspressed[numkeyspressed++]=b;
  memcpy(oldkeyb,keyb,128);
  if(b>127) keyb[b-128]=0;
  else keyb[b]=1;
  if(b<128) keyevent=1;
  memset(&_kb_r, 0, sizeof(_kb_r));
  _kb_r.x.cs = old_rm_kb_vector.rm_segment;
  _kb_r.x.ip = old_rm_kb_vector.rm_offset;
  _kb_r.x.ss = _kb_r.x.sp = 0;
  enable();
  _go32_dpmi_simulate_fcall_iret(&_kb_r);
}

corner
© 1996-2008 CommunityHeaven LLC. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
North American business development: Nicolai Wadstrom. Publisher: Lars Hagelin.