/*
 * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch.
 *
 * Copyright (c) 1992, 1993 Brian Dunford-Shore.
 *
 * All rights reserved.
 *
 * 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
 *	Hellmuth Michaelis, Brian Dunford-Shore and Joerg Wunsch.
 * 4. The name authors may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHORS 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.
 *
 *
 * @(#)pcvt_hdr.h, 3.20, Last Edit-Date: [Fri Apr  7 10:16:58 1995]
 *
 */

/*---------------------------------------------------------------------------
 *
 *	pcvt_hdr.h	VT220 Driver Global Include File
 *	------------------------------------------------
 *	-hm	------------ Release 3.00 --------------
 *	-hm	integrating NetBSD-current patches
 *	-hm	integrating patches from Thomas Gellekum
 *	-hm	moving vt_selattr() inline into this file
 *	-hm	Michael's keyboard fifo diffs
 *	-hm	documenting some #ifdef's ...
 *	-hm	Joerg's patches for FreeBSD's ttymalloc
 *	-jw	introduced kbd_emulate_pc() if scanset > 1
 *	-hm	moved user configurable items to pcvt_conf.h
 *	-hm	applying Joerg's patches for FreeBSD 2.0
 *	-hm	patch from Onno & Martin for NetBSD-current (post 1.0)
 *	-hm	some adjustments for NetBSD 1.0
 *	-hm	patch from Joerg fixing FreeBSD 2.0 support
 *	-hm	patch from Onno/John for NetBSD-current
 *	-hm	applying patch from Joerg fixing Crtat bug
 *	-hm	removed PCVT_FAKE_SYSCONS10
 *	-hm	added pcstop (patch from Onno)
 *	-hm	multiple X server bugfixes from Lon Willett
 *	-hm	patch from Joerg for FreeBSD pre-2.1
 *	-jw	adding more support for FreeBSD pre-2.1
 *
 *---------------------------------------------------------------------------*/

#define	PCVT_REL "3.20-b24"	/* driver attach announcement	*/
				/* see also: pcvt_ioctl.h	*/

#include "opt_pcvt.h"
#if defined(__FreeBSD__) && !defined(PCVT_FREEBSD)
#  define PCVT_FREEBSD 210
#endif

#if PCVT_FREEBSD >= 200

#include <sys/param.h>
#include <sys/conf.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/tty.h>
#include <sys/uio.h>
#include <sys/callout.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/syslog.h>
#include <sys/malloc.h>
#include <sys/time.h>
#if PCVT_FREEBSD > 210
#include <machine/random.h>
#endif	/* PCVT_FREEBSD > 210 */
#else /* ! PCVT_FREEBSD >= 200 */

#include "param.h"
#include "conf.h"
#include "ioctl.h"
#include "proc.h"
#include "signalvar.h"
#include "tty.h"
#include "uio.h"
#include "callout.h"
#include "systm.h"
#include "kernel.h"
#include "syslog.h"
#include "malloc.h"
#include "time.h"

#endif /* PCVT_FREEBSD >= 200 */

#include <i386/isa/pcvt/pcvt_conf.h>
#include <i386/isa/kbdio.h>

#if PCVT_NETBSD > 9
#include "device.h"
#endif

#if PCVT_NETBSD > 9
#include "i386/isa/isavar.h"
#include "i386/cpufunc.h"
#elif PCVT_FREEBSD >= 200
#include <i386/isa/isa_device.h>
#else
#include "i386/isa/isa_device.h"
#endif

#if PCVT_FREEBSD >= 200
#include <i386/isa/icu.h>
#else
#include "i386/isa/icu.h"
#endif

#if PCVT_NETBSD > 100
#include "i386/isa/isareg.h"
#elif PCVT_FREEBSD >= 200
#include <i386/isa/isa.h>
#else
#include "i386/isa/isa.h"
#endif

#if PCVT_NETBSD > 9
#include "dev/cons.h"
#elif PCVT_FREEBSD >= 200
#include <machine/cons.h>
#else
#include "i386/i386/cons.h"
#endif

#if PCVT_NETBSD <= 9
#if PCVT_FREEBSD >= 200
#include <machine/psl.h>
#include <machine/frame.h>
#else /* ! PCVT_FREEBSD >= 200 */
#include "machine/psl.h"
#include "machine/frame.h"
#endif /* PCVT_FREEBSD >= 200 */
#endif /* PCVT_NETBSD <= 9 */

#if PCVT_NETBSD > 9
#include <i386/isa/pcvt/pcvt_ioctl.h>
#elif PCVT_FREEBSD >= 200
#include <machine/pcvt_ioctl.h>
#else
#include "machine/pcvt_ioctl.h"
#endif

#if PCVT_FREEBSD >= 200
#include <machine/pc/display.h>
#if PCVT_FREEBSD > 200
#include <machine/clock.h>
#include <machine/md_var.h>
#endif
#else /* PCVT_FREEBSD >= 200 */
#include "machine/pc/display.h"
#endif /* PCVT_FREEBSD >= 200 */

/* setup irq disable function to use */

#if !(PCVT_SLOW_INTERRUPT) && (PCVT_NETBSD > 9)
# define PCVT_DISABLE_INTR()	disable_intr()
# define PCVT_ENABLE_INTR()	enable_intr()
# undef PCVT_SLOW_INTERRUPT
#else
# define PCVT_DISABLE_INTR()	s = spltty()
# define PCVT_ENABLE_INTR()	splx(s)
# undef PCVT_SLOW_INTERRUPT
# define PCVT_SLOW_INTERRUPT 1
#endif

/* perform option consistency checks */

#if defined PCVT_FREEBSD && PCVT_FREEBSD == 1
# undef PCVT_FREEBSD
# define PCVT_FREEBSD 102	/* assume 1.0 release */
#endif

#if defined PCVT_NETBSD && PCVT_NETBSD == 1
#undef PCVT_NETBSD
#define PCVT_NETBSD 9		/* assume 0.9 release for now */
#endif

#if PCVT_FREEBSD + PCVT_NETBSD == 0
# error "pcvt_hdr.h: You MUST define one of PCVT_{NET,FREE}BSD \
in the config file"
#elif (PCVT_FREEBSD && PCVT_NETBSD)
# error "pcvt_hdr.h: You CAN only define *one* of PCVT_{NET,FREE}BSD \
in the config file"
#endif

#ifdef XSERVER

/* PCVT_NULLCHARS is mandatory for X server */
#if !PCVT_NULLCHARS
#undef PCVT_NULLCHARS
#define PCVT_NULLCHARS 1
#endif

/* PCVT_BACKUP_FONTS is mandatory for PCVT_USL_VT_COMPAT */
#if PCVT_USL_VT_COMPAT && !PCVT_BACKUP_FONTS
#undef PCVT_BACKUP_FONTS
#define PCVT_BACKUP_FONTS 1
#endif

#else /* XSERVER */

#if PCVT_USL_VT_COMPAT
#warning "Option PCVT_USL_VT_COMPAT meaningless without XSERVER"
#undef PCVT_USL_VT_COMPAT
#define PCVT_USL_VT_COMPAT 0
#endif

#endif /* XSERVER */

/* PCVT_SCREENSAVER is mandatory for PCVT_PRETTYSCRNS */
#if PCVT_PRETTYSCRNS && !PCVT_SCREENSAVER
#undef PCVT_SCREENSAVER
#define PCVT_SCREENSAVER 1
#endif

/* get the inline inb/outb back again ... */

#if PCVT_NETBSD
#if PCVT_NETBSD == 9
#include "machine/cpufunc.h"	/* NetBSD 0.9 [...and earlier -currents] */
#undef PCVT_USL_VT_COMPAT
#define PCVT_USL_VT_COMPAT 0	/* does not work, workaround ... */
#else
#include "machine/pio.h"	/* recent NetBSD -currents */
#define NEW_AVERUNNABLE		/* averunnable changes for younger currents */
#endif /* PCVT_NETBSD == 9 */
#endif /* PCVT_NETBSD */

#if PCVT_FREEBSD >= 200
#define NEW_AVERUNNABLE		/* new averunnable changes for FreeBSD 2.0 */
#endif

