📄 lkey.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,®s,®s);
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 + -