⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lkey.cpp

📁 ldraw_DOS游戏开发包
💻 CPP
字号:
#include <lkey.h>
#include <dos.h>
#include <i86.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
////////////////////////////////////////////////////////////////////////////
static void __interrupt __far NewInt9();
static void __interrupt __far (*OldInt9)();
static char  install=0, lklist[128];
short lk_sb_port=0x220, lk_fm_port=-1, lk_fm_delay1=6, lk_fm_delay2=35;
short lk_dsp_ver=-1, lk_sb_irq=-1,  lk_sb_dma=-1;
short lk_sb_stereo=0,   lk_sb_16bit=0;
void lkInitKey();
void lkRestKey();
char lKeyOn(char key);
////////////////////////////////////////////////////////////////////////////
/////////////////////////////////
#define KEYBUF_LEN 10
extern "C" void cdecl LFGetSum(short *result,char *res,short len);
static uchar key_buf[KEYBUF_LEN][2],kpp=0,kpr=0,kpd,kpc,emu_int9=0;
static unsigned char key_map[128]={
0,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,
105,111,112,91,93,10,0,97,115,100,102,103,104,106,107,108,59,39,96,0,92,
122,120,99,118,98,110,109,44,46,47,0,42,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,45,0,0,0,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static unsigned char key_map_shift[128]={
0,27,33,64,35,36,37,94,38,42,40,41,95,43,8,0,81,87,69,82,84,89,85,73,79,80,123,
125,10,0,65,83,68,70,71,72,74,75,76,58,34,126,0,124,90,88,67,86,66,78,77,60,62,
63,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/////////////////////////////////
void lkInitKey()
{ short i;
  if (install==1) return;
  for (i=0;i<128;i++) lklist[i]=0;
  OldInt9=_dos_getvect(0x09);
  _disable();
  _dos_setvect(0x09,NewInt9);
  _enable();
  install=1;
}
void lkRestKey()
{ if (install==0) return;
  _disable();
  _dos_setvect(0x09,OldInt9);
  _enable();
  install=0; 
}
char lKeyOn(char key)
{ return lklist[key];
}
char lkbhit()
{ static short add=0;
  LFGetSum(&add,lklist,128);
  return add;
}
/////////////////////////////////
static void __interrupt __far NewInt9()
{ register unsigned char key=inp(0x60);
  if (key<0x80) lklist[key]=1;
    else lklist[key-0x80]=0;
  if (emu_int9) if (key<0x80&&key!=KEY_LSHIFT&&key!=KEY_RSHIFT) {
     kpd=kpp; if (++kpd>=KEYBUF_LEN) kpd=0;
     if (kpd!=kpr) {
        key_buf[kpp][0]=key; 
        kpc=key_map[key];
        if (lklist[KEY_RSHIFT]||lklist[KEY_LSHIFT]) 
           kpc=key_map_shift[key];
        if (emu_int9==2&&kpc>='a'&&kpc<='z') kpc=kpc-'a'+'A';
        key_buf[kpp][1]=kpc;
        kpp=kpd;
     }
  }
  key=inp(0x61); key|=0x80; 
  outp(0x61,key); outp(0x61,key&0x7f); 
  outp(0x20,0x20);
}
/////////////////////////////////
void  lk_emu_old9(char mode)
{ emu_int9=mode;
}
char lkpressed()
{ if (!install) return kbhit();
  if (kpp!=kpr) return 1;
  else return 0;
}
short lkgetch(short *code)
{ union REGS regs;
  uchar key=0;
  regs.w.ax=0;
  if (!install) {
   int386(0x16,&regs,&regs);
   if (code) *code=regs.h.ah;
   return regs.h.al;
  }
  while (!lkpressed());
  key=key_buf[kpr][0]; kpc=key_buf[kpr][1];
  kpd=kpr; if (++kpd>=KEYBUF_LEN) kpd=0;
  kpr=kpd; if (code) *code=key;
  return kpc;
}
void lkungetch(char i)
{
}
/**************************************************************************/
/*                          Sound    Blaster                              */
/**************************************************************************/
/********* Sound Blaster **********/
char  lsWritePortC(uchar value)
{ int i;
  for (i=0;i<0xffff ;i++ )
  { if (!(inp(0x0C+lk_sb_port) & 0x80)) {
       outp(lk_sb_port+0x0c,value);
	   return 0;
    }
  } return -1;
}
uchar lsReadPortC()
{ short b;
  for (b=50;b>0&&inp(lk_sb_port+0x0e)<128;b--);
  return inp(lk_sb_port+0x0a);
}
short lsResetDsp(short data)
{  int x;
   outp(0x06+lk_sb_port, data);
   for (x=0; x<8; x++) inp(0x06+lk_sb_port);
   outp(0x06+lk_sb_port, 0);
   if (lsReadPortC() != 0xAA) return -1;
   return 0;
}
short lsGetDspVersion()
{ short c;
  if (lk_dsp_ver>0) return lk_dsp_ver;
  lsWritePortC(0xe1); c=lsReadPortC();
  lk_dsp_ver=((unsigned)c<<8) + lsReadPortC();
  return lk_dsp_ver;
}
short lsAutoDetect()
{ short found=0, i=10, b;
  static detect=0;
  if (detect) return lk_sb_port;

  for (lk_sb_port=0x210;lk_sb_port<=0x260&&!found;)
   { outp(lk_sb_port+0x6,1);
     delay(3); for (b=3;b>=0;b--);
     outp(lk_sb_port+0x06,0);
     for (b=50;b>0&&inp(lk_sb_port+0x0e)<128;b--);
     if ((b==0)||inp(lk_sb_port+0x0a)!=0xaa)
      { i--;
	if (!i); {i=10; lk_sb_port+=0x10; }
      }
     else { found=1; detect=1; }
   }
  return ((found==1)?lk_sb_port:0);
}
void  lsMixerWrite(short reg,short data)
{ outp(lk_sb_port+4, reg);
  outp(lk_sb_port+5, data);
}
short lsMixerRead(short reg)
{ outp(lk_sb_port+4, reg);
  return inp(lk_sb_port+5);
}
short lsSetMixer(int digi_volume, int midi_volume)
{  short _sb_port=lk_sb_port;
   if (lsGetDspVersion() < 0x300)  return -1;

   if (digi_volume >= 0) {                   /* set DAC level */
      outp(_sb_port+4, 4);
      outp(_sb_port+5, (digi_volume & 0xF0) | (digi_volume >> 4));
   }

   if (midi_volume >= 0) {                   /* set FM level */
      outp(_sb_port+4, 0x26);
      outp(_sb_port+5, (midi_volume & 0xF0) | (midi_volume >> 4));
   }

   return 0;
}
short lsGetBlasterEnv(short *_sb_port,short *_sb_dma8,short *_sb_dma16,short *_sb_irq)
{  char *blaster=getenv("BLASTER");
   *_sb_port=*_sb_dma8=*_sb_dma16=*_sb_irq=-1;
   if (blaster) { 
      while (*blaster) {
	 while ((*blaster == ' ') || (*blaster == '\t'))
	    blaster++;

	 if (*blaster) {
	    switch (*blaster) {

	       case 'a': case 'A':
		     *_sb_port = strtol(blaster+1, NULL, 16);
		  break;

	       case 'i': case 'I':
		     *_sb_irq = strtol(blaster+1, NULL, 10);
		  break;

	       case 'd': case 'D':
		  *_sb_dma8 = strtol(blaster+1, NULL, 10);
		  break;

	       case 'h': case 'H':
		  *_sb_dma16 = strtol(blaster+1, NULL, 10);
		  break;
	    }

	    while ((*blaster) && (*blaster != ' ') && (*blaster != '\t'))
	       blaster++;
	 }
      }
      return 1;
   }
  return 0;
}

///////////////////////////////////////////////
void lsFMWrite(unsigned short reg, uchar data)
{ 
   short i;
   short port = (reg & 0x100) ? lk_fm_port+2 : lk_fm_port;

   outp(port, reg & 0xFF);      
   for (i=0; i<lk_fm_delay1; i++) inp(port);
   outp(port+1, data);         
   for (i=0; i<lk_fm_delay2; i++) inp(port);
}
uchar lsFMRead()
{ return (inp(lk_fm_port)); }
void lsFMInit()
{ lsFMWrite(1,0);
  lsFMWrite(8,0);
  lsFMWrite(0xbd,0x00);
  lsFMWrite(0x20+0,0x21);
  lsFMWrite(0x20+3,0x11);
  lsFMWrite(0x40+0,0x4c);
  lsFMWrite(0x40+3,0x00);
  lsFMWrite(0x60+0,0xd2);
  lsFMWrite(0x60+3,0xd2);
  lsFMWrite(0x80+0,0x32);
  lsFMWrite(0x80+3,0x11);
  lsFMWrite(0xe0+0,0x00);
  lsFMWrite(0xe0+3,0x00);
  lsFMWrite(0xc0+0,0x04);
  lsFMWrite(0x01,0x20);           /* turn on wave form control */
  lsFMWrite(0xBD, 0x0c);          /* set AM and vibrato to high */
}
/////////////////////////////////////
void lsFMSound(short frequency,short block)
{ short fnh, fnl, blfnh, kblfnh;
  fnl = frequency&0x00ff;
  fnh = frequency>>8;
  blfnh = fnh|(block<<2);
  kblfnh = blfnh|0x20;
  lsFMWrite(0xa0,fnl);
  lsFMWrite(0xb0,kblfnh);
}
void lsFMSoundOff(short frequency,short block)
{ short fnh, blfnh, kblfnh;
  fnh = frequency>>8;
  blfnh = fnh|(block<<2);
  kblfnh = blfnh|0x00;
  lsFMWrite(0xb0,kblfnh);
}
void lsFM(short frequency,short block)
{ lsFMSoundOff(frequency,block);
  lsFMSound(frequency,block);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -