summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2002-06-17 23:10:57 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2002-06-17 23:10:57 +0000
commit45c192c6b8db8553d2bf9fca747f42c09d6c0865 (patch)
tree882414b07feb4f00342b83ea4ba23d3bc17d59a1 /sys
parentd665c5ffe8a41e59934d68ce804a2ef6bfc1c601 (diff)
remove old pccons console driver. Not used anymore and not maintained.
ok millert@, miod@.
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/i386/conf/files.i3869
-rw-r--r--sys/arch/i386/include/pccons.h55
-rw-r--r--sys/arch/i386/isa/pccons.c1942
3 files changed, 1 insertions, 2005 deletions
diff --git a/sys/arch/i386/conf/files.i386 b/sys/arch/i386/conf/files.i386
index 3ee4b0ffaa6..1dbc3ab3805 100644
--- a/sys/arch/i386/conf/files.i386
+++ b/sys/arch/i386/conf/files.i386
@@ -1,4 +1,4 @@
-# $OpenBSD: files.i386,v 1.95 2002/03/23 14:14:25 deraadt Exp $
+# $OpenBSD: files.i386,v 1.96 2002/06/17 23:10:56 matthieu Exp $
# $NetBSD: files.i386,v 1.73 1996/05/07 00:58:36 thorpej Exp $
#
# new style config file for i386 architecture
@@ -137,13 +137,6 @@ attach pccom at isa with pccom_isa
attach pccom at commulti with pccom_commulti
file arch/i386/isa/pccom.c pccom & (pccom_isa | pccom_isapnp | pccom_commulti | pccom_pcmcia | pccom_cardbus | pccom_puc) needs-flag
-# PC console support a la "pccons"
-device pc: tty, pckbcport
-attach pc at isa
-device pcconskbd
-attach pcconskbd at pckbc
-file arch/i386/isa/pccons.c pc | pcconskbd needs-flag
-
# PC Mice; Logitech-style, Microsoft-style, and PS/2-style
device lms: wsmousedev
attach lms at isa
diff --git a/sys/arch/i386/include/pccons.h b/sys/arch/i386/include/pccons.h
deleted file mode 100644
index 3195344edf3..00000000000
--- a/sys/arch/i386/include/pccons.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $OpenBSD: pccons.h,v 1.7 2002/03/14 01:26:33 millert Exp $ */
-/* $NetBSD: pccons.h,v 1.4 1996/02/02 18:06:06 mycroft Exp $ */
-
-/*
- * pccons.h -- pccons ioctl definitions
- */
-
-#ifndef _PCCONS_H_
-#define _PCCONS_H_
-
-#include <sys/ioctl.h>
-
-/* key types -- warning: pccons.c depends on most values */
-
-#define KB_SCROLL 0x0001 /* stop output */
-#define KB_NUM 0x0002 /* numeric shift cursors vs. numeric */
-#define KB_CAPS 0x0004 /* caps shift -- swaps case of letter */
-#define KB_SHIFT 0x0008 /* keyboard shift */
-#define KB_CTL 0x0010 /* control shift -- allows ctl function */
-#define KB_ASCII 0x0020 /* ascii code for this key */
-#define KB_ALTGR 0x0040 /* alternate graphics shift */
-#define KB_ALT 0x0080 /* alternate shift -- alternate chars */
-#define KB_FUNC 0x0100 /* function key */
-#define KB_KP 0x0200 /* Keypad keys */
-#define KB_NONE 0x0400 /* no function */
-
-#define KB_CODE_SIZE 4 /* Use a max of 4 for now... */
-#define KB_NUM_KEYS 128 /* Number of scan codes */
-typedef struct {
- u_short type;
- char unshift[KB_CODE_SIZE];
- char shift[KB_CODE_SIZE];
- char ctl[KB_CODE_SIZE];
- char altgr[KB_CODE_SIZE];
- char shift_altgr[KB_CODE_SIZE];
-} pccons_keymap_t;
-
-#define CONSOLE_X_MODE_ON _IO('t',121)
-#define CONSOLE_X_MODE_OFF _IO('t',122)
-#define CONSOLE_X_BELL _IOW('t',123,int[2])
-#define CONSOLE_SET_TYPEMATIC_RATE _IOW('t',124,u_char)
-#define CONSOLE_GET_KEYMAP _IOR('t',128,pccons_keymap_t[KB_NUM_KEYS])
-#define CONSOLE_SET_KEYMAP _IOW('t',129,pccons_keymap_t[KB_NUM_KEYS])
-#define CONSOLE_SET_BLANK _IOW('t',130,int)
-
-#ifdef _KERNEL
-int pccnattach(void);
-
-#if (NPCCONSKBD > 0)
-int pcconskbd_cnattach _P((pckbc_tag_t, pckbc_slot_t));
-#endif
-
-#endif /* _KERNEL */
-
-#endif /* _PCCONS_H_ */
diff --git a/sys/arch/i386/isa/pccons.c b/sys/arch/i386/isa/pccons.c
deleted file mode 100644
index 873dec344eb..00000000000
--- a/sys/arch/i386/isa/pccons.c
+++ /dev/null
@@ -1,1942 +0,0 @@
-/* $OpenBSD: pccons.c,v 1.50 2002/03/14 03:15:54 millert Exp $ */
-/* $NetBSD: pccons.c,v 1.99.4.1 1996/06/04 20:03:53 cgd Exp $ */
-
-/*-
- * Copyright (c) 1993, 1994, 1995 Charles Hannum. All rights reserved.
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * William Jolitz and Don Ahn.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pccons.c 5.11 (Berkeley) 5/21/91
- */
-
-/*
- * code to work keyboard & display for PC-style console
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/ioctl.h>
-#include <sys/proc.h>
-#include <sys/user.h>
-#include <sys/select.h>
-#include <sys/fcntl.h>
-#include <sys/tty.h>
-#include <sys/uio.h>
-#include <sys/kernel.h>
-#include <sys/syslog.h>
-#include <sys/device.h>
-#include <sys/timeout.h>
-#ifdef DDB
-#include <ddb/db_var.h>
-#endif
-
-#include <dev/cons.h>
-
-#include <machine/cpu.h>
-#include <machine/intr.h>
-#include <machine/pio.h>
-#include <machine/pc/display.h>
-#include <machine/pccons.h>
-#include <machine/conf.h>
-
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-#include <dev/ic/mc6845.h>
-#include <i386/isa/isa_machdep.h>
-#include <i386/isa/kbdreg.h>
-
-#define XFREE86_BUG_COMPAT
-
-#ifndef BEEP_FREQ
-#define BEEP_FREQ 1500
-#endif
-#ifndef BEEP_TIME
-#define BEEP_TIME (hz/5)
-#endif
-
-#define PCBURST 128
-
-static u_short *Crtat; /* pointer to backing store */
-static u_short *crtat; /* pointer to current char */
-static volatile u_char ack, nak; /* Don't ask. */
-static u_char async, kernel, polling; /* Really, you don't want to know. */
-static u_char lock_state = 0x00, /* all off */
- old_lock_state = 0xff,
- typematic_rate = 0xff, /* don't update until set by user */
- old_typematic_rate = 0xff;
-static u_short cursor_shape = 0xffff, /* don't update until set by user */
- old_cursor_shape = 0xffff;
-static pccons_keymap_t scan_codes[KB_NUM_KEYS];/* keyboard translation table */
-static int pc_blank = 300;
-#ifdef XSERVER
-int pc_xmode = 0;
-#endif
-struct timeout pccons_aup_tmo;
-struct timeout pccons_blank_tmo;
-
-#define PCUNIT(x) (minor(x))
-
-static struct video_state {
- int cx, cy; /* escape parameters */
- int row, col; /* current cursor position */
- int nrow, ncol, nchr; /* current screen geometry */
- int offset; /* Saved cursor pos */
- u_char state; /* parser state */
-#define VSS_ESCAPE 1
-#define VSS_EBRACE 2
-#define VSS_EBRACEQ 3
-#define VSS_EPARAM 4
- char so; /* in standout mode? */
- char color; /* color or mono display */
- char at, save_at; /* normal attributes */
- char so_at, save_so; /* standout attributes */
-} vs;
-
-struct pc_softc {
- struct device sc_dev;
- void *sc_ih;
- struct tty *sc_tty;
-};
-
-int pcprobe(struct device *, void *, void *);
-void pcattach(struct device *, struct device *, void *);
-int pcintr(void *);
-static void screen_restore(int);
-static void screen_blank(void *);
-
-struct cfattach pc_ca = {
- sizeof(struct pc_softc), pcprobe, pcattach
-};
-
-struct cfdriver pc_cd = {
- NULL, "pc", DV_TTY
-};
-
-#define COL 80
-#define ROW 25
-#define CHR 2
-
-static unsigned int addr_6845 = MONO_BASE;
-
-void pcinit(void);
-char *sget(void);
-void sput(u_char *, int);
-#ifdef XSERVER
-void pc_xmode_on(void);
-void pc_xmode_off(void);
-#endif
-
-void pcstart(struct tty *);
-int pcparam(struct tty *, struct termios *);
-
-int kbd_cmd(u_char, u_char);
-void set_cursor_shape(void);
-#ifdef XSERVER
-void get_cursor_shape(void);
-#endif
-void do_async_update(void *);
-void async_update(void);
-
-static __inline int kbd_wait_output(void);
-static __inline int kbd_wait_input(void);
-static __inline void kbd_flush_input(void);
-static u_char kbc_get8042cmd(void);
-static int kbc_put8042cmd(u_char);
-
-void pccnprobe(struct consdev *);
-void pccninit(struct consdev *);
-void pccnputc(dev_t, char);
-int pccngetc(dev_t);
-void pccnpollc(dev_t, int);
-
-/* wait 7+ us for keyboard controller; ~1.25us per inb() */
-#define KBD_DELAY \
- { u_char x = inb(0x84); (void) x; } \
- { u_char x = inb(0x84); (void) x; } \
- { u_char x = inb(0x84); (void) x; } \
- { u_char x = inb(0x84); (void) x; } \
- { u_char x = inb(0x84); (void) x; } \
- { u_char x = inb(0x84); (void) x; } \
- { u_char x = inb(0x84); (void) x; } \
- { u_char x = inb(0x84); (void) x; }
-
-static __inline int
-kbd_wait_output()
-{
- u_int i;
-
- for (i = 100000; i; i--)
- if ((inb(IO_KBD + KBSTATP) & KBS_IBF) == 0) {
- KBD_DELAY;
- return 1;
- }
- return 0;
-}
-
-static __inline int
-kbd_wait_input()
-{
- u_int i;
-
- for (i = 100000; i; i--)
- if ((inb(IO_KBD + KBSTATP) & KBS_DIB) != 0) {
- KBD_DELAY;
- return 1;
- }
- return 0;
-}
-
-static __inline void
-kbd_flush_input()
-{
- u_int i;
-
- for (i = 10; i; i--) {
- if ((inb(IO_KBD + KBSTATP) & KBS_DIB) == 0)
- return;
- KBD_DELAY;
- (void) inb(IO_KBD + KBDATAP);
- }
-}
-
-#if 1
-/*
- * Get the current command byte.
- */
-static u_char
-kbc_get8042cmd()
-{
-
- if (!kbd_wait_output())
- return -1;
- outb(IO_KBD + KBCMDP, K_RDCMDBYTE);
- if (!kbd_wait_input())
- return -1;
- return inb(IO_KBD + KBDATAP);
-}
-#endif
-
-/*
- * Pass command byte to keyboard controller (8042).
- */
-static int
-kbc_put8042cmd(val)
- u_char val;
-{
-
- if (!kbd_wait_output())
- return 0;
- outb(IO_KBD + KBCMDP, K_LDCMDBYTE);
- if (!kbd_wait_output())
- return 0;
- outb(IO_KBD + KBOUTP, val);
- return 1;
-}
-
-/*
- * Pass command to keyboard itself
- */
-int
-kbd_cmd(val, polling)
- u_char val;
- u_char polling;
-{
- u_int retries = 3;
- register u_int i;
-
- do {
- if (!kbd_wait_output())
- return 0;
- ack = nak = 0;
- outb(IO_KBD + KBOUTP, val);
- if (polling)
- for (i = 100000; i; i--) {
- if (inb(IO_KBD + KBSTATP) & KBS_DIB) {
- register u_char c;
-
- KBD_DELAY;
- c = inb(IO_KBD + KBDATAP);
- if (c == KBR_ACK || c == KBR_ECHO) {
- ack = 1;
- return 1;
- }
- if (c == KBR_RESEND) {
- nak = 1;
- break;
- }
-#ifdef DIAGNOSTIC
- printf("kbd_cmd: input char %x lost\n", c);
-#endif
- }
- }
- else
- for (i = 100000; i; i--) {
- (void) inb(IO_KBD + KBSTATP);
- if (ack)
- return 1;
- if (nak)
- break;
- }
- if (!nak)
- return 0;
- } while (--retries);
- return 0;
-}
-
-void
-set_cursor_shape()
-{
- outb(addr_6845, CRTC_CURSTART);
- outb(addr_6845+1, cursor_shape >> 8);
- outb(addr_6845, CRTC_CUREND);
- outb(addr_6845+1, cursor_shape);
- old_cursor_shape = cursor_shape;
-}
-
-#ifdef XSERVER
-void
-get_cursor_shape()
-{
- outb(addr_6845, CRTC_CURSTART);
- cursor_shape = inb(addr_6845+1) << 8;
- outb(addr_6845, CRTC_CUREND);
- cursor_shape |= inb(addr_6845+1);
-
- /*
- * real 6845's, as found on, MDA, Hercules or CGA cards, do
- * not support reading the cursor shape registers. the 6845
- * tri-states it's data bus. This is _normally_ read by the
- * cpu as either 0x00 or 0xff.. in which case we just use
- * a line cursor.
- */
- if (cursor_shape == 0x0000 || cursor_shape == 0xffff)
- cursor_shape = 0x0b10;
- else
- cursor_shape &= 0x1f1f;
-}
-#endif /* XSERVER */
-
-void
-do_async_update(v)
- void *v;
-{
- u_char poll = v ? 1 : 0;
- int pos;
- static int old_pos = -1;
-
- async = 0;
-
- if (lock_state != old_lock_state) {
- old_lock_state = lock_state;
- if (!kbd_cmd(KBC_MODEIND, poll) ||
- !kbd_cmd(lock_state, poll)) {
- printf("pc: timeout updating leds\n");
- (void) kbd_cmd(KBC_ENABLE, poll);
- }
- }
- if (typematic_rate != old_typematic_rate) {
- old_typematic_rate = typematic_rate;
- if (!kbd_cmd(KBC_TYPEMATIC, poll) ||
- !kbd_cmd(typematic_rate, poll)) {
- printf("pc: timeout updating typematic rate\n");
- (void) kbd_cmd(KBC_ENABLE, poll);
- }
- }
-
-#ifdef XSERVER
- if (pc_xmode > 0)
- return;
-#endif
-
- pos = crtat - Crtat;
- if (pos != old_pos) {
- register int iobase = addr_6845;
- outb(iobase, CRTC_CURSORH);
- outb(iobase+1, pos >> 8);
- outb(iobase, CRTC_CURSORL);
- outb(iobase+1, pos);
- old_pos = pos;
- }
- if (cursor_shape != old_cursor_shape)
- set_cursor_shape();
-}
-
-void
-async_update()
-{
-
- if (kernel || polling) {
- if (async)
- timeout_del(&pccons_aup_tmo);
- do_async_update((void *)1);
- } else {
- if (async)
- return;
- async = 1;
- timeout_add(&pccons_aup_tmo, 1);
- }
-}
-
-/*
- * these are both bad jokes
- */
-int
-pcprobe(parent, match, aux)
- struct device *parent;
- void *match, *aux;
-{
- struct isa_attach_args *ia = aux;
- u_int i;
-
- /* Enable interrupts and keyboard, etc. */
- if (!kbc_put8042cmd(CMDBYTE)) {
- printf("pcprobe: command error\n");
- return 0;
- }
-
-#if 1
- /* Flush any garbage. */
- kbd_flush_input();
- /* Reset the keyboard. */
- if (!kbd_cmd(KBC_RESET, 1)) {
-#ifdef DIAGNOSTIC
- printf("pcprobe: reset error %d\n", 1);
- /* XXX - this would make some - maybe very
- broken - but usable keyboards unusable
- goto lose;
- */
-#endif
- }
- for (i = 600000; i; i--)
- if ((inb(IO_KBD + KBSTATP) & KBS_DIB) != 0) {
- KBD_DELAY;
- break;
- }
- if (i == 0 || inb(IO_KBD + KBDATAP) != KBR_RSTDONE) {
-#ifdef DIAGNOSTIC
- printf("pcprobe: reset error %d\n", 2);
- /* XXX - this would make some - maybe very
- broken - but usable keyboards unusable
- goto lose;
- */
-#endif
- }
- /*
- * Some keyboards seem to leave a second ack byte after the reset.
- * This is kind of stupid, but we account for them anyway by just
- * flushing the buffer.
- */
- kbd_flush_input();
- /* Just to be sure. */
- if (!kbd_cmd(KBC_ENABLE, 1)) {
- printf("pcprobe: reset error %d\n", 3);
- goto lose;
- }
-
- /*
- * Some keyboard/8042 combinations do not seem to work if the keyboard
- * is set to table 1; in fact, it would appear that some keyboards just
- * ignore the command altogether. So by default, we use the AT scan
- * codes and have the 8042 translate them. Unfortunately, this is
- * known to not work on some PS/2 machines. We try desparately to deal
- * with this by checking the (lack of a) translate bit in the 8042 and
- * attempting to set the keyboard to XT mode. If this all fails, well,
- * tough luck.
- *
- * XXX It would perhaps be a better choice to just use AT scan codes
- * and not bother with this.
- */
- if (kbc_get8042cmd() & KC8_TRANS) {
- /* The 8042 is translating for us; use AT codes. */
- if (!kbd_cmd(KBC_SETTABLE, 1) || !kbd_cmd(2, 1)) {
- printf("pcprobe: reset error %d\n", 4);
- goto lose;
- }
- } else {
- /* Stupid 8042; set keyboard to XT codes. */
- if (!kbd_cmd(KBC_SETTABLE, 1) || !kbd_cmd(1, 1)) {
- printf("pcprobe: reset error %d\n", 5);
- goto lose;
- }
- }
-
-lose:
- /*
- * Technically, we should probably fail the probe. But we'll be nice
- * and allow keyboard-less machines to boot with the console.
- */
-#endif
-
- ia->ia_iosize = 16;
- ia->ia_msize = 0;
- return 1;
-}
-
-void
-pcattach(parent, self, aux)
- struct device *parent, *self;
- void *aux;
-{
- struct pc_softc *sc = (void *)self;
- struct isa_attach_args *ia = aux;
-
- if (crtat == 0)
- pcinit();
-
- printf(": %s\n", vs.color ? "color" : "mono");
- do_async_update((void *)1);
- screen_restore(0);
-
- sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE,
- IPL_TTY, pcintr, sc, sc->sc_dev.dv_xname);
-
- /*
- * Look for children of the keyboard controller.
- * XXX Really should decouple keyboard controller
- * from the console code.
- */
- while (config_found(self, ia->ia_ic, NULL) != NULL) /* XXX */
- /* will break when no more children */ ;
-}
-
-int
-pcopen(dev, flag, mode, p)
- dev_t dev;
- int flag, mode;
- struct proc *p;
-{
- struct pc_softc *sc;
- int unit = PCUNIT(dev);
- struct tty *tp;
- int s;
-
- if (unit >= pc_cd.cd_ndevs)
- return ENXIO;
- sc = pc_cd.cd_devs[unit];
- if (sc == 0)
- return ENXIO;
-
- s = spltty();
- if (!sc->sc_tty) {
- tp = sc->sc_tty = ttymalloc();
- tty_attach(tp);
- } else
- tp = sc->sc_tty;
- splx(s);
-
- tp->t_oproc = pcstart;
- tp->t_param = pcparam;
- tp->t_dev = dev;
- if ((tp->t_state & TS_ISOPEN) == 0) {
- tp->t_state |= TS_WOPEN;
- ttychars(tp);
- tp->t_iflag = TTYDEF_IFLAG;
- tp->t_oflag = TTYDEF_OFLAG;
- tp->t_cflag = TTYDEF_CFLAG;
- tp->t_lflag = TTYDEF_LFLAG;
- tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
- pcparam(tp, &tp->t_termios);
- ttsetwater(tp);
- } else if (tp->t_state&TS_XCLUDE && p->p_ucred->cr_uid != 0)
- return EBUSY;
- tp->t_state |= TS_CARR_ON;
-
- return ((*linesw[tp->t_line].l_open)(dev, tp));
-}
-
-int
-pcclose(dev, flag, mode, p)
- dev_t dev;
- int flag, mode;
- struct proc *p;
-{
- struct pc_softc *sc = pc_cd.cd_devs[PCUNIT(dev)];
- struct tty *tp = sc->sc_tty;
-
- (*linesw[tp->t_line].l_close)(tp, flag);
- ttyclose(tp);
-#ifdef notyet /* XXX */
- ttyfree(tp);
-#endif
- return(0);
-}
-
-int
-pcread(dev, uio, flag)
- dev_t dev;
- struct uio *uio;
- int flag;
-{
- struct pc_softc *sc = pc_cd.cd_devs[PCUNIT(dev)];
- struct tty *tp = sc->sc_tty;
-
- return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
-}
-
-int
-pcwrite(dev, uio, flag)
- dev_t dev;
- struct uio *uio;
- int flag;
-{
- struct pc_softc *sc = pc_cd.cd_devs[PCUNIT(dev)];
- struct tty *tp = sc->sc_tty;
-
- return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
-}
-
-struct tty *
-pctty(dev)
- dev_t dev;
-{
- struct pc_softc *sc = pc_cd.cd_devs[PCUNIT(dev)];
- struct tty *tp = sc->sc_tty;
-
- return (tp);
-}
-
-/*
- * Got a console receive interrupt -
- * the console processor wants to give us a character.
- * Catch the character, and see who it goes to.
- */
-int
-pcintr(arg)
- void *arg;
-{
- struct pc_softc *sc = arg;
- register struct tty *tp = sc->sc_tty;
- u_char *cp;
-
- if ((inb(IO_KBD + KBSTATP) & KBS_DIB) == 0)
- return 0;
- if (polling)
- return 1;
- do {
- cp = sget();
- if (!tp || (tp->t_state & TS_ISOPEN) == 0)
- return 1;
- if (cp)
- do
- (*linesw[tp->t_line].l_rint)(*cp++, tp);
- while (*cp);
- } while (inb(IO_KBD + KBSTATP) & KBS_DIB);
- return 1;
-}
-
-int
-pcioctl(dev, cmd, data, flag, p)
- dev_t dev;
- u_long cmd;
- caddr_t data;
- int flag;
- struct proc *p;
-{
- struct pc_softc *sc = pc_cd.cd_devs[PCUNIT(dev)];
- struct tty *tp = sc->sc_tty;
- int error;
-
- error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
- if (error >= 0)
- return error;
- error = ttioctl(tp, cmd, data, flag, p);
- if (error >= 0)
- return error;
-
- switch (cmd) {
-#ifdef XSERVER
- case CONSOLE_X_MODE_ON:
- pc_xmode_on();
- ttyflush(tp, FREAD);
- return 0;
- case CONSOLE_X_MODE_OFF:
- pc_xmode_off();
- ttyflush(tp, FREAD);
- return 0;
- case CONSOLE_X_BELL:
- /*
- * If set, data is a pointer to a length 2 array of
- * integers. data[0] is the pitch in Hz and data[1]
- * is the duration in msec.
- */
- if (data)
- sysbeep(((int *)data)[0],
- (((int *)data)[1] * hz) / 1000);
- else
- sysbeep(BEEP_FREQ, BEEP_TIME);
- return 0;
-#endif /* XSERVER */
- case CONSOLE_SET_TYPEMATIC_RATE: {
- u_char rate;
-
- if (!data)
- return EINVAL;
- rate = *((u_char *)data);
- /*
- * Check that it isn't too big (which would cause it to be
- * confused with a command).
- */
- if (rate & 0x80)
- return EINVAL;
- typematic_rate = rate;
- async_update();
- return 0;
- }
- case CONSOLE_SET_KEYMAP: {
- pccons_keymap_t *map = (pccons_keymap_t *) data;
- int i;
-
- if (!data)
- return EINVAL;
- for (i = 0; i < KB_NUM_KEYS; i++)
- if (map[i].unshift[KB_CODE_SIZE-1] ||
- map[i].shift[KB_CODE_SIZE-1] ||
- map[i].ctl[KB_CODE_SIZE-1] ||
- map[i].altgr[KB_CODE_SIZE-1] ||
- map[i].shift_altgr[KB_CODE_SIZE-1])
- return EINVAL;
-
- bcopy(data, scan_codes, sizeof(pccons_keymap_t[KB_NUM_KEYS]));
- return 0;
- }
- case CONSOLE_GET_KEYMAP:
- if (!data)
- return EINVAL;
- bcopy(scan_codes, data, sizeof(pccons_keymap_t[KB_NUM_KEYS]));
- return 0;
- case CONSOLE_SET_BLANK:
- pc_blank = *((int *)data);
- screen_restore(0);
- return 0;
- default:
- return ENOTTY;
- }
-
-#ifdef DIAGNOSTIC
- panic("pcioctl: impossible");
-#endif
-}
-
-void
-pcstart(tp)
- struct tty *tp;
-{
- struct clist *cl;
- int s, len;
- u_char buf[PCBURST];
-
- s = spltty();
- if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP))
- goto out;
- tp->t_state |= TS_BUSY;
- splx(s);
- /*
- * We need to do this outside spl since it could be fairly
- * expensive and we don't want our serial ports to overflow.
- */
- cl = &tp->t_outq;
- len = q_to_b(cl, buf, PCBURST);
- sput(buf, len);
- s = spltty();
- tp->t_state &= ~TS_BUSY;
- if (cl->c_cc) {
- tp->t_state |= TS_TIMEOUT;
- timeout_add(&tp->t_rstrt_to, 1);
- }
- if (cl->c_cc <= tp->t_lowat) {
- if (tp->t_state & TS_ASLEEP) {
- tp->t_state &= ~TS_ASLEEP;
- wakeup(cl);
- }
- selwakeup(&tp->t_wsel);
- }
-out:
- splx(s);
-}
-
-int
-pcstop(tp, flag)
- struct tty *tp;
- int flag;
-{
- return 0;
-}
-
-void
-pccnprobe(cp)
- struct consdev *cp;
-{
- int maj;
-
- /* locate the major number */
- for (maj = 0; maj < nchrdev; maj++)
- if (cdevsw[maj].d_open == pcopen)
- break;
-
- /* initialize required fields */
- cp->cn_dev = makedev(maj, 0);
- cp->cn_pri = CN_INTERNAL;
-}
-
-/* ARGSUSED */
-void
-pccninit(cp)
- struct consdev *cp;
-{
-
- /*
- * For now, don't screw with it.
- */
- /* crtat = 0; */
-}
-
-/* ARGSUSED */
-void
-pccnputc(dev, c)
- dev_t dev;
- char c;
-{
- u_char oldkernel = kernel;
-
- kernel = 1;
- if (c == '\n')
- sput("\r\n", 2);
- else
- sput(&c, 1);
- kernel = oldkernel;
-}
-
-/* ARGSUSED */
-int
-pccngetc(dev)
- dev_t dev;
-{
- register char *cp;
-
-#ifdef XSERVER
- if (pc_xmode > 0)
- return 0;
-#endif
-
- do {
- /* wait for byte */
- while ((inb(IO_KBD + KBSTATP) & KBS_DIB) == 0);
- /* see if it's worthwhile */
- cp = sget();
- } while (!cp);
- if (*cp == '\r')
- return '\n';
- return *cp;
-}
-
-void
-pccnpollc(dev, on)
- dev_t dev;
- int on;
-{
-
- polling = on;
- if (!on) {
- int unit;
- struct pc_softc *sc;
- int s;
-
- /*
- * If disabling polling on a device that's been configured,
- * make sure there are no bytes left in the FIFO, holding up
- * the interrupt line. Otherwise we won't get any further
- * interrupts.
- */
- unit = PCUNIT(dev);
- if (pc_cd.cd_ndevs > unit) {
- sc = pc_cd.cd_devs[unit];
- if (sc != 0) {
- s = spltty();
- pcintr(sc);
- splx(s);
- }
- }
- }
-}
-
-/*
- * Set line parameters.
- */
-int
-pcparam(tp, t)
- struct tty *tp;
- struct termios *t;
-{
-
- tp->t_ispeed = t->c_ispeed;
- tp->t_ospeed = t->c_ospeed;
- tp->t_cflag = t->c_cflag;
- return 0;
-}
-
-void
-pcinit()
-{
- u_short volatile *cp;
- u_short was;
- unsigned cursorat;
-
- timeout_set(&pccons_aup_tmo, do_async_update, NULL);
- timeout_set(&pccons_blank_tmo, screen_blank, NULL);
-
- cp = ISA_HOLE_VADDR(CGA_BUF);
- was = *cp;
- *cp = (u_short) 0xA55A;
- if (*cp != 0xA55A) {
- cp = ISA_HOLE_VADDR(MONO_BUF);
- addr_6845 = MONO_BASE;
- vs.color = 0;
- } else {
- *cp = was;
- addr_6845 = CGA_BASE;
- vs.color = 1;
- }
-
- /* Extract cursor location */
- outb(addr_6845, CRTC_CURSORH);
- cursorat = inb(addr_6845+1) << 8;
- outb(addr_6845, CRTC_CURSORL);
- cursorat |= inb(addr_6845+1);
-
-#ifdef FAT_CURSOR
- cursor_shape = 0x0012;
-#endif
-
- Crtat = (u_short *)cp;
- crtat = (u_short *)(cp + cursorat);
-
- vs.ncol = COL;
- vs.nrow = ROW;
- vs.nchr = COL * ROW;
- vs.at = FG_LIGHTGREY | BG_BLACK;
-
- if (vs.color == 0)
- vs.so_at = FG_BLACK | BG_LIGHTGREY;
- else
- vs.so_at = FG_YELLOW | BG_BLACK;
-
- fillw((vs.at << 8) | ' ', crtat, vs.nchr - cursorat);
-}
-
-#define wrtchar(c, at) do {\
- char *cp = (char *)crtat; *cp++ = (c); *cp = (at); crtat++; vs.col++; \
-} while (0)
-
-/* translate ANSI color codes to standard pc ones */
-static char fgansitopc[] = {
- FG_BLACK, FG_RED, FG_GREEN, FG_BROWN, FG_BLUE,
- FG_MAGENTA, FG_CYAN, FG_LIGHTGREY
-};
-
-static char bgansitopc[] = {
- BG_BLACK, BG_RED, BG_GREEN, BG_BROWN, BG_BLUE,
- BG_MAGENTA, BG_CYAN, BG_LIGHTGREY
-};
-
-/*
- * iso latin to ibm 437 encoding iso2ibm437[char-128)]
- * characters not available are displayed as a caret
- */
-static u_char iso2ibm437[] = {
- 4, 4, 4, 4, 4, 4, 4, 4, /* 128 */
- 4, 4, 4, 4, 4, 4, 4, 4, /* 136 */
- 4, 4, 4, 4, 4, 4, 4, 4, /* 144 */
- 4, 4, 4, 4, 4, 4, 4, 4, /* 152 */
- 0xff, 0xad, 0x9b, 0x9c, 4, 0x9d, 4, 0x15, /* 160 */
- 4, 4, 0xa6, 0xae, 0xaa, 4, 4, 4, /* 168 */
- 0xf8, 0xf1, 0xfd, 4, 4, 0xe6, 4, 0xfa, /* 176 */
- 4, 4, 0xa7, 0xaf, 0xac, 0xab, 4, 0xa8, /* 184 */
- 4, 4, 4, 4, 0x8e, 0x8f, 0x92, 0x80, /* 192 */
- 4, 0x90, 4, 4, 4, 4, 4, 4, /* 200 */
- 4, 0xa5, 4, 4, 4, 4, 0x99, 4, /* 208 */
- 4, 4, 4, 4, 0x9a, 4, 4, 0xe1, /* 216 */
- 0x85, 0xa0, 0x83, 4, 0x84, 0x86, 0x91, 0x87, /* 224 */
- 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 232 */
- 4, 0xa4, 0x95, 0xa2, 0x93, 4, 0x94, 0xf6, /* 240 */
- 4, 0x97, 0xa3, 0x96, 0x81, 4, 4, 0x98 /* 248 */
-};
-
-static u_short screen_backup[ROW*COL];
-static int screen_saved = 0;
-static u_short *saved_Crtat;
-
-static void
-screen_blank(arg)
- void *arg;
-{
- if (! screen_saved) {
- bcopy(Crtat, screen_backup, ROW*COL*CHR);
- bzero(Crtat, ROW*COL*CHR);
- saved_Crtat = Crtat;
- Crtat = screen_backup;
- crtat = Crtat + (crtat - saved_Crtat);
-
-#if 0
- /* write a little blinking square to bootom, left */
- saved_Crtat[(ROW - 1)*COL] =
- ((FG_BLINK | FG_LIGHTGREY | BG_BLACK) << 8) | 220;
-#endif
- screen_saved = 1;
- }
-}
-
-static void
-screen_restore(perm)
- int perm;
-{
- timeout_del(&pccons_blank_tmo);
- if (screen_saved) {
- Crtat = saved_Crtat;
- crtat = Crtat + (crtat - screen_backup);
- bcopy(screen_backup, Crtat, ROW*COL*CHR);
- screen_saved = 0;
- }
- if (!perm && (pc_blank > 0))
- timeout_add(&pccons_blank_tmo, pc_blank * hz);
-}
-
-/*
- * `pc3' termcap emulation.
- */
-void
-sput(cp, n)
- u_char *cp;
- int n;
-{
- u_char c, scroll = 0;
-
-#ifdef XSERVER
- if (pc_xmode > 0)
- return;
-#endif
-
- if (crtat == 0)
- pcinit();
-
- while (n--) {
- if (!(c = *cp++))
- continue;
-
- switch (c) {
- case 0x1B:
- if (vs.state >= VSS_ESCAPE) {
- wrtchar(c, vs.so_at);
- vs.state = 0;
- goto maybe_scroll;
- } else
- vs.state = VSS_ESCAPE;
- break;
- case 0x9B: /* CSI */
- vs.cx = vs.cy = 0;
- vs.state = VSS_EBRACE;
- break;
-
- case '\t': {
- int inccol = 8 - (vs.col & 7);
- crtat += inccol;
- vs.col += inccol;
- }
- maybe_scroll:
- if (vs.col >= COL) {
- vs.col -= COL;
- scroll = 1;
- }
- break;
-
- case '\b':
- if (crtat <= Crtat)
- break;
- --crtat;
- if (--vs.col < 0)
- vs.col += COL; /* non-destructive backspace */
- break;
-
- case '\r':
- crtat -= vs.col;
- vs.col = 0;
- break;
-
- case '\n':
- crtat += vs.ncol;
- scroll = 1;
- break;
-
- default:
- switch (vs.state) {
- case 0:
- if (c == '\a')
- sysbeep(BEEP_FREQ, BEEP_TIME);
- else {
- /*
- * If we're outputting multiple printed
- * characters, just blast them to the
- * screen until we reach the end of the
- * buffer or a control character. This
- * saves time by short-circuiting the
- * switch.
- * If we reach the end of the line, we
- * break to do a scroll check.
- */
- for (;;) {
- if (c & 0x80)
- c = iso2ibm437[c&0x7f];
- if (vs.so)
- wrtchar(c, vs.so_at);
- else
- wrtchar(c, vs.at);
- if (vs.col >= vs.ncol) {
- vs.col = 0;
- scroll = 1;
- break;
- }
- if (!n || (c = *cp) < ' ')
- break;
- n--, cp++;
- }
- }
- break;
- case VSS_ESCAPE:
- switch (c) {
- case '[': /* Start ESC [ sequence */
- vs.cx = vs.cy = 0;
- vs.state = VSS_EBRACE;
- break;
- case 'c': /* Create screen & home */
- fillw((vs.at << 8) | ' ',
- Crtat, vs.nchr);
- crtat = Crtat;
- vs.col = 0;
- vs.state = 0;
- break;
- case '7': /* save cursor pos */
- vs.offset = crtat - Crtat;
- vs.state = 0;
- break;
- case '8': /* restore cursor pos */
- crtat = Crtat + vs.offset;
- vs.row = vs.offset / vs.ncol;
- vs.col = vs.offset % vs.ncol;
- vs.state = 0;
- break;
- default: /* Invalid, clear state */
- wrtchar(c, vs.so_at);
- vs.state = 0;
- goto maybe_scroll;
- }
- break;
- case VSS_EBRACEQ: {
- char *col;
-
- switch (c) {
- case 'D':
- break;
- case 'E':
- break;
- case 'F':
- col = &vs.at;
-do_fg:
- *col = (*col & 0xf0) | (vs.cx & 0x0f);
- break;
- case 'G':
- col = &vs.at;
-do_bg:
- *col = (*col & 0x0f) | ((vs.cx & 0x0f) << 4);
- break;
- case 'H':
- col = &vs.so_at;
- goto do_fg;
- case 'I':
- col = &vs.so_at;
- goto do_bg;
- case 'J':
- break;
- case 'K':
- break;
- case 'k':
- break;
- case 'l':
- break;
- case 'M':
- break;
- case 'R':
- vs.at = vs.save_at;
- vs.so_at = vs.save_so;
- break;
- case 'S':
- vs.save_at = vs.at;
- vs.save_so = vs.so_at;
- break;
- default:
- if ((c >= '0') && (c <= '9')) {
- vs.cx *= 10;
- vs.cx += c - '0';
- } else
- vs.state = 0;
- break;
- }
- vs.state = 0;
- break;
- }
- default: /* VSS_EBRACE or VSS_EPARAM */
- switch (c) {
- int pos;
- case 'm':
- if (!vs.cx)
- vs.so = 0;
- else
- vs.so = 1;
- vs.state = 0;
- break;
- case 'A': { /* back cx rows */
- int cx = vs.cx;
- if (cx <= 0)
- cx = 1;
- else
- cx %= vs.nrow;
- pos = crtat - Crtat;
- pos -= vs.ncol * cx;
- if (pos < 0)
- pos += vs.nchr;
- crtat = Crtat + pos;
- vs.state = 0;
- break;
- }
- case 'B': { /* down cx rows */
- int cx = vs.cx;
- if (cx <= 0)
- cx = 1;
- else
- cx %= vs.nrow;
- pos = crtat - Crtat;
- pos += vs.ncol * cx;
- if (pos >= vs.nchr)
- pos -= vs.nchr;
- crtat = Crtat + pos;
- vs.state = 0;
- break;
- }
- case 'C': { /* right cursor */
- int cx = vs.cx,
- col = vs.col;
- if (cx <= 0)
- cx = 1;
- else
- cx %= vs.ncol;
- pos = crtat - Crtat;
- pos += cx;
- col += cx;
- if (col >= vs.ncol) {
- pos -= vs.ncol;
- col -= vs.ncol;
- }
- vs.col = col;
- crtat = Crtat + pos;
- vs.state = 0;
- break;
- }
- case 'D': { /* left cursor */
- int cx = vs.cx,
- col = vs.col;
- if (cx <= 0)
- cx = 1;
- else
- cx %= vs.ncol;
- pos = crtat - Crtat;
- pos -= cx;
- col -= cx;
- if (col < 0) {
- pos += vs.ncol;
- col += vs.ncol;
- }
- vs.col = col;
- crtat = Crtat + pos;
- vs.state = 0;
- break;
- }
- case 'J': /* Clear ... */
- switch (vs.cx) {
- case 0:
- /* ... to end of display */
- fillw((vs.at << 8) | ' ',
- crtat,
- Crtat + vs.nchr - crtat);
- break;
- case 1:
- /* ... to next location */
- fillw((vs.at << 8) | ' ',
- Crtat, crtat - Crtat + 1);
- break;
- case 2:
- /* ... whole display */
- fillw((vs.at << 8) | ' ',
- Crtat, vs.nchr);
- break;
- }
- vs.state = 0;
- break;
- case 'K': /* Clear line ... */
- switch (vs.cx) {
- case 0:
- /* ... current to EOL */
- fillw((vs.at << 8) | ' ',
- crtat, vs.ncol - vs.col);
- break;
- case 1:
- /* ... beginning to next */
- fillw((vs.at << 8) | ' ',
- crtat - vs.col, vs.col + 1);
- break;
- case 2:
- /* ... entire line */
- fillw((vs.at << 8) | ' ',
- crtat - vs.col, vs.ncol);
- break;
- }
- vs.state = 0;
- break;
- case 'f': /* in system V consoles */
- case 'H': { /* Cursor move */
- int cx = vs.cx,
- cy = vs.cy;
- if (!cx || !cy) {
- crtat = Crtat;
- vs.col = 0;
- } else {
- if (cx > vs.nrow)
- cx = vs.nrow;
- if (cy > vs.ncol)
- cy = vs.ncol;
- crtat = Crtat +
- (cx - 1) * vs.ncol + cy - 1;
- vs.col = cy - 1;
- }
- vs.state = 0;
- break;
- }
- case 'M': { /* delete cx rows */
- u_short *crtAt = crtat - vs.col;
- int cx = vs.cx,
- row = (crtAt - Crtat) / vs.ncol,
- nrow = vs.nrow - row;
- if (cx <= 0)
- cx = 1;
- else if (cx > nrow)
- cx = nrow;
- if (cx < nrow)
- bcopy(crtAt + vs.ncol * cx,
- crtAt, vs.ncol * (nrow -
- cx) * CHR);
- fillw((vs.at << 8) | ' ',
- crtAt + vs.ncol * (nrow - cx),
- vs.ncol * cx);
- vs.state = 0;
- break;
- }
- case 'S': { /* scroll up cx lines */
- int cx = vs.cx;
- if (cx <= 0)
- cx = 1;
- else if (cx > vs.nrow)
- cx = vs.nrow;
- if (cx < vs.nrow)
- bcopy(Crtat + vs.ncol * cx,
- Crtat, vs.ncol * (vs.nrow -
- cx) * CHR);
- fillw((vs.at << 8) | ' ',
- Crtat + vs.ncol * (vs.nrow - cx),
- vs.ncol * cx);
-#if 0
- crtat -= vs.ncol * cx; /* XXX */
-#endif
- vs.state = 0;
- break;
- }
- case 'L': { /* insert cx rows */
- u_short *crtAt = crtat - vs.col;
- int cx = vs.cx,
- row = (crtAt - Crtat) / vs.ncol,
- nrow = vs.nrow - row;
- if (cx <= 0)
- cx = 1;
- else if (cx > nrow)
- cx = nrow;
- if (cx < nrow)
- bcopy(crtAt,
- crtAt + vs.ncol * cx,
- vs.ncol * (nrow - cx) *
- CHR);
- fillw((vs.at << 8) | ' ',
- crtAt, vs.ncol * cx);
- vs.state = 0;
- break;
- }
- case 'T': { /* scroll down cx lines */
- int cx = vs.cx;
- if (cx <= 0)
- cx = 1;
- else if (cx > vs.nrow)
- cx = vs.nrow;
- if (cx < vs.nrow)
- bcopy(Crtat,
- Crtat + vs.ncol * cx,
- vs.ncol * (vs.nrow - cx) *
- CHR);
- fillw((vs.at << 8) | ' ',
- Crtat, vs.ncol * cx);
-#if 0
- crtat += vs.ncol * cx; /* XXX */
-#endif
- vs.state = 0;
- break;
- }
- case ';': /* Switch params in cursor def */
- vs.state = VSS_EPARAM;
- break;
- case 'r':
- vs.so_at = (vs.cx & FG_MASK) |
- ((vs.cy << 4) & BG_MASK);
- vs.state = 0;
- break;
- case 's': /* save cursor pos */
- vs.offset = crtat - Crtat;
- vs.state = 0;
- break;
- case 'u': /* restore cursor pos */
- crtat = Crtat + vs.offset;
- vs.row = vs.offset / vs.ncol;
- vs.col = vs.offset % vs.ncol;
- vs.state = 0;
- break;
- case 'x': /* set attributes */
- switch (vs.cx) {
- case 0:
- vs.at = FG_LIGHTGREY | BG_BLACK;
- break;
- case 1:
- /* ansi background */
- if (!vs.color)
- break;
- vs.at &= FG_MASK;
- vs.at |= bgansitopc[vs.cy & 7];
- break;
- case 2:
- /* ansi foreground */
- if (!vs.color)
- break;
- vs.at &= BG_MASK;
- vs.at |= fgansitopc[vs.cy & 7];
- break;
- case 3:
- /* pc text attribute */
- if (vs.state >= VSS_EPARAM)
- vs.at = vs.cy;
- break;
- }
- vs.state = 0;
- break;
- case '_': /* set cursor type */
- if (vs.cx == 2)
- vs.cx = 14;
- else if (vs.cx)
- vs.cx = 1;
- else
- vs.cx = 12;
- cursor_shape = (vs.cx << 8) | 13;
- set_cursor_shape();
- break;
- case '=':
- vs.state = VSS_EBRACEQ;
- break;
-
- default: /* Only numbers valid here */
- if ((c >= '0') && (c <= '9')) {
- if (vs.state >= VSS_EPARAM) {
- vs.cy *= 10;
- vs.cy += c - '0';
- } else {
- vs.cx *= 10;
- vs.cx += c - '0';
- }
- } else
- vs.state = 0;
- break;
- }
- break;
- }
- }
- if (scroll) {
- scroll = 0;
- /* scroll check */
- if (crtat >= Crtat + vs.nchr) {
- if (!kernel) {
- int s = spltty();
- if (lock_state & KB_SCROLL)
- tsleep(&lock_state,
- PUSER, "pcputc", 0);
- splx(s);
- }
- bcopy(Crtat + vs.ncol, Crtat,
- (vs.nchr - vs.ncol) * CHR);
- fillw((vs.at << 8) | ' ',
- Crtat + vs.nchr - vs.ncol,
- vs.ncol);
- crtat -= vs.ncol;
- }
- }
- }
- async_update();
-}
-
-/* the unshifted code for KB_SHIFT keys is used by X to distinguish between
- left and right shift when reading the keyboard map */
-static pccons_keymap_t scan_codes[KB_NUM_KEYS] = {
-/* type unshift shift control altgr shift_altgr scancode */
- { KB_NONE, "", "", "", "", "", }, /* 0 unused */
- { KB_ASCII, "\033", "\033", "\033", "", "", }, /* 1 ESCape */
- { KB_ASCII, "1", "!", "!", "", "", }, /* 2 1 */
- { KB_ASCII, "2", "@", "\000", "", "", }, /* 3 2 */
- { KB_ASCII, "3", "#", "#", "", "", }, /* 4 3 */
- { KB_ASCII, "4", "$", "$", "", "", }, /* 5 4 */
- { KB_ASCII, "5", "%", "%", "", "", }, /* 6 5 */
- { KB_ASCII, "6", "^", "\036", "", "", }, /* 7 6 */
- { KB_ASCII, "7", "&", "&", "", "", }, /* 8 7 */
- { KB_ASCII, "8", "*", "\010", "", "", }, /* 9 8 */
- { KB_ASCII, "9", "(", "(", "", "", }, /* 10 9 */
- { KB_ASCII, "0", ")", ")", "", "", }, /* 11 0 */
- { KB_ASCII, "-", "_", "\037", "", "", }, /* 12 - */
- { KB_ASCII, "=", "+", "+", "", "", }, /* 13 = */
- { KB_ASCII, "\177", "\177", "\010", "", "", }, /* 14 backspace */
- { KB_ASCII, "\t", "\t", "\t", "", "", }, /* 15 tab */
- { KB_ASCII, "q", "Q", "\021", "", "", }, /* 16 q */
- { KB_ASCII, "w", "W", "\027", "", "", }, /* 17 w */
- { KB_ASCII, "e", "E", "\005", "", "", }, /* 18 e */
- { KB_ASCII, "r", "R", "\022", "", "", }, /* 19 r */
- { KB_ASCII, "t", "T", "\024", "", "", }, /* 20 t */
- { KB_ASCII, "y", "Y", "\031", "", "", }, /* 21 y */
- { KB_ASCII, "u", "U", "\025", "", "", }, /* 22 u */
- { KB_ASCII, "i", "I", "\011", "", "", }, /* 23 i */
- { KB_ASCII, "o", "O", "\017", "", "", }, /* 24 o */
- { KB_ASCII, "p", "P", "\020", "", "", }, /* 25 p */
- { KB_ASCII, "[", "{", "\033", "", "", }, /* 26 [ */
- { KB_ASCII, "]", "}", "\035", "", "", }, /* 27 ] */
- { KB_ASCII, "\r", "\r", "\n", "", "", }, /* 28 return */
- { KB_CTL, "", "", "", "", "", }, /* 29 control */
- { KB_ASCII, "a", "A", "\001", "", "", }, /* 30 a */
- { KB_ASCII, "s", "S", "\023", "", "", }, /* 31 s */
- { KB_ASCII, "d", "D", "\004", "", "", }, /* 32 d */
- { KB_ASCII, "f", "F", "\006", "", "", }, /* 33 f */
- { KB_ASCII, "g", "G", "\007", "", "", }, /* 34 g */
- { KB_ASCII, "h", "H", "\010", "", "", }, /* 35 h */
- { KB_ASCII, "j", "J", "\n", "", "", }, /* 36 j */
- { KB_ASCII, "k", "K", "\013", "", "", }, /* 37 k */
- { KB_ASCII, "l", "L", "\014", "", "", }, /* 38 l */
- { KB_ASCII, ";", ":", ";", "", "", }, /* 39 ; */
- { KB_ASCII, "'", "\"", "'", "", "", }, /* 40 ' */
- { KB_ASCII, "`", "~", "`", "", "", }, /* 41 ` */
- { KB_SHIFT, "\001", "", "", "", "", }, /* 42 shift */
- { KB_ASCII, "\\", "|", "\034", "", "", }, /* 43 \ */
- { KB_ASCII, "z", "Z", "\032", "", "", }, /* 44 z */
- { KB_ASCII, "x", "X", "\030", "", "", }, /* 45 x */
- { KB_ASCII, "c", "C", "\003", "", "", }, /* 46 c */
- { KB_ASCII, "v", "V", "\026", "", "", }, /* 47 v */
- { KB_ASCII, "b", "B", "\002", "", "", }, /* 48 b */
- { KB_ASCII, "n", "N", "\016", "", "", }, /* 49 n */
- { KB_ASCII, "m", "M", "\r", "", "", }, /* 50 m */
- { KB_ASCII, ",", "<", "<", "", "", }, /* 51 , */
- { KB_ASCII, ".", ">", ">", "", "", }, /* 52 . */
- { KB_ASCII, "/", "?", "\037", "", "", }, /* 53 / */
- { KB_SHIFT, "\002", "", "", "", "", }, /* 54 shift */
- { KB_KP, "*", "*", "*", "", "", }, /* 55 kp * */
- { KB_ALT, "", "", "", "", "", }, /* 56 alt */
- { KB_ASCII, " ", " ", "\000", "", "", }, /* 57 space */
- { KB_CAPS, "", "", "", "", "", }, /* 58 caps */
- { KB_FUNC, "\033[M", "\033[Y", "\033[k", "", "", }, /* 59 f1 */
- { KB_FUNC, "\033[N", "\033[Z", "\033[l", "", "", }, /* 60 f2 */
- { KB_FUNC, "\033[O", "\033[a", "\033[m", "", "", }, /* 61 f3 */
- { KB_FUNC, "\033[P", "\033[b", "\033[n", "", "", }, /* 62 f4 */
- { KB_FUNC, "\033[Q", "\033[c", "\033[o", "", "", }, /* 63 f5 */
- { KB_FUNC, "\033[R", "\033[d", "\033[p", "", "", }, /* 64 f6 */
- { KB_FUNC, "\033[S", "\033[e", "\033[q", "", "", }, /* 65 f7 */
- { KB_FUNC, "\033[T", "\033[f", "\033[r", "", "", }, /* 66 f8 */
- { KB_FUNC, "\033[U", "\033[g", "\033[s", "", "", }, /* 67 f9 */
- { KB_FUNC, "\033[V", "\033[h", "\033[t", "", "", }, /* 68 f10 */
- { KB_NUM, "", "", "", "", "", }, /* 69 num lock */
- { KB_SCROLL, "", "", "", "", "", }, /* 70 scroll lock */
- { KB_KP, "7", "\033[H", "7", "", "", }, /* 71 kp 7 */
- { KB_KP, "8", "\033[A", "8", "", "", }, /* 72 kp 8 */
- { KB_KP, "9", "\033[I", "9", "", "", }, /* 73 kp 9 */
- { KB_KP, "-", "-", "-", "", "", }, /* 74 kp - */
- { KB_KP, "4", "\033[D", "4", "", "", }, /* 75 kp 4 */
- { KB_KP, "5", "\033[E", "5", "", "", }, /* 76 kp 5 */
- { KB_KP, "6", "\033[C", "6", "", "", }, /* 77 kp 6 */
- { KB_KP, "+", "+", "+", "", "", }, /* 78 kp + */
- { KB_KP, "1", "\033[F", "1", "", "", }, /* 79 kp 1 */
- { KB_KP, "2", "\033[B", "2", "", "", }, /* 80 kp 2 */
- { KB_KP, "3", "\033[G", "3", "", "", }, /* 81 kp 3 */
- { KB_KP, "0", "\033[L", "0", "", "", }, /* 82 kp 0 */
- { KB_KP, ",", "\177", ",", "", "", }, /* 83 kp , */
- { KB_NONE, "", "", "", "", "", }, /* 84 0 */
- { KB_NONE, "", "", "", "", "", }, /* 85 0 */
- { KB_NONE, "", "", "", "", "", }, /* 86 0 */
- { KB_FUNC, "\033[W", "\033[i", "\033[u", "", "", }, /* 87 f11 */
- { KB_FUNC, "\033[X", "\033[j", "\033[v", "", "", }, /* 88 f12 */
- { KB_NONE, "", "", "", "", "", }, /* 89 0 */
- { KB_NONE, "", "", "", "", "", }, /* 90 0 */
- { KB_NONE, "", "", "", "", "", }, /* 91 0 */
- { KB_NONE, "", "", "", "", "", }, /* 92 0 */
- { KB_NONE, "", "", "", "", "", }, /* 93 0 */
- { KB_NONE, "", "", "", "", "", }, /* 94 0 */
- { KB_NONE, "", "", "", "", "", }, /* 95 0 */
- { KB_NONE, "", "", "", "", "", }, /* 96 0 */
- { KB_NONE, "", "", "", "", "", }, /* 97 0 */
- { KB_NONE, "", "", "", "", "", }, /* 98 0 */
- { KB_NONE, "", "", "", "", "", }, /* 99 0 */
- { KB_NONE, "", "", "", "", "", }, /* 100 */
- { KB_NONE, "", "", "", "", "", }, /* 101 */
- { KB_NONE, "", "", "", "", "", }, /* 102 */
- { KB_NONE, "", "", "", "", "", }, /* 103 */
- { KB_NONE, "", "", "", "", "", }, /* 104 */
- { KB_NONE, "", "", "", "", "", }, /* 105 */
- { KB_NONE, "", "", "", "", "", }, /* 106 */
- { KB_NONE, "", "", "", "", "", }, /* 107 */
- { KB_NONE, "", "", "", "", "", }, /* 108 */
- { KB_NONE, "", "", "", "", "", }, /* 109 */
- { KB_NONE, "", "", "", "", "", }, /* 110 */
- { KB_NONE, "", "", "", "", "", }, /* 111 */
- { KB_NONE, "", "", "", "", "", }, /* 112 */
- { KB_NONE, "", "", "", "", "", }, /* 113 */
- { KB_NONE, "", "", "", "", "", }, /* 114 */
- { KB_NONE, "", "", "", "", "", }, /* 115 */
- { KB_NONE, "", "", "", "", "", }, /* 116 */
- { KB_NONE, "", "", "", "", "", }, /* 117 */
- { KB_NONE, "", "", "", "", "", }, /* 118 */
- { KB_NONE, "", "", "", "", "", }, /* 119 */
- { KB_NONE, "", "", "", "", "", }, /* 120 */
- { KB_NONE, "", "", "", "", "", }, /* 121 */
- { KB_NONE, "", "", "", "", "", }, /* 122 */
- { KB_NONE, "", "", "", "", "", }, /* 123 */
- { KB_NONE, "", "", "", "", "", }, /* 124 */
- { KB_NONE, "", "", "", "", "", }, /* 125 */
- { KB_NONE, "", "", "", "", "", }, /* 126 */
- { KB_NONE, "", "", "", "", "" }, /* 127 */
-};
-
-/*
- * Get characters from the keyboard. If none are present, return NULL.
- */
-char *
-sget()
-{
- u_char dt;
- static u_char extended = 0, shift_state = 0;
- static u_char capchar[2];
-
-top:
- KBD_DELAY;
- dt = inb(IO_KBD + KBDATAP);
-
- switch (dt) {
- case KBR_ACK:
- ack = 1;
- goto loop;
- case KBR_RESEND:
- nak = 1;
- goto loop;
- }
-
-#ifdef XSERVER
- if (pc_xmode > 0) {
-#if defined(DDB) && defined(XSERVER_DDB)
- /* F12 enters the debugger while in X mode */
- if (dt == 88)
- if (db_console)
- Debugger();
-#endif
- capchar[0] = dt;
- capchar[1] = 0;
- /*
- * Check for locking keys.
- *
- * XXX Setting the LEDs this way is a bit bogus. What if the
- * keyboard has been remapped in X?
- */
- switch (scan_codes[dt & 0x7f].type) {
- case KB_NUM:
- if (dt & 0x80) {
- shift_state &= ~KB_NUM;
- break;
- }
- if (shift_state & KB_NUM)
- break;
- shift_state |= KB_NUM;
- lock_state ^= KB_NUM;
- async_update();
- break;
- case KB_CAPS:
- if (dt & 0x80) {
- shift_state &= ~KB_CAPS;
- break;
- }
- if (shift_state & KB_CAPS)
- break;
- shift_state |= KB_CAPS;
- lock_state ^= KB_CAPS;
- async_update();
- break;
- case KB_SCROLL:
- if (dt & 0x80) {
- shift_state &= ~KB_SCROLL;
- break;
- }
- if (shift_state & KB_SCROLL)
- break;
- shift_state |= KB_SCROLL;
- lock_state ^= KB_SCROLL;
- if ((lock_state & KB_SCROLL) == 0)
- wakeup(&lock_state);
- async_update();
- break;
- }
- return capchar;
- }
-#endif /* XSERVER */
-
- switch (dt) {
- case KBR_EXTENDED:
- extended = 1;
- goto loop;
- }
-
-#ifdef DDB
- /*
- * Check for cntl-alt-esc.
- */
- if (dt == 1 &&
- (shift_state & (KB_CTL | KB_ALT)) == (KB_CTL | KB_ALT)) {
- screen_restore(1);
- if (db_console)
- Debugger();
- dt |= 0x80; /* discard esc (ddb discarded ctl-alt) */
- }
-#endif
-
- screen_restore(0);
-
- /*
- * Check for make/break.
- */
- if (dt & 0x80) {
- /*
- * break
- */
- dt &= 0x7f;
- switch (scan_codes[dt].type) {
- case KB_NUM:
- shift_state &= ~KB_NUM;
- break;
- case KB_CAPS:
- shift_state &= ~KB_CAPS;
- break;
- case KB_SCROLL:
- shift_state &= ~KB_SCROLL;
- break;
- case KB_SHIFT:
- shift_state &= ~KB_SHIFT;
- break;
- case KB_ALT:
- if (extended)
- shift_state &= ~KB_ALTGR;
- else
- shift_state &= ~KB_ALT;
- break;
- case KB_CTL:
- shift_state &= ~KB_CTL;
- break;
- }
- } else {
- /*
- * make
- */
- switch (scan_codes[dt].type) {
- /*
- * locking keys
- */
- case KB_NUM:
- if (shift_state & KB_NUM)
- break;
- shift_state |= KB_NUM;
- lock_state ^= KB_NUM;
- async_update();
- break;
- case KB_CAPS:
- if (shift_state & KB_CAPS)
- break;
- shift_state |= KB_CAPS;
- lock_state ^= KB_CAPS;
- async_update();
- break;
- case KB_SCROLL:
- if (shift_state & KB_SCROLL)
- break;
- shift_state |= KB_SCROLL;
- lock_state ^= KB_SCROLL;
- if ((lock_state & KB_SCROLL) == 0)
- wakeup(&lock_state);
- async_update();
- break;
- /*
- * non-locking keys
- */
- case KB_SHIFT:
- shift_state |= KB_SHIFT;
- break;
- case KB_ALT:
- if (extended)
- shift_state |= KB_ALTGR;
- else
- shift_state |= KB_ALT;
- break;
- case KB_CTL:
- shift_state |= KB_CTL;
- break;
- case KB_ASCII:
- /* control has highest priority */
- if (shift_state & KB_CTL)
- capchar[0] = scan_codes[dt].ctl[0];
- else if (shift_state & KB_ALTGR) {
- if (shift_state & KB_SHIFT)
- capchar[0] = scan_codes[dt].shift_altgr[0];
- else
- capchar[0] = scan_codes[dt].altgr[0];
- } else {
- if (shift_state & KB_SHIFT)
- capchar[0] = scan_codes[dt].shift[0];
- else
- capchar[0] = scan_codes[dt].unshift[0];
- }
- if ((lock_state & KB_CAPS) && capchar[0] >= 'a' &&
- capchar[0] <= 'z') {
- capchar[0] -= ('a' - 'A');
- }
- capchar[0] |= (shift_state & KB_ALT);
- extended = 0;
- return capchar;
- case KB_NONE:
- break;
- case KB_FUNC: {
- char *more_chars;
- if (shift_state & KB_SHIFT)
- more_chars = scan_codes[dt].shift;
- else if (shift_state & KB_CTL)
- more_chars = scan_codes[dt].ctl;
- else
- more_chars = scan_codes[dt].unshift;
- extended = 0;
- return more_chars;
- }
- case KB_KP: {
- char *more_chars;
- if (shift_state & (KB_SHIFT | KB_CTL) ||
- (lock_state & KB_NUM) == 0 || extended)
- more_chars = scan_codes[dt].shift;
- else
- more_chars = scan_codes[dt].unshift;
- extended = 0;
- return more_chars;
- }
- }
- }
-
- extended = 0;
-loop:
- if ((inb(IO_KBD + KBSTATP) & KBS_DIB) == 0)
- return 0;
- goto top;
-}
-
-paddr_t
-pcmmap(dev, offset, nprot)
- dev_t dev;
- off_t offset;
- int nprot;
-{
-
- if ((u_int)offset > 0x20000)
- return -1;
- return i386_btop(0xa0000 + offset);
-}
-
-#ifdef XSERVER
-void
-pc_xmode_on()
-{
-
- if (pc_xmode)
- return;
- pc_xmode = 1;
- screen_restore(1);
-
-#ifdef XFREE86_BUG_COMPAT
- /* If still unchanged, get current shape. */
- if (cursor_shape == 0xffff)
- get_cursor_shape();
-#endif
-}
-
-void
-pc_xmode_off()
-{
- struct trapframe *fp;
-
- if (pc_xmode == 0)
- return;
- pc_xmode = 0;
-
-#ifdef XFREE86_BUG_COMPAT
- /* XXX It would be hard to justify why the X server doesn't do this. */
- set_cursor_shape();
-#endif
- async_update();
- screen_restore(0);
-
- fp = curproc->p_md.md_regs;
- if (securelevel <= 0)
- fp->tf_eflags &= ~PSL_IOPL;
-}
-#endif /* XSERVER */