summaryrefslogtreecommitdiff
path: root/sys/arch/i386/isa/pcvt/pcvt_hdr.h
blob: 222d09e839e9f67ac486287a15efa8f839e84e28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
/*	$OpenBSD: pcvt_hdr.h,v 1.7 1996/04/21 22:17:09 deraadt Exp $	*/

/*
 * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch.
 *
 * Copyright (c) 1992, 1993 Brian Dunford-Shore.
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by
 *	Hellmuth Michaelis, Brian Dunford-Shore and Joerg Wunsch.
 * 4. The name authors may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * @(#)pcvt_hdr.h, 3.32, Last Edit-Date: [Tue Oct  3 11:19:48 1995]
 *
 */

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

#define	PCVT_REL "3.32"		/* driver attach announcement	*/
				/* see also: pcvt_ioctl.h	*/

#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/ioctl.h>
#include <sys/proc.h>
#include <sys/user.h>
#include <sys/tty.h>
#include <sys/uio.h>
#include <sys/callout.h>
#include <sys/kernel.h>
#include <sys/syslog.h>
#include <sys/malloc.h>
#include <sys/time.h>

#include "pcvt_conf.h"

#if PCVT_NETBSD > 9
#include <sys/device.h>
#endif

#if PCVT_NETBSD > 9
#if PCVT_NETBSD > 101
#include <i386/isa/isa_machdep.h>
#include <dev/isa/isavar.h>
#else
#include <i386/isa/isavar.h>
#endif
#include <machine/cpufunc.h>
#else
#include <i386/isa/isa_device.h>
#endif

#include <i386/isa/icu.h>

#if PCVT_NETBSD > 100
#if PCVT_NETBSD > 101
#include <dev/isa/isareg.h>
#else
#include <i386/isa/isareg.h>
#endif
#else
#include <i386/isa/isa.h>
#endif

#if PCVT_NETBSD > 9
#include <dev/cons.h>
#if PCVT_NETBSD > 100
#include <dev/ic/mc146818reg.h>
#include <i386/isa/nvram.h>
#endif
#else
#include <i386/i386/cons.h>
#endif

#if PCVT_NETBSD <= 9
#include <machine/psl.h>
#include <machine/frame.h>
#endif /* PCVT_NETBSD <= 9 */

#include <machine/stdarg.h>

#if PCVT_NETBSD > 9
#include "pcvt_ioctl.h"
#else
#include <machine/pcvt_ioctl.h>
#endif

#include <machine/pc/display.h>
#if PCVT_FREEBSD > 200
#include <machine/clock.h>
#include <machine/md_var.h>
#endif
#include <vm/vm_kern.h>

#if PCVT_FREEBSD > 205
#include <sys/devconf.h>
#endif

/* setup irq disable function to use */

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

/* perform option consistency checks */

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

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

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

#ifdef XSERVER

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

/* PCVT_BACKUP_FONTS is mandatory for XSERVER */
#undef PCVT_BACKUP_FONTS
#define PCVT_BACKUP_FONTS 1

#endif /* XSERVER */

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

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

#if PCVT_NETBSD
#if PCVT_NETBSD == 9
#include <machine/cpufunc.h>	/* NetBSD 0.9 [...and earlier -currents] */
#else
#include <machine/pio.h>	/* recent NetBSD -currents */
#define NEW_AVERUNNABLE		/* averunnable changes for younger currents */
#endif /* PCVT_NETBSD == 9 */
#endif /* PCVT_NETBSD */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/* internal Keyboard Type */

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

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

#if PCVT_NETBSD > 100
#define EQ_EGAVGA	NVRAM_EQUIPMENT_EGAVGA
#define EQ_40COLOR	NVRAM_EQUIPMENT_COLOR40
#define EQ_80COLOR	NVRAM_EQUIPMENT_COLOR80
#define EQ_80MONO	NVRAM_EQUIPMENT_MONO80
#else
#define RTC_EQUIPMENT	0x14	/* equipment byte in cmos ram	*/
#define EQ_EGAVGA	0	/* reserved (= ega/vga)		*/
#define EQ_40COLOR	1	/* display = 40 col color	*/
#define EQ_80COLOR	2	/* display = 80 col color	*/
#define EQ_80MONO	3	/* display = 80 col mono	*/
#endif

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

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

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

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

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

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