#if PCVT_SCANSET !=1 && PCVT_SCANSET !=2
#error "Supported keyboard scancode sets are 1 and 2 only (for now)!!!"
#endif

/*---------------------------------------------------------------------------*
 *	Keyboard and Keyboard Controller
 *---------------------------------------------------------------------------*/

#ifndef _I386_ISA_KBDIO_H_

#define CONTROLLER_CTRL	0x64	/* W - command, R - status	*/
#define CONTROLLER_DATA	0x60	/* R/W - data			*/

/* commands to control the CONTROLLER (8042) on the mainboard */

#define CONTR_READ	0x20	/* read command byte from controller */
#define CONTR_WRITE	0x60	/* write command to controller, see below */
#define CONTR_SELFTEST	0xaa	/* controller selftest, returns 0x55 when ok */
#define CONTR_IFTEST	0xab	/* interface selftest */
#define CONTR_KBDISABL	0xad	/* disable keyboard */
#define CONTR_KBENABL	0xae	/* enable keyboard */

/* command byte for writing to CONTROLLER (8042) via CONTR_WRITE */

#define	 COMMAND_RES7	0x80	/* bit 7, reserved, always write a ZERO ! */
#define	 COMMAND_PCSCAN	0x40	/* bit 6, 1 = convert to pc scan codes */
#define	 COMMAND_RES5	0x20	/* bit 5, perhaps (!) use 9bit frame
				 * instead of 11 */
#define	 COMMAND_DISABL	0x10	/* bit 4, 1 = disable keyboard */
#define	 COMMAND_INHOVR	0x08	/* bit 3, 1 = override security lock inhibit */
#define	 COMMAND_SYSFLG	0x04	/* bit 2, value stored as "system flag" */
#define	 COMMAND_RES2	0x02	/* bit 1, reserved, always write a ZERO ! */
#define	 COMMAND_IRQEN	0x01	/* bit 0, 1 = enable output buffer full
				 * interrupt */

/* status from CONTROLLER (8042) on the mainboard */

#define	STATUS_PARITY	0x80	/* bit 7, 1 = parity error on last byte */
#define STATUS_RXTIMO	0x40	/* bit 6, 1 = receive timeout error occured */
#define STATUS_TXTIMO	0x20	/* bit 5, 1 = transmit timeout error occured */
#define STATUS_ENABLE	0x10	/* bit 4, 1 = keyboard unlocked */
#define STATUS_WHAT	0x08	/* bit 3, 1 = wrote cmd to 0x64, 0 = wrote
				 * data to 0x60 */
#define STATUS_SYSFLG	0x04	/* bit 2, value stored as "system flag" */
#define STATUS_INPBF	0x02	/* bit 1, 1 = input buffer full (to 8042) */
#define STATUS_OUTPBF	0x01	/* bit 0, 1 = output buffer full (from 8042) */

/* commands to the KEYBOARD (via the 8042 controller on mainboard..) */

#define KEYB_C_RESET	0xff	/* reset keyboard to power-on status */
#define	KEYB_C_RESEND	0xfe	/* resend last byte in case of error */
#define KEYB_C_TYPEM	0xf3	/* set keyboard typematic rate/delay */
#define KEYB_C_ID	0xf2	/* return keyboard id */
#define KEYB_C_ECHO	0xee	/* diagnostic, echo 0xee */
#define KEYB_C_LEDS	0xed	/* set/reset numlock,capslock & scroll lock */

#endif /* _I386_ISA_KBDIO_H_ */

/* responses from the KEYBOARD (via the 8042 controller on mainboard..) */

#define	KEYB_R_OVERRUN0	0x00	/* keyboard buffer overflow */
#define KEYB_R_SELFOK	0xaa	/* keyboard selftest ok after KEYB_C_RESET */
#define KEYB_R_EXT0	0xe0	/* keyboard extended scancode prefix 1 */
#define KEYB_R_EXT1	0xe1	/* keyboard extended scancode prefix 2 */
#define KEYB_R_ECHO	0xee	/* keyboard response to KEYB_C_ECHO */
#define KEYB_R_BREAKPFX	0xf0	/* break code prefix for set 2 and 3 */
#define KEYB_R_ACK	0xfa	/* acknowledge after a command has rx'd */
#define KEYB_R_SELFBAD	0xfc	/*keyboard selftest FAILED after KEYB_C_RESET*/
#define KEYB_R_DIAGBAD	0xfd	/* keyboard self diagnostic failure */
#define KEYB_R_RESEND	0xfe	/* keyboard wants command resent or illegal
				 * command rx'd */
#define	KEYB_R_OVERRUN1	0xff	/* keyboard buffer overflow */

#define KEYB_R_MF2ID1	0xab	/* MF II Keyboard id-byte #1 */
#define KEYB_R_MF2ID2	0x41	/* MF II Keyboard id-byte #2 */
#define KEYB_R_MF2ID2HP	0x83	/* MF II Keyboard id-byte #2 from HP keybd's */

/* internal Keyboard Type */

#define KB_UNKNOWN	0	/* unknown keyboard type */
#define KB_AT		1	/* AT (84 keys) Keyboard */
#define KB_MFII		2	/* MF II (101/102 keys) Keyboard */

/*---------------------------------------------------------------------------*
 *	CMOS ram access to get the "Equipment Byte"
 *---------------------------------------------------------------------------*/

#define RTC_EQUIPMENT	0x14	/* equipment byte in cmos ram	*/
#define EQ_EGAVGA	0	/* reserved (= ega/vga)		*/
#define EQ_40COLOR	1	/* display = 40 col color	*/
#define EQ_80COLOR	2	/* display = 80 col color	*/
#define EQ_80MONO	3	/* display = 80 col mono	*/

/*---------------------------------------------------------------------------*
 *	VT220 -> internal color conversion table fields
 *---------------------------------------------------------------------------*/

#define VT_NORMAL	0x00		/* no attributes at all */
#define VT_BOLD		0x01		/* bold attribute */
#define VT_UNDER	0x02		/* underline attribute */
#define VT_BLINK	0x04		/* blink attribute */
#define VT_INVERSE	0x08		/* inverse attribute */

/*---------------------------------------------------------------------------*
 *	VGA GENERAL/EXTERNAL Registers          (3BA or 3DA and 3CA, 3C2, 3CC)
 *---------------------------------------------------------------------------*/

#define GN_MISCOUTR	0x3CC		/* misc output register read */
#define GN_MISCOUTW	0x3C2		/* misc output register write */
#define GN_INPSTAT0	0x3C2		/* input status 0, r/o */
#define GN_INPSTAT1M	0x3BA		/* input status 1, r/o, mono */
#define GN_INPSTAT1C	0x3DA		/* input status 1, r/o, color */
#define GN_FEATR	0x3CA		/* feature control, read */
#define GN_FEATWM	0x3BA		/* feature control, write, mono */
#define GN_FEATWC	0x3DA		/* feature control, write, color */
#define GN_VSUBSYS	0x3C3		/* video subsystem register r/w */
#define GN_DMCNTLM	0x3B8		/* display mode control, r/w, mono */
#define GN_DMCNTLC	0x3D8		/* display mode control, r/w, color */
#define GN_COLORSEL	0x3D9		/* color select register, w/o */
#define GN_HERCOMPAT	0x3BF		/* Hercules compatibility reg, w/o */

/*---------------------------------------------------------------------------*
 *	VGA CRTC Registers			  (3B4 and 3B5 or 3D4 and 3D5)
 *---------------------------------------------------------------------------*/

#define MONO_BASE	0x3B4		/* crtc index register address mono */
#define CGA_BASE	0x3D4		/* crtc index register address color */

#define	CRTC_ADDR	0x00		/* index register */

