view etc/emacskeys.sco @ 665:fdefd0186b75

[xemacs-hg @ 2001-09-20 06:28:42 by ben] The great integral types renaming. The purpose of this is to rationalize the names used for various integral types, so that they match their intended uses and follow consist conventions, and eliminate types that were not semantically different from each other. The conventions are: -- All integral types that measure quantities of anything are signed. Some people disagree vociferously with this, but their arguments are mostly theoretical, and are vastly outweighed by the practical headaches of mixing signed and unsigned values, and more importantly by the far increased likelihood of inadvertent bugs: Because of the broken "viral" nature of unsigned quantities in C (operations involving mixed signed/unsigned are done unsigned, when exactly the opposite is nearly always wanted), even a single error in declaring a quantity unsigned that should be signed, or even the even more subtle error of comparing signed and unsigned values and forgetting the necessary cast, can be catastrophic, as comparisons will yield wrong results. -Wsign-compare is turned on specifically to catch this, but this tends to result in a great number of warnings when mixing signed and unsigned, and the casts are annoying. More has been written on this elsewhere. -- All such quantity types just mentioned boil down to EMACS_INT, which is 32 bits on 32-bit machines and 64 bits on 64-bit machines. This is guaranteed to be the same size as Lisp objects of type `int', and (as far as I can tell) of size_t (unsigned!) and ssize_t. The only type below that is not an EMACS_INT is Hashcode, which is an unsigned value of the same size as EMACS_INT. -- Type names should be relatively short (no more than 10 characters or so), with the first letter capitalized and no underscores if they can at all be avoided. -- "count" == a zero-based measurement of some quantity. Includes sizes, offsets, and indexes. -- "bpos" == a one-based measurement of a position in a buffer. "Charbpos" and "Bytebpos" count text in the buffer, rather than bytes in memory; thus Bytebpos does not directly correspond to the memory representation. Use "Membpos" for this. -- "Char" refers to internal-format characters, not to the C type "char", which is really a byte. -- For the actual name changes, see the script below. I ran the following script to do the conversion. (NOTE: This script is idempotent. You can safely run it multiple times and it will not screw up previous results -- in fact, it will do nothing if nothing has changed. Thus, it can be run repeatedly as necessary to handle patches coming in from old workspaces, or old branches.) There are two tags, just before and just after the change: `pre-integral-type-rename' and `post-integral-type-rename'. When merging code from the main trunk into a branch, the best thing to do is first merge up to `pre-integral-type-rename', then apply the script and associated changes, then merge from `post-integral-type-change' to the present. (Alternatively, just do the merging in one operation; but you may then have a lot of conflicts needing to be resolved by hand.) Script `fixtypes.sh' follows: ----------------------------------- cut ------------------------------------ files="*.[ch] s/*.h m/*.h config.h.in ../configure.in Makefile.in.in ../lib-src/*.[ch] ../lwlib/*.[ch]" gr Memory_Count Bytecount $files gr Lstream_Data_Count Bytecount $files gr Element_Count Elemcount $files gr Hash_Code Hashcode $files gr extcount bytecount $files gr bufpos charbpos $files gr bytind bytebpos $files gr memind membpos $files gr bufbyte intbyte $files gr Extcount Bytecount $files gr Bufpos Charbpos $files gr Bytind Bytebpos $files gr Memind Membpos $files gr Bufbyte Intbyte $files gr EXTCOUNT BYTECOUNT $files gr BUFPOS CHARBPOS $files gr BYTIND BYTEBPOS $files gr MEMIND MEMBPOS $files gr BUFBYTE INTBYTE $files gr MEMORY_COUNT BYTECOUNT $files gr LSTREAM_DATA_COUNT BYTECOUNT $files gr ELEMENT_COUNT ELEMCOUNT $files gr HASH_CODE HASHCODE $files ----------------------------------- cut ------------------------------------ `fixtypes.sh' is a Bourne-shell script; it uses 'gr': ----------------------------------- cut ------------------------------------ #!/bin/sh # Usage is like this: # gr FROM TO FILES ... # globally replace FROM with TO in FILES. FROM and TO are regular expressions. # backup files are stored in the `backup' directory. from="$1" to="$2" shift 2 echo ${1+"$@"} | xargs global-replace "s/$from/$to/g" ----------------------------------- cut ------------------------------------ `gr' in turn uses a Perl script to do its real work, `global-replace', which follows: ----------------------------------- cut ------------------------------------ : #-*- Perl -*- ### global-modify --- modify the contents of a file by a Perl expression ## Copyright (C) 1999 Martin Buchholz. ## Copyright (C) 2001 Ben Wing. ## Authors: Martin Buchholz <martin@xemacs.org>, Ben Wing <ben@xemacs.org> ## Maintainer: Ben Wing <ben@xemacs.org> ## Current Version: 1.0, May 5, 2001 # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with XEmacs; see the file COPYING. If not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. eval 'exec perl -w -S $0 ${1+"$@"}' if 0; use strict; use FileHandle; use Carp; use Getopt::Long; use File::Basename; (my $myName = $0) =~ s@.*/@@; my $usage=" Usage: $myName [--help] [--backup-dir=DIR] [--line-mode] [--hunk-mode] PERLEXPR FILE ... Globally modify a file, either line by line or in one big hunk. Typical usage is like this: [with GNU print, GNU xargs: guaranteed to handle spaces, quotes, etc. in file names] find . -name '*.[ch]' -print0 | xargs -0 $0 's/\bCONST\b/const/g'\n [with non-GNU print, xargs] find . -name '*.[ch]' -print | xargs $0 's/\bCONST\b/const/g'\n The file is read in, either line by line (with --line-mode specified) or in one big hunk (with --hunk-mode specified; it's the default), and the Perl expression is then evalled with \$_ set to the line or hunk of text, including the terminating newline if there is one. It should destructively modify the value there, storing the changed result in \$_. Files in which any modifications are made are backed up to the directory specified using --backup-dir, or to `backup' by default. To disable this, use --backup-dir= with no argument. Hunk mode is the default because it is MUCH MUCH faster than line-by-line. Use line-by-line only when it matters, e.g. you want to do a replacement only once per line (the default without the `g' argument). Conversely, when using hunk mode, *ALWAYS* use `g'; otherwise, you will only make one replacement in the entire file! "; my %options = (); $Getopt::Long::ignorecase = 0; &GetOptions ( \%options, 'help', 'backup-dir=s', 'line-mode', 'hunk-mode', ); die $usage if $options{"help"} or @ARGV <= 1; my $code = shift; die $usage if grep (-d || ! -w, @ARGV); sub SafeOpen { open ((my $fh = new FileHandle), $_[0]); confess "Can't open $_[0]: $!" if ! defined $fh; return $fh; } sub SafeClose { close $_[0] or confess "Can't close $_[0]: $!"; } sub FileContents { my $fh = SafeOpen ("< $_[0]"); my $olddollarslash = $/; local $/ = undef; my $contents = <$fh>; $/ = $olddollarslash; return $contents; } sub WriteStringToFile { my $fh = SafeOpen ("> $_[0]"); binmode $fh; print $fh $_[1] or confess "$_[0]: $!\n"; SafeClose $fh; } foreach my $file (@ARGV) { my $changed_p = 0; my $new_contents = ""; if ($options{"line-mode"}) { my $fh = SafeOpen $file; while (<$fh>) { my $save_line = $_; eval $code; $changed_p = 1 if $save_line ne $_; $new_contents .= $_; } } else { my $orig_contents = $_ = FileContents $file; eval $code; if ($_ ne $orig_contents) { $changed_p = 1; $new_contents = $_; } } if ($changed_p) { my $backdir = $options{"backup-dir"}; $backdir = "backup" if !defined ($backdir); if ($backdir) { my ($name, $path, $suffix) = fileparse ($file, ""); my $backfulldir = $path . $backdir; my $backfile = "$backfulldir/$name"; mkdir $backfulldir, 0755 unless -d $backfulldir; print "modifying $file (original saved in $backfile)\n"; rename $file, $backfile; } WriteStringToFile ($file, $new_contents); } } ----------------------------------- cut ------------------------------------ In addition to those programs, I needed to fix up a few other things, particularly relating to the duplicate definitions of types, now that some types merged with others. Specifically: 1. in lisp.h, removed duplicate declarations of Bytecount. The changed code should now look like this: (In each code snippet below, the first and last lines are the same as the original, as are all lines outside of those lines. That allows you to locate the section to be replaced, and replace the stuff in that section, verifying that there isn't anything new added that would need to be kept.) --------------------------------- snip ------------------------------------- /* Counts of bytes or chars */ typedef EMACS_INT Bytecount; typedef EMACS_INT Charcount; /* Counts of elements */ typedef EMACS_INT Elemcount; /* Hash codes */ typedef unsigned long Hashcode; /* ------------------------ dynamic arrays ------------------- */ --------------------------------- snip ------------------------------------- 2. in lstream.h, removed duplicate declaration of Bytecount. Rewrote the comment about this type. The changed code should now look like this: --------------------------------- snip ------------------------------------- #endif /* The have been some arguments over the what the type should be that specifies a count of bytes in a data block to be written out or read in, using Lstream_read(), Lstream_write(), and related functions. Originally it was long, which worked fine; Martin "corrected" these to size_t and ssize_t on the grounds that this is theoretically cleaner and is in keeping with the C standards. Unfortunately, this practice is horribly error-prone due to design flaws in the way that mixed signed/unsigned arithmetic happens. In fact, by doing this change, Martin introduced a subtle but fatal error that caused the operation of sending large mail messages to the SMTP server under Windows to fail. By putting all values back to be signed, avoiding any signed/unsigned mixing, the bug immediately went away. The type then in use was Lstream_Data_Count, so that it be reverted cleanly if a vote came to that. Now it is Bytecount. Some earlier comments about why the type must be signed: This MUST BE SIGNED, since it also is used in functions that return the number of bytes actually read to or written from in an operation, and these functions can return -1 to signal error. Note that the standard Unix read() and write() functions define the count going in as a size_t, which is UNSIGNED, and the count going out as an ssize_t, which is SIGNED. This is a horrible design flaw. Not only is it highly likely to lead to logic errors when a -1 gets interpreted as a large positive number, but operations are bound to fail in all sorts of horrible ways when a number in the upper-half of the size_t range is passed in -- this number is unrepresentable as an ssize_t, so code that checks to see how many bytes are actually written (which is mandatory if you are dealing with certain types of devices) will get completely screwed up. --ben */ typedef enum lstream_buffering --------------------------------- snip ------------------------------------- 3. in dumper.c, there are four places, all inside of switch() statements, where XD_BYTECOUNT appears twice as a case tag. In each case, the two case blocks contain identical code, and you should *REMOVE THE SECOND* and leave the first.
author ben
date Thu, 20 Sep 2001 06:31:11 +0000
parents 376386a54a3c
children
line wrap: on
line source

#
# SCO(tm) keyboard mapping file with Emacs meta-keys
# Automatically generated using the emap utility
#
# Below is the uuencoded source for the emap utility. This program
# will, when run on an SCO console, take the current keyboard
# map and set the 'meta' bit for all keys. To make this usable
# under Emacs, edit your termcap and terminfo entries for the
# sco console (the ansi entries) and add the 'km' capability.
# Usage:
# emap [-o] [-f filename]
# If you run the utility with no flags, it will simply modify the
# current keyboard map in kernel memory for the multiscreen on
# which it was invoked. Specifying -f and a filename will cause
# a file suitable for input to the mapkey(M) utility to be generated.
# Specifying -o will produce, on stdout, a file suitable for input
# to the mapkey(M) utility but will NOT modify the in-memory
# map.
# I personally run this utility once, and replace /usr/lib/keyboard/keys
# with the result. You may prefer to run it in your .profile or
# via a shell-script which will in turn invoke emacs.
#
# begin 600 emap.c.gz
# M'XL("'F'RC " V5M87 N8P"=5VUOXC@0_LZOF$W50KIT%^AM[U2V>Z*HW%9+
# MH2JL=*<6H6"<$A&27&RZ1;?][S=C.X&$%'H7(>S8\\R;QS.3 R]@_G+*X;.0
# M4R_\,/M2.DB7EH&'J]DUL1(?Y2KB8GMYSE>3T(D5H,2?)8\#8#,GAN,PDD[\
# MV$P6O4 "+GG!M$HCCV,UXJ]9*FF$(UC@++BX'\$%_%,"L(*E;U5I(L*9F<AG
# M/>'I))1F$ORM)PZ;Z\F$&_A$Z'%F2 .S_I2\1WID<2+.C)X>ISXW$U9/)HUD
# M<II,?C','"->K()$UXGA[R0K"T.R-#M<,#UQC:J/9HS-& BK])*ZJH1^][V 
# M0X7\RJJ [PLG&DLXGB_L$CE/2$=Z3!]&_'3?^'0V:N*R>I>BKA:J.&ND6\1*
# MSJO@H1C$1S$NN%!!XBI8AY^FJ$45F-U4S&,6K: 2/Q&+NJT0;ABC/GAVM29X
# M\!EZWV_&@V%K>#7 ]_?O;20!=:[TR#D2DO;V?''R!=6_9Z,/:,*]-U+,Z/%0
# M^O5@/+B]:E^WNE!!VZIDK&?;AF+-CQ[QPY-LAAK/[8W5+ UZP!$<OHU[_=OS
# MU YM8Q!&EMV$2<R=>;,(TQU\S6-\,?-<N1MVMPV+WP!K=[_E8<P/,;AWHGK;
# MJ& _:K"-$OM1E\/691XVD<YD-ZK5'>9!CK_/A06@>"^J/>QN>5#&_AY1!:AX
# M/ZSWYZ"]Y7B!&:48->6NL_3E>691ASS&+WRYH$-IWW5L.#JBB(;/9J5KVSG,
# MUEU%J8=3O*L$.TGYO(>ZW<Q!N8^Z9V1VOO=R,G'E#3)=O,(9H9K1:T+WL=-7
# M,4/U4LK/,HPV+SE91.K#:2.K>.9XTGHCYZ.,K-0KE*0NH-[X=0<7:\I]JQAN
# MG(I*;#BTWCC+>3-G>OE0'+(R>=+(+S^4RS;\_ GI^T/9MN%WL!X>+#@'2U6(
# M@@?S8%ZO78)KSX>U!E;5+"YQ]@9Q@^K!R9F@>J"S_]HOCDRJ0L.LOZAJ8E)S
# M92/;N_ZC@".H/==.[<WBH"Y4=]P_+V!K]7/WR1"W"XG;Q<2]0N)>,?%E(?%E
# MCIB\%'.YQ$X'"=!RM)KJZ<+Q EVDL1G"TJ7+]S&^/.DRK?NBBQIV0^Y%+:W0
# MQVZ ]1'[!(<)=)>@TFC1;N>Z>X6[-$UK/OXG]=NK,E4^?\P\'[N#>K;H,N3Y
# MR*GI@HK6AQ1!<T+W?!W#%+J, NVJWUE':B:'I2&NZ,IA>4T71BBD_@JA6RZN
# MW*&[":)'V9_TD&^^^$F,6M^%\\C/ ?T7P?U).,(_%UST"=WXT4.0N['/GB1G
# MY26IT"6G>2&3/E3PE/ZX[H^_7?UUT[JMPA%R5QAMX#OL?++^CK#-I:;(6J/6
# M@K70S"TA/N0*]$66$;G'#2..L>0&>%X_LJ>E(!4=&G:MV,6I+NUPZ4\A"+%O
# MQ".5',*EC)92>:?(+8V"9. FCG91F8--=V9W8-#N5^3"AN0[@6(U\H)')0TP
# M*<S@BF(<%EPZ)Q3I.YBUEC)<4%?K^/X* SG@,>H_A:4@CG+&]7DOI>=[<O4Z
# MHQTB_N>#G<@.I@+[_F(<"["OR+!9#V:/NK =O%F(GV(PH5P%JJ=,@>;-<"O<
# MHV\$_A8_O:3]/=/]/</BBK[^$(SIS/ ]W]]36+[;;-Z16C7OO?[=36NSH2 V
# M&_T_-GHCLW.1W]/8$?S$HO%;K;E/U.#K=6>X4]+@:V=4*$E!WRRH/;S;;1&V
# ME,5R"/D?[.D@HWT&*5D%!NF-1-2&+,K8:<;)9-%#NHWJXU)_;#*3\S+))Y.P
# MMH)H#XOBM.?B=PX&=,75'Y9K)6O;]6R=FF^+4O.ZH*W3\ZNI\;8@3>]*A/2O
# .]VJJY/\+D-=?N%H1  #5
#  
# end
#
# The output below is the result of running emap on the default
# SCO keymap as installed by SCO. It is the equivalent of the
# at.ibm.usa key map file in /usr/lib/keyboard/keys, but with
# the meta bits set properly. Note that for meta keys to work correctly
# you MUST edit /etc/termcap and /usr/lib/terminfo/terminfo.src and add
# the 'km' capability for the 'ansi' entry, and you must disable channel
# mapping in /etc/default/mapchan for the console screens. Extra function
# keys have been added, and the matching emacsstrs.sco is in this
# directory to make a map which scoansi.el can use. So the sequence of
# events should be:
# a) Copy this file to /usr/lib/keyboard/keys
# b) copy emacsstrs.sco to /usr/lib/keyboard/stings
# c) run mapkey and mapstr and set MAPKEY=yes in /etc/default/boot
# d) Add mapstr -f to your /etc/profile or your shell startup
# e) Arrange to have scoansi.el loaded from your .emacs file.
#
#                                                        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    esc    esc    0x9b   0x9b   0x9b   0x9b   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   btab   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    0xe0   0xfe   nop    nop    O
   42  lshift lshift lshift lshift lshift lshift lshift lshift O
   43  '\\'   '|'    fs     fs     0xdc   0xfc   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    nop    0xaf   0xbf   nop    nop    O
   54  rshift rshift rshift rshift rshift rshift rshift rshift O
   55  '*'    '*'    nscr   nscr   0xaa   0xaa   nscr   nscr   O
   56  alt    alt    alt    alt    alt    alt    alt    alt    O
   57  ' '    ' '    ' '    ' '    0xa0   0xa0   0xa0   0xa0   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  0x93   0x93   O
   70  slock  slock  del    del    slock  slock  0xff   0xff   O
   71  fkey49 '7'    '7'    '7'    '7'    0xb7   0xb7   0xb7   N
   72  fkey50 '8'    '8'    '8'    '8'    0xb8   0xb8   0xb8   N
   73  fkey51 '9'    '9'    '9'    '9'    0xb9   0xb9   0xb9   N
   74  fkey52 '-'    '-'    '-'    '-'    0xad   0xad   0xad   N
   75  fkey53 '4'    '4'    '4'    '4'    0xb4   0xb4   0xb4   N
   76  fkey54 '5'    '5'    '5'    '5'    0xb5   0xb5   0xb5   N
   77  fkey55 '6'    '6'    '6'    '6'    0xb6   0xb6   0xb6   N
   78  fkey56 '+'    '+'    '+'    '+'    0xab   0xab   0xab   N
   79  fkey57 '1'    '1'    '1'    '1'    0xb1   0xb1   0xb1   N
   80  fkey58 '2'    '2'    '2'    '2'    0xb2   0xb2   0xb2   N
   81  fkey59 '3'    '3'    '3'    '3'    0xb3   0xb3   0xb3   N
   82  fkey60 '0'    '0'    '0'    '0'    0xb0   0xb0   0xb0   N
   83  del    '.'    del    del    0xff   0xae   0xff   0xff   N
   84  ns     ns     ns     ns     0x9f   0x9f   0x9f   0x9f   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
   89  nop    nop    nop    nop    nop    nop    nop    nop    O
   90  nop    nop    nop    nop    nop    nop    nop    nop    O
   91  nop    nop    nop    nop    nop    nop    nop    nop    O
   92  nop    nop    nop    nop    nop    nop    nop    nop    O
   93  nop    nop    nop    nop    nop    nop    nop    nop    O
   94  nop    nop    nop    nop    nop    nop    nop    nop    O
   95  nop    nop    nop    nop    nop    nop    nop    nop    O
   96  fkey50 fkey62 fkey72 fkey50 fkey82 fkey62 fkey72 fkey50 N
   97  fkey53 fkey64 fkey74 fkey53 fkey84 fkey64 fkey74 fkey53 N
   98  fkey58 fkey67 fkey77 fkey58 fkey87 fkey67 fkey77 fkey58 N
   99  fkey55 fkey65 fkey75 fkey55 fkey85 fkey65 fkey75 fkey55 N
  100  fkey49 fkey61 fkey71 fkey49 fkey81 fkey61 fkey71 fkey49 N
  101  nop    nop    nop    nop    nop    nop    nop    nop    O
  102  fkey57 fkey66 fkey76 fkey57 fkey86 fkey66 fkey76 fkey57 N
  103  fkey59 fkey68 fkey78 fkey59 fkey88 fkey68 fkey78 fkey59 N
  104  fkey60 fkey69 fkey79 fkey60 fkey89 fkey69 fkey79 fkey60 N
  105  del    del    del    del    0xff   0xff   0xff   0xff   N
  106  fkey54 fkey54 fkey93 fkey54 fkey96 fkey54 fkey54 fkey54 N
  107  nop    nop    nop    nop    nop    nop    nop    nop    O
  108  nop    nop    nop    nop    nop    nop    nop    nop    O
  109  nop    nop    nop    nop    nop    nop    nop    nop    O
  110  nop    nop    nop    nop    nop    nop    nop    nop    O
  111  nop    nop    nop    nop    nop    nop    nop    nop    O
  112  nop    nop    nop    nop    nop    nop    nop    nop    O
  113  nop    nop    nop    nop    nop    nop    nop    nop    O
  114  nop    nop    nop    nop    nop    nop    nop    nop    O
  115  nop    nop    nop    nop    nop    nop    nop    nop    O
  116  nop    nop    nop    nop    nop    nop    nop    nop    O
  117  nop    nop    nop    nop    nop    nop    nop    nop    O
  118  nop    nop    nop    nop    nop    nop    nop    nop    O
  119  nop    nop    nop    nop    nop    nop    nop    nop    O
  120  nop    nop    nop    nop    nop    nop    nop    nop    O
  121  nop    nop    nop    nop    nop    nop    nop    nop    O
  122  nop    nop    nop    nop    nop    nop    nop    nop    O
  123  nop    nop    nop    nop    nop    nop    nop    nop    O
  124  nop    nop    nop    nop    nop    nop    nop    nop    O
  125  nop    nop    nop    nop    nop    nop    nop    nop    O
  126  nop    nop    nop    nop    nop    nop    nop    nop    O
  127  nop    nop    nop    nop    nop    nop    nop    nop    O
  128  rctrl  rctrl  rctrl  rctrl  rctrl  rctrl  rctrl  rctrl  O
  129  ralt   ralt   ralt   ralt   ralt   ralt   ralt   ralt   O
  130  fkey60 fkey69 fkey79 fkey60 fkey89 fkey69 fkey79 fkey60 O
  131  del    del    del    del    0xff   0xff   0xff   0xff   N
  132  fkey49 fkey61 fkey71 fkey49 fkey81 fkey61 fkey71 fkey49 N
  133  fkey57 fkey66 fkey76 fkey57 fkey86 fkey66 fkey76 fkey57 N
  134  fkey51 fkey63 fkey73 fkey51 fkey83 fkey63 fkey73 fkey51 N
  135  fkey59 fkey68 fkey78 fkey59 fkey88 fkey68 fkey78 fkey59 N
  136  fkey55 fkey65 fkey75 fkey55 fkey85 fkey65 fkey75 fkey55 N
  137  fkey53 fkey64 fkey74 fkey53 fkey84 fkey64 fkey74 fkey53 N
  138  fkey50 fkey62 fkey72 fkey50 fkey82 fkey62 fkey72 fkey50 N
  139  fkey58 fkey67 fkey77 fkey58 fkey87 fkey67 fkey77 fkey58 N
  140  '/'    nop    nop    nop    0xaf   nop    nop    nop    O
  141  cr     cr     nl     nl     0x8d   0x8d   0x8a   0x8a   O