#define	CRTC_ADDR	0x00		/* index register */

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

/* start of ET4000 extensions */

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

/* start of WD/Paradise extensions */

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

#define CRTC_V7ID	0x1f		/* identification register */

/* Trident */

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

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

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

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

/* ET4000 only */

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

/* WD/Paradise only */

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

/* Video 7 */

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

/* Trident */

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

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

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

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

/* WD/Paradise only */

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

/* Video 7 */

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

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

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

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

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

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

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

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

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

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

/* tab setting */

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

/* escape detection state machine */

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

/* for storing escape sequence parameters */

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

/* terminal responses */

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

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

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

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

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

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

#define SHP_INIT	0

/* esc & f family */

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

/* esc & j family */

#define SHP_AND_J	9
#define SHP_AND_JL	10

/* esc & every-thing-else */

#define SHP_AND_ETE	11

/* additionals for function key labels */

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

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

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

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

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

/* switch 80/132 columns */

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

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

/* screen memory start, monochrome */

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

/* screen memory start, color */

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

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

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

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

/* charset tables */

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

/* charset designations */

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

/* which fkey-labels */

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

/* variables */

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

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

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

#if !PCVT_EMU_MOUSE

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

#else /* PCVT_EMU_MOUSE */

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

#endif /* PCVT_EMU_MOUSE */

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

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

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

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

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

/* used to be able to pass ERESTART on properly */
#define PCVT_ERESTART (ELAST + 1)

/* possible states for video_state.vt_status: */

#define	VT_WAIT_REL 1			/* wait till process released vt */
#define VT_WAIT_ACK 2			/* wait till process ack vt acquire */
#define VT_GRAFX    4			/* vt runs graphics mode */
#define VT_WAIT_ACT 8			/* a process is sleeping on this vt */

/* struct describing one slot in the font ram */

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

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

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

#ifdef WAS_EXTERN

#if PCVT_NETBSD > 9

#if PCVT_NETBSD > 101
struct vt_softc {
	struct	device sc_dev;
	void	*sc_ih;
};
#endif /* PCVT_NETBSD > 101 */

int pcprobe ();
void pcattach ();

#if PCVT_NETBSD > 110
struct cfattach vt_ca = {
	sizeof(struct vt_softc), pcprobe, pcattach
};

struct cfdriver vt_cd = {
	NULL, "vt", DV_TTY
};
#else /* !PCVT_NETBSD > 110 */
#if PCVT_NETBSD > 101
struct cfdriver vtcd = {
	NULL, "vt", pcprobe, pcattach, DV_TTY, sizeof(struct vt_softc)
};
#else /* !PCVT_NETBSD > 101 */
struct cfdriver vtcd = {
	NULL, "vt", pcprobe, pcattach, DV_TTY, sizeof(struct device)
};
#endif /* PCVT_NETBSD > 101 */
#endif /* PCVT_NETBSD > 110 */

#else /* !PCVT_NETBSD > 9 */

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

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

#endif /* PCVT_NETBSD > 9 */

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

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

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

#if PCVT_NETBSD > 101
u_short *Crtat;			/* screen start address */
#endif /* PCVT_NETBSD > 101 */

#endif /* PCVT_NETBSD */

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

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

int	vt_switch_pending	= 0; 		/* if > 0, a vt switch is */
						/* of the old vt + 1 */
u_int	addr_6845		= MONO_BASE;	/* crtc base addr */
u_char	do_initialization	= 1;		/* we have to init ourselves */
u_char	pcvt_is_console		= 0;		/* until we know it */
u_char 	shift_down 		= 0;		/* shift key down flag */
u_char	ctrl_down		= 0; 		/* ctrl key down flag */
u_char	meta_down		= 0; 		/* alt key down flag */
u_char	altgr_down		= 0; 		/* altgr key down flag */
u_char	kbrepflag		= 1;		/* key repeat flag */
u_char	totalscreens		= 1;		/* screens available */
u_char	current_video_screen	= 0;		/* displayed screen no */
u_char	adaptor_type 		= UNKNOWN_ADAPTOR;/* adaptor type */
u_char 	vga_type 		= VGA_UNKNOWN;	/* vga chipset */
u_char	can_do_132col		= 0;		/* vga chipset can 132 cols */
u_char	vga_family		= 0;		/* vga manufacturer */
u_char	totalfonts		= 0;		/* fonts available */
u_char	chargen_access		= 0;		/* synchronize access */
u_char	keyboard_type		= KB_UNKNOWN;	/* type of keyboard */
u_char	keyboard_is_initialized = 0;		/* for ddb sanity */
u_char	kbd_polling		= 0;		/* keyboard is being polled */

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

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

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

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