#define CRTC_HTOTAL	0x00		/* horizontal total */
#define CRTC_HDISPLE	0x01		/* horizontal display end */
#define CRTC_HBLANKS	0x02		/* horizontal blank start */
#define CRTC_HBLANKE	0x03		/* horizontal blank end */
#define CRTC_HSYNCS	0x04		/* horizontal sync start */
#define CRTC_HSYNCE	0x05		/* horizontal sync end */
#define CRTC_VTOTAL	0x06		/* vertical total */
#define CRTC_OVERFLL	0x07		/* overflow low */
#define CRTC_IROWADDR	0x08		/* inital row address */
#define CRTC_MAXROW	0x09		/* maximum row address */
#define CRTC_CURSTART	0x0A		/* cursor start row address */
#define 	CURSOR_ON_BIT 0x20	/* cursor on/off on mda/cga/vga */
#define CRTC_CUREND	0x0B		/* cursor end row address */
#define CRTC_STARTADRH	0x0C		/* linear start address mid */
#define CRTC_STARTADRL	0x0D		/* linear start address low */
#define CRTC_CURSORH	0x0E		/* cursor address mid */
#define CRTC_CURSORL	0x0F		/* cursor address low */
#define CRTC_VSYNCS	0x10		/* vertical sync start */
#define CRTC_VSYNCE	0x11		/* vertical sync end */
#define CRTC_VDE	0x12		/* vertical display end */
#define CRTC_OFFSET	0x13		/* row offset */
#define CRTC_ULOC	0x14		/* underline row address */
#define CRTC_VBSTART	0x15		/* vertical blank start */
#define CRTC_VBEND	0x16		/* vertical blank end */
#define CRTC_MODE	0x17		/* CRTC mode register */
#define CRTC_SPLITL	0x18		/* split screen start low */

/* start of ET4000 extensions */

#define CRTC_RASCAS	0x32		/* ras/cas configuration */
#define CRTC_EXTSTART	0x33		/* extended start address */
#define CRTC_COMPAT6845	0x34		/* 6845 comatibility control */
#define CRTC_OVFLHIGH	0x35		/* overflow high */
#define CRTC_SYSCONF1	0x36		/* video system configuration 1 */
#define CRTC_SYSCONF2	0x36		/* video system configuration 2 */

/* start of WD/Paradise extensions */

#define	CRTC_PR10	0x29		/* r/w unlocking */
#define	CRTC_PR11	0x2A		/* ega switches */
#define	CRTC_PR12	0x2B		/* scratch pad */
#define	CRTC_PR13	0x2C		/* interlace h/2 start */
#define	CRTC_PR14	0x2D		/* interlace h/2 end */
#define	CRTC_PR15	0x2E		/* misc control #1 */
#define	CRTC_PR16	0x2F		/* misc control #2 */
#define	CRTC_PR17	0x30		/* misc control #3 */
					/* 0x31 .. 0x3f reserved */
/* Video 7 */

#define CRTC_V7ID	0x1f		/* identification register */

/* Trident */

#define CRTC_MTEST	0x1e		/* module test register */
#define CRTC_SOFTPROG	0x1f		/* software programming */
#define CRTC_LATCHRDB	0x22		/* latch read back register */
#define CRTC_ATTRSRDB	0x24		/* attribute state read back register*/
#define CRTC_ATTRIRDB	0x26		/* attribute index read back register*/
#define CRTC_HOSTAR	0x27		/* high order start address register */

/*---------------------------------------------------------------------------*
 *	VGA TIMING & SEQUENCER Registers			 (3C4 and 3C5)
 *---------------------------------------------------------------------------*/

#define TS_INDEX	0x3C4		/* index register */
#define TS_DATA		0x3C5		/* data register */

#define TS_SYNCRESET	0x00		/* synchronous reset */
#define TS_MODE		0x01		/* ts mode register */
#define TS_WRPLMASK	0x02		/* write plane mask */
#define TS_FONTSEL	0x03		/* font select register */
#define TS_MEMMODE	0x04		/* memory mode register */

/* ET4000 only */

#define TS_RESERVED	0x05		/* undef, reserved */
#define TS_STATECNTL	0x06		/* state control register */
#define TS_AUXMODE	0x07		/* auxiliary mode control */

/* WD/Paradise only */

#define TS_UNLOCKSEQ	0x06		/* PR20 - unlock sequencer register */
#define TS_DISCFSTAT	0x07		/* PR21 - display config status */
#define TS_MEMFIFOCTL	0x10		/* PR30 - memory i/f & fifo control */
#define TS_SYSIFCNTL	0x11		/* PR31 - system interface control */
#define TS_MISC4	0x12		/* PR32 - misc control #4 */

/* Video 7 */

#define TS_EXTCNTL	0x06		/* extensions control */
#define TS_CLRVDISP	0x30		/* clear vertical display 0x30-0x3f */
#define TS_V7CHIPREV	0x8e		/* chipset revision 0x8e-0x8f */
#define TS_SWBANK	0xe8		/* single/write bank register, rev 5+*/
#define TS_RDBANK	0xe8		/* read bank register, rev 4+ */
#define TS_MISCCNTL	0xe8		/* misc control register, rev 4+ */
#define TS_SWSTROBE	0xea		/* switch strobe */
#define TS_MWRCNTL	0xf3		/* masked write control */
#define TS_MWRMVRAM	0xf4		/* masked write mask VRAM only */
#define TS_BANKSEL	0xf6		/* bank select */
#define TS_SWREADB	0xf7		/* switch readback */
#define TS_PAGESEL	0xf9		/* page select */
#define TS_COMPAT	0xfc		/* compatibility control */
#define TS_16BITCTL	0xff		/* 16 bit interface control */

/* Trident */

#define TS_HWVERS	0x0b		/* hardware version, switch old/new! */
#define TS_CONFPORT1	0x0c		/* config port 1 and 2    - caution! */
#define TS_MODEC2	0x0d		/* old/new mode control 2 - caution! */
#define TS_MODEC1	0x0e		/* old/new mode control 1 - caution! */
#define	TS_PUPM2	0x0f		/* power up mode 2 */

/*---------------------------------------------------------------------------*
 *	VGA GRAPHICS DATA CONTROLLER Registers		    (3CE, 3CF and 3CD)
 *---------------------------------------------------------------------------*/

#define GDC_SEGSEL	0x3CD		/* segment select register */
#define GDC_INDEX	0x3CE		/* index register */
#define GDC_DATA	0x3CF		/* data register */

#define GDC_SETRES	0x00		/* set / reset bits */
#define GDC_ENSETRES	0x01		/* enable set / reset */
#define GDC_COLORCOMP	0x02		/* color compare register */
#define GDC_ROTFUNC	0x03		/* data rotate / function select */
#define GDC_RDPLANESEL	0x04		/* read plane select */
#define GDC_MODE	0x05		/* gdc mode register */
#define GDC_MISC	0x06		/* gdc misc register */
#define GDC_COLORCARE	0x07		/* color care register */
#define GDC_BITMASK	0x08		/* bit mask register */

/* WD/Paradise only */

#define GDC_BANKSWA	0x09		/* PR0A - bank switch a */
#define GDC_BANKSWB	0x0a		/* PR0B - bank switch b */
#define GDC_MEMSIZE	0x0b		/* PR1 memory size */
#define GDC_VIDEOSEL	0x0c		/* PR2 video configuration */
#define GDC_CRTCNTL	0x0d		/* PR3 crt address control */
#define GDC_VIDEOCNTL	0x0e		/* PR4 video control */
#define GDC_PR5GPLOCK	0x0f		/* PR5 gp status and lock */

/* Video 7 */

#define GDC_DATALATCH	0x22		/* gdc data latch */

/*---------------------------------------------------------------------------*
 *	VGA ATTRIBUTE CONTROLLER Registers			 (3C0 and 3C1)
 *---------------------------------------------------------------------------*/

#define ATC_INDEX	0x3C0		/* index register  AND	*/
#define ATC_DATAW	0x3C0		/* data write	   !!!	*/
#define ATC_DATAR	0x3C1		/* data read */

#define ATC_ACCESS	0x20		/* access bit in ATC index register */

