]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/i386/isa/pcvt/pcvt_hdr.h
Merge the cons.c and cons.h to the best of my ability. alpha may or
[FreeBSD/FreeBSD.git] / sys / i386 / isa / pcvt / pcvt_hdr.h
1 /*
2  * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch.
3  *
4  * Copyright (c) 1992, 1993 Brian Dunford-Shore.
5  *
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
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.
22  *
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.
33  *
34  *
35  * @(#)pcvt_hdr.h, 3.20, Last Edit-Date: [Fri Apr  7 10:16:58 1995]
36  *
37  */
38
39 /*---------------------------------------------------------------------------
40  *
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
63  *
64  *---------------------------------------------------------------------------*/
65
66 #define PCVT_REL "3.20-b24"     /* driver attach announcement   */
67                                 /* see also: pcvt_ioctl.h       */
68
69 #include "opt_pcvt.h"
70 #if defined(__FreeBSD__) && !defined(PCVT_FREEBSD)
71 #  define PCVT_FREEBSD 210
72 #endif
73
74 #if PCVT_FREEBSD >= 200
75
76 #include <sys/param.h>
77 #include <sys/systm.h>
78 #include <sys/conf.h>
79 #include <sys/proc.h>
80 #include <sys/signalvar.h>
81 #include <sys/tty.h>
82 #include <sys/uio.h>
83 #include <sys/callout.h>
84 #include <sys/kernel.h>
85 #include <sys/syslog.h>
86 #include <sys/malloc.h>
87 #include <sys/time.h>
88 #if PCVT_FREEBSD > 210
89 #include <machine/random.h>
90 #endif  /* PCVT_FREEBSD > 210 */
91 #else /* ! PCVT_FREEBSD >= 200 */
92
93 #include "param.h"
94 #include "conf.h"
95 #include "ioctl.h"
96 #include "proc.h"
97 #include "signalvar.h"
98 #include "tty.h"
99 #include "uio.h"
100 #include "callout.h"
101 #include "systm.h"
102 #include "kernel.h"
103 #include "syslog.h"
104 #include "malloc.h"
105 #include "time.h"
106
107 #endif /* PCVT_FREEBSD >= 200 */
108
109 #include <i386/isa/pcvt/pcvt_conf.h>
110
111 #include <dev/kbd/kbdreg.h>
112 #include <dev/kbd/atkbdcreg.h>
113
114 #if PCVT_NETBSD > 9
115 #include "device.h"
116 #endif
117
118 #if PCVT_NETBSD > 9
119 #include "i386/isa/isavar.h"
120 #include "i386/cpufunc.h"
121 #elif PCVT_FREEBSD >= 200
122 #include <i386/isa/isa_device.h>
123 #else
124 #include "i386/isa/isa_device.h"
125 #endif
126
127 #if PCVT_FREEBSD >= 200
128 #include <i386/isa/icu.h>
129 #else
130 #include "i386/isa/icu.h"
131 #endif
132
133 #if PCVT_NETBSD > 100
134 #include "i386/isa/isareg.h"
135 #elif PCVT_FREEBSD >= 200
136 #include <i386/isa/isa.h>
137 #else
138 #include "i386/isa/isa.h"
139 #endif
140
141 #if PCVT_NETBSD > 9
142 #include "dev/cons.h"
143 #elif PCVT_FREEBSD >= 200
144 #include <sys/cons.h>
145 #else
146 #include "i386/i386/cons.h"
147 #endif
148
149 #if PCVT_NETBSD <= 9
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 */
158
159 #if PCVT_NETBSD > 9
160 #include <i386/isa/pcvt/pcvt_ioctl.h>
161 #elif PCVT_FREEBSD >= 200
162 #include <machine/pcvt_ioctl.h>
163 #else
164 #include "machine/pcvt_ioctl.h"
165 #endif
166
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>
172 #endif
173 /*
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.
176  */
177 #define KDGKBTYPE       _IOR('K', 64, int)
178 #define KB_84           1
179 #define KB_101          2
180 #define KB_OTHER        3
181 #else /* PCVT_FREEBSD >= 200 */
182 #include "machine/pc/display.h"
183 #endif /* PCVT_FREEBSD >= 200 */
184
185 /* setup irq disable function to use */
186
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
191 #else
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
196 #endif
197
198 /* perform option consistency checks */
199
200 #if defined PCVT_FREEBSD && PCVT_FREEBSD == 1
201 # undef PCVT_FREEBSD
202 # define PCVT_FREEBSD 102       /* assume 1.0 release */
203 #endif
204
205 #if defined PCVT_NETBSD && PCVT_NETBSD == 1
206 #undef PCVT_NETBSD
207 #define PCVT_NETBSD 9           /* assume 0.9 release for now */
208 #endif
209
210 #if PCVT_FREEBSD + PCVT_NETBSD == 0
211 # error "pcvt_hdr.h: You MUST define one of PCVT_{NET,FREE}BSD \
212 in the config file"
213 #elif (PCVT_FREEBSD && PCVT_NETBSD)
214 # error "pcvt_hdr.h: You CAN only define *one* of PCVT_{NET,FREE}BSD \
215 in the config file"
216 #endif
217
218 #ifdef XSERVER
219
220 /* PCVT_NULLCHARS is mandatory for X server */
221 #if !PCVT_NULLCHARS
222 #undef PCVT_NULLCHARS
223 #define PCVT_NULLCHARS 1
224 #endif
225
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
230 #endif
231
232 #else /* XSERVER */
233
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
238 #endif
239
240 #endif /* XSERVER */
241
242 /* PCVT_SCREENSAVER is mandatory for PCVT_PRETTYSCRNS */
243 #if PCVT_PRETTYSCRNS && !PCVT_SCREENSAVER
244 #undef PCVT_SCREENSAVER
245 #define PCVT_SCREENSAVER 1
246 #endif
247
248 /* get the inline inb/outb back again ... */
249
250 #if PCVT_NETBSD
251 #if PCVT_NETBSD == 9
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 ... */
255 #else
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 */
260
261 #if PCVT_FREEBSD >= 200
262 #define NEW_AVERUNNABLE         /* new averunnable changes for FreeBSD 2.0 */
263 #endif
264
265 #if PCVT_SCANSET !=1 && PCVT_SCANSET !=2
266 #error "Supported keyboard scancode sets are 1 and 2 only (for now)!!!"
267 #endif
268
269 /*---------------------------------------------------------------------------*
270  *      Keyboard and Keyboard Controller
271  *---------------------------------------------------------------------------*/
272
273 #ifndef _DEV_KBD_KBDREG_H_
274
275 #define CONTROLLER_CTRL 0x64    /* W - command, R - status      */
276 #define CONTROLLER_DATA 0x60    /* R/W - data                   */
277
278 /* commands to control the CONTROLLER (8042) on the mainboard */
279
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 */
286
287 /* command byte for writing to CONTROLLER (8042) via CONTR_WRITE */
288
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
292                                  * instead of 11 */
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
298                                  * interrupt */
299
300 /* status from CONTROLLER (8042) on the mainboard */
301
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
307                                  * data to 0x60 */
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) */
311
312 /* commands to the KEYBOARD (via the 8042 controller on mainboard..) */
313
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 */
320
321 #endif /* _DEV_KBD_KBDREG_H_ */
322
323 /* responses from the KEYBOARD (via the 8042 controller on mainboard..) */
324
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
335                                  * command rx'd */
336 #define KEYB_R_OVERRUN1 0xff    /* keyboard buffer overflow */
337
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 */
341
342 /* internal Keyboard Type */
343
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 */
347
348 /*---------------------------------------------------------------------------*
349  *      CMOS ram access to get the "Equipment Byte"
350  *---------------------------------------------------------------------------*/
351
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        */
357
358 /*---------------------------------------------------------------------------*
359  *      VT220 -> internal color conversion table fields
360  *---------------------------------------------------------------------------*/
361
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 */
367
368 /*---------------------------------------------------------------------------*
369  *      VGA GENERAL/EXTERNAL Registers          (3BA or 3DA and 3CA, 3C2, 3CC)
370  *---------------------------------------------------------------------------*/
371
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 */
385
386 /*---------------------------------------------------------------------------*
387  *      VGA CRTC Registers                        (3B4 and 3B5 or 3D4 and 3D5)
388  *---------------------------------------------------------------------------*/
389
390 #define MONO_BASE       0x3B4           /* crtc index register address mono */
391 #define CGA_BASE        0x3D4           /* crtc index register address color */
392
393 #define CRTC_ADDR       0x00            /* index register */
394
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 */
421
422 /* start of ET4000 extensions */
423
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 */
430
431 /* start of WD/Paradise extensions */
432
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 */
442 /* Video 7 */
443
444 #define CRTC_V7ID       0x1f            /* identification register */
445
446 /* Trident */
447
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 */
454
455 /*---------------------------------------------------------------------------*
456  *      VGA TIMING & SEQUENCER Registers                         (3C4 and 3C5)
457  *---------------------------------------------------------------------------*/
458
459 #define TS_INDEX        0x3C4           /* index register */
460 #define TS_DATA         0x3C5           /* data register */
461
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 */
467
468 /* ET4000 only */
469
470 #define TS_RESERVED     0x05            /* undef, reserved */
471 #define TS_STATECNTL    0x06            /* state control register */
472 #define TS_AUXMODE      0x07            /* auxiliary mode control */
473
474 /* WD/Paradise only */
475
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 */
481
482 /* Video 7 */
483
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 */
498
499 /* Trident */
500
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 */
506
507 /*---------------------------------------------------------------------------*
508  *      VGA GRAPHICS DATA CONTROLLER Registers              (3CE, 3CF and 3CD)
509  *---------------------------------------------------------------------------*/
510
511 #define GDC_SEGSEL      0x3CD           /* segment select register */
512 #define GDC_INDEX       0x3CE           /* index register */
513 #define GDC_DATA        0x3CF           /* data register */
514
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 */
524
525 /* WD/Paradise only */
526
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 */
534
535 /* Video 7 */
536
537 #define GDC_DATALATCH   0x22            /* gdc data latch */
538
539 /*---------------------------------------------------------------------------*
540  *      VGA ATTRIBUTE CONTROLLER Registers                       (3C0 and 3C1)
541  *---------------------------------------------------------------------------*/
542
543 #define ATC_INDEX       0x3C0           /* index register  AND  */
544 #define ATC_DATAW       0x3C0           /* data write      !!!  */
545 #define ATC_DATAR       0x3C1           /* data read */
546
547 #define ATC_ACCESS      0x20            /* access bit in ATC index register */
548
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) */
571
572 /*---------------------------------------------------------------------------*
573  *      VGA palette handling (output DAC palette)
574  *---------------------------------------------------------------------------*/
575
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 */
579
580 /*---------------------------------------------------------------------------*
581  *      function key labels
582  *---------------------------------------------------------------------------*/
583
584 #define LABEL_LEN       9               /* length of one label */
585 #define LABEL_MID       8               /* mid-part (row/col)   */
586
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)
592
593 /* tab setting */
594
595 #define MAXTAB 132              /* no of possible tab stops */
596
597 /* escape detection state machine */
598
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 /    */
616
617 /* for storing escape sequence parameters */
618
619 #define MAXPARMS        10      /* maximum no of parms */
620
621 /* terminal responses */
622
623 #define DA_VT220        "\033[?62;1;2;6;7;8;9c"
624
625 /* sub-states for Device Control String processing */
626
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 */
634
635 /* vt220 user defined keys and vt220 downloadable charset */
636
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 ! */
641
642 /* sub-states for HP-terminal emulator */
643
644 #define SHP_INIT        0
645
646 /* esc & f family */
647
648 #define SHP_AND_F       1
649 #define SHP_AND_Fa      2
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
656
657 /* esc & j family */
658
659 #define SHP_AND_J       9
660 #define SHP_AND_JL      10
661
662 /* esc & every-thing-else */
663
664 #define SHP_AND_ETE     11
665
666 /* additionals for function key labels */
667
668 #define MAX_LABEL       16
669 #define MAX_STRING      80
670 #define MAX_STATUS      160
671
672 /* MAX values for screen sizes for possible video adaptors */
673
674 #define MAXROW_MDACGA   25              /* MDA/CGA can do 25 x 80 max */
675 #define MAXCOL_MDACGA   80
676
677 #define MAXROW_EGA      43              /* EGA can do 43 x 80 max */
678 #define MAXCOL_EGA      80
679
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 */
683
684 /* switch 80/132 columns */
685
686 #define SCR_COL80       80              /* in 80 col mode */
687 #define SCR_COL132      132             /* in 132 col mode */
688
689 #define MAXDECSCA       (((MAXCOL_SVGA * MAXROW_VGA) \
690                         / (8 * sizeof(unsigned int)) ) + 1 )
691
692 /* screen memory start, monochrome */
693
694 #ifndef MONO_BUF
695 # if PCVT_FREEBSD && (PCVT_FREEBSD > 102)
696 #  define MONO_BUF      (KERNBASE+0xB0000)
697 # else
698 #  define MONO_BUF      0xfe0B0000               /* NetBSD-current: isa.h */
699 # endif
700 #endif
701
702 /* screen memory start, color */
703
704 #ifndef CGA_BUF
705 # if PCVT_FREEBSD && (PCVT_FREEBSD > 102)
706 #  define CGA_BUF       (KERNBASE+0xB8000)
707 # else
708 #  define CGA_BUF       0xfe0B8000               /* NetBSD-current: isa.h */
709 # endif
710 #endif
711
712 #define CHR             2               /* bytes per word in screen mem */
713
714 #define NVGAFONTS       8               /* number of vga fonts loadable */
715
716 #define MAXKEYNUM       127             /* max no of keys in table */
717
718 /* charset tables */
719
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 */
723
724 /* charset designations */
725
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 */
733
734 /* which fkey-labels */
735
736 #define SYS_FKL         0       /* in hp mode, sys-fkls are active */
737 #define USR_FKL         1       /* in hp mode, user-fkls are active */
738
739 /* arguments to async_update() */
740
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 */
744
745 /* variables */
746
747 #ifdef EXTERN
748 #define WAS_EXTERN
749 #else
750 #define EXTERN extern
751 #endif
752
753 EXTERN  u_char  *more_chars;            /* response buffer via kbd */
754 EXTERN  u_char  color;                  /* color or mono display */
755
756 EXTERN  u_short kern_attr;              /* kernel messages char attributes */
757 EXTERN  u_short user_attr;              /* character attributes */
758
759 #if !PCVT_EMU_MOUSE
760
761 #if PCVT_NETBSD
762 EXTERN struct tty *pc_tty[PCVT_NSCREENS];
763 #elif !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200)
764 EXTERN struct tty pccons[PCVT_NSCREENS];
765 #else
766 EXTERN struct tty *pccons[PCVT_NSCREENS];
767 #endif /* PCVT_NETBSD */
768
769 #else /* PCVT_EMU_MOUSE */
770
771 #if PCVT_NETBSD
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];
775 #else
776 EXTERN struct tty *pccons[PCVT_NSCREENS + 1];
777 #endif
778
779 #endif /* PCVT_EMU_MOUSE */
780
781 struct sixels {
782         u_char lower[MAXSIXEL];         /* lower half of char */
783         u_char upper[MAXSIXEL];         /* upper half of char */
784 };
785
786 struct udkentry {
787         u_char  first[MAXUDKEYS];       /* index to first char */
788         u_char  length[MAXUDKEYS];      /* length of this entry */
789 };
790
791 /* VGA palette handling */
792 struct rgb {
793         u_char  r, g, b;                /* red/green/blue, valid 0..VGA_PMSK */
794 };
795
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 */
848         u_char  s_len;
849         u_char  m_len;
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 */
897
898 #if PCVT_USL_VT_COMPAT                  /* SysV compatibility :-( */
899
900         struct vt_mode smode;
901         struct proc *proc;
902         pid_t pid;
903         unsigned vt_status;
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 */
910
911 } video_state;
912
913 EXTERN video_state vs[PCVT_NSCREENS];   /* parameters for screens */
914
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 */
922 };
923
924 EXTERN struct vga_char_state vgacs[NVGAFONTS];  /* Character set states */
925
926 #if PCVT_EMU_MOUSE
927 struct mousestat {
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 */
934 };
935 #endif /* PCVT_EMU_MOUSE */
936
937 #ifdef WAS_EXTERN
938
939 #if PCVT_NETBSD > 9
940
941 int pcprobe ();
942 void pcattach ();
943
944 struct cfdriver vtcd = {
945         NULL, "vt", pcprobe, pcattach, DV_TTY, sizeof(struct device)
946 };
947
948 #else
949
950 int pcprobe ( struct isa_device *dev );
951 int pcattach ( struct isa_device *dev );
952
953 struct  isa_driver vtdriver = {         /* driver routines */
954         pcprobe, pcattach, "vt", 1,
955 };
956
957 #endif /* PCVT_NETBSD > 9 */
958
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
962 };
963
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
967 };
968
969 #if !PCVT_NETBSD
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 */
974 struct tty *pcconsp;
975 #endif /* !(PCVT_FREEBSD > 110) */
976 #else
977 struct tty *pcconsp;            /* ptr to current device, see pcattach() */
978 #endif /* PCVT_NETBSD */
979
980 #if PCVT_EMU_MOUSE
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 */
984
985 video_state *vsp                = &vs[0]; /* ptr to current screen parms */
986
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 */
991
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_ */
1015
1016 #if PCVT_SHOWKEYS
1017 u_char  keyboard_show           = 0;            /* normal display */
1018 #endif /* PCVT_SHOWKEYS */
1019
1020 u_char  cursor_pos_valid        = 0;            /* sput left a valid position*/
1021
1022 u_char  critical_scroll         = 0;            /* inside scrolling up */
1023 int     switch_page             = -1;           /* which page to switch to */
1024
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 */
1029
1030 #ifdef XSERVER
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 */
1037
1038 #if PCVT_BACKUP_FONTS
1039 u_char *saved_charsets[NVGAFONTS] = {0};        /* backup copy of fonts */
1040 #endif /* PCVT_BACKUP_FONTS */
1041
1042 /*---------------------------------------------------------------------------
1043
1044         VT220 attributes -> internal emulator attributes conversion tables
1045
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)!
1050
1051 ---------------------------------------------------------------------------*/
1052
1053 /* color displays */
1054
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*/
1072 };
1073
1074 /* monochrome displays (VGA version, no intensity) */
1075
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*/
1093 };
1094
1095 /* monochrome displays (MDA version, with intensity) */
1096
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 */
1114 };
1115
1116 #else /* WAS_EXTERN */
1117
1118 extern u_char           vga_type;
1119 extern struct tty       *pcconsp;
1120 extern video_state      *vsp;
1121
1122 #if PCVT_EMU_MOUSE
1123 extern struct mousestat mouse;
1124 extern struct mousedefs mousedef;
1125 #endif /* PCVT_EMU_MOUSE */
1126
1127 #if PCVT_USL_VT_COMPAT
1128 extern int              vt_switch_pending;
1129 #endif /* PCVT_USL_VT_COMPAT */
1130
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_ */
1156
1157 #if PCVT_SHOWKEYS
1158 extern u_char           keyboard_show;
1159 #endif /* PCVT_SHOWKEYS */
1160
1161 extern  u_char  cursor_pos_valid;
1162
1163 extern  u_char  critical_scroll;
1164 extern  int     switch_page;
1165
1166 #if PCVT_SCREENSAVER
1167 extern  u_char  reset_screen_saver;
1168 extern  u_char  scrnsv_active;
1169 #endif /* PCVT_SCREENSAVER */
1170
1171 extern u_char           sgr_tab_color[];
1172 extern u_char           sgr_tab_mono[];
1173 extern u_char           sgr_tab_imono[];
1174
1175 #ifdef XSERVER
1176 extern unsigned         scrnsv_timeout;
1177 extern u_char           pcvt_xmode;
1178 extern u_char           pcvt_kbd_raw;
1179 #endif /* XSERVER */
1180
1181 #if PCVT_BACKUP_FONTS
1182 extern u_char           *saved_charsets[NVGAFONTS];
1183 #endif /* PCVT_BACKUP_FONTS */
1184
1185 #endif  /* WAS_EXTERN */
1186
1187 /*
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).
1193  *
1194  * The macros below are used to clarify which type a parameter ought to
1195  * be, regardless of its actual promotion to "int".
1196  */
1197
1198 #define Dev_t   int
1199 #define U_short int
1200 #define U_char  int
1201
1202 /*
1203  * In FreeBSD >= 2.0, dev_t has type `unsigned long', so promoting it
1204  * doesn't cause any problems in prototypes.
1205  */
1206
1207 #if PCVT_FREEBSD >= 200
1208 #undef Dev_t
1209 #define Dev_t   dev_t
1210 #endif
1211
1212 #if !PCVT_FREEBSD || (PCVT_FREEBSD < 210)
1213 extern void bcopyb(void *from, void *to, u_int length);
1214 #endif
1215
1216 #if !PCVT_FREEBSD || (PCVT_FREEBSD < 200)
1217 extern void fillw(U_short value, void *addr, u_int length);
1218 #endif
1219
1220 int     pcparam ( struct tty *tp, struct termios *t );
1221
1222 /*
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.
1225  */
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 );
1232 #endif
1233
1234 ointhand2_t     pcrint;
1235 void    pcstart ( struct tty *tp );
1236 void    pcstop ( struct tty *tp, int flag );
1237
1238 # if PCVT_FREEBSD < 200
1239 void    consinit ( void );
1240 # endif
1241
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,
1245                       struct proc *);
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);
1250 #else
1251 void    vgapage ( int n );
1252 #endif /* PCVT_USL_VT_COMPAT */
1253
1254 #if PCVT_EMU_MOUSE
1255 int     mouse_ioctl ( Dev_t dev, int cmd, caddr_t data );
1256 #endif /*  PCVT_EMU_MOUSE */
1257
1258 #if PCVT_SCREENSAVER
1259 void    pcvt_scrnsv_reset ( void );
1260 #endif /* PCVT_SCREENSAVER */
1261
1262 #if PCVT_SCREENSAVER && defined(XSERVER)
1263 void    pcvt_set_scrnsv_tmo ( int );
1264 #endif /* PCVT_SCREENSAVER && defined(XSERVER) */
1265
1266 void    vga_move_charset ( unsigned n, unsigned char *b, int save_it);
1267
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 );
1285
1286 #if PCVT_SCANSET > 1
1287 void    kbd_emulate_pc(int do_emulation);
1288 #endif
1289
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 );
1374
1375 #ifdef PCVT_INCLUDE_VT_SELATTR
1376
1377 #define INT_BITS        (sizeof(unsigned int) * 8)
1378 #define INT_INDEX(n)    ((n) / INT_BITS)
1379 #define BIT_INDEX(n)    ((n) % INT_BITS)
1380
1381 /*---------------------------------------------------------------------------*
1382  *      set selective attribute if appropriate
1383  *---------------------------------------------------------------------------*/
1384 static __inline void vt_selattr(struct video_state *svsp)
1385 {
1386         int i;
1387
1388         i = (svsp->Crtat + svsp->cur_offset) - svsp->Crtat;
1389
1390         if(svsp->selchar)
1391                 svsp->decsca[INT_INDEX(i)] |=  (1 << BIT_INDEX(i));
1392         else
1393                 svsp->decsca[INT_INDEX(i)] &= ~(1 << BIT_INDEX(i));
1394 }
1395
1396 #endif /* PCVT_INCLUDE_VT_SELATTR */
1397
1398
1399 /*---------------------------------------------------------------------------*
1400  *      produce 7 us delay accessing the keyboard controller
1401  *---------------------------------------------------------------------------*/
1402
1403 #if PCVT_PORTIO_DELAY
1404                                 /* use multiple dummy accesses to port    */
1405                                 /* 0x84 to produce keyboard controller    */
1406                                 /* access delays                          */
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); }
1414
1415 #else /* PCVT_PORTIO_DELAY */
1416                                 /* use system supplied delay function for */
1417                                 /* producing delays for accesssing the    */
1418                                 /* keyboard controller                    */
1419 #if PCVT_NETBSD > 9
1420 #define PCVT_KBD_DELAY()        delay(7)
1421 #elif PCVT_FREEBSD || (PCVT_NETBSD <= 9)
1422 #define PCVT_KBD_DELAY()        DELAY(7)
1423 #endif
1424 #endif /* PCVT_PORTIO_DELAY */
1425
1426 /*---------------------------------- E O F ----------------------------------*/