home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Media Share 9
/
MEDIASHARE_09.ISO
/
comm
/
ykh121.zip
/
YKHSRC.ZIP
/
KEYIO.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-02
|
14KB
|
465 lines
#pragma inline
#include <stdio.h>
#include <dos.h>
#include <bios.h>
#include "jislib.h"
#define ESC 0x1B /* ASCII ESCape character */
#define ESCAPE 0x11B /* Keyboard ESCape scan code */
#define DEL 0x7F /* ASCII DELete character */
#define BKSP 0xE08 /* Keyboard BacKSPace scan code */
#define F1 0x3C00 /* Keyboard Function key 1 scan code */
#define F2 0xE02F /* Keyboard Function key 2 scan code */
#define F3 0x372A /* Keyboard Function key 3 scan code */
#define F4 0x4A2D /* Keyboard Function key 4 scan code */
#define EXITO 0x6700
#define FUN4 0x3E00
#define F5 0x3F00 /* Keyboard Function key 5 scan code */
#define F6 0x4000 /* Keyboard Function key 6 scan code */
#define F7 0x4100 /* Keyboard Function key 7 scan code */
#define F8 0x4200 /* Keyboard Function key 8 scan code */
#define F9 0x4300 /* Keyboard Function key 9 scan code */
#define F10 0x4400 /* Keyboard Function key 10 scan code */
#define UP 0x48e0 /* Keyboard Up Arrow scan code */
#define DOWN 0x50e0 /* Keyboard Down Arrow scan code */
#define LEFT 0x4Be0 /* Keyboard Left Arrow scan code */
#define RIGHT 0x4De0 /* Keyboard Right Arrow scan code */
#define HOME 0x47e0
#define INSERT 0x52e0
#define DELETE 0x53e0
#define END 0x4Fe0
#define PAGEUP 0x49e0
#define PAGEDN 0x51e0
#define K1 0x4F31 /* Keyboard Numeric 1 scan code */
#define K2 0x5032 /* Keyboard Numeric 2 scan code */
#define K3 0x5133 /* Keyboard Numeric 3 scan code */
#define K4 0x4B34 /* Keyboard Numeric 4 scan code */
#define K5 0x4C35 /* Keyboard Numeric 5 scan code */
#define K6 0x4D36 /* Keyboard Numeric 6 scan code */
#define K7 0x4737 /* Keyboard Numeric 7 scan code */
#define K8 0x4838 /* Keyboard Numeric 8 scan code */
#define K9 0x4939 /* Keyboard Numeric 9 scan code */
#define K0 0x5230 /* Keyboard Numeric 0 scan code */
#define KDASH 0xFFFF /*0x372A Keyboard Numeric Asteric scan code */
#define KCOMA 0x4E2B /*0x4A2D Keyboard Numeric Dash(minus) scan code */
#define KENTR 0xE00D /* Keyboard Numeric + (plus) scan code */
#define KDOT 0x532E /* Keyboard Numeric Period scan code */
#define CSI 155
/*****************************************************************************/
/* function prototypes */
int Keyinit( void ); /* Initialize the keyboard system */
int ConChk( void ); /* Check the keyboard for keystrokes */
unsigned int GetKey( void ); /* Retrieve a scan code from keyboard */
int DoKey( void ); /* Transmit a key sequence */
void TransKey( unsigned ); /* Translate a keystroke to a sequence */
int TransNumKey(unsigned); /* Translate Numeric Keypad keystroke */
int TransApplKey(unsigned);/* Translate Application Keypad keystroke */
void SendBksp( void ); /* Transmit the backspace character */
void SetKeyPad( int ); /* Set the keypad to APPLICATION, NUMERIC */
void SetCursorKey( int ); /* Set the cursor key mode */
/*****************************************************************************/
/* Global variables */
unsigned char backspace; /* Backspace/Delete translation flag */
unsigned char keyclick; /* Keyclick mode on/off */
unsigned char applkeypad; /* Current state of keypad */
unsigned paused=0;
/*****************************************************************************/
/* External variables */
extern unsigned inputmode;
/*****************************************************************************/
/* Local Static data */
static char cursorkey = '['; /* Sequence character in cursor key */
static union REGS regs; /* Registers for int86 call */
/*****************************************************************************/
int key_control() {return 1;}
int key_init() {
asm mov ax,00500H;
asm mov cx,0FFFFH;
asm int 16H;
asm mov cx,16;
key_looper:
asm mov ax,01000H;
asm int 16H;
asm cmp ax,0FFFFH;
asm loopne key_looper
asm jne key_not;
backspace = 0;
keyclick = 0;
applkeypad = 0;
ctrlbrk(key_control);
kb_open();
return 0;
key_not:
return 1;
}
void key_close()
{
kb_close();
}
/* C O N C H K -- Check if any key strokes are waiting, check hot keys */
ConChk()
{
asm mov ah,11h;
asm int 16h;
asm mov ax,1;
asm jnz ConChk_1
asm xor ax,ax;
ConChk_1:;
}
/* G E T K E Y -- Return a keyboard scan code */
unsigned int GetKey()
{
unsigned int scancode;
unsigned int keyflags;
asm mov ah,10h;
asm int 16h;
asm mov scancode,ax;
asm mov ah,12h;
asm int 16h;
asm mov keyflags,ax;
switch (scancode)
{
case 0x4e2b: if (keyflags&3) /* SHIFT+KEYPAD_PLUS = KEYPAD_MINUS */
scancode=0xffff;
break;
case 0x4400: scancode=0x2c1a; /* F10 = CTRL+Z */
break;
case 0x1f13: paused=1; /* CTRL+S pauses */
break;
case 0x1011: paused=0; /* CTRL+Q unpauses */
break;
case 0x3b00: if (paused^=1) /* F1 toggles pause */
scancode=0x1f13;
else
scancode=0x1011;
break;
}
return(scancode);
}
/* D O K E Y -- Retrieve and interpret a keystroke */
DoKey()
{
unsigned i,j;
unsigned scancode;
switch(scancode=GetKey())
{
case FUN4 : return -4;
case F5 : return -5;
case F6 : return -6;
case F7 : return -7;
case F8 : return -8;
case F9 : return -9;
case EXITO: return -10;
}
DoInput(scancode);
return 0;
}
/* T R A N S K E Y -- translate a scancode into a keystroke sequence */
void TransKey( unsigned key ) {
switch(key) { /* Evaluate this keyboard scan code */
case BKSP: /* Backspace pressed */
SendBksp();
break;
case F1: /* Function key 1 pressed */
com_send( ESC );
com_send( 'O' );
com_send( 'P' );
break;
case F2: /* Function key 2 pressed */
com_send( ESC );
com_send( 'O' );
com_send( 'Q' );
break;
case F3: /* Function key 3 pressed */
com_send( ESC );
com_send( 'O' );
com_send( 'R' );
break;
case F4: /* Function key 4 pressed */
com_send( ESC );
com_send( 'O' );
com_send( 'S' );
break;
case UP: /* Up Arrow pressed */
com_send(ESC);
com_send(cursorkey);
com_send('A');
break;
case DOWN: /* Down Arrow pressed */
com_send(ESC);
com_send(cursorkey);
com_send('B');
break;
case RIGHT: /* Right Arrow pressed */
com_send(ESC);
com_send(cursorkey);
com_send('C');
break;
case LEFT: /* Left Arrow pressed */
com_send(ESC);
com_send(cursorkey);
com_send('D');
break;
case HOME: /* Home */
com_send(ESC);
com_send('[');
com_send('1');
com_send('~');
break;
case INSERT: /* Insert */
com_send(ESC);
com_send('[');
com_send('2');
com_send('~');
break;
case DELETE: /* Delete */
com_send(ESC);
com_send('[');
com_send('3');
com_send('~');
break;
case END: /* End */
com_send(ESC);
com_send('[');
com_send('4');
com_send('~');
break;
case PAGEUP: /* Page Up */
com_send(ESC);
com_send('[');
com_send('5');
com_send('~');
break;
case PAGEDN: /* Page Dn */
com_send(ESC);
com_send('[');
com_send('6');
com_send('~');
break;
default: /* No translation yet, check numeric pad */
if ( (TransNumKey(key) == 0 ) && (TransApplKey(key) == 0) )
com_send( (char)key ); /* Still no translation, transmit char */
break;
}
}
/* T R A N S N U M K E Y -- Try and translate key from the Numeric Keypad */
static TransNumKey(register unsigned key) {
if (applkeypad != 0) /* If keypad is not in NUMERIC mode */
return(0); /* then no translation here possible */
switch ( key ) {
case K7: /* Numeric 7 pressed */
com_send('7');
return(1);
case K8: /* Numeric 8 pressed */
com_send('8');
return(1);
case K9: /* Numeric 9 pressed */
com_send('9');
return(1);
case KDASH: /* Numeric Minus pressed */
com_send('-');
return(1);
case K4: /* Numeric 4 pressed */
com_send('4');
return(1);
case K5: /* Numeric 5 pressed */
com_send('5');
return(1);
case K6: /* Numeric 6 pressed */
com_send('6');
return(1);
case KCOMA: /* Numeric Comma pressed */
com_send(',');
return(1);
case K1: /* Numeric 1 pressed */
com_send('1');
return(1);
case K2: /* Numeric 2 pressed */
com_send('2');
return(1);
case K3: /* Numeric 3 pressed */
com_send('3');
return(1);
case K0: /* Numeric 0 pressed */
com_send('0');
return(1);
case KDOT: /* Numeric Period pressed */
com_send('.');
return(1);
case KENTR: /* Numeric Enter pressed */
com_send(13);
return(1);
default:;
}
return(0); /* No translation */
}
/* T R A N S A P P L K E Y -- Try and translate key from Application Keypad*/
static TransApplKey(register unsigned key) {
if (applkeypad != 1) /* If keypad is not APPLICATION mode */
return(0); /* then no translation here possible */
switch ( key ) {
case K7: /* Application key 7 pressed*/
com_send(ESC);
com_send('O');
com_send('w');
return(1);
case K8: /* Application key 8 pressed */
com_send(ESC);
com_send('O');
com_send('x');
return(1);
case K9: /* Application key 9 pressed */
com_send(ESC);
com_send('O');
com_send('y');
return(1);
case KDASH: /* Application key minus pressed */
com_send(ESC);
com_send('O');
com_send('m');
return(1);
case K4: /* Application key 4 pressed */
com_send(ESC);
com_send('O');
com_send('t');
return(1);
case K5: /* Application key 5 pressed */
com_send(ESC);
com_send('O');
com_send('u');
return(1);
case K6: /* Application key 6 pressed */
com_send(ESC);
com_send('O');
com_send('v');
return(1);
case KCOMA: /* Application key Comma pressed */
com_send(ESC);
com_send('O');
com_send('l');
return(1);
case K1: /* Application key 1 pressed */
com_send(ESC);
com_send('O');
com_send('q');
return(1);
case K2: /* Application key 2 pressed */
com_send(ESC);
com_send('O');
com_send('r');
return(1);
case K3: /* Application key 3 pressed */
com_send(ESC);
com_send('O');
com_send('s');
return(1);
case K0: /* Application key 0 pressed */
com_send(ESC);
com_send('O');
com_send('p');
return(1);
case KDOT: /* Application key Dot pressed */
com_send(ESC);
com_send('O');
com_send('n');
return(1);
case KENTR: /* Application key Enter pressed */
com_send(ESC);
com_send('O');
com_send('M');
return(1);
default:;
}
return(0); /* No translation */
}
/* S E N D B K S P -- Send a backspace out */
static void SendBksp() {
if (backspace) /* If backspace flag is on then */
com_send(8); /* transmit a backspace */
else
com_send(DEL); /* Else transmit a delete */
}
/* S E T K E Y P A D -- Set the keypad translation */
void SetKeyPad( int mode ) {
if (mode) /* If a mode set is requested */
applkeypad = 1; /* set the keypad to APPLICATION */
else /* Else */
applkeypad = 0; /* set the keypad to NUMERIC mode*/
}
/* S E T C U R S O R K E Y -- Set the cursior key mode */
void SetCursorKey( mode ) { /* This establishes the second character */
/* of the cursor keys escape sequence */
if (mode) /* If cursor key mode is requested */
cursorkey = 'O'; /* then set cursor key to 'O' */
else /* Else */
cursorkey = '['; /* use a bracket for escape sequences */
}