#define ATC_PALETTE0	0x00		/* color palette register 0 */
#define ATC_PALETTE1	0x01		/* color palette register 1 */
#define ATC_PALETTE2	0x02		/* color palette register 2 */
#define ATC_PALETTE3	0x03		/* color palette register 3 */
#define ATC_PALETTE4	0x04		/* color palette register 4 */
#define ATC_PALETTE5	0x05		/* color palette register 5 */
#define ATC_PALETTE6	0x06		/* color palette register 6 */
#define ATC_PALETTE7	0x07		/* color palette register 7 */
#define ATC_PALETTE8	0x08		/* color palette register 8 */
#define ATC_PALETTE9	0x09		/* color palette register 9 */
#define ATC_PALETTEA	0x0A		/* color palette register 10 */
#define ATC_PALETTEB	0x0B		/* color palette register 11 */
#define ATC_PALETTEC	0x0C		/* color palette register 12 */
#define ATC_PALETTED	0x0D		/* color palette register 13 */
#define ATC_PALETTEE	0x0E		/* color palette register 14 */
#define ATC_PALETTEF	0x0F		/* color palette register 15 */
#define ATC_MODE	0x10		/* atc mode register */
#define ATC_OVERSCAN	0x11		/* overscan register */
#define ATC_COLPLEN	0x12		/* color plane enable register */
#define ATC_HORPIXPAN	0x13		/* horizontal pixel panning */
#define ATC_COLRESET	0x14		/* color reset */
#define ATC_MISC	0x16		/* misc register (ET3000/ET4000) */

/*---------------------------------------------------------------------------*
 *	VGA palette handling (output DAC palette)
 *---------------------------------------------------------------------------*/

#define VGA_DAC		0x3C6		/* vga dac address */
#define VGA_PMSK	0x3F		/* palette mask, 64 distinct values */
#define NVGAPEL 	256		/* number of palette entries */

/*---------------------------------------------------------------------------*
 *	function key labels
 *---------------------------------------------------------------------------*/

#define LABEL_LEN	9		/* length of one label */
#define LABEL_MID	8		/* mid-part (row/col)	*/

#define LABEL_ROWH	((4*LABEL_LEN)+1)
#define LABEL_ROWL	((4*LABEL_LEN)+2)
#define LABEL_COLU	((4*LABEL_LEN)+4)
#define LABEL_COLH	((4*LABEL_LEN)+5)
#define LABEL_COLL	((4*LABEL_LEN)+6)

/* tab setting */

#define MAXTAB 132		/* no of possible tab stops */

/* escape detection state machine */

#define STATE_INIT	0	/* normal	*/
#define	STATE_ESC	1	/* got ESC	*/
#define STATE_BLANK	2	/* got ESC space*/
#define STATE_HASH	3	/* got ESC #	*/
#define STATE_BROPN	4	/* got ESC (	*/
#define STATE_BRCLO	5	/* got ESC )	*/
#define STATE_CSI	6	/* got ESC [	*/
#define STATE_CSIQM	7	/* got ESC [ ?	*/
#define STATE_AMPSND	8	/* got ESC &	*/
#define STATE_STAR	9	/* got ESC *	*/
#define STATE_PLUS	10	/* got ESC +	*/
#define STATE_DCS	11	/* got ESC P	*/
#define STATE_SCA	12	/* got ESC <Ps> " */
#define STATE_STR	13	/* got ESC !	*/
#define STATE_MINUS	14	/* got ESC -	*/
#define STATE_DOT	15	/* got ESC .	*/
#define STATE_SLASH	16	/* got ESC /	*/

/* for storing escape sequence parameters */

#define MAXPARMS 	10	/* maximum no of parms */

/* terminal responses */

#define DA_VT220	"\033[?62;1;2;6;7;8;9c"

/* sub-states for Device Control String processing */

#define DCS_INIT	0	/* got ESC P ... */
#define DCS_AND_UDK	1	/* got ESC P ... | */
#define DCS_UDK_DEF	2	/* got ESC P ... | fnckey / */
#define DCS_UDK_ESC	3	/* got ESC P ... | fnckey / ... ESC */
#define DCS_DLD_DSCS	4	/* got ESC P ... { */
#define DCS_DLD_DEF	5	/* got ESC P ... { dscs */
#define DCS_DLD_ESC	6	/* got ESC P ... { dscs ... / ... ESC */

/* vt220 user defined keys and vt220 downloadable charset */

#define MAXUDKDEF	300	/* max 256 char + 1 '\0' + space.. */
#define	MAXUDKEYS	18	/* plus holes .. */
#define DSCS_LENGTH	3	/* descriptor length */
#define MAXSIXEL	8	/* sixels forever ! */

/* sub-states for HP-terminal emulator */

#define SHP_INIT	0

/* esc & f family */

#define SHP_AND_F	1
#define SHP_AND_Fa	2
#define SHP_AND_Fak	3
#define SHP_AND_Fak1	4
#define SHP_AND_Fakd	5
#define SHP_AND_FakdL	6
#define SHP_AND_FakdLl	7
#define SHP_AND_FakdLls	8

/* esc & j family */

#define SHP_AND_J	9
#define SHP_AND_JL	10

/* esc & every-thing-else */

#define SHP_AND_ETE	11

/* additionals for function key labels */

#define MAX_LABEL	16
#define MAX_STRING	80
#define MAX_STATUS	160

/* MAX values for screen sizes for possible video adaptors */

#define MAXROW_MDACGA	25		/* MDA/CGA can do 25 x 80 max */
#define MAXCOL_MDACGA	80

#define MAXROW_EGA	43		/* EGA can do 43 x 80 max */
#define MAXCOL_EGA	80

#define MAXROW_VGA	50		/* VGA can do 50 x 80 max */
#define MAXCOL_VGA	80
#define MAXCOL_SVGA	132		/* Super VGA can do 50 x 132 max */

/* switch 80/132 columns */

#define SCR_COL80	80		/* in 80 col mode */
#define SCR_COL132	132		/* in 132 col mode */

#define MAXDECSCA	(((MAXCOL_SVGA * MAXROW_VGA) \
			/ (8 * sizeof(unsigned int)) ) + 1 )

/* screen memory start, monochrome */

#ifndef	MONO_BUF
# if PCVT_FREEBSD && (PCVT_FREEBSD > 102)
#  define MONO_BUF	(KERNBASE+0xB0000)
# else
#  define MONO_BUF	0xfe0B0000		 /* NetBSD-current: isa.h */
# endif
#endif

/* screen memory start, color */

#ifndef	CGA_BUF
# if PCVT_FREEBSD && (PCVT_FREEBSD > 102)
#  define CGA_BUF	(KERNBASE+0xB8000)
# else
#  define CGA_BUF	0xfe0B8000		 /* NetBSD-current: isa.h */
# endif
#endif

#define	CHR		2		/* bytes per word in screen mem */

#define NVGAFONTS	8		/* number of vga fonts loadable */

#define MAXKEYNUM	127		/* max no of keys in table */

/* charset tables */

#define	CSL	0x0000		/* ega/vga charset, lower half of 512 */
#define	CSH	0x0800		/* ega/vga charset, upper half of 512 */
#define CSSIZE	96		/* (physical) size of a character set */

/* charset designations */

#define D_G0		0	/* designated as G0 */
#define D_G1		1	/* designated as G1 */
#define D_G2		2	/* designated as G2 */
#define D_G3		3	/* designated as G3 */
#define D_G1_96		4	/* designated as G1 for 96-char charsets */
#define D_G2_96		5	/* designated as G2 for 96-char charsets */
#define D_G3_96		6	/* designated as G3 for 96-char charsets */

/* which fkey-labels */

#define SYS_FKL		0	/* in hp mode, sys-fkls are active */
#define USR_FKL		1	/* in hp mode, user-fkls are active */

/* arguments to async_update() */

#define UPDATE_START	((void *)0)	/* do cursor update and requeue */
#define UPDATE_STOP	((void *)1)	/* suspend cursor updates */
#define UPDATE_KERN	((void *)2)	/* do cursor updates for kernel output */

/* variables */

#ifdef EXTERN
#define WAS_EXTERN
#else
#define EXTERN extern
#endif

EXTERN	u_char	*more_chars;		/* response buffer via kbd */
EXTERN	int	char_count;		/* response char count */
EXTERN	u_char	color;			/* color or mono display */

