Mappings for a Meta-Key.

Keith Gabryelski ag at portnoy.UUCP
Sat May 7 04:40:35 AEST 1988


After getting Emacs working on our 386 Sco Xenix system I noticed the
alt key was not working.  That is, it didn't set bit 7 as a normal
alt-key (meta-key) should.  In fact, it apparently didn't do anything
at all.  Well, I thought, this just sucks.  This must be fixed.

Closer inspection into Sco Xenix documention (RTFM) revealed a very
robust keyboard mapping scheme.  Using mapkey(M) and its counter parts
mapstr(M), and mapscrn(M) you (the system administrator) can set your
console keyboard to do most anything.  You can also setup keyboard
maps on a per screen basis.

Several keymaps are supplied with your sco xenix system.  They are in
the directory /usr/lib/keyboard and are used to remap keyboards for
use in other countries.

Below is the mapkey file I have installed on my system.  This map
makes the alt-key a true "Meta-key".  I have this mapkey loaded at
boot time from /etc/rc.

A meta key is similar to a control key in that you hold it down and
press another key to get a key not usually available on you keyboard
EXCEPT instead of sending a value from 0x00 (^@) to 0x1F (^_) [the
control characters] the meta key will send a value from 0x80 (~^@)
to 0xFF (~^?) [the meta-characters].

I have included a program called "octopus" which when run will give
you information on the keys sent from the keyboard.

To use the keymap.  Place the keymap into a file and type:

	mapkey FILENAME

	[You might want to sick this file in /usr/lib/keyboard and
	 remap your keyboard in /etc/rc]

Now, hold down the `alt' key and press 'a'.  You should see a letter
'a' with an accent mark over it.  You've just sent 0xE1 (meta-a) to
your shell.

Note:
	I did something weird with Alt-Shift-Tab.  This should give
	you a Meta-Backtab (whatever that is) but I replaced it with
	Meta-Esc.

	Also, Control-Shift-? is a delete (0x7F) so Meta-Control-Shift-?
	is 0xFF.

	I could of mapped Control-Space to 0x00, but I didn't.

To use octopus. Place the source code in a file called `octopus.c' and
type:

	cc -o octopus octopus.c
	./octopus

Sample output of octopus follows:

 binary  oct dec hex asc sym text
01100001 141  97  61  a   a  Lowercase-Letter-a
01100010 142  98  62  b   b  Lowercase-Letter-b
01100011 143  99  63  c   c  Lowercase-Letter-c
01100100 144 100  64  d   d  Lowercase-Letter-d
00000001   1   1   1 soh ^A  Start of Header
00000010   2   2   2 stx ^B  Start of Text
00000011   3   3   3 etx ^C  End of Text
11100001 341 225  e1     ~a  Meta-a
11100010 342 226  e2     ~b  Meta-b
11100011 343 227  e3     ~c  Meta-c
11100100 344 228  e4     ~d  Meta-d
11000001 301 193  c1     ~A  Meta-A
11000010 302 194  c2     ~B  Meta-B
11000011 303 195  c3     ~C  Meta-C
11000100 304 196  c4     ~D  Meta-D
10000001 201 129  81     ~^A Meta-Control-A
10000010 202 130  82     ~^B Meta-Control-B
10000011 203 131  83     ~^C Meta-Control-C
10000100 204 132  84     ~^D Meta-Control-D
01111111 177 127  7f     ^? Delete
00000000   0   0   0 nul ^@  Null
00000100   4   4   4 eot ^D  End of Transmission
Quit (y or n)? Yes.

