head 1.2; access ; symbols ; locks ; comment @ * @; 1.2 date 89.01.31.14.05.37; author pkern; state Exp; branches ; next 1.1; 1.1 date 89.01.31.13.28.50; author pkern; state Exp; branches ; next ; desc @@ 1.2 log @*** empty log message *** @ text @/* * keybrd.c: * functions, maps and interrupt routines for TI Pro keyboards * (see TI Technical Manual for nitty gritty details) * * copyright (c) University of Toronto, 1988. */ static char rcsid[] = "$Header$"; #include #include "common.h" #include "tipro.h" uchar keyhit=0, keyboom=0; static union REGS r; static uchar f_map=0, f_vec=0; extern int (*xmit)(); extern uchar flowctl, local, xoff; /* bios check for queued keys */ kbdhit() { r.h.ah = 1; int86(KBD_INT, &r, &r); return (!(r.x.flags & Zflag)); /* ie. ! Z-flag */ } /* flush keyboard type-ahead queue */ kbflush() { r.h.ah = 3; int86(KBD_INT, &r, &r); keyhit = 0; } /* toggle keyboard autorepeat */ kbautorep(sw) int sw; /* switch : 1 = on, 0 = off */ { r.h.ah = 4; r.h.al = (sw) ? 1 : 2; int86(KBD_INT, &r, &r); } /* get keyboard word */ unsigned int kbdget() { r.h.ah = 0; int86(KBD_INT, &r, &r); keyhit--; return((unsigned int) r.x.ax); } /* return a keypadv[] offset */ kbdfn(kn) unsigned int kn; { extern keymap[]; return(keymap[kn>>8]); } /* * keypad map (aN == alt N) * +-----+-----+-----+-----+ * | PF1 | PF2 | PF3 | PF4 | cursor code offsets: * | aF1 | aF2 | aF3 | aF4 | UP - 0 * +-----+-----+-----+-----+ DOWN - 1 * | 7 | 8 | 9 | - | RIGHT - 2 * | a1 | a2 | a3 | a4 | LEFT - 3 * +-----+-----+-----+-----+ * | 4 | 5 | 6 | , | keypad code string offsets: * | aQ | aW | aE | aR | 8 - "0" 10 - "8" 18 - "F3" * +-----+-----+-----+-----+ 9 - "1" 11 - "9" 19 - "F4" * | 1 | 2 | 3 | | A - "2" 12 - "-" 1A - "\200" * | aA | aS | aD |Enter| B - "3" 13 - "," 1B - "\b" * +-----+-----+-----+ | C - "4" 14 - "." 1C - "\003" * | 0 | . | aF | D - "5" 15 - "ENTER" 1D - "\r\n" * | aZ aX | aC | aV | E - "6" 16 - "F1" 1E --> ansback * +-----------+-----+-----+ F - "7" 17 - "F2" 1F - "" (empty) */ /* * keymap: * keypadv[] offsets for all possible * (ie. 90H) extended function-key codes */ int keymap[0x90] = { /* 0x0_ */ 0x1f, 0x1f, 0x1f, 0x1a, 0x1f, 0x1f, 0x1f, 0x1f, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x1f, 0x1f, /* 0x1_ */ 0x0c, 0x0d, 0x0e, 0x13, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x09, 0x0a, /* 0x2_ */ 0x0b, 0x15, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x08, 0x08, 0x14, 0x15, /* 0x3_ */ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1b, 0x1f, /* 0x4_ */ 0x1f, 0x1f, 0x1f, 0x00, 0x01, 0x03, 0x02, 0x1f, 0x00, 0x00, 0x1f, 0x03, 0x03, 0x02, 0x02, 0x1f, /* 0x5_ */ 0x01, 0x01, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x01, 0x1f, 0x1f, /* 0x6_ */ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x01, 0x16, 0x17, 0x18, 0x19, 0x1f, 0x1f, 0x1f, 0x1f, /* 0x7_ */ 0x00, 0x01, 0x1f, 0x03, 0x02, 0x1f, 0x01, 0x1f, 0x0f, 0x10, 0x11, 0x12, 0x1f, 0x1f, 0x1f, 0x1f, /* 0x8_ */ 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x1f, 0x1f, 0x1f, 0x00, 0x01, 0x02, 0x03, 0x16, 0x17, 0x18, 0x19 }; /* k_brk -- intercept SHIFT BRK/PAUS interrupt */ void interrupt k_brk(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags) unsigned int bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags; { flags |= Cflag; /* ie. don't queue it */ keyboom++; } /* k_paus -- intercept PAUS key interrupt */ void interrupt k_paus(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags) unsigned int bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags; { if (flowctl && !local) if (xoff) { xmit(XON); xoff = 0; } else { xmit(XOFF); xoff++; } flags |= Cflag; /* don't queue it */ } /* k_que -- take note of new keystroke in buffer */ void interrupt k_que() { keyhit++; /* outport(0,7); /* simple but pathetic-sounding keyclick */ } /* * remap: table of scan codes for remapping TI Pro keypad * - new scan values for scan codes 23 -> 44 * 0 = scan code unused (ie. it should never occur) */ static uchar remap[22] = { 23, 24, 25, 26, 66, 0, 82, 69, 50, 51, 11, 12, 67, 0, 0, 0, 9, 10, 52, 53, 68, 84 }; /* k_map -- remap keypad scan codes */ void interrupt k_map(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags) unsigned int bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags; { uchar al, ah; al = ax & 0xff; ah = (ax >> 8) | 0x02; if (al < 45 && al > 22) /* force ALT-key bit & remap key code */ ax = (ah << 8) + remap[al-23]; } /* * o_brk, o_paus, o_que, o_map: * temp storage for old interrupt vectors */ void interrupt (*o_brk)(); void interrupt (*o_paus)(); void interrupt (*o_que)(); void interrupt (*o_map)(); init_kbd() { if (f_vec) return(0); kbflush(); /* remember old intr vectors */ o_brk = getvect(KEYBRK); o_paus = getvect(KEYPAUS); o_que = getvect(KBDQUE); o_map = getvect(KBDMAP); /* install new ones */ disable(); setvect(KEYBRK, k_brk); setvect(KEYPAUS, k_paus); setvect(KBDQUE, k_que); setvect(KBDMAP, k_map); enable(); f_vec = 1; /* vectors installed */ /* some important key mappings */ keymap[K_SETUP >> 8] = 0x80; /* flag the SETUP key */ keymap[(K_SETUP >> 8)+1] = 0x80; /* ditto on F2 */ keymap[K_shBRK >> 8] = 0x40; /* shiftBrk - send BRK */ keymap[K_NUL >> 8] = 0x41; /* ctrl-2@@ - send NUL */ keymap[K_BKSP >> 8] = 0x1b; /* backsp keypadv[] position */ keymap[K_BREAK >> 8] = 0x1c; /* break keypadv[] position */ keymap[K_cBRK >> 8] = 0x1e; /* ctrlBrk keypadv[] position */ keyboom = 0; } reset_kbd() { if (!f_vec) return; /* no vectors to reset, yet */ kbflush(); /* restore old intr vectors */ disable(); setvect(KEYBRK, o_brk); setvect(KEYPAUS, o_paus); setvect(KBDQUE, o_que); setvect(KBDMAP, o_map); enable(); f_vec = 0; /* vectors reset */ } nlmod(sw) /* switch newline mode */ uchar sw; { /* shift ENTER offset, if needed */ keymap[0x21] = keymap[0x2f] = ((sw) ? 0x1d : 0x15); } @ 1.1 log @Initial revision @ text @d8 1 a8 1 static char *ID = "keybrd.c Oct/88 Univ. of Toronto"; @