EXTERN	u_short	kern_attr;		/* kernel messages char attributes */
EXTERN	u_short	user_attr;		/* character attributes */

#if !PCVT_EMU_MOUSE

#if PCVT_NETBSD
EXTERN struct tty *pc_tty[PCVT_NSCREENS];
#elif !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200)
EXTERN struct tty pccons[PCVT_NSCREENS];
#else
EXTERN struct tty *pccons[PCVT_NSCREENS];
#endif /* PCVT_NETBSD */

#else /* PCVT_EMU_MOUSE */

#if PCVT_NETBSD
EXTERN struct tty *pc_tty[PCVT_NSCREENS + 1];
#elif !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200)
EXTERN struct tty pccons[PCVT_NSCREENS + 1];
#else
EXTERN struct tty *pccons[PCVT_NSCREENS + 1];
#endif

#endif /* PCVT_EMU_MOUSE */

struct sixels {
	u_char lower[MAXSIXEL];		/* lower half of char */
	u_char upper[MAXSIXEL];		/* upper half of char */
};

struct udkentry {
	u_char	first[MAXUDKEYS];	/* index to first char */
	u_char	length[MAXUDKEYS];	/* length of this entry */
};

/* VGA palette handling */
struct rgb {
	u_char	r, g, b;		/* red/green/blue, valid 0..VGA_PMSK */
};

typedef struct video_state {
	u_short	*Crtat;			/* video page start addr */
	u_short *Memory;		/* malloc'ed memory start address */
	struct tty *vs_tty;		/* pointer to this screen's tty */
	u_char	maxcol;			/* 80 or 132 cols on screen */
	u_char 	row, col;		/* current cursor position */
	u_short	c_attr;			/* current character attributes */
	u_char	vtsgr;			/* current sgr configuration */
	u_short	cur_offset;		/* current cursor position offset */
	u_char	bell_on;		/* flag, bell enabled */
	u_char	sevenbit;		/* flag, data path 7 bits wide */
	u_char	dis_fnc;		/* flag, display functions enable */
	u_char	transparent;		/* flag, mk path tmp trnsprnt for ctls*/
	u_char	scrr_beg;		/* scrolling region, begin */
	u_char	scrr_len;		/* scrolling region, length */
	u_char	scrr_end;		/* scrolling region, end */
	u_char	screen_rows;		/* screen size, length - status lines */
	u_char	screen_rowsize; 	/* screen size, length */
	u_char	vga_charset;		/* VGA character set value */
	u_char	lastchar;		/* flag, vt100 behaviour of last char */
	u_char	lastrow;		/* save row, --------- " -----------  */
	u_char	*report_chars;		/* ptr, status reports from terminal */
	u_char	report_count;		/* count, ----------- " ------------ */
	u_char	state;			/* escape sequence state machine */
	u_char	m_awm;			/* flag, vt100 mode, auto wrap */
	u_char	m_om;			/* flag, vt100 mode, origin mode */
	u_char	sc_flag;		/* flag, vt100 mode,saved parms valid */
	u_char	sc_row;			/* saved row */
	u_char	sc_col;			/* saved col */
	u_short sc_cur_offset;		/* saved cursor addr offset */
	u_short	sc_attr;		/* saved attributes */
	u_char	sc_vtsgr;		/* saved sgr configuration */
	u_char	sc_awm;			/* saved auto wrap mode */
	u_char	sc_om;			/* saved origin mode */
	u_short	*sc_G0;			/* save G0 ptr */
	u_short	*sc_G1;			/* save G1 ptr */
	u_short	*sc_G2;			/* save G2 ptr */
	u_short	*sc_G3;			/* save G3 ptr */
	u_short	**sc_GL;		/* save GL ptr */
	u_short	**sc_GR;		/* save GR ptr */
	u_char	sc_sel;			/* selective erase state */
	u_char	ufkl[8][17];		/* user fkey-labels */
	u_char	sfkl[8][17];		/* system fkey-labels */
	u_char	labels_on;		/* display fkey labels etc. on/off */
	u_char	which_fkl;		/* which fkey labels are active */
	char	tab_stops[MAXTAB]; 	/* table of active tab stops */
	u_char	parmi;			/* parameter index */
	u_char	parms[MAXPARMS];	/* parameter array */
	u_char	hp_state;		/* hp escape sequence state machine */
	u_char	attribute;		/* attribute normal, tx only, local */
	u_char	key;			/* fkey label no */
	u_char	l_len;			/* buffer length's */
	u_char	s_len;
	u_char	m_len;
	u_char	i;			/* help (got short of names ...) */
	u_char	l_buf[MAX_LABEL+1]; 	/* buffers */
	u_char	s_buf[MAX_STRING+1];
	u_char	m_buf[MAX_STATUS+1];
	u_char	openf;			/* we are opened ! */
	u_char	vt_pure_mode;		/* no fkey labels, row/col, status */
	u_char	cursor_start;		/* Start of cursor */
	u_char	cursor_end;		/* End of cursor */
	u_char	cursor_on;		/* cursor switched on */
	u_char	ckm;			/* true = cursor key normal mode */
	u_char	irm;			/* true = insert mode */
	u_char	lnm;			/* Line Feed/New Line Mode */
	u_char	dcs_state;		/* dcs escape sequence state machine */
	u_char	udk_def[MAXUDKDEF]; 	/* new definitions for vt220 FKeys */
	u_char	udk_defi;		/* index for FKey definitions */
	u_char	udk_deflow;		/* low or high nibble in sequence */
	u_char	udk_fnckey;		/* function key to assign to */
	u_char	dld_dscs[DSCS_LENGTH];	/* designate soft character set id */
	u_char	dld_dscsi;		/* index for dscs */
	u_char	dld_sixel_lower;	/* upper/lower sixels of character */
	u_char	dld_sixelli;		/* index for lower sixels */
	u_char	dld_sixelui;		/* index for upper sixels */
	struct sixels sixel;		/* structure for storing char sixels */
	u_char	selchar;		/* true = selective attribute on */
	u_int	decsca[MAXDECSCA];	/* Select Character Attrib bit array */
	u_short **GL;			/* ptr to current GL conversion table*/
	u_short **GR;			/* ptr to current GR conversion table*/
	u_short *G0;			/* ptr to current G0 conversion table*/
	u_short *G1;			/* ptr to current G1 conversion table*/
	u_char force24;			/* force 24 lines in DEC 25 and HP 28*/
	u_short *G2;			/* ptr to current G2 conversion table*/
	u_short *G3;			/* ptr to current G3 conversion table*/
	u_char	dld_id[DSCS_LENGTH+1];	/* soft character set id */
	u_char	which[DSCS_LENGTH+1];	/* which set to designate */
	u_char	whichi;			/* index into which ..	*/
	u_char  ss;			/* flag, single shift G2 / G3 -> GL */
	u_short **Gs;			/* ptr to cur. G2/G3 conversion table*/
	u_char	udkbuf[MAXUDKDEF];	/* buffer for user defined keys */
	struct udkentry ukt;		/* index & length for each udk */
	u_char	udkff;			/* index into buffer first free entry*/
	struct rgb palette[NVGAPEL];	/* saved VGA DAC palette */
	u_char	wd132col;		/* we are on a wd vga and in 132 col */
	u_char	scroll_lock; 		/* scroll lock active */
	u_char	caps_lock;		/* caps lock active */
	u_char	shift_lock;		/* shiftlock flag (virtual ..) */
	u_char	num_lock;		/* num lock, true = keypad num mode */
	u_char	abs_write;		/* write outside of scroll region */

#if PCVT_USL_VT_COMPAT			/* SysV compatibility :-( */

	struct vt_mode smode;
	struct proc *proc;
	pid_t pid;
	unsigned vt_status;
#define	VT_WAIT_REL 1			/* wait till process released vt */
#define VT_WAIT_ACK 2			/* wait till process ack vt acquire */
#define VT_GRAFX    4			/* vt runs graphics mode */
#define VT_WAIT_ACT 8			/* a process is sleeping on this vt */
					/*  becoming active */
#endif /* PCVT_USL_VT_COMPAT */

} video_state;

