Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP
id AA6935 ; Fri, 15 Jan 93 10:39:28 EST
Path: sserve!manuel.anu.edu.au!munnari.oz.au!bunyip.cc.uq.oz.au!uqcspe!cs.uq.oz.au!cjb
From: cjb@cs.uq.oz.au (Christopher J Biggs)
Newsgroups: comp.unix.bsd
Subject: [386BSD] Some patches to syscons driver
Message-ID: <11711@uqcspe.cs.uq.oz.au>
Date: 17 Jan 93 05:59:39 GMT
Sender: news@cs.uq.oz.au
Reply-To: cjb@cs.uq.oz.au
Lines: 293
I recently installed Soeren Schmidt's syscons PC console driver on my
386BSD system, replacing my own rather hacked up version of the original
pccons driver.
The syscons driver seems to think that the RIGHT-control and -alt keys
return separate scancodes, rather than an 0xE0 escape code as in a
PC 101-key keyboard. The existing code to handle 0xE0 codes was wrong, as
the delay between receiving the two codes of an extended keypress is long
enough for the driver to reset the extend keypress flag (esc_flag). I fixed
this (mostly by cribbing from pccons).
I've patched the driver to do the following things:
Distinguish PROPERLY between left- and right-ctl/alt keys
Introduce a META key (useful for emacs)
Allow CTL-SPACE to return ASCII NUL
Swap CTRL and CAPS
The patches below are meant to be installed wherever you unpacked the
syscons (v1) distribution. To get the added functionality, add the line
option KBD101
to your config file and remake (or just #define KBD101 at top of syscons.c).
Enjoy,
C J Biggs.
------------ CUT HERE ---------------------
*** console.h.orig Tue Jan 5 08:25:37 1993
--- console.h Sat Jan 16 15:01:25 1993
***************
*** 44,51 ****
--- 44,53 ----
#define CONS_80x50TEXT _IO('c', 103)
/* compatibility to old pccons & X386 */
+ /*
#define CONSOLE_X_MODE_ON _IO('t', 121)
#define CONSOLE_X_MODE_OFF _IO('t', 122)
+ */
#define KD_TEXT 0
#define KD_GRAPHICS 1
***************
*** 108,113 ****
--- 110,118 ----
#define LCTR 0x09
#define RCTR 0x7b
#define RALT 0x7c
+ #ifdef KBD101
+ #define META 0x7f /* Picked this at random. cjb */
+ #endif
#define F_SCR 11 /* switch to first screen */
#define L_SCR 26 /* switch to last screen */
*** kbdtables.h.orig Tue Jan 5 08:26:30 1993
--- kbdtables.h Sat Jan 16 15:01:36 1993
***************
*** 77,83 ****
/* sc=37 */ '*', '*', '*', '*', '*', '*', '*', '*', 0x33, 0x00,
/* sc=38 */ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT, 0xFF, 0x00,
/* sc=39 */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x00, 0x00,
! /* sc=3a */ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
/* sc=3d */ F( 3), F(15), F(27), F(39), S( 3), S(13), S( 3), S(13), 0xFF, 0x00,
--- 77,83 ----
/* sc=37 */ '*', '*', '*', '*', '*', '*', '*', '*', 0x33, 0x00,
/* sc=38 */ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT, 0xFF, 0x00,
/* sc=39 */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x00, 0x00,
! /* sc=3a */ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
/* sc=3d */ F( 3), F(15), F(27), F(39), S( 3), S(13), S( 3), S(13), 0xFF, 0x00,
***************
*** 130,135 ****
--- 130,137 ----
#else
+ /* HACK HACK -- LEFT alt is now META, CAPS and LEFT ctl are swapped */
+
keymap_t key_map = { 107, /* US iso8859 keymap */
/* alt
* scan cntrl alt alt cntrl
***************
*** 165,171 ****
--- 167,177 ----
/* sc=1a */ '[', '{', 0x1B, 0x1B, '[', '{', 0x1B, 0x1B, 0x00, 0x00,
/* sc=1b */ ']', '}', 0x1D, 0x1D, ']', '}', 0x1D, 0x1D, 0x00, 0x00,
/* sc=1c */ 0x0D, 0x0D, 0x0A, 0x0A, 0x0D, 0x0D, 0x0A, 0x0A, 0x00, 0x00,
+ #ifdef KBD101
+ /* sc=1d */ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
+ #else
/* sc=1d */ LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, 0xFF, 0x00,
+ #endif
/* sc=1e */ 'a', 'A', 0x01, 0x01, 'a', 'A', 0x01, 0x01, 0x00, 0x01,
/* sc=1f */ 's', 'S', 0x13, 0x13, 's', 'S', 0x13, 0x13, 0x00, 0x01,
/* sc=20 */ 'd', 'D', 0x04, 0x04, 'd', 'D', 0x04, 0x04, 0x00, 0x01,
***************
*** 192,200 ****
--- 198,212 ----
/* sc=35 */ '/', '?', NOP, NOP, '/', '?', NOP, NOP, 0x33, 0x00,
/* sc=36 */ RSH, RSH, RSH, RSH, RSH, RSH, RSH, RSH, 0xFF, 0x00,
/* sc=37 */ '*', '*', 0x0A, 0x0A, '*', '*', 0x0A, 0x0A, 0x33, 0x00,
+ #ifdef KBD101
+ /* sc=38 */ META, META, META, META, META, META, META, META, 0xFF, 0x00,
+ /* sc=39 */ ' ', ' ', 0x0, ' ', ' ', ' ', ' ', ' ', 0x00, 0x00,
+ /* sc=3a */ LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, 0xFF, 0x00,
+ #else
/* sc=38 */ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT, 0xFF, 0x00,
/* sc=39 */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x00, 0x00,
/* sc=3a */ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
+ #endif
/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
/* sc=3d */ F( 3), F(15), F(27), F(39), S( 3), S(13), S( 3), S(13), 0xFF, 0x00,
*** syscons.c.orig Tue Jan 5 08:27:17 1993
--- syscons.c Sat Jan 16 15:01:44 1993
***************
*** 124,129 ****
--- 124,132 ----
static u_short *crtat = 0;
static u_int addr_6845 = MONO_BASE;
static u_char shfts, ctls, alts, caps, num, stp, scroll;
+ #ifdef KBD101
+ static u_char metas;
+ #endif
static const u_int n_fkey_tab = sizeof (fkey_tab) / sizeof (*fkey_tab);
static int cur_cursor_pos = -1;
static int in_putc, nx_scr;
***************
*** 1249,1259 ****
u_char dt;
u_int state, action;
struct key_t *key;
! static u_int esc_flag;
loop:
- esc_flag = 0;
- next_code:
/* First see if there is something in the keyboard port */
if (inb (KBSTAT) & 1)
dt = inb (KBDATA);
--- 1252,1260 ----
u_char dt;
u_int state, action;
struct key_t *key;
! static u_int esc_flag=0;
loop:
/* First see if there is something in the keyboard port */
if (inb (KBSTAT) & 1)
dt = inb (KBDATA);
***************
*** 1274,1284 ****
if (cur_scr_stat->status & KBD_RAW_MODE)
return dt;
! if ((dt & ~1) == 0xE0) {
! esc_flag = dt - 0xE0 + 1;
! goto next_code;
}
if ((dt & 0x7F) >= key_map.n_keys)
goto loop;
state = (shfts ? 1 : 0 ) | (2 * (ctls ? 1 : 0)) | (4 * (alts ? 1 : 0));
--- 1275,1301 ----
if (cur_scr_stat->status & KBD_RAW_MODE)
return dt;
! if (dt == 0xE0) {
! esc_flag = 1;
! goto loop;
}
+
+
+ #ifdef KBD101
+ /* Well, MY keyboard doesn't return scancodes above 0x58, and the
+ original version of syscons reckons RCTR and RALT live up here.
+ In my world they share LCTR and LALT but with esc_flag set.
+ Here's a quick and-dirty hack to map a to b. */
+
+ if ( ((dt&0x7f)==0x1d/*LCTR*/) && (esc_flag))
+ dt=((dt&0x80)|0x5a); /* RCTR */
+ else
+ if (((dt&0x7f)==0x38/*LALT*/) && (esc_flag))
+ dt=((dt&0x80)|0x5d);/*RALT*/
+ #endif
+ esc_flag=0;
+
if ((dt & 0x7F) >= key_map.n_keys)
goto loop;
state = (shfts ? 1 : 0 ) | (2 * (ctls ? 1 : 0)) | (4 * (alts ? 1 : 0));
***************
*** 1287,1292 ****
--- 1304,1310 ----
|| ((key->flgs & FLAG_LOCK_N) && num))
state ^= 1;
+
/* Check for make/break */
action = key->map[state];
if (dt & 0x80) {
***************
*** 1305,1310 ****
--- 1323,1333 ----
case RCTR:
ctls &= ~2;
break;
+ #ifdef KBD101
+ case META:
+ metas = 0x0;
+ break;
+ #endif
case LALT:
alts &= ~1;
break;
***************
*** 1344,1349 ****
--- 1367,1377 ----
case RCTR:
ctls |= 2;
break;
+ #ifdef KBD101
+ case META:
+ metas = 0x80;
+ break;
+ #endif
case LALT:
alts |= 1;
break;
***************
*** 1356,1367 ****
break;
}
if (action >= F_FN && action <= L_FN) {
return (action | FKEY);
}
! return (action);
}
}
! else return (action);
}
goto loop;
}
--- 1384,1407 ----
break;
}
if (action >= F_FN && action <= L_FN) {
+ #ifdef KBD101
+ return (action | FKEY) ^ metas;
+ #else
return (action | FKEY);
+ #endif
}
! #ifdef KBD101
! return (action ^ metas);
! #else
! return action;
! #endif
}
}
! #ifdef KBD101
! else return (action ^ metas );
! #else
! else return action;
! #endif
}
goto loop;
}
***************
*** 1483,1486 ****
}
}
! #endif
--- 1523,1527 ----
}
}
!
! #endif
--
Christopher J Biggs cjb@cs.uq.oz.au | "You can have peace, or you can
Department of Computer Science, | have freedom. Don't ever count on
The University of Queensland, Australia | having both..." -- Lazarus Long
------------veni vidi nuclei deceiri - I came, I saw, I dumped core------------