----- metakeys --------------------- cut me -----------------------------
#                                                        alt
# scan                      cntrl          alt    alt   cntrl  lock
# code  base  shift  cntrl  shift   alt   shift  cntrl  shift  state
     0  nop    nop    nop    nop    nop    nop    nop    nop     O
     1  esc    esc    nop    nop    0x9b   0x9b   nop    nop     O
     2  '1'    '!'    nop    nop    0xb1   0xa1   nop    nop     O
     3  '2'    '@'    nul    nul    0xb2   0xc0   0x80   0x80    O
     4  '3'    '#'    nop    nop    0xb3   0xa3   nop    nop     O
     5  '4'    '$'    nop    nop    0xb4   0xa4   nop    nop     O
     6  '5'    '%'    nop    nop    0xb5   0xa5   nop    nop     O
     7  '6'    '^'    rs     rs     0xb6   0xde   0x9e   0x9e    O
     8  '7'    '&'    nop    nop    0xb7   0xa6   nop    nop     O
     9  '8'    '*'    nop    nop    0xb8   0xaa   nop    nop     O
    10  '9'    '('    nop    nop    0xb9   0xa8   nop    nop     O
    11  '0'    ')'    nop    nop    0xb0   0xa9   nop    nop     O
    12  '-'    '_'    ns     ns     0xad   0xdf   0x9f   0x9f    O
    13  '='    '+'    nop    nop    0xbd   0xab   nop    nop     O
    14  bs     bs     del    del    0x88   0x88   0xff   0xff    O
    15  ht     btab   nop    nop    0x89   0x9b   nop    nop     O
    16  'q'    'Q'    dc1    dc1    0xf1   0xd1   0x91   0x91    C
    17  'w'    'W'    etb    etb    0xf7   0xd7   0x97   0x97    C
    18  'e'    'E'    enq    enq    0xe5   0xc5   0x85   0x85    C
    19  'r'    'R'    dc2    dc2    0xf2   0xd2   0x92   0x92    C
    20  't'    'T'    dc4    dc4    0xf4   0xd4   0x94   0x94    C
    21  'y'    'Y'    em     em     0xf9   0xd9   0x99   0x99    C
    22  'u'    'U'    nak    nak    0xf5   0xd5   0x95   0x95    C
    23  'i'    'I'    ht     ht     0xe9   0xc9   0x89   0x89    C
    24  'o'    'O'    si     si     0xef   0xcf   0x8f   0x8f    C
    25  'p'    'P'    dle    dle    0xf0   0xd0   0x90   0x90    C
    26  '['    '{'    esc    esc    0xdb   0xfb   0x9b   0x9b    O
    27  ']'    '}'    gs     gs     0xdd   0xfd   0x9d   0x9d    O
    28  cr     cr     nl     nl     0x8d   0x8d   0x8a   0x8a    O
    29  ctrl   ctrl   ctrl   ctrl   ctrl   ctrl   ctrl   ctrl    O
    30  'a'    'A'    soh    soh    0xe1   0xc1   0x81   0x81    C
    31  's'    'S'    dc3    dc3    0xf3   0xd3   0x93   0x93    C
    32  'd'    'D'    eot    eot    0xe4   0xc4   0x84   0x84    C
    33  'f'    'F'    ack    ack    0xe6   0xc6   0x86   0x86    C
    34  'g'    'G'    bel    bel    0xe7   0xc7   0x87   0x87    C
    35  'h'    'H'    bs     bs     0xe8   0xc8   0x88   0x88    C
    36  'j'    'J'    nl     nl     0xea   0xca   0x8a   0x8a    C
    37  'k'    'K'    vt     vt     0xeb   0xcb   0x8b   0x8b    C
    38  'l'    'L'    np     np     0xec   0xcc   0x8c   0x8c    C
    39  ';'    ':'    nop    nop    0xbb   0xba   nop    nop     O
    40  '\''   '"'    nop    nop    0xa7   0xa2   nop    nop     O
    41  '`'    '~'    nop    nop    0xd0   0xfe   nop    nop     O
    42  lshift lshift lshift lshift lshift lshift lshift lshift  O
    43  '\\'   '|'    fs     fs     0xdc   0x7c   0x9c   0x9c    O
    44  'z'    'Z'    sub    sub    0xfa   0xda   0x9a   0x9a    C
    45  'x'    'X'    can    can    0xf8   0xd8   0x98   0x98    C
    46  'c'    'C'    etx    etx    0xe3   0xc3   0x83   0x83    C
    47  'v'    'V'    syn    syn    0xf6   0xd6   0x96   0x96    C
    48  'b'    'B'    stx    stx    0xe2   0xc2   0x82   0x82    C
    49  'n'    'N'    so     so     0xee   0xce   0x8e   0x8e    C
    50  'm'    'M'    cr     cr     0xed   0xcd   0x8d   0x8d    C
    51  ','    '<'    nop    nop    0xac   0xbc   nop    nop     O
    52  '.'    '>'    nop    nop    0xae   0xbe   nop    nop     O
    53  '/'    '?'    nop    0x7f   0xaf   0xbf   nop    0xff    O
    54  rshift rshift rshift rshift rshift rshift rshift rshift  O
    55  '*'    '*'    nscr   nscr   '*'    '*'    nscr   nscr    O
    56  alt    alt    alt    alt    alt    alt    alt    alt     O
    57  ' '    ' '    ' '    ' '    ' '    ' '    ' '    ' '     O
    58  clock  clock  clock  clock  clock  clock  clock  clock   O
    59  fkey1  fkey13 fkey25 fkey37 scr1   scr11  scr1   scr11   O
    60  fkey2  fkey14 fkey26 fkey38 scr2   scr12  scr2   scr12   O
    61  fkey3  fkey15 fkey27 fkey39 scr3   scr13  scr3   scr13   O
    62  fkey4  fkey16 fkey28 fkey40 scr4   scr14  scr4   scr14   O
    63  fkey5  fkey17 fkey29 fkey41 scr5   scr15  scr5   scr15   O
    64  fkey6  fkey18 fkey30 fkey42 scr6   scr16  scr6   scr16   O
    65  fkey7  fkey19 fkey31 fkey43 scr7   scr7   scr7   scr7    O
    66  fkey8  fkey20 fkey32 fkey44 scr8   scr8   scr8   scr8    O
    67  fkey9  fkey21 fkey33 fkey45 scr9   scr9   scr9   scr9    O
    68  fkey10 fkey22 fkey34 fkey46 scr10  scr10  scr10  scr10   O
    69  nlock  nlock  dc3    dc3    nlock  nlock  dc3    dc3     O
    70  slock  slock  del    del    slock  slock  del    del     O
    71  fkey49 '7'    '7'    '7'    '7'    '7'    '7'    '7'     N
    72  fkey50 '8'    '8'    '8'    '8'    '8'    '8'    '8'     N
    73  fkey51 '9'    '9'    '9'    '9'    '9'    '9'    '9'     N
    74  fkey52 '-'    '-'    '-'    '-'    '-'    '-'    '-'     N
    75  fkey53 '4'    '4'    '4'    '4'    '4'    '4'    '4'     N
    76  fkey54 '5'    '5'    '5'    '5'    '5'    '5'    '5'     N
    77  fkey55 '6'    '6'    '6'    '6'    '6'    '6'    '6'     N
    78  fkey56 '+'    '+'    '+'    '+'    '+'    '+'    '+'     N
    79  fkey57 '1'    '1'    '1'    '1'    '1'    '1'    '1'     N
    80  fkey58 '2'    '2'    '2'    '2'    '2'    '2'    '2'     N
    81  fkey59 '3'    '3'    '3'    '3'    '3'    '3'    '3'     N
    82  fkey60 '0'    '0'    '0'    '0'    '0'    '0'    '0'     N
    83  del    '.'    del    del    del    del    del    del     N
    84  0xad   0xad   nop    nop    nop    nop    nop    nop     O
    85  nop    nop    nop    nop    nop    nop    nop    nop     O
    86  nop    nop    nop    nop    nop    nop    nop    nop     O
    87  fkey11 fkey23 fkey35 fkey47 scr11  scr11  scr11  scr11   O
    88  fkey12 fkey24 fkey36 fkey48 scr12  scr12  scr12  scr12   O