EXTERN video_state vs[PCVT_NSCREENS];	/* parameters for screens */

struct vga_char_state {
	int	loaded;		/* Whether a font is loaded here */
	int	secondloaded;	/* an extension characterset was loaded, */
				/*	the number is found here	 */
	u_char	char_scanlines;	/* Scanlines per character */
	u_char	scr_scanlines;	/* Low byte of scanlines per screen */
	int	screen_size;	/* Screen size in SIZ_YYROWS */
};

EXTERN struct vga_char_state vgacs[NVGAFONTS];	/* Character set states */

#if PCVT_EMU_MOUSE
struct mousestat {
	struct timeval lastmove; /* last time the pointer moved */
	u_char opened;		 /* someone would like to use a mouse */
	u_char minor;		 /* minor device number */
	u_char buttons;		 /* current "buttons" pressed */
	u_char extendedseen;	 /* 0xe0 has been seen, do not use next key */
	u_char breakseen;	 /* key break has been seen for a sticky btn */
};
#endif /* PCVT_EMU_MOUSE */

#ifdef WAS_EXTERN

#if PCVT_NETBSD > 9

int pcprobe ();
void pcattach ();

struct cfdriver vtcd = {
	NULL, "vt", pcprobe, pcattach, DV_TTY, sizeof(struct device)
};

#else

int pcprobe ( struct isa_device *dev );
int pcattach ( struct isa_device *dev );

struct	isa_driver vtdriver = {		/* driver routines */
	pcprobe, pcattach, "vt", 1,
};

#endif /* PCVT_NETBSD > 9 */

u_char fgansitopc[] = {			/* foreground ANSI color -> pc */
	FG_BLACK, FG_RED, FG_GREEN, FG_BROWN, FG_BLUE,
	FG_MAGENTA, FG_CYAN, FG_LIGHTGREY
};

u_char bgansitopc[] = {			/* background ANSI color -> pc */
	BG_BLACK, BG_RED, BG_GREEN, BG_BROWN, BG_BLUE,
	BG_MAGENTA, BG_CYAN, BG_LIGHTGREY
};

#if !PCVT_NETBSD
/* XXX Crtat is shared with syscons. */
u_short *Crtat;			/* screen start address */
#if !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200)
struct tty *pcconsp =	&pccons[0];		/* ptr to current device */
#else /* PCVT_FREEBSD > 110 */
struct tty *pcconsp;
#endif /* !(PCVT_FREEBSD > 110) */
#else
struct tty *pcconsp;		/* ptr to current device, see pcattach() */
#endif /* PCVT_NETBSD */

#if PCVT_EMU_MOUSE
struct mousestat	mouse = {0};
struct mousedefs	mousedef = {0x3b, 0x3c, 0x3d, 0,     250000};
#endif /* PCVT_EMU_MOUSE */	/*  F1,   F2,   F3,   false, 0.25 sec */

video_state *vsp 		= &vs[0]; /* ptr to current screen parms */

#if PCVT_USL_VT_COMPAT
int	vt_switch_pending	= 0; 		/* if > 0, a vt switch is */
#endif /* PCVT_USL_VT_COMPAT */			/* pending; contains the # */
						/* of the old vt + 1 */

u_int	addr_6845		= MONO_BASE;	/* crtc base addr */
u_char	do_initialization	= 1;		/* we have to init ourselves */
u_char	pcvt_is_console		= 0;		/* until we know it */
u_char 	shift_down 		= 0;		/* shift key down flag */
u_char	ctrl_down		= 0; 		/* ctrl key down flag */
u_char	meta_down		= 0; 		/* alt key down flag */
u_char	altgr_down		= 0; 		/* altgr key down flag */
u_char	kbrepflag		= 1;		/* key repeat flag */
u_char	totalscreens		= 1;		/* screens available */
u_char	current_video_screen	= 0;		/* displayed screen no */
u_char	adaptor_type 		= UNKNOWN_ADAPTOR;/* adaptor type */
u_char 	vga_type 		= VGA_UNKNOWN;	/* vga chipset */
u_char	can_do_132col		= 0;		/* vga chipset can 132 cols */
u_char	vga_family		= 0;		/* vga manufacturer */
u_char	totalfonts		= 0;		/* fonts available */
u_char	chargen_access		= 0;		/* synchronize access */
u_char	keyboard_type		= KB_UNKNOWN;	/* type of keyboard */
u_char	keyboard_is_initialized = 0;		/* for ddb sanity */
u_char	kbd_polling		= 0;		/* keyboard is being polled */
#ifdef _I386_ISA_KBDIO_H_
u_char	reset_keyboard		= 0;		/* OK to reset keyboard */
KBDC	kbdc			= NULL;		/* keyboard controller */
#endif /* _I386_ISA_KBDIO_H_ */

#if PCVT_SHOWKEYS
u_char	keyboard_show		= 0;		/* normal display */
#endif /* PCVT_SHOWKEYS */

u_char	cursor_pos_valid	= 0;		/* sput left a valid position*/

u_char	critical_scroll		= 0;		/* inside scrolling up */
int	switch_page		= -1;		/* which page to switch to */

#if PCVT_SCREENSAVER
u_char	reset_screen_saver	= 1;		/* reset the saver next time */
u_char	scrnsv_active		= 0;		/* active flag */
#endif /* PCVT_SCREENSAVER */

#ifdef XSERVER
unsigned scrnsv_timeout		= 0;		/* initially off */
#if !PCVT_USL_VT_COMPAT
u_char pcvt_xmode		= 0;		/* display is grafx */
#endif /* PCVT_USL_VT_COMPAT */
u_char pcvt_kbd_raw		= 0;		/* keyboard sends scans */
#endif /* XSERVER */

#if PCVT_BACKUP_FONTS
u_char *saved_charsets[NVGAFONTS] = {0};	/* backup copy of fonts */
#endif /* PCVT_BACKUP_FONTS */

/*---------------------------------------------------------------------------

	VT220 attributes -> internal emulator attributes conversion tables

	be careful when designing color combinations, because on
	EGA and VGA displays, bit 3 of the attribute byte is used
	for characterset switching, and is no longer available for
	foreground intensity (bold)!

---------------------------------------------------------------------------*/

/* color displays */

u_char sgr_tab_color[16] = {
/*00*/  (BG_BLACK     | FG_LIGHTGREY),             /* normal               */
/*01*/  (BG_BLUE      | FG_LIGHTGREY),             /* bold                 */
/*02*/  (BG_BROWN     | FG_LIGHTGREY),             /* underline            */
/*03*/  (BG_MAGENTA   | FG_LIGHTGREY),             /* bold+underline       */
/*04*/  (BG_BLACK     | FG_LIGHTGREY | FG_BLINK),  /* blink                */
/*05*/  (BG_BLUE      | FG_LIGHTGREY | FG_BLINK),  /* bold+blink           */
/*06*/  (BG_BROWN     | FG_LIGHTGREY | FG_BLINK),  /* underline+blink      */
/*07*/  (BG_MAGENTA   | FG_LIGHTGREY | FG_BLINK),  /* bold+underline+blink */
/*08*/  (BG_LIGHTGREY | FG_BLACK),                 /* invers               */
/*09*/  (BG_LIGHTGREY | FG_BLUE),                  /* bold+invers          */
/*10*/  (BG_LIGHTGREY | FG_BROWN),                 /* underline+invers     */
/*11*/  (BG_LIGHTGREY | FG_MAGENTA),               /* bold+underline+invers*/
/*12*/  (BG_LIGHTGREY | FG_BLACK      | FG_BLINK), /* blink+invers         */
/*13*/  (BG_LIGHTGREY | FG_BLUE       | FG_BLINK), /* bold+blink+invers    */
/*14*/  (BG_LIGHTGREY | FG_BROWN      | FG_BLINK), /* underline+blink+invers*/
/*15*/  (BG_LIGHTGREY | FG_MAGENTA    | FG_BLINK)  /*bold+underl+blink+invers*/
};

