--- Gnu-Mach/i386/i386at/kd.c 2020/09/02 04:36:58 1.1.1.1 +++ Gnu-Mach/i386/i386at/kd.c 2020/09/02 04:44:36 1.1.1.3 @@ -1,34 +1,34 @@ -/* +/* * Mach Operating System * Copyright (c) 1991,1990,1989 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ -/* +/* * Olivetti Mach Console driver v0.0 * Copyright Ing. C. Olivetti & C. S.p.A. 1988, 1989 * All rights reserved. * - */ + */ /* Copyright 1988, 1989 by Olivetti Advanced Technology Center, Inc., Cupertino, California. @@ -132,7 +132,7 @@ int kdcninit(struct consdev *cp); int kdcngetc(dev_t dev, int wait); int kdcnputc(dev_t dev, int c); -/* +/* * These routines define the interface to the device-specific layer. * See kdsoft.h for a more complete description of what each routine does. */ @@ -154,15 +154,17 @@ unsigned char kd_getdata(), state2leds() */ vm_offset_t kd_bitmap_start = (vm_offset_t)0xa0000; /* XXX - put in kd.h */ -u_char *vid_start = (u_char *)EGA_START; +u_char *vid_start = (u_char *)EGA_START; /* VM start of video RAM or frame buffer */ csrpos_t kd_curpos = 0; /* set indirectly by kd_setpos--see kdsoft.h */ short kd_lines = 25; short kd_cols = 80; char kd_attr = KA_NORMAL; /* current attribute */ +char kd_color = KA_NORMAL; +char kd_attrflags = 0; /* Not reverse, underline, blink */ -/* - * kd_state shows the state of the modifier keys (ctrl, caps lock, +/* + * kd_state shows the state of the modifier keys (ctrl, caps lock, * etc.) It should normally be changed by calling set_kd_state(), so * that the keyboard status LEDs are updated correctly. */ @@ -176,18 +178,18 @@ int kd_kbd_mouse = 0; int kd_kbd_magic_scale = 6; int kd_kbd_magic_button = 0; -/* - * Some keyboard commands work by sending a command, waiting for an - * ack (handled by kdintr), then sending data, which generates a +/* + * Some keyboard commands work by sending a command, waiting for an + * ack (handled by kdintr), then sending data, which generates a * second ack. If we are in the middle of such a sequence, kd_ack * shows what the ack is for. - * - * When a byte is sent to the keyboard, it is kept around in last_sent + * + * When a byte is sent to the keyboard, it is kept around in last_sent * in case it needs to be resent. - * + * * The rest of the variables here hold the data required to complete * the sequence. - * + * * XXX - the System V driver keeps a command queue, I guess in case we * want to start a command while another is in progress. Is this * something we should worry about? @@ -208,113 +210,131 @@ boolean_t kd_initialized = FALSE; /* dr boolean_t kd_extended = FALSE; /* Array for processing escape sequences. */ -#define K_MAXESC 16 +#define K_MAXESC 32 u_char esc_seq[K_MAXESC]; u_char *esc_spt = (u_char *)0; /* * This array maps scancodes to Ascii characters (or character - * sequences). + * sequences). * Each row corresponds to one key. There are NUMOUTPUT bytes per key * state. The states are ordered: Normal, SHIFT, CTRL, ALT, * SHIFT/ALT. */ + +/* This new keymap from Tudor Hulubei (tudor@cs.unh.edu) makes the + following changes to the keyboard driver: + + - Alt + key (m-key) returns `ESC key' instead of `ESC N key'. + - Backspace returns 0x7f instead of 0x08. + - Delete returns `ESC [ 9' instead of 0x7f. + - Alt + function keys return key sequences that are different + from the key sequences returned by the function keys alone. + This is done with the idea of alowing a terminal server to + implement multiple virtual consoles mapped on Alt+F1, Alt+F2, + etc, as in Linux. + + -- Derek Upham 1997/06/25 */ + unsigned char key_map[NUMKEYS][WIDTH_KMAP] = { -{NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC}, -{K_ESC,NC,NC, K_ESC,NC,NC, K_ESC,NC,NC, K_ESC,NC,NC, K_ESC,NC,NC}, -{K_ONE,NC,NC, K_BANG,NC,NC, K_ONE,NC,NC, 0x1b,0x4e,0x31, 0x1b,0x4e,0x21}, -{K_TWO,NC,NC, K_ATSN,NC,NC, K_NUL,NC,NC, 0x1b,0x4e,0x32, 0x1b,0x4e,0x40}, -{K_THREE,NC,NC, K_POUND,NC,NC, K_THREE,NC,NC, 0x1b,0x4e,0x33, 0x1b,0x4e,0x23}, -{K_FOUR,NC,NC, K_DOLLAR,NC,NC, K_FOUR,NC,NC, 0x1b,0x4e,0x34, 0x1b,0x4e,0x24}, -{K_FIVE,NC,NC, K_PERC,NC,NC, K_FIVE,NC,NC, 0x1b,0x4e,0x35, 0x1b,0x4e,0x25}, -{K_SIX,NC,NC, K_CARET,NC,NC, K_RS,NC,NC, 0x1b,0x4e,0x36, 0x1b,0x4e,0x5e}, -{K_SEVEN,NC,NC, K_AMPER,NC,NC, K_SEVEN,NC,NC, 0x1b,0x4e,0x37, 0x1b,0x4e,0x26}, -{K_EIGHT,NC,NC, K_ASTER,NC,NC, K_EIGHT,NC,NC, 0x1b,0x4e,0x38, 0x1b,0x4e,0x2a}, -{K_NINE,NC,NC, K_LPAREN,NC,NC, K_NINE,NC,NC, 0x1b,0x4e,0x39,0x1b,0x4e,0x28}, -{K_ZERO,NC,NC, K_RPAREN,NC,NC, K_ZERO,NC,NC, 0x1b,0x4e,0x30,0x1b,0x4e,0x29}, -{K_MINUS,NC,NC, K_UNDSC,NC,NC, K_US,NC,NC, 0x1b,0x4e,0x2d, 0x1b,0x4e,0x5f}, -{K_EQL,NC,NC, K_PLUS,NC,NC, K_EQL,NC,NC, 0x1b,0x4e,0x3d, 0x1b,0x4e,0x2b}, -{K_BS,NC,NC, K_BS,NC,NC, K_BS,NC,NC, K_BS,NC,NC, K_BS,NC,NC}, -{K_HT,NC,NC, K_GS,NC,NC, K_HT,NC,NC, K_HT,NC,NC, K_GS,NC,NC}, -{K_q,NC,NC, K_Q,NC,NC, K_DC1,NC,NC, 0x1b,0x4e,0x71, 0x1b,0x4e,0x51}, -{K_w,NC,NC, K_W,NC,NC, K_ETB,NC,NC, 0x1b,0x4e,0x77, 0x1b,0x4e,0x57}, -{K_e,NC,NC, K_E,NC,NC, K_ENQ,NC,NC, 0x1b,0x4e,0x65, 0x1b,0x4e,0x45}, -{K_r,NC,NC, K_R,NC,NC, K_DC2,NC,NC, 0x1b,0x4e,0x72, 0x1b,0x4e,0x52}, -{K_t,NC,NC, K_T,NC,NC, K_DC4,NC,NC, 0x1b,0x4e,0x74, 0x1b,0x4e,0x54}, -{K_y,NC,NC, K_Y,NC,NC, K_EM,NC,NC, 0x1b,0x4e,0x79, 0x1b,0x4e,0x59}, -{K_u,NC,NC, K_U,NC,NC, K_NAK,NC,NC, 0x1b,0x4e,0x75, 0x1b,0x4e,0x55}, -{K_i,NC,NC, K_I,NC,NC, K_HT,NC,NC, 0x1b,0x4e,0x69, 0x1b,0x4e,0x49}, -{K_o,NC,NC, K_O,NC,NC, K_SI,NC,NC, 0x1b,0x4e,0x6f, 0x1b,0x4e,0x4f}, -{K_p,NC,NC, K_P,NC,NC, K_DLE,NC,NC, 0x1b,0x4e,0x70, 0x1b,0x4e,0x50}, -{K_LBRKT,NC,NC, K_LBRACE,NC,NC, K_ESC,NC,NC, 0x1b,0x4e,0x5b, 0x1b,0x4e,0x7b}, -{K_RBRKT,NC,NC, K_RBRACE,NC,NC, K_GS,NC,NC, 0x1b,0x4e,0x5d, 0x1b,0x4e,0x7d}, -{K_CR,NC,NC, K_CR,NC,NC, K_CR,NC,NC, K_CR,NC,NC, K_CR,NC,NC}, -{K_SCAN,K_CTLSC,NC, K_SCAN,K_CTLSC,NC, K_SCAN,K_CTLSC,NC, K_SCAN,K_CTLSC,NC, - K_SCAN,K_CTLSC,NC}, -{K_a,NC,NC, K_A,NC,NC, K_SOH,NC,NC, 0x1b,0x4e,0x61, 0x1b,0x4e,0x41}, -{K_s,NC,NC, K_S,NC,NC, K_DC3,NC,NC, 0x1b,0x4e,0x73, 0x1b,0x4e,0x53}, -{K_d,NC,NC, K_D,NC,NC, K_EOT,NC,NC, 0x1b,0x4e,0x65, 0x1b,0x4e,0x45}, -{K_f,NC,NC, K_F,NC,NC, K_ACK,NC,NC, 0x1b,0x4e,0x66, 0x1b,0x4e,0x46}, -{K_g,NC,NC, K_G,NC,NC, K_BEL,NC,NC, 0x1b,0x4e,0x67, 0x1b,0x4e,0x47}, -{K_h,NC,NC, K_H,NC,NC, K_BS,NC,NC, 0x1b,0x4e,0x68, 0x1b,0x4e,0x48}, -{K_j,NC,NC, K_J,NC,NC, K_LF,NC,NC, 0x1b,0x4e,0x6a, 0x1b,0x4e,0x4a}, -{K_k,NC,NC, K_K,NC,NC, K_VT,NC,NC, 0x1b,0x4e,0x6b, 0x1b,0x4e,0x4b}, -{K_l,NC,NC, K_L,NC,NC, K_FF,NC,NC, 0x1b,0x4e,0x6c, 0x1b,0x4e,0x4c}, -{K_SEMI,NC,NC, K_COLON,NC,NC, K_SEMI,NC,NC, 0x1b,0x4e,0x3b, 0x1b,0x4e,0x3a}, -{K_SQUOTE,NC,NC,K_DQUOTE,NC,NC,K_SQUOTE,NC,NC,0x1b,0x4e,0x27,0x1b,0x4e,0x22}, -{K_GRAV,NC,NC, K_TILDE,NC,NC, K_RS,NC,NC, 0x1b,0x4e,0x60, 0x1b,0x4e,0x7e}, +{NC,NC,NC, NC,NC,NC, NC,NC,NC, NC,NC,NC, NC,NC,NC}, +{K_ESC,NC,NC, K_ESC,NC,NC, K_ESC,NC,NC, 0x1b,K_ESC,NC, K_ESC,NC,NC}, +{K_ONE,NC,NC, K_BANG,NC,NC, K_ONE,NC,NC, 0x1b,0x31,NC, 0x1b,0x4e,0x21}, +{K_TWO,NC,NC, K_ATSN,NC,NC, K_NUL,NC,NC, 0x1b,0x32,NC, 0x1b,0x4e,0x40}, +{K_THREE,NC,NC, K_POUND,NC,NC, K_THREE,NC,NC, 0x1b,0x33,NC, 0x1b,0x4e,0x23}, +{K_FOUR,NC,NC, K_DOLLAR,NC,NC, K_FOUR,NC,NC, 0x1b,0x34,NC, 0x1b,0x4e,0x24}, +{K_FIVE,NC,NC, K_PERC,NC,NC, K_FIVE,NC,NC, 0x1b,0x35,NC, 0x1b,0x4e,0x25}, +{K_SIX,NC,NC, K_CARET,NC,NC, K_RS,NC,NC, 0x1b,0x36,NC, 0x1b,0x4e,0x5e}, +{K_SEVEN,NC,NC, K_AMPER,NC,NC, K_SEVEN,NC,NC, 0x1b,0x37,NC, 0x1b,0x4e,0x26}, +{K_EIGHT,NC,NC, K_ASTER,NC,NC, K_EIGHT,NC,NC, 0x1b,0x38,NC, 0x1b,0x4e,0x2a}, +{K_NINE,NC,NC, K_LPAREN,NC,NC, K_NINE,NC,NC, 0x1b,0x39,NC, 0x1b,0x4e,0x28}, +{K_ZERO,NC,NC, K_RPAREN,NC,NC, K_ZERO,NC,NC, 0x1b,0x30,NC, 0x1b,0x4e,0x29}, +{K_MINUS,NC,NC, K_UNDSC,NC,NC, K_US,NC,NC, 0x1b,0x2d,NC, 0x1b,0x4e,0x5f}, +{K_EQL,NC,NC, K_PLUS,NC,NC, K_EQL,NC,NC, 0x1b,0x3d,NC, 0x1b,0x4e,0x2b}, +{K_DEL,NC,NC, K_DEL,NC,NC, K_DEL,NC,NC, 0x1b,K_DEL,NC, K_DEL,NC,NC}, +{K_HT,NC,NC, K_GS,NC,NC, K_HT,NC,NC, 0x1b,K_HT,NC, K_GS,NC,NC}, +{K_q,NC,NC, K_Q,NC,NC, K_DC1,NC,NC, 0x1b,0x71,NC, 0x1b,0x4e,0x51}, +{K_w,NC,NC, K_W,NC,NC, K_ETB,NC,NC, 0x1b,0x77,NC, 0x1b,0x4e,0x57}, +{K_e,NC,NC, K_E,NC,NC, K_ENQ,NC,NC, 0x1b,0x65,NC, 0x1b,0x4e,0x45}, +{K_r,NC,NC, K_R,NC,NC, K_DC2,NC,NC, 0x1b,0x72,NC, 0x1b,0x4e,0x52}, +{K_t,NC,NC, K_T,NC,NC, K_DC4,NC,NC, 0x1b,0x74,NC, 0x1b,0x4e,0x54}, +{K_y,NC,NC, K_Y,NC,NC, K_EM,NC,NC, 0x1b,0x79,NC, 0x1b,0x4e,0x59}, +{K_u,NC,NC, K_U,NC,NC, K_NAK,NC,NC, 0x1b,0x75,NC, 0x1b,0x4e,0x55}, +{K_i,NC,NC, K_I,NC,NC, K_HT,NC,NC, 0x1b,0x69,NC, 0x1b,0x4e,0x49}, +{K_o,NC,NC, K_O,NC,NC, K_SI,NC,NC, 0x1b,0x6f,NC, 0x1b,0x4e,0x4f}, +{K_p,NC,NC, K_P,NC,NC, K_DLE,NC,NC, 0x1b,0x70,NC, 0x1b,0x4e,0x50}, +{K_LBRKT,NC,NC, K_LBRACE,NC,NC, K_ESC,NC,NC, 0x1b,0x5b,NC, 0x1b,0x4e,0x7b}, +{K_RBRKT,NC,NC, K_RBRACE,NC,NC, K_GS,NC,NC, 0x1b,0x5d,NC, 0x1b,0x4e,0x7d}, +{K_CR,NC,NC, K_CR,NC,NC, K_CR,NC,NC, 0x1b,K_CR,NC, K_CR,NC,NC}, +{K_SCAN,K_CTLSC,NC, K_SCAN,K_CTLSC,NC, K_SCAN,K_CTLSC,NC, K_SCAN,K_CTLSC,NC, + K_SCAN,K_CTLSC,NC}, +{K_a,NC,NC, K_A,NC,NC, K_SOH,NC,NC, 0x1b,0x61,NC, 0x1b,0x4e,0x41}, +{K_s,NC,NC, K_S,NC,NC, K_DC3,NC,NC, 0x1b,0x73,NC, 0x1b,0x4e,0x53}, +{K_d,NC,NC, K_D,NC,NC, K_EOT,NC,NC, 0x1b,0x64,NC, 0x1b,0x4e,0x45}, +{K_f,NC,NC, K_F,NC,NC, K_ACK,NC,NC, 0x1b,0x66,NC, 0x1b,0x4e,0x46}, +{K_g,NC,NC, K_G,NC,NC, K_BEL,NC,NC, 0x1b,0x67,NC, 0x1b,0x4e,0x47}, +{K_h,NC,NC, K_H,NC,NC, K_BS,NC,NC, 0x1b,0x68,NC, 0x1b,0x4e,0x48}, +{K_j,NC,NC, K_J,NC,NC, K_LF,NC,NC, 0x1b,0x6a,NC, 0x1b,0x4e,0x4a}, +{K_k,NC,NC, K_K,NC,NC, K_VT,NC,NC, 0x1b,0x6b,NC, 0x1b,0x4e,0x4b}, +{K_l,NC,NC, K_L,NC,NC, K_FF,NC,NC, 0x1b,0x6c,NC, 0x1b,0x4e,0x4c}, +{K_SEMI,NC,NC, K_COLON,NC,NC, K_SEMI,NC,NC, 0x1b,0x3b,NC, 0x1b,0x4e,0x3a}, +{K_SQUOTE,NC,NC,K_DQUOTE,NC,NC, K_SQUOTE,NC,NC,0x1b,0x27,NC, 0x1b,0x4e,0x22}, +{K_GRAV,NC,NC, K_TILDE,NC,NC, K_RS,NC,NC, 0x1b,0x60,NC, 0x1b,0x4e,0x7e}, {K_SCAN,K_LSHSC,NC, K_SCAN,K_LSHSC,NC, K_SCAN,K_LSHSC,NC, K_SCAN,K_LSHSC,NC, - K_SCAN,K_LSHSC,NC}, -{K_BSLSH,NC,NC, K_PIPE,NC,NC, K_FS,NC,NC, 0x1b,0x4e,0x5c, 0x1b,0x4e,0x7c}, -{K_z,NC,NC, K_Z,NC,NC, K_SUB,NC,NC, 0x1b,0x4e,0x7a, 0x1b,0x4e,0x5a}, -{K_x,NC,NC, K_X,NC,NC, K_CAN,NC,NC, 0x1b,0x4e,0x78, 0x1b,0x4e,0x58}, -{K_c,NC,NC, K_C,NC,NC, K_ETX,NC,NC, 0x1b,0x4e,0x63, 0x1b,0x4e,0x43}, -{K_v,NC,NC, K_V,NC,NC, K_SYN,NC,NC, 0x1b,0x4e,0x76, 0x1b,0x4e,0x56}, -{K_b,NC,NC, K_B,NC,NC, K_STX,NC,NC, 0x1b,0x4e,0x62, 0x1b,0x4e,0x42}, -{K_n,NC,NC, K_N,NC,NC, K_SO,NC,NC, 0x1b,0x4e,0x6e, 0x1b,0x4e,0x4e}, -{K_m,NC,NC, K_M,NC,NC, K_CR,NC,NC, 0x1b,0x4e,0x6d, 0x1b,0x4e,0x4d}, -{K_COMMA,NC,NC, K_LTHN,NC,NC, K_COMMA,NC,NC, 0x1b,0x4e,0x2c, 0x1b,0x4e,0x3c}, -{K_PERIOD,NC,NC, K_GTHN,NC,NC, K_PERIOD,NC,NC,0x1b,0x4e,0x2e,0x1b,0x4e,0x3e}, -{K_SLASH,NC,NC, K_QUES,NC,NC, K_SLASH,NC,NC, 0x1b,0x4e,0x2f, 0x1b,0x4e,0x3f}, -{K_SCAN,K_RSHSC,NC, K_SCAN,K_RSHSC,NC, K_SCAN,K_RSHSC,NC, K_SCAN,K_RSHSC,NC, - K_SCAN,K_RSHSC,NC}, -{K_ASTER,NC,NC, K_ASTER,NC,NC, K_ASTER,NC,NC, 0x1b,0x4e,0x2a,0x1b,0x4e,0x2a}, -{K_SCAN,K_ALTSC,NC, K_SCAN,K_ALTSC,NC, K_SCAN,K_ALTSC,NC, K_SCAN,K_ALTSC,NC, - K_SCAN,K_ALTSC,NC}, -{K_SPACE,NC,NC, K_SPACE,NC,NC, K_NUL,NC,NC, K_SPACE,NC,NC, K_SPACE,NC,NC}, -{K_SCAN,K_CLCKSC,NC, K_SCAN,K_CLCKSC,NC, K_SCAN,K_CLCKSC,NC, - K_SCAN,K_CLCKSC,NC, K_SCAN,K_CLCKSC,NC}, -{K_F1, K_F1S, K_F1, K_F1, K_F1S}, -{K_F2, K_F2S, K_F2, K_F2, K_F2S}, -{K_F3, K_F3S, K_F3, K_F3, K_F3S}, -{K_F4, K_F4S, K_F4, K_F4, K_F4S}, -{K_F5, K_F5S, K_F5, K_F5, K_F5S}, -{K_F6, K_F6S, K_F6, K_F6, K_F6S}, -{K_F7, K_F7S, K_F7, K_F7, K_F7S}, -{K_F8, K_F8S, K_F8, K_F8, K_F8S}, -{K_F9, K_F9S, K_F9, K_F9, K_F9S}, -{K_F10, K_F10S, K_F10, K_F10, K_F10S}, -{K_SCAN,K_NLCKSC,NC, K_SCAN,K_NLCKSC,NC, K_SCAN,K_NLCKSC,NC, - K_SCAN,K_NLCKSC,NC, K_SCAN,K_NLCKSC,NC}, -{K_SCRL, K_NUL,NC,NC, K_SCRL, K_SCRL, K_NUL,NC,NC}, -{K_HOME, K_SEVEN,NC,NC, K_HOME, K_HOME, 0x1b,0x4e,0x37}, -{K_UA, K_EIGHT,NC,NC, K_UA, K_UA, 0x1b,0x4e,0x38}, -{K_PUP, K_NINE,NC,NC, K_PUP, K_PUP, 0x1b,0x4e,0x39}, -{0x1b,0x5b,0x53, K_MINUS,NC,NC, 0x1b,0x5b,0x53,0x1b,0x5b,0x53,0x1b,0x4e,0x2d}, -{K_LA, K_FOUR,NC,NC, K_LA, K_LA, 0x1b,0x4e,0x34}, -{0x1b,0x5b,0x47,K_FIVE,NC,NC,0x1b,0x5b,0x47, 0x1b,0x5b,0x47, 0x1b,0x4e,0x35}, -{K_RA, K_SIX,NC,NC, K_RA, K_RA, 0x1b,0x4e,0x36}, -{0x1b,0x5b,0x54,K_PLUS,NC,NC, 0x1b,0x5b,0x54, 0x1b,0x5b,0x54, 0x1b,0x4e,0x2b}, -{K_END, K_ONE,NC,NC, K_END, K_END, 0x1b,0x4e,0x31}, -{K_DA, K_TWO,NC,NC, K_DA, K_DA, 0x1b,0x4e,0x32}, -{K_PDN, K_THREE,NC,NC, K_PDN, K_PDN, 0x1b,0x4e,0x33}, -{K_INS, K_ZERO,NC,NC, K_INS, K_INS, 0x1b,0x4e,0x30}, -{K_DEL,NC,NC, K_PERIOD,NC,NC, K_DEL,NC,NC, K_DEL,NC,NC, 0x1b,0x4e,0x2e}, -{NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC}, -{NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC}, -{NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC}, -{K_F11, K_F11S, K_F11, K_F11, K_F11S}, -{K_F12, K_F12S, K_F12, K_F12, K_F12S} + K_SCAN,K_LSHSC,NC}, +{K_BSLSH,NC,NC, K_PIPE,NC,NC, K_FS,NC,NC, 0x1b,0x5c,NC, 0x1b,0x4e,0x7c}, +{K_z,NC,NC, K_Z,NC,NC, K_SUB,NC,NC, 0x1b,0x7a,NC, 0x1b,0x4e,0x5a}, +{K_x,NC,NC, K_X,NC,NC, K_CAN,NC,NC, 0x1b,0x78,NC, 0x1b,0x4e,0x58}, +{K_c,NC,NC, K_C,NC,NC, K_ETX,NC,NC, 0x1b,0x63,NC, 0x1b,0x4e,0x43}, +{K_v,NC,NC, K_V,NC,NC, K_SYN,NC,NC, 0x1b,0x76,NC, 0x1b,0x4e,0x56}, +{K_b,NC,NC, K_B,NC,NC, K_STX,NC,NC, 0x1b,0x62,NC, 0x1b,0x4e,0x42}, +{K_n,NC,NC, K_N,NC,NC, K_SO,NC,NC, 0x1b,0x6e,NC, 0x1b,0x4e,0x4e}, +{K_m,NC,NC, K_M,NC,NC, K_CR,NC,NC, 0x1b,0x6d,NC, 0x1b,0x4e,0x4d}, +{K_COMMA,NC,NC, K_LTHN,NC,NC, K_COMMA,NC,NC, 0x1b,0x2c,NC, 0x1b,0x4e,0x3c}, +{K_PERIOD,NC,NC,K_GTHN,NC,NC, K_PERIOD,NC,NC,0x1b,0x2e,NC, 0x1b,0x4e,0x3e}, +{K_SLASH,NC,NC, K_QUES,NC,NC, K_SLASH,NC,NC, 0x1b,0x2f,NC, 0x1b,0x4e,0x3f}, +{K_SCAN,K_RSHSC,NC, K_SCAN,K_RSHSC,NC, K_SCAN,K_RSHSC,NC, K_SCAN,K_RSHSC,NC, + K_SCAN,K_RSHSC,NC}, +{K_ASTER,NC,NC, K_ASTER,NC,NC, K_ASTER,NC,NC, 0x1b,0x4e,0x2a,0x1b,0x4e,0x2a}, +{K_SCAN,K_ALTSC,NC, K_SCAN,K_ALTSC,NC, K_SCAN,K_ALTSC,NC, K_SCAN,K_ALTSC,NC, + K_SCAN,K_ALTSC,NC}, +{K_SPACE,NC,NC, K_SPACE,NC,NC, K_NUL,NC,NC, 0x1b,K_SPACE,NC, K_SPACE,NC,NC}, +{K_SCAN,K_CLCKSC,NC, K_SCAN,K_CLCKSC,NC, K_SCAN,K_CLCKSC,NC, + K_SCAN,K_CLCKSC,NC, K_SCAN,K_CLCKSC,NC}, +{K_F1, K_F1S, K_F1, K_F1A, K_F1S}, +{K_F2, K_F2S, K_F2, K_F2A, K_F2S}, +{K_F3, K_F3S, K_F3, K_F3A, K_F3S}, +{K_F4, K_F4S, K_F4, K_F4A, K_F4S}, +{K_F5, K_F5S, K_F5, K_F5A, K_F5S}, +{K_F6, K_F6S, K_F6, K_F6A, K_F6S}, +{K_F7, K_F7S, K_F7, K_F7A, K_F7S}, +{K_F8, K_F8S, K_F8, K_F8A, K_F8S}, +{K_F9, K_F9S, K_F9, K_F9A, K_F9S}, +{K_F10, K_F10S, K_F10, K_F10A, K_F10S}, +{K_SCAN,K_NLCKSC,NC, K_SCAN,K_NLCKSC,NC, K_SCAN,K_NLCKSC,NC, + K_SCAN,K_NLCKSC,NC, K_SCAN,K_NLCKSC,NC}, +{K_SCRL, K_NUL,NC,NC, K_SCRL, K_SCRL, K_NUL,NC,NC}, +{K_HOME, K_SEVEN,NC,NC, K_HOME, K_HOME, 0x1b,0x4e,0x37}, +{K_UA, K_EIGHT,NC,NC, K_UA, K_UA, 0x1b,0x4e,0x38}, +{K_PUP, K_NINE,NC,NC, K_PUP, K_PUP, 0x1b,0x4e,0x39}, +{0x1b,0x5b,0x53, K_MINUS,NC,NC, 0x1b,0x5b,0x53, 0x1b,0x5b,0x53, + 0x1b,0x4e,0x2d}, +{K_LA, K_FOUR,NC,NC, K_LA, K_LA, 0x1b,0x4e,0x34}, +{0x1b,0x5b,0x47, K_FIVE,NC,NC, 0x1b,0x5b,0x47, 0x1b,0x5b,0x47, + 0x1b,0x4e,0x35}, +{K_RA, K_SIX,NC,NC, K_RA, K_RA, 0x1b,0x4e,0x36}, +{0x1b,0x5b,0x54, K_PLUS,NC,NC, 0x1b,0x5b,0x54, 0x1b,0x5b,0x54, + 0x1b,0x4e,0x2b}, +{K_END, K_ONE,NC,NC, K_END, K_END, 0x1b,0x4e,0x31}, +{K_DA, K_TWO,NC,NC, K_DA, K_DA, 0x1b,0x4e,0x32}, +{K_PDN, K_THREE,NC,NC, K_PDN, K_PDN, 0x1b,0x4e,0x33}, +{K_INS, K_ZERO,NC,NC, K_INS, K_INS, 0x1b,0x4e,0x30}, +{0x1b,0x5b,0x39, K_PERIOD,NC,NC, K_DEL,NC,NC, K_DEL,NC,NC, 0x1b,0x4e,0x2e}, +{NC,NC,NC, NC,NC,NC, NC,NC,NC, NC,NC,NC, NC,NC,NC}, +{NC,NC,NC, NC,NC,NC, NC,NC,NC, NC,NC,NC, NC,NC,NC}, +{NC,NC,NC, NC,NC,NC, NC,NC,NC, NC,NC,NC, NC,NC,NC}, +{K_F11, K_F11S, K_F11, K_F11A, K_F11S}, +{K_F12, K_F12S, K_F12, K_F12A, K_F12S} }; @@ -382,10 +402,10 @@ short font_byte_width = 0; /* num bytes int kd_pollc = 0; #ifdef DEBUG -/* +/* * feep: * - * Ring the bell for a short time. + * Ring the bell for a short time. * Warning: uses outb(). You may prefer to use kd_debug_put. */ feep() @@ -406,9 +426,9 @@ pause() ; } -/* +/* * Put a debugging character on the screen. - * LOC=0 means put it in the bottom right corner, LOC=1 means put it + * LOC=0 means put it in the bottom right corner, LOC=1 means put it * one column to the left, etc. */ kd_debug_put(loc, c) @@ -487,7 +507,7 @@ kdopen(dev, flag, ior) /* * Special support for boot-time rc scripts, which don't * stty the console. - */ + */ tp->t_oproc = kdstart; tp->t_stop = kdstop; tp->t_ospeed = tp->t_ispeed = B9600; @@ -513,7 +533,7 @@ kdopen(dev, flag, ior) * closing the line discipline. * * input: device number 'dev', and flag - * + * * output: device is closed * */ @@ -557,7 +577,7 @@ int dev; struct uio *uio; { struct tty *tp; - + tp = &kd_tty; tp->t_state |= TS_CARR_ON; return((*linesw[kd_tty.t_line].l_read)(tp, uio)); @@ -583,7 +603,7 @@ struct uio *uio; return((*linesw[kd_tty.t_line].l_write)(&kd_tty, uio)); } -/* +/* * Mmap. */ @@ -669,10 +689,10 @@ io_return_t kdsetstat(dev, flavor, data, -/* +/* * kdsetbell: - * - * Turn the bell on or off. Returns error code, if given bogus + * + * Turn the bell on or off. Returns error code, if given bogus * on/off value. */ kdsetbell(val, flags) @@ -693,9 +713,9 @@ int flags; /* flags set for console * } -/* +/* * kdgetkbent: - * + * * Get entry from key mapping table. Returns error code, if any. */ kdgetkbent(kbent) @@ -713,9 +733,9 @@ struct kbentry * kbent; } -/* +/* * kdsetkbent: - * + * * Set entry in key mapping table. Return error code, if any. */ int @@ -740,8 +760,8 @@ int flags; /* flags set for console * * * This function is the interrupt code for the driver. Since this is * a special tty (console), interrupts are only for input, so we read in - * the character. If in ascii mode, we then do the mapping translation - * from the keyboard switch table and place the characters on the tty's + * the character. If in ascii mode, we then do the mapping translation + * from the keyboard switch table and place the characters on the tty's * input switch table. If in event mode, we create and queue a kd_event. * * input: interrupt vector 'vec' @@ -767,29 +787,29 @@ int regs; tp = &kd_tty; #ifdef old while ((inb(K_STATUS) & K_OBUF_FUL) == 0); /* this should never loop */ -#else old +#else /* old */ { /* - * Allow for keyboards that raise interrupt before + * Allow for keyboards that raise interrupt before * the character gets to the buffer. But don't wait * forever if grabbing the character by polling leaves * the interrupt on but buffer empty. */ /* - * Micronics VLB motherboard with 486DX2 can report keyboard + * Micronics VLB motherboard with 486DX2 can report keyboard * interrupt before K_STATUS register indicates that the * output buffer is full. Moreover, the bus won't settle w * while we poll K_STATUS at speed. Temporary fix is to break - * out after safety runs out and pick up keyboard event. This - * should be fixed eventually by putting a 1us timout between - * inb's to K_STATUS and fix the pic initialization order to + * out after safety runs out and pick up keyboard event. This + * should be fixed eventually by putting a 1us timout between + * inb's to K_STATUS and fix the pic initialization order to * avoid bootup keyboard wedging (ie make kd a real device) */ int safety = 1000; while ((inb(K_STATUS) & K_OBUF_FUL) == 0) if (!safety--) break; /* XXX */ } -#endif old +#endif /* old */ /* * We may have seen a mouse event. */ @@ -804,9 +824,8 @@ int regs; } scancode = inb(K_RDWR); - if (scancode == K_EXTEND) { - if (kb_mode != KB_EVENT) - kd_extended = TRUE; + if (scancode == K_EXTEND && kb_mode != KB_EVENT) { + kd_extended = TRUE; goto done; } else if (scancode == K_RESEND) { kd_resend(); @@ -867,13 +886,13 @@ int regs; } } - /* + /* * here's where we actually put the char (or * char sequence, for function keys) onto the * input queue. */ - for ( ; (c != K_DONE) && (char_idx <= max); - c = key_map[scancode][char_idx++]) { + for ( ; (c != K_DONE) && (char_idx <= max); + c = key_map[scancode][char_idx++]) { (*linesw[tp->t_line].l_rint)(c, tp); } kd_extended = FALSE; @@ -884,10 +903,10 @@ int regs; return; } -/* +/* * kd_handle_ack: - * - * For pending commands, complete the command. For data bytes, + * + * For pending commands, complete the command. For data bytes, * drop the ack on the floor. */ kd_handle_ack() @@ -909,14 +928,14 @@ kd_handle_ack() } } -/* +/* * kd_resend: * * Resend a missed keyboard command or data byte. */ kd_resend() { - if (kd_ack == NOT_WAITING) + if (kd_ack == NOT_WAITING) printf("unexpected RESEND from keyboard\n"); else kd_senddata(last_sent); @@ -929,9 +948,9 @@ kd_resend() * Change keyboard state according to which modifier key and * whether it went down or up. * - * input: the current state, the key, and the key's direction. + * input: the current state, the key, and the key's direction. * The key can be any key, not just a modifier key. - * + * * output: the new state */ do_modifier(state, c, up) @@ -949,7 +968,7 @@ boolean_t up; break; #ifndef ORC case (K_CLCKSC): -#endif ORC +#endif /* ORC */ case (K_CTLSC): if (up) state &= ~KS_CTLED; @@ -962,7 +981,7 @@ boolean_t up; if (!up) state ^= KS_CLKED; break; -#endif ORC +#endif /* ORC */ case (K_NLCKSC): if (!up) state ^= KS_NLKED; @@ -981,21 +1000,21 @@ boolean_t up; } -/* +/* * kdcheckmagic: - * - * Check for magic keystrokes for invoking the debugger or + * + * Check for magic keystrokes for invoking the debugger or * rebooting or ... * * input: an unprocessed scancode - * - * output: TRUE if a magic key combination was recognized and + * + * output: TRUE if a magic key combination was recognized and * processed. FALSE otherwise. * - * side effects: + * side effects: * various actions possible, depending on which keys are - * pressed. If the debugger is called, steps are taken - * to ensure that the system doesn't think the magic keys + * pressed. If the debugger is called, steps are taken + * to ensure that the system doesn't think the magic keys * are still held down. */ boolean_t @@ -1038,7 +1057,7 @@ int *regs; } return(TRUE); break; -#endif MACH_KDB +#endif /* MACH_KDB */ case K_DELSC: /* ctl-alt-del */ /* if rebootflag is on, reboot the system */ if (rebootflag) @@ -1053,7 +1072,7 @@ int *regs; /* * kdstate2idx: * - * Return the value for the 2nd index into key_map that + * Return the value for the 2nd index into key_map that * corresponds to the given state. */ kdstate2idx(state, extended) @@ -1065,12 +1084,15 @@ boolean_t extended; if ((!extended) && state != KS_NORMAL) { if ((state&(KS_SHIFTED|KS_ALTED)) == (KS_SHIFTED|KS_ALTED)) state_idx = SHIFT_ALT; + /* CTRL should have higher priority than SHIFT. That + way, CTRL-SHIFT-2 and CTRL-2 produce the same keycode. + --Derek Upham 1997/06/25 */ + else if (state&KS_CTLED) + state_idx = CTRL_STATE; else if (state&KS_SHIFTED) state_idx = SHIFT_STATE; else if (state&KS_ALTED) state_idx = ALT_STATE; - else if (state&KS_CTLED) - state_idx = CTRL_STATE; } return (CHARIDX(state_idx)); @@ -1098,11 +1120,11 @@ struct tty *tp; spl_t o_pri; int ch; unsigned char c; - + if (tp->t_state & TS_TTSTOP) return; for ( ; ; ) { - tp->t_state &= ~TS_BUSY; + tp->t_state &= ~TS_BUSY; if (tp->t_state & TS_TTSTOP) break; if ((tp->t_outq.c_cc <= 0) || (ch = getc(&tp->t_outq)) == -1) @@ -1156,7 +1178,7 @@ kdstop(tp, flags) * kdinit: * * This code initializes the structures and sets up the port registers - * for the console driver. + * for the console driver. * * Each bitmap-based graphics card is likely to require a unique * way to determine the card's presence. The driver runs through @@ -1179,6 +1201,8 @@ kdinit() esc_spt = esc_seq; kd_attr = KA_NORMAL; + kd_attrflags = 0; + kd_color = KA_NORMAL; /* * board specific initialization: set up globals and kd_dxxx * pointers, and synch displayed cursor with logical cursor. @@ -1186,7 +1210,7 @@ kdinit() if (!evc1init()) if (blit_present()) blit_init(); - else + else kd_xga_init(); /* get rid of any garbage in output buffer */ @@ -1288,11 +1312,11 @@ u_char ch; if ((!ch) && sit_for_0) return; - switch (ch) { + switch (ch) { case ((K_LF)): kd_down(); break; - case ((K_CR)): + case ((K_CR)): kd_cr(); break; case ((K_BS)): @@ -1407,7 +1431,7 @@ kd_scrolldn() count = ONE_LINE/ONE_SPACE; (*kd_dclear)(to, count, kd_attr); return; - + } @@ -1415,7 +1439,7 @@ kd_scrolldn() * kd_parseesc: * * This routine begins the parsing of an escape sequence. It uses the - * escape sequence array and the escape spot pointer to handle + * escape sequence array and the escape spot pointer to handle * asynchronous parsing of escape sequences. * * input : String of characters prepended by an escape @@ -1450,6 +1474,37 @@ kd_parseesc() } +/* kd_update_kd_attr: + * + * Updates kd_attr according to kd_attrflags and kd_color. + * This code has its origin from console.c and selection.h in + * linux 2.2 drivers/char/. + * Modified for GNU Mach by Marcus Brinkmann. + */ + +#define reverse_video_char(a) (((a) & 0x88) | ((((a) >> 4) | ((a) << 4)) & 0x77)) +void +kd_update_kd_attr(void) +{ + kd_attr = kd_color; + if (kd_attrflags & KAX_UNDERLINE) + kd_attr = (kd_attr & 0xf0) | KAX_COL_UNDERLINE; + else if (kd_attrflags & KAX_DIM) + kd_attr = (kd_attr & 0xf0) | KAX_COL_DIM; + if (kd_attrflags & KAX_REVERSE) + kd_attr = reverse_video_char(kd_attr); + if (kd_attrflags & KAX_BLINK) + kd_attr ^= 0x80; + if (kd_attrflags & KAX_BOLD) + kd_attr ^= 0x08; +} + +/* color_table added by Julio Merino to take proper color order. + * I get this code from Linux 2.2 source code in file: + * linux/drivers/char/console.c + */ +unsigned char color_table[] = { 0, 4, 2, 6, 1, 5, 3, 7, + 8,12,10,14, 9,13,11,15 }; /* * kd_parserest: * @@ -1466,140 +1521,182 @@ kd_parseesc() kd_parserest(cp) u_char *cp; { - int number; + int number[16], npar = 0, i; csrpos_t newpos; - cp += kd_atoi(cp, &number); + for(i=0;i<=15;i++) + number[i] = DEFAULT; + + do { + cp += kd_atoi(cp, &number[npar]); + } while (*cp == ';' && ++npar <= 15 && cp++); + switch(*cp) { case 'm': - switch(number) { - case DEFAULT: - case 0: - kd_attr = KA_NORMAL; - break; - case 7: - kd_attr = KA_REVERSE; - break; - default: - kd_attr = KA_NORMAL; - break; - } + for (i=0;i<=npar;i++) + switch(number[i]) { + case DEFAULT: + case 0: + kd_attrflags = 0; + kd_color = KA_NORMAL; + break; + case 1: + kd_attrflags |= KAX_BOLD; + kd_attrflags &= ~KAX_DIM; + break; + case 2: + kd_attrflags |= KAX_DIM; + kd_attrflags &= ~KAX_BOLD; + break; + case 4: + kd_attrflags |= KAX_UNDERLINE; + break; + case 5: + kd_attrflags |= KAX_BLINK; + break; + case 7: + kd_attrflags |= KAX_REVERSE; + break; + case 8: + kd_attrflags |= KAX_INVISIBLE; + break; + case 21: + case 22: + kd_attrflags &= ~(KAX_BOLD | KAX_DIM); + break; + case 24: + kd_attrflags &= ~KAX_UNDERLINE; + break; + case 25: + kd_attrflags &= ~KAX_BLINK; + break; + case 27: + kd_attrflags &= ~KAX_REVERSE; + break; + case 38: + kd_attrflags |= KAX_UNDERLINE; + kd_color = (kd_color & 0xf0) | (KA_NORMAL & 0x0f); + break; + case 39: + kd_attrflags &= ~KAX_UNDERLINE; + kd_color = (kd_color & 0xf0) | (KA_NORMAL & 0x0f); + break; + default: + if (number[i] >= 30 && number[i] <= 37) { + /* foreground color */ + kd_color = (kd_color & 0xf0) | color_table[(number[i] - 30)]; + } else if (number[i] >= 40 && number[i] <= 47) { + /* background color */ + kd_color = (kd_color & 0x0f) | (color_table[(number[i] - 40)] << 4); + } + break; + } + kd_update_kd_attr(); esc_spt = esc_seq; break; case '@': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_insch(1); else - kd_insch(number); - esc_spt = esc_seq; - break; - case 'H': - kd_home(); + kd_insch(number[0]); esc_spt = esc_seq; break; case 'A': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_up(); else - while (number--) + while (number[0]--) kd_up(); esc_spt = esc_seq; break; case 'B': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_down(); else - while (number--) + while (number[0]--) kd_down(); esc_spt = esc_seq; break; case 'C': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_right(); else - while (number--) + while (number[0]--) kd_right(); esc_spt = esc_seq; break; case 'D': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_left(); else - while (number--) + while (number[0]--) kd_left(); esc_spt = esc_seq; break; case 'E': kd_cr(); - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_down(); else - while (number--) + while (number[0]--) kd_down(); esc_spt = esc_seq; break; case 'F': kd_cr(); - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_up(); else - while (number--) + while (number[0]--) kd_up(); esc_spt = esc_seq; break; case 'G': - if (number == DEFAULT) - number = 0; + if (number[0] == DEFAULT) + number[0] = 0; else - if (number > 0) - --number; /* because number is from 1 */ - kd_setpos(BEG_OF_LINE(kd_curpos) + number * ONE_SPACE); + if (number[0] > 0) + --number[0]; /* because number[0] is from 1 */ + kd_setpos(BEG_OF_LINE(kd_curpos) + number[0] * ONE_SPACE); esc_spt = esc_seq; break; - case ';': - ++cp; - if (*cp == '\0') - break; /* not ready yet */ - if (number == DEFAULT) - number = 0; - else - if (number > 0) - --number; /* numbered from 1 */ - newpos = (number * ONE_LINE); /* setup row */ - cp += kd_atoi(cp, &number); - if (*cp == '\0') - break; /* not ready yet */ - if (number == DEFAULT) - number = 0; - else if (number > 0) - number--; - newpos += (number * ONE_SPACE); /* setup column */ + case 'f': + case 'H': + if (number[0] == DEFAULT && number[1] == DEFAULT) + { + kd_home(); + esc_spt = esc_seq; + break; + } + if (number[0] == DEFAULT) + number[0] = 0; + else if (number[0] > 0) + --number[0]; /* numbered from 1 */ + newpos = (number[0] * ONE_LINE); /* setup row */ + if (number[1] == DEFAULT) + number[1] = 0; + else if (number[1] > 0) + number[1]--; + newpos += (number[1] * ONE_SPACE); /* setup column */ if (newpos < 0) newpos = 0; /* upper left */ if (newpos > ONE_PAGE) - newpos = (ONE_PAGE - ONE_SPACE); - /* lower right */ - if (*cp == '\0') - break; /* not ready yet */ - if (*cp == 'H') { - kd_setpos(newpos); - esc_spt = esc_seq; /* done, reset */ - } - else - esc_spt = esc_seq; + newpos = (ONE_PAGE - ONE_SPACE); /* lower right */ + kd_setpos(newpos); + esc_spt = esc_seq; break; /* done or not ready */ case 'J': - switch(number) { + switch(number[0]) { case DEFAULT: case 0: kd_cltobcur(); /* clears from current pos to bottom. - */ + */ break; case 1: kd_cltopcur(); /* clears from top to current pos. - */ + */ break; case 2: kd_cls(); @@ -1610,12 +1707,12 @@ u_char *cp; esc_spt = esc_seq; /* reset it */ break; case 'K': - switch(number) { + switch(number[0]) { case DEFAULT: case 0: kd_cltoecur(); /* clears from current pos to eoln. - */ + */ break; case 1: kd_clfrbcur(); /* clears from begin @@ -1632,49 +1729,49 @@ u_char *cp; esc_spt = esc_seq; break; case 'L': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_insln(1); else - kd_insln(number); + kd_insln(number[0]); esc_spt = esc_seq; break; case 'M': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_delln(1); else - kd_delln(number); + kd_delln(number[0]); esc_spt = esc_seq; break; case 'P': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_delch(1); else - kd_delch(number); + kd_delch(number[0]); esc_spt = esc_seq; break; case 'S': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_scrollup(); else - while (number--) + while (number[0]--) kd_scrollup(); esc_spt = esc_seq; break; case 'T': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_scrolldn(); else - while (number--) + while (number[0]--) kd_scrolldn(); esc_spt = esc_seq; break; case 'X': - if (number == DEFAULT) + if (number[0] == DEFAULT) kd_erase(1); else - kd_erase(number); + kd_erase(number[0]); esc_spt = esc_seq; - break; + break; case '\0': break; /* not enough yet */ default: @@ -1898,7 +1995,7 @@ kd_cltopcur() /* * kd_cltoecur: * - * This function clears from the current cursor position to eoln. + * This function clears from the current cursor position to eoln. * * input : None * output : Line is cleared from current cursor position to eoln @@ -2016,7 +2113,7 @@ int number; /* * kd_delch: * - * This function deletes a number of characters from the current + * This function deletes a number of characters from the current * position in the line. * * input : number of characters to delete @@ -2070,7 +2167,7 @@ int number; csrpos_t i; csrpos_t stop; - stop = kd_curpos + (ONE_SPACE * number); + stop = kd_curpos + (ONE_SPACE * number); if (stop > BEG_OF_LINE(kd_curpos) + ONE_LINE) stop = BEG_OF_LINE(kd_curpos) + ONE_LINE; for (i = kd_curpos; i < stop; i += ONE_SPACE) { @@ -2095,7 +2192,7 @@ kd_eraseln() csrpos_t stop; stop = BEG_OF_LINE(kd_curpos) + ONE_LINE; - for (i = BEG_OF_LINE(kd_curpos); i < stop; i += ONE_SPACE) { + for (i = BEG_OF_LINE(kd_curpos); i < stop; i += ONE_SPACE) { (*kd_dput)(i, K_SPACE, kd_attr); } return; @@ -2204,12 +2301,12 @@ unsigned char ch; } -/* +/* * kd_getdata: - * - * This function returns a data byte from the keyboard RDWR port, - * after waiting until the port is flagged as having something to - * read. + * + * This function returns a data byte from the keyboard RDWR port, + * after waiting until the port is flagged as having something to + * read. */ unsigned char kd_getdata() @@ -2248,9 +2345,9 @@ kd_mouse_drain() printf("kbd: S = %x D = %x\n", i, inb(K_RDWR)); } -/* +/* * set_kd_state: - * + * * Set kd_state and update the keyboard status LEDs. */ @@ -2261,10 +2358,10 @@ int newstate; kd_setleds1(state2leds(newstate)); } -/* +/* * state2leds: - * - * Return a byte containing LED settings for the keyboard, given + * + * Return a byte containing LED settings for the keyboard, given * a state vector. */ u_char @@ -2280,10 +2377,10 @@ int state; return(result); } -/* +/* * kd_setleds[12]: - * - * Set the keyboard LEDs according to the given byte. + * + * Set the keyboard LEDs according to the given byte. */ kd_setleds1(val) u_char val; @@ -2304,11 +2401,11 @@ kd_setleds2() } -/* +/* * cnsetleds: - * + * * like kd_setleds[12], but not interrupt-based. - * Currently disabled because cngetc ignores caps lock and num + * Currently disabled because cngetc ignores caps lock and num * lock anyway. */ cnsetleds(val) @@ -2328,9 +2425,9 @@ kdreboot() kd_sendcmd(0xFE); /* XXX - magic # */ delay(1000000); /* wait to see if anything happens */ #endif - /* + /* * If that didn't work, then we'll just have to try and - * do it the hard way. + * do it the hard way. */ cpu_shutdown(); } @@ -2451,7 +2548,7 @@ kd_xga_init() * memory location for these cards. * */ - + vid_start = (u_char *)phystokv(EGA_START); kd_index_reg = EGA_IDX_REG; kd_io_reg = EGA_IO_REG; @@ -2602,9 +2699,9 @@ char chattr; } -/* +/* * kd_noopreset: - * + * * No-op reset routine for kd_dreset. */ static void @@ -2705,7 +2802,7 @@ int count; count /= kd_cols; /* num lines */ count *= fb_byte_width * (char_height+cursor_height); kd_slmscu(bit2fbptr(from_xbit, from_ybit), - bit2fbptr(to_xbit, to_ybit), + bit2fbptr(to_xbit, to_ybit), count/SLAMBPW); bmppaintcsr(kd_curpos, char_white); } else { @@ -2774,7 +2871,7 @@ char chattr; /* reverse or normal */ /* fast case - entire page */ kd_slmwd(vid_start, (fb_byte_width * fb_height)/SLAMBPW, clearval); - } else + } else /* slow case */ for (i = 0; i < count; ++i) { bmpput(to, K_SPACE, chattr); @@ -2863,7 +2960,7 @@ kdcnprobe(struct consdev *cp) maj = 0; unit = 0; pri = CN_INTERNAL; - + cp->cn_dev = makedev(maj, unit); cp->cn_pri = pri; } @@ -2902,13 +2999,13 @@ kdcnputc(dev_t dev, int c) kd_putc(c); } -/* +/* * kdcnmaygetc: - * - * Get one character using polling, rather than interrupts. Used + * + * Get one character using polling, rather than interrupts. Used * by the kernel debugger. Note that Caps Lock is ignored. - * Normally this routine is called with interrupts already - * disabled, but there is code in place so that it will be more + * Normally this routine is called with interrupts already + * disabled, but there is code in place so that it will be more * likely to work even if interrupts are turned on. */ int