Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP id AA6795 ; Fri, 15 Jan 93 10:34:35 EST Xref: sserve comp.unix.bsd:9970 alt.sources:4991 Path: sserve!manuel.anu.edu.au!munnari.oz.au!sgiblab!darwin.sura.net!newsserver.jvnc.net!yale.edu!ira.uka.de!Germany.EU.net!hcshh!hm From: hm@hcshh.hcs.de (Hellmuth Michaelis) Newsgroups: comp.unix.bsd,alt.sources Subject: [386BSD] pcvt 2.00 - VT220 console driver (part 09/11) Summary: 386BSD 0.1 VT220 console device driver source code Keywords: 386BSD console driver VT220 Message-ID: <1625@hcshh.hcs.de> Date: 15 Jan 93 13:03:06 GMT Followup-To: comp.unix.bsd Organization: HCS GmbH, Hamburg, Europe Lines: 2525 Submitted-by: hm@hcshh.hcs.de (Hellmuth Michaelis) Archive-name: pcvt-2.00/part09 ---- Cut Here and unpack ---- #!/bin/sh # This is part 09 of pcvt-2.00 if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= pcvt_kbd.c ============== if test X"$1" != X"-c" -a -f 'pcvt_kbd.c'; then echo "File already exists: skipping 'pcvt_kbd.c'" else echo "x - extracting pcvt_kbd.c (Text)" sed 's/^X//' << 'SHAR_EOF' > pcvt_kbd.c && X/* X * Copyright (c) 1992, 1993 Hellmuth Michaelis, Brian Dunford-Shore, X * and Holger Veit. X * X * All rights reserved. X * X * This code is derived from software contributed to Berkeley by X * William Jolitz and Don Ahn. X * X * This driver is contributed to the 386BSD operating system. X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software contributed to 386BSD and developed X * by Hellmuth Michaelis, Brian Dunford-Shore and Holger Veit X * 4. Neither the name of the developers nor the names "386BSD" and "pcvt" X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * X * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR X * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES X * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. X * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, X * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT X * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, X * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY X * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT X * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF X * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. X */ X X/* X * @(#)pcvt_kbd.c 2.00 (contributed to 386BSD) X * Last Edit-Date: [Tue Jan 12 13:56:15 1993] X */ X X/*---------------------------------------------------------------------------* X * X * pcvt_kbd.c VT220 Driver Keyboard Interface Code X * ---------------------------------------------------- X * X * written by Hellmuth Michaelis, hm@hcshh.hcs.de X * based on code from Holger Veit, veit@du9ds3.uni-duisburg.de X * X * -hv 23/07/92 use at your own risk! national keyboard support X * -hv 25/07/92 split into kbd.c vga.c pccons.c X * -hm integration into vt100 emulator, running under 0.1 X * -hm making keys bind to functions, new structure X * -hm same functionality as for 0.0 X * -hm kbd_cmd() updated X * -hm fkey changes, cleanups X * -hm keypad numeric mode (num lock) and keypad application mode X * -hm cursor keypad mode X * -hm pf1 .. pf4 X * -hm dec user defined keys X * -hm keyboard layout choices for fkey placements etc. X * -hm changing alt-f9..alt-f12 for hp-keyboard layout X * -hm activating keys for german keyboard ... X * -hm returning key-subtype in keyboard ioctls X * X *---------------------------------------------------------------------------*/ X X#include "pcvt_hdr.h" /* global include */ X Xstatic void fkey1 ( void ); Xstatic void fkey2 ( void ); Xstatic void fkey3 ( void ); Xstatic void fkey4 ( void ); Xstatic void fkey5 ( void ); Xstatic void fkey6 ( void ); Xstatic void fkey7 ( void ); Xstatic void fkey8 ( void ); Xstatic void fkey9 ( void ); Xstatic void fkey10 ( void ); Xstatic void fkey11 ( void ); Xstatic void fkey12 ( void ); Xstatic void sfkey1 ( void ); Xstatic void sfkey2 ( void ); Xstatic void sfkey3 ( void ); Xstatic void sfkey4 ( void ); Xstatic void sfkey5 ( void ); Xstatic void sfkey6 ( void ); Xstatic void sfkey7 ( void ); Xstatic void sfkey8 ( void ); X X#ifdef VT220_KEYBOARDLAYOUT X Xstatic void sfkey9 ( void ); Xstatic void sfkey10 ( void ); Xstatic void sfkey11 ( void ); Xstatic void sfkey12 ( void ); Xstatic void cfkey1 ( void ); Xstatic void cfkey2 ( void ); Xstatic void cfkey3 ( void ); Xstatic void cfkey4 ( void ); Xstatic void cfkey5 ( void ); Xstatic void cfkey6 ( void ); Xstatic void cfkey7 ( void ); Xstatic void cfkey8 ( void ); Xstatic void cfkey9 ( void ); Xstatic void cfkey10 ( void ); Xstatic void cfkey11 ( void ); Xstatic void cfkey12 ( void ); X X#endif X Xstatic doreset ( void ); Xstatic ovlinit ( int force ); Xstatic int getokeydef ( unsigned key, struct kbd_ovlkey *thisdef ); Xstatic int getckeydef ( unsigned key, struct kbd_ovlkey *thisdef ); Xstatic u_char *xlatkey2ascii( u_short key ); Xstatic void settpmrate ( int rate ); Xstatic void setlockkeys ( int snc ); Xstatic int rmkeydef ( int key ); Xstatic int setkeydef ( struct kbd_ovlkey *data ); X Xstatic int ledstate = 0; /* keyboard led's */ X Xstatic int tpmrate = KBD_TPD500|KBD_TPM100; X Xstatic u_char altkpflag = 0; Xstatic u_short altkpval = 0; X X/*---------------------------------------------------------------------------* X * this is one sub-entry for the table. the type can be either X * "pointer to a string" or "pointer to a function" X *---------------------------------------------------------------------------*/ Xtypedef struct X{ X u_char subtype; /* subtype, string or function */ X union what X { X u_char *string; /* ptr to string, null terminated */ X void (*func)(); /* ptr to function */ X } what; X} entry; X X/*---------------------------------------------------------------------------* X * this is the "outer" table X *---------------------------------------------------------------------------*/ Xtypedef struct X{ X u_short type; /* type of key */ X u_short ovlindex; /* -hv- index into overload table */ X entry unshift; /* normal default codes/funcs */ X entry shift; /* shifted default codes/funcs */ X entry ctrl; /* control default codes/funcs */ X} Keycap_def; X X#define IDX0 0 /* default indexvalue into ovl table */ X X#define STR KBD_SUBT_STR /* subtype = ptr to string */ X#define FNC KBD_SUBT_FNC /* subtype = ptr to function */ X X#define CODE_SIZE 5 X X/*---------------------------------------------------------------------------* X * the overlaytable table is a static fixed size scratchpad where all the X * overloaded definitions are stored. X * an entry consists of a short (holding the new type attribute) and X * four entries for a new keydefinition. X *---------------------------------------------------------------------------*/ X X#define OVLTBL_SIZE 64 /* 64 keys can be overloaded */ X X#define Ovl_tbl struct kbd_ovlkey X Xstatic Ovl_tbl ovltbl[OVLTBL_SIZE]; /* the table itself */ X Xstatic ovlinitflag = 0; /* the init flag for the table */ X Xstatic char scantokey[] = { X/* -0- -1- -2- -3- -4- -5- -6- -7- This layout is valid for US only */ X/*00*/ 0, 120, 0, 116, 114, 112, 113, 123, /* ?? F9 ?? F5 F3 F1 F2 F12 */ X/*08*/ 0, 121, 119, 117, 115, 16, 1, 0, /* ?? F10 F8 F6 F4 TAB ` ?? */ X/*10*/ 0, 60, 44, 0, 58, 17, 2, 0, /* ?? ALl SHl ?? CTl Q 1 ?? */ X/*18*/ 0, 0, 46, 32, 31, 18, 3, 0, /* ?? Z S A W 2 ?? ?? */ X/*20*/ 0, 48, 47, 33, 19, 5, 4, 0, /* ?? C X D E 4 3 ?? */ X/*28*/ 0, 61, 49, 34, 21, 20, 6, 0, /* ?? SP V F T R 5 ?? */ X/*30*/ 0, 51, 50, 36, 35, 22, 7, 0, /* ?? N B H G Y 6 ?? */ X/*38*/ 0, 0, 52, 37, 23, 8, 9, 0, /* ?? ?? M J U 7 8 ?? */ X/*40*/ 0, 53, 38, 24, 25, 11, 10, 0, /* ?? , K I O 0 9 ?? */ X/*48*/ 0, 54, 55, 39, 40, 26, 12, 0, /* ?? . / L ; P - ?? */ X/*50*/ 0, 0, 41, 0, 27, 13, 0, 0, /* ?? ?? " ?? [ = ?? ?? */ X/*58*/ 30, 57, 43, 28, 0, 29, 0, 0, /* CAP SHr ENT ] ?? \ ?? ?? */ X/*60*/ 0, 45, 0, 0, 0, 0, 15, 0, /* ?? NL1 ?? ?? ?? ?? BS ?? */ X/*68*/ 0, 93, 0, 92, 91, 0, 0, 0, /* ?? KP1 ?? KP4 KP7 ?? ?? ?? */ X/*70*/ 99, 104, 98, 97, 102, 96, 110, 90, /* KP0 KP. KP2 KP5 KP6 KP8 ESC NUM */ X/*78*/ 122, 106, 103, 105, 100, 101, 125, 0, /* F11 KP+ KP3 KP- KP* KP9 LOC ?? */ X/*80*/ 126, 0, 0, 118, /* BREAK ?? ?? F7 */ X/* ^^^ X * -hv- we use 0x80 for a pseudo scan code for the break key X */ X}; X Xstatic char extscantokey[] = { X/* -0- -1- -2- -3- -4- -5- -6- -7- This layout is valid for US only */ X/*00*/ 0, 120, 0, 116, 114, 112, 113, 123, /* ?? F9 ?? F5 F3 F1 F2 F12 */ X/*08*/ 0, 121, 119, 117, 115, 16, 1, 0, /* ?? F10 F8 F6 F4 TAB ` ?? */ X/*10*/ 0, 62, 124, 0, 64, 17, 2, 0, /* ?? ALr PSc ?? CTr Q 1 ?? */ X/*18*/ 0, 0, 46, 32, 31, 18, 3, 0, /* ?? Z S A W 2 ?? ?? */ X/*20*/ 0, 48, 47, 33, 19, 5, 4, 0, /* ?? C X D E 4 3 ?? */ X/*28*/ 0, 61, 49, 34, 21, 20, 6, 0, /* ?? SP V F T R 5 ?? */ X/*30*/ 0, 51, 50, 36, 35, 22, 7, 0, /* ?? N B H G Y 6 ?? */ X/*38*/ 0, 0, 52, 37, 23, 8, 9, 0, /* ?? ?? M J U 7 8 ?? */ X/*40*/ 0, 53, 38, 24, 25, 11, 10, 0, /* ?? , K I O 0 9 ?? */ X/*48*/ 0, 54, 95, 39, 40, 26, 12, 0, /* ?? . KP/ L ; P - ?? */ X/*50*/ 0, 0, 41, 0, 27, 13, 0, 0, /* ?? ?? " ?? [ = ?? ?? */ X/*58*/ 30, 57, 108, 28, 0, 29, 0, 0, /* CAP SHr KPE ] ?? \ ?? ?? */ X/*60*/ 0, 45, 0, 0, 0, 0, 15, 0, /* ?? NL1 ?? ?? ?? ?? BS ?? */ X/*68*/ 0, 81, 0, 79, 80, 0, 0, 0, /* ?? END ?? LA HOM ?? ?? ?? */ X/*70*/ 75, 76, 84, 97, 89, 83, 110, 90, /* INS DEL DA KP5 RA UA ESC NUM */ X/*78*/ 122, 106, 86, 105, 124, 85, 125, 0, /* F11 KP+ PD KP- PSc PU LOC ?? */ X/*80*/ 126, 0, 0, 118, /* BREAK ?? ?? F7 */ X}; X Xstatic Keycap_def key2ascii[] = X{ X X/* DONT EVER OVERLOAD KEY 0, THIS IS A KEY THAT MUSTN'T EXIST */ X X/* type index unshift shift ctrl */ X/* ---------- ----- ----------------------- ----------------------- -------------------------- */ X/* 0*/ KBD_NONE, IDX0, {STR,(u_char*)"df"}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 1*/ KBD_ASCII, IDX0, {STR,(u_char*)"`"}, {STR,(u_char*)"~"}, {STR,(u_char*)"`"}, X/* 2*/ KBD_ASCII, IDX0, {STR,(u_char*)"1"}, {STR,(u_char*)"!"}, {STR,(u_char*)"1"}, X/* 3*/ KBD_ASCII, IDX0, {STR,(u_char*)"2"}, {STR,(u_char*)"@"}, {STR,(u_char*)"\000"}, X/* 4*/ KBD_ASCII, IDX0, {STR,(u_char*)"3"}, {STR,(u_char*)"#"}, {STR,(u_char*)"3"}, X/* 5*/ KBD_ASCII, IDX0, {STR,(u_char*)"4"}, {STR,(u_char*)"$"}, {STR,(u_char*)"4"}, X/* 6*/ KBD_ASCII, IDX0, {STR,(u_char*)"5"}, {STR,(u_char*)"%"}, {STR,(u_char*)"5"}, X/* 7*/ KBD_ASCII, IDX0, {STR,(u_char*)"6"}, {STR,(u_char*)"^"}, {STR,(u_char*)"\036"}, X/* 8*/ KBD_ASCII, IDX0, {STR,(u_char*)"7"}, {STR,(u_char*)"&"}, {STR,(u_char*)"7"}, X/* 9*/ KBD_ASCII, IDX0, {STR,(u_char*)"8"}, {STR,(u_char*)"*"}, {STR,(u_char*)"9"}, X/* 10*/ KBD_ASCII, IDX0, {STR,(u_char*)"9"}, {STR,(u_char*)"("}, {STR,(u_char*)"9"}, X/* 11*/ KBD_ASCII, IDX0, {STR,(u_char*)"0"}, {STR,(u_char*)")"}, {STR,(u_char*)"0"}, X/* 12*/ KBD_ASCII, IDX0, {STR,(u_char*)"-"}, {STR,(u_char*)"_"}, {STR,(u_char*)"\037"}, X/* 13*/ KBD_ASCII, IDX0, {STR,(u_char*)"="}, {STR,(u_char*)"+"}, {STR,(u_char*)"="}, X/* 14*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 15*/ KBD_ASCII, IDX0, {STR,(u_char*)"\177"}, {STR,(u_char*)"\010"}, {STR,(u_char*)"\177"}, /* BS */ X/* 16*/ KBD_ASCII, IDX0, {STR,(u_char*)"\t"}, {STR,(u_char*)"\t"}, {STR,(u_char*)"\t"}, /* TAB */ X/* 17*/ KBD_ASCII, IDX0, {STR,(u_char*)"q"}, {STR,(u_char*)"Q"}, {STR,(u_char*)"\021"}, X/* 18*/ KBD_ASCII, IDX0, {STR,(u_char*)"w"}, {STR,(u_char*)"W"}, {STR,(u_char*)"\027"}, X/* 19*/ KBD_ASCII, IDX0, {STR,(u_char*)"e"}, {STR,(u_char*)"E"}, {STR,(u_char*)"\005"}, X/* 20*/ KBD_ASCII, IDX0, {STR,(u_char*)"r"}, {STR,(u_char*)"R"}, {STR,(u_char*)"\022"}, X/* 21*/ KBD_ASCII, IDX0, {STR,(u_char*)"t"}, {STR,(u_char*)"T"}, {STR,(u_char*)"\024"}, X/* 22*/ KBD_ASCII, IDX0, {STR,(u_char*)"y"}, {STR,(u_char*)"Y"}, {STR,(u_char*)"\031"}, X/* 23*/ KBD_ASCII, IDX0, {STR,(u_char*)"u"}, {STR,(u_char*)"U"}, {STR,(u_char*)"\025"}, X/* 24*/ KBD_ASCII, IDX0, {STR,(u_char*)"i"}, {STR,(u_char*)"I"}, {STR,(u_char*)"\011"}, X/* 25*/ KBD_ASCII, IDX0, {STR,(u_char*)"o"}, {STR,(u_char*)"O"}, {STR,(u_char*)"\017"}, X/* 26*/ KBD_ASCII, IDX0, {STR,(u_char*)"p"}, {STR,(u_char*)"P"}, {STR,(u_char*)"\020"}, X/* 27*/ KBD_ASCII, IDX0, {STR,(u_char*)"["}, {STR,(u_char*)"{"}, {STR,(u_char*)"\033"}, X/* 28*/ KBD_ASCII, IDX0, {STR,(u_char*)"]"}, {STR,(u_char*)"}"}, {STR,(u_char*)"\035"}, X/* 29*/ KBD_ASCII, IDX0, {STR,(u_char*)"\\"}, {STR,(u_char*)"|"}, {STR,(u_char*)"\034"}, X/* 30*/ KBD_CAPS, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 31*/ KBD_ASCII, IDX0, {STR,(u_char*)"a"}, {STR,(u_char*)"A"}, {STR,(u_char*)"\001"}, X/* 32*/ KBD_ASCII, IDX0, {STR,(u_char*)"s"}, {STR,(u_char*)"S"}, {STR,(u_char*)"\023"}, X/* 33*/ KBD_ASCII, IDX0, {STR,(u_char*)"d"}, {STR,(u_char*)"D"}, {STR,(u_char*)"\004"}, X/* 34*/ KBD_ASCII, IDX0, {STR,(u_char*)"f"}, {STR,(u_char*)"F"}, {STR,(u_char*)"\006"}, X/* 35*/ KBD_ASCII, IDX0, {STR,(u_char*)"g"}, {STR,(u_char*)"G"}, {STR,(u_char*)"\007"}, X/* 36*/ KBD_ASCII, IDX0, {STR,(u_char*)"h"}, {STR,(u_char*)"H"}, {STR,(u_char*)"\010"}, X/* 37*/ KBD_ASCII, IDX0, {STR,(u_char*)"j"}, {STR,(u_char*)"J"}, {STR,(u_char*)"\n"}, X/* 38*/ KBD_ASCII, IDX0, {STR,(u_char*)"k"}, {STR,(u_char*)"K"}, {STR,(u_char*)"\013"}, X/* 39*/ KBD_ASCII, IDX0, {STR,(u_char*)"l"}, {STR,(u_char*)"L"}, {STR,(u_char*)"\014"}, X/* 40*/ KBD_ASCII, IDX0, {STR,(u_char*)";"}, {STR,(u_char*)":"}, {STR,(u_char*)";"}, X/* 41*/ KBD_ASCII, IDX0, {STR,(u_char*)"'"}, {STR,(u_char*)"\""}, {STR,(u_char*)"'"}, X/* 42*/ KBD_ASCII, IDX0, {STR,(u_char*)"\\"}, {STR,(u_char*)"|"}, {STR,(u_char*)"\034"}, /* special */ X/* 43*/ KBD_RETURN, IDX0, {STR,(u_char*)"\r"}, {STR,(u_char*)"\r"}, {STR,(u_char*)"\r"}, /* RETURN */ X/* 44*/ KBD_SHIFT, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* SHIFT left */ X/* 45*/ KBD_ASCII, IDX0, {STR,(u_char*)"<"}, {STR,(u_char*)">"}, {STR,(u_char*)""}, X/* 46*/ KBD_ASCII, IDX0, {STR,(u_char*)"z"}, {STR,(u_char*)"Z"}, {STR,(u_char*)"\032"}, X/* 47*/ KBD_ASCII, IDX0, {STR,(u_char*)"x"}, {STR,(u_char*)"X"}, {STR,(u_char*)"\030"}, X/* 48*/ KBD_ASCII, IDX0, {STR,(u_char*)"c"}, {STR,(u_char*)"C"}, {STR,(u_char*)"\003"}, X/* 49*/ KBD_ASCII, IDX0, {STR,(u_char*)"v"}, {STR,(u_char*)"V"}, {STR,(u_char*)"\026"}, X/* 50*/ KBD_ASCII, IDX0, {STR,(u_char*)"b"}, {STR,(u_char*)"B"}, {STR,(u_char*)"\002"}, X/* 51*/ KBD_ASCII, IDX0, {STR,(u_char*)"n"}, {STR,(u_char*)"N"}, {STR,(u_char*)"\016"}, X/* 52*/ KBD_ASCII, IDX0, {STR,(u_char*)"m"}, {STR,(u_char*)"M"}, {STR,(u_char*)"\r"}, X/* 53*/ KBD_ASCII, IDX0, {STR,(u_char*)","}, {STR,(u_char*)"<"}, {STR,(u_char*)","}, X/* 54*/ KBD_ASCII, IDX0, {STR,(u_char*)"."}, {STR,(u_char*)">"}, {STR,(u_char*)"."}, X/* 55*/ KBD_ASCII, IDX0, {STR,(u_char*)"/"}, {STR,(u_char*)"?"}, {STR,(u_char*)"/"}, X/* 56*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 57*/ KBD_SHIFT, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* SHIFT right */ X/* 58*/ KBD_CTL, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* CTL left */ X/* 59*/ KBD_ASCII, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 60*/ KBD_META, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* ALT left */ X#ifndef ENABLE_NULLCHARS X/* 61*/ KBD_ASCII, IDX0, {STR,(u_char*)" "}, {STR,(u_char*)" "}, {STR,(u_char*)" "}, /* SPACE */ X#else X/* 61*/ KBD_ASCII, IDX0, {STR,(u_char*)" "}, {STR,(u_char*)" "}, {STR,(u_char*)"\000"}, /* SPACE */ X#endif /* ENABLE_NULLCHARS */ X/* 62*/ KBD_META, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* ALT right */ X/* 63*/ KBD_ASCII, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 64*/ KBD_CTL, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* CTL right */ X/* 65*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 66*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 67*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 68*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 69*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 70*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 71*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 72*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 73*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 74*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 75*/ KBD_FUNC, IDX0, {STR,(u_char*)"\033[2~"}, {STR,(u_char*)"\033[2~"}, {STR,(u_char*)"\033[2~"}, /* INS */ X/* 76*/ KBD_FUNC, IDX0, {STR,(u_char*)"\033[3~"}, {STR,(u_char*)"\033[3~"}, {STR,(u_char*)"\033[3~"}, /* DEL */ X/* 77*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 78*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 79*/ KBD_CURSOR, IDX0, {STR,(u_char*)"\033[D"}, {STR,(u_char*)"\033OD"}, {STR,(u_char*)"\033[D"}, /* CU <- */ X/* 80*/ KBD_FUNC, IDX0, {STR,(u_char*)"\033[1~"}, {STR,(u_char*)"\033[1~"}, {STR,(u_char*)"\033[1~"}, /* HOME = FIND*/ X/* 81*/ KBD_FUNC, IDX0, {STR,(u_char*)"\033[4~"}, {STR,(u_char*)"\033[4~"}, {STR,(u_char*)"\033[4~"}, /* END = SELECT */ X/* 82*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 83*/ KBD_CURSOR, IDX0, {STR,(u_char*)"\033[A"}, {STR,(u_char*)"\033OA"}, {STR,(u_char*)"\033[A"}, /* CU ^ */ X/* 84*/ KBD_CURSOR, IDX0, {STR,(u_char*)"\033[B"}, {STR,(u_char*)"\033OB"}, {STR,(u_char*)"\033[B"}, /* CU v */ X/* 85*/ KBD_FUNC, IDX0, {STR,(u_char*)"\033[5~"}, {STR,(u_char*)"\033[5~"}, {STR,(u_char*)"\033[5~"}, /* PG UP */ X/* 86*/ KBD_FUNC, IDX0, {STR,(u_char*)"\033[6~"}, {STR,(u_char*)"\033[6~"}, {STR,(u_char*)"\033[6~"}, /* PG DN */ X/* 87*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 88*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 89*/ KBD_CURSOR, IDX0, {STR,(u_char*)"\033[C"}, {STR,(u_char*)"\033OC"}, {STR,(u_char*)"\033[C"}, /* CU -> */ X/* 90*/ KBD_NUM, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 91*/ KBD_KP, IDX0, {STR,(u_char*)"7"}, {STR,(u_char*)"\033Ow"}, {STR,(u_char*)"7"}, X/* 92*/ KBD_KP, IDX0, {STR,(u_char*)"4"}, {STR,(u_char*)"\033Ot"}, {STR,(u_char*)"4"}, X/* 93*/ KBD_KP, IDX0, {STR,(u_char*)"1"}, {STR,(u_char*)"\033Oq"}, {STR,(u_char*)"1"}, X/* 94*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/* 95*/ KBD_KP, IDX0, {STR,(u_char*)"/"}, {STR,(u_char*)"/"}, {STR,(u_char*)"/"}, X/* 96*/ KBD_KP, IDX0, {STR,(u_char*)"8"}, {STR,(u_char*)"\033Ox"}, {STR,(u_char*)"8"}, X/* 97*/ KBD_KP, IDX0, {STR,(u_char*)"5"}, {STR,(u_char*)"\033Ou"}, {STR,(u_char*)"5"}, X/* 98*/ KBD_KP, IDX0, {STR,(u_char*)"2"}, {STR,(u_char*)"\033Or"}, {STR,(u_char*)"2"}, X/* 99*/ KBD_KP, IDX0, {STR,(u_char*)"0"}, {STR,(u_char*)"\033Op"}, {STR,(u_char*)"0"}, X/*100*/ KBD_KP, IDX0, {STR,(u_char*)"*"}, {STR,(u_char*)"*"}, {STR,(u_char*)"*"}, X/*101*/ KBD_KP, IDX0, {STR,(u_char*)"9"}, {STR,(u_char*)"\033Oy"}, {STR,(u_char*)"9"}, X/*102*/ KBD_KP, IDX0, {STR,(u_char*)"6"}, {STR,(u_char*)"\033Ov"}, {STR,(u_char*)"6"}, X/*103*/ KBD_KP, IDX0, {STR,(u_char*)"3"}, {STR,(u_char*)"\033Os"}, {STR,(u_char*)"3"}, X/*104*/ KBD_KP, IDX0, {STR,(u_char*)"."}, {STR,(u_char*)"\033On"}, {STR,(u_char*)"."}, X/*105*/ KBD_KP, IDX0, {STR,(u_char*)"-"}, {STR,(u_char*)"\033Om"}, {STR,(u_char*)"-"}, X/*106*/ KBD_KP, IDX0, {STR,(u_char*)"+"}, {STR,(u_char*)"+"}, {STR,(u_char*)"+"}, X/*107*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/*108*/ KBD_RETURN, IDX0, {STR,(u_char*)"\r"}, {STR,(u_char*)"\033OM"}, {STR,(u_char*)"\r"}, /* KP ENTER */ X/*109*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/*110*/ KBD_ASCII, IDX0, {STR,(u_char*)"\033"}, {STR,(u_char*)"\033"}, {STR,(u_char*)"\033"}, X/*111*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X X#ifdef VT220_KEYBOARDLAYOUT X X/*112*/ KBD_FUNC, IDX0, {FNC,(void*)fkey1}, {FNC,(void*)sfkey1}, {FNC,(void*)cfkey1}, /* F1 */ X/*113*/ KBD_FUNC, IDX0, {FNC,(void*)fkey2}, {FNC,(void*)sfkey2}, {FNC,(void*)cfkey2}, /* F2 */ X/*114*/ KBD_FUNC, IDX0, {FNC,(void*)fkey3}, {FNC,(void*)sfkey3}, {FNC,(void*)cfkey2}, /* F3 */ X/*115*/ KBD_FUNC, IDX0, {FNC,(void*)fkey4}, {FNC,(void*)sfkey4}, {FNC,(void*)cfkey4}, /* F4 */ X/*116*/ KBD_FUNC, IDX0, {FNC,(void*)fkey5}, {FNC,(void*)sfkey5}, {FNC,(void*)cfkey5}, /* F5 */ X/*117*/ KBD_FUNC, IDX0, {FNC,(void*)fkey6}, {FNC,(void*)sfkey6}, {FNC,(void*)cfkey6}, /* F6 */ X/*118*/ KBD_FUNC, IDX0, {FNC,(void*)fkey7}, {FNC,(void*)sfkey7}, {FNC,(void*)cfkey7}, /* F7 */ X/*119*/ KBD_FUNC, IDX0, {FNC,(void*)fkey8}, {FNC,(void*)sfkey8}, {FNC,(void*)cfkey8}, /* F8 */ X/*120*/ KBD_FUNC, IDX0, {FNC,(void*)fkey9}, {FNC,(void*)sfkey9}, {FNC,(void*)cfkey9}, /* F9 */ X/*121*/ KBD_FUNC, IDX0, {FNC,(void*)fkey10}, {FNC,(void*)sfkey10}, {FNC,(void*)cfkey10}, /* F10 */ X/*122*/ KBD_FUNC, IDX0, {FNC,(void*)fkey11}, {FNC,(void*)sfkey11}, {FNC,(void*)cfkey11}, /* F11 */ X/*123*/ KBD_FUNC, IDX0, {FNC,(void*)fkey12}, {FNC,(void*)sfkey12}, {FNC,(void*)cfkey12}, /* F12 */ X X#else /* VT220_KEYBOARDLAYOUT */ X X/*112*/ KBD_FUNC, IDX0, {FNC,(void*)fkey1}, {FNC,(void*)sfkey1}, {STR,(u_char*)""}, /* F1 */ X/*113*/ KBD_FUNC, IDX0, {FNC,(void*)fkey2}, {FNC,(void*)sfkey2}, {STR,(u_char*)""}, /* F2 */ X/*114*/ KBD_FUNC, IDX0, {FNC,(void*)fkey3}, {FNC,(void*)sfkey3}, {STR,(u_char*)""}, /* F3 */ X/*115*/ KBD_FUNC, IDX0, {FNC,(void*)fkey4}, {FNC,(void*)sfkey4}, {STR,(u_char*)""}, /* F4 */ X/*116*/ KBD_FUNC, IDX0, {FNC,(void*)fkey5}, {FNC,(void*)sfkey5}, {STR,(u_char*)""}, /* F5 */ X/*117*/ KBD_FUNC, IDX0, {FNC,(void*)fkey6}, {FNC,(void*)sfkey6}, {STR,(u_char*)""}, /* F6 */ X/*118*/ KBD_FUNC, IDX0, {FNC,(void*)fkey7}, {FNC,(void*)sfkey7}, {STR,(u_char*)""}, /* F7 */ X/*119*/ KBD_FUNC, IDX0, {FNC,(void*)fkey8}, {FNC,(void*)sfkey8}, {STR,(u_char*)""}, /* F8 */ X/*120*/ KBD_FUNC, IDX0, {FNC,(void*)fkey9}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* F9 */ X/*121*/ KBD_FUNC, IDX0, {FNC,(void*)fkey10}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* F10 */ X/*122*/ KBD_FUNC, IDX0, {FNC,(void*)fkey11}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* F11 */ X/*123*/ KBD_FUNC, IDX0, {FNC,(void*)fkey12}, {STR,(u_char*)""}, {STR,(u_char*)""}, /* F12 */ X X#endif /* VT220_KEYBOARDLAYOUT */ X X/*124*/ KBD_KP, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/*125*/ KBD_SCROLL, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/*126*/ KBD_BREAK, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X/*127*/ KBD_NONE, IDX0, {STR,(u_char*)""}, {STR,(u_char*)""}, {STR,(u_char*)""}, X}; X Xstatic char keypad2num[] = { X 7, 4, 1, -1, -1, 8, 5, 2, 0, -1, 9, 6, 3, -1, -1, -1, -1 X}; X X#ifdef VT220_KEYBOARDLAYOUT X X/*---------------------------------------------------------------------------* X * function bound to function key 1 X *---------------------------------------------------------------------------*/ Xstatic void fkey1() X{ X if(meta_down) X more_chars = (u_char *)"\033[23~"; /* F11 */ X else X { X current_video_screen = 0; X vgapage(0); X return; X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 2 X *---------------------------------------------------------------------------*/ Xstatic void fkey2() X{ X if(meta_down) X more_chars = (u_char *)"\033[24~"; /* F12 */ X else X { X current_video_screen = 1; X vgapage(1); X return; X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 3 X *---------------------------------------------------------------------------*/ Xstatic void fkey3() X{ X if(meta_down) X more_chars = (u_char *)"\033[25~"; /* F13 */ X else X { X current_video_screen = 2; X vgapage(2); X return; X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 4 X *---------------------------------------------------------------------------*/ Xstatic void fkey4() X{ X if(meta_down) X more_chars = (u_char *)"\033[26~"; /* F14 */ X else X { X current_video_screen = 3; X vgapage(3); X return; X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 5 X *---------------------------------------------------------------------------*/ Xstatic void fkey5() X{ X if(meta_down) X more_chars = (u_char *)"\033[28~"; /* Help */ X else X if(++current_video_screen > totalscreens-1) X current_video_screen = 0; X vgapage(current_video_screen); X} X X/*---------------------------------------------------------------------------* X * function bound to function key 6 X *---------------------------------------------------------------------------*/ Xstatic void fkey6() X{ X if(meta_down) X more_chars = (u_char *)"\033[29~"; /* DO */ X else X more_chars = (u_char *)"\033[17~"; /* F6 */ X} X X/*---------------------------------------------------------------------------* X * function bound to function key 7 X *---------------------------------------------------------------------------*/ Xstatic void fkey7() X{ X if(meta_down) X more_chars = (u_char *)"\033[31~"; /* F17 */ X else X more_chars = (u_char *)"\033[18~"; /* F7 */ X} X X/*---------------------------------------------------------------------------* X * function bound to function key 8 X *---------------------------------------------------------------------------*/ Xstatic void fkey8() X{ X if(meta_down) X more_chars = (u_char *)"\033[32~"; /* F18 */ X else X more_chars = (u_char *)"\033[19~"; /* F8 */ X} X X/*---------------------------------------------------------------------------* X * function bound to function key 9 X *---------------------------------------------------------------------------*/ Xstatic void fkey9() X{ X if(meta_down) X more_chars = (u_char *)"\033[33~"; /* F19 */ X else X more_chars = (u_char *)"\033[20~"; /* F9 */ X} X X/*---------------------------------------------------------------------------* X * function bound to function key 10 X *---------------------------------------------------------------------------*/ Xstatic void fkey10() X{ X if(meta_down) X more_chars = (u_char *)"\033[34~"; /* F20 */ X else X more_chars = (u_char *)"\033[21~"; /* F10 */ X} X X/*---------------------------------------------------------------------------* X * function bound to function key 11 X *---------------------------------------------------------------------------*/ Xstatic void fkey11() X{ X if(meta_down) X more_chars = (u_char *)"\0x8FP"; /* PF1 */ X else X more_chars = (u_char *)"\033[23~"; /* F11 */ X} X X/*---------------------------------------------------------------------------* X * function bound to function key 12 X *---------------------------------------------------------------------------*/ Xstatic void fkey12() X{ X if(meta_down) X more_chars = (u_char *)"\0x8FQ"; /* PF2 */ X else X more_chars = (u_char *)"\033[24~"; /* F12 */ X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 1 X *---------------------------------------------------------------------------*/ Xstatic void sfkey1() X{ X if(meta_down) X { X if(vsp->ukt.length[6]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[6]]); X else X more_chars = (u_char *)"\033[23~"; /* F11 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 2 X *---------------------------------------------------------------------------*/ Xstatic void sfkey2() X{ X if(meta_down) X { X if(vsp->ukt.length[7]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[7]]); X else X more_chars = (u_char *)"\033[24~"; /* F12 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 3 X *---------------------------------------------------------------------------*/ Xstatic void sfkey3() X{ X if(meta_down) X { X if(vsp->ukt.length[8]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[8]]); X else X more_chars = (u_char *)"\033[25~"; /* F13 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 4 X *---------------------------------------------------------------------------*/ Xstatic void sfkey4() X{ X if(meta_down) X { X if(vsp->ukt.length[9]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[9]]); X else X more_chars = (u_char *)"\033[26~"; /* F14 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 5 X *---------------------------------------------------------------------------*/ Xstatic void sfkey5() X{ X if(meta_down) X { X if(vsp->ukt.length[11]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[11]]); X else X more_chars = (u_char *)"\033[28~"; /* Help */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 6 X *---------------------------------------------------------------------------*/ Xstatic void sfkey6() X{ X if(!meta_down) X { X if(vsp->ukt.length[0]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[0]]); X else X more_chars = (u_char *)"\033[17~"; /* F6 */ X } X else if(vsp->ukt.length[12]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[12]]); X else X more_chars = (u_char *)"\033[29~"; /* DO */ X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 7 X *---------------------------------------------------------------------------*/ Xstatic void sfkey7() X{ X if(!meta_down) X { X if(vsp->ukt.length[1]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[1]]); X else X more_chars = (u_char *)"\033[18~"; /* F7 */ X } X else if(vsp->ukt.length[14]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[14]]); X else X more_chars = (u_char *)"\033[31~"; /* F17 */ X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 8 X *---------------------------------------------------------------------------*/ Xstatic void sfkey8() X{ X if(!meta_down) X { X if(vsp->ukt.length[2]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[2]]); X else X more_chars = (u_char *)"\033[19~"; /* F8 */ X } X else if(vsp->ukt.length[14]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[15]]); X else X more_chars = (u_char *)"\033[32~"; /* F18 */ X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 9 X *---------------------------------------------------------------------------*/ Xstatic void sfkey9() X{ X if(!meta_down) X { X if(vsp->ukt.length[3]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[3]]); X else X more_chars = (u_char *)"\033[20~"; /* F9 */ X } X else if(vsp->ukt.length[16]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[16]]); X else X more_chars = (u_char *)"\033[33~"; /* F19 */ X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 10 X *---------------------------------------------------------------------------*/ Xstatic void sfkey10() X{ X if(!meta_down) X { X if(vsp->ukt.length[4]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[4]]); X else X more_chars = (u_char *)"\033[21~"; /* F10 */ X } X else if(vsp->ukt.length[17]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[17]]); X else X more_chars = (u_char *)"\033[34~"; /* F20 */ X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 11 X *---------------------------------------------------------------------------*/ Xstatic void sfkey11() X{ X if(!meta_down) X { X if(vsp->ukt.length[6]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[6]]); X else X more_chars = (u_char *)"\033[23~"; /* F11 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 12 X *---------------------------------------------------------------------------*/ Xstatic void sfkey12() X{ X if(!meta_down) X { X if(vsp->ukt.length[7]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[7]]); X else X more_chars = (u_char *)"\033[24~"; /* F12 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 1 X *---------------------------------------------------------------------------*/ Xstatic void cfkey1() X{ X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 2 X *---------------------------------------------------------------------------*/ Xstatic void cfkey2() X{ X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 3 X *---------------------------------------------------------------------------*/ Xstatic void cfkey3() X{ X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 4 X *---------------------------------------------------------------------------*/ Xstatic void cfkey4() X{ X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 5 X *---------------------------------------------------------------------------*/ Xstatic void cfkey5() X{ X if(vsp->which_fkl == SYS_FKL) X toggl_bell(vsp); X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 6 X *---------------------------------------------------------------------------*/ Xstatic void cfkey6() X{ X if(vsp->which_fkl == SYS_FKL) X toggl_sevenbit(vsp); X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 7 X *---------------------------------------------------------------------------*/ Xstatic void cfkey7() X{ X if(vsp->which_fkl == SYS_FKL) X toggl_dspf(vsp); X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 8 X *---------------------------------------------------------------------------*/ Xstatic void cfkey8() X{ X if(vsp->which_fkl == SYS_FKL) X toggl_awm(vsp); X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 9 X *---------------------------------------------------------------------------*/ Xstatic void cfkey9() X{ X if(vsp->labels_on) /* toggle label display on/off */ X fkl_off(vsp); X else X fkl_on(vsp); X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 10 X *---------------------------------------------------------------------------*/ Xstatic void cfkey10() X{ X if(vsp->labels_on) /* toggle user/system fkey labels */ X { X if(vsp->which_fkl == USR_FKL) X sw_sfkl(vsp); X else if(vsp->which_fkl == SYS_FKL) X sw_ufkl(vsp); X } X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 11 X *---------------------------------------------------------------------------*/ Xstatic void cfkey11() X{ X if(vsp->vt_pure_mode == M_PUREVT) X set_emulation_mode(vsp, M_HPVT); X else if(vsp->vt_pure_mode == M_HPVT) X set_emulation_mode(vsp, M_PUREVT); X} X X/*---------------------------------------------------------------------------* X * function bound to control function key 12 X *---------------------------------------------------------------------------*/ Xstatic void cfkey12() X{ X} X X#else /* VT220_KEYBOARDLAYOUT */ X X/*---------------------------------------------------------------------------* X * function bound to function key 1 X *---------------------------------------------------------------------------*/ Xstatic void fkey1() X{ X if(!meta_down) X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[17~"; /* F6 */ X } X else X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[26~"; /* F14 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 2 X *---------------------------------------------------------------------------*/ Xstatic void fkey2() X{ X if(!meta_down) X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[18~"; /* F7 */ X } X else X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[28~"; /* HELP */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 3 X *---------------------------------------------------------------------------*/ Xstatic void fkey3() X{ X if(!meta_down) X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[19~"; /* F8 */ X } X else X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[29~"; /* DO */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 4 X *---------------------------------------------------------------------------*/ Xstatic void fkey4() X{ X if(!meta_down) X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[20~"; /* F9 */ X } X else X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[31~"; /* F17 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 5 X *---------------------------------------------------------------------------*/ Xstatic void fkey5() X{ X if(!meta_down) X { X if((vsp->vt_pure_mode == M_HPVT) && (vsp->which_fkl == SYS_FKL)) X toggl_bell(vsp); X else X more_chars = (u_char *)"\033[21~"; /* F10 */ X } X else X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[32~"; /* F18 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 6 X *---------------------------------------------------------------------------*/ Xstatic void fkey6() X{ X if(!meta_down) X { X if((vsp->vt_pure_mode == M_HPVT) && (vsp->which_fkl == SYS_FKL)) X toggl_sevenbit(vsp); X else X more_chars = (u_char *)"\033[23~"; /* F11 */ X } X else X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[33~"; /* F19 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 7 X *---------------------------------------------------------------------------*/ Xstatic void fkey7() X{ X if(!meta_down) X { X if((vsp->vt_pure_mode == M_HPVT) && (vsp->which_fkl == SYS_FKL)) X toggl_dspf(vsp); X else X more_chars = (u_char *)"\033[24~"; /* F12 */ X } X else X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[34~"; /* F20 */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 8 X *---------------------------------------------------------------------------*/ Xstatic void fkey8() X{ X if(!meta_down) X { X if((vsp->vt_pure_mode == M_HPVT) && (vsp->which_fkl == SYS_FKL)) X toggl_awm(vsp); X else X more_chars = (u_char *)"\033[25~"; /* F13 */ X } X else X { X if(vsp->vt_pure_mode == M_PUREVT || (vsp->which_fkl == USR_FKL)) X more_chars = (u_char *)"\033[35~"; /* F21 ??!! */ X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 9 X *---------------------------------------------------------------------------*/ Xstatic void fkey9() X{ X if(meta_down) X { X if(vsp->vt_pure_mode == M_PUREVT) X return; X X if(vsp->labels_on) /* toggle label display on/off */ X fkl_off(vsp); X else X fkl_on(vsp); X } X else X { X current_video_screen = 0; X vgapage(0); X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 10 X *---------------------------------------------------------------------------*/ Xstatic void fkey10() X{ X if(meta_down) X { X if(vsp->vt_pure_mode != M_PUREVT && vsp->labels_on) X { X if(vsp->which_fkl == USR_FKL) X sw_sfkl(vsp); X else if(vsp->which_fkl == SYS_FKL) X sw_ufkl(vsp); X } X } X else X { X current_video_screen = 1; X vgapage(1); X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 11 X *---------------------------------------------------------------------------*/ Xstatic void fkey11() X{ X if(meta_down) X { X if(vsp->vt_pure_mode == M_PUREVT) X set_emulation_mode(vsp, M_HPVT); X else if(vsp->vt_pure_mode == M_HPVT) X set_emulation_mode(vsp, M_PUREVT); X } X else X { X current_video_screen = 2; X vgapage(2); X } X} X X/*---------------------------------------------------------------------------* X * function bound to function key 12 X *---------------------------------------------------------------------------*/ Xstatic void fkey12() X{ X if(meta_down) X { X if(++current_video_screen > totalscreens-1) X current_video_screen = 0; X vgapage(current_video_screen); X } X else X { X current_video_screen = 3; X vgapage(3); X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 1 X *---------------------------------------------------------------------------*/ Xstatic void sfkey1() X{ X if(!meta_down) X { X if(vsp->ukt.length[0]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[0]]); X } X else X { X if(vsp->ukt.length[9]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[9]]); X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 2 X *---------------------------------------------------------------------------*/ Xstatic void sfkey2() X{ X if(!meta_down) X { X if(vsp->ukt.length[1]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[1]]); X } X else X { X if(vsp->ukt.length[11]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[11]]); X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 3 X *---------------------------------------------------------------------------*/ Xstatic void sfkey3() X{ X if(!meta_down) X { X if(vsp->ukt.length[2]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[2]]); X } X else X { X if(vsp->ukt.length[12]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[12]]); X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 4 X *---------------------------------------------------------------------------*/ Xstatic void sfkey4() X{ X if(!meta_down) X { X if(vsp->ukt.length[3]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[3]]); X } X else X { X if(vsp->ukt.length[13]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[13]]); X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 5 X *---------------------------------------------------------------------------*/ Xstatic void sfkey5() X{ X if(!meta_down) X { X if(vsp->ukt.length[4]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[4]]); X } X else X { X if(vsp->ukt.length[14]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[14]]); X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 6 X *---------------------------------------------------------------------------*/ Xstatic void sfkey6() X{ X if(!meta_down) X { X if(vsp->ukt.length[6]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[6]]); X } X else X { X if(vsp->ukt.length[15]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[15]]); X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 7 X *---------------------------------------------------------------------------*/ Xstatic void sfkey7() X{ X if(!meta_down) X { X if(vsp->ukt.length[7]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[7]]); X } X else X { X if(vsp->ukt.length[16]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[16]]); X } X} X X/*---------------------------------------------------------------------------* X * function bound to SHIFTED function key 8 X *---------------------------------------------------------------------------*/ Xstatic void sfkey8() X{ X if(!meta_down) X { X if(vsp->ukt.length[8]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[8]]); X } X else X { X if(vsp->ukt.length[17]) /* entry available ? */ X more_chars = (u_char *)&(vsp->udkbuf[vsp->ukt.first[17]]); X } X} X X#endif /* VT220_KEYBOARDLAYOUT */ X X/*---------------------------------------------------------------------------* X * switch keypad to numeric mode X *---------------------------------------------------------------------------*/ Xvoid vt_keynum(svsp) Xstruct video_state *svsp; X{ X svsp->num = 1; X update_led(); X} X X/*---------------------------------------------------------------------------* X * switch keypad to application mode X *---------------------------------------------------------------------------*/ Xvoid vt_keyappl(svsp) Xstruct video_state *svsp; X{ X svsp->num = 0; X update_led(); X} X X#ifdef OLDKEYBOARDSTUFF X/*---------------------------------------------------------------------------* X * pass command to keyboard X *---------------------------------------------------------------------------*/ Xu_char kbd_cmd(u_char byte) X{ X while(inb(CONTROLLER_CTRL) & STATUS_INPBF) X ; X outb(CONTROLLER_DATA, byte); X while(inb(CONTROLLER_CTRL) & STATUS_INPBF) X ; X return(inb(CONTROLLER_DATA)); X} X X/*---------------------------------------------------------------------------* X * reset keyboard X *---------------------------------------------------------------------------*/ Xstatic doreset() X{ X u_char c; X int again = 0; X X /* Enable interrupts and keyboard controller */ X X kbc_8042cmd(CONTR_WRITE); X outb(CONTROLLER_DATA, (COMMAND_INHOVR|COMMAND_SYSFLG|COMMAND_IRQEN)); X X /* Start keyboard stuff RESET */ X X kbd_cmd(KEYB_C_RESET); X X while((c = inb(CONTROLLER_DATA)) != KEYB_R_ACK) X { X if ((c == KEYB_R_RESEND) || (c == KEYB_R_OVERRUN1)) X { X if(!again) X printf("KEYBOARD disconnected: RECONNECT \n"); X kbd_cmd(KEYB_C_RESET); X again = 1; X } X } X X /* wait for selftest ok return code */ X X while(inb(CONTROLLER_DATA) != KEYB_R_SELFOK) X ; X X keyboard_type = KB_MFII; X X/*===========================================================================* X ATTENTION LAPTOPS ! X X Got this one from one beta-tester for making his laptop play, this X is included for reference and to help somebody else with the same X problem (-hm) X X Below is that keyboard reset code to defeat A20... this time :-) X This is taken directly from the kbdrest() function in X /usr/src/sys.386bsd/i386/stand/kbd.c, and is needed for my laptop. X X *===========================================================================*/ X X#ifdef LAPTOP X X /* While we are here, defeat gatea20 */ X while (inb(0x64)&2); /* wait input ready */ X outb(0x64,0xd1); X while (inb(0x64)&2); /* wait input ready */ X outb(0x60,0xdf); X while (inb(0x64)&2); /* wait input ready */ X odt = bdt = 0; X inb(0x60); X X#endif /* LAPTOP */ X X/*===========================================================================* X END ATTENTION LAPTOPS ! X *===========================================================================*/ X X} X X/*---------------------------------------------------------------------------* X * update keyboard led's X *---------------------------------------------------------------------------*/ Xvoid update_led() X{ X ledstate = kbd_scroll | 2*(vsp->num) | 4*caps; X kbd_cmd(KEYB_C_LEDS); X outb(CONTROLLER_DATA, ledstate); X} X X/*---------------------------------------------------------------------------* X * set typamatic rate X *---------------------------------------------------------------------------*/ Xstatic void settpmrate(rate) X{ X tpmrate = rate & 0x7f; X kbd_cmd(KEYB_C_TYPEM); X outb(CONTROLLER_DATA, tpmrate); X} X X#else /* OLDKEYBOARDSTUFF */ X/*---------------------------------------------------------------------------* X * this is the beginning of a keyboard rewrite, highly experimental X *---------------------------------------------------------------------------*/ X/* debugging ... */ X X#define KEYB_DEBUG /* enable keyboard debug printf's */ X#define KEYB_DEBUG_ALL /* enable runtime keyboard debug printf's */ X#define KEYB_DEBUG_ACK /* enable reset ack keyboard debug printf's */ X X#ifdef KEYB_DEBUG Xstatic int kbd_debug_on = 1; /* debug flag */ X#endif X X/*---------------------------------------------------------------------------* X * X * switch 8042 obf interrupts on or off X * X * onoff = 0 - switch off X * onoff = 1 - switch on X * X * returns: X * 0 - successfull X * -1 - timeout error X * X *---------------------------------------------------------------------------*/ Xstatic int irq_8042(onoff) Xint onoff; X{ X int timeout = KEYB_TIMEOUT; X u_char inbyte; X X while(timeout--) X { X if(!(inb(CONTROLLER_CTRL) & STATUS_INPBF)) X { X outb(CONTROLLER_CTRL, CONTR_WRITE); X X timeout = KEYB_TIMEOUT; X while(timeout--) X { X if(!(inb(CONTROLLER_CTRL) & STATUS_INPBF)) X { X inbyte = inb(CONTROLLER_DATA); X if(onoff) X outb(CONTROLLER_DATA, (COMMAND_INHOVR|COMMAND_SYSFLG|COMMAND_IRQEN)); X else X outb(CONTROLLER_DATA, (COMMAND_INHOVR|COMMAND_SYSFLG)); X return(0); X } X DELAY(KEYB_INNERTIMO); X } X return(-1); X } X DELAY(KEYB_INNERTIMO); X } X return(-1); X} X X/*---------------------------------------------------------------------------* X * X * write byte to controller data port X * X * returns: X * 0 - successfull X * -1 - timeout error X * X *---------------------------------------------------------------------------*/ Xstatic int contr_wr(u_char byte) X{ X int timeout = KEYB_TIMEOUT; X X while(timeout--) X { X if(!(inb(CONTROLLER_CTRL) & STATUS_INPBF)) X { X outb(CONTROLLER_DATA, byte); X return(0); X } X DELAY(KEYB_INNERTIMO); X } X return(-1); X} X X/*---------------------------------------------------------------------------* X * X * read byte from controller data port X * X * this is strange, in that one has to wait for STATUS_INPBF to X * become 0 before a byte can be read - waiting for status_outpbf X * causes not the desired result...... X * X * returns: X * 0x00 .. 0xff - byte read from port X * -1 - timeout error X * X *---------------------------------------------------------------------------*/ Xstatic int contr_rd() X{ X int timeout = KEYB_TIMEOUT; X X while(timeout--) X { X if(!(inb(CONTROLLER_CTRL) & STATUS_INPBF)) X return((u_char)inb(CONTROLLER_DATA)); X DELAY(KEYB_INNERTIMO); X } X return(-1); X} X X/*---------------------------------------------------------------------------* X * X * read byte from controller data port, waiting for status_outpbf X * X * returns: X * 0x00 .. 0xff - byte read from port X * -1 - timeout error X * X *---------------------------------------------------------------------------*/ Xstatic int contr_rdobf() X{ X int timeout = 10000; X X while(timeout--) X { X if(inb(CONTROLLER_CTRL) & STATUS_OUTPBF) X return((u_char)inb(CONTROLLER_DATA)); X DELAY(KEYB_INNERTIMO); X } X return(-1); X} X X/*---------------------------------------------------------------------------* X * X * write byte to controller data port and read status X * X * returns: X * 0x00 .. 0xff - response from controller X * -1 - timeout error X * X *---------------------------------------------------------------------------*/ Xstatic int contr_wrrd(u_char byte) X{ X int timeout = KEYB_TIMEOUT; X X while(timeout--) X { X if(!(inb(CONTROLLER_CTRL) & STATUS_INPBF)) X { X outb(CONTROLLER_DATA, byte); X X timeout = KEYB_TIMEOUT; X X while(timeout--) X { X if(!(inb(CONTROLLER_CTRL) & STATUS_INPBF)) X return((u_char)inb(CONTROLLER_DATA)); X DELAY(KEYB_INNERTIMO); X } X return(-1); X } X DELAY(KEYB_INNERTIMO); X } X return(-1); X} X X X/*---------------------------------------------------------------------------* X * pass command to keyboard (via 8042 controller on main board) X *---------------------------------------------------------------------------*/ Xstatic int keyboard_cmd(int two, u_char byte1, u_char byte2) X{ X u_char inbyte; X int retries; X int x; X X x = spltty(); /* block irqs from 8042 */ X X /* write byte 1 to controller data */ X X if(byte1 == KEYB_C_ECHO || byte1 == KEYB_C_RESEND) X { X /* no ack for echo and resend commands */ X if((contr_wr(byte1)) == -1) X { X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: timeout writing byte 1 echo/resend, stat 0x%x!\n",inb(CONTROLLER_CTRL)); X#endif X splx(x); X return(-1); X } X splx(x); X return(0); X } X X retries = 100; X X while(retries--) X { X inbyte = contr_wrrd(byte1); X X switch(inbyte) X { X case -1: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: waitfor ack: timeout error, stat = 0x%x\n",inb(CONTROLLER_CTRL)); X#endif X break; X X case KEYB_R_ACK: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: waitfor ack: got ack !!\n"); X#endif X goto ackout; X X case KEYB_R_OVERRUN: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: waitfor ack: got overrun-00\n"); X#endif X break; X X case KEYB_R_OVERRUN1: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: waitfor ack: got overrun-ff\n"); X#endif X break; X X case KEYB_R_RESEND: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: waitfor ack: got resend\n"); X#endif X break; X X default: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: waitfor ack: got %x, stat = 0x%x!\n",inbyte,inb(CONTROLLER_CTRL)); X#endif X break; X } X } X if(retries <= 0) X { X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: waitfor ack: too much retries, continue ..!\n"); X#endif X } X Xackout: X X /* special handling of keyboard reset */ X X if(byte1 == KEYB_C_RESET) X { X retries = KEYB_TIMEOUT; X X while(retries--) X { X inbyte = contr_rd(); X X switch(inbyte) X { X case -1: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: reset, selftest response timeout error, stat 0x%x!\n",inb(CONTROLLER_CTRL)); X#endif X break; X X case KEYB_R_SELFOK: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: reset, got selftest ok!\n"); X#endif X splx(x); X return(0); X X case KEYB_R_SELFBAD: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: reset, got selftest failed error!\n"); X#endif X break; X X case KEYB_R_ACK: /* this seems pretty normal */ X#ifdef KEYB_DEBUG X#ifdef KEYB_DEBUG_ACK Xif(kbd_debug_on) X printf("keyboard_cmd: reset, got ack .... error ??\n"); X#endif X#endif X break; X X default: X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: reset, unknown response rx'd, got 0x%x, stat 0x%x!\n",inbyte,inb(CONTROLLER_CTRL)); X#endif X break; X } X DELAY(10); X } X if(retries <= 0) X { X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: reset, too much retries error, continue ...\n"); X#endif X } X } X X if(!two) X { X splx(x); X return(0); /* one byte only, exit */ X } X X /* send 2nd byte */ X X inbyte = contr_wrrd(byte2); X if(inbyte == -1) X { X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: timeout writing byte 2, stat 0x%x!\n",inb(CONTROLLER_CTRL)); X#endif X } X else X { X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("keyboard_cmd: successfull wrote byte 2, inbyte = 0x%x\n",inbyte); X#endif X } X splx(x); X} X X/*---------------------------------------------------------------------------* X * reset keyboard X *---------------------------------------------------------------------------*/ Xstatic doreset() X{ X u_char id = 0; X int ismf = 0; X int retries = 10; X X#ifdef KEYB_DEBUG X kbd_debug_on = 1; X#endif X X#ifdef KEYB_DEBUG X printf("doreset() calls keyboard_cmd (reset)!\n"); X#endif X X keyboard_cmd(0, KEYB_C_RESET, 0); X X#ifdef KEYB_DEBUG X printf("doreset() calls keyboard_cmd (id)!\n"); X#endif X X keyboard_cmd(0, KEYB_C_ID, 0); X X while(retries--) X { X id = contr_rdobf(); X X if(id == -1) X { X#ifdef KEYB_DEBUG X printf("doreset(): id got timeout\n"); X#endif X break; X } X else if(id == KEYB_R_MF2ID1) X { X#ifdef KEYB_DEBUG X printf("doreset(): id got mf-id 1\n"); X#endif X ismf++; X } X else if(id == KEYB_R_MF2ID2) X { X#ifdef KEYB_DEBUG X printf("doreset(): id got mf-id 2\n"); X#endif X ismf++; X break; X } X else if(id == KEYB_R_ACK) /* ??? */ X { X#ifdef KEYB_DEBUG X printf("doreset(): id, got ack ..\n"); X#endif X continue; X } X else X { X#ifdef KEYB_DEBUG X printf("doreset(): id, rx'd 0x%x\n",id); X#endif X break; X } X } X if(retries <= 0) X { X#ifdef KEYB_DEBUG X printf("doreset(): id error, too much retries\n"); X#endif X } X X X if(ismf == 2) X { X#ifdef KEYB_DEBUG X printf("doreset(): keyboard is mf ii\n"); X#endif X keyboard_type = KB_MFII; X } X else if(ismf == 0) X { X#ifdef KEYB_DEBUG X printf("doreset(): keyboard is at\n"); X#endif X keyboard_type = KB_AT; X } X else X { X#ifdef KEYB_DEBUG X printf("doreset(): keyboard is of unknown type\n"); X#endif X keyboard_type = KB_UNKNOWN; X } X X#ifdef KEYB_DEBUG X printf("doreset() calls irq_8042()!\n"); X#endif X X irq_8042(1); /* enable 8042 OBF irq's */ X X#ifdef KEYB_DEBUG X#ifndef KEYB_DEBUG_ALL X kbd_debug_on = 0; X#endif X#endif X} X X X/*---------------------------------------------------------------------------* X * update keyboard led's X *---------------------------------------------------------------------------*/ Xvoid update_led() X{ X ledstate = kbd_scroll | 2*(vsp->num) | 4*caps; X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("update_led() calls keyboard_cmd!\n"); X#endif X keyboard_cmd(1, KEYB_C_LEDS, ledstate); /* LED Command */ X} X X X/*---------------------------------------------------------------------------* X * set typamatic rate X *---------------------------------------------------------------------------*/ Xstatic void settpmrate(int rate) X{ X tpmrate = rate & 0x7f; X#ifdef KEYB_DEBUG Xif(kbd_debug_on) X printf("settpmrate() calls keyboard_cmd!\n"); X#endif X X printf("settpmrate() calls keyboard_cmd, rate=0x%x, tpmrate=0x%x!\n",rate,tpmrate); X X keyboard_cmd(1, KEYB_C_TYPEM, tpmrate); /* Typematic Command */ X} X X#endif /* OLDKEYBOARDSTUFF */ X X/*---------------------------------------------------------------------------* X * probe for device ( = init keyboard code) X *---------------------------------------------------------------------------*/ Xpcprobe(struct isa_device *dev) X{ X doreset(); X ovlinit(0); X return 1; X} X X/*---------------------------------------------------------------------------* X * init keyboard overlay table X *---------------------------------------------------------------------------*/ Xstatic ovlinit(force) X{ X register i; X X if (force || ovlinitflag==0) X { X for (i=0; i<OVLTBL_SIZE; i++) X { X ovltbl[i].keynum = X ovltbl[i].type = 0; X ovltbl[i].unshift[0] = X ovltbl[i].shift[0] = X ovltbl[i].ctrl[0] = X ovltbl[i].altgr[0] = 0; X ovltbl[i].subu = X ovltbl[i].subs = X ovltbl[i].subc = X ovltbl[i].suba = KBD_SUBT_STR; /* just strings .. */ X } X for (i=0; i<=MAXKEYNUM; i++) X key2ascii[i].type &= KBD_MASK; X ovlinitflag = 1; X } X} X X/*---------------------------------------------------------------------------* X * get original key definition X *---------------------------------------------------------------------------*/ Xstatic int getokeydef(unsigned key, Ovl_tbl *thisdef) X{ X if(key == 0 || key > MAXKEYNUM) X return EINVAL; X X thisdef->keynum = key; X thisdef->type = key2ascii[key].type; X X if(key2ascii[key].unshift.subtype == STR) X { X bcopyb(key2ascii[key].unshift.what, thisdef->unshift, CODE_SIZE); X thisdef->subu = KBD_SUBT_STR; X } X else X { X bcopyb("", thisdef->unshift, CODE_SIZE); X thisdef->subu = KBD_SUBT_FNC; X } X X if(key2ascii[key].shift.subtype == STR) X { X bcopyb(key2ascii[key].shift.what,thisdef->shift, CODE_SIZE); X thisdef->subs = KBD_SUBT_STR; X } X else X { X bcopyb("",thisdef->shift,CODE_SIZE); X thisdef->subs = KBD_SUBT_FNC; X } X X if(key2ascii[key].ctrl.subtype == STR) X { X bcopyb(key2ascii[key].ctrl.what,thisdef->ctrl, CODE_SIZE); X thisdef->subc = KBD_SUBT_STR; X } X else X { X bcopyb("",thisdef->ctrl,CODE_SIZE); X thisdef->subc = KBD_SUBT_FNC; X } X X /* deliver at least anything for ALTGR settings ... */ X X if(key2ascii[key].unshift.subtype == STR) X { X bcopyb(key2ascii[key].unshift.what,thisdef->altgr, CODE_SIZE); X thisdef->suba = KBD_SUBT_STR; X } X else X { X bcopyb("",thisdef->altgr, CODE_SIZE); X thisdef->suba = KBD_SUBT_FNC; X } X return 0; X} X X/*---------------------------------------------------------------------------* X * get current key definition X *---------------------------------------------------------------------------*/ Xstatic int getckeydef(unsigned key, Ovl_tbl *thisdef) X{ X u_short type = key2ascii[key].type; X X if (key>MAXKEYNUM) X return EINVAL; X X if (type & KBD_OVERLOAD) X *thisdef = ovltbl[key2ascii[key].ovlindex]; X else X getokeydef(key,thisdef); X X return 0; X} X X/*---------------------------------------------------------------------------* X * translate keynumber and returns ptr to associated ascii string X * if key is bound to a function, executes it, and ret empty ptr X *---------------------------------------------------------------------------*/ Xstatic u_char *xlatkey2ascii(u_short key) X{ X static u_char capchar[2],metachar[2]; X static Ovl_tbl thisdef; X u_short n; X void (*fnc)(); X X if (key==0) /* ignore the NON-KEY */ X return 0; X X getckeydef(key&0x7F, &thisdef); /* get the current ASCII value */ X X thisdef.type &= KBD_MASK; X X if (key&0x80) /* special handling of ALT-KEYPAD */ X { X /* is the ALT Key released? */ X if (thisdef.type==KBD_META || thisdef.type==KBD_ALTGR) X { X if (altkpflag) /* have we been in altkp mode? */ X { X capchar[0] = altkpval; X capchar[1] = 0; X altkpflag = 0; X altkpval = 0; X return capchar; X } X } X return 0; X } X X switch (thisdef.type) /* convert the keys */ X { X case KBD_BREAK: X case KBD_ASCII: X case KBD_FUNC: X fnc = NULL; X more_chars = NULL; X X if (altgr_down) X more_chars = (u_char *)thisdef.altgr; X X else if (shift_down || shiftlock) X { X if(key2ascii[key].shift.subtype == STR) X more_chars = (u_char *)thisdef.shift; X else X fnc = key2ascii[key].shift.what.func; X } X X else if (ctrl_down) X { X if(key2ascii[key].ctrl.subtype == STR) X more_chars = (u_char *)thisdef.ctrl; X else X fnc = key2ascii[key].ctrl.what.func; X } X X else X { X if(key2ascii[key].unshift.subtype == STR) X more_chars = (u_char *)thisdef.unshift; X else X fnc = key2ascii[key].unshift.what.func; X } X X if(fnc) X (*fnc)(); /* execute function */ X X if((more_chars != NULL) && (more_chars[1] == 0)) X { X capchar[1] = metachar[1] = 0; /* just in case */ X if (caps && more_chars[0] >= 'a' X && more_chars[0] <= 'z') X { X capchar[0] = *more_chars - ('a'-'A'); X more_chars = capchar; X } X if (meta_down) X { X metachar[0] = *more_chars | 0x80; X more_chars = metachar; X } X } X return(more_chars); X X case KBD_KP: X fnc = NULL; X more_chars = NULL; X X if(meta_down) X { X switch(key) X { X case 95: /* / */ X altkpflag = 0; X more_chars = X (u_char *)"\033OQ"; X return(more_chars); X X case 100: /* * */ X altkpflag = 0; X more_chars = X (u_char *)"\033OR"; X return(more_chars); X X case 105: /* - */ X altkpflag = 0; X more_chars = X (u_char *)"\033OS"; X return(more_chars); X } X } X X if(meta_down || altgr_down) X { X if((n = keypad2num[key-91]) >= 0) X { X if (!altkpflag) X { X /* start ALT-KP mode */ X altkpflag = 1; X altkpval = 0; X } X altkpval *= 10; X altkpval += n; X } X else X altkpflag = 0; X return 0; X } X X if (!(vsp->num) || extended) X { X if(key2ascii[key].shift.subtype == STR) X more_chars = (u_char *)thisdef.shift; X else X fnc = key2ascii[key].shift.what.func; X } X else X { X if(key2ascii[key].unshift.subtype == STR) X more_chars = (u_char *)thisdef.unshift; X else X fnc = key2ascii[key].unshift.what.func; X } X X if(fnc) X (*fnc)(); /* execute function */ X return(more_chars); X X case KBD_CURSOR: X fnc = NULL; X more_chars = NULL; X X if(vsp->ckm) X { X if(key2ascii[key].shift.subtype == STR) X more_chars = (u_char *)thisdef.shift; X else X fnc = key2ascii[key].shift.what.func; X } X else X { X if(key2ascii[key].unshift.subtype == STR) X more_chars = (u_char *)thisdef.unshift; X else X fnc = key2ascii[key].unshift.what.func; X } X X if(fnc) X (*fnc)(); /* execute function */ X return(more_chars); X X case KBD_NUM: /* special kp-num handling */ X more_chars = NULL; X X if(meta_down) X { X more_chars = (u_char *)"\033OP"; /* PF1 */ X } X else X { X vsp->num ^= 1; X update_led(); X } X return(more_chars); X X case KBD_RETURN: X more_chars = NULL; X X if (!(vsp->num)) X { X more_chars = (u_char *)thisdef.shift; X } X else X { X more_chars = (u_char *)thisdef.unshift; X } X if (vsp->lnm && (*more_chars == '\r')) X { X more_chars = (u_char *)"\r\n"; /* CR LF */ X } X return(more_chars); X X case KBD_META: /* these keys are */ X case KBD_ALTGR: /* handled directly */ X case KBD_SCROLL: /* by the keyboard */ X case KBD_CAPS: /* handler - they are */ X case KBD_SHFTLOCK: /* ignored here */ X case KBD_CTL: X case KBD_NONE: X default: X return 0; X } X} X X/*---------------------------------------------------------------------------* X * get keystrokes from the keyboard. X * if noblock = 0, wait until a key is pressed. X * else return 0 if no characters present. X *---------------------------------------------------------------------------*/ Xu_char *sgetc(int noblock) X{ X u_char dt; X unsigned key; X u_short type; X X static u_char breakseen = 0; X static u_char breakshit = 0; X static char keybuf[2]; X Xloop: X /* see if there is something from the keyboard in the input buffer */ X X if (inb(CONTROLLER_CTRL) & STATUS_OUTPBF) X dt = inb(CONTROLLER_DATA); /* yes, get it ! */ X else X { X if (noblock) X return 0; X else X goto loop; X } X X /* lets look what we got */ X switch (dt) X { X case 0xFE: X case 0xFA: X case 0x00: X case 0xFD: X case 0xAA: X case 0xEE: /* this is junk we do not want to see */ X break; X X case 0xe0: /* extended code? */ X extended = 1; X break; X X case 0xf0: /* break code? */ X breakseen = 1; X if (breakshit) /* =5: wait for 14 */ X breakshit++; /* =7: wait for 77 */ X break; X X case 0xe1: /* -hv- the BREAK key */ X /* we have to collect a sequence E1 14 77 E1 for make X and F0 14 F0 77 for break */ X X breakshit++; /* state=1: wait for 14, state=4: have make */ X X if(breakshit == 4) X { X dt = 0x80; /* build replacement code */ X goto regular; X } X break; X X case 0x14: X if (breakshit) X breakshit++; /* =2: wait for 77 */ X else /* =6: needs second break; */ X goto regular; X break; X X case 0x77: X if (breakshit) X breakshit++; /* =3: wait for E1 */ X else /* =7: needs second break; */ X goto regular; X X if (breakshit==8) X { X dt = 0x80; /* build replacement code */ X breakshit = 0; X goto regular; X } X break; X X default: X goto regular; /* regular key */ X } X X if (noblock) X return 0; X else X goto loop; X X /* got a normal scan key */ Xregular: X X /* Check for cntl-alt-del */ X X if ((dt == 0x71) && ctrl_down && (meta_down||altgr_down)) X cpu_reset(); X X X#include "ddb.h" X#if NDDB > 0 X X /* Check for cntl-alt-esc */ X X if ((dt == 0x76) && ctrl_down && (meta_down||altgr_down)) X Debugger(); X#endif X X /* make a keycode from scan code */ X X key = extended ? extscantokey[dt] : scantokey[dt]; X extended = 0; X X /* in NOREPEAT MODE ignore the key if it was the same as before */ X X if (!kbrepflag && key == kbd_lastkey && !breakseen) X { X if (noblock) X return 0; X else X goto loop; X } X X type = key2ascii[key].type; X X if (type & KBD_OVERLOAD) X type = ovltbl[key2ascii[key].ovlindex].type; X X type &= KBD_MASK; X X switch (type) X { X case KBD_SHFTLOCK: X if(!breakseen) X shiftlock ^= 1; X goto nullkeys; X X case KBD_CAPS: X if (!breakseen) X { X caps ^= 1; X update_led(); X } X goto nullkeys; X X case KBD_SCROLL: X if (!breakseen) X { X kbd_scroll ^= 1; X update_led(); X } X goto nullkeys; X X case KBD_SHIFT: X shift_down = breakseen ? 0 : 1; X goto nullkeys; X X case KBD_META: X meta_down = breakseen ? 0 : 0x80; X goto nullkeys; X X case KBD_ALTGR: X altgr_down = breakseen ? 0 : 1; X goto nullkeys; X X case KBD_CTL: X ctrl_down = breakseen ? 0 : 1; X goto nullkeys; X X case KBD_NONE: X goto nullkeys; X X default: X break; /* deliver a key */ X } X Xnullkeys: X if (breakseen) X { X key |= 0x80; X breakseen = 0; X kbd_lastkey = 0; /* -hv- I know this is a bug with */ X } /* N-Key-Rollover, but I ignore that */ X else /* because avoidance is too complicated */ X kbd_lastkey = key; X X return xlatkey2ascii(key); /* have a key */ X} X X/*---------------------------------------------------------------------------* X * reflect status of locking keys & set led's X *---------------------------------------------------------------------------*/ Xstatic void setlockkeys(int snc) X{ X kbd_scroll = snc & 1; X vsp->num = (snc & 2) ? 1 : 0; X caps = (snc & 4) ? 1 : 0; X update_led(); X} X X/*---------------------------------------------------------------------------* X * remove a key definition X *---------------------------------------------------------------------------*/ Xstatic int rmkeydef(int key) X{ X register Ovl_tbl *ref; X X if (key==0 || key > MAXKEYNUM) X return EINVAL; X X if (key2ascii[key].type & KBD_OVERLOAD) X { X ref = &ovltbl[key2ascii[key].ovlindex]; X ref->keynum = 0; X ref->type = 0; X ref->unshift[0] = X ref->shift[0] = X ref->ctrl[0] = X ref->altgr[0] = 0; X key2ascii[key].type &= KBD_MASK; X } X return 0; X} X X/*---------------------------------------------------------------------------* X * overlay a key X *---------------------------------------------------------------------------*/ Xstatic int setkeydef(Ovl_tbl *data) X{ X register i; X X if( data->keynum > MAXKEYNUM || X (data->type & KBD_MASK) == KBD_BREAK || X (data->type & KBD_MASK) > KBD_SHFTLOCK) X return EINVAL; X X data->unshift[KBDMAXOVLKEYSIZE] = X data->shift[KBDMAXOVLKEYSIZE] = X data->ctrl[KBDMAXOVLKEYSIZE] = X data->altgr[KBDMAXOVLKEYSIZE] = 0; X X data->subu = X data->subs = X data->subc = X data->suba = KBD_SUBT_STR; /* just strings .. */ X X data->type |= KBD_OVERLOAD; /* mark overloaded */ X X /* if key already overloaded, use that slot else find free slot */ X X if (key2ascii[data->keynum].type & KBD_OVERLOAD) X { X i = key2ascii[data->keynum].ovlindex; X } X else X { X for (i=0; i<OVLTBL_SIZE; i++) X if (ovltbl[i].keynum==0) X break; X X if (i==OVLTBL_SIZE) X return ENOSPC; /* no space, abuse of ENOSPC(!) */ X } X X ovltbl[i] = *data; /* copy new data string */ X X key2ascii[data->keynum].type |= KBD_OVERLOAD; /* mark key */ X key2ascii[data->keynum].ovlindex = i; X X return 0; X} X X/*---------------------------------------------------------------------------* X * keyboard ioctl's entry X *---------------------------------------------------------------------------*/ Xint kbdioctl(dev_t dev, int cmd, caddr_t data, int flag) X{ X int key; X X switch (cmd) X { X case KBDRESET: X doreset(); X ovlinit(1); X settpmrate(KBD_TPD500|KBD_TPM100); X setlockkeys(0); X break; X X case KBDGTPMAT: X *(int *)data = tpmrate; X break; X X case KBDSTPMAT: X settpmrate(*(int *)data); X break; X X case KBDGREPSW: X *(int *)data = kbrepflag; X break; X X case KBDSREPSW: X kbrepflag = (*(int *)data) & 1; X break; X X case KBDGLEDS: X *(int *)data = ledstate; X break; X X case KBDSLEDS: X update_led(); /* ??? */ X break; X X case KBDGLOCK: X *(int *)data = (kbd_scroll | (vsp->num)*2 | caps*4); X break; X X case KBDSLOCK: X setlockkeys(*(int *)data); X break; X X case KBDGCKEY: X key = ((Ovl_tbl *)data)->keynum; X return getckeydef(key,(Ovl_tbl *)data); X X case KBDSCKEY: X key = ((Ovl_tbl *)data)->keynum; X return setkeydef((Ovl_tbl *)data); X X case KBDGOKEY: X key = ((Ovl_tbl *)data)->keynum; X return getokeydef(key,(Ovl_tbl *)data); X X case KBDRMKEY: X key = *(int *)data; X return rmkeydef(key); X X case KBDDEFAULT: X ovlinit(1); X break; X X default: X /* proceed with vga ioctls */ X return -1; X } X return 0; X} X X/* ------------------------------- EOF -------------------------------------*/ SHAR_EOF $TOUCH -am 0114130693 pcvt_kbd.c && chmod 0660 pcvt_kbd.c || echo "restore of pcvt_kbd.c failed" set `wc -c pcvt_kbd.c`;Wc_c=$1 if test "$Wc_c" != "74085"; then echo original size 74085, current size $Wc_c fi fi echo "End of part 9, continue with part 10" exit 0 -- hellmuth michaelis HCS Hanseatischer Computerservice GmbH hamburg, europe hm@hcshh.hcs.de tel: +49/40/55903-170 fax: +49/40/5591486