/* monochrome displays (VGA version, no intensity) */

u_char sgr_tab_mono[16] = {
/*00*/  (BG_BLACK     | FG_LIGHTGREY),            /* normal               */
/*01*/  (BG_BLACK     | FG_UNDERLINE),            /* bold                 */
/*02*/  (BG_BLACK     | FG_UNDERLINE),            /* underline            */
/*03*/  (BG_BLACK     | FG_UNDERLINE),            /* bold+underline       */
/*04*/  (BG_BLACK     | FG_LIGHTGREY | FG_BLINK), /* blink                */
/*05*/  (BG_BLACK     | FG_UNDERLINE | FG_BLINK), /* bold+blink           */
/*06*/  (BG_BLACK     | FG_UNDERLINE | FG_BLINK), /* underline+blink      */
/*07*/  (BG_BLACK     | FG_UNDERLINE | FG_BLINK), /* bold+underline+blink */
/*08*/  (BG_LIGHTGREY | FG_BLACK),                /* invers               */
/*09*/  (BG_LIGHTGREY | FG_BLACK),                /* bold+invers          */
/*10*/  (BG_LIGHTGREY | FG_BLACK),                /* underline+invers     */
/*11*/  (BG_LIGHTGREY | FG_BLACK),                /* bold+underline+invers*/
/*12*/  (BG_LIGHTGREY | FG_BLACK | FG_BLINK),     /* blink+invers         */
/*13*/  (BG_LIGHTGREY | FG_BLACK | FG_BLINK),     /* bold+blink+invers    */
/*14*/  (BG_LIGHTGREY | FG_BLACK | FG_BLINK),     /* underline+blink+invers*/
/*15*/  (BG_LIGHTGREY | FG_BLACK | FG_BLINK)      /*bold+underl+blink+invers*/
};

/* monochrome displays (MDA version, with intensity) */

u_char sgr_tab_imono[16] = {
/*00*/  (BG_BLACK     | FG_LIGHTGREY),                /* normal               */
/*01*/  (BG_BLACK     | FG_LIGHTGREY | FG_INTENSE),   /* bold                 */
/*02*/  (BG_BLACK     | FG_UNDERLINE),                /* underline            */
/*03*/  (BG_BLACK     | FG_UNDERLINE | FG_INTENSE),   /* bold+underline       */
/*04*/  (BG_BLACK     | FG_LIGHTGREY | FG_BLINK),     /* blink                */
/*05*/  (BG_BLACK     | FG_LIGHTGREY | FG_INTENSE | FG_BLINK), /* bold+blink  */
/*06*/  (BG_BLACK     | FG_UNDERLINE | FG_BLINK),     /* underline+blink      */
/*07*/  (BG_BLACK     | FG_UNDERLINE | FG_BLINK | FG_INTENSE), /* bold+underline+blink */
/*08*/  (BG_LIGHTGREY | FG_BLACK),                    /* invers               */
/*09*/  (BG_LIGHTGREY | FG_BLACK | FG_INTENSE),       /* bold+invers          */
/*10*/  (BG_LIGHTGREY | FG_BLACK),                    /* underline+invers     */
/*11*/  (BG_LIGHTGREY | FG_BLACK | FG_INTENSE),       /* bold+underline+invers*/
/*12*/  (BG_LIGHTGREY | FG_BLACK | FG_BLINK),         /* blink+invers         */
/*13*/  (BG_LIGHTGREY | FG_BLACK | FG_BLINK | FG_INTENSE),/* bold+blink+invers*/
/*14*/  (BG_LIGHTGREY | FG_BLACK | FG_BLINK),         /* underline+blink+invers*/
/*15*/  (BG_LIGHTGREY | FG_BLACK | FG_BLINK | FG_INTENSE) /* bold+underl+blink+invers */
};

#else /* WAS_EXTERN */

extern u_char		vga_type;
extern struct tty	*pcconsp;
extern video_state	*vsp;

#if PCVT_EMU_MOUSE
extern struct mousestat mouse;
extern struct mousedefs mousedef;
#endif /* PCVT_EMU_MOUSE */

#if PCVT_USL_VT_COMPAT
extern int		vt_switch_pending;
#endif /* PCVT_USL_VT_COMPAT */

extern u_int		addr_6845;
extern u_short		*Crtat;
extern u_char		do_initialization;
extern u_char		pcvt_is_console;
extern u_char		bgansitopc[];
extern u_char		fgansitopc[];
extern u_char 		shift_down;
extern u_char		ctrl_down;
extern u_char		meta_down;
extern u_char		altgr_down;
extern u_char		kbrepflag;
extern u_char		adaptor_type;
extern u_char		current_video_screen;
extern u_char		totalfonts;
extern u_char		totalscreens;
extern u_char		chargen_access;
extern u_char		keyboard_type;
extern u_char		can_do_132col;
extern u_char		vga_family;
extern u_char		keyboard_is_initialized;
extern u_char		kbd_polling;
#ifdef _I386_ISA_KBDIO_H_
extern u_char		reset_keyboard;
extern KBDC		kbdc;
#endif /* _I386_ISA_KBDIO_H_ */

#if PCVT_SHOWKEYS
extern u_char		keyboard_show;
#endif /* PCVT_SHOWKEYS */

extern	u_char	cursor_pos_valid;

extern	u_char	critical_scroll;
extern	int	switch_page;

#if PCVT_SCREENSAVER
extern	u_char	reset_screen_saver;
extern	u_char	scrnsv_active;
#endif /* PCVT_SCREENSAVER */

extern u_char		sgr_tab_color[];
extern u_char		sgr_tab_mono[];
extern u_char		sgr_tab_imono[];

#ifdef XSERVER
extern unsigned		scrnsv_timeout;
extern u_char		pcvt_xmode;
extern u_char		pcvt_kbd_raw;
#endif /* XSERVER */

#if PCVT_BACKUP_FONTS
extern u_char		*saved_charsets[NVGAFONTS];
#endif /* PCVT_BACKUP_FONTS */

#endif	/* WAS_EXTERN */

/*
 * FreeBSD > 1.0.2 cleaned up the kernel definitions (with the aim of
 * getting ANSI-clean). Since there has been a mixed usage of types like
 * "dev_t" (actually some short) in prototyped and non-prototyped fasion,
 * each of those types is declared as "int" within function prototypes
 * (which is what the compiler would actually promote it to).
 *
 * The macros below are used to clarify which type a parameter ought to
 * be, regardless of its actual promotion to "int".
 */

#define Dev_t	int
#define U_short	int
#define U_char	int

/*
 * In FreeBSD >= 2.0, dev_t has type `unsigned long', so promoting it
 * doesn't cause any problems in prototypes.
 */

#if PCVT_FREEBSD >= 200
#undef Dev_t
#define Dev_t	dev_t
#endif

#if !PCVT_FREEBSD || (PCVT_FREEBSD < 210)
extern void bcopyb(void *from, void *to, u_int length);
#endif

#if !PCVT_FREEBSD || (PCVT_FREEBSD < 200)
extern void fillw(U_short value, void *addr, u_int length);
#endif

int	pcparam ( struct tty *tp, struct termios *t );

/*
 * In FreeBSD > 2.0.6, driver console functions are declared in machine/cons.h
 * and some return void, so don't declare them here.
 */
#if PCVT_FREEBSD <= 205
int	pccnprobe ( struct consdev *cp );
int	pccninit ( struct consdev *cp );
int	pccngetc ( Dev_t dev );
int	pccncheckc ( Dev_t dev );
int	pccnputc ( Dev_t dev, U_char c );
#endif

ointhand2_t	pcrint;
void	pcstart ( struct tty *tp );
void	pcstop ( struct tty *tp, int flag );

# if PCVT_FREEBSD < 200
void	consinit ( void );
# endif

#if PCVT_USL_VT_COMPAT
void	switch_screen ( int n, int oldgrafx, int newgrafx );
int	usl_vt_ioctl (Dev_t dev, int cmd, caddr_t data, int flag,
		      struct proc *);
