home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / hp300 / stand / hil.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-05  |  8.5 KB  |  261 lines

  1. /*
  2.  * Copyright (c) 1988 University of Utah.
  3.  * Copyright (c) 1990 The Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * This code is derived from software contributed to Berkeley by
  7.  * the Systems Programming Group of the University of Utah Computer
  8.  * Science Department.
  9.  *
  10.  * Redistribution and use in source and binary forms, with or without
  11.  * modification, are permitted provided that the following conditions
  12.  * are met:
  13.  * 1. Redistributions of source code must retain the above copyright
  14.  *    notice, this list of conditions and the following disclaimer.
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in the
  17.  *    documentation and/or other materials provided with the distribution.
  18.  * 3. All advertising materials mentioning features or use of this software
  19.  *    must display the following acknowledgement:
  20.  *    This product includes software developed by the University of
  21.  *    California, Berkeley and its contributors.
  22.  * 4. Neither the name of the University nor the names of its contributors
  23.  *    may be used to endorse or promote products derived from this software
  24.  *    without specific prior written permission.
  25.  *
  26.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  27.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  30.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  32.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  33.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  35.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  36.  * SUCH DAMAGE.
  37.  *
  38.  * from: Utah $Hdr: hil.c 1.1 89/08/22$
  39.  *
  40.  *    @(#)hil.c    7.2 (Berkeley) 12/16/90
  41.  */
  42.  
  43. /*
  44.  * Keyboard routines for the standalone ITE.
  45.  */
  46. #include "samachdep.h"
  47.  
  48. #ifdef ITECONSOLE
  49.  
  50. #include "sys/param.h"
  51. #include "../dev/hilreg.h"
  52. #include "../dev/kbdmap.h"
  53. #include "../dev/itevar.h"
  54.  
  55. #ifndef SMALL
  56.  
  57. /*
  58.  * HIL cooked keyboard keymaps.
  59.  * Supports only unshifted, shifted and control keys.
  60.  */
  61. char    us_keymap[] = {
  62.     NULL,    '`',    '\\',    ESC,    NULL,    DEL,    NULL,    NULL,  
  63.     '\n',    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,  
  64.     NULL,    '\n',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,  
  65.     NULL,    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  66.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  67.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    '\b',    NULL,
  68.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  69.     ESC,    '\r',    NULL,    '\n',    '0',    '.',    ',',    '+',
  70.     '1',    '2',    '3',    '-',    '4',    '5',    '6',    '*',
  71.     '7',    '8',    '9',    '/',    'E',    '(',    ')',    '^',
  72.     '1',    '2',    '3',    '4',    '5',    '6',    '7',    '8',
  73.     '9',    '0',    '-',    '=',    '[',    ']',    ';',    '\'',
  74.     ',',    '.',    '/',    '\040',    'o',    'p',    'k',    'l',
  75.     'q',    'w',    'e',    'r',    't',    'y',    'u',    'i',
  76.     'a',    's',    'd',    'f',    'g',    'h',    'j',    'm',
  77.     'z',    'x',    'c',    'v',    'b',    'n',    NULL,    NULL
  78. };
  79.  
  80. char    us_shiftmap[] = {
  81.     NULL,    '~',    '|',    DEL,    NULL,    DEL,    NULL,    NULL,
  82.     '\n',    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  83.     NULL,    '\n',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  84.     NULL,    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  85.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  86.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    DEL,    NULL,
  87.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  88.     ESC,    '\r',    NULL,    '\n',    '0',    '.',    ',',    '+',
  89.     '1',    '2',    '3',    '-',    '4',    '5',    '6',    '*',
  90.     '7',    '8',    '9',    '/',    '`',    '|',    '\\',    '~',
  91.     '!',    '@',    '#',    '$',    '%',    '^',    '&',    '*',
  92.     '(',    ')',    '_',    '+',    '{',    '}',    ':',    '\"',
  93.     '<',    '>',    '?',    '\040',    'O',    'P',    'K',    'L',
  94.     'Q',    'W',    'E',    'R',    'T',    'Y',    'U',    'I',
  95.     'A',    'S',    'D',    'F',    'G',    'H',    'J',    'M',
  96.     'Z',    'X',    'C',    'V',    'B',    'N',    NULL,    NULL
  97. };
  98.  
  99. char    us_ctrlmap[] = {
  100.     NULL,    '`',    '\034',    ESC,    NULL,    DEL,    NULL,    NULL,
  101.     '\n',    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  102.     NULL,    '\n',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  103.     NULL,    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  104.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  105.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    '\b',    NULL,
  106.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  107.     ESC,    '\r',    NULL,    '\n',    '0',    '.',    ',',    '+',
  108.     '1',    '2',    '3',    '-',    '4',    '5',    '6',    '*',
  109.     '7',    '8',    '9',    '/',    'E',    '(',    ')',    '\036',
  110.     '1',    '2',    '3',    '4',    '5',    '6',    '7',    '8',
  111.     '9',    '0',    '-',    '=',    '\033',    '\035',    ';',    '\'',
  112.     ',',    '.',    '/',    '\040',    '\017',    '\020',    '\013',    '\014',
  113.     '\021',    '\027',    '\005',    '\022',    '\024',    '\031',    '\025',    '\011',
  114.     '\001',    '\023',    '\004',    '\006',    '\007',    '\010',    '\012',    '\015',
  115.     '\032',    '\030',    '\003',    '\026',    '\002',    '\016',    NULL,    NULL
  116. };
  117.  
  118. #ifdef UK_KEYBOARD
  119. char    uk_keymap[] = {
  120.     NULL,    '`',    '<',    ESC,    NULL,    DEL,    NULL,    NULL,  
  121.     '\n',    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,  
  122.     NULL,    '\n',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,  
  123.     NULL,    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  124.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  125.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    '\b',    NULL,
  126.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  127.     ESC,    '\r',    NULL,    '\n',    '0',    '.',    ',',    '+',
  128.     '1',    '2',    '3',    '-',    '4',    '5',    '6',    '*',
  129.     '7',    '8',    '9',    '/',    'E',    '(',    ')',    '^',
  130.     '1',    '2',    '3',    '4',    '5',    '6',    '7',    '8',
  131.     '9',    '0',    '+',    '\'',    '[',    ']',    '*',    '\\',
  132.     ',',    '.',    '-',    '\040',    'o',    'p',    'k',    'l',
  133.     'q',    'w',    'e',    'r',    't',    'y',    'u',    'i',
  134.     'a',    's',    'd',    'f',    'g',    'h',    'j',    'm',
  135.     'z',    'x',    'c',    'v',    'b',    'n',    NULL,    NULL
  136. };
  137.  
  138. char    uk_shiftmap[] = {
  139.     NULL,    '~',    '>',    DEL,    NULL,    DEL,    NULL,    NULL,
  140.     '\n',    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  141.     NULL,    '\n',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  142.     NULL,    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  143.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  144.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    DEL,    NULL,
  145.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  146.     ESC,    '\r',    NULL,    '\n',    '0',    '.',    ',',    '+',
  147.     '1',    '2',    '3',    '-',    '4',    '5',    '6',    '*',
  148.     '7',    '8',    '9',    '/',    '`',    '|',    '\\',    '~',
  149.     '!',    '\"',    '#',    '$',    '%',    '&',    '^',    '(',
  150.     ')',    '=',    '?',    '/',    '{',    '}',    '@',    '|',
  151.     ';',    ':',    '_',    '\040',    'O',    'P',    'K',    'L',
  152.     'Q',    'W',    'E',    'R',    'T',    'Y',    'U',    'I',
  153.     'A',    'S',    'D',    'F',    'G',    'H',    'J',    'M',
  154.     'Z',    'X',    'C',    'V',    'B',    'N',    NULL,    NULL
  155. };
  156.  
  157. char    uk_ctrlmap[] = {
  158.     NULL,    '`',    '<',    ESC,    NULL,    DEL,    NULL,    NULL,
  159.     '\n',    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  160.     NULL,    '\n',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  161.     NULL,    '\t',    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  162.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  163.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    '\b',    NULL,
  164.     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
  165.     ESC,    '\r',    NULL,    '\n',    '0',    '.',    ',',    '+',
  166.     '1',    '2',    '3',    '-',    '4',    '5',    '6',    '*',
  167.     '7',    '8',    '9',    '/',    'E',    '(',    ')',    '\036',
  168.     '1',    '2',    '3',    '4',    '5',    '6',    '7',    '8',
  169.     '9',    '0',    '+',    '\'',    '\033',    '\035',    '*',    '\034',
  170.     ',',    '.',    '/',    '\040',    '\017',    '\020',    '\013',    '\014',
  171.     '\021',    '\027',    '\005',    '\022',    '\024',    '\031',    '\025',    '\011',
  172.     '\001',    '\023',    '\004',    '\006',    '\007',    '\010',    '\012',    '\015',
  173.     '\032',    '\030',    '\003',    '\026',    '\002',    '\016',    NULL,    NULL
  174. };
  175. #endif
  176.  
  177. /*
  178.  * The keyboard map table.
  179.  * Lookup is by hardware returned language code.
  180.  */
  181. struct kbdmap kbd_map[] = {
  182.     KBD_US,        NULL,
  183.     us_keymap,    us_shiftmap,    us_ctrlmap,    NULL,    NULL,
  184.  
  185. #ifdef UK_KEYBOARD
  186.     KBD_UK,        NULL,
  187.     uk_keymap,    uk_shiftmap,    uk_ctrlmap,    NULL,    NULL,
  188. #endif
  189.  
  190.     0,        NULL,
  191.     NULL,        NULL,        NULL,        NULL,    NULL,
  192. };
  193.  
  194. char    *kbd_keymap = us_keymap;
  195. char    *kbd_shiftmap = us_shiftmap;
  196. char    *kbd_ctrlmap = us_ctrlmap;
  197.  
  198. kbdgetc()
  199. {
  200.     register int status, c;
  201.     register struct hil_dev *hiladdr = HILADDR;
  202.  
  203.     status = hiladdr->hil_stat;
  204.     if ((status & HIL_DATA_RDY) == 0)
  205.         return(0);
  206.     c = hiladdr->hil_data;
  207.     switch ((status>>KBD_SSHIFT) & KBD_SMASK) {
  208.     case KBD_SHIFT:
  209.         c = kbd_shiftmap[c & KBD_CHARMASK];
  210.         break;
  211.     case KBD_CTRL:
  212.         c = kbd_ctrlmap[c & KBD_CHARMASK];
  213.         break;
  214.     case KBD_KEY:
  215.         c = kbd_keymap[c & KBD_CHARMASK];
  216.         break;
  217.     default:
  218.         c = 0;
  219.         break;
  220.     }
  221.     return(c);
  222. }
  223. #endif
  224.  
  225. kbdnmi()
  226. {
  227.     register struct hil_dev *hiladdr = HILADDR;
  228.  
  229.     HILWAIT(hiladdr);
  230.     hiladdr->hil_cmd = HIL_CNMT;
  231.     HILWAIT(hiladdr);
  232.     hiladdr->hil_cmd = HIL_CNMT;
  233.     HILWAIT(hiladdr);
  234.     printf("\nboot interrupted\n");
  235. }
  236.  
  237. kbdinit()
  238. {
  239.     register struct hil_dev *hiladdr = HILADDR;
  240.     register struct kbdmap *km;
  241.     u_char lang;
  242.  
  243.     HILWAIT(hiladdr);
  244.     hiladdr->hil_cmd = HIL_SETARR;
  245.     HILWAIT(hiladdr);
  246.     hiladdr->hil_data = ar_format(KBD_ARR);
  247.     HILWAIT(hiladdr);
  248.     hiladdr->hil_cmd = HIL_READKBDLANG;
  249.     HILDATAWAIT(hiladdr);
  250.     lang = hiladdr->hil_data;
  251.     for (km = kbd_map; km->kbd_code; km++)
  252.         if (km->kbd_code == lang) {
  253.             kbd_keymap = km->kbd_keymap;
  254.             kbd_shiftmap = km->kbd_shiftmap;
  255.             kbd_ctrlmap = km->kbd_ctrlmap;
  256.         }
  257.     HILWAIT(hiladdr);
  258.     hiladdr->hil_cmd = HIL_INTON;
  259. }
  260. #endif
  261.