------------- octopus.c -------- cut me ----------------------
#include <stdio.h>
#include <ctype.h>
#include <termio.h>

static char *cntrlstr[32] =
{

    "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel", "bs ", "ht ",
    "nl ", "vt ", "np ", "cr ", "so ", "si ", "dle", "dc1", "dc2",
    "dc3", "dc4", "nak", "syn", "etb", "can", "em ", "sub", "esc", "fs ",
    "gs ", "rs ", "us ",

};

static char *chrstr[256] =
{

    "Null", "soh", "stx", "etx", "eot", "enq", "Ackknowledge", "Bell",
    "Backspace", "htab", "Newline ", "Verticle Tab ", "np ", "Carriage Return",
    "so", "si", "dle", "dc1", "dc2", "dc3", "dc4", "nak",
    "syn", "etb", "can", "em", "sub", "Escape", "fs", "gs", "rs", "us",
    "Space", "Exclamation-Point",
    "Double-Quote", "Octothorpe", "Dollar-Sign", "Percent-Sign",
    "Ampersand", "Single-Quote", "Left-Parenthesis",
    "Right-Parenthesis", "Asterisk", "Plus-Sign", "Comma", "Dash",
    "Period", "Slash", "Number-Zero", "Number-One", "Number-Two",
    "Number-Three", "Number-Four", "Number-Five", "Number-Six",
    "Number-Seven", "Number-Eight", "Number-Nine", "Colon",
    "Semi-Colon", "Left-Broket", "Equality-Sign", "Right-Broket",
    "Question-Mark", "At-Sign", "Capital-Letter-A",
    "Capital-Letter-B", "Capital-Letter-C", "Capital-Letter-D",
    "Capital-Letter-E", "Capital-Letter-F", "Capital-Letter-G",
    "Capital-Letter-H", "Capital-Letter-I", "Capital-Letter-J",
    "Capital-Letter-K", "Capital-Letter-L", "Capital-Letter-M",
    "Capital-Letter-N", "Capital-Letter-O", "Capital-Letter-P",
    "Capital-Letter-Q", "Capital-Letter-R", "Capital-Letter-S",
    "Capital-Letter-T", "Capital-Letter-U", "Capital-Letter-V",
    "Capital-Letter-W", "Capital-Letter-X", "Capital-Letter-Y",
    "Capital-Letter-Z", "Left-Square-Bracket", "Backslash",
    "Right-Square-Bracket", "Cercumflex", "Underline",
    "Back-Single-Quote", "Lowercase-Letter-a", "Lowercase-Letter-b",
    "Lowercase-Letter-c", "Lowercase-Letter-d", "Lowercase-Letter-e",
    "Lowercase-Letter-f", "Lowercase-Letter-g", "Lowercase-Letter-h",
    "Lowercase-Letter-i", "Lowercase-Letter-j", "Lowercase-Letter-k",
    "Lowercase-Letter-l", "Lowercase-Letter-m", "Lowercase-Letter-n",
    "Lowercase-Letter-o", "Lowercase-Letter-p", "Lowercase-Letter-q",
    "Lowercase-Letter-r", "Lowercase-Letter-s", "Lowercase-Letter-t",
    "Lowercase-Letter-u", "Lowercase-Letter-v", "Lowercase-Letter-w",
    "Lowercase-Letter-x", "Lowercase-Letter-y", "Lowercase-Letter-z",
    "Left-Curly-Brace", "Bar", "Right-Curly-Brace", "Tilde", "Delete",
};