int	vt_activate ( int newscreen );
int	vgapage ( int n );
void	get_usl_keymap( keymap_t *map );
void	reset_usl_modes (struct video_state *vsx);
#else
void	vgapage ( int n );
#endif /* PCVT_USL_VT_COMPAT */

#if PCVT_EMU_MOUSE
int	mouse_ioctl ( Dev_t dev, int cmd, caddr_t data );
#endif /*  PCVT_EMU_MOUSE */

#if PCVT_SCREENSAVER
void 	pcvt_scrnsv_reset ( void );
#endif /* PCVT_SCREENSAVER */

#if PCVT_SCREENSAVER && defined(XSERVER)
void 	pcvt_set_scrnsv_tmo ( int );
#endif /* PCVT_SCREENSAVER && defined(XSERVER) */

void	vga_move_charset ( unsigned n, unsigned char *b, int save_it);

void	async_update ( void *arg );
void	clr_parms ( struct video_state *svsp );
void	cons_highlight ( void );
void	cons_normal ( void );
void	dprintf ( unsigned flgs, const char *fmt, ... );
int	egavga_test ( void );
void	fkl_off ( struct video_state *svsp );
void	fkl_on ( struct video_state *svsp );
struct tty *get_pccons ( Dev_t dev );
void	init_sfkl ( struct video_state *svsp );
void	init_ufkl ( struct video_state *svsp );
#ifndef _I386_ISA_KBDIO_H_
int	kbd_cmd ( int val );
int	kbd_response ( void );
#endif /* _I386_ISA_KBDIO_H_ */
void	kbd_code_init ( void );
void	kbd_code_init1 ( void );

#if PCVT_SCANSET > 1
void	kbd_emulate_pc(int do_emulation);
#endif

int	kbdioctl ( Dev_t dev, int cmd, caddr_t data, int flag );
void	loadchar ( int fontset, int character, int char_scanlines,
		   u_char *char_table );
void	mda2egaorvga ( void );
void	roll_up ( struct video_state *svsp, int n );
void	select_vga_charset ( int vga_charset );
void	set_2ndcharset ( void );
void	set_charset ( struct video_state *svsp, int curvgacs );
void	set_emulation_mode ( struct video_state *svsp, int mode );
void	set_screen_size ( struct video_state *svsp, int size );
u_char *sgetc ( int noblock );
void	sixel_vga ( struct sixels *charsixel, u_char *charvga );
void	sput ( u_char *s, U_char attrib, int len, int page );
void	sw_cursor ( int onoff );
void	sw_sfkl ( struct video_state *svsp );
void	sw_ufkl ( struct video_state *svsp );
void	swritefkl ( int num, u_char *string, struct video_state *svsp );
void	toggl_awm ( struct video_state *svsp );
void	toggl_bell ( struct video_state *svsp );
void	toggl_columns ( struct video_state *svsp );
void	toggl_dspf ( struct video_state *svsp );
void	toggl_sevenbit ( struct video_state *svsp );
void 	update_hp ( struct video_state *svsp );
void	update_led ( void );
void	vga10_vga10 ( u_char *invga, u_char *outvga );
void	vga10_vga14 ( u_char *invga, u_char *outvga );
void	vga10_vga16 ( u_char *invga, u_char *outvga );
void	vga10_vga8 ( u_char *invga, u_char *outvga );
u_char	vga_chipset ( void );
int	vga_col ( struct video_state *svsp, int cols );
void	vga_screen_off ( void );
void	vga_screen_on ( void );
char   *vga_string ( int number );
int	vga_test ( void );
int	vgaioctl ( Dev_t dev, int cmd, caddr_t data, int flag );
void	vgapaletteio ( unsigned idx, struct rgb *val, int writeit );
void	vt_aln ( struct video_state *svsp );
void	vt_clearudk ( struct video_state *svsp );
void	vt_clreol ( struct video_state *svsp );
void	vt_clreos ( struct video_state *svsp );
void	vt_clrtab ( struct video_state *svsp );
int	vt_col ( struct video_state *svsp, int cols );
void	vt_coldmalloc ( void );
void	vt_cub ( struct video_state *svsp );
void	vt_cud ( struct video_state *svsp );
void	vt_cuf ( struct video_state *svsp );
void	vt_curadr ( struct video_state *svsp );
void	vt_cuu ( struct video_state *svsp );
void	vt_da ( struct video_state *svsp );
void	vt_dch ( struct video_state *svsp );
void	vt_dcsentry ( U_char ch, struct video_state *svsp );
void	vt_designate ( struct video_state *svsp);
void	vt_dl ( struct video_state *svsp );
void	vt_dld ( struct video_state *svsp );
void	vt_dsr ( struct video_state *svsp );
void	vt_ech ( struct video_state *svsp );
void	vt_ic ( struct video_state *svsp );
void	vt_il ( struct video_state *svsp );
void	vt_ind ( struct video_state *svsp );
void	vt_initsel ( struct video_state *svsp );
void	vt_keyappl ( struct video_state *svsp );
void	vt_keynum ( struct video_state *svsp );
void	vt_mc ( struct video_state *svsp );
void	vt_nel ( struct video_state *svsp );
void	vt_rc ( struct video_state *svsp );
void	vt_reqtparm ( struct video_state *svsp );
void	vt_reset_ansi ( struct video_state *svsp );
void	vt_reset_dec_priv_qm ( struct video_state *svsp );
void	vt_ri ( struct video_state *svsp );
void	vt_ris ( struct video_state *svsp );
void	vt_sc ( struct video_state *svsp );
void	vt_sca ( struct video_state *svsp );
void	vt_sd ( struct video_state *svsp );
void	vt_sed ( struct video_state *svsp );
void	vt_sel ( struct video_state *svsp );
void	vt_set_ansi ( struct video_state *svsp );
void	vt_set_dec_priv_qm ( struct video_state *svsp );
void	vt_sgr ( struct video_state *svsp );
void	vt_stbm ( struct video_state *svsp );
void	vt_str ( struct video_state *svsp );
void	vt_su ( struct video_state *svsp );
void	vt_tst ( struct video_state *svsp );
void	vt_udk ( struct video_state *svsp );
void	toggl_24l ( struct video_state *svsp );

#ifdef PCVT_INCLUDE_VT_SELATTR

#define INT_BITS	(sizeof(unsigned int) * 8)
#define INT_INDEX(n)	((n) / INT_BITS)
#define BIT_INDEX(n)	((n) % INT_BITS)

/*---------------------------------------------------------------------------*
 *	set selective attribute if appropriate
 *---------------------------------------------------------------------------*/
static __inline void vt_selattr(struct video_state *svsp)
{
	int i;

	i = (svsp->Crtat + svsp->cur_offset) - svsp->Crtat;

	if(svsp->selchar)
		svsp->decsca[INT_INDEX(i)] |=  (1 << BIT_INDEX(i));
	else
		svsp->decsca[INT_INDEX(i)] &= ~(1 << BIT_INDEX(i));
}

#endif /* PCVT_INCLUDE_VT_SELATTR */


/*---------------------------------------------------------------------------*
 *	produce 7 us delay accessing the keyboard controller
 *---------------------------------------------------------------------------*/

#if PCVT_PORTIO_DELAY
				/* use multiple dummy accesses to port    */
				/* 0x84 to produce keyboard controller    */
				/* access delays                          */
#define PCVT_KBD_DELAY()          \
	{ (void)inb(0x84); } \
	{ (void)inb(0x84); } \
	{ (void)inb(0x84); } \
	{ (void)inb(0x84); } \
	{ (void)inb(0x84); } \
	{ (void)inb(0x84); }

#else /* PCVT_PORTIO_DELAY */
				/* use system supplied delay function for */
				/* producing delays for accesssing the    */
				/* keyboard controller                    */
#if PCVT_NETBSD > 9
#define PCVT_KBD_DELAY()	delay(7)
#elif PCVT_FREEBSD || (PCVT_NETBSD <= 9)
#define PCVT_KBD_DELAY()	DELAY(7)
#endif
#endif /* PCVT_PORTIO_DELAY */

/*---------------------------------- E O F ----------------------------------*/
