2 * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch.
4 * Copyright (c) 1992, 1993 Brian Dunford-Shore.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by
19 * Hellmuth Michaelis, Brian Dunford-Shore and Joerg Wunsch.
20 * 4. The name authors may not be used to endorse or promote products
21 * derived from this software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 * @(#)pcvt_hdr.h, 3.20, Last Edit-Date: [Fri Apr 7 10:16:58 1995]
39 /*---------------------------------------------------------------------------
41 * pcvt_hdr.h VT220 Driver Global Include File
42 * ------------------------------------------------
43 * -hm ------------ Release 3.00 --------------
44 * -hm integrating NetBSD-current patches
45 * -hm integrating patches from Thomas Gellekum
46 * -hm moving vt_selattr() inline into this file
47 * -hm Michael's keyboard fifo diffs
48 * -hm documenting some #ifdef's ...
49 * -hm Joerg's patches for FreeBSD's ttymalloc
50 * -jw introduced kbd_emulate_pc() if scanset > 1
51 * -hm moved user configurable items to pcvt_conf.h
52 * -hm applying Joerg's patches for FreeBSD 2.0
53 * -hm patch from Onno & Martin for NetBSD-current (post 1.0)
54 * -hm some adjustments for NetBSD 1.0
55 * -hm patch from Joerg fixing FreeBSD 2.0 support
56 * -hm patch from Onno/John for NetBSD-current
57 * -hm applying patch from Joerg fixing Crtat bug
58 * -hm removed PCVT_FAKE_SYSCONS10
59 * -hm added pcstop (patch from Onno)
60 * -hm multiple X server bugfixes from Lon Willett
61 * -hm patch from Joerg for FreeBSD pre-2.1
62 * -jw adding more support for FreeBSD pre-2.1
64 *---------------------------------------------------------------------------*/
66 #define PCVT_REL "3.20-b24" /* driver attach announcement */
67 /* see also: pcvt_ioctl.h */
70 #if defined(__FreeBSD__) && !defined(PCVT_FREEBSD)
71 # define PCVT_FREEBSD 210
74 #if PCVT_FREEBSD >= 200
76 #include <sys/param.h>
77 #include <sys/systm.h>
80 #include <sys/signalvar.h>
83 #include <sys/callout.h>
84 #include <sys/kernel.h>
85 #include <sys/syslog.h>
86 #include <sys/malloc.h>
88 #if PCVT_FREEBSD > 210
89 #include <machine/random.h>
90 #endif /* PCVT_FREEBSD > 210 */
91 #else /* ! PCVT_FREEBSD >= 200 */
97 #include "signalvar.h"
107 #endif /* PCVT_FREEBSD >= 200 */
109 #include <i386/isa/pcvt/pcvt_conf.h>
111 #include <dev/kbd/kbdreg.h>
112 #include <dev/kbd/atkbdcreg.h>
119 #include "i386/isa/isavar.h"
120 #include "i386/cpufunc.h"
121 #elif PCVT_FREEBSD >= 200
122 #include <i386/isa/isa_device.h>
124 #include "i386/isa/isa_device.h"
127 #if PCVT_FREEBSD >= 200
128 #include <i386/isa/icu.h>
130 #include "i386/isa/icu.h"
133 #if PCVT_NETBSD > 100
134 #include "i386/isa/isareg.h"
135 #elif PCVT_FREEBSD >= 200
136 #include <i386/isa/isa.h>
138 #include "i386/isa/isa.h"
142 #include "dev/cons.h"
143 #elif PCVT_FREEBSD >= 200
144 #include <sys/cons.h>
146 #include "i386/i386/cons.h"
150 #if PCVT_FREEBSD >= 200
151 #include <machine/psl.h>
152 #include <machine/frame.h>
153 #else /* ! PCVT_FREEBSD >= 200 */
154 #include "machine/psl.h"
155 #include "machine/frame.h"
156 #endif /* PCVT_FREEBSD >= 200 */
157 #endif /* PCVT_NETBSD <= 9 */
160 #include <i386/isa/pcvt/pcvt_ioctl.h>
161 #elif PCVT_FREEBSD >= 200
162 #include <machine/pcvt_ioctl.h>
164 #include "machine/pcvt_ioctl.h"
167 #if PCVT_FREEBSD >= 200
168 #include <machine/pc/display.h>
169 #if PCVT_FREEBSD > 200
170 #include <machine/clock.h>
171 #include <machine/md_var.h>
174 * The following values are defined in machine/console.h, but the header
175 * file is not included here due to conflicts with pcvt_ioctl.h.
177 #define KDGKBTYPE _IOR('K', 64, int)
181 #else /* PCVT_FREEBSD >= 200 */
182 #include "machine/pc/display.h"
183 #endif /* PCVT_FREEBSD >= 200 */
185 /* setup irq disable function to use */
187 #if !(PCVT_SLOW_INTERRUPT) && (PCVT_NETBSD > 9)
188 # define PCVT_DISABLE_INTR() disable_intr()
189 # define PCVT_ENABLE_INTR() enable_intr()
190 # undef PCVT_SLOW_INTERRUPT
192 # define PCVT_DISABLE_INTR() s = spltty()
193 # define PCVT_ENABLE_INTR() splx(s)
194 # undef PCVT_SLOW_INTERRUPT
195 # define PCVT_SLOW_INTERRUPT 1
198 /* perform option consistency checks */
200 #if defined PCVT_FREEBSD && PCVT_FREEBSD == 1
202 # define PCVT_FREEBSD 102 /* assume 1.0 release */
205 #if defined PCVT_NETBSD && PCVT_NETBSD == 1
207 #define PCVT_NETBSD 9 /* assume 0.9 release for now */
210 #if PCVT_FREEBSD + PCVT_NETBSD == 0
211 # error "pcvt_hdr.h: You MUST define one of PCVT_{NET,FREE}BSD \
213 #elif (PCVT_FREEBSD && PCVT_NETBSD)
214 # error "pcvt_hdr.h: You CAN only define *one* of PCVT_{NET,FREE}BSD \
220 /* PCVT_NULLCHARS is mandatory for X server */
222 #undef PCVT_NULLCHARS
223 #define PCVT_NULLCHARS 1
226 /* PCVT_BACKUP_FONTS is mandatory for PCVT_USL_VT_COMPAT */
227 #if PCVT_USL_VT_COMPAT && !PCVT_BACKUP_FONTS
228 #undef PCVT_BACKUP_FONTS
229 #define PCVT_BACKUP_FONTS 1
234 #if PCVT_USL_VT_COMPAT
235 #warning "Option PCVT_USL_VT_COMPAT meaningless without XSERVER"
236 #undef PCVT_USL_VT_COMPAT
237 #define PCVT_USL_VT_COMPAT 0
242 /* PCVT_SCREENSAVER is mandatory for PCVT_PRETTYSCRNS */
243 #if PCVT_PRETTYSCRNS && !PCVT_SCREENSAVER
244 #undef PCVT_SCREENSAVER
245 #define PCVT_SCREENSAVER 1
248 /* get the inline inb/outb back again ... */
252 #include "machine/cpufunc.h" /* NetBSD 0.9 [...and earlier -currents] */
253 #undef PCVT_USL_VT_COMPAT
254 #define PCVT_USL_VT_COMPAT 0 /* does not work, workaround ... */
256 #include "machine/pio.h" /* recent NetBSD -currents */
257 #define NEW_AVERUNNABLE /* averunnable changes for younger currents */
258 #endif /* PCVT_NETBSD == 9 */
259 #endif /* PCVT_NETBSD */
261 #if PCVT_FREEBSD >= 200
262 #define NEW_AVERUNNABLE /* new averunnable changes for FreeBSD 2.0 */
265 #if PCVT_SCANSET !=1 && PCVT_SCANSET !=2
266 #error "Supported keyboard scancode sets are 1 and 2 only (for now)!!!"
269 /*---------------------------------------------------------------------------*
270 * Keyboard and Keyboard Controller
271 *---------------------------------------------------------------------------*/
273 #ifndef _DEV_KBD_KBDREG_H_
275 #define CONTROLLER_CTRL 0x64 /* W - command, R - status */
276 #define CONTROLLER_DATA 0x60 /* R/W - data */
278 /* commands to control the CONTROLLER (8042) on the mainboard */
280 #define CONTR_READ 0x20 /* read command byte from controller */
281 #define CONTR_WRITE 0x60 /* write command to controller, see below */
282 #define CONTR_SELFTEST 0xaa /* controller selftest, returns 0x55 when ok */
283 #define CONTR_IFTEST 0xab /* interface selftest */
284 #define CONTR_KBDISABL 0xad /* disable keyboard */
285 #define CONTR_KBENABL 0xae /* enable keyboard */
287 /* command byte for writing to CONTROLLER (8042) via CONTR_WRITE */
289 #define COMMAND_RES7 0x80 /* bit 7, reserved, always write a ZERO ! */
290 #define COMMAND_PCSCAN 0x40 /* bit 6, 1 = convert to pc scan codes */
291 #define COMMAND_RES5 0x20 /* bit 5, perhaps (!) use 9bit frame
293 #define COMMAND_DISABL 0x10 /* bit 4, 1 = disable keyboard */
294 #define COMMAND_INHOVR 0x08 /* bit 3, 1 = override security lock inhibit */
295 #define COMMAND_SYSFLG 0x04 /* bit 2, value stored as "system flag" */
296 #define COMMAND_RES2 0x02 /* bit 1, reserved, always write a ZERO ! */
297 #define COMMAND_IRQEN 0x01 /* bit 0, 1 = enable output buffer full
300 /* status from CONTROLLER (8042) on the mainboard */
302 #define STATUS_PARITY 0x80 /* bit 7, 1 = parity error on last byte */
303 #define STATUS_RXTIMO 0x40 /* bit 6, 1 = receive timeout error occured */
304 #define STATUS_TXTIMO 0x20 /* bit 5, 1 = transmit timeout error occured */
305 #define STATUS_ENABLE 0x10 /* bit 4, 1 = keyboard unlocked */
306 #define STATUS_WHAT 0x08 /* bit 3, 1 = wrote cmd to 0x64, 0 = wrote
308 #define STATUS_SYSFLG 0x04 /* bit 2, value stored as "system flag" */
309 #define STATUS_INPBF 0x02 /* bit 1, 1 = input buffer full (to 8042) */
310 #define STATUS_OUTPBF 0x01 /* bit 0, 1 = output buffer full (from 8042) */
312 /* commands to the KEYBOARD (via the 8042 controller on mainboard..) */
314 #define KEYB_C_RESET 0xff /* reset keyboard to power-on status */
315 #define KEYB_C_RESEND 0xfe /* resend last byte in case of error */
316 #define KEYB_C_TYPEM 0xf3 /* set keyboard typematic rate/delay */
317 #define KEYB_C_ID 0xf2 /* return keyboard id */
318 #define KEYB_C_ECHO 0xee /* diagnostic, echo 0xee */
319 #define KEYB_C_LEDS 0xed /* set/reset numlock,capslock & scroll lock */
321 #endif /* _DEV_KBD_KBDREG_H_ */
323 /* responses from the KEYBOARD (via the 8042 controller on mainboard..) */
325 #define KEYB_R_OVERRUN0 0x00 /* keyboard buffer overflow */
326 #define KEYB_R_SELFOK 0xaa /* keyboard selftest ok after KEYB_C_RESET */
327 #define KEYB_R_EXT0 0xe0 /* keyboard extended scancode prefix 1 */
328 #define KEYB_R_EXT1 0xe1 /* keyboard extended scancode prefix 2 */
329 #define KEYB_R_ECHO 0xee /* keyboard response to KEYB_C_ECHO */
330 #define KEYB_R_BREAKPFX 0xf0 /* break code prefix for set 2 and 3 */
331 #define KEYB_R_ACK 0xfa /* acknowledge after a command has rx'd */
332 #define KEYB_R_SELFBAD 0xfc /*keyboard selftest FAILED after KEYB_C_RESET*/
333 #define KEYB_R_DIAGBAD 0xfd /* keyboard self diagnostic failure */
334 #define KEYB_R_RESEND 0xfe /* keyboard wants command resent or illegal
336 #define KEYB_R_OVERRUN1 0xff /* keyboard buffer overflow */
338 #define KEYB_R_MF2ID1 0xab /* MF II Keyboard id-byte #1 */
339 #define KEYB_R_MF2ID2 0x41 /* MF II Keyboard id-byte #2 */
340 #define KEYB_R_MF2ID2HP 0x83 /* MF II Keyboard id-byte #2 from HP keybd's */
342 /* internal Keyboard Type */
344 #define KB_UNKNOWN 0 /* unknown keyboard type */
345 #define KB_AT 1 /* AT (84 keys) Keyboard */
346 #define KB_MFII 2 /* MF II (101/102 keys) Keyboard */
348 /*---------------------------------------------------------------------------*
349 * CMOS ram access to get the "Equipment Byte"
350 *---------------------------------------------------------------------------*/
352 #define RTC_EQUIPMENT 0x14 /* equipment byte in cmos ram */
353 #define EQ_EGAVGA 0 /* reserved (= ega/vga) */
354 #define EQ_40COLOR 1 /* display = 40 col color */
355 #define EQ_80COLOR 2 /* display = 80 col color */
356 #define EQ_80MONO 3 /* display = 80 col mono */
358 /*---------------------------------------------------------------------------*
359 * VT220 -> internal color conversion table fields
360 *---------------------------------------------------------------------------*/
362 #define VT_NORMAL 0x00 /* no attributes at all */
363 #define VT_BOLD 0x01 /* bold attribute */
364 #define VT_UNDER 0x02 /* underline attribute */
365 #define VT_BLINK 0x04 /* blink attribute */
366 #define VT_INVERSE 0x08 /* inverse attribute */
368 /*---------------------------------------------------------------------------*
369 * VGA GENERAL/EXTERNAL Registers (3BA or 3DA and 3CA, 3C2, 3CC)
370 *---------------------------------------------------------------------------*/
372 #define GN_MISCOUTR 0x3CC /* misc output register read */
373 #define GN_MISCOUTW 0x3C2 /* misc output register write */
374 #define GN_INPSTAT0 0x3C2 /* input status 0, r/o */
375 #define GN_INPSTAT1M 0x3BA /* input status 1, r/o, mono */
376 #define GN_INPSTAT1C 0x3DA /* input status 1, r/o, color */
377 #define GN_FEATR 0x3CA /* feature control, read */
378 #define GN_FEATWM 0x3BA /* feature control, write, mono */
379 #define GN_FEATWC 0x3DA /* feature control, write, color */
380 #define GN_VSUBSYS 0x3C3 /* video subsystem register r/w */
381 #define GN_DMCNTLM 0x3B8 /* display mode control, r/w, mono */
382 #define GN_DMCNTLC 0x3D8 /* display mode control, r/w, color */
383 #define GN_COLORSEL 0x3D9 /* color select register, w/o */
384 #define GN_HERCOMPAT 0x3BF /* Hercules compatibility reg, w/o */
386 /*---------------------------------------------------------------------------*
387 * VGA CRTC Registers (3B4 and 3B5 or 3D4 and 3D5)
388 *---------------------------------------------------------------------------*/
390 #define MONO_BASE 0x3B4 /* crtc index register address mono */
391 #define CGA_BASE 0x3D4 /* crtc index register address color */
393 #define CRTC_ADDR 0x00 /* index register */
395 #define CRTC_HTOTAL 0x00 /* horizontal total */
396 #define CRTC_HDISPLE 0x01 /* horizontal display end */
397 #define CRTC_HBLANKS 0x02 /* horizontal blank start */
398 #define CRTC_HBLANKE 0x03 /* horizontal blank end */
399 #define CRTC_HSYNCS 0x04 /* horizontal sync start */
400 #define CRTC_HSYNCE 0x05 /* horizontal sync end */
401 #define CRTC_VTOTAL 0x06 /* vertical total */
402 #define CRTC_OVERFLL 0x07 /* overflow low */
403 #define CRTC_IROWADDR 0x08 /* inital row address */
404 #define CRTC_MAXROW 0x09 /* maximum row address */
405 #define CRTC_CURSTART 0x0A /* cursor start row address */
406 #define CURSOR_ON_BIT 0x20 /* cursor on/off on mda/cga/vga */
407 #define CRTC_CUREND 0x0B /* cursor end row address */
408 #define CRTC_STARTADRH 0x0C /* linear start address mid */
409 #define CRTC_STARTADRL 0x0D /* linear start address low */
410 #define CRTC_CURSORH 0x0E /* cursor address mid */
411 #define CRTC_CURSORL 0x0F /* cursor address low */
412 #define CRTC_VSYNCS 0x10 /* vertical sync start */
413 #define CRTC_VSYNCE 0x11 /* vertical sync end */
414 #define CRTC_VDE 0x12 /* vertical display end */
415 #define CRTC_OFFSET 0x13 /* row offset */
416 #define CRTC_ULOC 0x14 /* underline row address */
417 #define CRTC_VBSTART 0x15 /* vertical blank start */
418 #define CRTC_VBEND 0x16 /* vertical blank end */
419 #define CRTC_MODE 0x17 /* CRTC mode register */
420 #define CRTC_SPLITL 0x18 /* split screen start low */
422 /* start of ET4000 extensions */
424 #define CRTC_RASCAS 0x32 /* ras/cas configuration */
425 #define CRTC_EXTSTART 0x33 /* extended start address */
426 #define CRTC_COMPAT6845 0x34 /* 6845 comatibility control */
427 #define CRTC_OVFLHIGH 0x35 /* overflow high */
428 #define CRTC_SYSCONF1 0x36 /* video system configuration 1 */
429 #define CRTC_SYSCONF2 0x36 /* video system configuration 2 */
431 /* start of WD/Paradise extensions */
433 #define CRTC_PR10 0x29 /* r/w unlocking */
434 #define CRTC_PR11 0x2A /* ega switches */
435 #define CRTC_PR12 0x2B /* scratch pad */
436 #define CRTC_PR13 0x2C /* interlace h/2 start */
437 #define CRTC_PR14 0x2D /* interlace h/2 end */
438 #define CRTC_PR15 0x2E /* misc control #1 */
439 #define CRTC_PR16 0x2F /* misc control #2 */
440 #define CRTC_PR17 0x30 /* misc control #3 */
441 /* 0x31 .. 0x3f reserved */
444 #define CRTC_V7ID 0x1f /* identification register */
448 #define CRTC_MTEST 0x1e /* module test register */
449 #define CRTC_SOFTPROG 0x1f /* software programming */
450 #define CRTC_LATCHRDB 0x22 /* latch read back register */
451 #define CRTC_ATTRSRDB 0x24 /* attribute state read back register*/
452 #define CRTC_ATTRIRDB 0x26 /* attribute index read back register*/
453 #define CRTC_HOSTAR 0x27 /* high order start address register */
455 /*---------------------------------------------------------------------------*
456 * VGA TIMING & SEQUENCER Registers (3C4 and 3C5)
457 *---------------------------------------------------------------------------*/
459 #define TS_INDEX 0x3C4 /* index register */
460 #define TS_DATA 0x3C5 /* data register */
462 #define TS_SYNCRESET 0x00 /* synchronous reset */
463 #define TS_MODE 0x01 /* ts mode register */
464 #define TS_WRPLMASK 0x02 /* write plane mask */
465 #define TS_FONTSEL 0x03 /* font select register */
466 #define TS_MEMMODE 0x04 /* memory mode register */
470 #define TS_RESERVED 0x05 /* undef, reserved */
471 #define TS_STATECNTL 0x06 /* state control register */
472 #define TS_AUXMODE 0x07 /* auxiliary mode control */
474 /* WD/Paradise only */
476 #define TS_UNLOCKSEQ 0x06 /* PR20 - unlock sequencer register */
477 #define TS_DISCFSTAT 0x07 /* PR21 - display config status */
478 #define TS_MEMFIFOCTL 0x10 /* PR30 - memory i/f & fifo control */
479 #define TS_SYSIFCNTL 0x11 /* PR31 - system interface control */
480 #define TS_MISC4 0x12 /* PR32 - misc control #4 */
484 #define TS_EXTCNTL 0x06 /* extensions control */
485 #define TS_CLRVDISP 0x30 /* clear vertical display 0x30-0x3f */
486 #define TS_V7CHIPREV 0x8e /* chipset revision 0x8e-0x8f */
487 #define TS_SWBANK 0xe8 /* single/write bank register, rev 5+*/
488 #define TS_RDBANK 0xe8 /* read bank register, rev 4+ */
489 #define TS_MISCCNTL 0xe8 /* misc control register, rev 4+ */
490 #define TS_SWSTROBE 0xea /* switch strobe */
491 #define TS_MWRCNTL 0xf3 /* masked write control */
492 #define TS_MWRMVRAM 0xf4 /* masked write mask VRAM only */
493 #define TS_BANKSEL 0xf6 /* bank select */
494 #define TS_SWREADB 0xf7 /* switch readback */
495 #define TS_PAGESEL 0xf9 /* page select */
496 #define TS_COMPAT 0xfc /* compatibility control */
497 #define TS_16BITCTL 0xff /* 16 bit interface control */
501 #define TS_HWVERS 0x0b /* hardware version, switch old/new! */
502 #define TS_CONFPORT1 0x0c /* config port 1 and 2 - caution! */
503 #define TS_MODEC2 0x0d /* old/new mode control 2 - caution! */
504 #define TS_MODEC1 0x0e /* old/new mode control 1 - caution! */
505 #define TS_PUPM2 0x0f /* power up mode 2 */
507 /*---------------------------------------------------------------------------*
508 * VGA GRAPHICS DATA CONTROLLER Registers (3CE, 3CF and 3CD)
509 *---------------------------------------------------------------------------*/
511 #define GDC_SEGSEL 0x3CD /* segment select register */
512 #define GDC_INDEX 0x3CE /* index register */
513 #define GDC_DATA 0x3CF /* data register */
515 #define GDC_SETRES 0x00 /* set / reset bits */
516 #define GDC_ENSETRES 0x01 /* enable set / reset */
517 #define GDC_COLORCOMP 0x02 /* color compare register */
518 #define GDC_ROTFUNC 0x03 /* data rotate / function select */
519 #define GDC_RDPLANESEL 0x04 /* read plane select */
520 #define GDC_MODE 0x05 /* gdc mode register */
521 #define GDC_MISC 0x06 /* gdc misc register */
522 #define GDC_COLORCARE 0x07 /* color care register */
523 #define GDC_BITMASK 0x08 /* bit mask register */
525 /* WD/Paradise only */
527 #define GDC_BANKSWA 0x09 /* PR0A - bank switch a */
528 #define GDC_BANKSWB 0x0a /* PR0B - bank switch b */
529 #define GDC_MEMSIZE 0x0b /* PR1 memory size */
530 #define GDC_VIDEOSEL 0x0c /* PR2 video configuration */
531 #define GDC_CRTCNTL 0x0d /* PR3 crt address control */
532 #define GDC_VIDEOCNTL 0x0e /* PR4 video control */
533 #define GDC_PR5GPLOCK 0x0f /* PR5 gp status and lock */
537 #define GDC_DATALATCH 0x22 /* gdc data latch */
539 /*---------------------------------------------------------------------------*
540 * VGA ATTRIBUTE CONTROLLER Registers (3C0 and 3C1)
541 *---------------------------------------------------------------------------*/
543 #define ATC_INDEX 0x3C0 /* index register AND */
544 #define ATC_DATAW 0x3C0 /* data write !!! */
545 #define ATC_DATAR 0x3C1 /* data read */
547 #define ATC_ACCESS 0x20 /* access bit in ATC index register */
549 #define ATC_PALETTE0 0x00 /* color palette register 0 */
550 #define ATC_PALETTE1 0x01 /* color palette register 1 */
551 #define ATC_PALETTE2 0x02 /* color palette register 2 */
552 #define ATC_PALETTE3 0x03 /* color palette register 3 */
553 #define ATC_PALETTE4 0x04 /* color palette register 4 */
554 #define ATC_PALETTE5 0x05 /* color palette register 5 */
555 #define ATC_PALETTE6 0x06 /* color palette register 6 */
556 #define ATC_PALETTE7 0x07 /* color palette register 7 */
557 #define ATC_PALETTE8 0x08 /* color palette register 8 */
558 #define ATC_PALETTE9 0x09 /* color palette register 9 */
559 #define ATC_PALETTEA 0x0A /* color palette register 10 */
560 #define ATC_PALETTEB 0x0B /* color palette register 11 */
561 #define ATC_PALETTEC 0x0C /* color palette register 12 */
562 #define ATC_PALETTED 0x0D /* color palette register 13 */
563 #define ATC_PALETTEE 0x0E /* color palette register 14 */
564 #define ATC_PALETTEF 0x0F /* color palette register 15 */
565 #define ATC_MODE 0x10 /* atc mode register */
566 #define ATC_OVERSCAN 0x11 /* overscan register */
567 #define ATC_COLPLEN 0x12 /* color plane enable register */
568 #define ATC_HORPIXPAN 0x13 /* horizontal pixel panning */
569 #define ATC_COLRESET 0x14 /* color reset */
570 #define ATC_MISC 0x16 /* misc register (ET3000/ET4000) */
572 /*---------------------------------------------------------------------------*
573 * VGA palette handling (output DAC palette)
574 *---------------------------------------------------------------------------*/
576 #define VGA_DAC 0x3C6 /* vga dac address */
577 #define VGA_PMSK 0x3F /* palette mask, 64 distinct values */
578 #define NVGAPEL 256 /* number of palette entries */
580 /*---------------------------------------------------------------------------*
581 * function key labels
582 *---------------------------------------------------------------------------*/
584 #define LABEL_LEN 9 /* length of one label */
585 #define LABEL_MID 8 /* mid-part (row/col) */
587 #define LABEL_ROWH ((4*LABEL_LEN)+1)
588 #define LABEL_ROWL ((4*LABEL_LEN)+2)
589 #define LABEL_COLU ((4*LABEL_LEN)+4)
590 #define LABEL_COLH ((4*LABEL_LEN)+5)
591 #define LABEL_COLL ((4*LABEL_LEN)+6)
595 #define MAXTAB 132 /* no of possible tab stops */
597 /* escape detection state machine */
599 #define STATE_INIT 0 /* normal */
600 #define STATE_ESC 1 /* got ESC */
601 #define STATE_BLANK 2 /* got ESC space*/
602 #define STATE_HASH 3 /* got ESC # */
603 #define STATE_BROPN 4 /* got ESC ( */
604 #define STATE_BRCLO 5 /* got ESC ) */
605 #define STATE_CSI 6 /* got ESC [ */
606 #define STATE_CSIQM 7 /* got ESC [ ? */
607 #define STATE_AMPSND 8 /* got ESC & */
608 #define STATE_STAR 9 /* got ESC * */
609 #define STATE_PLUS 10 /* got ESC + */
610 #define STATE_DCS 11 /* got ESC P */
611 #define STATE_SCA 12 /* got ESC <Ps> " */
612 #define STATE_STR 13 /* got ESC ! */
613 #define STATE_MINUS 14 /* got ESC - */
614 #define STATE_DOT 15 /* got ESC . */
615 #define STATE_SLASH 16 /* got ESC / */
617 /* for storing escape sequence parameters */
619 #define MAXPARMS 10 /* maximum no of parms */
621 /* terminal responses */
623 #define DA_VT220 "\033[?62;1;2;6;7;8;9c"
625 /* sub-states for Device Control String processing */
627 #define DCS_INIT 0 /* got ESC P ... */
628 #define DCS_AND_UDK 1 /* got ESC P ... | */
629 #define DCS_UDK_DEF 2 /* got ESC P ... | fnckey / */
630 #define DCS_UDK_ESC 3 /* got ESC P ... | fnckey / ... ESC */
631 #define DCS_DLD_DSCS 4 /* got ESC P ... { */
632 #define DCS_DLD_DEF 5 /* got ESC P ... { dscs */
633 #define DCS_DLD_ESC 6 /* got ESC P ... { dscs ... / ... ESC */
635 /* vt220 user defined keys and vt220 downloadable charset */
637 #define MAXUDKDEF 300 /* max 256 char + 1 '\0' + space.. */
638 #define MAXUDKEYS 18 /* plus holes .. */
639 #define DSCS_LENGTH 3 /* descriptor length */
640 #define MAXSIXEL 8 /* sixels forever ! */
642 /* sub-states for HP-terminal emulator */
650 #define SHP_AND_Fak 3
651 #define SHP_AND_Fak1 4
652 #define SHP_AND_Fakd 5
653 #define SHP_AND_FakdL 6
654 #define SHP_AND_FakdLl 7
655 #define SHP_AND_FakdLls 8
660 #define SHP_AND_JL 10
662 /* esc & every-thing-else */
664 #define SHP_AND_ETE 11
666 /* additionals for function key labels */
669 #define MAX_STRING 80
670 #define MAX_STATUS 160
672 /* MAX values for screen sizes for possible video adaptors */
674 #define MAXROW_MDACGA 25 /* MDA/CGA can do 25 x 80 max */
675 #define MAXCOL_MDACGA 80
677 #define MAXROW_EGA 43 /* EGA can do 43 x 80 max */
678 #define MAXCOL_EGA 80
680 #define MAXROW_VGA 50 /* VGA can do 50 x 80 max */
681 #define MAXCOL_VGA 80
682 #define MAXCOL_SVGA 132 /* Super VGA can do 50 x 132 max */
684 /* switch 80/132 columns */
686 #define SCR_COL80 80 /* in 80 col mode */
687 #define SCR_COL132 132 /* in 132 col mode */
689 #define MAXDECSCA (((MAXCOL_SVGA * MAXROW_VGA) \
690 / (8 * sizeof(unsigned int)) ) + 1 )
692 /* screen memory start, monochrome */
695 # if PCVT_FREEBSD && (PCVT_FREEBSD > 102)
696 # define MONO_BUF (KERNBASE+0xB0000)
698 # define MONO_BUF 0xfe0B0000 /* NetBSD-current: isa.h */
702 /* screen memory start, color */
705 # if PCVT_FREEBSD && (PCVT_FREEBSD > 102)
706 # define CGA_BUF (KERNBASE+0xB8000)
708 # define CGA_BUF 0xfe0B8000 /* NetBSD-current: isa.h */
712 #define CHR 2 /* bytes per word in screen mem */
714 #define NVGAFONTS 8 /* number of vga fonts loadable */
716 #define MAXKEYNUM 127 /* max no of keys in table */
720 #define CSL 0x0000 /* ega/vga charset, lower half of 512 */
721 #define CSH 0x0800 /* ega/vga charset, upper half of 512 */
722 #define CSSIZE 96 /* (physical) size of a character set */
724 /* charset designations */
726 #define D_G0 0 /* designated as G0 */
727 #define D_G1 1 /* designated as G1 */
728 #define D_G2 2 /* designated as G2 */
729 #define D_G3 3 /* designated as G3 */
730 #define D_G1_96 4 /* designated as G1 for 96-char charsets */
731 #define D_G2_96 5 /* designated as G2 for 96-char charsets */
732 #define D_G3_96 6 /* designated as G3 for 96-char charsets */
734 /* which fkey-labels */
736 #define SYS_FKL 0 /* in hp mode, sys-fkls are active */
737 #define USR_FKL 1 /* in hp mode, user-fkls are active */
739 /* arguments to async_update() */
741 #define UPDATE_START ((void *)0) /* do cursor update and requeue */
742 #define UPDATE_STOP ((void *)1) /* suspend cursor updates */
743 #define UPDATE_KERN ((void *)2) /* do cursor updates for kernel output */
750 #define EXTERN extern
753 EXTERN u_char *more_chars; /* response buffer via kbd */
754 EXTERN u_char color; /* color or mono display */
756 EXTERN u_short kern_attr; /* kernel messages char attributes */
757 EXTERN u_short user_attr; /* character attributes */
762 EXTERN struct tty *pc_tty[PCVT_NSCREENS];
763 #elif !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200)
764 EXTERN struct tty pccons[PCVT_NSCREENS];
766 EXTERN struct tty *pccons[PCVT_NSCREENS];
767 #endif /* PCVT_NETBSD */
769 #else /* PCVT_EMU_MOUSE */
772 EXTERN struct tty *pc_tty[PCVT_NSCREENS + 1];
773 #elif !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200)
774 EXTERN struct tty pccons[PCVT_NSCREENS + 1];
776 EXTERN struct tty *pccons[PCVT_NSCREENS + 1];
779 #endif /* PCVT_EMU_MOUSE */
782 u_char lower[MAXSIXEL]; /* lower half of char */
783 u_char upper[MAXSIXEL]; /* upper half of char */
787 u_char first[MAXUDKEYS]; /* index to first char */
788 u_char length[MAXUDKEYS]; /* length of this entry */
791 /* VGA palette handling */
793 u_char r, g, b; /* red/green/blue, valid 0..VGA_PMSK */
796 typedef struct video_state {
797 u_short *Crtat; /* video page start addr */
798 u_short *Memory; /* malloc'ed memory start address */
799 struct tty *vs_tty; /* pointer to this screen's tty */
800 u_char maxcol; /* 80 or 132 cols on screen */
801 u_char row, col; /* current cursor position */
802 u_short c_attr; /* current character attributes */
803 u_char vtsgr; /* current sgr configuration */
804 u_short cur_offset; /* current cursor position offset */
805 u_char bell_on; /* flag, bell enabled */
806 u_char sevenbit; /* flag, data path 7 bits wide */
807 u_char dis_fnc; /* flag, display functions enable */
808 u_char transparent; /* flag, mk path tmp trnsprnt for ctls*/
809 u_char scrr_beg; /* scrolling region, begin */
810 u_char scrr_len; /* scrolling region, length */
811 u_char scrr_end; /* scrolling region, end */
812 u_char screen_rows; /* screen size, length - status lines */
813 u_char screen_rowsize; /* screen size, length */
814 u_char vga_charset; /* VGA character set value */
815 u_char lastchar; /* flag, vt100 behaviour of last char */
816 u_char lastrow; /* save row, --------- " ----------- */
817 u_char *report_chars; /* ptr, status reports from terminal */
818 u_char report_count; /* count, ----------- " ------------ */
819 u_char state; /* escape sequence state machine */
820 u_char m_awm; /* flag, vt100 mode, auto wrap */
821 u_char m_om; /* flag, vt100 mode, origin mode */
822 u_char sc_flag; /* flag, vt100 mode,saved parms valid */
823 u_char sc_row; /* saved row */
824 u_char sc_col; /* saved col */
825 u_short sc_cur_offset; /* saved cursor addr offset */
826 u_short sc_attr; /* saved attributes */
827 u_char sc_vtsgr; /* saved sgr configuration */
828 u_char sc_awm; /* saved auto wrap mode */
829 u_char sc_om; /* saved origin mode */
830 u_short *sc_G0; /* save G0 ptr */
831 u_short *sc_G1; /* save G1 ptr */
832 u_short *sc_G2; /* save G2 ptr */
833 u_short *sc_G3; /* save G3 ptr */
834 u_short **sc_GL; /* save GL ptr */
835 u_short **sc_GR; /* save GR ptr */
836 u_char sc_sel; /* selective erase state */
837 u_char ufkl[8][17]; /* user fkey-labels */
838 u_char sfkl[8][17]; /* system fkey-labels */
839 u_char labels_on; /* display fkey labels etc. on/off */
840 u_char which_fkl; /* which fkey labels are active */
841 char tab_stops[MAXTAB]; /* table of active tab stops */
842 u_char parmi; /* parameter index */
843 u_char parms[MAXPARMS]; /* parameter array */
844 u_char hp_state; /* hp escape sequence state machine */
845 u_char attribute; /* attribute normal, tx only, local */
846 u_char key; /* fkey label no */
847 u_char l_len; /* buffer length's */
850 u_char i; /* help (got short of names ...) */
851 u_char l_buf[MAX_LABEL+1]; /* buffers */
852 u_char s_buf[MAX_STRING+1];
853 u_char m_buf[MAX_STATUS+1];
854 u_char openf; /* we are opened ! */
855 u_char vt_pure_mode; /* no fkey labels, row/col, status */
856 u_char cursor_start; /* Start of cursor */
857 u_char cursor_end; /* End of cursor */
858 u_char cursor_on; /* cursor switched on */
859 u_char ckm; /* true = cursor key normal mode */
860 u_char irm; /* true = insert mode */
861 u_char lnm; /* Line Feed/New Line Mode */
862 u_char dcs_state; /* dcs escape sequence state machine */
863 u_char udk_def[MAXUDKDEF]; /* new definitions for vt220 FKeys */
864 u_char udk_defi; /* index for FKey definitions */
865 u_char udk_deflow; /* low or high nibble in sequence */
866 u_char udk_fnckey; /* function key to assign to */
867 u_char dld_dscs[DSCS_LENGTH]; /* designate soft character set id */
868 u_char dld_dscsi; /* index for dscs */
869 u_char dld_sixel_lower; /* upper/lower sixels of character */
870 u_char dld_sixelli; /* index for lower sixels */
871 u_char dld_sixelui; /* index for upper sixels */
872 struct sixels sixel; /* structure for storing char sixels */
873 u_char selchar; /* true = selective attribute on */
874 u_int decsca[MAXDECSCA]; /* Select Character Attrib bit array */
875 u_short **GL; /* ptr to current GL conversion table*/
876 u_short **GR; /* ptr to current GR conversion table*/
877 u_short *G0; /* ptr to current G0 conversion table*/
878 u_short *G1; /* ptr to current G1 conversion table*/
879 u_char force24; /* force 24 lines in DEC 25 and HP 28*/
880 u_short *G2; /* ptr to current G2 conversion table*/
881 u_short *G3; /* ptr to current G3 conversion table*/
882 u_char dld_id[DSCS_LENGTH+1]; /* soft character set id */
883 u_char which[DSCS_LENGTH+1]; /* which set to designate */
884 u_char whichi; /* index into which .. */
885 u_char ss; /* flag, single shift G2 / G3 -> GL */
886 u_short **Gs; /* ptr to cur. G2/G3 conversion table*/
887 u_char udkbuf[MAXUDKDEF]; /* buffer for user defined keys */
888 struct udkentry ukt; /* index & length for each udk */
889 u_char udkff; /* index into buffer first free entry*/
890 struct rgb palette[NVGAPEL]; /* saved VGA DAC palette */
891 u_char wd132col; /* we are on a wd vga and in 132 col */
892 u_char scroll_lock; /* scroll lock active */
893 u_char caps_lock; /* caps lock active */
894 u_char shift_lock; /* shiftlock flag (virtual ..) */
895 u_char num_lock; /* num lock, true = keypad num mode */
896 u_char abs_write; /* write outside of scroll region */
898 #if PCVT_USL_VT_COMPAT /* SysV compatibility :-( */
900 struct vt_mode smode;
904 #define VT_WAIT_REL 1 /* wait till process released vt */
905 #define VT_WAIT_ACK 2 /* wait till process ack vt acquire */
906 #define VT_GRAFX 4 /* vt runs graphics mode */
907 #define VT_WAIT_ACT 8 /* a process is sleeping on this vt */
908 /* becoming active */
909 #endif /* PCVT_USL_VT_COMPAT */
913 EXTERN video_state vs[PCVT_NSCREENS]; /* parameters for screens */
915 struct vga_char_state {
916 int loaded; /* Whether a font is loaded here */
917 int secondloaded; /* an extension characterset was loaded, */
918 /* the number is found here */
919 u_char char_scanlines; /* Scanlines per character */
920 u_char scr_scanlines; /* Low byte of scanlines per screen */
921 int screen_size; /* Screen size in SIZ_YYROWS */
924 EXTERN struct vga_char_state vgacs[NVGAFONTS]; /* Character set states */
928 struct timeval lastmove; /* last time the pointer moved */
929 u_char opened; /* someone would like to use a mouse */
930 u_char minor; /* minor device number */
931 u_char buttons; /* current "buttons" pressed */
932 u_char extendedseen; /* 0xe0 has been seen, do not use next key */
933 u_char breakseen; /* key break has been seen for a sticky btn */
935 #endif /* PCVT_EMU_MOUSE */
944 struct cfdriver vtcd = {
945 NULL, "vt", pcprobe, pcattach, DV_TTY, sizeof(struct device)
950 int pcprobe ( struct isa_device *dev );
951 int pcattach ( struct isa_device *dev );
953 struct isa_driver vtdriver = { /* driver routines */
954 pcprobe, pcattach, "vt", 1,
957 #endif /* PCVT_NETBSD > 9 */
959 u_char fgansitopc[] = { /* foreground ANSI color -> pc */
960 FG_BLACK, FG_RED, FG_GREEN, FG_BROWN, FG_BLUE,
961 FG_MAGENTA, FG_CYAN, FG_LIGHTGREY
964 u_char bgansitopc[] = { /* background ANSI color -> pc */
965 BG_BLACK, BG_RED, BG_GREEN, BG_BROWN, BG_BLUE,
966 BG_MAGENTA, BG_CYAN, BG_LIGHTGREY
970 u_short *Crtat; /* screen start address */
971 #if !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200)
972 struct tty *pcconsp = &pccons[0]; /* ptr to current device */
973 #else /* PCVT_FREEBSD > 110 */
975 #endif /* !(PCVT_FREEBSD > 110) */
977 struct tty *pcconsp; /* ptr to current device, see pcattach() */
978 #endif /* PCVT_NETBSD */
981 struct mousestat mouse = {0};
982 struct mousedefs mousedef = {0x3b, 0x3c, 0x3d, 0, 250000};
983 #endif /* PCVT_EMU_MOUSE */ /* F1, F2, F3, false, 0.25 sec */
985 video_state *vsp = &vs[0]; /* ptr to current screen parms */
987 #if PCVT_USL_VT_COMPAT
988 int vt_switch_pending = 0; /* if > 0, a vt switch is */
989 #endif /* PCVT_USL_VT_COMPAT */ /* pending; contains the # */
990 /* of the old vt + 1 */
992 u_int addr_6845 = MONO_BASE; /* crtc base addr */
993 u_char do_initialization = 1; /* we have to init ourselves */
994 u_char pcvt_is_console = 0; /* until we know it */
995 u_char shift_down = 0; /* shift key down flag */
996 u_char ctrl_down = 0; /* ctrl key down flag */
997 u_char meta_down = 0; /* alt key down flag */
998 u_char altgr_down = 0; /* altgr key down flag */
999 u_char kbrepflag = 1; /* key repeat flag */
1000 u_char totalscreens = 1; /* screens available */
1001 u_char current_video_screen = 0; /* displayed screen no */
1002 u_char adaptor_type = UNKNOWN_ADAPTOR;/* adaptor type */
1003 u_char vga_type = VGA_UNKNOWN; /* vga chipset */
1004 u_char can_do_132col = 0; /* vga chipset can 132 cols */
1005 u_char vga_family = 0; /* vga manufacturer */
1006 u_char totalfonts = 0; /* fonts available */
1007 u_char chargen_access = 0; /* synchronize access */
1008 u_char keyboard_type = KB_UNKNOWN; /* type of keyboard */
1009 u_char keyboard_is_initialized = 0; /* for ddb sanity */
1010 u_char kbd_polling = 0; /* keyboard is being polled */
1011 #ifdef _DEV_KBD_KBDREG_H_
1012 u_char reset_keyboard = 0; /* OK to reset keyboard */
1013 keyboard_t *kbd = NULL;
1014 #endif /* _DEV_KBD_KBDREG_H_ */
1017 u_char keyboard_show = 0; /* normal display */
1018 #endif /* PCVT_SHOWKEYS */
1020 u_char cursor_pos_valid = 0; /* sput left a valid position*/
1022 u_char critical_scroll = 0; /* inside scrolling up */
1023 int switch_page = -1; /* which page to switch to */
1025 #if PCVT_SCREENSAVER
1026 u_char reset_screen_saver = 1; /* reset the saver next time */
1027 u_char scrnsv_active = 0; /* active flag */
1028 #endif /* PCVT_SCREENSAVER */
1031 unsigned scrnsv_timeout = 0; /* initially off */
1032 #if !PCVT_USL_VT_COMPAT
1033 u_char pcvt_xmode = 0; /* display is grafx */
1034 #endif /* PCVT_USL_VT_COMPAT */
1035 u_char pcvt_kbd_raw = 0; /* keyboard sends scans */
1036 #endif /* XSERVER */
1038 #if PCVT_BACKUP_FONTS
1039 u_char *saved_charsets[NVGAFONTS] = {0}; /* backup copy of fonts */
1040 #endif /* PCVT_BACKUP_FONTS */
1042 /*---------------------------------------------------------------------------
1044 VT220 attributes -> internal emulator attributes conversion tables
1046 be careful when designing color combinations, because on
1047 EGA and VGA displays, bit 3 of the attribute byte is used
1048 for characterset switching, and is no longer available for
1049 foreground intensity (bold)!
1051 ---------------------------------------------------------------------------*/
1053 /* color displays */
1055 u_char sgr_tab_color[16] = {
1056 /*00*/ (BG_BLACK | FG_LIGHTGREY), /* normal */
1057 /*01*/ (BG_BLUE | FG_LIGHTGREY), /* bold */
1058 /*02*/ (BG_BROWN | FG_LIGHTGREY), /* underline */
1059 /*03*/ (BG_MAGENTA | FG_LIGHTGREY), /* bold+underline */
1060 /*04*/ (BG_BLACK | FG_LIGHTGREY | FG_BLINK), /* blink */
1061 /*05*/ (BG_BLUE | FG_LIGHTGREY | FG_BLINK), /* bold+blink */
1062 /*06*/ (BG_BROWN | FG_LIGHTGREY | FG_BLINK), /* underline+blink */
1063 /*07*/ (BG_MAGENTA | FG_LIGHTGREY | FG_BLINK), /* bold+underline+blink */
1064 /*08*/ (BG_LIGHTGREY | FG_BLACK), /* invers */
1065 /*09*/ (BG_LIGHTGREY | FG_BLUE), /* bold+invers */
1066 /*10*/ (BG_LIGHTGREY | FG_BROWN), /* underline+invers */
1067 /*11*/ (BG_LIGHTGREY | FG_MAGENTA), /* bold+underline+invers*/
1068 /*12*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* blink+invers */
1069 /*13*/ (BG_LIGHTGREY | FG_BLUE | FG_BLINK), /* bold+blink+invers */
1070 /*14*/ (BG_LIGHTGREY | FG_BROWN | FG_BLINK), /* underline+blink+invers*/
1071 /*15*/ (BG_LIGHTGREY | FG_MAGENTA | FG_BLINK) /*bold+underl+blink+invers*/
1074 /* monochrome displays (VGA version, no intensity) */
1076 u_char sgr_tab_mono[16] = {
1077 /*00*/ (BG_BLACK | FG_LIGHTGREY), /* normal */
1078 /*01*/ (BG_BLACK | FG_UNDERLINE), /* bold */
1079 /*02*/ (BG_BLACK | FG_UNDERLINE), /* underline */
1080 /*03*/ (BG_BLACK | FG_UNDERLINE), /* bold+underline */
1081 /*04*/ (BG_BLACK | FG_LIGHTGREY | FG_BLINK), /* blink */
1082 /*05*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK), /* bold+blink */
1083 /*06*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK), /* underline+blink */
1084 /*07*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK), /* bold+underline+blink */
1085 /*08*/ (BG_LIGHTGREY | FG_BLACK), /* invers */
1086 /*09*/ (BG_LIGHTGREY | FG_BLACK), /* bold+invers */
1087 /*10*/ (BG_LIGHTGREY | FG_BLACK), /* underline+invers */
1088 /*11*/ (BG_LIGHTGREY | FG_BLACK), /* bold+underline+invers*/
1089 /*12*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* blink+invers */
1090 /*13*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* bold+blink+invers */
1091 /*14*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* underline+blink+invers*/
1092 /*15*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK) /*bold+underl+blink+invers*/
1095 /* monochrome displays (MDA version, with intensity) */
1097 u_char sgr_tab_imono[16] = {
1098 /*00*/ (BG_BLACK | FG_LIGHTGREY), /* normal */
1099 /*01*/ (BG_BLACK | FG_LIGHTGREY | FG_INTENSE), /* bold */
1100 /*02*/ (BG_BLACK | FG_UNDERLINE), /* underline */
1101 /*03*/ (BG_BLACK | FG_UNDERLINE | FG_INTENSE), /* bold+underline */
1102 /*04*/ (BG_BLACK | FG_LIGHTGREY | FG_BLINK), /* blink */
1103 /*05*/ (BG_BLACK | FG_LIGHTGREY | FG_INTENSE | FG_BLINK), /* bold+blink */
1104 /*06*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK), /* underline+blink */
1105 /*07*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK | FG_INTENSE), /* bold+underline+blink */
1106 /*08*/ (BG_LIGHTGREY | FG_BLACK), /* invers */
1107 /*09*/ (BG_LIGHTGREY | FG_BLACK | FG_INTENSE), /* bold+invers */
1108 /*10*/ (BG_LIGHTGREY | FG_BLACK), /* underline+invers */
1109 /*11*/ (BG_LIGHTGREY | FG_BLACK | FG_INTENSE), /* bold+underline+invers*/
1110 /*12*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* blink+invers */
1111 /*13*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK | FG_INTENSE),/* bold+blink+invers*/
1112 /*14*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* underline+blink+invers*/
1113 /*15*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK | FG_INTENSE) /* bold+underl+blink+invers */
1116 #else /* WAS_EXTERN */
1118 extern u_char vga_type;
1119 extern struct tty *pcconsp;
1120 extern video_state *vsp;
1123 extern struct mousestat mouse;
1124 extern struct mousedefs mousedef;
1125 #endif /* PCVT_EMU_MOUSE */
1127 #if PCVT_USL_VT_COMPAT
1128 extern int vt_switch_pending;
1129 #endif /* PCVT_USL_VT_COMPAT */
1131 extern u_int addr_6845;
1132 extern u_short *Crtat;
1133 extern u_char do_initialization;
1134 extern u_char pcvt_is_console;
1135 extern u_char bgansitopc[];
1136 extern u_char fgansitopc[];
1137 extern u_char shift_down;
1138 extern u_char ctrl_down;
1139 extern u_char meta_down;
1140 extern u_char altgr_down;
1141 extern u_char kbrepflag;
1142 extern u_char adaptor_type;
1143 extern u_char current_video_screen;
1144 extern u_char totalfonts;
1145 extern u_char totalscreens;
1146 extern u_char chargen_access;
1147 extern u_char keyboard_type;
1148 extern u_char can_do_132col;
1149 extern u_char vga_family;
1150 extern u_char keyboard_is_initialized;
1151 extern u_char kbd_polling;
1152 #ifdef _DEV_KBD_KBDREG_H_
1153 extern u_char reset_keyboard;
1154 extern keyboard_t *kbd;
1155 #endif /* _DEV_KBD_KBDREG_H_ */
1158 extern u_char keyboard_show;
1159 #endif /* PCVT_SHOWKEYS */
1161 extern u_char cursor_pos_valid;
1163 extern u_char critical_scroll;
1164 extern int switch_page;
1166 #if PCVT_SCREENSAVER
1167 extern u_char reset_screen_saver;
1168 extern u_char scrnsv_active;
1169 #endif /* PCVT_SCREENSAVER */
1171 extern u_char sgr_tab_color[];
1172 extern u_char sgr_tab_mono[];
1173 extern u_char sgr_tab_imono[];
1176 extern unsigned scrnsv_timeout;
1177 extern u_char pcvt_xmode;
1178 extern u_char pcvt_kbd_raw;
1179 #endif /* XSERVER */
1181 #if PCVT_BACKUP_FONTS
1182 extern u_char *saved_charsets[NVGAFONTS];
1183 #endif /* PCVT_BACKUP_FONTS */
1185 #endif /* WAS_EXTERN */
1188 * FreeBSD > 1.0.2 cleaned up the kernel definitions (with the aim of
1189 * getting ANSI-clean). Since there has been a mixed usage of types like
1190 * "dev_t" (actually some short) in prototyped and non-prototyped fasion,
1191 * each of those types is declared as "int" within function prototypes
1192 * (which is what the compiler would actually promote it to).
1194 * The macros below are used to clarify which type a parameter ought to
1195 * be, regardless of its actual promotion to "int".
1203 * In FreeBSD >= 2.0, dev_t has type `unsigned long', so promoting it
1204 * doesn't cause any problems in prototypes.
1207 #if PCVT_FREEBSD >= 200
1212 #if !PCVT_FREEBSD || (PCVT_FREEBSD < 210)
1213 extern void bcopyb(void *from, void *to, u_int length);
1216 #if !PCVT_FREEBSD || (PCVT_FREEBSD < 200)
1217 extern void fillw(U_short value, void *addr, u_int length);
1220 int pcparam ( struct tty *tp, struct termios *t );
1223 * In FreeBSD > 2.0.6, driver console functions are declared in machine/cons.h
1224 * and some return void, so don't declare them here.
1226 #if PCVT_FREEBSD <= 205
1227 int pccnprobe ( struct consdev *cp );
1228 int pccninit ( struct consdev *cp );
1229 int pccngetc ( Dev_t dev );
1230 int pccncheckc ( Dev_t dev );
1231 int pccnputc ( Dev_t dev, U_char c );
1235 void pcstart ( struct tty *tp );
1236 void pcstop ( struct tty *tp, int flag );
1238 # if PCVT_FREEBSD < 200
1239 void consinit ( void );
1242 #if PCVT_USL_VT_COMPAT
1243 void switch_screen ( int n, int oldgrafx, int newgrafx );
1244 int usl_vt_ioctl (Dev_t dev, int cmd, caddr_t data, int flag,
1246 int vt_activate ( int newscreen );
1247 int vgapage ( int n );
1248 void get_usl_keymap( keymap_t *map );
1249 void reset_usl_modes (struct video_state *vsx);
1251 void vgapage ( int n );
1252 #endif /* PCVT_USL_VT_COMPAT */
1255 int mouse_ioctl ( Dev_t dev, int cmd, caddr_t data );
1256 #endif /* PCVT_EMU_MOUSE */
1258 #if PCVT_SCREENSAVER
1259 void pcvt_scrnsv_reset ( void );
1260 #endif /* PCVT_SCREENSAVER */
1262 #if PCVT_SCREENSAVER && defined(XSERVER)
1263 void pcvt_set_scrnsv_tmo ( int );
1264 #endif /* PCVT_SCREENSAVER && defined(XSERVER) */
1266 void vga_move_charset ( unsigned n, unsigned char *b, int save_it);
1268 void async_update ( void *arg );
1269 void clr_parms ( struct video_state *svsp );
1270 void cons_highlight ( void );
1271 void cons_normal ( void );
1272 void dprintf ( unsigned flgs, const char *fmt, ... );
1273 int egavga_test ( void );
1274 void fkl_off ( struct video_state *svsp );
1275 void fkl_on ( struct video_state *svsp );
1276 struct tty *get_pccons ( Dev_t dev );
1277 void init_sfkl ( struct video_state *svsp );
1278 void init_ufkl ( struct video_state *svsp );
1279 #ifndef _DEV_KBD_KBDREG_H_
1280 int kbd_cmd ( int val );
1281 int kbd_response ( void );
1282 #endif /* _DEV_KBD_KBDREG_H_ */
1283 void kbd_code_init ( void );
1284 void kbd_code_init1 ( void );
1286 #if PCVT_SCANSET > 1
1287 void kbd_emulate_pc(int do_emulation);
1290 int kbdioctl ( Dev_t dev, int cmd, caddr_t data, int flag );
1291 void loadchar ( int fontset, int character, int char_scanlines,
1292 u_char *char_table );
1293 void mda2egaorvga ( void );
1294 void roll_up ( struct video_state *svsp, int n );
1295 void select_vga_charset ( int vga_charset );
1296 void set_2ndcharset ( void );
1297 void set_charset ( struct video_state *svsp, int curvgacs );
1298 void set_emulation_mode ( struct video_state *svsp, int mode );
1299 void set_screen_size ( struct video_state *svsp, int size );
1300 u_char *sgetc ( int noblock );
1301 void sixel_vga ( struct sixels *charsixel, u_char *charvga );
1302 void sput ( u_char *s, U_char attrib, int len, int page );
1303 void sw_cursor ( int onoff );
1304 void sw_sfkl ( struct video_state *svsp );
1305 void sw_ufkl ( struct video_state *svsp );
1306 void swritefkl ( int num, u_char *string, struct video_state *svsp );
1307 void toggl_awm ( struct video_state *svsp );
1308 void toggl_bell ( struct video_state *svsp );
1309 void toggl_columns ( struct video_state *svsp );
1310 void toggl_dspf ( struct video_state *svsp );
1311 void toggl_sevenbit ( struct video_state *svsp );
1312 void update_hp ( struct video_state *svsp );
1313 void update_led ( void );
1314 void vga10_vga10 ( u_char *invga, u_char *outvga );
1315 void vga10_vga14 ( u_char *invga, u_char *outvga );
1316 void vga10_vga16 ( u_char *invga, u_char *outvga );
1317 void vga10_vga8 ( u_char *invga, u_char *outvga );
1318 u_char vga_chipset ( void );
1319 int vga_col ( struct video_state *svsp, int cols );
1320 void vga_screen_off ( void );
1321 void vga_screen_on ( void );
1322 char *vga_string ( int number );
1323 int vga_test ( void );
1324 int vgaioctl ( Dev_t dev, int cmd, caddr_t data, int flag );
1325 void vgapaletteio ( unsigned idx, struct rgb *val, int writeit );
1326 void vt_aln ( struct video_state *svsp );
1327 void vt_clearudk ( struct video_state *svsp );
1328 void vt_clreol ( struct video_state *svsp );
1329 void vt_clreos ( struct video_state *svsp );
1330 void vt_clrtab ( struct video_state *svsp );
1331 int vt_col ( struct video_state *svsp, int cols );
1332 void vt_coldmalloc ( void );
1333 void vt_cub ( struct video_state *svsp );
1334 void vt_cud ( struct video_state *svsp );
1335 void vt_cuf ( struct video_state *svsp );
1336 void vt_curadr ( struct video_state *svsp );
1337 void vt_cuu ( struct video_state *svsp );
1338 void vt_da ( struct video_state *svsp );
1339 void vt_dch ( struct video_state *svsp );
1340 void vt_dcsentry ( U_char ch, struct video_state *svsp );
1341 void vt_designate ( struct video_state *svsp);
1342 void vt_dl ( struct video_state *svsp );
1343 void vt_dld ( struct video_state *svsp );
1344 void vt_dsr ( struct video_state *svsp );
1345 void vt_ech ( struct video_state *svsp );
1346 void vt_ic ( struct video_state *svsp );
1347 void vt_il ( struct video_state *svsp );
1348 void vt_ind ( struct video_state *svsp );
1349 void vt_initsel ( struct video_state *svsp );
1350 void vt_keyappl ( struct video_state *svsp );
1351 void vt_keynum ( struct video_state *svsp );
1352 void vt_mc ( struct video_state *svsp );
1353 void vt_nel ( struct video_state *svsp );
1354 void vt_rc ( struct video_state *svsp );
1355 void vt_reqtparm ( struct video_state *svsp );
1356 void vt_reset_ansi ( struct video_state *svsp );
1357 void vt_reset_dec_priv_qm ( struct video_state *svsp );
1358 void vt_ri ( struct video_state *svsp );
1359 void vt_ris ( struct video_state *svsp );
1360 void vt_sc ( struct video_state *svsp );
1361 void vt_sca ( struct video_state *svsp );
1362 void vt_sd ( struct video_state *svsp );
1363 void vt_sed ( struct video_state *svsp );
1364 void vt_sel ( struct video_state *svsp );
1365 void vt_set_ansi ( struct video_state *svsp );
1366 void vt_set_dec_priv_qm ( struct video_state *svsp );
1367 void vt_sgr ( struct video_state *svsp );
1368 void vt_stbm ( struct video_state *svsp );
1369 void vt_str ( struct video_state *svsp );
1370 void vt_su ( struct video_state *svsp );
1371 void vt_tst ( struct video_state *svsp );
1372 void vt_udk ( struct video_state *svsp );
1373 void toggl_24l ( struct video_state *svsp );
1375 #ifdef PCVT_INCLUDE_VT_SELATTR
1377 #define INT_BITS (sizeof(unsigned int) * 8)
1378 #define INT_INDEX(n) ((n) / INT_BITS)
1379 #define BIT_INDEX(n) ((n) % INT_BITS)
1381 /*---------------------------------------------------------------------------*
1382 * set selective attribute if appropriate
1383 *---------------------------------------------------------------------------*/
1384 static __inline void vt_selattr(struct video_state *svsp)
1388 i = (svsp->Crtat + svsp->cur_offset) - svsp->Crtat;
1391 svsp->decsca[INT_INDEX(i)] |= (1 << BIT_INDEX(i));
1393 svsp->decsca[INT_INDEX(i)] &= ~(1 << BIT_INDEX(i));
1396 #endif /* PCVT_INCLUDE_VT_SELATTR */
1399 /*---------------------------------------------------------------------------*
1400 * produce 7 us delay accessing the keyboard controller
1401 *---------------------------------------------------------------------------*/
1403 #if PCVT_PORTIO_DELAY
1404 /* use multiple dummy accesses to port */
1405 /* 0x84 to produce keyboard controller */
1407 #define PCVT_KBD_DELAY() \
1408 { (void)inb(0x84); } \
1409 { (void)inb(0x84); } \
1410 { (void)inb(0x84); } \
1411 { (void)inb(0x84); } \
1412 { (void)inb(0x84); } \
1413 { (void)inb(0x84); }
1415 #else /* PCVT_PORTIO_DELAY */
1416 /* use system supplied delay function for */
1417 /* producing delays for accesssing the */
1418 /* keyboard controller */
1420 #define PCVT_KBD_DELAY() delay(7)
1421 #elif PCVT_FREEBSD || (PCVT_NETBSD <= 9)
1422 #define PCVT_KBD_DELAY() DELAY(7)
1424 #endif /* PCVT_PORTIO_DELAY */
1426 /*---------------------------------- E O F ----------------------------------*/