main()
{
    int c, i;
    char buf[9], *bp;
    char *meta, *control, *character;
    struct termio term, saveterm;

    (void) ioctl(0, TCGETA, &term);
    saveterm=term;

    term.c_iflag &= ~(ICRNL|IXON|IXOFF);
    term.c_lflag &= ~(ISIG|ICANON|ECHO);
    term.c_cc[VEOF] = 1;
    term.c_cc[VEOL] = 0;
    (void) ioctl(0, TCSETAW, &term);

    buf[8] = '\0';

    puts("\n binary  oct dec hex asc sym text");

    for (;;)
    {
	c = getchar();

	bp = &buf[7];
	for (i=0; i < 8; ++i)
	    *bp-- = ((c>>i)&1)+0x30;

	i = c;

	printf("%s %3o %3d %3x ", buf, c, c, c);

	if (iscntrl(c) && (c != 0x7F))
	    fputs(cntrlstr[c], stdout);
	else
	    printf(" %c ", c);
	    
	putchar(' ');

	meta = "";
	control = "";
	character = " ";

	if (!isascii(c))
	{
	    meta = "Meta-";

	    putchar('~');
	    c &= 0x7F;

	    if (iscntrl(c))
	    {
		if (c == 0x7F)
		{
		    character = "Delete";
		    fputs("^?", stdout);
		}
		else
		{
		    control = "Control-";
		    c |= 0x40;
		    if (isalpha(c))
			*character = c;
		    else
			character = chrstr[c];

		    printf("^%c", c);
		}
	    }
	    else
	    {
		if (isalpha(c))
		    *character = c;
		else
		    character = chrstr[c];
		printf("%c ", c);
	    }
	}
	else
	{
	    if (iscntrl(c))
	    {
		if (c == 0x7F)
		{
		    character = "Delete";
		    fputs("^?", stdout);
		}
		else
		{
		    control = "Control-";
		    c |= 0x40;
		    printf("^%c ", c);
		    if (isalpha(c))
			*character = c;
		    else
			character = chrstr[c];
		}
	    }
	    else
	    {
		character = chrstr[c];
		printf(" %c ", c);
	    }
	}

	printf(" %s%s%s\n", meta, control, character);

	if (i == 0x4)
	{
	    fputs("Quit (y or n)? ", stdout);
	    switch(c = getchar())
	    {
	    case 'y':
	    case 'Y':
		puts("Yes.");
		(void) ioctl(0, TCSETAW, &saveterm);
		exit(0);

	    default:
		puts("No.");
		break;
	    }
	}
    }
}

-- 
[  Keith   ]  UUCP: {ucsd, cbosgd!crash, sdcsvax!crash, nosc!crash}!portnoy!ag
[Gabryelski]  INET: ag at portnoy.cts.com              ARPA: portnoy!ag at ucsd.arpa



More information about the Comp.unix.xenix mailing list