#if XSERVER || PCVT_SCREENSAVER
unsigned scrnsv_timeout		= 0;		/* initially off */
#endif /* XSERVER || PCVT_SCREENSAVER */

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

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

	VT220 attributes -> internal emulator attributes conversion tables

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

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

/* color displays */

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

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

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

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

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

#else /* WAS_EXTERN */

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

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

extern int		vt_switch_pending;
extern u_int		addr_6845;
extern u_short		*Crtat;
extern struct isa_driver vtdriver;
extern u_char		do_initialization;
extern u_char		pcvt_is_console;
extern u_char		bgansitopc[];
extern u_char		fgansitopc[];
extern u_char 		shift_down;
extern u_char		ctrl_down;
extern u_char		meta_down;
extern u_char		altgr_down;
extern u_char		kbrepflag;
extern u_char		adaptor_type;
extern u_char		current_video_screen;
extern u_char		totalfonts;
extern u_char		totalscreens;
extern u_char		chargen_access;
extern u_char		keyboard_type;
extern u_char		can_do_132col;
extern u_char		vga_family;
extern u_char		keyboard_is_initialized;
extern u_char		kbd_polling;

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

u_char	cursor_pos_valid;

u_char	critical_scroll;
int	switch_page;

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

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

#if defined(XSERVER) || PCVT_SCREENSAVER
extern unsigned		scrnsv_timeout;
#endif /* XSERVER || PCVT_SCREENSAVER */

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

#endif	/* WAS_EXTERN */

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


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

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

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

/* in FreeBSD > 102 arguments for timeout()/untimeout() are a special type */

#if PCVT_FREEBSD > 102
#define	TIMEOUT_FUNC_T	timeout_func_t
#else
#define	TIMEOUT_FUNC_T	void *
#endif

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

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

int	pcopen ( Dev_t dev, int flag, int mode, struct proc *p );
int	pcclose ( Dev_t dev, int flag, int mode, struct proc *p );
int	pcread ( Dev_t dev, struct uio *uio, int flag );
int	pcwrite ( Dev_t dev, struct uio *uio, int flag );
int	pcioctl ( Dev_t dev, int cmd, caddr_t data, int flag, struct proc *p );
int	pcmmap ( Dev_t dev, int offset, int nprot );
#if PCVT_FREEBSD > 205
struct tty *pcdevtotty ( Dev_t dev );
#endif /* PCVT_FREEBSD > 205 */

#if PCVT_NETBSD
#if PCVT_NETBSD > 101
struct tty *
	pctty ( Dev_t dev );
int	pcintr ( void *arg);
void	pccnprobe ( struct consdev *cp );
void	pccninit ( struct consdev *cp );
void	pccnputc ( Dev_t dev, U_char c );
#else
int	pcrint ( void );
int	pccnprobe ( struct consdev *cp );
int	pccninit ( struct consdev *cp );
int	pccnputc ( Dev_t dev, U_char c );
#endif
int	pccngetc ( Dev_t dev );
#endif /* PCVT_NETBSD */

int	pcparam ( struct tty *tp, struct termios *t );
void	pcstart ( struct tty *tp );
void	pcstop ( struct tty *tp, int flag );

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

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

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

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

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

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

#ifdef XSERVER
void	vga_move_charset ( unsigned n, unsigned char *b, int save_it);
#endif /* XSERVER */

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

#ifdef PCVT_INCLUDE_VT_SELATTR

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

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

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

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

#endif /* PCVT_INCLUDE_VT_SELATTR */


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

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

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

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