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
|
/*
* 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 */
/* arguments to async_update() */
#define UPDATE_START 0 /* do cursor update and requeue */
#define UPDATE_STOP 1 /* suspend cursor updates */
#define UPDATE_KERN 2 /* do cursor updates for kernel output */
/* variables */
#ifdef EXTERN
#define WAS_EXTERN
#else
#define EXTERN extern
#endif
EXTERN u_char *more_chars; /* response buffer via kbd */
EXTERN int char_count; /* response char count */
EXTERN u_char color; /* color or mono display */
EXTERN u_short kern_attr; /* kernel messages char attributes */
EXTERN u_short user_attr; /* character attributes */
#if !PCVT_EMU_MOUSE
#if PCVT_NETBSD
EXTERN struct tty *pc_tty[PCVT_NSCREENS];
#elif !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200)
EXTERN struct tty pccons[PCVT_NSCREENS];
#else
EXTERN struct tty *pccons[PCVT_NSCREENS];
#endif /* PCVT_NETBSD */
#else /* PCVT_EMU_MOUSE */
#if PCVT_NETBSD
EXTERN struct tty *pc_tty[PCVT_NSCREENS + 1];
#elif !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200)
EXTERN struct tty pccons[PCVT_NSCREENS + 1];
#else
EXTERN struct tty *pccons[PCVT_NSCREENS + 1];
#endif
#endif /* PCVT_EMU_MOUSE */
struct sixels {
u_char lower[MAXSIXEL]; /* lower half of char */
u_char upper[MAXSIXEL]; /* upper half of char */
};
struct udkentry {
u_char first[MAXUDKEYS]; /* index to first char */
u_char length[MAXUDKEYS]; /* length of this entry */
};
/* VGA palette handling */
struct rgb {
u_char r, g, b; /* red/green/blue, valid 0..VGA_PMSK */
};
typedef struct video_state {
u_short *Crtat; /* video page start addr */
u_short *Memory; /* malloc'ed memory start address */
struct tty *vs_tty; /* pointer to this screen's tty */
u_char maxcol; /* 80 or 132 cols on screen */
u_char row, col; /* current cursor position */
u_short c_attr; /* current character attributes */
u_char vtsgr; /* current sgr configuration */
u_short cur_offset; /* current cursor position offset */
u_char bell_on; /* flag, bell enabled */
u_char sevenbit; /* flag, data path 7 bits wide */
u_char dis_fnc; /* flag, display functions enable */
u_char transparent; /* flag, mk path tmp trnsprnt for ctls*/
u_char 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 > 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 */
#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 ( int arg );
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 ----------------------------------*/
|