diff options
author | phk <phk@FreeBSD.org> | 1998-12-27 12:52:46 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1998-12-27 12:52:46 +0000 |
commit | eb15c87aad94ce69d22c6cbaf4c91c7678b3f397 (patch) | |
tree | ccc8377c79b41e897bf40d83561b0f8e19fa8f8a | |
parent | 2225f39db313f8cdb0b0f115337955924684df79 (diff) | |
download | FreeBSD-src-eb15c87aad94ce69d22c6cbaf4c91c7678b3f397.zip FreeBSD-src-eb15c87aad94ce69d22c6cbaf4c91c7678b3f397.tar.gz |
Pre 3.0 branch cleanup casualty #4: pcvt
-rw-r--r-- | share/man/man4/man4.i386/Makefile | 5 | ||||
-rw-r--r-- | share/man/man4/man4.i386/pcvt.4 | 910 | ||||
-rw-r--r-- | share/man/man4/pcvt.4 | 910 | ||||
-rw-r--r-- | sys/amd64/conf/GENERIC | 9 | ||||
-rw-r--r-- | sys/conf/NOTES | 9 | ||||
-rw-r--r-- | sys/conf/files.i386 | 8 | ||||
-rw-r--r-- | sys/i386/conf/GENERIC | 9 | ||||
-rw-r--r-- | sys/i386/conf/LINT | 9 | ||||
-rw-r--r-- | sys/i386/conf/NOTES | 9 | ||||
-rw-r--r-- | sys/i386/conf/files.i386 | 8 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_conf.h | 477 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_drv.c | 1641 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_ext.c | 2835 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_hdr.h | 1418 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_kbd.c | 3321 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_kbd.h | 567 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_out.c | 2182 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_sup.c | 2216 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_tbl.h | 475 | ||||
-rw-r--r-- | sys/i386/isa/pcvt/pcvt_vtf.c | 2187 |
20 files changed, 9 insertions, 19196 deletions
diff --git a/share/man/man4/man4.i386/Makefile b/share/man/man4/man4.i386/Makefile index 3e91492..f976e26 100644 --- a/share/man/man4/man4.i386/Makefile +++ b/share/man/man4/man4.i386/Makefile @@ -1,11 +1,11 @@ -# $Id: Makefile,v 1.89 1998/12/22 09:36:29 joerg Exp $ +# $Id: Makefile,v 1.90 1998/12/27 12:44:49 phk Exp $ MAN4= adv.4 adw.4 aha.4 ahb.4 ahc.4 aic.4 alog.4 apm.4 ar.4 asc.4 bktr.4 \ bt.4 cs.4 cx.4 cy.4 de.4 \ dgb.4 dpt.4 ed.4 el.4 en.4 ep.4 ex.4 fdc.4 fe.4 fxp.4 gsc.4 ie.4 \ io.4 joy.4 keyboard.4 labpc.4 le.4 lnc.4 lp.4 lpt.4 matcd.4 mcd.4 \ mem.4 meteor.4 mouse.4 mse.4 mtio.4 mx.4 nca.4 ncr.4 npx.4 \ - pcf.4 pcm.4 pcvt.4 perfmon.4 pn.4 pnp.4 ppc.4 psm.4 \ + pcf.4 pcm.4 perfmon.4 pn.4 pnp.4 ppc.4 psm.4 \ rdp.4 rl.4 sb.4 scd.4 screen.4 sea.4 si.4 sio.4 \ spkr.4 sr.4 sysmouse.4 tl.4 tw.4 tx.4 uha.4 vr.4 vx.4 \ wb.4 wd.4 wfd.4 wl.4 wt.4 xl.4 ze.4 zp.4 @@ -59,7 +59,6 @@ MLINKS+= ncr.4 ../ncr.4 MLINKS+= npx.4 ../npx.4 MLINKS+= pcf.4 ../pcf.4 MLINKS+= pcm.4 ../pcm.4 -MLINKS+= pcvt.4 vt.4 pcvt.4 ../pcvt.4 pcvt.4 ../vt.4 MLINKS+= perfmon.4 ../perfmon.4 MLINKS+= pn.4 ../pn.4 MLINKS+= pnp.4 ../pnp.4 diff --git a/share/man/man4/man4.i386/pcvt.4 b/share/man/man4/man4.i386/pcvt.4 deleted file mode 100644 index 144675a..0000000 --- a/share/man/man4/man4.i386/pcvt.4 +++ /dev/null @@ -1,910 +0,0 @@ -.\" -.\" Copyright (c) 1992, 1995 Hellmuth Michaelis, Brian Dunford-Shore, -.\" Joerg Wunsch and Holger Veit. -.\" -.\" 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, Joerg Wunsch and Holger Veit. -.\" 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.4, 3.20, Last Edit-Date: [Sun Apr 2 18:23:39 1995] -.\" $Id: pcvt.4,v 1.11 1998/08/26 02:46:24 jkoshy Exp $ -.\" -.\" Man page pcvt(4) created after pcvt_ioctl.h on 13-Jan-93 -.\" by Joerg Wunsch -.\" -.\" updated for rel 2.10 (-hm) -.\" updated for rel 2.20 (-hm) -.\" updated for rel 3.00 (-jw) -.\" updated for final rel 3.00 (-hm) -.\" removed references to 386BSD (-hm) -.\" -.Dd February 27, 1994 -.Dt PCVT 4 i386 -.Sh NAME -.Nm pcvt , -.Nm vt -.Nd PC console virtual screen system -.Sh SYNOPSIS -options -.Do -.Em PCVT_FREEBSD = version -| -.Em PCVT_NETBSD = version -.Dc -.br -.Op options Dq Em PCVT_NSCREENS = number -.br -.Op options Dq Em PCVT_XXXX -.Po -see -.Sx Configuration -below -.Pc -.Pp -.Cd "device vt0 at isa? port IO_KBD tty irq 1" -.Sh DESCRIPTION -.Ss Overview -The -.Nm pcvt -driver provides a virtual screen system with several additional -features not available in historic console drivers. -Besides the ability of handling -multiple virtual screens, -the probably most important is an emulation of a wide range -of DEC VT-220 -.if t \(tm -.if n (TM) -functionality. See -.Sx Features -for a detailed description. - -.Ss Features -.Bl -bullet -.It -Almost full DEC VT220 -.if t \(tm -.if n (TM) -functionality -.Po -moving towards VT320 -.if t \(tm -.if n (TM) -.Pc -.It -Completely independent virtual terminals for MDA/HGC/CGA/EGA and VGA -.It -25, 28, 35, 40, 43 or 50x80 screen resolution for each virtual screen -.It -Fully remappable keyboard to support national keyboards -.It -All VT220 character sets plus ISO Latin-1 and DEC technical supported -.It -VT220 downloadable character set supported when run on EGA/VGA -.It -VT220 user defined keys for each virtual terminal -.It -Optional function key label support -.if t \('a -.if n 'a -la Hewlett-Packard -.It -Display function codes functionality -.It -Support for MDA, CGA, EGA and VGA display adaptors -.It -Support for 132 column operation on VGA chipsets -.It -X Window Support for XFree86 >= 1.2 using the pccons model, or -for XFree86 >= 2.0 using the syscons model -.Po -requires -.Em PCVT_USL_VT_COMPAT -to be configured -.Pc -.El - -What it cannot: -.Bl -bullet -.It -No double wide/high characters -.It -No softscroll -.It -No inverse background -.It -No VT220 printer output support -.It -No VT52 support at all -.It -No 8-bit controls -.It -Only limited AT-keyboard -.Pq 84 keys -support -.Pq yet -.It -Help you to make money... -.El - -.Ss Configuration -The -.Nm pcvt -console driver is currently available for the Intel-based BSD operating -systems -.Tn NetBSD/i386 -(release 0.9 or higher), -and -.Tn FreeBSD -(release 1.0-GAMMA or higher) . -In order to get the appropriate system support, one of the options -.Em PCVT_NETBSD , -or -.Em PCVT_FREEBSD -must be defined in the system's config file -.Pq see Xr config 8 . -In addition, for the -.Tn FreeBSD -and -.Tn NetBSD -operating systems, it is necessary to set this option to the operating -system's version number. -For -.Tn FreeBSD -this version number must be expressed as a 3-digit number. -E.\& g., if you are running the 1.0 release -.Pq which is actually version 1.0.2 , -you should define - -.Em PCVT_FREEBSD = 102 - -For -.Em NetBSD -this version number must be expressed as 9 if you are running NetBSD 0.9 -and anything greater than 9 for NetBSD-current (pre 1.0). It is recommended -to use (as with -.Tn FreeBSD ) -100 for -.Nx 1.0 -and 999 for -.Tn NetBSD-current. -E.g., if you are running the -.Nx 1.0 -release, you should define - -.Em PCVT_NETBSD = 100 - -The -.Nm pcvt -driver has been designed to be highly configurable in order to satisfy -everyone's needs. The preferred way for those configurations is to -provide appropriate -.Em options -lines within the config file, possibly overriding the built-in default -values. Therefore it is possible to compile several distinct kernels -with different driver behaviour on a single machine. - -The following list gives a short overview of the available configuration -options. Refer to the file -.Pa i386/isa/pcvt/pcvt_hdr.h -in the kernel source tree for detailed documentation. - -Note: the following conventions apply to all the Boolean options. -If an option is given with no value, a value of 1 -.Pq activated -is substituted. If an option value is given as 0, this options is -deactivated. Any other value is substituted by 1, too. If an option -is omitted, a built-in default is assumed. - -.Bl -tag -width indent -compact - -.It Em PCVT_NSCREENS -Defines the number of virtual screens. -.br -Default: 8 - -.It Em PCVT_VT220KEYB -If activated, a keyboard layout resembling a DEC VT200 (TM) is generated. -If deactivated, a mixture between VT220 and HP is used. See the files -.Pa Keyboard.VT -and -.Pa Keyboard.HP -in the -.Nm pcvt -documentation directory for a full description. -.br -Default: off - -.It Em PCVT_SCREENSAVER -Enables the builtin screensaver feature. -.br -Default: on - -.It Em PCVT_PRETTYSCRNS -If enabled, a blinking-star screensaver is used. If disabled, the screen -is simply blanked -.Pq which might be useful for energy-saving monitors . -.br -Default: on - -.It Em PCVT_CTRL_ALT_DEL -If enabled, the key combination -.Aq Em Ctrl -.Aq Em Alt -.Aq Em Del -invokes a CPU reset. -.br -Default: off - -.It Em PCVT_USEKBDSEC -Do NOT override a security lock for the keyboard. -.br -Default: on - -.It Em PCVT_24LINESDEF -If enabled, the 25-line modi -.Po -VT emulation with 25 lines, and HP emulation with 28 lines -.Pc -default to 24 lines only to provide a better compatibility to the -original DEV VT220 (TM). Thus it should be possible to use the -terminal information for those terminals without further changes. -Note that this is a startup option; it is possible to toggle between -the 24- and 25-lines' display by the -.Xr scon 1 -utility. -.br -Default: off - -.It Em PCVT_EMU_MOUSE -Emulate a three-button mouse via the keypad. Useful for notebooks when -running XFree86. See -.Sx Mouse emulation -below. -.br -Default: off - -.It Em PCVT_META_ESC -If enabled, a sequence composed of -.Aq Em esc , -followed by the normal key code is emitted if a key is pressed with the -.Aq Em Alt -key modifier. If disabled, then normal key code with the value -.Em 0x80 -added is sent. -.br -Default: off - -.El - -Note that there are further options available which are mainly used for -debugging purposes or as a workaround for hardware problems. They are -found in -.Pa i386/isa/pcvt/pcvt_hdr.h -along with their documentation. - -.Ss Internal Functions -The functionality described below may be accessed via -.Xr ioctl 2 -system calls with a file descriptor opened on a device node -related to the -.Nm pcvt -driver. -To make use of them, a program should contain the following line: - - -.Dl #include <machine/pcvt_ioctl.h> - -Any parameter definitions cited below can be found in that file. - - -.Em Keyboard related functions - -Three functions are related to basic keyboard hardware: - -.Bl -tag -width 20n -offset indent -compact -.It KBDRESET -reset keyboard, set defaults; -.It KBDGTPMAT -get current typematic value, parameter is a pointer to int where -the values is stored to; -.It KBDSTPMAT -set current typematic value, similar to above command. -.El - -Symbolic values are available for the appropriate constants. -To specify the initial typematic delay time, they are -KBD_TPD250 for 250 ms through -KBD_TPD1000 for 1000 ms, in steps of 250 ms. The typematic repeat -rates are -KBD_TPM300, specifying 30.0 characters per second through -KBD_TPM20 for 2.0 characters per second. The intermediate values -are: 30.0, 26.7, 24.0, 21.8, 20.0, 18.5, 17.1, 16.0, 15.0, 13.3, -12.0, 10.9, 10.0, 9.2, 8.6, 8.0, 7.5, 6.7, 6.0, 5.5, 5.0, 4.6, 4.3, -4.0, 3.7, 3.3, 3.0, 2.7, 2.5, 2.3, 2.1, 2.0 characters per second. - - -.Bl -tag -width 20n -offset indent -compact -.It KBDGREPSW -get key repetition switch, and -.It KBDSREPSW -set key repetition switch -.El - -again take a pointer to int as argument. They manipulate the -drivers internal keyboard repetition flag, possible values are: -KBD_REPEATOFF or KBD_REPEATON. - - -.Bl -tag -width 20n -offset indent -compact -.It KBDGLEDS -get LED state, and -.It KBDSLEDS -set LED state manipulate the keyboard indicators, but do not influence -the drivers idea of lock key state. -.El - -The int where the argument points to -may have the values -KBD_SCROLLLOCK, KBD_NUMLOCK, KBD_CAPSLOCK, which may be used in any -conjunction. - -.Bl -tag -width 20n -offset indent -compact -.It KBDGLOCK -gets state of SCROLL,NUM,CAPS, and -.It KBDSLOCK -sets state of SCROLL,NUM,CAPS + LEDs -.El - -should be used in a same manner to get/set the drivers internal -LED flags. - - -.Em Keyboard remapping - -One important feature of the -.Nm pcvt -driver is its ability to overload the built in key definition. - -.Bl -tag -width 20n -offset indent -compact -.It KBDGCKEY -get current key values, -.It KBDSCKEY -set new key assignment values, and -.It KBDGOKEY -get original key assignment values -.El - -arrange those functions. The take a pointer to a -.Em struct kbd_ovlkey -as argument as described below. In addition, - -.Bl -tag -width 20n -offset indent -compact -.It KBDRMKEY -removes a key assignment, taking a pointer to an int as argument which -contains the affected key number; -.It KBDDEFAULT -removes all key assignments. -.El -.Bd -literal -struct kbd_ovlkey /* complete definition of a key */ -{ - u_short keynum; /* the key itself */ - u_short type; /* type of key, see below */ - u_char subu; /* subtype, ignored on write */ - char unshift[KBDMAXOVLKEYSIZE+1]; /* emitted string, unshifted */ - u_char subs; /* subtype, ignored on write */ - char shift[KBDMAXOVLKEYSIZE+1]; /* emitted string, shifted */ - u_char subc; /* subtype, ignored on write */ - char ctrl[KBDMAXOVLKEYSIZE+1]; /* emitted string, control */ - u_char suba; /* subtype, ignored on write */ - char altgr[KBDMAXOVLKEYSIZE+1]; /* emitted string, altgr */ -}; -.Ed - -The appropriate values for the -.Em type -field are: - -.Bl -tag -width 20n -offset indent -compact -.It KBD_NONE -no function, key is disabled, -.It KBD_SHIFT -keyboard shift, -.It KBD_META -alternate shift, sets bit8 to ASCII code, -.It KBD_NUM -numeric shift, keypad numeric / application mode, -.It KBD_CTL -control code generation, -.It KBD_CAPS -caps shift - swaps case of letter, -.It KBD_ASCII -ASCII code generating key, -.It KBD_SCROLL -stop output, -.It KBD_FUNC -function key, -.It KBD_KP -keypad keys, -.It KBD_BREAK -ignored, -.It KBD_ALTGR -AltGr translation feature, -.It KBD_SHFTLOCK -shift lock, -.It KBD_CURSOR -cursor keys, and -.It KBD_RETURN -.Dq Return -or -.Dq Enter -keys. -.El - -The -.Em subtype -field contains one of the values - -.Bl -tag -width 20n -offset indent -compact -.It KBD_SUBT_STR -key is bound to a string, or -.It KBD_SUBT_FNC -key is bound to a function. -.El - -.Em Mouse emulation - -The mouse emulator -.Pq if configured in -fakes a three-button mouse using the Mouse Systems protocol. The first -.Nm pcvt -device node not used by a virtual screen is the mouse device. I.\& e., -for the default value of 8 virtual screens, -.Pa /dev/ttyv0 -through -.Pa /dev/ttyv7 -would refer to the virtual screens, and -.Pa /dev/ttyv8 -were the mouse emulator device. The mouse emulation is turned on by -pressing the -.Aq Em NumLock -key. The pointer is moved by the numerical keypad keys, into the -obvious directions. The pointer is initially moved in single steps, -and is accelerated after an adjustable time -.Pq default: 500 ms -by about 6 times. The mouse buttons are emulated by three normal -keys, by default the function keys -.Aq Em \&F1 , -.Aq Em \&F2 , -and -.Aq Em \&F3 . -There are two selectable flavors available: normal and -.Dq sticky -buttons. Normal buttons behave as expected. -.Dq Sticky -buttons are notified as button-press on the first keypress. They -.Dq stick -until the key is pressed again -.Pq or another button-emulating key instead . -Button presses and releases are notified to the user by a simple -.Dq pling , -or -.Dq plong , -respectively, generated from the PC's built-in speaker. - -The following commands control the emulation. - -.Bl -tag -width 20n -offset indent -compact -.It KBDMOUSEGET -get the current definitions, and -.It KBDMOUSESET -set new definitions. -.El - -Both accept a -.Li struct mousedefs * -as the third argument to the ioctl call: -.Bd -literal -struct mousedefs { - int leftbutton; /* (PC) scan code for "left button" key */ - int middlebutton; /* (PC) scan code for "mid button" key */ - int rightbutton; /* (PC) scan code for "right button" key */ - int stickybuttons; /* if true, the buttons are "sticky" */ - int acceltime; /* timeout in microseconds to start pointer */ - /* movement acceleration */ - /* defaults to: scan(F1), scan(F2), scan(F3), false, 500000 */ -}; -.Ed - - -.Em Downloadable character set interface - -EGA and VGA video adaptors provide the capability of downloadable -software fonts. Since the -.Sq native character set -of any IBM-compatible PC video board does not allow the full interpretation -of DEC multinational character set or ISO Latin-1 -.Pq ISO 8859-1 , -this might be very useful for a U**X environment. - -.Bl -tag -width 20n -offset indent -compact -.It VGASETFONTATTR -set font attr, and -.It VGAGETFONTATTR -get font attr -.El - -are used to manipulate the drivers information about a downloaded -font. The take a pointer to a -.Em struct vgafontattr -as argument: -.Bd -literal -struct vgafontattr { - int character_set; /* VGA character set */ - int font_loaded; /* Mark font loaded or unloaded */ - int screen_size; /* Character rows per screen */ - int character_scanlines; /* Scanlines per character - 1 */ - int screen_scanlines; /* Scanlines per screen - 1 byte */ -}; -.Ed - -Each character of each font is to be downloaded with - -.Bl -tag -width 20n -offset indent -compact -.It VGALOADCHAR -load vga char, -.El - -taking a pointer to -.Em struct vgaloadchar -as its argument: -.Bd -literal -struct vgaloadchar { - int character_set; /* VGA character set to load into */ - int character; /* Character to load */ - int character_scanlines; /* Scanlines per character */ - u_char char_table[32]; /* VGA character shape table */ -}; -.Ed - -The field -.Em character_set -takes the values -CH_SET0, CH_SET1, CH_SET2, CH_SET3 on EGA's or VGA's. Since VGA's -might have up to eight simultaneously loaded fonts, they can take -CH_SET4, CH_SET5, CH_SET6, or CH_SET7, too. - -Note that there's a dependence between the font size -and a possible screen height -.Pq in character rows , -depending on the video adaptor used: -.Bd -literal -Screen size (rows) on: EGA VGA -Font size - -8 x 8 43 50 -8 x 10 35 40 -8 x 14 25 28 -8 x 16 not 25 - applicable -.Ed - - -.Em General screen manipulation commands - -.Bl -tag -width 20n -offset indent -compact -.It VGACURSOR -sets cursor shape, -.El - -taking a pointer to the following structure as argument: -.Bd -literal -struct cursorshape { - int screen_no; /* screen number for which to set, */ - /* or -1 to set on current active screen */ - int start; /* top scanline, range 0... Character Height - 1 */ - int end; /* end scanline, range 0... Character Height - 1 */ -}; -.Ed - -.Bl -tag -width 20n -offset indent -compact -.It VGASETSCREEN -set screen info, and -.It VGAGETSCREEN -get screen info, -.El - -provide an interface to some general driver internal variables -which might modify the behaviour of the screens, -or which might simply be used to force the driver to switch -to one certain screen. Their argument is a pointer to the structure: -.Bd -literal -struct screeninfo { - int adaptor_type; /* type of video adaptor installed */ - /* read only, ignored on write (yet!) */ - int totalfonts; /* no of downloadable fonts */ - /* read only, ignored on write */ - int totalscreens; /* no of virtual screens */ - /* read only, ignored on write */ - int screen_no; /* screen number, this was got from */ - /* on write, if -1, apply pure_vt_mode */ - /* and/or screen_size to current screen*/ - /* else to screen_no supplied */ - int current_screen; /* screen number, which is displayed. */ - /* on write, if -1, make this screen */ - /* the current screen, else set current*/ - /* displayed screen to parameter */ - int pure_vt_mode; /* flag, pure VT mode or HP/VT mode */ - /* on write, if -1, no change */ - int screen_size; /* screen size */ - /* on write, if -1, no change */ - int force_24lines; /* force 24 lines if 25 lines VT mode */ - /* or 28 lines HP mode to get pure */ - /* VT220 screen size */ - /* on write, if -1, no change */ - int vga_family; /* if adaptor_type = VGA, this reflects*/ - /* the chipset family after a read */ - /* nothing happenes on write ... */ - int vga_type; /* if adaptor_type = VGA, this reflects*/ - /* the chipset after a read */ - /* nothing happenes on write ... */ - int vga_132; /* set to 1 if driver has support for */ - /* 132 column operation for chipset */ - /* currently ignored on write */ -}; -.Ed - -Its field -.Em pure_vt_mode -may take the values M_HPVT for a mixed VTxxx and HP Mode, with function -key labels and a status line, or M_PUREVT for only VTxxx sequences -recognized, with no labels. - -.Bl -tag -width 20n -offset indent -compact -.It VGASETCOLMS -sets the number of columns for the current screen, -.El - -its parameter is a pointer to an integer containing either a value of 80, -or a value of 132. Note that setting the number of columns to 132 is -only supported on VGA adaptors. Any unsupported numbers cause the ioctl -to fail with -.Em errno -.Pq see Xr intro 2 -being set to -.Em EINVAL . - -.Em VGA color palette interface - -Only on VGA adaptors, there's a color palette register at the output. -It is responsible for the red, green and blue output voltage provided -for each of the 256 internal color codes, each lying in the range of -0 through 63 (with 63 representing the brightest value for a base color). -Thus, these adaptors map each color code to a color of a -.Dq palette -out of 262144 colors. The commands - -.Bl -tag -width 20n -offset indent -compact -.It VGAREADPEL -read VGA palette entry, and -.It VGAWRITEPEL -write VGA palette entry -.El - -establish an interface to these palette registers. Their argument is -a pointer to: -.Bd -literal -struct vgapel { - unsigned idx; /* index into palette, 0 .. 255 valid */ - unsigned r, g, b; /* RGB values, masked by VGA_PMASK (63) */ -}; -.Ed - - -.Em Driver identification - -.Bl -tag -width 20n -offset indent -compact -.It VGAPCVTID -returns information if the current compiled in driver is pcvt and it's -major and minor revision numbers. the call is taking a pointer to the -following structure as argument: -.El - -.Bd -literal -struct pcvtid { -#define PCVTIDNAMELN 16 /* driver id - string length */ - char name[PCVTIDNAMELN]; /* driver name, == PCVTIDSTR */ -#define PCVTIDNAME "pcvt" /* driver id - string */ - int rmajor; /* revision number, major */ -#define PCVTIDMAJOR 3 - int rminor; /* revision number, minor */ -#define PCVTIDMINOR 00 -}; -.Ed - - -.Bl -tag -width 20n -offset indent -compact -.It VGAPCVTINFO -returns information if the current compiled in driver is pcvt and it's -compile time options. the call is taking a pointer to the following -structure as argument: -.El - -.Bd -literal -struct pcvtinfo { - u_int opsys; /* PCVT_xxx(x)BSD */ -#define CONF_UNKNOWNOPSYS 0 -#define CONF_386BSD 1 /* unsupported !!! */ -#define CONF_NETBSD 2 -#define CONF_FREEBSD 3 - u_int opsysrel; /* Release for NetBSD/FreeBSD */ - u_int nscreens; /* PCVT_NSCREENS */ - u_int scanset; /* PCVT_SCANSET */ - u_int updatefast; /* PCVT_UPDATEFAST */ - u_int updateslow; /* PCVT_UPDATESLOW */ - u_int sysbeepf; /* PCVT_SYSBEEPF */ - u_int pcburst; /* PCVT_PCBURST */ - u_int kbd_fifo_sz; /* PCVT_KBD_FIFO_SZ */ - -/* config booleans */ - - u_long compile_opts; /* PCVT_xxxxxxxxxxxxxxx */ -}; -.Ed - - -.Em Screen saver - -Depending on the configuration of a -.Nm pcvt -driver, their might be a simple screen saver available. It is controlled -by the command - -.Bl -tag -width 20n -offset indent -compact -.It VGASCREENSAVER -set timeout for screen saver in seconds; 0 turns it off, -.El - -taking a pointer to an integer as argument. Despite of its command name, -this is available on -.Em any -kind of adaptor if configured in by the -.Xr config 8 -option -.Dq PCVT_SCREENSAVER - -.Em Compatibility commands for USL-style VT's - -Release 3.00 of this -.Nm pcvt -driver supports a subset of the USL-style commands used to control -the virtual terminal interface. This feature is mainly intended to -allow -.Em XFree86 , -release 2.0 or higher, to switch between virtual screens even when -running an X server. They are ugly with respect to the implied semantics -.Pq i.\& e., they break Berkeley semantics -and are therefore not recommended for common use. See the file -.Pa i386/include/pcvt_ioctl.h -for their documentation. - -.Sh FILES -.Bl -tag -width /usr/include/machine/pcvt_ioctl.h -.It Pa /usr/include/machine/pcvt_ioctl.h -Definitions for -.Xr ioctl 2 -function calls -.It Pa /dev/ttyv? -.It Pa /dev/console -Device nodes to access the -.Nm pcvt -driver -.It Pa i386/isa/pcvt/pcvt_hdr.h -.Pq relative to the kernel source tree -Documents the various compile-time options to tailor -.Nm pcvt . -.Sh HISTORY -The -.Nm pcvt -driver has been developed for and contributed to 386BSD release 0.1. Since -release 3.00 explicit support is provided for NetBSD 0.9. It is expected -that no further development on pcvt is done for 386BSD 0.1 after release 3.00, -in fact, 386BSD support was dropped with release 3.20. -.Sh AUTHORS -Written by -.An Hellmuth Michaelis Aq hm@hcshh.hcs.de -with much help from -.An Brian Dunford-Shore Aq brian@morpheus.wustl.edu -.br -.if n Joerg Wunsch -.if t J\(:org Wunsch -.Aq joerg_wunsch@uriah.sax.de -.br -This driver is based on several people's previous -work, notably by -.An William Jolitz' -and -.An Don Ahn's -historic -.Xr pccons 4 -implementation -.br -.Aq ljolitz@cardio.ucsf.edu -.br -.An Holger Veit Aq veit@first.gmd.de -.Sh SEE ALSO -.Xr intro 2 , -.Xr ioctl 2 , -.Xr keyboard 4 , -.Xr screen 4 , -.Xr config 8 , -.Xr ispcvt 8 -.Sh BUGS -Certainly existent. See the file -.Pa BugList -in the Documentation directory for an up-to-date list. - -.Ss Tested Video Boards -.Bd -literal -Manufacturer Chipset Monitor - -2theMax (?) ET4000 VGA Color -Video7 Inc. Video 7 VGA Color -Diamond Stealth VRAM S3 NEC 3FGx -Trident TVGA 8800CS NEC 3D -Data General C&T P82C604 VGA Color -NoName Hercules W86855AF Mono -Kyocera (Mainboard) WD90C11 Sony Color -unknown ET3000 NEC 3D -.Ed - -.Ss Tested Keyboards -.Bd -literal -Manufacturer Type Layout - -Cherry MF II US -Cherry/Tandon MF II German -Hewlett-Packard MF II US -Hewlett-Packard MF II German -Tatung AT German -.Ed - -There is absolutely NO support for the ancient PC-keyboards -.Pq they had 83 keys . - -There is only limited support for AT-keyboards -.Bo -they have 84 keys, and a separate numeric keypad, -they don't have F11/F12 keys -.Bc -because the emulator needs F9 through F12 for control functions, and due to -the current design of the keyboard driver there is no -.Pq full -support for national keyboards because -of the lack of an ALtGr key. - -MF-keyboards are fully supported, 101- and 102-key versions. diff --git a/share/man/man4/pcvt.4 b/share/man/man4/pcvt.4 deleted file mode 100644 index 144675a..0000000 --- a/share/man/man4/pcvt.4 +++ /dev/null @@ -1,910 +0,0 @@ -.\" -.\" Copyright (c) 1992, 1995 Hellmuth Michaelis, Brian Dunford-Shore, -.\" Joerg Wunsch and Holger Veit. -.\" -.\" 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, Joerg Wunsch and Holger Veit. -.\" 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.4, 3.20, Last Edit-Date: [Sun Apr 2 18:23:39 1995] -.\" $Id: pcvt.4,v 1.11 1998/08/26 02:46:24 jkoshy Exp $ -.\" -.\" Man page pcvt(4) created after pcvt_ioctl.h on 13-Jan-93 -.\" by Joerg Wunsch -.\" -.\" updated for rel 2.10 (-hm) -.\" updated for rel 2.20 (-hm) -.\" updated for rel 3.00 (-jw) -.\" updated for final rel 3.00 (-hm) -.\" removed references to 386BSD (-hm) -.\" -.Dd February 27, 1994 -.Dt PCVT 4 i386 -.Sh NAME -.Nm pcvt , -.Nm vt -.Nd PC console virtual screen system -.Sh SYNOPSIS -options -.Do -.Em PCVT_FREEBSD = version -| -.Em PCVT_NETBSD = version -.Dc -.br -.Op options Dq Em PCVT_NSCREENS = number -.br -.Op options Dq Em PCVT_XXXX -.Po -see -.Sx Configuration -below -.Pc -.Pp -.Cd "device vt0 at isa? port IO_KBD tty irq 1" -.Sh DESCRIPTION -.Ss Overview -The -.Nm pcvt -driver provides a virtual screen system with several additional -features not available in historic console drivers. -Besides the ability of handling -multiple virtual screens, -the probably most important is an emulation of a wide range -of DEC VT-220 -.if t \(tm -.if n (TM) -functionality. See -.Sx Features -for a detailed description. - -.Ss Features -.Bl -bullet -.It -Almost full DEC VT220 -.if t \(tm -.if n (TM) -functionality -.Po -moving towards VT320 -.if t \(tm -.if n (TM) -.Pc -.It -Completely independent virtual terminals for MDA/HGC/CGA/EGA and VGA -.It -25, 28, 35, 40, 43 or 50x80 screen resolution for each virtual screen -.It -Fully remappable keyboard to support national keyboards -.It -All VT220 character sets plus ISO Latin-1 and DEC technical supported -.It -VT220 downloadable character set supported when run on EGA/VGA -.It -VT220 user defined keys for each virtual terminal -.It -Optional function key label support -.if t \('a -.if n 'a -la Hewlett-Packard -.It -Display function codes functionality -.It -Support for MDA, CGA, EGA and VGA display adaptors -.It -Support for 132 column operation on VGA chipsets -.It -X Window Support for XFree86 >= 1.2 using the pccons model, or -for XFree86 >= 2.0 using the syscons model -.Po -requires -.Em PCVT_USL_VT_COMPAT -to be configured -.Pc -.El - -What it cannot: -.Bl -bullet -.It -No double wide/high characters -.It -No softscroll -.It -No inverse background -.It -No VT220 printer output support -.It -No VT52 support at all -.It -No 8-bit controls -.It -Only limited AT-keyboard -.Pq 84 keys -support -.Pq yet -.It -Help you to make money... -.El - -.Ss Configuration -The -.Nm pcvt -console driver is currently available for the Intel-based BSD operating -systems -.Tn NetBSD/i386 -(release 0.9 or higher), -and -.Tn FreeBSD -(release 1.0-GAMMA or higher) . -In order to get the appropriate system support, one of the options -.Em PCVT_NETBSD , -or -.Em PCVT_FREEBSD -must be defined in the system's config file -.Pq see Xr config 8 . -In addition, for the -.Tn FreeBSD -and -.Tn NetBSD -operating systems, it is necessary to set this option to the operating -system's version number. -For -.Tn FreeBSD -this version number must be expressed as a 3-digit number. -E.\& g., if you are running the 1.0 release -.Pq which is actually version 1.0.2 , -you should define - -.Em PCVT_FREEBSD = 102 - -For -.Em NetBSD -this version number must be expressed as 9 if you are running NetBSD 0.9 -and anything greater than 9 for NetBSD-current (pre 1.0). It is recommended -to use (as with -.Tn FreeBSD ) -100 for -.Nx 1.0 -and 999 for -.Tn NetBSD-current. -E.g., if you are running the -.Nx 1.0 -release, you should define - -.Em PCVT_NETBSD = 100 - -The -.Nm pcvt -driver has been designed to be highly configurable in order to satisfy -everyone's needs. The preferred way for those configurations is to -provide appropriate -.Em options -lines within the config file, possibly overriding the built-in default -values. Therefore it is possible to compile several distinct kernels -with different driver behaviour on a single machine. - -The following list gives a short overview of the available configuration -options. Refer to the file -.Pa i386/isa/pcvt/pcvt_hdr.h -in the kernel source tree for detailed documentation. - -Note: the following conventions apply to all the Boolean options. -If an option is given with no value, a value of 1 -.Pq activated -is substituted. If an option value is given as 0, this options is -deactivated. Any other value is substituted by 1, too. If an option -is omitted, a built-in default is assumed. - -.Bl -tag -width indent -compact - -.It Em PCVT_NSCREENS -Defines the number of virtual screens. -.br -Default: 8 - -.It Em PCVT_VT220KEYB -If activated, a keyboard layout resembling a DEC VT200 (TM) is generated. -If deactivated, a mixture between VT220 and HP is used. See the files -.Pa Keyboard.VT -and -.Pa Keyboard.HP -in the -.Nm pcvt -documentation directory for a full description. -.br -Default: off - -.It Em PCVT_SCREENSAVER -Enables the builtin screensaver feature. -.br -Default: on - -.It Em PCVT_PRETTYSCRNS -If enabled, a blinking-star screensaver is used. If disabled, the screen -is simply blanked -.Pq which might be useful for energy-saving monitors . -.br -Default: on - -.It Em PCVT_CTRL_ALT_DEL -If enabled, the key combination -.Aq Em Ctrl -.Aq Em Alt -.Aq Em Del -invokes a CPU reset. -.br -Default: off - -.It Em PCVT_USEKBDSEC -Do NOT override a security lock for the keyboard. -.br -Default: on - -.It Em PCVT_24LINESDEF -If enabled, the 25-line modi -.Po -VT emulation with 25 lines, and HP emulation with 28 lines -.Pc -default to 24 lines only to provide a better compatibility to the -original DEV VT220 (TM). Thus it should be possible to use the -terminal information for those terminals without further changes. -Note that this is a startup option; it is possible to toggle between -the 24- and 25-lines' display by the -.Xr scon 1 -utility. -.br -Default: off - -.It Em PCVT_EMU_MOUSE -Emulate a three-button mouse via the keypad. Useful for notebooks when -running XFree86. See -.Sx Mouse emulation -below. -.br -Default: off - -.It Em PCVT_META_ESC -If enabled, a sequence composed of -.Aq Em esc , -followed by the normal key code is emitted if a key is pressed with the -.Aq Em Alt -key modifier. If disabled, then normal key code with the value -.Em 0x80 -added is sent. -.br -Default: off - -.El - -Note that there are further options available which are mainly used for -debugging purposes or as a workaround for hardware problems. They are -found in -.Pa i386/isa/pcvt/pcvt_hdr.h -along with their documentation. - -.Ss Internal Functions -The functionality described below may be accessed via -.Xr ioctl 2 -system calls with a file descriptor opened on a device node -related to the -.Nm pcvt -driver. -To make use of them, a program should contain the following line: - - -.Dl #include <machine/pcvt_ioctl.h> - -Any parameter definitions cited below can be found in that file. - - -.Em Keyboard related functions - -Three functions are related to basic keyboard hardware: - -.Bl -tag -width 20n -offset indent -compact -.It KBDRESET -reset keyboard, set defaults; -.It KBDGTPMAT -get current typematic value, parameter is a pointer to int where -the values is stored to; -.It KBDSTPMAT -set current typematic value, similar to above command. -.El - -Symbolic values are available for the appropriate constants. -To specify the initial typematic delay time, they are -KBD_TPD250 for 250 ms through -KBD_TPD1000 for 1000 ms, in steps of 250 ms. The typematic repeat -rates are -KBD_TPM300, specifying 30.0 characters per second through -KBD_TPM20 for 2.0 characters per second. The intermediate values -are: 30.0, 26.7, 24.0, 21.8, 20.0, 18.5, 17.1, 16.0, 15.0, 13.3, -12.0, 10.9, 10.0, 9.2, 8.6, 8.0, 7.5, 6.7, 6.0, 5.5, 5.0, 4.6, 4.3, -4.0, 3.7, 3.3, 3.0, 2.7, 2.5, 2.3, 2.1, 2.0 characters per second. - - -.Bl -tag -width 20n -offset indent -compact -.It KBDGREPSW -get key repetition switch, and -.It KBDSREPSW -set key repetition switch -.El - -again take a pointer to int as argument. They manipulate the -drivers internal keyboard repetition flag, possible values are: -KBD_REPEATOFF or KBD_REPEATON. - - -.Bl -tag -width 20n -offset indent -compact -.It KBDGLEDS -get LED state, and -.It KBDSLEDS -set LED state manipulate the keyboard indicators, but do not influence -the drivers idea of lock key state. -.El - -The int where the argument points to -may have the values -KBD_SCROLLLOCK, KBD_NUMLOCK, KBD_CAPSLOCK, which may be used in any -conjunction. - -.Bl -tag -width 20n -offset indent -compact -.It KBDGLOCK -gets state of SCROLL,NUM,CAPS, and -.It KBDSLOCK -sets state of SCROLL,NUM,CAPS + LEDs -.El - -should be used in a same manner to get/set the drivers internal -LED flags. - - -.Em Keyboard remapping - -One important feature of the -.Nm pcvt -driver is its ability to overload the built in key definition. - -.Bl -tag -width 20n -offset indent -compact -.It KBDGCKEY -get current key values, -.It KBDSCKEY -set new key assignment values, and -.It KBDGOKEY -get original key assignment values -.El - -arrange those functions. The take a pointer to a -.Em struct kbd_ovlkey -as argument as described below. In addition, - -.Bl -tag -width 20n -offset indent -compact -.It KBDRMKEY -removes a key assignment, taking a pointer to an int as argument which -contains the affected key number; -.It KBDDEFAULT -removes all key assignments. -.El -.Bd -literal -struct kbd_ovlkey /* complete definition of a key */ -{ - u_short keynum; /* the key itself */ - u_short type; /* type of key, see below */ - u_char subu; /* subtype, ignored on write */ - char unshift[KBDMAXOVLKEYSIZE+1]; /* emitted string, unshifted */ - u_char subs; /* subtype, ignored on write */ - char shift[KBDMAXOVLKEYSIZE+1]; /* emitted string, shifted */ - u_char subc; /* subtype, ignored on write */ - char ctrl[KBDMAXOVLKEYSIZE+1]; /* emitted string, control */ - u_char suba; /* subtype, ignored on write */ - char altgr[KBDMAXOVLKEYSIZE+1]; /* emitted string, altgr */ -}; -.Ed - -The appropriate values for the -.Em type -field are: - -.Bl -tag -width 20n -offset indent -compact -.It KBD_NONE -no function, key is disabled, -.It KBD_SHIFT -keyboard shift, -.It KBD_META -alternate shift, sets bit8 to ASCII code, -.It KBD_NUM -numeric shift, keypad numeric / application mode, -.It KBD_CTL -control code generation, -.It KBD_CAPS -caps shift - swaps case of letter, -.It KBD_ASCII -ASCII code generating key, -.It KBD_SCROLL -stop output, -.It KBD_FUNC -function key, -.It KBD_KP -keypad keys, -.It KBD_BREAK -ignored, -.It KBD_ALTGR -AltGr translation feature, -.It KBD_SHFTLOCK -shift lock, -.It KBD_CURSOR -cursor keys, and -.It KBD_RETURN -.Dq Return -or -.Dq Enter -keys. -.El - -The -.Em subtype -field contains one of the values - -.Bl -tag -width 20n -offset indent -compact -.It KBD_SUBT_STR -key is bound to a string, or -.It KBD_SUBT_FNC -key is bound to a function. -.El - -.Em Mouse emulation - -The mouse emulator -.Pq if configured in -fakes a three-button mouse using the Mouse Systems protocol. The first -.Nm pcvt -device node not used by a virtual screen is the mouse device. I.\& e., -for the default value of 8 virtual screens, -.Pa /dev/ttyv0 -through -.Pa /dev/ttyv7 -would refer to the virtual screens, and -.Pa /dev/ttyv8 -were the mouse emulator device. The mouse emulation is turned on by -pressing the -.Aq Em NumLock -key. The pointer is moved by the numerical keypad keys, into the -obvious directions. The pointer is initially moved in single steps, -and is accelerated after an adjustable time -.Pq default: 500 ms -by about 6 times. The mouse buttons are emulated by three normal -keys, by default the function keys -.Aq Em \&F1 , -.Aq Em \&F2 , -and -.Aq Em \&F3 . -There are two selectable flavors available: normal and -.Dq sticky -buttons. Normal buttons behave as expected. -.Dq Sticky -buttons are notified as button-press on the first keypress. They -.Dq stick -until the key is pressed again -.Pq or another button-emulating key instead . -Button presses and releases are notified to the user by a simple -.Dq pling , -or -.Dq plong , -respectively, generated from the PC's built-in speaker. - -The following commands control the emulation. - -.Bl -tag -width 20n -offset indent -compact -.It KBDMOUSEGET -get the current definitions, and -.It KBDMOUSESET -set new definitions. -.El - -Both accept a -.Li struct mousedefs * -as the third argument to the ioctl call: -.Bd -literal -struct mousedefs { - int leftbutton; /* (PC) scan code for "left button" key */ - int middlebutton; /* (PC) scan code for "mid button" key */ - int rightbutton; /* (PC) scan code for "right button" key */ - int stickybuttons; /* if true, the buttons are "sticky" */ - int acceltime; /* timeout in microseconds to start pointer */ - /* movement acceleration */ - /* defaults to: scan(F1), scan(F2), scan(F3), false, 500000 */ -}; -.Ed - - -.Em Downloadable character set interface - -EGA and VGA video adaptors provide the capability of downloadable -software fonts. Since the -.Sq native character set -of any IBM-compatible PC video board does not allow the full interpretation -of DEC multinational character set or ISO Latin-1 -.Pq ISO 8859-1 , -this might be very useful for a U**X environment. - -.Bl -tag -width 20n -offset indent -compact -.It VGASETFONTATTR -set font attr, and -.It VGAGETFONTATTR -get font attr -.El - -are used to manipulate the drivers information about a downloaded -font. The take a pointer to a -.Em struct vgafontattr -as argument: -.Bd -literal -struct vgafontattr { - int character_set; /* VGA character set */ - int font_loaded; /* Mark font loaded or unloaded */ - int screen_size; /* Character rows per screen */ - int character_scanlines; /* Scanlines per character - 1 */ - int screen_scanlines; /* Scanlines per screen - 1 byte */ -}; -.Ed - -Each character of each font is to be downloaded with - -.Bl -tag -width 20n -offset indent -compact -.It VGALOADCHAR -load vga char, -.El - -taking a pointer to -.Em struct vgaloadchar -as its argument: -.Bd -literal -struct vgaloadchar { - int character_set; /* VGA character set to load into */ - int character; /* Character to load */ - int character_scanlines; /* Scanlines per character */ - u_char char_table[32]; /* VGA character shape table */ -}; -.Ed - -The field -.Em character_set -takes the values -CH_SET0, CH_SET1, CH_SET2, CH_SET3 on EGA's or VGA's. Since VGA's -might have up to eight simultaneously loaded fonts, they can take -CH_SET4, CH_SET5, CH_SET6, or CH_SET7, too. - -Note that there's a dependence between the font size -and a possible screen height -.Pq in character rows , -depending on the video adaptor used: -.Bd -literal -Screen size (rows) on: EGA VGA -Font size - -8 x 8 43 50 -8 x 10 35 40 -8 x 14 25 28 -8 x 16 not 25 - applicable -.Ed - - -.Em General screen manipulation commands - -.Bl -tag -width 20n -offset indent -compact -.It VGACURSOR -sets cursor shape, -.El - -taking a pointer to the following structure as argument: -.Bd -literal -struct cursorshape { - int screen_no; /* screen number for which to set, */ - /* or -1 to set on current active screen */ - int start; /* top scanline, range 0... Character Height - 1 */ - int end; /* end scanline, range 0... Character Height - 1 */ -}; -.Ed - -.Bl -tag -width 20n -offset indent -compact -.It VGASETSCREEN -set screen info, and -.It VGAGETSCREEN -get screen info, -.El - -provide an interface to some general driver internal variables -which might modify the behaviour of the screens, -or which might simply be used to force the driver to switch -to one certain screen. Their argument is a pointer to the structure: -.Bd -literal -struct screeninfo { - int adaptor_type; /* type of video adaptor installed */ - /* read only, ignored on write (yet!) */ - int totalfonts; /* no of downloadable fonts */ - /* read only, ignored on write */ - int totalscreens; /* no of virtual screens */ - /* read only, ignored on write */ - int screen_no; /* screen number, this was got from */ - /* on write, if -1, apply pure_vt_mode */ - /* and/or screen_size to current screen*/ - /* else to screen_no supplied */ - int current_screen; /* screen number, which is displayed. */ - /* on write, if -1, make this screen */ - /* the current screen, else set current*/ - /* displayed screen to parameter */ - int pure_vt_mode; /* flag, pure VT mode or HP/VT mode */ - /* on write, if -1, no change */ - int screen_size; /* screen size */ - /* on write, if -1, no change */ - int force_24lines; /* force 24 lines if 25 lines VT mode */ - /* or 28 lines HP mode to get pure */ - /* VT220 screen size */ - /* on write, if -1, no change */ - int vga_family; /* if adaptor_type = VGA, this reflects*/ - /* the chipset family after a read */ - /* nothing happenes on write ... */ - int vga_type; /* if adaptor_type = VGA, this reflects*/ - /* the chipset after a read */ - /* nothing happenes on write ... */ - int vga_132; /* set to 1 if driver has support for */ - /* 132 column operation for chipset */ - /* currently ignored on write */ -}; -.Ed - -Its field -.Em pure_vt_mode -may take the values M_HPVT for a mixed VTxxx and HP Mode, with function -key labels and a status line, or M_PUREVT for only VTxxx sequences -recognized, with no labels. - -.Bl -tag -width 20n -offset indent -compact -.It VGASETCOLMS -sets the number of columns for the current screen, -.El - -its parameter is a pointer to an integer containing either a value of 80, -or a value of 132. Note that setting the number of columns to 132 is -only supported on VGA adaptors. Any unsupported numbers cause the ioctl -to fail with -.Em errno -.Pq see Xr intro 2 -being set to -.Em EINVAL . - -.Em VGA color palette interface - -Only on VGA adaptors, there's a color palette register at the output. -It is responsible for the red, green and blue output voltage provided -for each of the 256 internal color codes, each lying in the range of -0 through 63 (with 63 representing the brightest value for a base color). -Thus, these adaptors map each color code to a color of a -.Dq palette -out of 262144 colors. The commands - -.Bl -tag -width 20n -offset indent -compact -.It VGAREADPEL -read VGA palette entry, and -.It VGAWRITEPEL -write VGA palette entry -.El - -establish an interface to these palette registers. Their argument is -a pointer to: -.Bd -literal -struct vgapel { - unsigned idx; /* index into palette, 0 .. 255 valid */ - unsigned r, g, b; /* RGB values, masked by VGA_PMASK (63) */ -}; -.Ed - - -.Em Driver identification - -.Bl -tag -width 20n -offset indent -compact -.It VGAPCVTID -returns information if the current compiled in driver is pcvt and it's -major and minor revision numbers. the call is taking a pointer to the -following structure as argument: -.El - -.Bd -literal -struct pcvtid { -#define PCVTIDNAMELN 16 /* driver id - string length */ - char name[PCVTIDNAMELN]; /* driver name, == PCVTIDSTR */ -#define PCVTIDNAME "pcvt" /* driver id - string */ - int rmajor; /* revision number, major */ -#define PCVTIDMAJOR 3 - int rminor; /* revision number, minor */ -#define PCVTIDMINOR 00 -}; -.Ed - - -.Bl -tag -width 20n -offset indent -compact -.It VGAPCVTINFO -returns information if the current compiled in driver is pcvt and it's -compile time options. the call is taking a pointer to the following -structure as argument: -.El - -.Bd -literal -struct pcvtinfo { - u_int opsys; /* PCVT_xxx(x)BSD */ -#define CONF_UNKNOWNOPSYS 0 -#define CONF_386BSD 1 /* unsupported !!! */ -#define CONF_NETBSD 2 -#define CONF_FREEBSD 3 - u_int opsysrel; /* Release for NetBSD/FreeBSD */ - u_int nscreens; /* PCVT_NSCREENS */ - u_int scanset; /* PCVT_SCANSET */ - u_int updatefast; /* PCVT_UPDATEFAST */ - u_int updateslow; /* PCVT_UPDATESLOW */ - u_int sysbeepf; /* PCVT_SYSBEEPF */ - u_int pcburst; /* PCVT_PCBURST */ - u_int kbd_fifo_sz; /* PCVT_KBD_FIFO_SZ */ - -/* config booleans */ - - u_long compile_opts; /* PCVT_xxxxxxxxxxxxxxx */ -}; -.Ed - - -.Em Screen saver - -Depending on the configuration of a -.Nm pcvt -driver, their might be a simple screen saver available. It is controlled -by the command - -.Bl -tag -width 20n -offset indent -compact -.It VGASCREENSAVER -set timeout for screen saver in seconds; 0 turns it off, -.El - -taking a pointer to an integer as argument. Despite of its command name, -this is available on -.Em any -kind of adaptor if configured in by the -.Xr config 8 -option -.Dq PCVT_SCREENSAVER - -.Em Compatibility commands for USL-style VT's - -Release 3.00 of this -.Nm pcvt -driver supports a subset of the USL-style commands used to control -the virtual terminal interface. This feature is mainly intended to -allow -.Em XFree86 , -release 2.0 or higher, to switch between virtual screens even when -running an X server. They are ugly with respect to the implied semantics -.Pq i.\& e., they break Berkeley semantics -and are therefore not recommended for common use. See the file -.Pa i386/include/pcvt_ioctl.h -for their documentation. - -.Sh FILES -.Bl -tag -width /usr/include/machine/pcvt_ioctl.h -.It Pa /usr/include/machine/pcvt_ioctl.h -Definitions for -.Xr ioctl 2 -function calls -.It Pa /dev/ttyv? -.It Pa /dev/console -Device nodes to access the -.Nm pcvt -driver -.It Pa i386/isa/pcvt/pcvt_hdr.h -.Pq relative to the kernel source tree -Documents the various compile-time options to tailor -.Nm pcvt . -.Sh HISTORY -The -.Nm pcvt -driver has been developed for and contributed to 386BSD release 0.1. Since -release 3.00 explicit support is provided for NetBSD 0.9. It is expected -that no further development on pcvt is done for 386BSD 0.1 after release 3.00, -in fact, 386BSD support was dropped with release 3.20. -.Sh AUTHORS -Written by -.An Hellmuth Michaelis Aq hm@hcshh.hcs.de -with much help from -.An Brian Dunford-Shore Aq brian@morpheus.wustl.edu -.br -.if n Joerg Wunsch -.if t J\(:org Wunsch -.Aq joerg_wunsch@uriah.sax.de -.br -This driver is based on several people's previous -work, notably by -.An William Jolitz' -and -.An Don Ahn's -historic -.Xr pccons 4 -implementation -.br -.Aq ljolitz@cardio.ucsf.edu -.br -.An Holger Veit Aq veit@first.gmd.de -.Sh SEE ALSO -.Xr intro 2 , -.Xr ioctl 2 , -.Xr keyboard 4 , -.Xr screen 4 , -.Xr config 8 , -.Xr ispcvt 8 -.Sh BUGS -Certainly existent. See the file -.Pa BugList -in the Documentation directory for an up-to-date list. - -.Ss Tested Video Boards -.Bd -literal -Manufacturer Chipset Monitor - -2theMax (?) ET4000 VGA Color -Video7 Inc. Video 7 VGA Color -Diamond Stealth VRAM S3 NEC 3FGx -Trident TVGA 8800CS NEC 3D -Data General C&T P82C604 VGA Color -NoName Hercules W86855AF Mono -Kyocera (Mainboard) WD90C11 Sony Color -unknown ET3000 NEC 3D -.Ed - -.Ss Tested Keyboards -.Bd -literal -Manufacturer Type Layout - -Cherry MF II US -Cherry/Tandon MF II German -Hewlett-Packard MF II US -Hewlett-Packard MF II German -Tatung AT German -.Ed - -There is absolutely NO support for the ancient PC-keyboards -.Pq they had 83 keys . - -There is only limited support for AT-keyboards -.Bo -they have 84 keys, and a separate numeric keypad, -they don't have F11/F12 keys -.Bc -because the emulator needs F9 through F12 for control functions, and due to -the current design of the keyboard driver there is no -.Pq full -support for national keyboards because -of the lack of an ALtGr key. - -MF-keyboards are fully supported, 101- and 102-key versions. diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC index 305e1b6..de0e261 100644 --- a/sys/amd64/conf/GENERIC +++ b/sys/amd64/conf/GENERIC @@ -11,7 +11,7 @@ # device lines is present in the ./LINT configuration file. If you are # in doubt as to the purpose or necessity of a line, check first in LINT. # -# $Id: GENERIC,v 1.134 1998/12/09 23:28:43 n_hibma Exp $ +# $Id: GENERIC,v 1.135 1998/12/13 23:04:35 n_hibma Exp $ machine "i386" cpu "I386_CPU" @@ -104,14 +104,7 @@ controller matcd0 at isa? port 0x230 bio device scd0 at isa? port 0x230 bio -# syscons is the default console driver, resembling an SCO console device sc0 at isa? port IO_KBD conflicts tty irq 1 -# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver -#device vt0 at isa? port IO_KBD conflicts tty irq 1 -#options XSERVER # support for X server -#options FAT_CURSOR # start with block cursor -# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines -#options PCVT_SCANSET=2 # IBM keyboards are non-std device npx0 at isa? port IO_NPX irq 13 diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 064d099..f7b566b 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -2,7 +2,7 @@ # LINT -- config file for checking all the sources, tries to pull in # as much of the source tree as it can. # -# $Id: LINT,v 1.513 1998/12/27 12:40:07 phk Exp $ +# $Id: LINT,v 1.514 1998/12/27 12:44:54 phk Exp $ # # NB: You probably don't want to try running a kernel built from this # file. Instead, you should start from GENERIC, and add options from @@ -818,13 +818,6 @@ options "NTIMECOUNTER=20" # configure cards from USERCONFIG. See pnp(4) for more info. controller pnp0 -# The pcvt console driver (vt220 compatible). -device vt0 at isa? port IO_KBD conflicts tty irq 1 -options XSERVER # support for running an X server. -options FAT_CURSOR # start with block cursor -# This PCVT option is for keyboards such as those used on IBM ThinkPad laptops -options PCVT_SCANSET=2 # IBM keyboards are non-std - # The syscons console driver (sco color console compatible). device sc0 at isa? port IO_KBD conflicts tty irq 1 options MAXCONS=16 # number of virtual consoles diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index 8c1358a..40ede78 100644 --- a/sys/conf/files.i386 +++ b/sys/conf/files.i386 @@ -1,7 +1,7 @@ # This file tells config what files go into building a kernel, # files marked standard are always included. # -# $Id: files.i386,v 1.208 1998/12/27 12:40:07 phk Exp $ +# $Id: files.i386,v 1.209 1998/12/27 12:44:55 phk Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -149,12 +149,6 @@ i386/isa/matcd/matcd.c optional matcd device-driver i386/isa/pcibus.c optional pci device-driver i386/isa/pcicx.c optional ze device-driver i386/isa/pcicx.c optional zp device-driver -i386/isa/pcvt/pcvt_drv.c optional vt device-driver -i386/isa/pcvt/pcvt_ext.c optional vt device-driver -i386/isa/pcvt/pcvt_kbd.c optional vt device-driver -i386/isa/pcvt/pcvt_out.c optional vt device-driver -i386/isa/pcvt/pcvt_sup.c optional vt device-driver -i386/isa/pcvt/pcvt_vtf.c optional vt device-driver i386/isa/pnp.c optional pnp device-driver i386/isa/prof_machdep.c optional profiling-routine i386/isa/ppc.c optional ppc device-driver diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC index 305e1b6..de0e261 100644 --- a/sys/i386/conf/GENERIC +++ b/sys/i386/conf/GENERIC @@ -11,7 +11,7 @@ # device lines is present in the ./LINT configuration file. If you are # in doubt as to the purpose or necessity of a line, check first in LINT. # -# $Id: GENERIC,v 1.134 1998/12/09 23:28:43 n_hibma Exp $ +# $Id: GENERIC,v 1.135 1998/12/13 23:04:35 n_hibma Exp $ machine "i386" cpu "I386_CPU" @@ -104,14 +104,7 @@ controller matcd0 at isa? port 0x230 bio device scd0 at isa? port 0x230 bio -# syscons is the default console driver, resembling an SCO console device sc0 at isa? port IO_KBD conflicts tty irq 1 -# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver -#device vt0 at isa? port IO_KBD conflicts tty irq 1 -#options XSERVER # support for X server -#options FAT_CURSOR # start with block cursor -# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines -#options PCVT_SCANSET=2 # IBM keyboards are non-std device npx0 at isa? port IO_NPX irq 13 diff --git a/sys/i386/conf/LINT b/sys/i386/conf/LINT index 064d099..f7b566b 100644 --- a/sys/i386/conf/LINT +++ b/sys/i386/conf/LINT @@ -2,7 +2,7 @@ # LINT -- config file for checking all the sources, tries to pull in # as much of the source tree as it can. # -# $Id: LINT,v 1.513 1998/12/27 12:40:07 phk Exp $ +# $Id: LINT,v 1.514 1998/12/27 12:44:54 phk Exp $ # # NB: You probably don't want to try running a kernel built from this # file. Instead, you should start from GENERIC, and add options from @@ -818,13 +818,6 @@ options "NTIMECOUNTER=20" # configure cards from USERCONFIG. See pnp(4) for more info. controller pnp0 -# The pcvt console driver (vt220 compatible). -device vt0 at isa? port IO_KBD conflicts tty irq 1 -options XSERVER # support for running an X server. -options FAT_CURSOR # start with block cursor -# This PCVT option is for keyboards such as those used on IBM ThinkPad laptops -options PCVT_SCANSET=2 # IBM keyboards are non-std - # The syscons console driver (sco color console compatible). device sc0 at isa? port IO_KBD conflicts tty irq 1 options MAXCONS=16 # number of virtual consoles diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES index 064d099..f7b566b 100644 --- a/sys/i386/conf/NOTES +++ b/sys/i386/conf/NOTES @@ -2,7 +2,7 @@ # LINT -- config file for checking all the sources, tries to pull in # as much of the source tree as it can. # -# $Id: LINT,v 1.513 1998/12/27 12:40:07 phk Exp $ +# $Id: LINT,v 1.514 1998/12/27 12:44:54 phk Exp $ # # NB: You probably don't want to try running a kernel built from this # file. Instead, you should start from GENERIC, and add options from @@ -818,13 +818,6 @@ options "NTIMECOUNTER=20" # configure cards from USERCONFIG. See pnp(4) for more info. controller pnp0 -# The pcvt console driver (vt220 compatible). -device vt0 at isa? port IO_KBD conflicts tty irq 1 -options XSERVER # support for running an X server. -options FAT_CURSOR # start with block cursor -# This PCVT option is for keyboards such as those used on IBM ThinkPad laptops -options PCVT_SCANSET=2 # IBM keyboards are non-std - # The syscons console driver (sco color console compatible). device sc0 at isa? port IO_KBD conflicts tty irq 1 options MAXCONS=16 # number of virtual consoles diff --git a/sys/i386/conf/files.i386 b/sys/i386/conf/files.i386 index 8c1358a..40ede78 100644 --- a/sys/i386/conf/files.i386 +++ b/sys/i386/conf/files.i386 @@ -1,7 +1,7 @@ # This file tells config what files go into building a kernel, # files marked standard are always included. # -# $Id: files.i386,v 1.208 1998/12/27 12:40:07 phk Exp $ +# $Id: files.i386,v 1.209 1998/12/27 12:44:55 phk Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -149,12 +149,6 @@ i386/isa/matcd/matcd.c optional matcd device-driver i386/isa/pcibus.c optional pci device-driver i386/isa/pcicx.c optional ze device-driver i386/isa/pcicx.c optional zp device-driver -i386/isa/pcvt/pcvt_drv.c optional vt device-driver -i386/isa/pcvt/pcvt_ext.c optional vt device-driver -i386/isa/pcvt/pcvt_kbd.c optional vt device-driver -i386/isa/pcvt/pcvt_out.c optional vt device-driver -i386/isa/pcvt/pcvt_sup.c optional vt device-driver -i386/isa/pcvt/pcvt_vtf.c optional vt device-driver i386/isa/pnp.c optional pnp device-driver i386/isa/prof_machdep.c optional profiling-routine i386/isa/ppc.c optional ppc device-driver diff --git a/sys/i386/isa/pcvt/pcvt_conf.h b/sys/i386/isa/pcvt/pcvt_conf.h deleted file mode 100644 index 52387e6..0000000 --- a/sys/i386/isa/pcvt/pcvt_conf.h +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. - * - * Copyright (c) 1992, 1994 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_conf.h, 3.20, Last Edit-Date: [Sun Apr 2 18:57:45 1995] - * - */ - -/*--------------------------------------------------------------------------- - * - * pcvt_conf.h VT220 driver global configuration file - * ------------------------------------------------------ - * -hm introduced pcvt_conf.h - * -hm re-integrated selfconfiguration for NetBSD from Onno - * -hm patch from Onno for NetBSD-current - * -hm removed PCVT_FAKE_SYSCONS10 - * - *---------------------------------------------------------------------------*/ - -/*--------------------------------------------------------------------------- - * - * from: Onno van der Linden c/o frank@fwi.uva.nl - * - * Here's an idea how to automatically detect the version of NetBSD pcvt is - * being compiled on: - * - * NetBSD 0.8 : NetBSD0_8 defined in <sys/param.h> - * NetBSD 0.9 : NetBSD0_9 defined in <sys/param.h> - * NetBSD 1.0 : NetBSD1_0 defined as 1 in <sys/param.h> - * NetBSD 1.0A: NetBSD1_0 defined as 2 in <sys/param.h> - * - * The NetBSDx_y defines are mutual exclusive. - * - * This leads to something like this in pcvt_hdr.h (#elif is possible too): - * - *---------------------------------------------------------------------------*/ - -#ifdef NetBSD0_8 -#define PCVT_NETBSD 8 -#endif - -#ifdef NetBSD0_9 -#define PCVT_NETBSD 9 -#endif - -#ifdef NetBSD1_0 -#if NetBSD1_0 > 1 -#define PCVT_NETBSD 199 -#else -#define PCVT_NETBSD 100 -#endif -#endif - -/*--------------------------------------------------------------------------- - * Note that each of the options below should rather be overriden by the - * kernel config file instead of this .h file - this allows for different - * definitions in different kernels compiled at the same machine - * - * The convention is as follows: - * - * options "PCVT_FOO=1" - enables the option - * options "PCVT_FOO" - is a synonym for the above - * options "PCVT_FOO=0" - disables the option - * - * omitting an option defaults to what is shown below - * - * exceptions from this rule are i.e.: - * - * options "PCVT_NSCREENS=x" - * options "PCVT_SCANSET=x" - * options "PCVT_UPDATEFAST=x" - * options "PCVT_UPDATESLOW=x" - * options "PCVT_SYSBEEPF=x" - * - * which are always numeric! - *---------------------------------------------------------------------------*/ - -/* -------------------------------------------------------------------- */ -/* -------------------- OPERATING SYSTEM ------------------------------ */ -/* -------------------------------------------------------------------- */ - -/* - * one of the following options must be set in the kernel config file: - * - *======================================================================* - * N e t B S D * - *======================================================================* - * - * options "PCVT_NETBSD=xxx" enables support for NetBSD - * - * select: - * PCVT_NETBSD = 9 for NetBSD 0.9 - * PCVT_NETBSD = 99 for PRE-1.0 NetBSD-current - * PCVT_NETBSD = 100 for NetBSD 1.0 - * PCVT_NETBSD = 199 for PRE-2.0 NetBSD-current - * - * - *======================================================================* - * F r e e B S D * - *======================================================================* - * - * options "PCVT_FREEBSD=xxx" enables support for FreeBSD - * - * select: - * PCVT_FREEBSD = 102 for 1.0 release (actually 1.0.2) - * PCVT_FREEBSD = 110 for FreeBSD 1.1-Release - * PCVT_FREEBSD = 115 for FreeBSD 1.1.5.1-Release - * PCVT_FREEBSD = 200 for FreeBSD 2.0-Release - * PCVT_FREEBSD = 210 for FreeBSD 2.1-Release - * - */ - -/* -------------------------------------------------------------------- */ -/* ---------------- USER PREFERENCE DRIVER OPTIONS -------------------- */ -/* -------------------------------------------------------------------- */ - -/*----------------------------------------------------------------------*/ -/* NOTE: if FAT_CURSOR is defined, a block cursor is used instead of */ -/* the cursor shape we got from the BIOS, see pcvt_out.c */ -/*----------------------------------------------------------------------*/ - -#if !defined PCVT_NSCREENS /* ---------- DEFAULT: 8 -------------- */ -# define PCVT_NSCREENS 8 /* this option defines how many virtual */ -#endif /* screens you want to have in your */ - /* system. each screen allocates memory,*/ - /* so you can't have an unlimited num- */ - /* ber...; the value is intented to be */ - /* compile-time overridable by a config */ - /* options "PCVT_NSCREENS=x" line */ - -#if !defined PCVT_VT220KEYB /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_VT220KEYB 0 /* this compiles a more vt220-like */ -#elif PCVT_VT220KEYB != 0 /* keyboardlayout as described in the */ -# undef PCVT_VT220KEYB /* file Keyboard.VT220. */ -# define PCVT_VT220KEYB 1 /* if undefined, a more HP-like */ -#endif /* keyboardlayout is compiled */ - /* try to find out what YOU like ! */ - -#if !defined PCVT_SCREENSAVER /* ---------- DEFAULT: ON ------------- */ -# define PCVT_SCREENSAVER 1 /* enable screen saver feature - this */ -#elif PCVT_SCREENSAVER != 0 /* just blanks the display screen. */ -# undef PCVT_SCREENSAVER /* see PCVT_PRETTYSCRNS below ... */ -# define PCVT_SCREENSAVER 1 -#endif - -#if !defined PCVT_PRETTYSCRNS /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_PRETTYSCRNS 0 /* for the cost of some microseconds of */ -#elif PCVT_PRETTYSCRNS != 0 /* cpu time this adds a more "pretty" */ -# undef PCVT_PRETTYSCRNS /* version to the screensaver, an "*" */ -# define PCVT_PRETTYSCRNS 1 /* in random locations of the display. */ -#endif /* NOTE: this should not be defined if */ - /* you have an energy-saving monitor */ - /* which turns off the display if its */ - /* black !!!!!! */ - -#if !defined PCVT_CTRL_ALT_DEL /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_CTRL_ALT_DEL 0 /* this enables the execution of a cpu */ -#elif PCVT_CTRL_ALT_DEL != 0 /* reset by pressing the CTRL, ALT and */ -# undef PCVT_CTRL_ALT_DEL /* DEL keys simultanously. Because this */ -# define PCVT_CTRL_ALT_DEL 1 /* is a feature of an ancient simple */ -#endif /* bootstrap loader, it does not belong */ - /* into modern operating systems and */ - /* was commented out by default ... */ - -#if !defined PCVT_KBD_FIFO /* ---------- DEFAULT: ON ------------- */ -# define PCVT_KBD_FIFO 1 /* this enables Keyboad fifo so that we */ -#elif PCVT_KBD_FIFO != 0 /* are not any longer forced to switch */ -# undef PCVT_KBD_FIFO /* off tty interrupts while switching */ -# define PCVT_KBD_FIFO 1 /* virtual screens - AND loosing chars */ -#endif /* on the serial lines is gone :-) */ - -#if PCVT_KBD_FIFO - -# if !defined PCVT_KBD_FIFO_SZ /* ---------- DEFAULT: 256 ------------ */ -# define PCVT_KBD_FIFO_SZ 256 /* this specifies the size of the above */ -# elif PCVT_KBD_FIFO_SZ < 16 /* mentioned keyboard buffer. buffer */ -# undef PCVT_KBD_FIFO_SZ /* overflows are logged via syslog, so */ -# define PCVT_KBD_FIFO_SZ 256 /* have a look at /var/log/messages */ -# endif - -#endif /* PCVT_KBD_FIFO */ - -#if !defined PCVT_USEKBDSEC /* ---------- DEFAULT: ON ------------- */ -# define PCVT_USEKBDSEC 1 /* do not set the COMMAND_INHOVR bit */ -#elif PCVT_USEKBDSEC != 0 /* (1 = override security lock inhibit) */ -# undef PCVT_USEKBDSEC /* when initializing the keyboard, so */ -# define PCVT_USEKBDSEC 1 /* that security locking should work */ -#endif /* now. I guess this has to be done also*/ - /* in the boot code to prevent single */ - /* user startup .... */ - -#if !defined PCVT_24LINESDEF /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_24LINESDEF 0 /* use 24 lines in VT 25 lines mode and */ -#elif PCVT_24LINESDEF != 0 /* HP 28 lines mode by default to have */ -# undef PCVT_24LINESDEF /* the the better compatibility to the */ -# define PCVT_24LINESDEF 1 /* real VT220 - you can switch between */ -#endif /* the maximum possible screensizes in */ - /* those two modes (25 lines) and true */ - /* compatibility (24 lines) by using */ - /* the scon utility at runtime */ - -#if !defined PCVT_EMU_MOUSE /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_EMU_MOUSE 0 /* emulate a mouse systems mouse via */ -#elif PCVT_EMU_MOUSE != 0 /* the keypad; this is experimental */ -# undef PCVT_EMU_MOUSE /* code intented to be used on note- */ -# define PCVT_EMU_MOUSE 1 /* books in conjunction with XFree86; */ -#endif /* look at the comments in pcvt_kbd.c */ - /* if you are interested in testing it. */ - -#if !defined PCVT_META_ESC /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_META_ESC 0 /* if ON, send the sequence "ESC key" */ -#elif PCVT_META_ESC != 0 /* for a meta-shifted key; if OFF, */ -# undef PCVT_META_ESC /* send the normal key code with 0x80 */ -# define PCVT_META_ESC 1 /* added. */ -#endif - -#if !defined PCVT_SW0CNOUTP /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_SW0CNOUTP 0 /* if ON, on console/kernel output the */ -#elif PCVT_SW0CNOUTP != 0 /* current screen is switched to screen */ -# undef PCVT_SW0CNOUTP /* 0 if not already at screen 0. */ -# define PCVT_SW0CNOUTP 1 /* CAUTION: CURRENTLY THIS CAUSES AN X- */ -#endif /* SESSION TO CLUTTER VIDEO MEMORY !!!! */ - -/* -------------------------------------------------------------------- */ -/* -------------------- DRIVER DEBUGGING ------------------------------ */ -/* -------------------------------------------------------------------- */ - -#if !defined PCVT_SHOWKEYS /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_SHOWKEYS 0 /* this replaces the system load line */ -#elif PCVT_SHOWKEYS != 0 /* on the vt 0 in hp mode with a display*/ -# undef PCVT_SHOWKEYS /* of the most recent keyboard scan- */ -# define PCVT_SHOWKEYS 1 /* and status codes received from the */ -#endif /* keyboard controller chip. */ - /* this is just for some hardcore */ - /* keyboarders .... */ - -/* -------------------------------------------------------------------- */ -/* -------------------- DRIVER OPTIONS -------------------------------- */ -/* -------------------------------------------------------------------- */ -/* it is unlikely that anybody wants to change anything below */ - -#if !defined PCVT_NO_LED_UPDATE /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_NO_LED_UPDATE 0 /* On some (Notebook?) keyboards it is */ -#elif PCVT_NO_LED_UPDATE != 0 /* not possible to update the LED's */ -# undef PCVT_NO_LED_UPDATE /* without hanging the keyboard after- */ -# define PCVT_NO_LED_UPDATE 1 /* wards. If you experience Problems */ -#endif /* like this, try to enable this option */ - -#if !defined PCVT_PORTIO_DELAY /* ---------- DEFAULT: ON ------------- */ -# define PCVT_PORTIO_DELAY 1 /* Defining PCVT_PORTIO_DELAY lets pcvt */ -#elif PCVT_PORTIO_DELAY != 0 /* use multiple accesses to port 0x84 */ -# undef PCVT_PORTIO_DELAY /* to produce a delay of 7 us needed for*/ -# define PCVT_PORTIO_DELAY 1 /* accessing the keyboard controller, */ -#endif /* otherwise the system delay functions */ - /* are used. */ - -#if !defined PCVT_PCBURST /* ---------- DEFAULT: 256 ------------ */ -# define PCVT_PCBURST 256 /* NETBSD and FreeBSD >= 2.0 only: this */ -#endif /* is the number of output characters */ - /* handled together as a burst in */ - /* routine pcstart(), file pcvt_drv.c */ - -#if !defined PCVT_SCANSET /* ---------- DEFAULT: 1 -------------- */ -# define PCVT_SCANSET 1 /* define the keyboard scancode set you */ -#endif /* want to use: */ - /* 1 - code set 1 (supported) */ - /* 2 - code set 2 (supported) */ - /* 3 - code set 3 (UNsupported) */ - -#if !defined PCVT_KEYBDID /* ---------- DEFAULT: ON ------------- */ -# define PCVT_KEYBDID 1 /* check type of keyboard connected. at */ -#elif PCVT_KEYBDID != 0 /* least HP-keyboards send an id other */ -# undef PCVT_KEYBDID /* than the industry standard, so it */ -# define PCVT_KEYBDID 1 /* CAN lead to problems. if you have */ -#endif /* problems with this, TELL ME PLEASE ! */ - -#if !defined PCVT_SIGWINCH /* ---------- DEFAULT: ON ------------- */ -# define PCVT_SIGWINCH 1 /* this sends a SIGWINCH signal in case */ -#elif PCVT_SIGWINCH != 0 /* the window size is changed. to try, */ -# undef PCVT_SIGWINCH /* issue "scons -s<size>" while in elvis*/ -# define PCVT_SIGWINCH 1 /* and you'll see the effect. */ -#endif /* i'm not sure, whether this feature */ - /* has to be in the driver or has to */ - /* move as an ioctl call to scon .... */ - -#if !defined PCVT_NULLCHARS /* ---------- DEFAULT: ON ------------- */ -# define PCVT_NULLCHARS 1 /* allow the keyboard to send null */ -#elif PCVT_NULLCHARS != 0 /* (0x00) characters to the calling */ -# undef PCVT_NULLCHARS /* program. this has the side effect */ -# define PCVT_NULLCHARS 1 /* that every undefined key also sends */ -#endif /* out nulls. take it as experimental */ - /* code, this behaviour will change in */ - /* a future release */ - -#if !defined PCVT_BACKUP_FONTS /* ---------- DEFAULT: ON ------------- */ -# define PCVT_BACKUP_FONTS 1 /* fonts are always kept memory-backed; */ -#elif PCVT_BACKUP_FONTS != 0 /* otherwise copies are only made if */ -# undef PCVT_BACKUP_FONTS /* they are needed. */ -# define PCVT_BACKUP_FONTS 1 -#endif - -#ifndef PCVT_UPDATEFAST /* this is the rate at which the cursor */ -# define PCVT_UPDATEFAST (hz/10) /* gets updated with its new position */ -#endif /* see: async_update() in pcvt_sup.c */ - -#ifndef PCVT_UPDATESLOW /* this is the rate at which the cursor */ -# define PCVT_UPDATESLOW 3 /* position display and the system load */ -#endif /* (or the keyboard scancode display) */ - /* is updated. the relation is: */ - /* PCVT_UPDATEFAST/PCVT_UPDATESLOW */ - -#ifndef PCVT_SYSBEEPF /* timer chip value to be used for the */ -# define PCVT_SYSBEEPF 1193182 /* sysbeep frequency value. */ -#endif /* this should really go somewhere else,*/ - /* e.g. in isa.h; but it used to be in */ - /* each driver, sometimes even with */ - /* different values (:-) */ - -#if !defined PCVT_SETCOLOR /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_SETCOLOR 0 /* enable making colors settable. this */ -#elif PCVT_SETCOLOR != 0 /* introduces a new escape sequence */ -# undef PCVT_SETCOLOR /* <ESC d> which is (i think) not */ -# define PCVT_SETCOLOR 1 /* standardized, so this is an option */ -#endif /* (Birthday present for Bruce ! :-) */ - -#if !defined PCVT_132GENERIC /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_132GENERIC 0 /* if you #define this, you enable */ -#elif PCVT_132GENERIC != 0 /* EXPERIMENTAL (!!!!!!!!!!!!) */ -# undef PCVT_132GENERIC /* USE-AT-YOUR-OWN-RISK, */ -# define PCVT_132GENERIC 1 /* MAY-DAMAGE-YOUR-MONITOR */ -#endif /* code to switch generic VGA boards/ */ - /* chipsets to 132 column mode. Since */ - /* i could not verify this option, i */ - /* prefer to NOT generally enable this, */ - /* if you want to play, look at the */ - /* hints and the code in pcvt_sup.c and */ - /* get in contact with Joerg Wunsch, who*/ - /* submitted this code. Be careful !!! */ - -#if !defined PCVT_PALFLICKER /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_PALFLICKER 0 /* this option turns off the screen */ -#elif PCVT_PALFLICKER != 0 /* during accesses to the VGA DAC */ -# undef PCVT_PALFLICKER /* registers. why: on one fo the tested */ -# define PCVT_PALFLICKER 1 /* pc's (WD-chipset), accesses to the */ -#endif /* vga dac registers caused distortions */ - /* on the screen. Ferraro says, one has */ - /* to blank the screen. the method used */ - /* to accomplish this stopped the noise */ - /* but introduced another flicker, so */ - /* this is for you to experiment ..... */ - /* - see also PCVT_WAITRETRACE below -- */ - -#if !defined PCVT_WAITRETRACE /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_WAITRETRACE 0 /* this option waits for being in a */ -#elif PCVT_WAITRETRACE != 0 /* retrace window prior to accessing */ -# undef PCVT_WAITRETRACE /* the VGA DAC registers. */ -# define PCVT_WAITRETRACE 1 /* this is the other method Ferraro */ -#endif /* mentioned in his book. this option */ - /* did eleminate the flicker noticably */ - /* but not completely. besides that, it */ - /* is implemented as a busy-wait loop */ - /* which is a no-no-no in environments */ - /* like this - VERY BAD PRACTICE !!!!! */ - /* the other method implementing it is */ - /* using the vertical retrace irq, but */ - /* we get short of irq-lines on pc's. */ - /* this is for you to experiment ..... */ - /* -- see also PCVT_PALFLICKER above -- */ - -#if !defined PCVT_INHIBIT_NUMLOCK /* --------- DEFAULT: OFF ----------- */ -# define PCVT_INHIBIT_NUMLOCK 0 /* A notebook hack: since i am getting */ -#elif PCVT_INHIBIT_NUMLOCK != 0 /* tired of the numlock LED always */ -# undef PCVT_INHIBIT_NUMLOCK /* being turned on - which causes the */ -# define PCVT_INHIBIT_NUMLOCK 1 /* right half of my keyboard being */ -#endif /* interpreted as a numeric keypad and */ - /* thus going unusable - i want to */ - /* have a better control over it. If */ - /* this option is enabled, only the */ - /* numlock key itself and the related */ - /* ioctls will modify the numlock */ - /* LED. (The ioctl is needed for the */ - /* ServerNumLock feature of XFree86.) */ - /* The default state is changed to */ - /* numlock off, and the escape */ - /* sequences to switch between numeric */ - /* and application mode keypad are */ - /* silently ignored. */ - -#if !defined PCVT_NOFASTSCROLL /* ---------- DEFAULT: OFF ------------ */ -# define PCVT_NOFASTSCROLL 0 /* If off, enables code for fast scroll.*/ -#elif PCVT_NOFASTSCROLL != 0 /* This is done by changing the CRTC */ -# undef PCVT_NOFASTSCROLL /* screen start address for scrolling */ -# define PCVT_NOFASTSCROLL 1 /* and using 2 times the screen size as */ -#endif /* buffer. The fastscroll code works */ - /* ONLY for VGA/EGA/CGA because it uses */ - /* the crtc for hardware scrolling and */ - /* therefore needs more than the one */ - /* page video memory MDA and most */ - /* Hercules boards support. */ - /* If you run pcvt ONLY on MDA/Hercules */ - /* you should disable fastscroll to save*/ - /* the time to decide which board you */ - /* are running pcvt on at runtime. */ - /* [see roll_up() and roll_down().] */ - -#if !defined PCVT_SLOW_INTERRUPT/* ---------- DEFAULT: OFF ------------ */ -# define PCVT_SLOW_INTERRUPT 0 /* If off, protecting critical regions */ -#elif PCVT_SLOW_INTERRUPT != 0 /* in the keyboard fifo code is done by */ -# undef PCVT_SLOW_INTERRUPT /* disabling the processor irq's, if on */ -# define PCVT_SLOW_INTERRUPT 1 /* this is done by spl()/splx() calls. */ -#endif - -#ifdef XSERVER - -#if !defined PCVT_USL_VT_COMPAT /* ---------- DEFAULT: ON ------------- */ -# define PCVT_USL_VT_COMPAT 1 /* this option enables multiple virtual */ -#elif PCVT_USL_VT_COMPAT != 0 /* screen support for XFree86. If set */ -# undef PCVT_USL_VT_COMPAT /* to off, support for a "classic" */ -# define PCVT_USL_VT_COMPAT 1 /* single screen only X server is */ -#endif /* compiled in. If enabled, most of the */ - /* ioctl's from SYSV/USL are supported */ - /* to run multiple X servers and/or */ - /* character terminal sessions. */ - -#endif /* XSERVER */ - -/*---------------------------------------------------------------------------* - * Kernel messages attribute definitions - * These define the foreground and background attributes used to - * emphasize messages from the kernel on color and mono displays. - *---------------------------------------------------------------------------*/ - -#if !defined COLOR_KERNEL_FG /* color displays */ -#define COLOR_KERNEL_FG FG_LIGHTGREY /* kernel messages, foreground */ -#endif -#if !defined COLOR_KERNEL_BG -#define COLOR_KERNEL_BG BG_RED /* kernel messages, background */ -#endif - -#if !defined MONO_KERNEL_FG /* monochrome displays */ -#define MONO_KERNEL_FG FG_UNDERLINE /* kernel messages, foreground */ -#endif -#if !defined MONO_KERNEL_BG -#define MONO_KERNEL_BG BG_BLACK /* kernel messages, background */ -#endif - -/*---------------------------------- E O F ----------------------------------*/ diff --git a/sys/i386/isa/pcvt/pcvt_drv.c b/sys/i386/isa/pcvt/pcvt_drv.c deleted file mode 100644 index 99217c0..0000000 --- a/sys/i386/isa/pcvt/pcvt_drv.c +++ /dev/null @@ -1,1641 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. - * - * Copyright (c) 1992, 1993 Brian Dunford-Shore and Scott Turner. - * - * Copyright (c) 1993 Charles Hannum. - * - * All rights reserved. - * - * Parts of this code regarding the NetBSD interface were written - * by Charles Hannum. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz and Don Ahn. - * - * 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, Joerg Wunsch, Scott Turner - * and Charles Hannum. - * 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_drv.c, 3.20, Last Edit-Date: [Sun Apr 2 19:09:19 1995] - * - */ - -/*---------------------------------------------------------------------------* - * - * pcvt_drv.c VT220 Driver Main Module / OS - Interface - * --------------------------------------------------------- - * -hm ------------ Release 3.00 -------------- - * -hm integrating NetBSD-current patches - * -hm adding ttrstrt() proto for NetBSD 0.9 - * -hm kernel/console output cursor positioning fixed - * -hm kernel/console output switches optional to screen 0 - * -hm FreeBSD 1.1 porting - * -hm the NetBSD 0.9 compiler detected a nondeclared var which was - * NOT detected by neither the NetBSD-current nor FreeBSD 1.x! - * -hm including Michael's keyboard fifo code - * -hm Joergs patch for FreeBSD tty-malloc code - * -hm adjustments for NetBSD-current - * -hm FreeBSD bugfix from Joerg re timeout/untimeout casts - * -jw including Thomas Gellekum's FreeBSD 1.1.5 patch - * -hm adjusting #if's for NetBSD-current - * -hm applying Joerg's patch for FreeBSD 2.0 - * -hm patch from Onno & Martin for NetBSD-current (post 1.0) - * -hm some adjustments for NetBSD 1.0 - * -hm NetBSD PR #400: screen size report for new session - * -hm patch from Rafael Boni/Lon Willett for NetBSD-current - * -hm bell patch from Thomas Eberhardt for NetBSD - * -hm multiple X server bugfixes from Lon Willett - * -hm patch from joerg - pcdevtotty for FreeBSD pre-2.1 - * -hm delay patch from Martin Husemann after port-i386 ml-discussion - * -jw add some code to provide more FreeBSD pre-2.1 support - * - *---------------------------------------------------------------------------*/ - -#include "vt.h" -#if NVT > 0 - -#include "opt_devfs.h" - -#define EXTERN /* allocate mem */ - -#include <i386/isa/pcvt/pcvt_hdr.h> /* global include */ -#ifdef DEVFS -#include <sys/devfsext.h> -#if !defined(MAXCONS) -#define MAXCONS 16 -#endif -static void *pcvt_devfs_token[MAXCONS]; -#endif /*DEVFS*/ - -#if PCVT_FREEBSD >= 200 -#include <machine/stdarg.h> -#else -#include "machine/stdarg.h" -#endif - -extern int getchar __P((void)); - -#if PCVT_NETBSD - extern u_short *Crtat; -#endif /* PCVT_NETBSD */ - -static unsigned __debug = 0; /*0xffe */ -static __color; -static nrow; - -static void vgapelinit(void); /* read initial VGA DAC palette */ - -#if defined XSERVER && !PCVT_USL_VT_COMPAT -static int pcvt_xmode_set(int on, struct proc *p); /* initialize for X mode */ -#endif /* XSERVER && !PCVT_USL_VT_COMPAT */ - -static d_open_t pcopen; -static d_close_t pcclose; -static d_read_t pcread; -static d_write_t pcwrite; -static d_ioctl_t pcioctl; -static d_devtotty_t pcdevtotty; -static d_mmap_t pcmmap; - -#define CDEV_MAJOR 12 -static struct cdevsw pc_cdevsw = { - pcopen, pcclose, pcread, pcwrite, - pcioctl, nullstop, noreset, pcdevtotty, - ttpoll, pcmmap, nostrategy, "vt", - NULL, -1, nodump, nopsize, - D_TTY, -}; - -#if PCVT_FREEBSD > 205 -struct tty * -pcdevtotty(Dev_t dev) -{ - return get_pccons(dev); -} - -#endif /* PCVT_FREEBSD > 205 */ - -#if PCVT_NETBSD > 100 /* NetBSD-current Feb 20 1995 */ -int -pcprobe(struct device *parent, void *match, void *aux) -#else -#if PCVT_NETBSD > 9 -int -pcprobe(struct device *parent, struct device *self, void *aux) -#else -int -pcprobe(struct isa_device *dev) -#endif /* PCVT_NETBSD > 9 */ -#endif /* PCVT_NETBSD > 100 */ -{ -#ifdef _I386_ISA_KBDIO_H_ - kbdc = kbdc_open(IO_KBD); - - if(kbdc == NULL) - { - reset_keyboard = 0; - return 1; - } - - reset_keyboard = 1; /* it's now safe to do kbd reset */ -#endif /* _I386_ISA_KBDIO_H_ */ - - kbd_code_init(); - -#if PCVT_NETBSD > 9 - ((struct isa_attach_args *)aux)->ia_iosize = 16; - return 1; -#else -#if PCVT_NETBSD || PCVT_FREEBSD - return (16); -#else - return 1; -#endif /* PCVT_NETBSD || PCVT_FREEBSD */ -#endif /* PCVT_NETBSD > 9 */ - -} - -#if PCVT_NETBSD > 9 -void -pcattach(struct device *parent, struct device *self, void *aux) -{ - struct isa_attach_args *ia = aux; - static struct intrhand vthand; -#else -int -pcattach(struct isa_device *dev) -{ -#endif /* PCVT_NETBSD > 9 */ - -#ifdef DEVFS - int vt; -#endif /*DEVFS*/ - int i; - - vt_coldmalloc(); /* allocate memory for screens */ - -#if PCVT_NETBSD || PCVT_FREEBSD - -#if PCVT_NETBSD > 9 - printf(": "); -#else - printf("vt%d: ", dev->id_unit); -#endif /* PCVT_NETBSD > 9 */ - - switch(adaptor_type) - { - case MDA_ADAPTOR: - printf("mda"); - break; - - case CGA_ADAPTOR: - printf("cga"); - break; - - case EGA_ADAPTOR: - printf("ega"); - break; - - case VGA_ADAPTOR: - printf("%s, ", (char *)vga_string(vga_type)); - if(can_do_132col) - printf("80/132 col"); - else - printf("80 col"); - vgapelinit(); - break; - - default: - printf("unknown"); - break; - } - - if(color == 0) - printf(", mono"); - else - printf(", color"); - - printf(", %d scr, ", totalscreens); - - switch(keyboard_type) - { - case KB_AT: - printf("at-"); - break; - - case KB_MFII: - printf("mf2-"); - break; - - default: - printf("unknown "); - break; - } - - printf("kbd, [R%s]\n", PCVT_REL); - -#if PCVT_NETBSD || (PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) - - for(i = 0; i < totalscreens; i++) - { - -#if PCVT_NETBSD - pc_tty[i] = ttymalloc(); - vs[i].vs_tty = pc_tty[i]; -#else /* !PCVT_NETBSD */ - pccons[i] = ttymalloc(pccons[i]); - vs[i].vs_tty = pccons[i]; -#endif /* PCVT_NETBSD */ - - } - -#if PCVT_EMU_MOUSE -#if PCVT_NETBSD - pc_tty[totalscreens] = ttymalloc(); /* the mouse emulator tty */ -#else /* !PCVT_NETBSD */ - /* the mouse emulator tty */ - pc_tty[totalscreens] = ttymalloc(pccons[totalscreens]); -#endif /* PCVT_NETBSD */ -#endif /* PCVT_EMU_MOUSE */ - -#if PCVT_NETBSD - pcconsp = pc_tty[0]; -#else /* !PCVT_NETBSD */ - pcconsp = pccons[0]; -#endif /* PCVT_NETBSD */ - -#endif /* #if PCVT_NETBSD || (PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) */ - -#else /* !PCVT_NETBSD && !PCVT_FREEBSD*/ - - switch(adaptor_type) - { - case MDA_ADAPTOR: - printf(" <mda"); - break; - - case CGA_ADAPTOR: - printf(" <cga"); - break; - - case EGA_ADAPTOR: - printf(" <ega"); - break; - - case VGA_ADAPTOR: - printf(" <%s,", (char *)vga_string(vga_type)); - if(can_do_132col) - printf("80/132 col"); - else - printf("80 col"); - vgapelinit(); - break; - - default: - printf(" <unknown"); - break; - } - - if(color == 0) - printf(",mono"); - else - printf(",color"); - - printf(",%d scr,", totalscreens); - - switch(keyboard_type) - { - case KB_AT: - printf("at-"); - break; - - case KB_MFII: - printf("mf2-"); - break; - - default: - printf("unknown "); - break; - } - - printf("kbd,[R%s]>", PCVT_REL); - -#endif /* PCVT_NETBSD || PCVT_FREEBSD */ - -#if !PCVT_NETBSD && !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) - for(i = 0; i < totalscreens; i++) - vs[i].vs_tty = &pccons[i]; -#endif /* !PCVT_NETBSD && !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) */ - - async_update(UPDATE_START); /* start asynchronous updates */ - -#if PCVT_FREEBSD > 205 - { - dev_t dev = makedev(CDEV_MAJOR, 0); - - cdevsw_add(&dev, &pc_cdevsw, NULL); - } - -#ifdef DEVFS - for(vt = 0; vt < MAXCONS; vt++) { - pcvt_devfs_token[vt] = - devfs_add_devswf(&pc_cdevsw, vt, - DV_CHR, 0, 0, 0600, "ttyv%r", vt ); - } -#endif DEVFS -#endif /* PCVT_FREEBSD > 205 */ - -#if PCVT_NETBSD > 9 - - vthand.ih_fun = pcrint; - vthand.ih_arg = 0; - vthand.ih_level = IPL_TTY; - -#if (PCVT_NETBSD > 100) && defined(IST_EDGE) - intr_establish(ia->ia_irq, IST_EDGE, &vthand); -#else /* PCVT_NETBSD > 100 */ - intr_establish(ia->ia_irq, &vthand); -#endif /* PCVT_NETBSD > 100 */ - -#else /* PCVT_NETBSD > 9 */ - - dev->id_ointr = pcrint; - - return 1; - -#endif /* PCVT_NETBSD > 9 */ - -} - -/* had a look at the friedl driver */ - -#if !PCVT_NETBSD - -struct tty * -get_pccons(Dev_t dev) -{ - register int i = minor(dev); - -#if PCVT_EMU_MOUSE - if(i == totalscreens) -#if !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) - return(&pccons[i]); -#else - return(pccons[i]); -#endif /* !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) */ -#endif /* PCVT_EMU_MOUSE */ - - if(i >= PCVT_NSCREENS) - return(NULL); -#if !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) - return(&pccons[i]); -#else - return(pccons[i]); -#endif -} - -#else - -struct tty * -get_pccons(Dev_t dev) -{ - register int i = minor(dev); - -#if PCVT_EMU_MOUSE - if(i == totalscreens) - return(pc_tty[i]); -#endif /* PCVT_EMU_MOUSE */ - - if(i >= PCVT_NSCREENS) - return(NULL); - return(pc_tty[i]); -} - -#endif /* !PCVT_NETBSD */ - -/*---------------------------------------------------------------------------* - * /dev/ttyc0, /dev/ttyc1, etc. - *---------------------------------------------------------------------------*/ -int -pcopen(Dev_t dev, int flag, int mode, struct proc *p) -{ - register struct tty *tp; - register struct video_state *vsx; - int s, retval; - int winsz = 0; - int i = minor(dev); - -#if PCVT_EMU_MOUSE - if(i == totalscreens) - vsx = 0; - else -#endif /* PCVT_EMU_MOUSE */ - - vsx = &vs[i]; - - if((tp = get_pccons(dev)) == NULL) - return ENXIO; - -#if PCVT_EMU_MOUSE - if(i == totalscreens) - { - if(mouse.opened == 0) - mouse.buttons = mouse.extendedseen = - mouse.breakseen = mouse.lastmove.tv_sec = 0; - mouse.minor = i; - mouse.opened++; - } - else -#endif /* PCVT_EMU_MOUSE */ - - vsx->openf++; - - tp->t_oproc = pcstart; - tp->t_param = pcparam; - tp->t_dev = dev; - - if ((tp->t_state & TS_ISOPEN) == 0) - { - -#ifdef TS_WOPEN /* not (FreeBSD-1.1.5 or FreeBSD some time after 2.0.5) */ - tp->t_state |= TS_WOPEN; -#endif - - ttychars(tp); - tp->t_iflag = TTYDEF_IFLAG; - tp->t_oflag = TTYDEF_OFLAG; - tp->t_cflag = TTYDEF_CFLAG; - tp->t_lflag = TTYDEF_LFLAG; - tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; - pcparam(tp, &tp->t_termios); - (*linesw[tp->t_line].l_modem)(tp, 1); /* fake connection */ - winsz = 1; /* set winsize later */ - } - else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) - return (EBUSY); - -#if PCVT_NETBSD || (PCVT_FREEBSD >= 200) - retval = ((*linesw[tp->t_line].l_open)(dev, tp)); -#else - retval = ((*linesw[tp->t_line].l_open)(dev, tp, flag)); -#endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */ - - if(winsz == 1) - { - - /* - * The line discipline has clobbered t_winsize if TS_ISOPEN - * was clear. (NetBSD PR #400 from Bill Sommerfeld) - * We have to do this after calling the open routine, because - * it does some other things in other/older *BSD releases -hm - */ - - s = spltty(); - - tp->t_winsize.ws_col = vsx->maxcol; - tp->t_winsize.ws_row = vsx->screen_rows; - tp->t_winsize.ws_xpixel = (vsx->maxcol == 80)? 720: 1056; - tp->t_winsize.ws_ypixel = 400; - - splx(s); - } - - return(retval); -} - -int -pcclose(Dev_t dev, int flag, int mode, struct proc *p) -{ - register struct tty *tp; - register struct video_state *vsx; - int i = minor(dev); - -#if PCVT_EMU_MOUSE - if(i == totalscreens) - vsx = 0; - else -#endif /* PCVT_EMU_MOUSE */ - - vsx = &vs[i]; - - if((tp = get_pccons(dev)) == NULL) - return ENXIO; - - (*linesw[tp->t_line].l_close)(tp, flag); - ttyclose(tp); - -#if PCVT_EMU_MOUSE - if(i == totalscreens) - mouse.opened = 0; - else -#endif /* PCVT_EMU_MOUSE */ - - vsx->openf = 0; - -#if PCVT_USL_VT_COMPAT -#if PCVT_EMU_MOUSE - - if(i == totalscreens) - return (0); - -#endif /* PCVT_EMU_MOUSE */ - - reset_usl_modes(vsx); - -#endif /* PCVT_USL_VT_COMPAT */ - - return(0); -} - -int -pcread(Dev_t dev, struct uio *uio, int flag) -{ - register struct tty *tp; - - if((tp = get_pccons(dev)) == NULL) - return ENXIO; - - return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); -} - -int -pcwrite(Dev_t dev, struct uio *uio, int flag) -{ - register struct tty *tp; - - if((tp = get_pccons(dev)) == NULL) - return ENXIO; - - return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); -} - -int -pcioctl(Dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) -{ - register error; - register struct tty *tp; - - if((tp = get_pccons(dev)) == NULL) - return(ENXIO); - - /* note that some ioctl's are global, e.g. KBSTPMAT: There is - * only one keyboard and different repeat rates for instance between - * sessions are a suspicious wish. If you really need this make the - * appropriate variables arrays - */ - -#if PCVT_EMU_MOUSE - if(minor(dev) == totalscreens) - { - if((error = mouse_ioctl(dev, cmd, data)) >= 0) - return error; - goto do_standard; - } -#endif /* PCVT_EMU_MOUSE */ - -#ifdef XSERVER -#if PCVT_USL_VT_COMPAT - - if((error = usl_vt_ioctl(dev, cmd, data, flag, p)) >= 0) - return error; - - /* - * just for compatibility: - * XFree86 < 2.0 and SuperProbe still might use it - * - * NB: THIS IS A HACK! Do not use it unless you explicitly need. - * Especially, since the vty is not put into process-controlled - * mode (this would require the application to co-operate), any - * attempts to switch vtys while this kind of X mode is active - * may cause serious trouble. - */ - switch(cmd) - { - case CONSOLE_X_MODE_ON: - { - int i; - - if((error = usl_vt_ioctl(dev, KDENABIO, 0, flag, p)) > 0) - return error; - - i = KD_GRAPHICS; - if((error = usl_vt_ioctl(dev, KDSETMODE, (caddr_t)&i, flag, p)) - > 0) - return error; - - i = K_RAW; - error = usl_vt_ioctl(dev, KDSKBMODE, (caddr_t)&i, flag, p); - return error; - } - - case CONSOLE_X_MODE_OFF: - { - int i; - - (void)usl_vt_ioctl(dev, KDDISABIO, 0, flag, p); - - i = KD_TEXT; - (void)usl_vt_ioctl(dev, KDSETMODE, (caddr_t)&i, flag, p); - - i = K_XLATE; - (void)usl_vt_ioctl(dev, KDSKBMODE, (caddr_t)&i, flag, p); - return 0; - } - - - case CONSOLE_X_BELL: - - /* - * If `data' is non-null, the first int value denotes - * the pitch, the second a duration. Otherwise, behaves - * like BEL. - */ - - if (data) - { - -#if PCVT_NETBSD - sysbeep(((int *)data)[0], - ((int *)data)[1] * hz / 1000); -#else /* PCVT_NETBSD */ - sysbeep(PCVT_SYSBEEPF / ((int *)data)[0], - ((int *)data)[1] * hz / 3000); -#endif /* PCVT_NETBSD */ - - } - else - { - sysbeep(PCVT_SYSBEEPF / 1493, hz / 4); - } - return (0); - - default: /* fall through */ ; - } - -#else /* PCVT_USL_VT_COMPAT */ - - switch(cmd) - { - case CONSOLE_X_MODE_ON: - return pcvt_xmode_set(1, p); - - case CONSOLE_X_MODE_OFF: - return pcvt_xmode_set(0, p); - - case CONSOLE_X_BELL: - - /* - * If `data' is non-null, the first int value denotes - * the pitch, the second a duration. Otherwise, behaves - * like BEL. - */ - - if (data) - { - -#if PCVT_NETBSD - sysbeep(((int *)data)[0], - ((int *)data)[1] * hz / 1000); -#else /* PCVT_NETBSD */ - sysbeep(PCVT_SYSBEEPF / ((int *)data)[0], - ((int *)data)[1] * hz / 3000); -#endif /* PCVT_NETBSD */ - - } - else - { - sysbeep(PCVT_SYSBEEPF / 1493, hz / 4); - } - return (0); - - default: /* fall through */ ; - } - -#endif /* PCVT_USL_VT_COMPAT */ -#endif /* XSERVER */ - - if((error = kbdioctl(dev,cmd,data,flag)) >= 0) - return error; - - if((error = vgaioctl(dev,cmd,data,flag)) >= 0) - return error; - -#if PCVT_EMU_MOUSE -do_standard: -#endif - -#if PCVT_NETBSD > 9 || PCVT_FREEBSD >= 200 - if((error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p)) - != ENOIOCTL) - return (error); -#else - if((error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag)) >= 0) - return(error); -#endif /* PCVT_NETBSD > 9 || PCVT_FREEBSD >= 200 */ - -#if PCVT_NETBSD > 9 - if((error = ttioctl(tp, cmd, data, flag, p)) >= 0) - return (error); -#else - if((error = ttioctl(tp, cmd, data, flag)) != ENOIOCTL) - return (error); -#endif /* PCVT_NETBSD > 9 */ - - return (ENOTTY); -} - -int -pcmmap(Dev_t dev, vm_offset_t offset, int nprot) -{ - if (offset > 0x20000 - PAGE_SIZE) - return -1; - return i386_btop((0xa0000 + offset)); -} - -/*---------------------------------------------------------------------------* - * - * handle a keyboard receive interrupt - * - * NOTE: the keyboard is multiplexed by means of "pcconsp" - * between virtual screens. pcconsp - switching is done in - * the vgapage() routine - * - *---------------------------------------------------------------------------*/ - -#if PCVT_KBD_FIFO - -u_char pcvt_kbd_fifo[PCVT_KBD_FIFO_SZ]; -static int pcvt_kbd_wptr = 0; -int pcvt_kbd_rptr = 0; -short pcvt_kbd_count= 0; -static u_char pcvt_timeout_scheduled = 0; - -static void -pcvt_timeout(void *arg) -{ - u_char *cp; - -#if PCVT_SLOW_INTERRUPT - int s; -#endif - - pcvt_timeout_scheduled = 0; - -#if PCVT_SCREENSAVER - pcvt_scrnsv_reset(); -#endif /* PCVT_SCREENSAVER */ - - while (pcvt_kbd_count) - { - if (((cp = sgetc(1)) != 0) && - (vs[current_video_screen].openf)) - { - -#if PCVT_NULLCHARS - if(*cp == '\0') - { - /* pass a NULL character */ - (*linesw[pcconsp->t_line].l_rint)('\0', pcconsp); - } -/* XXX */ else -#endif /* PCVT_NULLCHARS */ - - while (*cp) - (*linesw[pcconsp->t_line].l_rint)(*cp++ & 0xff, pcconsp); - } - - PCVT_DISABLE_INTR (); - - if (!pcvt_kbd_count) - pcvt_timeout_scheduled = 0; - - PCVT_ENABLE_INTR (); - } - - return; -} -#endif - - -void -pcrint(int unit) -{ - -#if PCVT_KBD_FIFO - u_char dt; - u_char ret = -1; - -# if PCVT_SLOW_INTERRUPT - int s; -# endif - -# ifdef _I386_ISA_KBDIO_H_ - int c; -# endif - -#else /* !PCVT_KBD_FIFO */ - u_char *cp; -#endif /* PCVT_KBD_FIFO */ - - /* - * in case the keyboard was not plugged in while booting, kbdc - * was set to NULL at that time. When a keyboard IRQ occurs and - * kbdc is NULL, the keyboard was probably reconnected to the - * keyboard controller and we have to initialize the keyboard. - */ - - if(kbdc == NULL) - { - kbdc = kbdc_open(IO_KBD); - if(kbdc == NULL) - { - reset_keyboard = 0; - return; - } - reset_keyboard = 1; - kbd_code_init(); - } - -#if PCVT_SCREENSAVER - pcvt_scrnsv_reset(); -#endif /* PCVT_SCREENSAVER */ - -#if PCVT_KBD_FIFO - if (kbd_polling) - { - sgetc(1); - return; - } - -# ifndef _I386_ISA_KBDIO_H_ - while (inb(CONTROLLER_CTRL) & STATUS_OUTPBF) /* check 8042 buffer */ - { - ret = 1; /* got something */ - - PCVT_KBD_DELAY(); /* 7 us delay */ - - dt = inb(CONTROLLER_DATA); /* get it 8042 data */ -# else - while ((c = read_kbd_data_no_wait(kbdc)) != -1) - { - ret = 1; /* got something */ - dt = c; -# endif /* _I386_ISA_KBDIO_H_ */ - - if (pcvt_kbd_count >= PCVT_KBD_FIFO_SZ) /* fifo overflow ? */ - { - log (LOG_WARNING, "pcvt: keyboard buffer overflow\n"); - } - else - { - pcvt_kbd_fifo[pcvt_kbd_wptr++] = dt; /* data -> fifo */ - - PCVT_DISABLE_INTR (); /* XXX necessary ? */ - pcvt_kbd_count++; /* update fifo count */ - PCVT_ENABLE_INTR (); - - if (pcvt_kbd_wptr >= PCVT_KBD_FIFO_SZ) - pcvt_kbd_wptr = 0; /* wraparound pointer */ - } - } - - if (ret == 1) /* got data from keyboard ? */ - { - if (!pcvt_timeout_scheduled) /* if not already active .. */ - { - PCVT_DISABLE_INTR (); - pcvt_timeout_scheduled = 1; /* flag active */ - timeout(pcvt_timeout, NULL, hz / 100); /* fire off */ - PCVT_ENABLE_INTR (); - } - } - -#else /* !PCVT_KBD_FIFO */ - - if((cp = sgetc(1)) == 0) - return; - - if (kbd_polling) - return; - - if(!(vs[current_video_screen].openf)) /* XXX was vs[minor(dev)] */ - return; - -#if PCVT_NULLCHARS - if(*cp == '\0') - { - /* pass a NULL character */ - (*linesw[pcconsp->t_line].l_rint)('\0', pcconsp); - return; - } -#endif /* PCVT_NULLCHARS */ - - while (*cp) - (*linesw[pcconsp->t_line].l_rint)(*cp++ & 0xff, pcconsp); - -#endif /* PCVT_KBD_FIFO */ -} - - -#if PCVT_NETBSD || PCVT_FREEBSD >= 200 - -void -pcstart(register struct tty *tp) -{ - register struct clist *rbp; - int s, len; - u_char buf[PCVT_PCBURST]; - - s = spltty(); - - if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP)) - goto out; - - tp->t_state |= TS_BUSY; - - splx(s); - - async_update(UPDATE_KERN); - - rbp = &tp->t_outq; - - /* - * Call q_to_b() at spltty() to ensure that the queue is empty when - * the loop terminates. - */ - - s = spltty(); - - while (len = q_to_b(rbp, buf, PCVT_PCBURST)) - { - /* - * We need to do this outside spl since it could be fairly - * expensive and we don't want our serial ports to overflow. - */ - splx(s); - sput(&buf[0], 0, len, minor(tp->t_dev)); - s = spltty(); - } - - tp->t_state &= ~TS_BUSY; - -#ifndef TS_ASLEEP /* FreeBSD some time after 2.0.5 */ - ttwwakeup(tp); -#else - if (rbp->c_cc <= tp->t_lowat) - { - if (tp->t_state&TS_ASLEEP) - { - tp->t_state &= ~TS_ASLEEP; - wakeup((caddr_t)rbp); - } - selwakeup(&tp->t_wsel); - } -#endif -out: - splx(s); -} - -void -pcstop(struct tty *tp, int flag) -{ -} - -#else /* PCVT_NETBSD || PCVT_FREEBSD >= 200 */ - -void -pcstart(struct tty *tp) -{ - int s; - unsigned char c; - - s = spltty(); - - if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP)) - { - goto out; - } - - for(;;) - { - -#if !(PCVT_FREEBSD > 114) - -#if !(PCVT_FREEBSD > 111) - if (RB_LEN(&tp->t_out) <= tp->t_lowat) -#else - if (RB_LEN(tp->t_out) <= tp->t_lowat) -#endif - { - if (tp->t_state&TS_ASLEEP) - { - tp->t_state &= ~TS_ASLEEP; -#if !(PCVT_FREEBSD > 111) - wakeup((caddr_t)&tp->t_out); -#else - wakeup((caddr_t)tp->t_out); -#endif - } - - if (tp->t_wsel) - { - selwakeup(tp->t_wsel, tp->t_state & TS_WCOLL); - tp->t_wsel = 0; - tp->t_state &= ~TS_WCOLL; - } - } - -#else /* PCVT_FREEBSD > 114 */ - if (tp->t_state & (TS_SO_OCOMPLETE | TS_SO_OLOWAT) - || tp->t_wsel) { - ttwwakeup(tp); - } -#endif /* !PCVT_FREEBSD > 114 */ - -#if !(PCVT_FREEBSD > 111) - if (RB_LEN(&tp->t_out) == 0) -#else - if (RB_LEN(tp->t_out) == 0) -#endif - { - goto out; - } - -#if !(PCVT_FREEBSD > 111) - c = getc(&tp->t_out); -#else - c = getc(tp->t_out); -#endif - - tp->t_state |= TS_BUSY; /* patch from Frank Maclachlan */ - splx(s); - sput(&c, 0, 1, minor(tp->t_dev)); - spltty(); - tp->t_state &= ~TS_BUSY; /* patch from Frank Maclachlan */ - } -out: - splx(s); -} - -#endif /* PCVT_NETBSD || PCVT_FREEBSD >= 200 */ - -/*---------------------------------------------------------------------------* - * /dev/console - *---------------------------------------------------------------------------*/ - -#if !PCVT_NETBSD /* has moved to cons.c in netbsd-current */ -void -consinit() /* init for kernel messages during boot */ -{ -} -#endif /* PCVT_NETBSD */ - -#if PCVT_FREEBSD > 205 -void -#else -int -#endif -pccnprobe(struct consdev *cp) -{ - struct isa_device *dvp; - -#ifdef _I386_ISA_KBDIO_H_ - kbdc = kbdc_open(IO_KBD); - /* - * Don't reset the keyboard via `kbdio' just yet. - * The system clock has not been calibrated... - */ - reset_keyboard = 0; -#if PCVT_SCANSET == 2 - /* - * Turn off scancode translation early so that UserConfig - * and DDB can read the keyboard. - */ - empty_both_buffers(kbdc, 10); - set_controller_command_byte(kbdc, KBD_TRANSLATION, 0); -#endif /* PCVT_SCANSET == 2 */ -#endif /* _I386_ISA_KBDIO_H_ */ - - /* - * Take control if we are the highest priority enabled display device. - */ - dvp = find_display(); - if (dvp == NULL || dvp->id_driver != &vtdriver) { - cp->cn_pri = CN_DEAD; - return; - } - - /* initialize required fields */ - - cp->cn_dev = makedev(CDEV_MAJOR, 0); - cp->cn_pri = CN_INTERNAL; - -#if !PCVT_NETBSD - -#if !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) - cp->cn_tp = &pccons[0]; -#else - cp->cn_tp = pccons[0]; -#endif /* !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) */ - -#endif /* !PCVT_NETBSD */ - -#if PCVT_FREEBSD <= 205 - return 1; -#endif -} - -#if PCVT_FREEBSD > 205 -void -#else -int -#endif -pccninit(struct consdev *cp) -{ - pcvt_is_console = 1; -#if PCVT_FREEBSD <= 205 - return 0; -#endif -} - -#if PCVT_FREEBSD > 205 -void -#else -int -#endif -pccnputc(Dev_t dev, U_char c) -{ - -#if PCVT_SW0CNOUTP - - if(current_video_screen != 0) - { - -#if !PCVT_USL_VT_COMPAT - vgapage(0); -#else - switch_screen(0, 0); -#endif /* !PCVT_USL_VT_COMPAT */ - - } - -#endif /* PCVT_SW0CNOUTP */ - - if (c == '\n') - sput("\r", 1, 1, 0); - - sput((char *) &c, 1, 1, 0); - - async_update(UPDATE_KERN); - -#if PCVT_FREEBSD <= 205 - return 0; -#endif -} - -int -pccngetc(Dev_t dev) -{ - register int s; - static u_char *cp, cbuf[4]; /* Temp buf for multi-char key sequence. */ - register u_char c; - -#ifdef XSERVER - -#if !PCVT_USL_VT_COMPAT - if (pcvt_xmode) - return 0; -#else /* !PCVT_USL_VT_COMPAT */ - if (pcvt_kbd_raw) - return 0; -#endif /* !PCVT_USL_VT_COMPAT */ - -#endif /* XSERVER */ - - if (cp && *cp) - /* - * We still have a pending key sequence, e.g. - * from an arrow key. Deliver this one first. - */ - return (*cp++); - - s = spltty(); /* block pcrint while we poll */ - kbd_polling = 1; - cp = sgetc(0); - kbd_polling = 0; - splx(s); - c = *cp++; - if (c && *cp) { - /* Preserve the multi-char sequence for the next call. */ - bcopy(cp, cbuf, 3); /* take care for a trailing '\0' */ - cp = cbuf; - } else - cp = 0; - -#if ! (PCVT_FREEBSD >= 201) - /* this belongs to cons.c */ - if (c == '\r') - c = '\n'; -#endif /* ! (PCVT_FREEBSD >= 201) */ - - return c; -} - -#if PCVT_FREEBSD >= 200 -int -pccncheckc(Dev_t dev) -{ - char *cp; - int x = spltty(); - kbd_polling = 1; - cp = sgetc(1); - kbd_polling = 0; - splx(x); - return (cp == NULL ? -1 : *cp); -} -#endif /* PCVT_FREEBSD >= 200 */ - -#if PCVT_NETBSD >= 100 -void -pccnpollc(Dev_t dev, int on) -{ - kbd_polling = on; - if (!on) { - register int s; - - /* - * If disabling polling, make sure there are no bytes left in - * the FIFO, holding up the interrupt line. Otherwise we - * won't get any further interrupts. - */ - s = spltty(); - pcrint(); - splx(s); - } -} -#endif /* PCVT_NETBSD >= 100 */ - -/*---------------------------------------------------------------------------* - * Set line parameters - *---------------------------------------------------------------------------*/ -int -pcparam(struct tty *tp, struct termios *t) -{ - register int cflag = t->c_cflag; - - /* and copy to tty */ - - tp->t_ispeed = t->c_ispeed; - tp->t_ospeed = t->c_ospeed; - tp->t_cflag = cflag; - - return(0); -} - -/* special characters */ -#define bs 8 -#define lf 10 -#define cr 13 -#define cntlc 3 -#define del 0177 -#define cntld 4 - -int -getchar(void) -{ - u_char thechar; - int x; - - kbd_polling = 1; - - x = splhigh(); - - sput(">", 1, 1, 0); - - async_update(UPDATE_KERN); - - thechar = *(sgetc(0)); - - kbd_polling = 0; - - splx(x); - - switch (thechar) - { - default: - if (thechar >= ' ') - sput(&thechar, 1, 1, 0); - return(thechar); - - case cr: - case lf: - sput("\r\n", 1, 2, 0); - return(lf); - - case bs: - case del: - sput("\b \b", 1, 3, 0); - return(thechar); - - case cntlc: - sput("^C\r\n", 1, 4, 0) ; - cpu_reset(); - - case cntld: - sput("^D\r\n", 1, 4, 0) ; - return(0); - } -} - -#define DPAUSE 1 - -void -dprintf(unsigned flgs, const char *fmt, ...) -{ - va_list ap; - - if((flgs&__debug) > DPAUSE) - { - __color = ffs(flgs&__debug)+1; - va_start(ap,fmt); - vprintf(fmt, ap); - va_end(ap); - - if (flgs & DPAUSE || nrow%24 == 23) - { - int x; - x = splhigh(); - if(nrow%24 == 23) - nrow = 0; - (void)sgetc(0); - splx(x); - } - } - __color = 0; -} - -/*----------------------------------------------------------------------* - * read initial VGA palette (as stored by VGA ROM BIOS) into - * palette save area - *----------------------------------------------------------------------*/ -void -vgapelinit(void) -{ - register unsigned idx; - register struct rgb *val; - - /* first, read all and store to first screen's save buffer */ - for(idx = 0, val = vs[0].palette; idx < NVGAPEL; idx++, val++) - vgapaletteio(idx, val, 0 /* read it */); - - /* now, duplicate for remaining screens */ - for(idx = 1; idx < PCVT_NSCREENS; idx++) - bcopy(vs[0].palette, vs[idx].palette, - NVGAPEL * sizeof(struct rgb)); -} - -#if defined XSERVER && !PCVT_USL_VT_COMPAT -/*----------------------------------------------------------------------* - * initialize for X mode - * i.e.: grant current process (the X server) all IO privileges, - * and mark in static variable so other hooks can test for it, - * save all loaded fonts and screen pages to pageable buffers; - * if parameter `on' is false, the same procedure is done reverse. - *----------------------------------------------------------------------*/ -static int -pcvt_xmode_set(int on, struct proc *p) -{ - static unsigned char *saved_fonts[NVGAFONTS]; - -#if PCVT_SCREENSAVER - static unsigned saved_scrnsv_tmo = 0; -#endif /* PCVT_SCREENSAVER */ - -#if (PCVT_NETBSD > 9) || (PCVT_FREEBSD > 102) - struct trapframe *fp; -#else - struct syscframe *fp; -#endif /* PCVT_NETBSD > 9 */ - - int error, i; - - /* X will only run on VGA and Hercules adaptors */ - - if(adaptor_type != VGA_ADAPTOR && adaptor_type != MDA_ADAPTOR) - return (EINVAL); - -#if PCVT_NETBSD > 9 - fp = (struct trapframe *)p->p_regs; -#else - fp = (struct syscframe *)p->p_regs; -#endif /* PCVT_NETBSD > 9 */ - - if(on) - { - /* - * Test whether the calling process has super-user privileges - * and we're in insecure mode. - * This prevents us from granting the potential security hole - * `IO priv' to insufficiently privileged processes. - */ - error = suser(p->p_ucred, &p->p_acflag); - if (error != 0) - return (error); - if (securelevel > 0) - return (EPERM); - - if(pcvt_xmode) - return 0; - - pcvt_xmode = pcvt_kbd_raw = 1; - - for(i = 0; i < totalfonts; i++) - { - if(vgacs[i].loaded) - { - saved_fonts[i] = (unsigned char *) - malloc(32 * 256, M_DEVBUF, M_WAITOK); - if(saved_fonts[i] == 0) - { - printf( - "pcvt_xmode_set: no font buffer available\n"); - return (EAGAIN); - } - else - { - vga_move_charset(i, saved_fonts[i], 1); - } - } - else - { - saved_fonts[i] = 0; - } - } - -#if PCVT_SCREENSAVER - if(saved_scrnsv_tmo = scrnsv_timeout) - pcvt_set_scrnsv_tmo(0); /* turn it off */ -#endif /* PCVT_SCREENSAVER */ - - async_update(UPDATE_STOP); /* turn off */ - - /* disable text output and save screen contents */ - /* video board memory -> kernel memory */ - - bcopy(vsp->Crtat, vsp->Memory, - vsp->screen_rowsize * vsp->maxcol * CHR); - - vsp->Crtat = vsp->Memory; /* operate in memory now */ - -#ifndef _I386_ISA_KBDIO_H_ - -#if PCVT_SCANSET == 2 - /* put keyboard to return ancient PC scan codes */ - kbc_8042cmd(CONTR_WRITE); -#if PCVT_USEKBDSEC /* security enabled */ - outb(CONTROLLER_DATA, - (COMMAND_SYSFLG|COMMAND_IRQEN|COMMAND_PCSCAN)); -#else /* security disabled */ - outb(CONTROLLER_DATA, - (COMMAND_INHOVR|COMMAND_SYSFLG|COMMAND_IRQEN|COMMAND_PCSCAN)); -#endif /* PCVT_USEKBDSEC */ -#endif /* PCVT_SCANSET == 2 */ - -#else /* _I386_ISA_KBDIO_H_ */ - -#if PCVT_SCANSET == 2 - /* put keyboard to return ancient PC scan codes */ - set_controller_command_byte(kbdc, - KBD_TRANSLATION, KBD_TRANSLATION); -#endif /* PCVT_SCANSET == 2 */ - -#endif /* !_I386_ISA_KBDIO_H_ */ - -#if PCVT_NETBSD > 9 - fp->tf_eflags |= PSL_IOPL; -#else - fp->sf_eflags |= PSL_IOPL; -#endif /* PCVT_NETBSD > 9 */ - - } - else - { - if(!pcvt_xmode) /* verify if in X */ - return 0; - - pcvt_xmode = pcvt_kbd_raw = 0; - - for(i = 0; i < totalfonts; i++) - { - if(saved_fonts[i]) - { - vga_move_charset(i, saved_fonts[i], 0); - free(saved_fonts[i], M_DEVBUF); - saved_fonts[i] = 0; - } - } - -#if PCVT_NETBSD > 9 - fp->tf_eflags &= ~PSL_IOPL; -#else - fp->sf_eflags &= ~PSL_IOPL; -#endif /* PCVT_NETBSD > 9 */ - -#if PCVT_SCREENSAVER - if(saved_scrnsv_tmo) - pcvt_set_scrnsv_tmo(saved_scrnsv_tmo); -#endif /* PCVT_SCREENSAVER */ - -#ifndef _I386_ISA_KBDIO_H_ - -#if PCVT_SCANSET == 2 - kbc_8042cmd(CONTR_WRITE); -#if PCVT_USEKBDSEC /* security enabled */ - outb(CONTROLLER_DATA, - (COMMAND_SYSFLG|COMMAND_IRQEN)); -#else /* security disabled */ - outb(CONTROLLER_DATA, - (COMMAND_INHOVR|COMMAND_SYSFLG|COMMAND_IRQEN)); -#endif /* PCVT_USEKBDSEC */ -#endif /* PCVT_SCANSET == 2 */ - -#else /* _I386_ISA_KBDIO_H_ */ - -#if PCVT_SCANSET == 2 - set_controller_command_byte(kbdc, KBD_TRANSLATION, 0); -#endif /* PCVT_SCANSET == 2 */ - -#endif /* !_I386_ISA_KBDIO_H_ */ - - if(adaptor_type == MDA_ADAPTOR) - { - /* - * Due to the fact that HGC registers are write-only, - * the Xserver can only make guesses about the state - * the HGC adaptor has been before turning on X mode. - * Thus, the display must be re-enabled now, and the - * cursor shape and location restored. - */ - outb(GN_DMCNTLM, 0x28); /* enable display, text mode */ - outb(addr_6845, CRTC_CURSORH); /* select high register */ - outb(addr_6845+1, - ((vsp->Crtat + vsp->cur_offset) - Crtat) >> 8); - outb(addr_6845, CRTC_CURSORL); /* select low register */ - outb(addr_6845+1, - ((vsp->Crtat + vsp->cur_offset) - Crtat)); - - outb(addr_6845, CRTC_CURSTART); /* select high register */ - outb(addr_6845+1, vsp->cursor_start); - outb(addr_6845, CRTC_CUREND); /* select low register */ - outb(addr_6845+1, vsp->cursor_end); - } - - /* restore screen and re-enable text output */ - /* kernel memory -> video board memory */ - - bcopy(vsp->Memory, Crtat, - vsp->screen_rowsize * vsp->maxcol * CHR); - - vsp->Crtat = Crtat; /* operate on-screen now */ - - /* set crtc screen memory start address */ - - outb(addr_6845, CRTC_STARTADRH); - outb(addr_6845+1, (vsp->Crtat - Crtat) >> 8); - outb(addr_6845, CRTC_STARTADRL); - outb(addr_6845+1, (vsp->Crtat - Crtat)); - - async_update(UPDATE_START); - } - return 0; -} -#endif /* XSERVER && !PCVT_USL_VT_COMPAT */ - -#endif /* NVT > 0 */ - -/*-------------------------- E O F -------------------------------------*/ diff --git a/sys/i386/isa/pcvt/pcvt_ext.c b/sys/i386/isa/pcvt/pcvt_ext.c deleted file mode 100644 index acf066a..0000000 --- a/sys/i386/isa/pcvt/pcvt_ext.c +++ /dev/null @@ -1,2835 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. - * - * Copyright (C) 1992, 1993 Soeren Schmidt. - * - * All rights reserved. - * - * For the sake of compatibility, portions of this code regarding the - * X server interface are taken from Soeren Schmidt's syscons driver. - * - * 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, Joerg Wunsch and Soeren Schmidt. - * 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_ext.c, 3.20, Last Edit-Date: [Thu Apr 6 10:07:45 1995] - * - */ - -/*---------------------------------------------------------------------------* - * - * pcvt_ext.c VT220 Driver Extended Support Routines - * ------------------------------------------------------ - * - * -hm ------------ Release 3.00 -------------- - * -hm integrating NetBSD-current patches - * -hm applied Onno van der Linden's patch for Cirrus BIOS upgrade - * -hm pcvt_x_hook has to care about fkey labels now - * -hm changed some bcopyb's to bcopy's - * -hm TS_INDEX -> TS_DATA for cirrus (mail from Onno/Charles) - * -jw removed kbc_8042(), and replaced by kbd_emulate_pc() - * -hm X server patch from John Kohl <jtk@kolvir.blrc.ma.us> - * -hm applying Joerg's patch for FreeBSD 2.0 - * -hm enable 132 col support for Trident TVGA8900CL - * -hm applying patch from Joerg fixing Crtat bug - * -hm removed PCVT_FAKE_SYSCONS10 - * -hm fastscroll/Crtat bugfix from Lon Willett - * -hm bell patch from Thomas Eberhardt for NetBSD - * -hm multiple X server bugfixes from Lon Willett - * -hm patch from John Kohl fixing tsleep bug in usl_vt_ioctl() - * -hm bugfix: clear 25th line when switching to a force 24 lines vt - * -jw add some forward declarations - * -hm fixing MDA re-init when leaving X - * -hm patch from John Kohl fixing potential divide by 0 problem - * - *---------------------------------------------------------------------------*/ - -#include "vt.h" -#if NVT > 0 - -#include <i386/isa/pcvt/pcvt_hdr.h> /* global include */ - -#define ISSIGVALID(sig) ((sig) > 0 && (sig) < NSIG) - -static int s3testwritable( void ); -static int et4000_col( int ); -static int wd90c11_col( int ); -static int tri9000_col( int ); -static int v7_1024i_col( int ); -static int s3_928_col( int ); -static int cl_gd542x_col( int ); - -/* storage to save video timing values of 80 columns text mode */ -static union { - u_char generic[11]; - u_char et4000[11]; - u_char wd90c11[12]; - u_char tri9000[13]; - u_char v7_1024i[17]; - u_char s3_928[32]; - u_char cirrus[13]; -} -savearea; - -static int regsaved = 0; /* registers are saved to savearea */ - -/*---------------------------------------------------------------------------* - * - * Find out which video board we are running on, taken from: - * Richard Ferraro: Programmers Guide to the EGA and VGA Cards - * and from David E. Wexelblat's SuperProbe Version 1.0. - * When a board is found, for which 132 column switching is - * provided, the global variable "can_do_132col" is set to 1, - * also the global variable vga_family is set to what we found. - * - * ############################################################### - * ## THIS IS GETTING MORE AND MORE A LARGE SPAGHETTI HACK !!!! ## - * ############################################################### - * - *---------------------------------------------------------------------------*/ -u_char -vga_chipset(void) -{ - u_char *ptr; - u_char byte, oldbyte, old1byte, newbyte; - -#if PCVT_132GENERIC - can_do_132col = 1; /* assumes everyone can do 132 col */ -#else - can_do_132col = 0; /* assumes noone can do 132 col */ -#endif /* PCVT_132GENERIC */ - - vga_family = VGA_F_NONE; - -/*---------------------------------------------------------------------------* - * check for Western Digital / Paradise chipsets - *---------------------------------------------------------------------------*/ - - ptr = (u_char *)Crtat; - - if(color) - ptr += (0xc007d - 0xb8000); - else - ptr += (0xc007d - 0xb0000); - - if((*ptr++ == 'V') && (*ptr++ == 'G') && - (*ptr++ == 'A') && (*ptr++ == '=')) - { - int wd90c10; - - vga_family = VGA_F_WD; - - outb(addr_6845, 0x2b); - oldbyte = inb(addr_6845+1); - outb(addr_6845+1, 0xaa); - newbyte = inb(addr_6845+1); - outb(addr_6845+1, oldbyte); - if(newbyte != 0xaa) - return(VGA_PVGA); /* PVGA1A chip */ - - outb(TS_INDEX, 0x12); - oldbyte = inb(TS_DATA); - outb(TS_DATA, oldbyte & 0xbf); - newbyte = inb(TS_DATA) & 0x40; - if(newbyte != 0) - return(VGA_WD90C00); /* WD90C00 chip */ - - outb(TS_DATA, oldbyte | 0x40); - newbyte = inb(TS_DATA) & 0x40; - if(newbyte == 0) - return(VGA_WD90C00); /* WD90C00 chip */ - - outb(TS_DATA, oldbyte); - - wd90c10 = 0; - outb(TS_INDEX, 0x10); - oldbyte = inb(TS_DATA); - - outb(TS_DATA, oldbyte & 0xfb); - newbyte = inb(TS_DATA) & 0x04; - if(newbyte != 0) - wd90c10 = 1; - - outb(TS_DATA, oldbyte | 0x04); - newbyte = inb(TS_DATA) & 0x04; - if(newbyte == 0) - wd90c10 = 1; - - outb(TS_DATA, oldbyte); - - if(wd90c10) - return(VGA_WD90C10); - else - { - can_do_132col = 1; - return(VGA_WD90C11); - } - } - -/*---------------------------------------------------------------------------* - * check for Trident chipsets - *---------------------------------------------------------------------------*/ - - outb(TS_INDEX, 0x0b); - oldbyte = inb(TS_DATA); - - - outb(TS_INDEX, 0x0b); - outb(TS_DATA, 0x00); - - byte = inb(TS_DATA); /* chipset type */ - - - outb(TS_INDEX, 0x0e); - old1byte = inb(TS_DATA); - - outb(TS_DATA, 0); - newbyte = inb(TS_DATA); - - outb(TS_DATA, (old1byte ^ 0x02)); - - outb(TS_INDEX, 0x0b); - outb(TS_DATA, oldbyte); - - if((newbyte & 0x0f) == 0x02) - { - /* is a trident chip */ - - vga_family = VGA_F_TRI; - - switch(byte) - { - case 0x01: - return(VGA_TR8800BR); - - case 0x02: - return(VGA_TR8800CS); - - case 0x03: - can_do_132col = 1; - return(VGA_TR8900B); - - case 0x04: - case 0x13: - /* Haven't tried, but should work */ - can_do_132col = 1; - return(VGA_TR8900C); - - case 0x23: - can_do_132col = 1; - return(VGA_TR9000); - - case 0x33: - can_do_132col = 1; - return(VGA_TR8900CL); - - case 0x83: - return(VGA_TR9200); - - case 0x93: - return(VGA_TR9100); - - default: - return(VGA_TRUNKNOWN); - } - } - -/*---------------------------------------------------------------------------* - * check for Tseng Labs ET3000/4000 chipsets - *---------------------------------------------------------------------------*/ - - outb(GN_HERCOMPAT, 0x06); - if(color) - outb(GN_DMCNTLC, 0xa0); - else - outb(GN_DMCNTLM, 0xa0); - - /* read old value */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MISC); - oldbyte = inb(ATC_DATAR); - - /* write new value */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MISC); - newbyte = oldbyte ^ 0x10; - outb(ATC_DATAW, newbyte); - - /* read back new value */ - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MISC); - byte = inb(ATC_DATAR); - - /* write back old value */ - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MISC); - outb(ATC_DATAW, oldbyte); - - if(byte == newbyte) /* ET3000 or ET4000 */ - { - vga_family = VGA_F_TSENG; - - outb(addr_6845, CRTC_EXTSTART); - oldbyte = inb(addr_6845+1); - newbyte = oldbyte ^ 0x0f; - outb(addr_6845+1, newbyte); - byte = inb(addr_6845+1); - outb(addr_6845+1, oldbyte); - - if(byte == newbyte) - { - can_do_132col = 1; - return(VGA_ET4000); - } - else - { - return(VGA_ET3000); - } - } - -/*---------------------------------------------------------------------------* - * check for Video7 VGA chipsets - *---------------------------------------------------------------------------*/ - - outb(TS_INDEX, TS_EXTCNTL); /* enable extensions */ - outb(TS_DATA, 0xea); - - outb(addr_6845, CRTC_STARTADRH); - oldbyte = inb(addr_6845+1); - - outb(addr_6845+1, 0x55); - newbyte = inb(addr_6845+1); - - outb(addr_6845, CRTC_V7ID); /* id register */ - byte = inb(addr_6845+1); /* read id */ - - outb(addr_6845, CRTC_STARTADRH); - outb(addr_6845+1, oldbyte); - - outb(TS_INDEX, TS_EXTCNTL); /* disable extensions */ - outb(TS_DATA, 0xae); - - if(byte == (0x55 ^ 0xea)) - { /* is Video 7 */ - - vga_family = VGA_F_V7; - - outb(TS_INDEX, TS_EXTCNTL); /* enable extensions */ - outb(TS_DATA, 0xea); - - outb(TS_INDEX, TS_V7CHIPREV); - byte = inb(TS_DATA); - - outb(TS_INDEX, TS_EXTCNTL); /* disable extensions */ - outb(TS_DATA, 0xae); - - if(byte < 0xff && byte >= 0x80) - return(VGA_V7VEGA); - if(byte < 0x7f && byte >= 0x70) - return(VGA_V7FWVR); - if(byte < 0x5a && byte >= 0x50) - return(VGA_V7V5); - if(byte < 0x4a && byte > 0x40) - { - can_do_132col = 1; - return(VGA_V71024I); - } - return(VGA_V7UNKNOWN); - } - -/*---------------------------------------------------------------------------* - * check for S3 chipsets - *---------------------------------------------------------------------------*/ - - outb(addr_6845, 0x38); /* reg 1 lock register */ - old1byte = inb(addr_6845+1); /* get old value */ - - outb(addr_6845, 0x38); - outb(addr_6845+1, 0x00); /* lock registers */ - - if(s3testwritable() == 0) /* check if locked */ - { - outb(addr_6845, 0x38); - outb(addr_6845+1, 0x48); /* unlock registers */ - - if(s3testwritable() == 1 ) /* check if unlocked */ - { - vga_family = VGA_F_S3; /* FAMILY S3 */ - - outb(addr_6845, 0x30); /* chip id/rev reg */ - byte = inb(addr_6845+1); - - switch(byte & 0xf0) - { - case 0x80: - switch(byte & 0x0f) - { - case 0x01: - outb(addr_6845, 0x38); - outb(addr_6845+1, old1byte); - return VGA_S3_911; - - case 0x02: - outb(addr_6845, 0x38); - outb(addr_6845+1, old1byte); - return VGA_S3_924; - - default: - outb(addr_6845, 0x38); - outb(addr_6845+1, old1byte); - return VGA_S3_UNKNOWN; - } - break; - - case 0xA0: - outb(addr_6845, 0x38); - outb(addr_6845+1, old1byte); - return VGA_S3_80x; - - case 0x90: - case 0xb0: - outb(addr_6845, 0x38); - outb(addr_6845+1, old1byte); - can_do_132col = 1; - return VGA_S3_928; - - default: - outb(addr_6845, 0x38); - outb(addr_6845+1, old1byte); - return VGA_S3_UNKNOWN; - } - } - } - -/*---------------------------------------------------------------------------* - * check for Cirrus chipsets - *---------------------------------------------------------------------------*/ - - outb(TS_INDEX, 6); - oldbyte = inb(TS_DATA); - outb(TS_INDEX, 6); - outb(TS_DATA, 0x12); - outb(TS_INDEX, 6); - newbyte = inb(TS_DATA); - outb(addr_6845, 0x27); - byte = inb(addr_6845 + 1); - outb(TS_INDEX, 6); - outb(TS_DATA, oldbyte); - if (newbyte == 0x12) { - vga_family = VGA_F_CIR; - can_do_132col = 1; - switch ((byte & 0xfc) >> 2) { - case 0x22: - switch (byte & 3) { - case 0: - return VGA_CL_GD5402; - case 1: - return VGA_CL_GD5402r1; - case 2: - return VGA_CL_GD5420; - case 3: - return VGA_CL_GD5420r1; - } - break; - case 0x23: - return VGA_CL_GD5422; - case 0x25: - return VGA_CL_GD5424; - case 0x24: - return VGA_CL_GD5426; - case 0x26: - return VGA_CL_GD5428; - } - } - - return(VGA_UNKNOWN); -} - -/*--------------------------------------------------------------------------- - * test if index 35 lower nibble is writable (taken from SuperProbe 1.0) - *---------------------------------------------------------------------------*/ -static int -s3testwritable(void) -{ - u_char old, new1, new2; - - outb(addr_6845, 0x35); - old = inb(addr_6845+1); /* save */ - - outb(addr_6845, 0x35); - outb(addr_6845+1, (old & 0xf0)); /* write 0 */ - - outb(addr_6845, 0x35); - new1 = (inb(addr_6845+1)) & 0x0f; /* must read 0 */ - - outb(addr_6845, 0x35); - outb(addr_6845+1, (old | 0x0f)); /* write 1 */ - - outb(addr_6845, 0x35); - new2 = (inb(addr_6845+1)) & 0x0f; /* must read 1 */ - - outb(addr_6845, 0x35); - outb(addr_6845+1, old); /* restore */ - - return((new1==0) && (new2==0x0f)); -} - -/*---------------------------------------------------------------------------* - * return ptr to string describing vga type - *---------------------------------------------------------------------------*/ -char * -vga_string(int number) -{ - static char *vga_tab[] = { - "generic", - "et4000", - "et3000", - "pvga1a", - "wd90c00", - "wd90c10", - "wd90c11", - "v7 vega", - "v7 fast", - "v7 ver5", - "v7 1024i", - "unknown v7", - "tvga 8800br", - "tvga 8800cs", - "tvga 8900b", - "tvga 8900c", - "tvga 8900cl", - "tvga 9000", - "tvga 9100", - "tvga 9200", - "unknown trident", - "s3 911", - "s3 924", - "s3 801/805", - "s3 928", - "unkown s3", - "cl-gd5402", - "cl-gd5402r1", - "cl-gd5420", - "cl-gd5420r1", - "cl-gd5422", - "cl-gd5424", - "cl-gd5426", - "cl-gd5428" - }; - return(vga_tab[number]); -} - -/*---------------------------------------------------------------------------* - * toggle vga 80/132 column operation - *---------------------------------------------------------------------------*/ -int -vga_col(struct video_state *svsp, int cols) -{ - int ret = 0; - - if(adaptor_type != VGA_ADAPTOR) - return(0); - - switch(vga_type) - { - case VGA_ET4000: - ret = et4000_col(cols); - break; - - case VGA_WD90C11: - ret = wd90c11_col(cols); - break; - - case VGA_TR8900B: - case VGA_TR8900C: - case VGA_TR8900CL: - case VGA_TR9000: - ret = tri9000_col(cols); - break; - - case VGA_V71024I: - ret = v7_1024i_col(cols); - break; - - case VGA_S3_928: - ret = s3_928_col(cols); - break; - - case VGA_CL_GD5402: - case VGA_CL_GD5402r1: - case VGA_CL_GD5420: - case VGA_CL_GD5420r1: - case VGA_CL_GD5422: - case VGA_CL_GD5424: - case VGA_CL_GD5426: - case VGA_CL_GD5428: - ret = cl_gd542x_col(cols); - break; - - default: - -#if PCVT_132GENERIC - ret = generic_col(cols); -#endif /* PCVT_132GENERIC */ - - break; - } - - if(ret == 0) - return(0); /* failed */ - - svsp->maxcol = cols; - - return(1); -} - -#if PCVT_132GENERIC -/*---------------------------------------------------------------------------* - * toggle 80/132 column operation for "generic" SVGAs - * NB: this is supposed to work on any (S)VGA as long as the monitor - * is able to sync down to 21.5 kHz horizontally. The resulting - * vertical frequency is only 50 Hz, so if there is some better board - * specific algorithm, we avoid using this generic one. - * REPORT ANY FAILURES SO WE CAN IMPROVE THIS - *---------------------------------------------------------------------------*/ - -#if PCVT_EXP_132COL -/* - * Some improved (i.e. higher scan rates) figures for the horizontal - * timing. USE AT YOUR OWN RISK, THIS MIGHT DAMAGE YOUR MONITOR DUE - * TO A LOSS OF HORIZONTAL SYNC! - * The figures have been tested with an ET3000 board along with a - * NEC MultiSync 3D monitor. If you are playing here, consider - * testing with several screen pictures (dark background vs. light - * background, even enlightening the border color may impact the - * result - you can do this e.g. by "scon -p black,42,42,42") - * Remember that all horizontal timing values must be dividable - * by 8! (The scheme below is taken so that nifty kernel hackers - * are able to patch the figures at run-time.) - * - * The actual numbers result in 23 kHz line scan and 54 Hz vertical - * scan. - */ -#endif /* PCVT_EXP_132COL */ - -int -generic_col(int cols) -{ - u_char *sp; - u_char byte; - -#if !PCVT_EXP_132COL - - /* stable figures for any multisync monitor that syncs down to 22 kHz*/ - static volatile u_short htotal = 1312; - static volatile u_short displayend = 1056; - static volatile u_short blankstart = 1072; - static volatile u_short syncstart = 1112; - static volatile u_short syncend = 1280; - -#else /* PCVT_EXP_132COL */ - - /* reduced sync-pulse width and sync delays */ - static volatile u_short htotal = 1232; - static volatile u_short displayend = 1056; - static volatile u_short blankstart = 1056; - static volatile u_short syncstart = 1104; - static volatile u_short syncend = 1168; - -#endif /* PCVT_EXP_132COL */ - - vga_screen_off(); - - /* enable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - byte = inb(addr_6845+1); - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte & 0x7f); - - if(cols == SCR_COL132) /* switch 80 -> 132 */ - { - /* save state of board for 80 columns */ - - if(!regsaved) - { - regsaved = 1; - - sp = savearea.generic; - - outb(addr_6845, 0x00); /* Horizontal Total */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x01); /* Horizontal Display End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x13); /* Row Offset Register */ - *sp++ = inb(addr_6845+1); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - *sp++ = inb(TS_DATA); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - *sp++ = inb(GN_MISCOUTR); /* Misc output register */ - } - - /* setup chipset for 132 column operation */ - - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, (htotal / 8) - 5); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, (displayend / 8) - 1); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, blankstart / 8); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, ((syncend / 8) & 0x1f) | 0x80); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, syncstart / 8); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, - (((syncend / 8) & 0x20) * 4) - | ((syncend / 8) & 0x1f)); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, 0x42); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, 0x01); /* 8 dot char clock */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); /* ATC Mode control */ - outb(ATC_DATAW, 0x08); /* Line graphics disable */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); /* ATC Horizontal Pixel Panning */ - outb(ATC_DATAW, 0x00); - - /* Misc output register */ - /* use the 28.322 MHz clock */ - outb(GN_MISCOUTW, (inb(GN_MISCOUTR) & ~0x0c) | 4); - } - else /* switch 132 -> 80 */ - { - if(!regsaved) /* failsafe */ - { - /* disable access to first 7 CRTC registers */ - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - vga_screen_on(); - return(0); - } - - sp = savearea.generic; - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, *sp++); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - outb(GN_MISCOUTW, *sp++); /* Misc output register */ - } - - /* disable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - vga_screen_on(); - - return(1); -} -#endif /* PCVT_132GENERIC */ - -/*---------------------------------------------------------------------------* - * toggle 80/132 column operation for ET4000 based boards - *---------------------------------------------------------------------------*/ -int -et4000_col(int cols) -{ - u_char *sp; - u_char byte; - - vga_screen_off(); - - /* enable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - byte = inb(addr_6845+1); - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte & 0x7f); - - if(cols == SCR_COL132) /* switch 80 -> 132 */ - { - /* save state of board for 80 columns */ - - if(!regsaved) - { - regsaved = 1; - - sp = savearea.et4000; - - outb(addr_6845, 0x00); /* Horizontal Total */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x01); /* Horizontal Display End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x13); /* Row Offset Register */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x34); /* 6845 Compatibility */ - *sp++ = inb(addr_6845+1); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - *sp++ = inb(TS_DATA); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - *sp++ = inb(GN_MISCOUTR); /* Misc output register */ - } - - /* setup chipset for 132 column operation */ - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, 0x9f); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, 0x83); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, 0x84); - - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, 0x8b); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, 0x80); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, 0x42); - - outb(addr_6845, 0x34); /* 6845 Compatibility */ - outb(addr_6845+1, 0x0a); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, 0x01); /* 8 dot char clock */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); /* ATC Mode control */ - outb(ATC_DATAW, 0x08); /* Line graphics disable */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); /* ATC Horizontal Pixel Panning */ - outb(ATC_DATAW, 0x00); - - /* Misc output register */ - - outb(GN_MISCOUTW, (inb(GN_MISCOUTR) & ~0x0c)); - } - else /* switch 132 -> 80 */ - { - if(!regsaved) /* failsafe */ - { - /* disable access to first 7 CRTC registers */ - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - vga_screen_on(); - return(0); - } - - sp = savearea.et4000; - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, *sp++); - - - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x34); /* 6845 Compatibility */ - outb(addr_6845+1, *sp++); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - outb(GN_MISCOUTW, *sp++); /* Misc output register */ - } - - /* disable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - vga_screen_on(); - - return(1); -} - -/*---------------------------------------------------------------------------* - * toggle 80/132 column operation for WD/Paradise based boards - * - * when this card does 132 cols, the char map select register (TS_INDEX, - * TS_FONTSEL) function bits get REDEFINED. whoever did design this, - * please don't cross my way ever ....... - * - *---------------------------------------------------------------------------*/ -int -wd90c11_col(int cols) -{ - -#if !PCVT_BACKUP_FONTS - static unsigned char *sv_fontwd[NVGAFONTS]; -#endif /* !PCVT_BACKUP_FONTS */ - - u_char *sp; - u_char byte; - int i; - - vga_screen_off(); - - /* enable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - byte = inb(addr_6845+1); - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte & 0x7f); - - /* enable access to WD/Paradise "control extensions" */ - - outb(GDC_INDEX, GDC_PR5GPLOCK); - outb(GDC_INDEX, 0x05); - outb(addr_6845, CRTC_PR10); - outb(addr_6845, 0x85); - outb(TS_INDEX, TS_UNLOCKSEQ); - outb(TS_DATA, 0x48); - - if(cols == SCR_COL132) /* switch 80 -> 132 */ - { - /* save state of board for 80 columns */ - - if(!regsaved) - { - regsaved = 1; - - /* save current fonts */ - -#if !PCVT_BACKUP_FONTS - for(i = 0; i < totalfonts; i++) - { - if(vgacs[i].loaded) - { - if((sv_fontwd[i] = - (u_char *)malloc(32 * 256, - M_DEVBUF, - M_WAITOK)) - == NULL) - printf("pcvt: no font buffer\n"); - else - vga_move_charset(i, - sv_fontwd[i], - 1); - } - else - { - sv_fontwd[i] = 0; - } - } - -#endif /* !PCVT_BACKUP_FONTS */ - - sp = savearea.wd90c11; - - outb(addr_6845, 0x00); /* Horizontal Total */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x01); /* Horizontal Display End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x13); /* Row Offset Register */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x2e); /* misc 1 */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x2f); /* misc 2 */ - *sp++ = inb(addr_6845+1); - - outb(TS_INDEX, 0x10);/* Timing Sequencer */ - *sp++ = inb(TS_DATA); - outb(TS_INDEX, 0x12);/* Timing Sequencer */ - *sp++ = inb(TS_DATA); - - *sp++ = inb(GN_MISCOUTR); /* Misc output register */ - } - - /* setup chipset for 132 column operation */ - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, 0x9c); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, 0x83); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, 0x84); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, 0x9f); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, 0x8a); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, 0x1c); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, 0x42); - - outb(addr_6845, 0x2e); /* misc 1 */ - outb(addr_6845+1, 0x04); - outb(addr_6845, 0x2f); /* misc 2 */ - outb(addr_6845+1, 0x00); - - outb(TS_INDEX, 0x10);/* Timing Sequencer */ - outb(TS_DATA, 0x21); - outb(TS_INDEX, 0x12);/* Timing Sequencer */ - outb(TS_DATA, 0x14); - - outb(GN_MISCOUTW, (inb(GN_MISCOUTR) | 0x08)); /* Misc output register */ - - vsp->wd132col = 1; - } - else /* switch 132 -> 80 */ - { - if(!regsaved) /* failsafe */ - { - /* disable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - /* disable access to WD/Paradise "control extensions" */ - - outb(GDC_INDEX, GDC_PR5GPLOCK); - outb(GDC_INDEX, 0x00); - outb(addr_6845, CRTC_PR10); - outb(addr_6845, 0x00); - outb(TS_INDEX, TS_UNLOCKSEQ); - outb(TS_DATA, 0x00); - - vga_screen_on(); - - return(0); - } - - sp = savearea.wd90c11; - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x2e); /* misc 1 */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x2f); /* misc 2 */ - outb(addr_6845+1, *sp++); - - outb(TS_INDEX, 0x10);/* Timing Sequencer */ - outb(addr_6845+1, *sp++); - outb(TS_INDEX, 0x12);/* Timing Sequencer */ - outb(addr_6845+1, *sp++); - - outb(GN_MISCOUTW, *sp++); /* Misc output register */ - - vsp->wd132col = 0; - } - - /* restore fonts */ - -#if !PCVT_BACKUP_FONTS - for(i = 0; i < totalfonts; i++) - { - if(sv_fontwd[i]) - vga_move_charset(i, sv_fontwd[i], 0); - } -#else - for(i = 0; i < totalfonts; i++) - if(saved_charsets[i]) - vga_move_charset(i, 0, 0); -#endif /* !PCVT_BACKUP_FONTS */ - - select_vga_charset(vsp->vga_charset); - - /* disable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - /* disable access to WD/Paradise "control extensions" */ - - outb(GDC_INDEX, GDC_PR5GPLOCK); - outb(GDC_INDEX, 0x00); - outb(addr_6845, CRTC_PR10); - outb(addr_6845, 0x00); - outb(TS_INDEX, TS_UNLOCKSEQ); - outb(TS_DATA, 0x00); - - vga_screen_on(); - - return(1); -} - -/*---------------------------------------------------------------------------* - * toggle 80/132 column operation for TRIDENT 9000 based boards - *---------------------------------------------------------------------------*/ -int -tri9000_col(int cols) -{ - u_char *sp; - u_char byte; - - vga_screen_off(); - - /* sync reset is necessary to preserve memory contents ... */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x01); /* synchronous reset */ - - /* disable protection of misc out and other regs */ - - outb(addr_6845, CRTC_MTEST); - byte = inb(addr_6845+1); - outb(addr_6845, CRTC_MTEST); - outb(addr_6845+1, byte & ~0x50); - - /* enable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - byte = inb(addr_6845+1); - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte & 0x7f); - - if(cols == SCR_COL132) /* switch 80 -> 132 */ - { - /* save state of board for 80 columns */ - - if(!regsaved) - { - regsaved = 1; - - sp = savearea.tri9000; - - outb(addr_6845, 0x00); /* Horizontal Total */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x01); /* Horizontal Display End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x13); - *sp++ = inb(addr_6845+1); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - *sp++ = inb(TS_DATA); - - outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */ - outb(TS_DATA, 0x00); /* write ANYTHING switches to OLD */ - outb(TS_INDEX, TS_MODEC2); - *sp++ = inb(TS_DATA); - - outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */ - inb(TS_DATA); /* read switches to NEW */ - outb(TS_INDEX, TS_MODEC2); - *sp++ = inb(TS_DATA); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - *sp++ = inb(GN_MISCOUTR); /* Misc output register */ - } - - /* setup chipset for 132 column operation */ - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, 0x9b); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, 0x83); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, 0x84); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, 0x1e); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, 0x87); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, 0x1a); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, 0x42); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, 0x01); /* 8 dot char clock */ - - outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */ - outb(TS_DATA, 0x00); /* write ANYTHING switches to OLD */ - outb(TS_INDEX, TS_MODEC2); - outb(TS_DATA, 0x00); - - outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */ - inb(TS_DATA); /* read switches to NEW */ - outb(TS_INDEX, TS_MODEC2); - outb(TS_DATA, 0x01); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); /* ATC Mode control */ - outb(ATC_DATAW, 0x08); /* Line graphics disable */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); /* ATC Horizontal Pixel Panning */ - outb(ATC_DATAW, 0x00); - - outb(GN_MISCOUTW, (inb(GN_MISCOUTR) | 0x0c)); /* Misc output register */ - } - else /* switch 132 -> 80 */ - { - if(!regsaved) /* failsafe */ - { - /* disable access to first 7 CRTC registers */ - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); /* clear synchronous reset */ - - vga_screen_on(); - - return(0); - } - - sp = savearea.tri9000; - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, *sp++); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, *sp++); - - outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */ - outb(TS_DATA, 0x00); /* write ANYTHING switches to OLD */ - outb(TS_INDEX, TS_MODEC2);/* Timing Sequencer */ - outb(TS_DATA, *sp++); - - outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */ - inb(TS_DATA); /* read switches to NEW */ - outb(TS_INDEX, TS_MODEC2);/* Timing Sequencer */ - outb(TS_DATA, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - outb(GN_MISCOUTW, *sp++); /* Misc output register */ - } - - /* disable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); /* clear synchronous reset */ - - vga_screen_on(); - - return(1); -} - -/*---------------------------------------------------------------------------* - * toggle 80/132 column operation for Video7 VGA 1024i - *---------------------------------------------------------------------------*/ -int -v7_1024i_col(int cols) -{ - u_char *sp; - u_char byte; - u_char save__byte; - - vga_screen_off(); - - /* enable access to first 7 CRTC registers */ - - /* first, enable read access to vertical retrace start/end */ - outb(addr_6845, CRTC_HBLANKE); - byte = inb(addr_6845+1); - outb(addr_6845, CRTC_HBLANKE); - outb(addr_6845+1, (byte | 0x80)); - - /* second, enable access to protected registers */ - outb(addr_6845, CRTC_VSYNCE); - save__byte = byte = inb(addr_6845+1); - byte |= 0x20; /* no irq 2 */ - byte &= 0x6f; /* wr enable, clr irq flag */ - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - outb(TS_INDEX, TS_EXTCNTL); /* enable extensions */ - outb(TS_DATA, 0xea); - - - if(cols == SCR_COL132) /* switch 80 -> 132 */ - { - /* save state of board for 80 columns */ - - if(!regsaved) - { - regsaved = 1; - - sp = savearea.v7_1024i; - - outb(addr_6845, 0x00); /* Horizontal Total */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x01); /* Horizontal Display End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x13); /* Row Offset Register */ - *sp++ = inb(addr_6845+1); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - *sp++ = inb(TS_DATA); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - outb(TS_INDEX, 0x83); - *sp++ = inb(TS_DATA); - - outb(TS_INDEX, 0xa4); - *sp++ = inb(TS_DATA); - - outb(TS_INDEX, 0xe0); - *sp++ = inb(TS_DATA); - - outb(TS_INDEX, 0xe4); - *sp++ = inb(TS_DATA); - - outb(TS_INDEX, 0xf8); - *sp++ = inb(TS_DATA); - - outb(TS_INDEX, 0xfd); - *sp++ = inb(TS_DATA); - - *sp++ = inb(GN_MISCOUTR); /* Misc output register */ - } - - /* setup chipset for 132 column operation */ - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, 0x9c); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, 0x83); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, 0x86); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, 0x9e); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, 0x89); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, 0x1c); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, 0x42); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, 0x01); /* 8 dot char clock */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); /* ATC Mode control */ - outb(ATC_DATAW, 0x08); /* Line graphics disable */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); /* ATC Horizontal Pixel Panning */ - outb(ATC_DATAW, 0x00); - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x01); /* synchronous reset */ - - outb(TS_INDEX, 0x83); - outb(TS_DATA, 0xa0); - - outb(TS_INDEX, 0xa4); - outb(TS_DATA, 0x1c); - - outb(TS_INDEX, 0xe0); - outb(TS_DATA, 0x00); - - outb(TS_INDEX, 0xe4); - outb(TS_DATA, 0xfe); - - outb(TS_INDEX, 0xf8); - outb(TS_DATA, 0x1b); - - outb(TS_INDEX, 0xfd); - outb(TS_DATA, 0x33); - - byte = inb(GN_MISCOUTR); - byte |= 0x0c; - outb(GN_MISCOUTW, byte); /* Misc output register */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); /* clear synchronous reset */ - } - else /* switch 132 -> 80 */ - { - if(!regsaved) /* failsafe */ - { - outb(TS_INDEX, TS_EXTCNTL); /* disable extensions */ - outb(TS_DATA, 0xae); - - /* disable access to first 7 CRTC registers */ - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - vga_screen_on(); - return(0); - } - - sp = savearea.v7_1024i; - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, *sp++); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x01); /* synchronous reset */ - - outb(TS_INDEX, 0x83); - outb(TS_DATA, *sp++); - - outb(TS_INDEX, 0xa4); - outb(TS_DATA, *sp++); - - outb(TS_INDEX, 0xe0); - outb(TS_DATA, *sp++); - - outb(TS_INDEX, 0xe4); - outb(TS_DATA, *sp++); - - outb(TS_INDEX, 0xf8); - outb(TS_DATA, *sp++); - - outb(TS_INDEX, 0xfd); - outb(TS_DATA, *sp++); - - outb(GN_MISCOUTW, *sp++); /* Misc output register */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); /* clear synchronous reset */ - } - - outb(TS_INDEX, TS_EXTCNTL); /* disable extensions */ - outb(TS_DATA, 0xae); - - /* disable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, save__byte); - - vga_screen_on(); - - return(1); -} - -/*---------------------------------------------------------------------------* - * toggle 80/132 column operation for S3 86C928 based boards - *---------------------------------------------------------------------------*/ -int -s3_928_col(int cols) -{ - u_char *sp; - u_char byte; - - vga_screen_off(); - - outb(addr_6845, 0x38); - outb(addr_6845+1, 0x48); /* unlock registers */ - outb(addr_6845, 0x39); - outb(addr_6845+1, 0xa0); /* unlock registers */ - - /* enable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - byte = inb(addr_6845+1); - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte & 0x7f); - - if(cols == SCR_COL132) /* switch 80 -> 132 */ - { - /* save state of board for 80 columns */ - - if(!regsaved) - { - regsaved = 1; - - sp = savearea.s3_928; - - outb(addr_6845, 0x00); /* Horizontal Total */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x01); /* Horizontal Display End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x13); /* Row Offset Register */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x34); /* Backward Compat 3 Reg */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x3b); /* Data Xfer Exec Position */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x42); /* (Clock) Mode Control */ - *sp++ = inb(addr_6845+1); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - *sp++ = inb(TS_DATA); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - *sp++ = inb(GN_MISCOUTR); /* Misc output register */ - } - - /* setup chipset for 132 column operation */ - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, 0x9a); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, 0x83); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, 0x86); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, 0x9d); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, 0x87); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, 0x1b); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, 0x42); - - outb(addr_6845, 0x34); - outb(addr_6845+1, 0x10);/* enable data xfer pos control */ - outb(addr_6845, 0x3b); - outb(addr_6845+1, 0x90);/* set data xfer pos value */ - - outb(addr_6845, 0x42); /* (Clock) Mode Control */ - outb(addr_6845+1, 0x02);/* Select 40MHz Clock */ - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, 0x01); /* 8 dot char clock */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); /* ATC Mode control */ - outb(ATC_DATAW, 0x08); /* Line graphics disable */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); /* ATC Horizontal Pixel Panning */ - outb(ATC_DATAW, 0x00); - - /* Misc output register */ - - outb(GN_MISCOUTW, (inb(GN_MISCOUTR) | 0x0c)); - } - else /* switch 132 -> 80 */ - { - if(!regsaved) /* failsafe */ - { - /* disable access to first 7 CRTC registers */ - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - outb(addr_6845, 0x38); - outb(addr_6845+1, 0x00); /* lock registers */ - outb(addr_6845, 0x39); - outb(addr_6845+1, 0x00); /* lock registers */ - - vga_screen_on(); - return(0); - } - - sp = savearea.s3_928; - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x34); - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x3b); - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x42); /* Mode control */ - outb(addr_6845+1, *sp++); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - outb(GN_MISCOUTW, *sp++); /* Misc output register */ - } - - /* disable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - outb(addr_6845, 0x38); - outb(addr_6845+1, 0x00); /* lock registers */ - outb(addr_6845, 0x39); - outb(addr_6845+1, 0x00); /* lock registers */ - - vga_screen_on(); - - return(1); -} - -/*---------------------------------------------------------------------------* - * toggle 80/132 column operation for Cirrus Logic 542x based boards - *---------------------------------------------------------------------------*/ -int -cl_gd542x_col(int cols) -{ - u_char *sp; - u_char byte; - - vga_screen_off(); - - /* enable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - byte = inb(addr_6845+1); - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte & 0x7f); - - /* enable access to cirrus extension registers */ - outb(TS_INDEX, 6); - outb(TS_DATA, 0x12); - - if(cols == SCR_COL132) /* switch 80 -> 132 */ - { - /* save state of board for 80 columns */ - - if(!regsaved) - { - regsaved = 1; - - sp = savearea.cirrus; - - outb(addr_6845, 0x00); /* Horizontal Total */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x01); /* Horizontal Display End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - *sp++ = inb(addr_6845+1); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - *sp++ = inb(addr_6845+1); - - outb(addr_6845, 0x13); /* Row Offset Register */ - *sp++ = inb(addr_6845+1); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - *sp++ = inb(TS_DATA); - - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - *sp++ = inb(ATC_DATAR); - - /* VCLK2 Numerator Register */ - outb(TS_INDEX, 0xd); - *sp++ = inb(TS_DATA); - - /* VCLK2 Denominator and Post-Scalar Value Register */ - outb(TS_INDEX, 0x1d); - *sp++ = inb(TS_DATA); - - /* Misc output register */ - *sp++ = inb(GN_MISCOUTR); - } - - /* setup chipset for 132 column operation */ - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, 0x9f); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, 0x83); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, 0x84); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, 0x82); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, 0x8a); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, 0x9e); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, 0x42); - - /* set VCLK2 to 41.164 MHz ..... */ - outb(TS_INDEX, 0xd); /* VCLK2 Numerator Register */ - outb(TS_DATA, 0x45); - - outb(TS_INDEX, 0x1d); /* VCLK2 Denominator and */ - outb(TS_DATA, 0x30); /* Post-Scalar Value Register */ - - /* and use it. */ - outb(GN_MISCOUTW, (inb(GN_MISCOUTR) & ~0x0c) | (2 << 2)); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, 0x01); /* 8 dot char clock */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); /* ATC Mode control */ - outb(ATC_DATAW, 0x08); /* Line graphics disable */ - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); /* ATC Horizontal Pixel Panning */ - outb(ATC_DATAW, 0x00); - } - else /* switch 132 -> 80 */ - { - if(!regsaved) /* failsafe */ - { - /* disable access to first 7 CRTC registers */ - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - /* disable access to cirrus extension registers */ - outb(TS_INDEX, 6); - outb(TS_DATA, 0); - - vga_screen_on(); - return(0); - } - - sp = savearea.cirrus; - - outb(addr_6845, 0x00); /* Horizontal Total */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x01); /* Horizontal Display End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x02); /* Horizontal Blank Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x03); /* Horizontal Blank End */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x04); /* Horizontal Retrace Start */ - outb(addr_6845+1, *sp++); - outb(addr_6845, 0x05); /* Horizontal Retrace End */ - outb(addr_6845+1, *sp++); - - outb(addr_6845, 0x13); /* Row Offset Register */ - outb(addr_6845+1, *sp++); - - outb(TS_INDEX, TS_MODE);/* Timing Sequencer */ - outb(TS_DATA, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Mode control */ - outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - if(color) - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - /* ATC Horizontal Pixel Panning */ - outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); - outb(ATC_DATAW, *sp++); - - /* VCLK2 Numerator Register */ - outb(TS_INDEX, 0xd); - outb(TS_DATA, *sp++); - - /* VCLK2 Denominator and Post-Scalar Value Register */ - outb(TS_INDEX, 0x1d); - outb(TS_DATA, *sp++); - - outb(GN_MISCOUTW, *sp++); /* Misc output register */ - } - - /* disable access to cirrus extension registers */ - outb(TS_INDEX, 6); - outb(TS_DATA, 0); - - /* disable access to first 7 CRTC registers */ - - outb(addr_6845, CRTC_VSYNCE); - outb(addr_6845+1, byte); - - vga_screen_on(); - - return(1); -} - -#if PCVT_USL_VT_COMPAT -/*---------------------------------------------------------------------------* - * switch screen from text mode to X-mode and vice versa - *---------------------------------------------------------------------------*/ -void -switch_screen(int n, int oldgrafx, int newgrafx) -{ - -#if PCVT_SCREENSAVER - static unsigned saved_scrnsv_tmo = 0; -#endif /* PCVT_SCREENSAVER */ - -#if !PCVT_KBD_FIFO - int x; -#endif /* !PCVT_KBD_FIFO */ - - int cols = vsp->maxcol; /* get current col val */ - - if(n < 0 || n >= totalscreens) - return; - -#if !PCVT_KBD_FIFO - x = spltty(); /* protect us */ -#endif /* !PCVT_KBD_FIFO */ - - if(!oldgrafx && newgrafx) - { - /* switch from text to graphics */ - -#if PCVT_SCREENSAVER - if((saved_scrnsv_tmo = scrnsv_timeout)) - pcvt_set_scrnsv_tmo(0); /* screensaver off */ -#endif /* PCVT_SCREENSAVER */ - - async_update(UPDATE_STOP); /* status display off */ - } - - if(!oldgrafx) - { - /* switch from text mode */ - - /* video board memory -> kernel memory */ - bcopy(vsp->Crtat, vsp->Memory, - vsp->screen_rows * vsp->maxcol * CHR); - - vsp->Crtat = vsp->Memory; /* operate in memory now */ - } - - /* update global screen pointers/variables */ - current_video_screen = n; /* current screen no */ - -#if !PCVT_NETBSD && !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) - pcconsp = &pccons[n]; /* current tty */ -#elif PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200 - pcconsp = pccons[n]; /* current tty */ -#else - pcconsp = pc_tty[n]; /* current tty */ -#endif - - vsp = &vs[n]; /* current video state ptr */ - - if(oldgrafx && !newgrafx) - { - /* switch from graphics to text mode */ - unsigned i; - - /* restore fonts */ - for(i = 0; i < totalfonts; i++) - if(saved_charsets[i]) - vga_move_charset(i, 0, 0); - -#if PCVT_SCREENSAVER - /* activate screen saver */ - if(saved_scrnsv_tmo) - pcvt_set_scrnsv_tmo(saved_scrnsv_tmo); -#endif /* PCVT_SCREENSAVER */ - - /* re-initialize lost MDA information */ - if(adaptor_type == MDA_ADAPTOR) - { - /* - * Due to the fact that HGC registers are write-only, - * the Xserver can only make guesses about the state - * the HGC adaptor has been before turning on X mode. - * Thus, the display must be re-enabled now, and the - * cursor shape and location restored. - */ - outb(GN_DMCNTLM, 0x28); /* enable display, text mode */ - outb(addr_6845, CRTC_CURSORH); /* select high register */ - outb(addr_6845+1, - ((vsp->Crtat + vsp->cur_offset) - Crtat) >> 8); - outb(addr_6845, CRTC_CURSORL); /* select low register */ - outb(addr_6845+1, - ((vsp->Crtat + vsp->cur_offset) - Crtat)); - - outb(addr_6845, CRTC_CURSTART); /* select high register */ - outb(addr_6845+1, vsp->cursor_start); - outb(addr_6845, CRTC_CUREND); /* select low register */ - outb(addr_6845+1, vsp->cursor_end); - } - - /* make status display happy */ - async_update(UPDATE_START); - } - - if(!newgrafx) - { - /* to text mode */ - - /* kernel memory -> video board memory */ - bcopy(vsp->Crtat, Crtat, - vsp->screen_rows * vsp->maxcol * CHR); - - vsp->Crtat = Crtat; /* operate on screen now */ - - outb(addr_6845, CRTC_STARTADRH); - outb(addr_6845+1, 0); - outb(addr_6845, CRTC_STARTADRL); - outb(addr_6845+1, 0); - } - -#if !PCVT_KBD_FIFO - splx(x); -#endif /* !PCVT_KBD_FIFO */ - - select_vga_charset(vsp->vga_charset); - - if(vsp->maxcol != cols) - vga_col(vsp, vsp->maxcol); /* select 80/132 columns */ - - outb(addr_6845, CRTC_CURSORH); /* select high register */ - outb(addr_6845+1, vsp->cur_offset >> 8); - outb(addr_6845, CRTC_CURSORL); /* select low register */ - outb(addr_6845+1, vsp->cur_offset); - - if(vsp->cursor_on) - { - outb(addr_6845, CRTC_CURSTART); /* select high register */ - outb(addr_6845+1, vsp->cursor_start); - outb(addr_6845, CRTC_CUREND); /* select low register */ - outb(addr_6845+1, vsp->cursor_end); - } - else - { - sw_cursor(0); - } - - if(adaptor_type == VGA_ADAPTOR) - { - unsigned i; - - /* switch VGA DAC palette entries */ - for(i = 0; i < NVGAPEL; i++) - vgapaletteio(i, &vsp->palette[i], 1); - } - - if(!newgrafx) - { - update_led(); /* update led's */ - update_hp(vsp); /* update fkey labels, if present */ - - /* if we switch to a vt with force 24 lines mode and */ - /* pure VT emulation and 25 rows charset, then we have */ - /* to clear the last line on display ... */ - - if(vsp->force24 && (vsp->vt_pure_mode == M_PUREVT) && - (vgacs[vsp->vga_charset].screen_size == SIZ_25ROWS)) - { - fillw(' ', vsp->Crtat + vsp->screen_rows * vsp->maxcol, - vsp->maxcol); - } - } -} - -/*---------------------------------------------------------------------------* - * Change specified vt to VT_AUTO mode - * xxx Maybe this should also reset VT_GRAFX mode; since switching and - * graphics modes are not going to work without VT_PROCESS mode. - *---------------------------------------------------------------------------*/ -static void -set_auto_mode (struct video_state *vsx) -{ - unsigned ostatus = vsx->vt_status; - vsx->smode.mode = VT_AUTO; - vsx->proc = NULL; - vsx->pid = 0; - vsx->vt_status &= ~(VT_WAIT_REL|VT_WAIT_ACK); - if (ostatus & VT_WAIT_ACK) { -#if 0 - assert (!(ostatus&VT_WAIT_REL)); - assert (vsp == vsx && - vt_switch_pending == current_video_screen + 1); - vt_switch_pending = 0; -#else - if (vsp == vsx && - vt_switch_pending == current_video_screen + 1) - vt_switch_pending = 0; -#endif - } - if (ostatus&VT_WAIT_REL) { - int new_screen = vt_switch_pending - 1; -#if 0 - assert(vsp == vsx && vt_switch_pending); - vt_switch_pending = 0; - vgapage (new_screen); -#else - if (vsp == vsx && vt_switch_pending) { - vt_switch_pending = 0; - vgapage (new_screen); - } -#endif - } -} - -/*---------------------------------------------------------------------------* - * Exported function; to be called when a vt is closed down. - * - * Ideally, we would like to be able to recover from an X server crash; - * but in reality, if the server crashes hard while in control of the - * vga board, then you're not likely to be able to use pcvt ttys - * without rebooting. - *---------------------------------------------------------------------------*/ -void -reset_usl_modes (struct video_state *vsx) -{ - /* Clear graphics mode */ - if (vsx->vt_status & VT_GRAFX) { - vsx->vt_status &= ~VT_GRAFX; - if (vsp == vsx) - switch_screen(current_video_screen, 1, 0); - } - - /* Take kbd out of raw mode */ - if (pcvt_kbd_raw && vsp == vsx) { -#if PCVT_SCANSET > 1 - kbd_emulate_pc(0); -#endif /* PCVT_SCANSET > 1 */ - pcvt_kbd_raw = 0; - } - - /* Clear process controlled mode */ - set_auto_mode (vsx); -} - -/*---------------------------------------------------------------------------* - * switch to virtual screen n (0 ... PCVT_NSCREENS-1), VT_USL version - * (the name vgapage() stands for historical reasons) - *---------------------------------------------------------------------------*/ -int -vgapage(int new_screen) -{ - int x; - - if(new_screen < 0 || new_screen >= totalscreens) - return EINVAL; - - /* fallback to VT_AUTO if controlling processes died */ - if(vsp->proc && vsp->proc != pfind(vsp->pid)) - set_auto_mode(vsp); - if(vs[new_screen].proc - && vs[new_screen].proc != pfind(vs[new_screen].pid)) - set_auto_mode(&vs[new_screen]); - - if (!vt_switch_pending && new_screen == current_video_screen) - return 0; - - if(vt_switch_pending && vt_switch_pending != new_screen + 1) { - /* Try resignaling uncooperative X-window servers */ - if (vsp->smode.mode == VT_PROCESS) { - if (vsp->vt_status & VT_WAIT_REL) { - if(vsp->smode.relsig) - psignal(vsp->proc, vsp->smode.relsig); - } else if (vsp->vt_status & VT_WAIT_ACK) { - if(vsp->smode.acqsig) - psignal(vsp->proc, vsp->smode.acqsig); - } - } - return EAGAIN; - } - - vt_switch_pending = new_screen + 1; - - if(vsp->smode.mode == VT_PROCESS) - { - /* we cannot switch immediately here */ - vsp->vt_status |= VT_WAIT_REL; - if(vsp->smode.relsig) - psignal(vsp->proc, vsp->smode.relsig); - } - else - { - struct video_state *old_vsp = vsp; - - switch_screen(new_screen, - vsp->vt_status & VT_GRAFX, - vs[new_screen].vt_status & VT_GRAFX); - - x = spltty(); - if(old_vsp->vt_status & VT_WAIT_ACT) - { - old_vsp->vt_status &= ~VT_WAIT_ACT; - wakeup((caddr_t)&old_vsp->smode); - } - if(vsp->vt_status & VT_WAIT_ACT) - { - vsp->vt_status &= ~VT_WAIT_ACT; - wakeup((caddr_t)&vsp->smode); - } - splx(x); - - if(vsp->smode.mode == VT_PROCESS) - { - /* if _new_ vt is under process control... */ - vsp->vt_status |= VT_WAIT_ACK; - if(vsp->smode.acqsig) - psignal(vsp->proc, vsp->smode.acqsig); - } - else - { - /* we are committed */ - vt_switch_pending = 0; -#if PCVT_FREEBSD > 206 - /* - * XXX: If pcvt is acting as the systems console, - * avoid panics going to the debugger while we are in - * process mode. - */ - if(pcvt_is_console) - cons_unavail = 0; -#endif - } - } - return 0; -} - -/*---------------------------------------------------------------------------* - * ioctl handling for VT_USL mode - *---------------------------------------------------------------------------*/ -int -usl_vt_ioctl(Dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) -{ - int i, j, error, opri; - struct vt_mode newmode; - - switch(cmd) - { - - case VT_SETMODE: - newmode = *(struct vt_mode *)data; - - opri = spltty(); - - if (newmode.mode != VT_PROCESS) { - struct video_state *vsx = &vs[minor(dev)]; - if (vsx->smode.mode == VT_PROCESS) { - if (vsx->proc != p) { - splx(opri); - return EPERM; - } - set_auto_mode(vsx); - } - splx(opri); - return 0; - } - - /* - * NB: XFree86-3.1.1 does the following: - * VT_ACTIVATE (vtnum) - * VT_WAITACTIVE (vtnum) - * VT_SETMODE (VT_PROCESS) - * So it is possible that the screen was switched - * between the WAITACTIVE and the SETMODE (here). This - * can actually happen quite frequently, and it was - * leading to dire consequences. Now it is detected by - * requiring that minor(dev) match current_video_screen. - * An alternative would be to operate on vs[minor(dev)] - * instead of *vsp, but that would leave the server - * confused, because it would believe that its vt was - * currently activated. - */ - if (minor(dev) != current_video_screen) { - splx(opri); - return EPERM; - } - - /* Check for server died */ - if(vsp->proc && vsp->proc != pfind(vsp->pid)) - set_auto_mode(vsp); - - /* Check for server already running */ - if (vsp->smode.mode == VT_PROCESS && vsp->proc != p) - { - splx(opri); - return EBUSY; /* already in use on this VT */ - } - - if (!ISSIGVALID(newmode.relsig) || !ISSIGVALID(newmode.acqsig) - || !ISSIGVALID(newmode.frsig)) - { - splx(opri); - return EINVAL; - } - - vsp->smode = newmode; - vsp->proc = p; - vsp->pid = p->p_pid; - -#if PCVT_FREEBSD > 206 - /* - * XXX: If pcvt is acting as the systems console, - * avoid panics going to the debugger while we are in - * process mode. - */ - if(pcvt_is_console) - cons_unavail = (newmode.mode == VT_PROCESS); -#endif - splx(opri); - return 0; - - case VT_GETMODE: - *(struct vt_mode *)data = vsp->smode; - return 0; - - case VT_RELDISP: - if (minor(dev) != current_video_screen) - return EPERM; - if (vsp->smode.mode != VT_PROCESS) - return EINVAL; - if (vsp->proc != p) - return EPERM; - switch(*(int *)data) { - case VT_FALSE: - /* process refuses to release screen; abort */ - if(vt_switch_pending - && (vsp->vt_status & VT_WAIT_REL)) { - vsp->vt_status &= ~VT_WAIT_REL; - vt_switch_pending = 0; - return 0; - } - break; - - case VT_TRUE: - /* process releases its VT */ - if(vt_switch_pending - && (vsp->vt_status & VT_WAIT_REL)) { - int new_screen = vt_switch_pending - 1; - struct video_state *old_vsp = vsp; - - vsp->vt_status &= ~VT_WAIT_REL; - - switch_screen(new_screen, - vsp->vt_status & VT_GRAFX, - vs[new_screen].vt_status - & VT_GRAFX); - - opri = spltty(); - if(old_vsp->vt_status & VT_WAIT_ACT) - { - old_vsp->vt_status &= ~VT_WAIT_ACT; - wakeup((caddr_t)&old_vsp->smode); - } - if(vsp->vt_status & VT_WAIT_ACT) - { - vsp->vt_status &= ~VT_WAIT_ACT; - wakeup((caddr_t)&vsp->smode); - } - splx(opri); - - if(vsp->smode.mode == VT_PROCESS) { - /* - * if the new vt is also in process - * mode, we have to wait until its - * controlling process acknowledged - * the switch - */ - vsp->vt_status - |= VT_WAIT_ACK; - if(vsp->smode.acqsig) - psignal(vsp->proc, - vsp->smode.acqsig); - } - else - { - /* we are committed */ - vt_switch_pending = 0; -#if PCVT_FREEBSD > 206 - /* XXX */ - if(pcvt_is_console) - cons_unavail = 0; -#endif - } - return 0; - } - break; - - case VT_ACKACQ: - /* new vts controlling process acknowledged */ - if(vsp->vt_status & VT_WAIT_ACK) { - vt_switch_pending = 0; - vsp->vt_status &= ~VT_WAIT_ACK; -#if PCVT_FREEBSD > 206 - /* XXX */ - if(pcvt_is_console) - cons_unavail = 1; -#endif - return 0; - } - break; - } - return EINVAL; /* end case VT_RELDISP */ - - - case VT_OPENQRY: - /* return free vt */ - for(i = 0; i < PCVT_NSCREENS; i++) - if(!vs[i].openf) { - *(int *)data = i + 1; - return 0; - } - return EAGAIN; - - case VT_GETACTIVE: - *(int *)data = current_video_screen + 1; - return 0; - - case VT_ACTIVATE: - return vgapage(*(int *)data - 1); - - case VT_WAITACTIVE: - /* sleep until vt switch happened */ - i = *(int *)data - 1; - - if(i != -1 - && (i < 0 || i >= PCVT_NSCREENS)) - return EINVAL; - - if(i != -1 && current_video_screen == i) - return 0; - - if(i == -1) - i = minor(dev); - - { - int x = spltty(); - error = 0; - while (current_video_screen != i && - (error == 0 || error == ERESTART)) - { - vs[i].vt_status |= VT_WAIT_ACT; - error = tsleep((caddr_t)&vs[i].smode, - PZERO | PCATCH, "waitvt", 0); - } - splx(x); - } - return error; - - case KDENABIO: - /* grant the process IO access; only allowed if euid == 0 */ - /* and insecure */ - { - -#if PCVT_NETBSD > 9 || PCVT_FREEBSD >= 200 - struct trapframe *fp = p->p_md.md_regs; -#elif PCVT_NETBSD || (PCVT_FREEBSD && PCVT_FREEBSD > 102) - struct trapframe *fp = (struct trapframe *)p->p_regs; -#else - struct syscframe *fp = (struct syscframe *)p->p_regs; -#endif - - error = suser(p->p_ucred, &p->p_acflag); - if (error != 0) - return (error); - if (securelevel > 0) - return (EPERM); - -#if PCVT_NETBSD || (PCVT_FREEBSD && PCVT_FREEBSD > 102) - fp->tf_eflags |= PSL_IOPL; -#else - fp->sf_eflags |= PSL_IOPL; -#endif - - return 0; - } - - case KDDISABIO: - /* abandon IO access permission */ - { - -#if PCVT_NETBSD > 9 || PCVT_FREEBSD >= 200 - struct trapframe *fp = p->p_md.md_regs; - fp->tf_eflags &= ~PSL_IOPL; -#elif PCVT_NETBSD || (PCVT_FREEBSD && PCVT_FREEBSD > 102) - struct trapframe *fp = (struct trapframe *)p->p_regs; - fp->tf_eflags &= ~PSL_IOPL; -#else - struct syscframe *fp = (struct syscframe *)p->p_regs; - fp->sf_eflags &= ~PSL_IOPL; -#endif - - return 0; - } - - case KDSETMODE: - { - struct video_state *vsx = &vs[minor(dev)]; - int haschanged = 0; - - if(adaptor_type != VGA_ADAPTOR - && adaptor_type != MDA_ADAPTOR) - /* X will only run on those adaptors */ - return (EINVAL); - - /* set text/graphics mode of current vt */ - switch(*(int *)data) - { - case KD_TEXT: - haschanged = (vsx->vt_status & VT_GRAFX) != 0; - vsx->vt_status &= ~VT_GRAFX; - if(haschanged && vsx == vsp) - switch_screen(current_video_screen, 1, 0); - return 0; - - case KD_GRAPHICS: - /* xxx It might be a good idea to require that - the vt be in process controlled mode here, - and that the calling process is the owner */ - haschanged = (vsx->vt_status & VT_GRAFX) == 0; - vsx->vt_status |= VT_GRAFX; - if(haschanged && vsx == vsp) - switch_screen(current_video_screen, 0, 1); - return 0; - - } - return EINVAL; /* end case KDSETMODE */ - } - - case KDSETRAD: - /* set keyboard repeat and delay */ - return kbdioctl(dev, KBDSTPMAT, data, flag); - - case KDSKBMODE: - switch(*(int *)data) - { - case K_RAW: - -#if PCVT_SCANSET > 1 - /* put keyboard to return ancient PC scan codes */ - kbd_emulate_pc(1); -#endif /* PCVT_SCANSET > 1 */ - - pcvt_kbd_raw = 1; - shift_down = meta_down = altgr_down = ctrl_down = 0; - return 0; - - case K_XLATE: - -#if PCVT_SCANSET > 1 - kbd_emulate_pc(0); -#endif /* PCVT_SCANSET > 1 */ - - pcvt_kbd_raw = 0; - return 0; - } - return EINVAL; /* end KDSKBMODE */ - - case KDMKTONE: - /* ring the speaker */ - if(data) - { - int duration = *(int *)data >> 16; - int pitch = *(int *)data & 0xffff; - -#if PCVT_NETBSD - if(pitch != 0) - { - sysbeep(PCVT_SYSBEEPF / pitch, - duration * hz / 1000); - } -#else /* PCVT_NETBSD */ - sysbeep(pitch, duration * hz / 3000); -#endif /* PCVT_NETBSD */ - - } - else - { - sysbeep(PCVT_SYSBEEPF / 1493, hz / 4); - } - return 0; - - case KDSETLED: - /* set kbd LED status */ - /* unfortunately, the LED definitions between pcvt and */ - /* USL differ some way :-( */ - i = *(int *)data; - j = (i & LED_CAP? KBD_CAPSLOCK: 0) - + (i & LED_NUM? KBD_NUMLOCK: 0) - + (i & LED_SCR? KBD_SCROLLLOCK: 0); - return kbdioctl(dev, KBDSLOCK, (caddr_t)&j, flag); - - case KDGETLED: - /* get kbd LED status */ - if((error = kbdioctl(dev, KBDGLOCK, (caddr_t)&j, flag))) - return error; - i = (j & KBD_CAPSLOCK? LED_CAP: 0) - + (j & KBD_NUMLOCK? LED_NUM: 0) - + (j & KBD_SCROLLLOCK? LED_SCR: 0); - *(int *)data = i; - return 0; - - case GIO_KEYMAP: - get_usl_keymap((keymap_t *)data); - return 0; - } /* end case cmd */ - - return -1; /* inappropriate usl_vt_compat ioctl */ -} -#endif /* PCVT_USL_VT_COMPAT */ - -#endif /* NVT > 0 */ - -/* ------------------------- E O F ------------------------------------------*/ - diff --git a/sys/i386/isa/pcvt/pcvt_hdr.h b/sys/i386/isa/pcvt/pcvt_hdr.h deleted file mode 100644 index 11adc9c..0000000 --- a/sys/i386/isa/pcvt/pcvt_hdr.h +++ /dev/null @@ -1,1418 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. - * - * Copyright (c) 1992, 1993 Brian Dunford-Shore. - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by - * Hellmuth Michaelis, Brian Dunford-Shore and Joerg Wunsch. - * 4. The name authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * - * @(#)pcvt_hdr.h, 3.20, Last Edit-Date: [Fri Apr 7 10:16:58 1995] - * - */ - -/*--------------------------------------------------------------------------- - * - * pcvt_hdr.h VT220 Driver Global Include File - * ------------------------------------------------ - * -hm ------------ Release 3.00 -------------- - * -hm integrating NetBSD-current patches - * -hm integrating patches from Thomas Gellekum - * -hm moving vt_selattr() inline into this file - * -hm Michael's keyboard fifo diffs - * -hm documenting some #ifdef's ... - * -hm Joerg's patches for FreeBSD's ttymalloc - * -jw introduced kbd_emulate_pc() if scanset > 1 - * -hm moved user configurable items to pcvt_conf.h - * -hm applying Joerg's patches for FreeBSD 2.0 - * -hm patch from Onno & Martin for NetBSD-current (post 1.0) - * -hm some adjustments for NetBSD 1.0 - * -hm patch from Joerg fixing FreeBSD 2.0 support - * -hm patch from Onno/John for NetBSD-current - * -hm applying patch from Joerg fixing Crtat bug - * -hm removed PCVT_FAKE_SYSCONS10 - * -hm added pcstop (patch from Onno) - * -hm multiple X server bugfixes from Lon Willett - * -hm patch from Joerg for FreeBSD pre-2.1 - * -jw adding more support for FreeBSD pre-2.1 - * - *---------------------------------------------------------------------------*/ - -#define PCVT_REL "3.20-b24" /* driver attach announcement */ - /* see also: pcvt_ioctl.h */ - -#include "opt_pcvt.h" -#if defined(__FreeBSD__) && !defined(PCVT_FREEBSD) -# define PCVT_FREEBSD 210 -#endif - -#if PCVT_FREEBSD >= 200 - -#include <sys/param.h> -#include <sys/conf.h> -#include <sys/proc.h> -#include <sys/signalvar.h> -#include <sys/tty.h> -#include <sys/uio.h> -#include <sys/callout.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/syslog.h> -#include <sys/malloc.h> -#include <sys/time.h> -#if PCVT_FREEBSD > 210 -#include <machine/random.h> -#endif /* PCVT_FREEBSD > 210 */ -#else /* ! PCVT_FREEBSD >= 200 */ - -#include "param.h" -#include "conf.h" -#include "ioctl.h" -#include "proc.h" -#include "signalvar.h" -#include "tty.h" -#include "uio.h" -#include "callout.h" -#include "systm.h" -#include "kernel.h" -#include "syslog.h" -#include "malloc.h" -#include "time.h" - -#endif /* PCVT_FREEBSD >= 200 */ - -#include <i386/isa/pcvt/pcvt_conf.h> -#include <i386/isa/kbdio.h> - -#if PCVT_NETBSD > 9 -#include "device.h" -#endif - -#if PCVT_NETBSD > 9 -#include "i386/isa/isavar.h" -#include "i386/cpufunc.h" -#elif PCVT_FREEBSD >= 200 -#include <i386/isa/isa_device.h> -#else -#include "i386/isa/isa_device.h" -#endif - -#if PCVT_FREEBSD >= 200 -#include <i386/isa/icu.h> -#else -#include "i386/isa/icu.h" -#endif - -#if PCVT_NETBSD > 100 -#include "i386/isa/isareg.h" -#elif PCVT_FREEBSD >= 200 -#include <i386/isa/isa.h> -#else -#include "i386/isa/isa.h" -#endif - -#if PCVT_NETBSD > 9 -#include "dev/cons.h" -#elif PCVT_FREEBSD >= 200 -#include <machine/cons.h> -#else -#include "i386/i386/cons.h" -#endif - -#if PCVT_NETBSD <= 9 -#if PCVT_FREEBSD >= 200 -#include <machine/psl.h> -#include <machine/frame.h> -#else /* ! PCVT_FREEBSD >= 200 */ -#include "machine/psl.h" -#include "machine/frame.h" -#endif /* PCVT_FREEBSD >= 200 */ -#endif /* PCVT_NETBSD <= 9 */ - -#if PCVT_NETBSD > 9 -#include <i386/isa/pcvt/pcvt_ioctl.h> -#elif PCVT_FREEBSD >= 200 -#include <machine/pcvt_ioctl.h> -#else -#include "machine/pcvt_ioctl.h" -#endif - -#if PCVT_FREEBSD >= 200 -#include <machine/pc/display.h> -#if PCVT_FREEBSD > 200 -#include <machine/clock.h> -#include <machine/md_var.h> -#endif -#else /* PCVT_FREEBSD >= 200 */ -#include "machine/pc/display.h" -#endif /* PCVT_FREEBSD >= 200 */ - -/* setup irq disable function to use */ - -#if !(PCVT_SLOW_INTERRUPT) && (PCVT_NETBSD > 9) -# define PCVT_DISABLE_INTR() disable_intr() -# define PCVT_ENABLE_INTR() enable_intr() -# undef PCVT_SLOW_INTERRUPT -#else -# define PCVT_DISABLE_INTR() s = spltty() -# define PCVT_ENABLE_INTR() splx(s) -# undef PCVT_SLOW_INTERRUPT -# define PCVT_SLOW_INTERRUPT 1 -#endif - -/* perform option consistency checks */ - -#if defined PCVT_FREEBSD && PCVT_FREEBSD == 1 -# undef PCVT_FREEBSD -# define PCVT_FREEBSD 102 /* assume 1.0 release */ -#endif - -#if defined PCVT_NETBSD && PCVT_NETBSD == 1 -#undef PCVT_NETBSD -#define PCVT_NETBSD 9 /* assume 0.9 release for now */ -#endif - -#if PCVT_FREEBSD + PCVT_NETBSD == 0 -# error "pcvt_hdr.h: You MUST define one of PCVT_{NET,FREE}BSD \ -in the config file" -#elif (PCVT_FREEBSD && PCVT_NETBSD) -# error "pcvt_hdr.h: You CAN only define *one* of PCVT_{NET,FREE}BSD \ -in the config file" -#endif - -#ifdef XSERVER - -/* PCVT_NULLCHARS is mandatory for X server */ -#if !PCVT_NULLCHARS -#undef PCVT_NULLCHARS -#define PCVT_NULLCHARS 1 -#endif - -/* PCVT_BACKUP_FONTS is mandatory for PCVT_USL_VT_COMPAT */ -#if PCVT_USL_VT_COMPAT && !PCVT_BACKUP_FONTS -#undef PCVT_BACKUP_FONTS -#define PCVT_BACKUP_FONTS 1 -#endif - -#else /* XSERVER */ - -#if PCVT_USL_VT_COMPAT -#warning "Option PCVT_USL_VT_COMPAT meaningless without XSERVER" -#undef PCVT_USL_VT_COMPAT -#define PCVT_USL_VT_COMPAT 0 -#endif - -#endif /* XSERVER */ - -/* PCVT_SCREENSAVER is mandatory for PCVT_PRETTYSCRNS */ -#if PCVT_PRETTYSCRNS && !PCVT_SCREENSAVER -#undef PCVT_SCREENSAVER -#define PCVT_SCREENSAVER 1 -#endif - -/* get the inline inb/outb back again ... */ - -#if PCVT_NETBSD -#if PCVT_NETBSD == 9 -#include "machine/cpufunc.h" /* NetBSD 0.9 [...and earlier -currents] */ -#undef PCVT_USL_VT_COMPAT -#define PCVT_USL_VT_COMPAT 0 /* does not work, workaround ... */ -#else -#include "machine/pio.h" /* recent NetBSD -currents */ -#define NEW_AVERUNNABLE /* averunnable changes for younger currents */ -#endif /* PCVT_NETBSD == 9 */ -#endif /* PCVT_NETBSD */ - -#if PCVT_FREEBSD >= 200 -#define NEW_AVERUNNABLE /* new averunnable changes for FreeBSD 2.0 */ -#endif - -#if PCVT_SCANSET !=1 && PCVT_SCANSET !=2 -#error "Supported keyboard scancode sets are 1 and 2 only (for now)!!!" -#endif - -/*---------------------------------------------------------------------------* - * Keyboard and Keyboard Controller - *---------------------------------------------------------------------------*/ - -#ifndef _I386_ISA_KBDIO_H_ - -#define CONTROLLER_CTRL 0x64 /* W - command, R - status */ -#define CONTROLLER_DATA 0x60 /* R/W - data */ - -/* commands to control the CONTROLLER (8042) on the mainboard */ - -#define CONTR_READ 0x20 /* read command byte from controller */ -#define CONTR_WRITE 0x60 /* write command to controller, see below */ -#define CONTR_SELFTEST 0xaa /* controller selftest, returns 0x55 when ok */ -#define CONTR_IFTEST 0xab /* interface selftest */ -#define CONTR_KBDISABL 0xad /* disable keyboard */ -#define CONTR_KBENABL 0xae /* enable keyboard */ - -/* command byte for writing to CONTROLLER (8042) via CONTR_WRITE */ - -#define COMMAND_RES7 0x80 /* bit 7, reserved, always write a ZERO ! */ -#define COMMAND_PCSCAN 0x40 /* bit 6, 1 = convert to pc scan codes */ -#define COMMAND_RES5 0x20 /* bit 5, perhaps (!) use 9bit frame - * instead of 11 */ -#define COMMAND_DISABL 0x10 /* bit 4, 1 = disable keyboard */ -#define COMMAND_INHOVR 0x08 /* bit 3, 1 = override security lock inhibit */ -#define COMMAND_SYSFLG 0x04 /* bit 2, value stored as "system flag" */ -#define COMMAND_RES2 0x02 /* bit 1, reserved, always write a ZERO ! */ -#define COMMAND_IRQEN 0x01 /* bit 0, 1 = enable output buffer full - * interrupt */ - -/* status from CONTROLLER (8042) on the mainboard */ - -#define STATUS_PARITY 0x80 /* bit 7, 1 = parity error on last byte */ -#define STATUS_RXTIMO 0x40 /* bit 6, 1 = receive timeout error occured */ -#define STATUS_TXTIMO 0x20 /* bit 5, 1 = transmit timeout error occured */ -#define STATUS_ENABLE 0x10 /* bit 4, 1 = keyboard unlocked */ -#define STATUS_WHAT 0x08 /* bit 3, 1 = wrote cmd to 0x64, 0 = wrote - * data to 0x60 */ -#define STATUS_SYSFLG 0x04 /* bit 2, value stored as "system flag" */ -#define STATUS_INPBF 0x02 /* bit 1, 1 = input buffer full (to 8042) */ -#define STATUS_OUTPBF 0x01 /* bit 0, 1 = output buffer full (from 8042) */ - -/* commands to the KEYBOARD (via the 8042 controller on mainboard..) */ - -#define KEYB_C_RESET 0xff /* reset keyboard to power-on status */ -#define KEYB_C_RESEND 0xfe /* resend last byte in case of error */ -#define KEYB_C_TYPEM 0xf3 /* set keyboard typematic rate/delay */ -#define KEYB_C_ID 0xf2 /* return keyboard id */ -#define KEYB_C_ECHO 0xee /* diagnostic, echo 0xee */ -#define KEYB_C_LEDS 0xed /* set/reset numlock,capslock & scroll lock */ - -#endif /* _I386_ISA_KBDIO_H_ */ - -/* responses from the KEYBOARD (via the 8042 controller on mainboard..) */ - -#define KEYB_R_OVERRUN0 0x00 /* keyboard buffer overflow */ -#define KEYB_R_SELFOK 0xaa /* keyboard selftest ok after KEYB_C_RESET */ -#define KEYB_R_EXT0 0xe0 /* keyboard extended scancode prefix 1 */ -#define KEYB_R_EXT1 0xe1 /* keyboard extended scancode prefix 2 */ -#define KEYB_R_ECHO 0xee /* keyboard response to KEYB_C_ECHO */ -#define KEYB_R_BREAKPFX 0xf0 /* break code prefix for set 2 and 3 */ -#define KEYB_R_ACK 0xfa /* acknowledge after a command has rx'd */ -#define KEYB_R_SELFBAD 0xfc /*keyboard selftest FAILED after KEYB_C_RESET*/ -#define KEYB_R_DIAGBAD 0xfd /* keyboard self diagnostic failure */ -#define KEYB_R_RESEND 0xfe /* keyboard wants command resent or illegal - * command rx'd */ -#define KEYB_R_OVERRUN1 0xff /* keyboard buffer overflow */ - -#define KEYB_R_MF2ID1 0xab /* MF II Keyboard id-byte #1 */ -#define KEYB_R_MF2ID2 0x41 /* MF II Keyboard id-byte #2 */ -#define KEYB_R_MF2ID2HP 0x83 /* MF II Keyboard id-byte #2 from HP keybd's */ - -/* internal Keyboard Type */ - -#define KB_UNKNOWN 0 /* unknown keyboard type */ -#define KB_AT 1 /* AT (84 keys) Keyboard */ -#define KB_MFII 2 /* MF II (101/102 keys) Keyboard */ - -/*---------------------------------------------------------------------------* - * CMOS ram access to get the "Equipment Byte" - *---------------------------------------------------------------------------*/ - -#define RTC_EQUIPMENT 0x14 /* equipment byte in cmos ram */ -#define EQ_EGAVGA 0 /* reserved (= ega/vga) */ -#define EQ_40COLOR 1 /* display = 40 col color */ -#define EQ_80COLOR 2 /* display = 80 col color */ -#define EQ_80MONO 3 /* display = 80 col mono */ - -/*---------------------------------------------------------------------------* - * VT220 -> internal color conversion table fields - *---------------------------------------------------------------------------*/ - -#define VT_NORMAL 0x00 /* no attributes at all */ -#define VT_BOLD 0x01 /* bold attribute */ -#define VT_UNDER 0x02 /* underline attribute */ -#define VT_BLINK 0x04 /* blink attribute */ -#define VT_INVERSE 0x08 /* inverse attribute */ - -/*---------------------------------------------------------------------------* - * VGA GENERAL/EXTERNAL Registers (3BA or 3DA and 3CA, 3C2, 3CC) - *---------------------------------------------------------------------------*/ - -#define GN_MISCOUTR 0x3CC /* misc output register read */ -#define GN_MISCOUTW 0x3C2 /* misc output register write */ -#define GN_INPSTAT0 0x3C2 /* input status 0, r/o */ -#define GN_INPSTAT1M 0x3BA /* input status 1, r/o, mono */ -#define GN_INPSTAT1C 0x3DA /* input status 1, r/o, color */ -#define GN_FEATR 0x3CA /* feature control, read */ -#define GN_FEATWM 0x3BA /* feature control, write, mono */ -#define GN_FEATWC 0x3DA /* feature control, write, color */ -#define GN_VSUBSYS 0x3C3 /* video subsystem register r/w */ -#define GN_DMCNTLM 0x3B8 /* display mode control, r/w, mono */ -#define GN_DMCNTLC 0x3D8 /* display mode control, r/w, color */ -#define GN_COLORSEL 0x3D9 /* color select register, w/o */ -#define GN_HERCOMPAT 0x3BF /* Hercules compatibility reg, w/o */ - -/*---------------------------------------------------------------------------* - * VGA CRTC Registers (3B4 and 3B5 or 3D4 and 3D5) - *---------------------------------------------------------------------------*/ - -#define MONO_BASE 0x3B4 /* crtc index register address mono */ -#define CGA_BASE 0x3D4 /* crtc index register address color */ - -#define CRTC_ADDR 0x00 /* index register */ - -#define CRTC_HTOTAL 0x00 /* horizontal total */ -#define CRTC_HDISPLE 0x01 /* horizontal display end */ -#define CRTC_HBLANKS 0x02 /* horizontal blank start */ -#define CRTC_HBLANKE 0x03 /* horizontal blank end */ -#define CRTC_HSYNCS 0x04 /* horizontal sync start */ -#define CRTC_HSYNCE 0x05 /* horizontal sync end */ -#define CRTC_VTOTAL 0x06 /* vertical total */ -#define CRTC_OVERFLL 0x07 /* overflow low */ -#define CRTC_IROWADDR 0x08 /* inital row address */ -#define CRTC_MAXROW 0x09 /* maximum row address */ -#define CRTC_CURSTART 0x0A /* cursor start row address */ -#define CURSOR_ON_BIT 0x20 /* cursor on/off on mda/cga/vga */ -#define CRTC_CUREND 0x0B /* cursor end row address */ -#define CRTC_STARTADRH 0x0C /* linear start address mid */ -#define CRTC_STARTADRL 0x0D /* linear start address low */ -#define CRTC_CURSORH 0x0E /* cursor address mid */ -#define CRTC_CURSORL 0x0F /* cursor address low */ -#define CRTC_VSYNCS 0x10 /* vertical sync start */ -#define CRTC_VSYNCE 0x11 /* vertical sync end */ -#define CRTC_VDE 0x12 /* vertical display end */ -#define CRTC_OFFSET 0x13 /* row offset */ -#define CRTC_ULOC 0x14 /* underline row address */ -#define CRTC_VBSTART 0x15 /* vertical blank start */ -#define CRTC_VBEND 0x16 /* vertical blank end */ -#define CRTC_MODE 0x17 /* CRTC mode register */ -#define CRTC_SPLITL 0x18 /* split screen start low */ - -/* start of ET4000 extensions */ - -#define CRTC_RASCAS 0x32 /* ras/cas configuration */ -#define CRTC_EXTSTART 0x33 /* extended start address */ -#define CRTC_COMPAT6845 0x34 /* 6845 comatibility control */ -#define CRTC_OVFLHIGH 0x35 /* overflow high */ -#define CRTC_SYSCONF1 0x36 /* video system configuration 1 */ -#define CRTC_SYSCONF2 0x36 /* video system configuration 2 */ - -/* start of WD/Paradise extensions */ - -#define CRTC_PR10 0x29 /* r/w unlocking */ -#define CRTC_PR11 0x2A /* ega switches */ -#define CRTC_PR12 0x2B /* scratch pad */ -#define CRTC_PR13 0x2C /* interlace h/2 start */ -#define CRTC_PR14 0x2D /* interlace h/2 end */ -#define CRTC_PR15 0x2E /* misc control #1 */ -#define CRTC_PR16 0x2F /* misc control #2 */ -#define CRTC_PR17 0x30 /* misc control #3 */ - /* 0x31 .. 0x3f reserved */ -/* Video 7 */ - -#define CRTC_V7ID 0x1f /* identification register */ - -/* Trident */ - -#define CRTC_MTEST 0x1e /* module test register */ -#define CRTC_SOFTPROG 0x1f /* software programming */ -#define CRTC_LATCHRDB 0x22 /* latch read back register */ -#define CRTC_ATTRSRDB 0x24 /* attribute state read back register*/ -#define CRTC_ATTRIRDB 0x26 /* attribute index read back register*/ -#define CRTC_HOSTAR 0x27 /* high order start address register */ - -/*---------------------------------------------------------------------------* - * VGA TIMING & SEQUENCER Registers (3C4 and 3C5) - *---------------------------------------------------------------------------*/ - -#define TS_INDEX 0x3C4 /* index register */ -#define TS_DATA 0x3C5 /* data register */ - -#define TS_SYNCRESET 0x00 /* synchronous reset */ -#define TS_MODE 0x01 /* ts mode register */ -#define TS_WRPLMASK 0x02 /* write plane mask */ -#define TS_FONTSEL 0x03 /* font select register */ -#define TS_MEMMODE 0x04 /* memory mode register */ - -/* ET4000 only */ - -#define TS_RESERVED 0x05 /* undef, reserved */ -#define TS_STATECNTL 0x06 /* state control register */ -#define TS_AUXMODE 0x07 /* auxiliary mode control */ - -/* WD/Paradise only */ - -#define TS_UNLOCKSEQ 0x06 /* PR20 - unlock sequencer register */ -#define TS_DISCFSTAT 0x07 /* PR21 - display config status */ -#define TS_MEMFIFOCTL 0x10 /* PR30 - memory i/f & fifo control */ -#define TS_SYSIFCNTL 0x11 /* PR31 - system interface control */ -#define TS_MISC4 0x12 /* PR32 - misc control #4 */ - -/* Video 7 */ - -#define TS_EXTCNTL 0x06 /* extensions control */ -#define TS_CLRVDISP 0x30 /* clear vertical display 0x30-0x3f */ -#define TS_V7CHIPREV 0x8e /* chipset revision 0x8e-0x8f */ -#define TS_SWBANK 0xe8 /* single/write bank register, rev 5+*/ -#define TS_RDBANK 0xe8 /* read bank register, rev 4+ */ -#define TS_MISCCNTL 0xe8 /* misc control register, rev 4+ */ -#define TS_SWSTROBE 0xea /* switch strobe */ -#define TS_MWRCNTL 0xf3 /* masked write control */ -#define TS_MWRMVRAM 0xf4 /* masked write mask VRAM only */ -#define TS_BANKSEL 0xf6 /* bank select */ -#define TS_SWREADB 0xf7 /* switch readback */ -#define TS_PAGESEL 0xf9 /* page select */ -#define TS_COMPAT 0xfc /* compatibility control */ -#define TS_16BITCTL 0xff /* 16 bit interface control */ - -/* Trident */ - -#define TS_HWVERS 0x0b /* hardware version, switch old/new! */ -#define TS_CONFPORT1 0x0c /* config port 1 and 2 - caution! */ -#define TS_MODEC2 0x0d /* old/new mode control 2 - caution! */ -#define TS_MODEC1 0x0e /* old/new mode control 1 - caution! */ -#define TS_PUPM2 0x0f /* power up mode 2 */ - -/*---------------------------------------------------------------------------* - * VGA GRAPHICS DATA CONTROLLER Registers (3CE, 3CF and 3CD) - *---------------------------------------------------------------------------*/ - -#define GDC_SEGSEL 0x3CD /* segment select register */ -#define GDC_INDEX 0x3CE /* index register */ -#define GDC_DATA 0x3CF /* data register */ - -#define GDC_SETRES 0x00 /* set / reset bits */ -#define GDC_ENSETRES 0x01 /* enable set / reset */ -#define GDC_COLORCOMP 0x02 /* color compare register */ -#define GDC_ROTFUNC 0x03 /* data rotate / function select */ -#define GDC_RDPLANESEL 0x04 /* read plane select */ -#define GDC_MODE 0x05 /* gdc mode register */ -#define GDC_MISC 0x06 /* gdc misc register */ -#define GDC_COLORCARE 0x07 /* color care register */ -#define GDC_BITMASK 0x08 /* bit mask register */ - -/* WD/Paradise only */ - -#define GDC_BANKSWA 0x09 /* PR0A - bank switch a */ -#define GDC_BANKSWB 0x0a /* PR0B - bank switch b */ -#define GDC_MEMSIZE 0x0b /* PR1 memory size */ -#define GDC_VIDEOSEL 0x0c /* PR2 video configuration */ -#define GDC_CRTCNTL 0x0d /* PR3 crt address control */ -#define GDC_VIDEOCNTL 0x0e /* PR4 video control */ -#define GDC_PR5GPLOCK 0x0f /* PR5 gp status and lock */ - -/* Video 7 */ - -#define GDC_DATALATCH 0x22 /* gdc data latch */ - -/*---------------------------------------------------------------------------* - * VGA ATTRIBUTE CONTROLLER Registers (3C0 and 3C1) - *---------------------------------------------------------------------------*/ - -#define ATC_INDEX 0x3C0 /* index register AND */ -#define ATC_DATAW 0x3C0 /* data write !!! */ -#define ATC_DATAR 0x3C1 /* data read */ - -#define ATC_ACCESS 0x20 /* access bit in ATC index register */ - -#define ATC_PALETTE0 0x00 /* color palette register 0 */ -#define ATC_PALETTE1 0x01 /* color palette register 1 */ -#define ATC_PALETTE2 0x02 /* color palette register 2 */ -#define ATC_PALETTE3 0x03 /* color palette register 3 */ -#define ATC_PALETTE4 0x04 /* color palette register 4 */ -#define ATC_PALETTE5 0x05 /* color palette register 5 */ -#define ATC_PALETTE6 0x06 /* color palette register 6 */ -#define ATC_PALETTE7 0x07 /* color palette register 7 */ -#define ATC_PALETTE8 0x08 /* color palette register 8 */ -#define ATC_PALETTE9 0x09 /* color palette register 9 */ -#define ATC_PALETTEA 0x0A /* color palette register 10 */ -#define ATC_PALETTEB 0x0B /* color palette register 11 */ -#define ATC_PALETTEC 0x0C /* color palette register 12 */ -#define ATC_PALETTED 0x0D /* color palette register 13 */ -#define ATC_PALETTEE 0x0E /* color palette register 14 */ -#define ATC_PALETTEF 0x0F /* color palette register 15 */ -#define ATC_MODE 0x10 /* atc mode register */ -#define ATC_OVERSCAN 0x11 /* overscan register */ -#define ATC_COLPLEN 0x12 /* color plane enable register */ -#define ATC_HORPIXPAN 0x13 /* horizontal pixel panning */ -#define ATC_COLRESET 0x14 /* color reset */ -#define ATC_MISC 0x16 /* misc register (ET3000/ET4000) */ - -/*---------------------------------------------------------------------------* - * VGA palette handling (output DAC palette) - *---------------------------------------------------------------------------*/ - -#define VGA_DAC 0x3C6 /* vga dac address */ -#define VGA_PMSK 0x3F /* palette mask, 64 distinct values */ -#define NVGAPEL 256 /* number of palette entries */ - -/*---------------------------------------------------------------------------* - * function key labels - *---------------------------------------------------------------------------*/ - -#define LABEL_LEN 9 /* length of one label */ -#define LABEL_MID 8 /* mid-part (row/col) */ - -#define LABEL_ROWH ((4*LABEL_LEN)+1) -#define LABEL_ROWL ((4*LABEL_LEN)+2) -#define LABEL_COLU ((4*LABEL_LEN)+4) -#define LABEL_COLH ((4*LABEL_LEN)+5) -#define LABEL_COLL ((4*LABEL_LEN)+6) - -/* tab setting */ - -#define MAXTAB 132 /* no of possible tab stops */ - -/* escape detection state machine */ - -#define STATE_INIT 0 /* normal */ -#define STATE_ESC 1 /* got ESC */ -#define STATE_BLANK 2 /* got ESC space*/ -#define STATE_HASH 3 /* got ESC # */ -#define STATE_BROPN 4 /* got ESC ( */ -#define STATE_BRCLO 5 /* got ESC ) */ -#define STATE_CSI 6 /* got ESC [ */ -#define STATE_CSIQM 7 /* got ESC [ ? */ -#define STATE_AMPSND 8 /* got ESC & */ -#define STATE_STAR 9 /* got ESC * */ -#define STATE_PLUS 10 /* got ESC + */ -#define STATE_DCS 11 /* got ESC P */ -#define STATE_SCA 12 /* got ESC <Ps> " */ -#define STATE_STR 13 /* got ESC ! */ -#define STATE_MINUS 14 /* got ESC - */ -#define STATE_DOT 15 /* got ESC . */ -#define STATE_SLASH 16 /* got ESC / */ - -/* for storing escape sequence parameters */ - -#define MAXPARMS 10 /* maximum no of parms */ - -/* terminal responses */ - -#define DA_VT220 "\033[?62;1;2;6;7;8;9c" - -/* sub-states for Device Control String processing */ - -#define DCS_INIT 0 /* got ESC P ... */ -#define DCS_AND_UDK 1 /* got ESC P ... | */ -#define DCS_UDK_DEF 2 /* got ESC P ... | fnckey / */ -#define DCS_UDK_ESC 3 /* got ESC P ... | fnckey / ... ESC */ -#define DCS_DLD_DSCS 4 /* got ESC P ... { */ -#define DCS_DLD_DEF 5 /* got ESC P ... { dscs */ -#define DCS_DLD_ESC 6 /* got ESC P ... { dscs ... / ... ESC */ - -/* vt220 user defined keys and vt220 downloadable charset */ - -#define MAXUDKDEF 300 /* max 256 char + 1 '\0' + space.. */ -#define MAXUDKEYS 18 /* plus holes .. */ -#define DSCS_LENGTH 3 /* descriptor length */ -#define MAXSIXEL 8 /* sixels forever ! */ - -/* sub-states for HP-terminal emulator */ - -#define SHP_INIT 0 - -/* esc & f family */ - -#define SHP_AND_F 1 -#define SHP_AND_Fa 2 -#define SHP_AND_Fak 3 -#define SHP_AND_Fak1 4 -#define SHP_AND_Fakd 5 -#define SHP_AND_FakdL 6 -#define SHP_AND_FakdLl 7 -#define SHP_AND_FakdLls 8 - -/* esc & j family */ - -#define SHP_AND_J 9 -#define SHP_AND_JL 10 - -/* esc & every-thing-else */ - -#define SHP_AND_ETE 11 - -/* additionals for function key labels */ - -#define MAX_LABEL 16 -#define MAX_STRING 80 -#define MAX_STATUS 160 - -/* MAX values for screen sizes for possible video adaptors */ - -#define MAXROW_MDACGA 25 /* MDA/CGA can do 25 x 80 max */ -#define MAXCOL_MDACGA 80 - -#define MAXROW_EGA 43 /* EGA can do 43 x 80 max */ -#define MAXCOL_EGA 80 - -#define MAXROW_VGA 50 /* VGA can do 50 x 80 max */ -#define MAXCOL_VGA 80 -#define MAXCOL_SVGA 132 /* Super VGA can do 50 x 132 max */ - -/* switch 80/132 columns */ - -#define SCR_COL80 80 /* in 80 col mode */ -#define SCR_COL132 132 /* in 132 col mode */ - -#define MAXDECSCA (((MAXCOL_SVGA * MAXROW_VGA) \ - / (8 * sizeof(unsigned int)) ) + 1 ) - -/* screen memory start, monochrome */ - -#ifndef MONO_BUF -# if PCVT_FREEBSD && (PCVT_FREEBSD > 102) -# define MONO_BUF (KERNBASE+0xB0000) -# else -# define MONO_BUF 0xfe0B0000 /* NetBSD-current: isa.h */ -# endif -#endif - -/* screen memory start, color */ - -#ifndef CGA_BUF -# if PCVT_FREEBSD && (PCVT_FREEBSD > 102) -# define CGA_BUF (KERNBASE+0xB8000) -# else -# define CGA_BUF 0xfe0B8000 /* NetBSD-current: isa.h */ -# endif -#endif - -#define CHR 2 /* bytes per word in screen mem */ - -#define NVGAFONTS 8 /* number of vga fonts loadable */ - -#define MAXKEYNUM 127 /* max no of keys in table */ - -/* charset tables */ - -#define CSL 0x0000 /* ega/vga charset, lower half of 512 */ -#define CSH 0x0800 /* ega/vga charset, upper half of 512 */ -#define CSSIZE 96 /* (physical) size of a character set */ - -/* charset designations */ - -#define D_G0 0 /* designated as G0 */ -#define D_G1 1 /* designated as G1 */ -#define D_G2 2 /* designated as G2 */ -#define D_G3 3 /* designated as G3 */ -#define D_G1_96 4 /* designated as G1 for 96-char charsets */ -#define D_G2_96 5 /* designated as G2 for 96-char charsets */ -#define D_G3_96 6 /* designated as G3 for 96-char charsets */ - -/* which fkey-labels */ - -#define SYS_FKL 0 /* in hp mode, sys-fkls are active */ -#define USR_FKL 1 /* in hp mode, user-fkls are active */ - -/* arguments to async_update() */ - -#define UPDATE_START ((void *)0) /* do cursor update and requeue */ -#define UPDATE_STOP ((void *)1) /* suspend cursor updates */ -#define UPDATE_KERN ((void *)2) /* do cursor updates for kernel output */ - -/* variables */ - -#ifdef EXTERN -#define WAS_EXTERN -#else -#define EXTERN extern -#endif - -EXTERN u_char *more_chars; /* response buffer via kbd */ -EXTERN int char_count; /* response char count */ -EXTERN u_char color; /* color or mono display */ - -EXTERN u_short kern_attr; /* kernel messages char attributes */ -EXTERN u_short user_attr; /* character attributes */ - -#if !PCVT_EMU_MOUSE - -#if PCVT_NETBSD -EXTERN struct tty *pc_tty[PCVT_NSCREENS]; -#elif !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) -EXTERN struct tty pccons[PCVT_NSCREENS]; -#else -EXTERN struct tty *pccons[PCVT_NSCREENS]; -#endif /* PCVT_NETBSD */ - -#else /* PCVT_EMU_MOUSE */ - -#if PCVT_NETBSD -EXTERN struct tty *pc_tty[PCVT_NSCREENS + 1]; -#elif !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) -EXTERN struct tty pccons[PCVT_NSCREENS + 1]; -#else -EXTERN struct tty *pccons[PCVT_NSCREENS + 1]; -#endif - -#endif /* PCVT_EMU_MOUSE */ - -struct sixels { - u_char lower[MAXSIXEL]; /* lower half of char */ - u_char upper[MAXSIXEL]; /* upper half of char */ -}; - -struct udkentry { - u_char first[MAXUDKEYS]; /* index to first char */ - u_char length[MAXUDKEYS]; /* length of this entry */ -}; - -/* VGA palette handling */ -struct rgb { - u_char r, g, b; /* red/green/blue, valid 0..VGA_PMSK */ -}; - -typedef struct video_state { - u_short *Crtat; /* video page start addr */ - u_short *Memory; /* malloc'ed memory start address */ - struct tty *vs_tty; /* pointer to this screen's tty */ - u_char maxcol; /* 80 or 132 cols on screen */ - u_char row, col; /* current cursor position */ - u_short c_attr; /* current character attributes */ - u_char vtsgr; /* current sgr configuration */ - u_short cur_offset; /* current cursor position offset */ - u_char bell_on; /* flag, bell enabled */ - u_char sevenbit; /* flag, data path 7 bits wide */ - u_char dis_fnc; /* flag, display functions enable */ - u_char transparent; /* flag, mk path tmp trnsprnt for ctls*/ - u_char scrr_beg; /* scrolling region, begin */ - u_char scrr_len; /* scrolling region, length */ - u_char scrr_end; /* scrolling region, end */ - u_char screen_rows; /* screen size, length - status lines */ - u_char screen_rowsize; /* screen size, length */ - u_char vga_charset; /* VGA character set value */ - u_char lastchar; /* flag, vt100 behaviour of last char */ - u_char lastrow; /* save row, --------- " ----------- */ - u_char *report_chars; /* ptr, status reports from terminal */ - u_char report_count; /* count, ----------- " ------------ */ - u_char state; /* escape sequence state machine */ - u_char m_awm; /* flag, vt100 mode, auto wrap */ - u_char m_om; /* flag, vt100 mode, origin mode */ - u_char sc_flag; /* flag, vt100 mode,saved parms valid */ - u_char sc_row; /* saved row */ - u_char sc_col; /* saved col */ - u_short sc_cur_offset; /* saved cursor addr offset */ - u_short sc_attr; /* saved attributes */ - u_char sc_vtsgr; /* saved sgr configuration */ - u_char sc_awm; /* saved auto wrap mode */ - u_char sc_om; /* saved origin mode */ - u_short *sc_G0; /* save G0 ptr */ - u_short *sc_G1; /* save G1 ptr */ - u_short *sc_G2; /* save G2 ptr */ - u_short *sc_G3; /* save G3 ptr */ - u_short **sc_GL; /* save GL ptr */ - u_short **sc_GR; /* save GR ptr */ - u_char sc_sel; /* selective erase state */ - u_char ufkl[8][17]; /* user fkey-labels */ - u_char sfkl[8][17]; /* system fkey-labels */ - u_char labels_on; /* display fkey labels etc. on/off */ - u_char which_fkl; /* which fkey labels are active */ - char tab_stops[MAXTAB]; /* table of active tab stops */ - u_char parmi; /* parameter index */ - u_char parms[MAXPARMS]; /* parameter array */ - u_char hp_state; /* hp escape sequence state machine */ - u_char attribute; /* attribute normal, tx only, local */ - u_char key; /* fkey label no */ - u_char l_len; /* buffer length's */ - u_char s_len; - u_char m_len; - u_char i; /* help (got short of names ...) */ - u_char l_buf[MAX_LABEL+1]; /* buffers */ - u_char s_buf[MAX_STRING+1]; - u_char m_buf[MAX_STATUS+1]; - u_char openf; /* we are opened ! */ - u_char vt_pure_mode; /* no fkey labels, row/col, status */ - u_char cursor_start; /* Start of cursor */ - u_char cursor_end; /* End of cursor */ - u_char cursor_on; /* cursor switched on */ - u_char ckm; /* true = cursor key normal mode */ - u_char irm; /* true = insert mode */ - u_char lnm; /* Line Feed/New Line Mode */ - u_char dcs_state; /* dcs escape sequence state machine */ - u_char udk_def[MAXUDKDEF]; /* new definitions for vt220 FKeys */ - u_char udk_defi; /* index for FKey definitions */ - u_char udk_deflow; /* low or high nibble in sequence */ - u_char udk_fnckey; /* function key to assign to */ - u_char dld_dscs[DSCS_LENGTH]; /* designate soft character set id */ - u_char dld_dscsi; /* index for dscs */ - u_char dld_sixel_lower; /* upper/lower sixels of character */ - u_char dld_sixelli; /* index for lower sixels */ - u_char dld_sixelui; /* index for upper sixels */ - struct sixels sixel; /* structure for storing char sixels */ - u_char selchar; /* true = selective attribute on */ - u_int decsca[MAXDECSCA]; /* Select Character Attrib bit array */ - u_short **GL; /* ptr to current GL conversion table*/ - u_short **GR; /* ptr to current GR conversion table*/ - u_short *G0; /* ptr to current G0 conversion table*/ - u_short *G1; /* ptr to current G1 conversion table*/ - u_char force24; /* force 24 lines in DEC 25 and HP 28*/ - u_short *G2; /* ptr to current G2 conversion table*/ - u_short *G3; /* ptr to current G3 conversion table*/ - u_char dld_id[DSCS_LENGTH+1]; /* soft character set id */ - u_char which[DSCS_LENGTH+1]; /* which set to designate */ - u_char whichi; /* index into which .. */ - u_char ss; /* flag, single shift G2 / G3 -> GL */ - u_short **Gs; /* ptr to cur. G2/G3 conversion table*/ - u_char udkbuf[MAXUDKDEF]; /* buffer for user defined keys */ - struct udkentry ukt; /* index & length for each udk */ - u_char udkff; /* index into buffer first free entry*/ - struct rgb palette[NVGAPEL]; /* saved VGA DAC palette */ - u_char wd132col; /* we are on a wd vga and in 132 col */ - u_char scroll_lock; /* scroll lock active */ - u_char caps_lock; /* caps lock active */ - u_char shift_lock; /* shiftlock flag (virtual ..) */ - u_char num_lock; /* num lock, true = keypad num mode */ - u_char abs_write; /* write outside of scroll region */ - -#if PCVT_USL_VT_COMPAT /* SysV compatibility :-( */ - - struct vt_mode smode; - struct proc *proc; - pid_t pid; - unsigned vt_status; -#define VT_WAIT_REL 1 /* wait till process released vt */ -#define VT_WAIT_ACK 2 /* wait till process ack vt acquire */ -#define VT_GRAFX 4 /* vt runs graphics mode */ -#define VT_WAIT_ACT 8 /* a process is sleeping on this vt */ - /* becoming active */ -#endif /* PCVT_USL_VT_COMPAT */ - -} video_state; - -EXTERN video_state vs[PCVT_NSCREENS]; /* parameters for screens */ - -struct vga_char_state { - int loaded; /* Whether a font is loaded here */ - int secondloaded; /* an extension characterset was loaded, */ - /* the number is found here */ - u_char char_scanlines; /* Scanlines per character */ - u_char scr_scanlines; /* Low byte of scanlines per screen */ - int screen_size; /* Screen size in SIZ_YYROWS */ -}; - -EXTERN struct vga_char_state vgacs[NVGAFONTS]; /* Character set states */ - -#if PCVT_EMU_MOUSE -struct mousestat { - struct timeval lastmove; /* last time the pointer moved */ - u_char opened; /* someone would like to use a mouse */ - u_char minor; /* minor device number */ - u_char buttons; /* current "buttons" pressed */ - u_char extendedseen; /* 0xe0 has been seen, do not use next key */ - u_char breakseen; /* key break has been seen for a sticky btn */ -}; -#endif /* PCVT_EMU_MOUSE */ - -#ifdef WAS_EXTERN - -#if PCVT_NETBSD > 9 - -int pcprobe (); -void pcattach (); - -struct cfdriver vtcd = { - NULL, "vt", pcprobe, pcattach, DV_TTY, sizeof(struct device) -}; - -#else - -int pcprobe ( struct isa_device *dev ); -int pcattach ( struct isa_device *dev ); - -struct isa_driver vtdriver = { /* driver routines */ - pcprobe, pcattach, "vt", 1, -}; - -#endif /* PCVT_NETBSD > 9 */ - -u_char fgansitopc[] = { /* foreground ANSI color -> pc */ - FG_BLACK, FG_RED, FG_GREEN, FG_BROWN, FG_BLUE, - FG_MAGENTA, FG_CYAN, FG_LIGHTGREY -}; - -u_char bgansitopc[] = { /* background ANSI color -> pc */ - BG_BLACK, BG_RED, BG_GREEN, BG_BROWN, BG_BLUE, - BG_MAGENTA, BG_CYAN, BG_LIGHTGREY -}; - -#if !PCVT_NETBSD -/* XXX Crtat is shared with syscons. */ -u_short *Crtat; /* screen start address */ -#if !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) -struct tty *pcconsp = &pccons[0]; /* ptr to current device */ -#else /* PCVT_FREEBSD > 110 */ -struct tty *pcconsp; -#endif /* !(PCVT_FREEBSD > 110) */ -#else -struct tty *pcconsp; /* ptr to current device, see pcattach() */ -#endif /* PCVT_NETBSD */ - -#if PCVT_EMU_MOUSE -struct mousestat mouse = {0}; -struct mousedefs mousedef = {0x3b, 0x3c, 0x3d, 0, 250000}; -#endif /* PCVT_EMU_MOUSE */ /* F1, F2, F3, false, 0.25 sec */ - -video_state *vsp = &vs[0]; /* ptr to current screen parms */ - -#if PCVT_USL_VT_COMPAT -int vt_switch_pending = 0; /* if > 0, a vt switch is */ -#endif /* PCVT_USL_VT_COMPAT */ /* pending; contains the # */ - /* of the old vt + 1 */ - -u_int addr_6845 = MONO_BASE; /* crtc base addr */ -u_char do_initialization = 1; /* we have to init ourselves */ -u_char pcvt_is_console = 0; /* until we know it */ -u_char shift_down = 0; /* shift key down flag */ -u_char ctrl_down = 0; /* ctrl key down flag */ -u_char meta_down = 0; /* alt key down flag */ -u_char altgr_down = 0; /* altgr key down flag */ -u_char kbrepflag = 1; /* key repeat flag */ -u_char totalscreens = 1; /* screens available */ -u_char current_video_screen = 0; /* displayed screen no */ -u_char adaptor_type = UNKNOWN_ADAPTOR;/* adaptor type */ -u_char vga_type = VGA_UNKNOWN; /* vga chipset */ -u_char can_do_132col = 0; /* vga chipset can 132 cols */ -u_char vga_family = 0; /* vga manufacturer */ -u_char totalfonts = 0; /* fonts available */ -u_char chargen_access = 0; /* synchronize access */ -u_char keyboard_type = KB_UNKNOWN; /* type of keyboard */ -u_char keyboard_is_initialized = 0; /* for ddb sanity */ -u_char kbd_polling = 0; /* keyboard is being polled */ -#ifdef _I386_ISA_KBDIO_H_ -u_char reset_keyboard = 0; /* OK to reset keyboard */ -KBDC kbdc = NULL; /* keyboard controller */ -#endif /* _I386_ISA_KBDIO_H_ */ - -#if PCVT_SHOWKEYS -u_char keyboard_show = 0; /* normal display */ -#endif /* PCVT_SHOWKEYS */ - -u_char cursor_pos_valid = 0; /* sput left a valid position*/ - -u_char critical_scroll = 0; /* inside scrolling up */ -int switch_page = -1; /* which page to switch to */ - -#if PCVT_SCREENSAVER -u_char reset_screen_saver = 1; /* reset the saver next time */ -u_char scrnsv_active = 0; /* active flag */ -#endif /* PCVT_SCREENSAVER */ - -#ifdef XSERVER -unsigned scrnsv_timeout = 0; /* initially off */ -#if !PCVT_USL_VT_COMPAT -u_char pcvt_xmode = 0; /* display is grafx */ -#endif /* PCVT_USL_VT_COMPAT */ -u_char pcvt_kbd_raw = 0; /* keyboard sends scans */ -#endif /* XSERVER */ - -#if PCVT_BACKUP_FONTS -u_char *saved_charsets[NVGAFONTS] = {0}; /* backup copy of fonts */ -#endif /* PCVT_BACKUP_FONTS */ - -/*--------------------------------------------------------------------------- - - VT220 attributes -> internal emulator attributes conversion tables - - be careful when designing color combinations, because on - EGA and VGA displays, bit 3 of the attribute byte is used - for characterset switching, and is no longer available for - foreground intensity (bold)! - ----------------------------------------------------------------------------*/ - -/* color displays */ - -u_char sgr_tab_color[16] = { -/*00*/ (BG_BLACK | FG_LIGHTGREY), /* normal */ -/*01*/ (BG_BLUE | FG_LIGHTGREY), /* bold */ -/*02*/ (BG_BROWN | FG_LIGHTGREY), /* underline */ -/*03*/ (BG_MAGENTA | FG_LIGHTGREY), /* bold+underline */ -/*04*/ (BG_BLACK | FG_LIGHTGREY | FG_BLINK), /* blink */ -/*05*/ (BG_BLUE | FG_LIGHTGREY | FG_BLINK), /* bold+blink */ -/*06*/ (BG_BROWN | FG_LIGHTGREY | FG_BLINK), /* underline+blink */ -/*07*/ (BG_MAGENTA | FG_LIGHTGREY | FG_BLINK), /* bold+underline+blink */ -/*08*/ (BG_LIGHTGREY | FG_BLACK), /* invers */ -/*09*/ (BG_LIGHTGREY | FG_BLUE), /* bold+invers */ -/*10*/ (BG_LIGHTGREY | FG_BROWN), /* underline+invers */ -/*11*/ (BG_LIGHTGREY | FG_MAGENTA), /* bold+underline+invers*/ -/*12*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* blink+invers */ -/*13*/ (BG_LIGHTGREY | FG_BLUE | FG_BLINK), /* bold+blink+invers */ -/*14*/ (BG_LIGHTGREY | FG_BROWN | FG_BLINK), /* underline+blink+invers*/ -/*15*/ (BG_LIGHTGREY | FG_MAGENTA | FG_BLINK) /*bold+underl+blink+invers*/ -}; - -/* monochrome displays (VGA version, no intensity) */ - -u_char sgr_tab_mono[16] = { -/*00*/ (BG_BLACK | FG_LIGHTGREY), /* normal */ -/*01*/ (BG_BLACK | FG_UNDERLINE), /* bold */ -/*02*/ (BG_BLACK | FG_UNDERLINE), /* underline */ -/*03*/ (BG_BLACK | FG_UNDERLINE), /* bold+underline */ -/*04*/ (BG_BLACK | FG_LIGHTGREY | FG_BLINK), /* blink */ -/*05*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK), /* bold+blink */ -/*06*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK), /* underline+blink */ -/*07*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK), /* bold+underline+blink */ -/*08*/ (BG_LIGHTGREY | FG_BLACK), /* invers */ -/*09*/ (BG_LIGHTGREY | FG_BLACK), /* bold+invers */ -/*10*/ (BG_LIGHTGREY | FG_BLACK), /* underline+invers */ -/*11*/ (BG_LIGHTGREY | FG_BLACK), /* bold+underline+invers*/ -/*12*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* blink+invers */ -/*13*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* bold+blink+invers */ -/*14*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* underline+blink+invers*/ -/*15*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK) /*bold+underl+blink+invers*/ -}; - -/* monochrome displays (MDA version, with intensity) */ - -u_char sgr_tab_imono[16] = { -/*00*/ (BG_BLACK | FG_LIGHTGREY), /* normal */ -/*01*/ (BG_BLACK | FG_LIGHTGREY | FG_INTENSE), /* bold */ -/*02*/ (BG_BLACK | FG_UNDERLINE), /* underline */ -/*03*/ (BG_BLACK | FG_UNDERLINE | FG_INTENSE), /* bold+underline */ -/*04*/ (BG_BLACK | FG_LIGHTGREY | FG_BLINK), /* blink */ -/*05*/ (BG_BLACK | FG_LIGHTGREY | FG_INTENSE | FG_BLINK), /* bold+blink */ -/*06*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK), /* underline+blink */ -/*07*/ (BG_BLACK | FG_UNDERLINE | FG_BLINK | FG_INTENSE), /* bold+underline+blink */ -/*08*/ (BG_LIGHTGREY | FG_BLACK), /* invers */ -/*09*/ (BG_LIGHTGREY | FG_BLACK | FG_INTENSE), /* bold+invers */ -/*10*/ (BG_LIGHTGREY | FG_BLACK), /* underline+invers */ -/*11*/ (BG_LIGHTGREY | FG_BLACK | FG_INTENSE), /* bold+underline+invers*/ -/*12*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* blink+invers */ -/*13*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK | FG_INTENSE),/* bold+blink+invers*/ -/*14*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK), /* underline+blink+invers*/ -/*15*/ (BG_LIGHTGREY | FG_BLACK | FG_BLINK | FG_INTENSE) /* bold+underl+blink+invers */ -}; - -#else /* WAS_EXTERN */ - -extern u_char vga_type; -extern struct tty *pcconsp; -extern video_state *vsp; - -#if PCVT_EMU_MOUSE -extern struct mousestat mouse; -extern struct mousedefs mousedef; -#endif /* PCVT_EMU_MOUSE */ - -#if PCVT_USL_VT_COMPAT -extern int vt_switch_pending; -#endif /* PCVT_USL_VT_COMPAT */ - -extern u_int addr_6845; -extern u_short *Crtat; -extern u_char do_initialization; -extern u_char pcvt_is_console; -extern u_char bgansitopc[]; -extern u_char fgansitopc[]; -extern u_char shift_down; -extern u_char ctrl_down; -extern u_char meta_down; -extern u_char altgr_down; -extern u_char kbrepflag; -extern u_char adaptor_type; -extern u_char current_video_screen; -extern u_char totalfonts; -extern u_char totalscreens; -extern u_char chargen_access; -extern u_char keyboard_type; -extern u_char can_do_132col; -extern u_char vga_family; -extern u_char keyboard_is_initialized; -extern u_char kbd_polling; -#ifdef _I386_ISA_KBDIO_H_ -extern u_char reset_keyboard; -extern KBDC kbdc; -#endif /* _I386_ISA_KBDIO_H_ */ - -#if PCVT_SHOWKEYS -extern u_char keyboard_show; -#endif /* PCVT_SHOWKEYS */ - -extern u_char cursor_pos_valid; - -extern u_char critical_scroll; -extern int switch_page; - -#if PCVT_SCREENSAVER -extern u_char reset_screen_saver; -extern u_char scrnsv_active; -#endif /* PCVT_SCREENSAVER */ - -extern u_char sgr_tab_color[]; -extern u_char sgr_tab_mono[]; -extern u_char sgr_tab_imono[]; - -#ifdef XSERVER -extern unsigned scrnsv_timeout; -extern u_char pcvt_xmode; -extern u_char pcvt_kbd_raw; -#endif /* XSERVER */ - -#if PCVT_BACKUP_FONTS -extern u_char *saved_charsets[NVGAFONTS]; -#endif /* PCVT_BACKUP_FONTS */ - -#endif /* WAS_EXTERN */ - -/* - * FreeBSD > 1.0.2 cleaned up the kernel definitions (with the aim of - * getting ANSI-clean). Since there has been a mixed usage of types like - * "dev_t" (actually some short) in prototyped and non-prototyped fasion, - * each of those types is declared as "int" within function prototypes - * (which is what the compiler would actually promote it to). - * - * The macros below are used to clarify which type a parameter ought to - * be, regardless of its actual promotion to "int". - */ - -#define Dev_t int -#define U_short int -#define U_char int - -/* - * In FreeBSD >= 2.0, dev_t has type `unsigned long', so promoting it - * doesn't cause any problems in prototypes. - */ - -#if PCVT_FREEBSD >= 200 -#undef Dev_t -#define Dev_t dev_t -#endif - -#if !PCVT_FREEBSD || (PCVT_FREEBSD < 210) -extern void bcopyb(void *from, void *to, u_int length); -#endif - -#if !PCVT_FREEBSD || (PCVT_FREEBSD < 200) -extern void fillw(U_short value, void *addr, u_int length); -#endif - -int pcparam ( struct tty *tp, struct termios *t ); - -/* - * In FreeBSD > 2.0.6, driver console functions are declared in machine/cons.h - * and some return void, so don't declare them here. - */ -#if PCVT_FREEBSD <= 205 -int pccnprobe ( struct consdev *cp ); -int pccninit ( struct consdev *cp ); -int pccngetc ( Dev_t dev ); -int pccncheckc ( Dev_t dev ); -int pccnputc ( Dev_t dev, U_char c ); -#endif - -ointhand2_t pcrint; -void pcstart ( struct tty *tp ); -void pcstop ( struct tty *tp, int flag ); - -# if PCVT_FREEBSD < 200 -void consinit ( void ); -# endif - -#if PCVT_USL_VT_COMPAT -void switch_screen ( int n, int oldgrafx, int newgrafx ); -int usl_vt_ioctl (Dev_t dev, int cmd, caddr_t data, int flag, - struct proc *); -int vt_activate ( int newscreen ); -int vgapage ( int n ); -void get_usl_keymap( keymap_t *map ); -void reset_usl_modes (struct video_state *vsx); -#else -void vgapage ( int n ); -#endif /* PCVT_USL_VT_COMPAT */ - -#if PCVT_EMU_MOUSE -int mouse_ioctl ( Dev_t dev, int cmd, caddr_t data ); -#endif /* PCVT_EMU_MOUSE */ - -#if PCVT_SCREENSAVER -void pcvt_scrnsv_reset ( void ); -#endif /* PCVT_SCREENSAVER */ - -#if PCVT_SCREENSAVER && defined(XSERVER) -void pcvt_set_scrnsv_tmo ( int ); -#endif /* PCVT_SCREENSAVER && defined(XSERVER) */ - -void vga_move_charset ( unsigned n, unsigned char *b, int save_it); - -void async_update ( void *arg ); -void clr_parms ( struct video_state *svsp ); -void cons_highlight ( void ); -void cons_normal ( void ); -void dprintf ( unsigned flgs, const char *fmt, ... ); -int egavga_test ( void ); -void fkl_off ( struct video_state *svsp ); -void fkl_on ( struct video_state *svsp ); -struct tty *get_pccons ( Dev_t dev ); -void init_sfkl ( struct video_state *svsp ); -void init_ufkl ( struct video_state *svsp ); -#ifndef _I386_ISA_KBDIO_H_ -int kbd_cmd ( int val ); -int kbd_response ( void ); -#endif /* _I386_ISA_KBDIO_H_ */ -void kbd_code_init ( void ); -void kbd_code_init1 ( void ); - -#if PCVT_SCANSET > 1 -void kbd_emulate_pc(int do_emulation); -#endif - -int kbdioctl ( Dev_t dev, int cmd, caddr_t data, int flag ); -void loadchar ( int fontset, int character, int char_scanlines, - u_char *char_table ); -void mda2egaorvga ( void ); -void roll_up ( struct video_state *svsp, int n ); -void select_vga_charset ( int vga_charset ); -void set_2ndcharset ( void ); -void set_charset ( struct video_state *svsp, int curvgacs ); -void set_emulation_mode ( struct video_state *svsp, int mode ); -void set_screen_size ( struct video_state *svsp, int size ); -u_char *sgetc ( int noblock ); -void sixel_vga ( struct sixels *charsixel, u_char *charvga ); -void sput ( u_char *s, U_char attrib, int len, int page ); -void sw_cursor ( int onoff ); -void sw_sfkl ( struct video_state *svsp ); -void sw_ufkl ( struct video_state *svsp ); -void swritefkl ( int num, u_char *string, struct video_state *svsp ); -void toggl_awm ( struct video_state *svsp ); -void toggl_bell ( struct video_state *svsp ); -void toggl_columns ( struct video_state *svsp ); -void toggl_dspf ( struct video_state *svsp ); -void toggl_sevenbit ( struct video_state *svsp ); -void update_hp ( struct video_state *svsp ); -void update_led ( void ); -void vga10_vga10 ( u_char *invga, u_char *outvga ); -void vga10_vga14 ( u_char *invga, u_char *outvga ); -void vga10_vga16 ( u_char *invga, u_char *outvga ); -void vga10_vga8 ( u_char *invga, u_char *outvga ); -u_char vga_chipset ( void ); -int vga_col ( struct video_state *svsp, int cols ); -void vga_screen_off ( void ); -void vga_screen_on ( void ); -char *vga_string ( int number ); -int vga_test ( void ); -int vgaioctl ( Dev_t dev, int cmd, caddr_t data, int flag ); -void vgapaletteio ( unsigned idx, struct rgb *val, int writeit ); -void vt_aln ( struct video_state *svsp ); -void vt_clearudk ( struct video_state *svsp ); -void vt_clreol ( struct video_state *svsp ); -void vt_clreos ( struct video_state *svsp ); -void vt_clrtab ( struct video_state *svsp ); -int vt_col ( struct video_state *svsp, int cols ); -void vt_coldmalloc ( void ); -void vt_cub ( struct video_state *svsp ); -void vt_cud ( struct video_state *svsp ); -void vt_cuf ( struct video_state *svsp ); -void vt_curadr ( struct video_state *svsp ); -void vt_cuu ( struct video_state *svsp ); -void vt_da ( struct video_state *svsp ); -void vt_dch ( struct video_state *svsp ); -void vt_dcsentry ( U_char ch, struct video_state *svsp ); -void vt_designate ( struct video_state *svsp); -void vt_dl ( struct video_state *svsp ); -void vt_dld ( struct video_state *svsp ); -void vt_dsr ( struct video_state *svsp ); -void vt_ech ( struct video_state *svsp ); -void vt_ic ( struct video_state *svsp ); -void vt_il ( struct video_state *svsp ); -void vt_ind ( struct video_state *svsp ); -void vt_initsel ( struct video_state *svsp ); -void vt_keyappl ( struct video_state *svsp ); -void vt_keynum ( struct video_state *svsp ); -void vt_mc ( struct video_state *svsp ); -void vt_nel ( struct video_state *svsp ); -void vt_rc ( struct video_state *svsp ); -void vt_reqtparm ( struct video_state *svsp ); -void vt_reset_ansi ( struct video_state *svsp ); -void vt_reset_dec_priv_qm ( struct video_state *svsp ); -void vt_ri ( struct video_state *svsp ); -void vt_ris ( struct video_state *svsp ); -void vt_sc ( struct video_state *svsp ); -void vt_sca ( struct video_state *svsp ); -void vt_sd ( struct video_state *svsp ); -void vt_sed ( struct video_state *svsp ); -void vt_sel ( struct video_state *svsp ); -void vt_set_ansi ( struct video_state *svsp ); -void vt_set_dec_priv_qm ( struct video_state *svsp ); -void vt_sgr ( struct video_state *svsp ); -void vt_stbm ( struct video_state *svsp ); -void vt_str ( struct video_state *svsp ); -void vt_su ( struct video_state *svsp ); -void vt_tst ( struct video_state *svsp ); -void vt_udk ( struct video_state *svsp ); -void toggl_24l ( struct video_state *svsp ); - -#ifdef PCVT_INCLUDE_VT_SELATTR - -#define INT_BITS (sizeof(unsigned int) * 8) -#define INT_INDEX(n) ((n) / INT_BITS) -#define BIT_INDEX(n) ((n) % INT_BITS) - -/*---------------------------------------------------------------------------* - * set selective attribute if appropriate - *---------------------------------------------------------------------------*/ -static __inline void vt_selattr(struct video_state *svsp) -{ - int i; - - i = (svsp->Crtat + svsp->cur_offset) - svsp->Crtat; - - if(svsp->selchar) - svsp->decsca[INT_INDEX(i)] |= (1 << BIT_INDEX(i)); - else - svsp->decsca[INT_INDEX(i)] &= ~(1 << BIT_INDEX(i)); -} - -#endif /* PCVT_INCLUDE_VT_SELATTR */ - - -/*---------------------------------------------------------------------------* - * produce 7 us delay accessing the keyboard controller - *---------------------------------------------------------------------------*/ - -#if PCVT_PORTIO_DELAY - /* use multiple dummy accesses to port */ - /* 0x84 to produce keyboard controller */ - /* access delays */ -#define PCVT_KBD_DELAY() \ - { (void)inb(0x84); } \ - { (void)inb(0x84); } \ - { (void)inb(0x84); } \ - { (void)inb(0x84); } \ - { (void)inb(0x84); } \ - { (void)inb(0x84); } - -#else /* PCVT_PORTIO_DELAY */ - /* use system supplied delay function for */ - /* producing delays for accesssing the */ - /* keyboard controller */ -#if PCVT_NETBSD > 9 -#define PCVT_KBD_DELAY() delay(7) -#elif PCVT_FREEBSD || (PCVT_NETBSD <= 9) -#define PCVT_KBD_DELAY() DELAY(7) -#endif -#endif /* PCVT_PORTIO_DELAY */ - -/*---------------------------------- E O F ----------------------------------*/ diff --git a/sys/i386/isa/pcvt/pcvt_kbd.c b/sys/i386/isa/pcvt/pcvt_kbd.c deleted file mode 100644 index 2113ee0..0000000 --- a/sys/i386/isa/pcvt/pcvt_kbd.c +++ /dev/null @@ -1,3321 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. - * - * Copyright (c) 1992, 1993 Brian Dunford-Shore and Holger Veit. - * - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz and Don Ahn. - * - * This code is derived from software contributed to 386BSD by - * Holger Veit. - * - * 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_kbd.c, 3.20, Last Edit-Date: [Sun Apr 2 18:59:04 1995] - * - */ - -/*---------------------------------------------------------------------------* - * - * pcvt_kbd.c VT220 Driver Keyboard Interface Code - * ---------------------------------------------------- - * -hm ------------ Release 3.00 -------------- - * -hm integrating NetBSD-current patches - * -jw introduced kbd_emulate_pc() if scanset > 1 - * -hm patch from joerg for timeout in kbd_emulate_pc() - * -hm starting to implement alt-shift/ctrl key mappings - * -hm Gateway 2000 Keyboard fix from Brian Moore - * -hm some #if adjusting for NetBSD 0.9 - * -hm split off pcvt_kbd.h - * -hm applying Joerg's patches for FreeBSD 2.0 - * -hm patch from Martin, PCVT_NO_LED_UPDATE - * -hm PCVT_VT220KEYB patches from Lon Willet - * -hm PR #399, patch from Bill Sommerfeld: Return with PCVT_META_ESC - * -hm allow keyboard-less kernel boot for serial consoles and such .. - * -hm patch from Lon Willett for led-update and showkey() - * -hm patch from Lon Willett to fix mapping of Control-R scancode - * -hm delay patch from Martin Husemann after port-i386 ml-discussion - * -hm added PCVT_NONRESP_KEYB_TRY definition to doreset() - * - *---------------------------------------------------------------------------*/ - -#include "vt.h" -#include "opt_ddb.h" - -#if NVT > 0 - -#include <i386/isa/pcvt/pcvt_hdr.h> /* global include */ - -#define LEDSTATE_UPDATE_PENDING (1 << 3) - -static void fkey1(void), fkey2(void), fkey3(void), fkey4(void); -static void fkey5(void), fkey6(void), fkey7(void), fkey8(void); -static void fkey9(void), fkey10(void), fkey11(void), fkey12(void); - -static void sfkey1(void), sfkey2(void), sfkey3(void), sfkey4(void); -static void sfkey5(void), sfkey6(void), sfkey7(void), sfkey8(void); -static void sfkey9(void), sfkey10(void), sfkey11(void), sfkey12(void); - -static void cfkey1(void), cfkey2(void), cfkey3(void), cfkey4(void); -static void cfkey5(void), cfkey6(void), cfkey7(void), cfkey8(void); -static void cfkey9(void), cfkey10(void), cfkey11(void), cfkey12(void); - -static void doreset ( void ); -static void ovlinit ( int force ); -static void settpmrate ( int rate ); -static void setlockkeys ( int snc ); -#ifndef _I386_ISA_KBDIO_H_ -static int kbc_8042cmd ( int val ); -#else -static int set_keyboard_param( int command, int data ); -#endif /* !_I386_ISA_KBDIO_H_ */ -static int getokeydef ( unsigned key, struct kbd_ovlkey *thisdef ); -static int getckeydef ( unsigned key, struct kbd_ovlkey *thisdef ); -static int rmkeydef ( int key ); -static int setkeydef ( struct kbd_ovlkey *data ); -static u_char * xlatkey2ascii( U_short key ); - -static int ledstate = LEDSTATE_UPDATE_PENDING; /* keyboard led's */ -static int tpmrate = KBD_TPD500|KBD_TPM100; -static u_char altkpflag = 0; -static u_short altkpval = 0; - -#if PCVT_SHOWKEYS -u_char rawkeybuf[80]; -#endif - -#include <i386/isa/pcvt/pcvt_kbd.h> /* tables etc */ - -#if PCVT_SHOWKEYS -/*---------------------------------------------------------------------------* - * keyboard debugging: put kbd communication char into some buffer - *---------------------------------------------------------------------------*/ -static void showkey (char delim, u_char val) -{ - int rki; - - for(rki = 3; rki < 80; rki++) /* shift left buffer */ - rawkeybuf[rki-3] = rawkeybuf[rki]; - - rawkeybuf[77] = delim; /* delimiter */ - - rki = (val & 0xf0) >> 4; /* ms nibble */ - - if(rki <= 9) - rki = rki + '0'; - else - rki = rki - 10 + 'A'; - - rawkeybuf[78] = rki; - - rki = val & 0x0f; /* ls nibble */ - - if(rki <= 9) - rki = rki + '0'; - else - rki = rki - 10 + 'A'; - - rawkeybuf[79] = rki; -} -#endif /* PCVT_SHOWKEYS */ - -/*---------------------------------------------------------------------------* - * function to switch to another virtual screen - *---------------------------------------------------------------------------*/ -static void -do_vgapage(int page) -{ - if(critical_scroll) /* executing critical region ? */ - switch_page = page; /* yes, auto switch later */ - else - vgapage(page); /* no, switch now */ -} - - -/* - * This code from Lon Willett enclosed in #if PCVT_UPDLED_LOSES_INTR is - * abled because it crashes FreeBSD 1.1.5.1 at boot time. - * The cause is obviously that the timeout queue is not yet initialized - * timeout is called from here the first time. - * Anyway it is a pointer in the right direction so it is included for - * reference here. - */ - -#define PCVT_UPDLED_LOSES_INTR 0 /* disabled for now */ - -#if PCVT_UPDLED_LOSES_INTR || defined(_I386_ISA_KBDIO_H_) - -/*---------------------------------------------------------------------------* - * check for lost keyboard interrupts - *---------------------------------------------------------------------------*/ - -/* - * The two commands to change the LEDs generate two KEYB_R_ACK responses - * from the keyboard, which aren't explicitly checked for (maybe they - * should be?). However, when a lot of other I/O is happening, one of - * the interrupts sometimes gets lost (I'm not sure of the details of - * how and why and what hardware this happens with). - * - * This may have had something to do with spltty() previously not being - * called before the kbd_cmd() calls in update_led(). - * - * This is a real problem, because normally the keyboard is only polled - * by pcrint(), and no more interrupts will be generated until the ACK - * has been read. So the keyboard is hung. This code polls a little - * while after changing the LEDs to make sure that this hasn't happened. - * - * XXX Quite possibly we should poll the kbd on a regular basis anyway, - * in the interest of robustness. It may be possible that interrupts - * get lost other times as well. - */ - -static int lost_intr_timeout_queued = 0; -static struct callout_handle lost_intr_ch = - CALLOUT_HANDLE_INITIALIZER(&lost_intr_ch); - -static void -check_for_lost_intr (void *arg) -{ -#ifndef _I386_ISA_KBDIO_H_ - lost_intr_timeout_queued = 0; - if (inb(CONTROLLER_CTRL) & STATUS_OUTPBF) - { - int opri = spltty (); - pcrint (); - splx (opri); - } -#else - int opri; - - lost_intr_timeout_queued = 0; - if (kbdc_lock(kbdc, TRUE)) { - opri = spltty (); - kbdc_lock(kbdc, FALSE); - if (kbdc_data_ready(kbdc)) - pcrint (0); - splx (opri); - } - lost_intr_ch = timeout(check_for_lost_intr, (void *)NULL, hz); - lost_intr_timeout_queued = 1; -#endif /* !_I386_ISA_KBDIO_H_ */ -} - -#endif /* PCVT_UPDLED_LOSES_INTR || defined(_I386_ISA_KBDIO_H_) */ - -/*---------------------------------------------------------------------------* - * update keyboard led's - *---------------------------------------------------------------------------*/ -void -update_led(void) -{ -#if !PCVT_NO_LED_UPDATE - - /* Don't update LED's unless necessary. */ - - int opri, new_ledstate; - - opri = spltty(); - new_ledstate = (vsp->scroll_lock) | - (vsp->num_lock * 2) | - (vsp->caps_lock * 4); - - if (new_ledstate != ledstate) - { -#ifndef _I386_ISA_KBDIO_H_ - int response1, response2; - - ledstate = LEDSTATE_UPDATE_PENDING; - - if(kbd_cmd(KEYB_C_LEDS) != 0) - { - printf("Keyboard LED command timeout\n"); - splx(opri); - return; - } - - /* - * For some keyboards or keyboard controllers, it is an - * error to issue a command without waiting long enough - * for an ACK for the previous command. The keyboard - * gets confused, and responds with KEYB_R_RESEND, but - * we ignore that. Wait for the ACK here. The busy - * waiting doesn't matter much, since we lose anyway by - * busy waiting to send the command. - * - * XXX actually wait for any response, since we can't - * handle normal scancodes here. - * - * XXX all this should be interrupt driven. Issue only - * one command at a time wait for a ACK before proceeding. - * Retry after a timeout or on receipt of a KEYB_R_RESEND. - * KEYB_R_RESENDs seem to be guaranteed by working - * keyboard controllers with broken (or disconnected) - * keyboards. There is another code for keyboard - * reconnects. The keyboard hardware is very simple and - * well designed :-). - */ - response1 = kbd_response(); - - if(kbd_cmd(new_ledstate) != 0) { - printf("Keyboard LED data timeout\n"); - splx(opri); - return; - } - response2 = kbd_response(); - - if (response1 == KEYB_R_ACK && response2 == KEYB_R_ACK) - ledstate = new_ledstate; - else - printf( - "Keyboard LED command not ACKed (responses %#x %#x)\n", - response1, response2); -#else /* _I386_ISA_KBDIO_H_ */ - - if (kbdc == NULL) { - ledstate = new_ledstate; - splx(opri); - } else { - ledstate = LEDSTATE_UPDATE_PENDING; - splx(opri); - if (set_keyboard_param(KBDC_SET_LEDS, new_ledstate) == 0) - ledstate = new_ledstate; - } - -#endif /* !_I386_ISA_KBDIO_H_ */ - -#if PCVT_UPDLED_LOSES_INTR - if (lost_intr_timeout_queued) - untimeout(check_for_lost_intr, NULL, lost_intr_ch); - - lost_intr_ch = timeout(check_for_lost_intr, NULL, hz); - lost_intr_timeout_queued = 1; -#endif /* PCVT_UPDLED_LOSES_INTR */ - - } - -#ifndef _I386_ISA_KBDIO_H_ - splx(opri); -#endif - -#endif /* !PCVT_NO_LED_UPDATE */ -} - -/*---------------------------------------------------------------------------* - * set typematic rate - *---------------------------------------------------------------------------*/ -static void -settpmrate(int rate) -{ -#ifndef _I386_ISA_KBDIO_H_ - tpmrate = rate & 0x7f; - if(kbd_cmd(KEYB_C_TYPEM) != 0) - printf("Keyboard TYPEMATIC command timeout\n"); - else if(kbd_cmd(tpmrate) != 0) - printf("Keyboard TYPEMATIC data timeout\n"); -#else - tpmrate = rate & 0x7f; - if (set_keyboard_param(KBDC_SET_TYPEMATIC, tpmrate) != 0) - printf("pcvt: failed to set keyboard TYPEMATIC.\n"); -#endif /* !_I386_ISA_KBDIO_H_ */ -} - -#ifndef _I386_ISA_KBDIO_H_ -/*---------------------------------------------------------------------------* - * Pass command to keyboard controller (8042) - *---------------------------------------------------------------------------*/ -static int -kbc_8042cmd(int val) -{ - unsigned timeo; - - timeo = 100000; /* > 100 msec */ - while (inb(CONTROLLER_CTRL) & STATUS_INPBF) - if (--timeo == 0) - return (-1); - outb(CONTROLLER_CTRL, val); - return (0); -} - -/*---------------------------------------------------------------------------* - * Pass command to keyboard itself - *---------------------------------------------------------------------------*/ -int -kbd_cmd(int val) -{ - unsigned timeo; - - timeo = 100000; /* > 100 msec */ - while (inb(CONTROLLER_CTRL) & STATUS_INPBF) - if (--timeo == 0) - return (-1); - outb(CONTROLLER_DATA, val); - -#if PCVT_SHOWKEYS - showkey ('>', val); -#endif /* PCVT_SHOWKEYS */ - - return (0); -} - -/*---------------------------------------------------------------------------* - * Read response from keyboard - * NB: make sure to call spltty() before kbd_cmd(), kbd_response(). - *---------------------------------------------------------------------------*/ -int -kbd_response(void) -{ - u_char ch; - unsigned timeo; - - timeo = 500000; /* > 500 msec (KEYB_R_SELFOK requires 87) */ - while (!(inb(CONTROLLER_CTRL) & STATUS_OUTPBF)) - if (--timeo == 0) - return (-1); - - PCVT_KBD_DELAY(); /* 7 us delay */ - ch = inb(CONTROLLER_DATA); - -#if PCVT_SHOWKEYS - showkey ('<', ch); -#endif /* PCVT_SHOWKEYS */ - - return ch; -} -#else -static int -set_keyboard_param(int command, int data) -{ - int s; -#if 0 - int c; -#endif - - if (kbdc == NULL) - return 1; - - /* prevent the timeout routine from polling the keyboard */ - if (!kbdc_lock(kbdc, TRUE)) - return 1; - - /* disable the keyboard and mouse interrupt */ - s = spltty(); -#if 0 - c = get_controller_command_byte(kbdc); - if ((c == -1) - || !set_controller_command_byte(kbdc, - kbdc_get_device_mask(kbdc), - KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT - | KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { - /* CONTROLLER ERROR */ - kbdc_lock(kbdc, FALSE); - splx(s); - return 1; - } - /* - * Now that the keyboard controller is told not to generate - * the keyboard and mouse interrupts, call `splx()' to allow - * the other tty interrupts. The clock interrupt may also occur, - * but the timeout routine (`scrn_timer()') will be blocked - * by the lock flag set via `kbdc_lock()' - */ - splx(s); -#endif - - if (send_kbd_command_and_data(kbdc, command, data) != KBD_ACK) - send_kbd_command(kbdc, KBDC_ENABLE_KBD); - -#if 0 - /* restore the interrupts */ - if (!set_controller_command_byte(kbdc, - kbdc_get_device_mask(kbdc), - c & (KBD_KBD_CONTROL_BITS | KBD_AUX_CONTROL_BITS))) { - /* CONTROLLER ERROR */ - } -#else - splx(s); -#endif - kbdc_lock(kbdc, FALSE); - - return 0; -} -#endif /* !_I386_ISA_KBDIO_H_ */ - -#if PCVT_SCANSET > 1 -/*---------------------------------------------------------------------------* - * switch PC scan code emulation mode - *---------------------------------------------------------------------------*/ -void -kbd_emulate_pc(int do_emulation) -{ -#ifndef _I386_ISA_KBDIO_H_ - int cmd, timeo = 10000; - - cmd = COMMAND_SYSFLG|COMMAND_IRQEN; /* common base cmd */ - -#if !PCVT_USEKBDSEC - cmd |= COMMAND_INHOVR; -#endif - - if(do_emulation) - cmd |= COMMAND_PCSCAN; - - kbc_8042cmd(CONTR_WRITE); - while (inb(CONTROLLER_CTRL) & STATUS_INPBF) - if (--timeo == 0) - break; - outb(CONTROLLER_DATA, cmd); -#else - set_controller_command_byte(kbdc, KBD_TRANSLATION, - (do_emulation) ? KBD_TRANSLATION : 0); -#endif /* !_I386_ISA_KBDIO_H_ */ -} - -#endif /* PCVT_SCANSET > 1 */ - - -#ifndef PCVT_NONRESP_KEYB_TRY -#define PCVT_NONRESP_KEYB_TRY 25 /* no of times to try to detect */ -#endif /* a nonresponding keyboard */ - -/*---------------------------------------------------------------------------* - * try to force keyboard into a known state .. - *---------------------------------------------------------------------------*/ -static -void doreset(void) -{ -#ifndef _I386_ISA_KBDIO_H_ - int again = 0; - int once = 0; - int response, opri; - - /* Enable interrupts and keyboard, etc. */ - if (kbc_8042cmd(CONTR_WRITE) != 0) - printf("pcvt: doreset() - timeout controller write command\n"); - -#if PCVT_USEKBDSEC /* security enabled */ - -# if PCVT_SCANSET == 2 -# define KBDINITCMD COMMAND_SYSFLG|COMMAND_IRQEN -# else /* PCVT_SCANSET != 2 */ -# define KBDINITCMD COMMAND_PCSCAN|COMMAND_SYSFLG|COMMAND_IRQEN -# endif /* PCVT_SCANSET == 2 */ - -#else /* ! PCVT_USEKBDSEC */ /* security disabled */ - -# if PCVT_SCANSET == 2 -# define KBDINITCMD COMMAND_INHOVR|COMMAND_SYSFLG|COMMAND_IRQEN -# else /* PCVT_SCANSET != 2 */ -# define KBDINITCMD COMMAND_PCSCAN|COMMAND_INHOVR|COMMAND_SYSFLG\ - |COMMAND_IRQEN -# endif /* PCVT_SCANSET == 2 */ - -#endif /* PCVT_USEKBDSEC */ - - if (kbd_cmd(KBDINITCMD) != 0) - printf("pcvt: doreset() - timeout writing keyboard init command\n"); - - /* - * Discard any stale keyboard activity. The 0.1 boot code isn't - * very careful and sometimes leaves a KEYB_R_RESEND. Versions - * between 1992 and Oct 1996 didn't have the delay and sometimes - * left a KEYB_R_RESEND. - */ - while (1) { - if (inb(CONTROLLER_CTRL) & STATUS_OUTPBF) - kbd_response(); - else { - DELAY(10000); - if (!(inb(CONTROLLER_CTRL) & STATUS_OUTPBF)) - break; - } - } - - /* Start keyboard reset */ - - opri = spltty (); - - if (kbd_cmd(KEYB_C_RESET) != 0) - { - printf("pcvt: doreset() - timeout for keyboard reset command\n"); - outb(CONTROLLER_DATA, KEYB_C_RESET); /* force */ - } - - /* Wait for the first response to reset and handle retries */ - while ((response = kbd_response()) != KEYB_R_ACK) - { - if (response < 0) - { - if(!again) /* print message only once ! */ - printf("pcvt: doreset() - response != ack and response < 0 [one time only msg]\n"); - response = KEYB_R_RESEND; - } - else if (response == KEYB_R_RESEND) - { - if(!again) /* print message only once ! */ - printf("pcvt: doreset() - got KEYB_R_RESEND response ... [one time only msg]\n"); - } - if (response == KEYB_R_RESEND) - { - if(++again > PCVT_NONRESP_KEYB_TRY) - { - printf("pcvt: doreset() - Caution - no PC keyboard detected!\n"); - keyboard_type = KB_UNKNOWN; - splx(opri); - return; - } - - if((kbd_cmd(KEYB_C_RESET) != 0) && (once == 0)) - { - once++; /* print message only once ! */ - printf("pcvt: doreset() - timeout for loop keyboard reset command [one time only msg]\n"); - outb(CONTROLLER_DATA, KEYB_C_RESET); /* force */ - } - } - } - - /* Wait for the second response to reset */ - - while ((response = kbd_response()) != KEYB_R_SELFOK) - { - if (response < 0) - { - printf("pcvt: doreset() - response != OK and resonse < 0\n"); - /* - * If KEYB_R_SELFOK never arrives, the loop will - * finish here unless the keyboard babbles or - * STATUS_OUTPBF gets stuck. - */ - break; - } - } - - splx (opri); - -#if PCVT_KEYBDID - - opri = spltty (); - - if(kbd_cmd(KEYB_C_ID) != 0) - { - printf("pcvt: doreset() - timeout for keyboard ID command\n"); - keyboard_type = KB_UNKNOWN; - } - else - { - -r_entry: - - if((response = kbd_response()) == KEYB_R_MF2ID1) - { - if((response = kbd_response()) == KEYB_R_MF2ID2) - { - keyboard_type = KB_MFII; - } - else if(response == KEYB_R_MF2ID2HP) - { - keyboard_type = KB_MFII; - } - else - { - printf("\npcvt: doreset() - kbdid, response 2 = [%d]\n", - response); - keyboard_type = KB_UNKNOWN; - } - } - else if (response == KEYB_R_ACK) - { - goto r_entry; - } - else if (response == -1) - { - keyboard_type = KB_AT; - } - else - { - printf("\npcvt: doreset() - kbdid, response 1 = [%d]\n", response); - } - } - - splx (opri); - -#else /* PCVT_KEYBDID */ - - keyboard_type = KB_MFII; /* force it .. */ - -#endif /* PCVT_KEYBDID */ - -#else /* _I386_ISA_KBDIO_H_ */ - int c; - int m; - int s; - - if (!reset_keyboard) /* no, we are not ready to reset */ - return; - - if (lost_intr_timeout_queued) { - untimeout(check_for_lost_intr, (void *)NULL, lost_intr_ch); - lost_intr_timeout_queued = 0; - } - - if (kbdc == NULL) - kbdc = kbdc_open(IO_KBD); - - if (!kbdc_lock(kbdc, TRUE)) /* strange, somebody got there first */ - return; - - /* remove any noise */ - empty_both_buffers(kbdc, 10); - - s = spltty(); - - /* save the current controller command byte */ - m = kbdc_get_device_mask(kbdc) & ~KBD_KBD_CONTROL_BITS; - c = get_controller_command_byte(kbdc); - if (c == -1) { - /* CONTROLLER ERROR */ - kbdc_set_device_mask(kbdc, m); - kbdc_lock(kbdc, FALSE); - kbdc = NULL; - splx(s); - printf("pcvt: unable to get the command byte.\n"); - return; - } - -#if PCVT_USEKBDSEC /* security enabled */ - -# if PCVT_SCANSET == 2 -# define KBDINITCMD 0 -# else /* PCVT_SCANSET != 2 */ -# define KBDINITCMD KBD_TRANSLATION -# endif /* PCVT_SCANSET == 2 */ - -#else /* ! PCVT_USEKBDSEC */ /* security disabled */ - -# if PCVT_SCANSET == 2 -# define KBDINITCMD KBD_OVERRIDE_KBD_LOCK -# else /* PCVT_SCANSET != 2 */ -# define KBDINITCMD KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK -# endif /* PCVT_SCANSET == 2 */ - -#endif /* PCVT_USEKBDSEC */ - - /* disable the keyboard interrupt and the aux port and interrupt */ - if (!set_controller_command_byte(kbdc, - KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK, - KBD_ENABLE_KBD_PORT | KBD_DISABLE_KBD_INT | KBDINITCMD)) { - /* CONTROLLER ERROR: there is very little we can do... */ - kbdc_set_device_mask(kbdc, m); - kbdc_lock(kbdc, FALSE); - kbdc = NULL; - splx(s); - printf("pcvt: unable to set the command byte.\n"); - return; - } - splx(s); - - /* reset keyboard hardware */ - ledstate = LEDSTATE_UPDATE_PENDING; - if (!reset_kbd(kbdc)) { - /* KEYBOARD ERROR */ - empty_both_buffers(kbdc, 10); - test_controller(kbdc); - test_kbd_port(kbdc); - /* - * We could disable the keyboard port and interrupt now... - * but, the keyboard may still exist. - */ - printf("pcvt: failed to reset the keyboard.\n"); - /* try to restore the original command byte */ - set_controller_command_byte(kbdc, 0xff, c); - kbdc_set_device_mask(kbdc, m); - kbdc_lock(kbdc, FALSE); - kbdc = NULL; - return; - } - -#if PCVT_KEYBDID - - keyboard_type = KB_UNKNOWN; - if (send_kbd_command(kbdc, KBDC_SEND_DEV_ID) == KBD_ACK) { - DELAY(10000); /* 10msec delay */ - switch (read_kbd_data(kbdc)) { - case KEYB_R_MF2ID1: - switch (read_kbd_data(kbdc)) { - case KEYB_R_MF2ID2: - case KEYB_R_MF2ID2HP: - keyboard_type = KB_MFII; - break; - case -1: - default: - break; - } - break; - case -1: - keyboard_type = KB_AT; - /* fall through */ - default: - /* XXX: should we read the second byte? */ - empty_both_buffers(kbdc, 10); /* XXX */ - break; - } - } else { - /* - * The send ID command failed. This error is considered - * benign, but may need recovery. - */ - empty_both_buffers(kbdc, 10); - test_controller(kbdc); - test_kbd_port(kbdc); - } - -#else /* PCVT_KEYBDID */ - - keyboard_type = KB_MFII; /* force it .. */ - -#endif /* PCVT_KEYBDID */ - - /* enable the keyboard port and intr. */ - if (!set_controller_command_byte(kbdc, - KBD_KBD_CONTROL_BITS, - KBD_ENABLE_KBD_PORT | KBD_ENABLE_KBD_INT)) { - /* CONTROLLER ERROR - * This is serious; we are left with the disabled - * keyboard intr. - */ - printf("pcvt: failed to enable the keyboard port and intr.\n"); - kbdc_set_device_mask(kbdc, m); - kbdc_lock(kbdc, FALSE); - kbdc = NULL; - return; - } - - kbdc_set_device_mask(kbdc, m | KBD_KBD_CONTROL_BITS); - kbdc_lock(kbdc, FALSE); - - update_led(); - - lost_intr_ch = timeout(check_for_lost_intr, (void *)NULL, hz); - lost_intr_timeout_queued = 1; - -#endif /* !_I386_ISA_KBDIO_H_ */ -} - -/*---------------------------------------------------------------------------* - * init keyboard code - *---------------------------------------------------------------------------*/ -void -kbd_code_init(void) -{ - doreset(); - ovlinit(0); - keyboard_is_initialized = 1; -} - -/*---------------------------------------------------------------------------* - * init keyboard code, this initializes the keyboard subsystem - * just "a bit" so the very very first ddb session is able to - * get proper keystrokes - in other words, it's a hack .... - *---------------------------------------------------------------------------*/ -void -kbd_code_init1(void) -{ - doreset(); - keyboard_is_initialized = 1; -} - -/*---------------------------------------------------------------------------* - * init keyboard overlay table - *---------------------------------------------------------------------------*/ -static -void ovlinit(int force) -{ - register i; - - if(force || ovlinitflag==0) - { - if(ovlinitflag == 0 && - (ovltbl = (Ovl_tbl *)malloc(sizeof(Ovl_tbl) * OVLTBL_SIZE, - M_DEVBUF, M_WAITOK)) == NULL) - panic("pcvt_kbd: malloc of Ovl_tbl failed"); - - for(i=0; i<OVLTBL_SIZE; i++) - { - ovltbl[i].keynum = - ovltbl[i].type = 0; - ovltbl[i].unshift[0] = - ovltbl[i].shift[0] = - ovltbl[i].ctrl[0] = - ovltbl[i].altgr[0] = 0; - ovltbl[i].subu = - ovltbl[i].subs = - ovltbl[i].subc = - ovltbl[i].suba = KBD_SUBT_STR; /* just strings .. */ - } - for(i=0; i<=MAXKEYNUM; i++) - key2ascii[i].type &= KBD_MASK; - ovlinitflag = 1; - } -} - -/*---------------------------------------------------------------------------* - * get original key definition - *---------------------------------------------------------------------------*/ -static int -getokeydef(unsigned key, Ovl_tbl *thisdef) -{ - if(key == 0 || key > MAXKEYNUM) - return EINVAL; - - thisdef->keynum = key; - thisdef->type = key2ascii[key].type; - - if(key2ascii[key].unshift.subtype == STR) - { - bcopy((u_char *)(key2ascii[key].unshift.what.string), - thisdef->unshift, CODE_SIZE); - thisdef->subu = KBD_SUBT_STR; - } - else - { - bcopy("", thisdef->unshift, CODE_SIZE); - thisdef->subu = KBD_SUBT_FNC; - } - - if(key2ascii[key].shift.subtype == STR) - { - bcopy((u_char *)(key2ascii[key].shift.what.string), - thisdef->shift, CODE_SIZE); - thisdef->subs = KBD_SUBT_STR; - } - else - { - bcopy("",thisdef->shift,CODE_SIZE); - thisdef->subs = KBD_SUBT_FNC; - } - - if(key2ascii[key].ctrl.subtype == STR) - { - bcopy((u_char *)(key2ascii[key].ctrl.what.string), - thisdef->ctrl, CODE_SIZE); - thisdef->subc = KBD_SUBT_STR; - } - else - { - bcopy("",thisdef->ctrl,CODE_SIZE); - thisdef->subc = KBD_SUBT_FNC; - } - - /* deliver at least anything for ALTGR settings ... */ - - if(key2ascii[key].unshift.subtype == STR) - { - bcopy((u_char *)(key2ascii[key].unshift.what.string), - thisdef->altgr, CODE_SIZE); - thisdef->suba = KBD_SUBT_STR; - } - else - { - bcopy("",thisdef->altgr, CODE_SIZE); - thisdef->suba = KBD_SUBT_FNC; - } - return 0; -} - -/*---------------------------------------------------------------------------* - * get current key definition - *---------------------------------------------------------------------------*/ -static int -getckeydef(unsigned key, Ovl_tbl *thisdef) -{ - u_short type = key2ascii[key].type; - - if(key>MAXKEYNUM) - return EINVAL; - - if(type & KBD_OVERLOAD) - *thisdef = ovltbl[key2ascii[key].ovlindex]; - else - getokeydef(key,thisdef); - - return 0; -} - -/*---------------------------------------------------------------------------* - * translate keynumber and returns ptr to associated ascii string - * if key is bound to a function, executes it, and ret empty ptr - *---------------------------------------------------------------------------*/ -static u_char * -xlatkey2ascii(U_short key) -{ - static u_char capchar[2] = {0, 0}; -#if PCVT_META_ESC - static u_char metachar[3] = {0x1b, 0, 0}; -#else - static u_char metachar[2] = {0, 0}; -#endif - static Ovl_tbl thisdef; - int n; - void (*fnc)(void); - - if(key==0) /* ignore the NON-KEY */ - return 0; - - getckeydef(key&0x7F, &thisdef); /* get the current ASCII value */ - - thisdef.type &= KBD_MASK; - - if(key&0x80) /* special handling of ALT-KEYPAD */ - { - /* is the ALT Key released? */ - if(thisdef.type==KBD_META || thisdef.type==KBD_ALTGR) - { - if(altkpflag) /* have we been in altkp mode? */ - { - capchar[0] = altkpval; - altkpflag = 0; - altkpval = 0; - return capchar; - } - } - return 0; - } - - switch(thisdef.type) /* convert the keys */ - { - case KBD_BREAK: - case KBD_ASCII: - case KBD_FUNC: - fnc = NULL; - more_chars = NULL; - - if(altgr_down) - { - more_chars = (u_char *)thisdef.altgr; - } - else if(!ctrl_down && (shift_down || vsp->shift_lock)) - { - if(key2ascii[key].shift.subtype == STR) - more_chars = (u_char *)thisdef.shift; - else - fnc = key2ascii[key].shift.what.func; - } - - else if(ctrl_down) - { - if(key2ascii[key].ctrl.subtype == STR) - more_chars = (u_char *)thisdef.ctrl; - else - fnc = key2ascii[key].ctrl.what.func; - } - - else - { - if(key2ascii[key].unshift.subtype == STR) - more_chars = (u_char *)thisdef.unshift; - else - fnc = key2ascii[key].unshift.what.func; - } - - if(fnc) - (*fnc)(); /* execute function */ - - if((more_chars != NULL) && (more_chars[1] == 0)) - { - if(vsp->caps_lock && more_chars[0] >= 'a' - && more_chars[0] <= 'z') - { - capchar[0] = *more_chars - ('a'-'A'); - more_chars = capchar; - } - if(meta_down) - { -#if PCVT_META_ESC - metachar[1] = *more_chars; -#else - metachar[0] = *more_chars | 0x80; -#endif - more_chars = metachar; - } - } - return(more_chars); - - case KBD_KP: - fnc = NULL; - more_chars = NULL; - - if(meta_down) - { - switch(key) - { - case 95: /* / */ - altkpflag = 0; - more_chars = - (u_char *)"\033OQ"; - return(more_chars); - - case 100: /* * */ - altkpflag = 0; - more_chars = - (u_char *)"\033OR"; - return(more_chars); - - case 105: /* - */ - altkpflag = 0; - more_chars = - (u_char *)"\033OS"; - return(more_chars); - } - } - - if(meta_down || altgr_down) - { - if((n = keypad2num[key-91]) >= 0) - { - if(!altkpflag) - { - /* start ALT-KP mode */ - altkpflag = 1; - altkpval = 0; - } - altkpval *= 10; - altkpval += n; - } - else - altkpflag = 0; - return 0; - } - - if(!(vsp->num_lock)) - { - if(key2ascii[key].shift.subtype == STR) - more_chars = (u_char *)thisdef.shift; - else - fnc = key2ascii[key].shift.what.func; - } - else - { - if(key2ascii[key].unshift.subtype == STR) - more_chars = (u_char *)thisdef.unshift; - else - fnc = key2ascii[key].unshift.what.func; - } - - if(fnc) - (*fnc)(); /* execute function */ - return(more_chars); - - case KBD_CURSOR: - fnc = NULL; - more_chars = NULL; - - if(vsp->ckm) - { - if(key2ascii[key].shift.subtype == STR) - more_chars = (u_char *)thisdef.shift; - else - fnc = key2ascii[key].shift.what.func; - } - else - { - if(key2ascii[key].unshift.subtype == STR) - more_chars = (u_char *)thisdef.unshift; - else - fnc = key2ascii[key].unshift.what.func; - } - - if(fnc) - (*fnc)(); /* execute function */ - return(more_chars); - - case KBD_NUM: /* special kp-num handling */ - more_chars = NULL; - - if(meta_down) - { - more_chars = (u_char *)"\033OP"; /* PF1 */ - } - else - { - vsp->num_lock ^= 1; - update_led(); - } - return(more_chars); - - case KBD_RETURN: - more_chars = NULL; - - if(!(vsp->num_lock)) - { - more_chars = (u_char *)thisdef.shift; - } - else - { - more_chars = (u_char *)thisdef.unshift; - } - if(vsp->lnm && (*more_chars == '\r')) - { - more_chars = (u_char *)"\r\n"; /* CR LF */ - } - if(meta_down) - { -#if PCVT_META_ESC - metachar[1] = *more_chars; -#else - metachar[0] = *more_chars | 0x80; -#endif - more_chars = metachar; - } - return(more_chars); - - case KBD_META: /* these keys are */ - case KBD_ALTGR: /* handled directly */ - case KBD_SCROLL: /* by the keyboard */ - case KBD_CAPS: /* handler - they are */ - case KBD_SHFTLOCK: /* ignored here */ - case KBD_CTL: - case KBD_NONE: - default: - return 0; - } -} - -/*---------------------------------------------------------------------------* - * get keystrokes from the keyboard. - * if noblock = 0, wait until a key is pressed. - * else return NULL if no characters present. - *---------------------------------------------------------------------------*/ - -#if PCVT_KBD_FIFO -extern u_char pcvt_kbd_fifo[]; -extern int pcvt_kbd_rptr; -extern short pcvt_kbd_count; -#endif - -u_char * -sgetc(int noblock) -{ - u_char *cp; - u_char dt; - u_char key; - u_short type; - -#if PCVT_KBD_FIFO && PCVT_SLOW_INTERRUPT - int s; -#endif - - static u_char kbd_lastkey = 0; /* last keystroke */ - - static struct - { - u_char extended: 1; /* extended prefix seen */ - u_char ext1: 1; /* extended prefix 1 seen */ - u_char breakseen: 1; /* break code seen */ - u_char vshift: 1; /* virtual shift pending */ - u_char vcontrol: 1; /* virtual control pending */ - u_char sysrq: 1; /* sysrq pressed */ - } kbd_status = {0}; - -#ifdef XSERVER - static char keybuf[2] = {0}; /* the second 0 is a delimiter! */ -#endif /* XSERVER */ - -#ifdef _I386_ISA_KBDIO_H_ - int c; -#endif /* _I386_ISA_KBDIO_H_ */ - -loop: - -#ifdef XSERVER - -#ifndef _I386_ISA_KBDIO_H_ - -#if PCVT_KBD_FIFO - - /* see if there is data from the keyboard available either from */ - /* the keyboard fifo or from the 8042 keyboard controller */ - - if (pcvt_kbd_count || (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)) - { - if (!pcvt_kbd_count) /* source = 8042 */ - { - PCVT_KBD_DELAY(); /* 7 us delay */ - dt = inb(CONTROLLER_DATA); /* get from obuf */ - } - else /* source = keyboard fifo */ - { - dt = pcvt_kbd_fifo[pcvt_kbd_rptr++]; - PCVT_DISABLE_INTR(); - pcvt_kbd_count--; - PCVT_ENABLE_INTR(); - if (pcvt_kbd_rptr >= PCVT_KBD_FIFO_SZ) - pcvt_kbd_rptr = 0; - } - -#else /* !PCVT_KB_FIFO */ - - /* see if there is data from the keyboard available from the 8042 */ - - if (inb(CONTROLLER_CTRL) & STATUS_OUTPBF) - { - PCVT_KBD_DELAY(); /* 7 us delay */ - dt = inb(CONTROLLER_DATA); /* yes, get data */ - -#endif /* !PCVT_KBD_FIFO */ - -#else /* _I386_ISA_KBDIO_H_ */ - -#if PCVT_KBD_FIFO - if (pcvt_kbd_count) { - dt = pcvt_kbd_fifo[pcvt_kbd_rptr++]; - PCVT_DISABLE_INTR(); - pcvt_kbd_count--; - PCVT_ENABLE_INTR(); - if (pcvt_kbd_rptr >= PCVT_KBD_FIFO_SZ) - pcvt_kbd_rptr = 0; - } else -#endif /* PCVT_KBD_FIFO */ - if (!noblock) { - while ((c = read_kbd_data(kbdc)) == -1) - ; - dt = c; - } else { - if ((c = read_kbd_data_no_wait(kbdc)) == -1) - return NULL; - dt = c; - } - - { - -#endif /* !_I386_ISA_KBDIO_H_ */ - - /* - * If x mode is active, only care for locking keys, then - * return the scan code instead of any key translation. - * Additionally, this prevents us from any attempts to - * execute pcvt internal functions caused by keys (such - * as screen flipping). - * XXX For now, only the default locking key definitions - * are recognized (i.e. if you have overloaded you "A" key - * as NUMLOCK, that wont effect X mode:-) - * Changing this would be nice, but would require modifi- - * cations to the X server. After having this, X will - * deal with the LEDs itself, so we are committed. - */ - /* - * Iff PCVT_USL_VT_COMPAT is defined, the behaviour has - * been fixed. We need not care about any keys here, since - * there are ioctls that deal with the lock key / LED stuff. - */ - if (pcvt_kbd_raw) - { - keybuf[0] = dt; - -#if PCVT_FREEBSD > 210 - add_keyboard_randomness(dt); -#endif /* PCVT_FREEBSD > 210 */ - -#if !PCVT_USL_VT_COMPAT - if ((dt & 0x80) == 0) - /* key make */ - switch(dt) - { - case 0x45: - /* XXX on which virt screen? */ vsp->num_lock ^= 1; - update_led(); - break; - - case 0x3a: - vsp->caps_lock ^= 1; - update_led(); - break; - - case 0x46: - vsp->scroll_lock ^= 1; - update_led(); - break; - } -#endif /* !PCVT_USL_VT_COMPAT */ - -#if PCVT_EMU_MOUSE - /* - * The (mouse systems) mouse emulator. The mouse - * device allocates the first device node that is - * not used by a virtual terminal. (E.g., you have - * eight vtys, /dev/ttyv0 thru /dev/ttyv7, so the - * mouse emulator were /dev/ttyv8.) - * Currently the emulator only works if the keyboard - * is in raw (PC scan code) mode. This is the typic- - * al case when running the X server. - * It is activated if the num locks LED is active - * for the current vty, and if the mouse device - * has been opened by at least one process. It - * grabs the numerical keypad events (but only - * the "non-extended", so the separate arrow keys - * continue to work), and three keys for the "mouse - * buttons", preferrably F1 thru F3. Any of the - * eight directions (N, NE, E, SE, S, SW, W, NW) - * is supported, and frequent key presses (less - * than e.g. half a second between key presses) - * cause the emulator to accelerate the pointer - * movement by 6, while single presses result in - * single moves, so each point can be reached. - */ - /* - * NB: the following code is spagghetti. - * Only eat it with lotta tomato ketchup and - * Parmesan cheese:-) - */ - /* - * look whether we will have to steal the keys - * and cook them into mouse events - */ - if(vsp->num_lock && mouse.opened) - { - int button, accel, i; - enum mouse_dir - { - MOUSE_NW, MOUSE_N, MOUSE_NE, - MOUSE_W, MOUSE_0, MOUSE_E, - MOUSE_SW, MOUSE_S, MOUSE_SE - } - move; - struct timeval now; - dev_t dummy = makedev(0, mouse.minor); - struct tty *mousetty = get_pccons(dummy); - /* - * strings to send for each mouse event, - * indexed by the movement direction and - * the "accelerator" value (TRUE for frequent - * key presses); note that the first byte - * of each string is actually overwritten - * by the current button value before sending - * the string - */ - static u_char mousestrings[2][MOUSE_SE+1][5] = - { - { - /* first, the non-accelerated strings*/ - {0x87, -1, 1, 0, 0}, /* NW */ - {0x87, 0, 1, 0, 0}, /* N */ - {0x87, 1, 1, 0, 0}, /* NE */ - {0x87, -1, 0, 0, 0}, /* W */ - {0x87, 0, 0, 0, 0}, /* 0 */ - {0x87, 1, 0, 0, 0}, /* E */ - {0x87, -1, -1, 0, 0}, /* SW */ - {0x87, 0, -1, 0, 0}, /* S */ - {0x87, 1, -1, 0, 0} /* SE */ - }, - { - /* now, 6 steps at once */ - {0x87, -4, 4, 0, 0}, /* NW */ - {0x87, 0, 6, 0, 0}, /* N */ - {0x87, 4, 4, 0, 0}, /* NE */ - {0x87, -6, 0, 0, 0}, /* W */ - {0x87, 0, 0, 0, 0}, /* 0 */ - {0x87, 6, 0, 0, 0}, /* E */ - {0x87, -4, -4, 0, 0}, /* SW */ - {0x87, 0, -6, 0, 0}, /* S */ - {0x87, 4, -4, 0, 0} /* SE */ - } - }; - - if(dt == 0xe0) - { - /* ignore extended scan codes */ - mouse.extendedseen = 1; - goto no_mouse_event; - } - if(mouse.extendedseen) - { - mouse.extendedseen = 0; - goto no_mouse_event; - } - mouse.extendedseen = 0; - - /* - * Note that we cannot use a switch here - * since we want to have the keycodes in - * a variable - */ - if((dt & 0x7f) == mousedef.leftbutton) { - button = 4; - goto do_button; - } - else if((dt & 0x7f) == mousedef.middlebutton) { - button = 2; - goto do_button; - } - else if((dt & 0x7f) == mousedef.rightbutton) { - button = 1; - do_button: - - /* - * i would really like to give - * some acustical support - * (pling/plong); i am not sure - * whether it is safe to call - * sysbeep from within an intr - * service, since it calls - * timeout in turn which mani- - * pulates the spl mask - jw - */ - -# define PLING sysbeep(PCVT_SYSBEEPF / 1500, 2) -# define PLONG sysbeep(PCVT_SYSBEEPF / 1200, 2) - - if(mousedef.stickybuttons) - { - if(dt & 0x80) { - mouse.breakseen = 1; - return (u_char *)0; - } - else if(mouse.buttons == button - && !mouse.breakseen) { - /* ignore repeats */ - return (u_char *)0; - } - else - mouse.breakseen = 0; - if(mouse.buttons == button) { - /* release it */ - mouse.buttons = 0; - PLONG; - } else { - /* - * eventually, release - * any other button, - * and stick this one - */ - mouse.buttons = button; - PLING; - } - } - else - { - if(dt & 0x80) { - mouse.buttons &= - ~button; - PLONG; - } - else if((mouse.buttons - & button) == 0) { - mouse.buttons |= - button; - PLING; - } - /*else: ignore same btn press*/ - } - move = MOUSE_0; - accel = 0; - } -# undef PLING -# undef PLONG - else switch(dt & 0x7f) - { - /* the arrow keys - KP 1 thru KP 9 */ - case 0x47: move = MOUSE_NW; goto do_move; - case 0x48: move = MOUSE_N; goto do_move; - case 0x49: move = MOUSE_NE; goto do_move; - case 0x4b: move = MOUSE_W; goto do_move; - case 0x4c: move = MOUSE_0; goto do_move; - case 0x4d: move = MOUSE_E; goto do_move; - case 0x4f: move = MOUSE_SW; goto do_move; - case 0x50: move = MOUSE_S; goto do_move; - case 0x51: move = MOUSE_SE; - do_move: - if(dt & 0x80) - /* - * arrow key break events are - * of no importance for us - */ - return (u_char *)0; - /* - * see whether the last move did - * happen "recently", i.e. before - * less than half a second - */ - getmicrotime(&now); - timevalsub(&now, &mouse.lastmove); - getmicrotime(&mouse.lastmove); - accel = (now.tv_sec == 0 - && now.tv_usec - < mousedef.acceltime); - break; - - default: /* not a mouse-emulating key */ - goto no_mouse_event; - } - mousestrings[accel][move][0] = - 0x80 + (~mouse.buttons & 7); - /* finally, send the string */ - for(i = 0; i < 5; i++) - (*linesw[mousetty->t_line].l_rint) - (mousestrings[accel][move][i], - mousetty); - return (u_char *)0; /* not a kbd event */ - } -no_mouse_event: - -#endif /* PCVT_EMU_MOUSE */ - - return ((u_char *)keybuf); - } - } - -#else /* !XSERVER */ - -#ifndef _I386_ISA_KBDIO_H_ - -# if PCVT_KBD_FIFO - - /* see if there is data from the keyboard available either from */ - /* the keyboard fifo or from the 8042 keyboard controller */ - - if (pcvt_kbd_count || (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)) - { - if (!noblock || kbd_polling) /* source = 8042 */ - { - PCVT_KBD_DELAY(); /* 7 us delay */ - dt = inb(CONTROLLER_DATA); - } - else /* source = keyboard fifo */ - { - dt = pcvt_kbd_fifo[pcvt_kbd_rptr++]; /* yes, get it ! */ - PCVT_DISABLE_INTR(); - pcvt_kbd_count--; - PCVT_ENABLE_INTR(); - if (pcvt_kbd_rptr >= PCVT_KBD_FIFO_SZ) - pcvt_kbd_rptr = 0; - } - } - -#else /* !PCVT_KBD_FIFO */ - - /* see if there is data from the keyboard available from the 8042 */ - - if(inb(CONTROLLER_CTRL) & STATUS_OUTPBF) - { - PCVT_KBD_DELAY(); /* 7 us delay */ - dt = inb(CONTROLLER_DATA); /* yes, get data ! */ - } - -#endif /* !PCVT_KBD_FIFO */ - -#else /* _I386_ISA_KBDIO_H_ */ - -#if PCVT_KBD_FIFO - if (pcvt_kbd_count) { - dt = pcvt_kbd_fifo[pcvt_kbd_rptr++]; - PCVT_DISABLE_INTR(); - pcvt_kbd_count--; - PCVT_ENABLE_INTR(); - if (pcvt_kbd_rptr >= PCVT_KBD_FIFO_SZ) - pcvt_kbd_rptr = 0; - } else -#endif /* PCVT_KBD_FIFO */ - if (!noblock) { - while ((c = read_kbd_data(kbdc)) == -1) - ; - dt = c; - } else { - if ((c = read_kbd_data_no_wait(kbdc)) == -1) - return NULL; - dt = c; - } - -#endif /* !_I386_ISA_KBDIO_H_ */ - -#endif /* !XSERVER */ - -#ifndef _I386_ISA_KBDIO_H_ - else - { - if(noblock) - return NULL; - else - goto loop; - } -#endif /* !_I386_ISA_KBDIO_H_ */ - -#if PCVT_SHOWKEYS - showkey (' ', dt); -#endif /* PCVT_SHOWKEYS */ - - /* lets look what we got */ - switch(dt) - { - case KEYB_R_OVERRUN0: /* keyboard buffer overflow */ - -#if PCVT_SCANSET == 2 - case KEYB_R_SELFOK: /* keyboard selftest ok */ -#endif /* PCVT_SCANSET == 2 */ - - case KEYB_R_ECHO: /* keyboard response to KEYB_C_ECHO */ - case KEYB_R_ACK: /* acknowledge after command has rx'd*/ - case KEYB_R_SELFBAD: /* keyboard selftest FAILED */ - case KEYB_R_DIAGBAD: /* keyboard self diagnostic failure */ - case KEYB_R_RESEND: /* keyboard wants us to resend cmnd */ - case KEYB_R_OVERRUN1: /* keyboard buffer overflow */ - break; - - case KEYB_R_EXT1: /* keyboard extended scancode pfx 2 */ - kbd_status.ext1 = 1; - /* FALLTHROUGH */ - case KEYB_R_EXT0: /* keyboard extended scancode pfx 1 */ - kbd_status.extended = 1; - break; - -#if PCVT_SCANSET == 2 - case KEYB_R_BREAKPFX: /* break code prefix for set 2 and 3 */ - kbd_status.breakseen = 1; - break; -#endif /* PCVT_SCANSET == 2 */ - - default: - goto regular; /* regular key */ - } - - if(noblock) - return NULL; - else - goto loop; - - /* got a normal scan key */ -regular: - -#if PCVT_FREEBSD > 210 - add_keyboard_randomness(dt); -#endif /* PCVT_FREEBSD > 210 */ - -#if PCVT_SCANSET == 1 - kbd_status.breakseen = dt & 0x80 ? 1 : 0; - dt &= 0x7f; -#endif /* PCVT_SCANSET == 1 */ - - /* make a keycode from scan code */ - if(dt >= sizeof scantokey / sizeof(u_char)) - key = 0; - else - key = kbd_status.extended ? extscantokey[dt] : scantokey[dt]; - - if(kbd_status.ext1 && key == 64) - /* virtual control key */ - key = 129; - - kbd_status.extended = kbd_status.ext1 = 0; - -#if PCVT_CTRL_ALT_DEL /* Check for cntl-alt-del */ - if((key == 76) && ctrl_down && (meta_down||altgr_down)) - shutdown_nice(); -#endif /* PCVT_CTRL_ALT_DEL */ - -#if !(PCVT_NETBSD || PCVT_FREEBSD >= 200) -#include "ddb.h" -#endif /* !(PCVT_NETBSD || PCVT_FREEBSD >= 200) */ - -#if NDDB > 0 || defined(DDB) /* Check for cntl-alt-esc */ - - if((key == 110) && ctrl_down && (meta_down || altgr_down)) - { - static u_char in_Debugger; - - if(!in_Debugger) - { - in_Debugger = 1; -#if PCVT_FREEBSD - /* the string is actually not used... */ - Debugger("kbd"); -#else - Debugger(); -#endif - in_Debugger = 0; - if(noblock) - return NULL; - else - goto loop; - } - } -#endif /* NDDB > 0 || defined(DDB) */ - - /* look for keys with special handling */ - if(key == 128) - { - /* - * virtual shift; sent around PrtScr, and around the arrow - * keys if the NumLck LED is on - */ - kbd_status.vshift = !kbd_status.breakseen; - key = 0; /* no key */ - } - else if(key == 129) - { - /* - * virtual control - the most ugly thingie at all - * the Pause key sends: - * <virtual control make> <numlock make> <virtual control - * break> <numlock break> - */ - if(!kbd_status.breakseen) - kbd_status.vcontrol = 1; - /* else: let the numlock hook clear this */ - key = 0; /* no key */ - } - else if(key == 90) - { - /* NumLock, look whether this is rather a Pause */ - if(kbd_status.vcontrol) - key = 126; - /* - * if this is the final break code of a Pause key, - * clear the virtual control status, too - */ - if(kbd_status.vcontrol && kbd_status.breakseen) - kbd_status.vcontrol = 0; - } - else if(key == 127) - { - /* - * a SysRq; some keyboards are brain-dead enough to - * repeat the SysRq key make code by sending PrtScr - * make codes; other keyboards do not repeat SysRq - * at all. We keep track of the SysRq state here. - */ - kbd_status.sysrq = !kbd_status.breakseen; - } - else if(key == 124) - { - /* - * PrtScr; look whether this is really PrtScr or rather - * a silly repeat of a SysRq key - */ - if(kbd_status.sysrq) - /* ignore the garbage */ - key = 0; - } - - /* in NOREPEAT MODE ignore the key if it was the same as before */ - - if(!kbrepflag && key == kbd_lastkey && !kbd_status.breakseen) - { - if(noblock) - return NULL; - else - goto loop; - } - - type = key2ascii[key].type; - - if(type & KBD_OVERLOAD) - type = ovltbl[key2ascii[key].ovlindex].type; - - type &= KBD_MASK; - - switch(type) - { - case KBD_SHFTLOCK: - if(!kbd_status.breakseen && key != kbd_lastkey) - { - vsp->shift_lock ^= 1; - } - break; - - case KBD_CAPS: - if(!kbd_status.breakseen && key != kbd_lastkey) - { - vsp->caps_lock ^= 1; - update_led(); - } - break; - - case KBD_SCROLL: - if(!kbd_status.breakseen && key != kbd_lastkey) - { - vsp->scroll_lock ^= 1; - update_led(); - - if(!(vsp->scroll_lock)) - { - /* someone may be sleeping */ - wakeup((caddr_t)&(vsp->scroll_lock)); - } - } - break; - - case KBD_SHIFT: - shift_down = kbd_status.breakseen ? 0 : 1; - break; - - case KBD_META: - meta_down = kbd_status.breakseen ? 0 : 0x80; - break; - - case KBD_ALTGR: - altgr_down = kbd_status.breakseen ? 0 : 1; - break; - - case KBD_CTL: - ctrl_down = kbd_status.breakseen ? 0 : 1; - break; - - case KBD_NONE: - default: - break; /* deliver a key */ - } - - if(kbd_status.breakseen) - { - key |= 0x80; - kbd_status.breakseen = 0; - kbd_lastkey = 0; /* -hv- I know this is a bug with */ - } /* N-Key-Rollover, but I ignore that */ - else /* because avoidance is too complicated */ - kbd_lastkey = key; - - cp = xlatkey2ascii(key); /* have a key */ - - if(cp == NULL && !noblock) - goto loop; - - return cp; -} - -/*---------------------------------------------------------------------------* - * reflect status of locking keys & set led's - *---------------------------------------------------------------------------*/ -static void -setlockkeys(int snc) -{ - vsp->scroll_lock = snc & 1; - vsp->num_lock = (snc & 2) ? 1 : 0; - vsp->caps_lock = (snc & 4) ? 1 : 0; - update_led(); -} - -/*---------------------------------------------------------------------------* - * remove a key definition - *---------------------------------------------------------------------------*/ -static int -rmkeydef(int key) -{ - register Ovl_tbl *ref; - - if(key==0 || key > MAXKEYNUM) - return EINVAL; - - if(key2ascii[key].type & KBD_OVERLOAD) - { - ref = &ovltbl[key2ascii[key].ovlindex]; - ref->keynum = 0; - ref->type = 0; - ref->unshift[0] = - ref->shift[0] = - ref->ctrl[0] = - ref->altgr[0] = 0; - key2ascii[key].type &= KBD_MASK; - } - return 0; -} - -/*---------------------------------------------------------------------------* - * overlay a key - *---------------------------------------------------------------------------*/ -static int -setkeydef(Ovl_tbl *data) -{ - register i; - - if( data->keynum > MAXKEYNUM || - (data->type & KBD_MASK) == KBD_BREAK || - (data->type & KBD_MASK) > KBD_SHFTLOCK) - return EINVAL; - - data->unshift[KBDMAXOVLKEYSIZE] = - data->shift[KBDMAXOVLKEYSIZE] = - data->ctrl[KBDMAXOVLKEYSIZE] = - data->altgr[KBDMAXOVLKEYSIZE] = 0; - - data->subu = - data->subs = - data->subc = - data->suba = KBD_SUBT_STR; /* just strings .. */ - - data->type |= KBD_OVERLOAD; /* mark overloaded */ - - /* if key already overloaded, use that slot else find free slot */ - - if(key2ascii[data->keynum].type & KBD_OVERLOAD) - { - i = key2ascii[data->keynum].ovlindex; - } - else - { - for(i=0; i<OVLTBL_SIZE; i++) - if(ovltbl[i].keynum==0) - break; - - if(i==OVLTBL_SIZE) - return ENOSPC; /* no space, abuse of ENOSPC(!) */ - } - - ovltbl[i] = *data; /* copy new data string */ - - key2ascii[data->keynum].type |= KBD_OVERLOAD; /* mark key */ - key2ascii[data->keynum].ovlindex = i; - - return 0; -} - -/*---------------------------------------------------------------------------* - * keyboard ioctl's entry - *---------------------------------------------------------------------------*/ -int -kbdioctl(Dev_t dev, int cmd, caddr_t data, int flag) -{ - int key; - - switch(cmd) - { - case KBDRESET: - doreset(); - ovlinit(1); - settpmrate(KBD_TPD500|KBD_TPM100); - setlockkeys(0); - break; - - case KBDGTPMAT: - *(int *)data = tpmrate; - break; - - case KBDSTPMAT: - settpmrate(*(int *)data); - break; - - case KBDGREPSW: - *(int *)data = kbrepflag; - break; - - case KBDSREPSW: - kbrepflag = (*(int *)data) & 1; - break; - - case KBDGLEDS: - *(int *)data = ledstate; - break; - - case KBDSLEDS: - update_led(); /* ??? */ - break; - - case KBDGLOCK: - *(int *)data = ( (vsp->scroll_lock) | - (vsp->num_lock * 2) | - (vsp->caps_lock * 4)); - break; - - case KBDSLOCK: - setlockkeys(*(int *)data); - break; - - case KBDGCKEY: - key = ((Ovl_tbl *)data)->keynum; - return getckeydef(key,(Ovl_tbl *)data); - - case KBDSCKEY: - key = ((Ovl_tbl *)data)->keynum; - return setkeydef((Ovl_tbl *)data); - - case KBDGOKEY: - key = ((Ovl_tbl *)data)->keynum; - return getokeydef(key,(Ovl_tbl *)data); - - case KBDRMKEY: - key = *(int *)data; - return rmkeydef(key); - - case KBDDEFAULT: - ovlinit(1); - break; - - default: - /* proceed with vga ioctls */ - return -1; - } - return 0; -} - -#if PCVT_EMU_MOUSE -/*--------------------------------------------------------------------------* - * mouse emulator ioctl - *--------------------------------------------------------------------------*/ -int -mouse_ioctl(Dev_t dev, int cmd, caddr_t data) -{ - struct mousedefs *def = (struct mousedefs *)data; - - switch(cmd) - { - case KBDMOUSEGET: - *def = mousedef; - break; - - case KBDMOUSESET: - mousedef = *def; - break; - - default: - return -1; - } - return 0; -} -#endif /* PCVT_EMU_MOUSE */ - -#if PCVT_USL_VT_COMPAT -/*---------------------------------------------------------------------------* - * convert ISO-8859 style keycode into IBM 437 - *---------------------------------------------------------------------------*/ -static __inline u_char -iso2ibm(u_char c) -{ - if(c < 0x80) - return c; - return iso2ibm437[c - 0x80]; -} - -/*---------------------------------------------------------------------------* - * build up a USL style keyboard map - *---------------------------------------------------------------------------*/ -void -get_usl_keymap(keymap_t *map) -{ - int i; - - bzero((caddr_t)map, sizeof(keymap_t)); - - map->n_keys = 0x59; /* that many keys we know about */ - - for(i = 1; i < N_KEYNUMS; i++) - { - Ovl_tbl kdef; - u_char c; - int j; - int idx = key2scan1[i]; - - if(idx == 0 || idx >= map->n_keys) - continue; - - getckeydef(i, &kdef); - kdef.type &= KBD_MASK; - switch(kdef.type) - { - case KBD_ASCII: - case KBD_RETURN: - map->key[idx].map[0] = iso2ibm(kdef.unshift[0]); - map->key[idx].map[1] = iso2ibm(kdef.shift[0]); - map->key[idx].map[2] = map->key[idx].map[3] = - iso2ibm(kdef.ctrl[0]); - map->key[idx].map[4] = map->key[idx].map[5] = - iso2ibm(c = kdef.altgr[0]); - /* - * XXX this is a hack - * since we currently do not map strings to AltGr + - * shift, we attempt to use the unshifted AltGr - * definition here and try to toggle the case - * this should at least work for ISO8859 letters, - * but also for (e.g.) russian KOI-8 style - */ - if((c & 0x7f) >= 0x40) - map->key[idx].map[5] = iso2ibm(c ^ 0x20); - break; - - case KBD_FUNC: - /* we are only interested in F1 thru F12 here */ - if(i >= 112 && i <= 123) { - map->key[idx].map[0] = i - 112 + 27; - map->key[idx].spcl = 0x80; - } - break; - - case KBD_SHIFT: - c = i == 44? 2 /* lSh */: 3 /* rSh */; goto special; - - case KBD_CAPS: - c = 4; goto special; - - case KBD_NUM: - c = 5; goto special; - - case KBD_SCROLL: - c = 6; goto special; - - case KBD_META: - c = 7; goto special; - - case KBD_CTL: - c = 9; goto special; - special: - for(j = 0; j < NUM_STATES; j++) - map->key[idx].map[j] = c; - map->key[idx].spcl = 0xff; - break; - - default: - break; - } - } -} - -#endif /* PCVT_USL_VT_COMPAT */ - -/*---------------------------------------------------------------------------* - * switch keypad to numeric mode - *---------------------------------------------------------------------------*/ -void -vt_keynum(struct video_state *svsp) -{ - svsp->num_lock = 1; - update_led(); -} - -/*---------------------------------------------------------------------------* - * switch keypad to application mode - *---------------------------------------------------------------------------*/ -void -vt_keyappl(struct video_state *svsp) -{ - svsp->num_lock = 0; - update_led(); -} - -#if !PCVT_VT220KEYB /* !PCVT_VT220KEYB, HP-like Keyboard layout */ - -/*---------------------------------------------------------------------------* - * function bound to function key 1 - *---------------------------------------------------------------------------*/ -static void -fkey1(void) -{ - if(!meta_down) - { - if((vsp->vt_pure_mode == M_HPVT) - && (vsp->which_fkl == SYS_FKL)) - toggl_columns(vsp); - else - more_chars = (u_char *)"\033[17~"; /* F6 */ - } - else - { - if(vsp->vt_pure_mode == M_PUREVT - || (vsp->which_fkl == USR_FKL)) - more_chars = (u_char *)"\033[26~"; /* F14 */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 2 - *---------------------------------------------------------------------------*/ -static void -fkey2(void) -{ - if(!meta_down) - { - if((vsp->vt_pure_mode == M_HPVT) - && (vsp->which_fkl == SYS_FKL)) - vt_ris(vsp); - else - more_chars = (u_char *)"\033[18~"; /* F7 */ - } - else - { - if(vsp->vt_pure_mode == M_PUREVT - || (vsp->which_fkl == USR_FKL)) - more_chars = (u_char *)"\033[28~"; /* HELP */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 3 - *---------------------------------------------------------------------------*/ -static void -fkey3(void) -{ - if(!meta_down) - { - if((vsp->vt_pure_mode == M_HPVT) - && (vsp->which_fkl == SYS_FKL)) - toggl_24l(vsp); - else - more_chars = (u_char *)"\033[19~"; /* F8 */ - } - else - { - if(vsp->vt_pure_mode == M_PUREVT - || (vsp->which_fkl == USR_FKL)) - more_chars = (u_char *)"\033[29~"; /* DO */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 4 - *---------------------------------------------------------------------------*/ -static void -fkey4(void) -{ - if(!meta_down) - { - -#if PCVT_SHOWKEYS - if((vsp->vt_pure_mode == M_HPVT) - && (vsp->which_fkl == SYS_FKL)) - toggl_kbddbg(vsp); - else - more_chars = (u_char *)"\033[20~"; /* F9 */ -#else - if(vsp->vt_pure_mode == M_PUREVT - || (vsp->which_fkl == USR_FKL)) - more_chars = (u_char *)"\033[20~"; /* F9 */ -#endif /* PCVT_SHOWKEYS */ - - } - else - { - if(vsp->vt_pure_mode == M_PUREVT - || (vsp->which_fkl == USR_FKL)) - more_chars = (u_char *)"\033[31~"; /* F17 */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 5 - *---------------------------------------------------------------------------*/ -static void -fkey5(void) -{ - if(!meta_down) - { - if((vsp->vt_pure_mode == M_HPVT) - && (vsp->which_fkl == SYS_FKL)) - toggl_bell(vsp); - else - more_chars = (u_char *)"\033[21~"; /* F10 */ - } - else - { - if(vsp->vt_pure_mode == M_PUREVT - || (vsp->which_fkl == USR_FKL)) - more_chars = (u_char *)"\033[32~"; /* F18 */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 6 - *---------------------------------------------------------------------------*/ -static void -fkey6(void) -{ - if(!meta_down) - { - if((vsp->vt_pure_mode == M_HPVT) - && (vsp->which_fkl == SYS_FKL)) - toggl_sevenbit(vsp); - else - more_chars = (u_char *)"\033[23~"; /* F11 */ - } - else - { - if(vsp->vt_pure_mode == M_PUREVT - || (vsp->which_fkl == USR_FKL)) - more_chars = (u_char *)"\033[33~"; /* F19 */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 7 - *---------------------------------------------------------------------------*/ -static void -fkey7(void) -{ - if(!meta_down) - { - if((vsp->vt_pure_mode == M_HPVT) - && (vsp->which_fkl == SYS_FKL)) - toggl_dspf(vsp); - else - more_chars = (u_char *)"\033[24~"; /* F12 */ - } - else - { - if(vsp->vt_pure_mode == M_PUREVT - || (vsp->which_fkl == USR_FKL)) - more_chars = (u_char *)"\033[34~"; /* F20 */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 8 - *---------------------------------------------------------------------------*/ -static void -fkey8(void) -{ - if(!meta_down) - { - if((vsp->vt_pure_mode == M_HPVT) - && (vsp->which_fkl == SYS_FKL)) - toggl_awm(vsp); - else - more_chars = (u_char *)"\033[25~"; /* F13 */ - } - else - { - if(vsp->vt_pure_mode == M_PUREVT - || (vsp->which_fkl == USR_FKL)) - more_chars = (u_char *)"\033[35~"; /* F21 ??!! */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 9 - *---------------------------------------------------------------------------*/ -static void -fkey9(void) -{ - if(meta_down) - { - if(vsp->vt_pure_mode == M_PUREVT) - return; - - if(vsp->labels_on) /* toggle label display on/off */ - fkl_off(vsp); - else - fkl_on(vsp); - } - else - { - do_vgapage(0); - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 10 - *---------------------------------------------------------------------------*/ -static void -fkey10(void) -{ - if(meta_down) - { - if(vsp->vt_pure_mode != M_PUREVT && vsp->labels_on) - { - if(vsp->which_fkl == USR_FKL) - sw_sfkl(vsp); - else if(vsp->which_fkl == SYS_FKL) - sw_ufkl(vsp); - } - } - else - { - do_vgapage(1); - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 11 - *---------------------------------------------------------------------------*/ -static void -fkey11(void) -{ - if(meta_down) - { - if(vsp->vt_pure_mode == M_PUREVT) - set_emulation_mode(vsp, M_HPVT); - else if(vsp->vt_pure_mode == M_HPVT) - set_emulation_mode(vsp, M_PUREVT); - } - else - { - do_vgapage(2); - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 12 - *---------------------------------------------------------------------------*/ -static void -fkey12(void) -{ - if(meta_down) - { - if(current_video_screen + 1 > totalscreens-1) - do_vgapage(0); - else - do_vgapage(current_video_screen + 1); - } - else - { - do_vgapage(3); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 1 - *---------------------------------------------------------------------------*/ -static void -sfkey1(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[0]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[0]]); - } - else - { - if(vsp->ukt.length[9]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[9]]); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 2 - *---------------------------------------------------------------------------*/ -static void -sfkey2(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[1]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[1]]); - } - else - { - if(vsp->ukt.length[11]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[11]]); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 3 - *---------------------------------------------------------------------------*/ -static void -sfkey3(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[2]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[2]]); - } - else - { - if(vsp->ukt.length[12]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[12]]); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 4 - *---------------------------------------------------------------------------*/ -static void -sfkey4(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[3]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[3]]); - } - else - { - if(vsp->ukt.length[13]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[13]]); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 5 - *---------------------------------------------------------------------------*/ -static void -sfkey5(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[4]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[4]]); - } - else - { - if(vsp->ukt.length[14]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[14]]); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 6 - *---------------------------------------------------------------------------*/ -static void -sfkey6(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[6]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[6]]); - } - else - { - if(vsp->ukt.length[15]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[15]]); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 7 - *---------------------------------------------------------------------------*/ -static void -sfkey7(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[7]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[7]]); - } - else - { - if(vsp->ukt.length[16]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[16]]); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 8 - *---------------------------------------------------------------------------*/ -static void -sfkey8(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[8]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[8]]); - } - else - { - if(vsp->ukt.length[17]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[17]]); - } -} -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 9 - *---------------------------------------------------------------------------*/ -static void -sfkey9(void) -{ -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 10 - *---------------------------------------------------------------------------*/ -static void -sfkey10(void) -{ -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 11 - *---------------------------------------------------------------------------*/ -static void -sfkey11(void) -{ -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 12 - *---------------------------------------------------------------------------*/ -static void -sfkey12(void) -{ -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 1 - *---------------------------------------------------------------------------*/ -static void -cfkey1(void) -{ - if(meta_down) - do_vgapage(0); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 2 - *---------------------------------------------------------------------------*/ -static void -cfkey2(void) -{ - if(meta_down) - do_vgapage(1); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 3 - *---------------------------------------------------------------------------*/ -static void -cfkey3(void) -{ - if(meta_down) - do_vgapage(2); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 4 - *---------------------------------------------------------------------------*/ -static void -cfkey4(void) -{ - if(meta_down) - do_vgapage(3); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 5 - *---------------------------------------------------------------------------*/ -static void -cfkey5(void) -{ - if(meta_down) - do_vgapage(4); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 6 - *---------------------------------------------------------------------------*/ -static void -cfkey6(void) -{ - if(meta_down) - do_vgapage(5); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 7 - *---------------------------------------------------------------------------*/ -static void -cfkey7(void) -{ - if(meta_down) - do_vgapage(6); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 8 - *---------------------------------------------------------------------------*/ -static void -cfkey8(void) -{ - if(meta_down) - do_vgapage(7); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 9 - *---------------------------------------------------------------------------*/ -static void -cfkey9(void) -{ - if(meta_down) - do_vgapage(8); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 10 - *---------------------------------------------------------------------------*/ -static void -cfkey10(void) -{ - if(meta_down) - do_vgapage(9); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 11 - *---------------------------------------------------------------------------*/ -static void -cfkey11(void) -{ - if(meta_down) - do_vgapage(10); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 12 - *---------------------------------------------------------------------------*/ -static void -cfkey12(void) -{ - if(meta_down) - do_vgapage(11); -} - -#else /* PCVT_VT220 - VT220-like Keyboard layout */ - -/*---------------------------------------------------------------------------* - * function bound to function key 1 - *---------------------------------------------------------------------------*/ -static void -fkey1(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[23~"; /* F11 */ - else - do_vgapage(0); -} - -/*---------------------------------------------------------------------------* - * function bound to function key 2 - *---------------------------------------------------------------------------*/ -static void -fkey2(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[24~"; /* F12 */ - else - do_vgapage(1); -} - -/*---------------------------------------------------------------------------* - * function bound to function key 3 - *---------------------------------------------------------------------------*/ -static void -fkey3(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[25~"; /* F13 */ - else - do_vgapage(2); -} - -/*---------------------------------------------------------------------------* - * function bound to function key 4 - *---------------------------------------------------------------------------*/ -static void -fkey4(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[26~"; /* F14 */ - else - do_vgapage(3); -} - -/*---------------------------------------------------------------------------* - * function bound to function key 5 - *---------------------------------------------------------------------------*/ -static void -fkey5(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[28~"; /* Help */ - else - { - if((current_video_screen + 1) > totalscreens-1) - do_vgapage(0); - else - do_vgapage(current_video_screen + 1); - } -} - -/*---------------------------------------------------------------------------* - * function bound to function key 6 - *---------------------------------------------------------------------------*/ -static void -fkey6(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[29~"; /* DO */ - else - more_chars = (u_char *)"\033[17~"; /* F6 */ -} - -/*---------------------------------------------------------------------------* - * function bound to function key 7 - *---------------------------------------------------------------------------*/ -static void -fkey7(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[31~"; /* F17 */ - else - more_chars = (u_char *)"\033[18~"; /* F7 */ -} - -/*---------------------------------------------------------------------------* - * function bound to function key 8 - *---------------------------------------------------------------------------*/ -static void -fkey8(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[32~"; /* F18 */ - else - more_chars = (u_char *)"\033[19~"; /* F8 */ -} - -/*---------------------------------------------------------------------------* - * function bound to function key 9 - *---------------------------------------------------------------------------*/ -static void -fkey9(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[33~"; /* F19 */ - else - more_chars = (u_char *)"\033[20~"; /* F9 */ -} - -/*---------------------------------------------------------------------------* - * function bound to function key 10 - *---------------------------------------------------------------------------*/ -static void -fkey10(void) -{ - if(meta_down) - more_chars = (u_char *)"\033[34~"; /* F20 */ - else - more_chars = (u_char *)"\033[21~"; /* F10 */ -} - -/*---------------------------------------------------------------------------* - * function bound to function key 11 - *---------------------------------------------------------------------------*/ -static void -fkey11(void) -{ - if(meta_down) - more_chars = (u_char *)"\0x8FP"; /* PF1 */ - else - more_chars = (u_char *)"\033[23~"; /* F11 */ -} - -/*---------------------------------------------------------------------------* - * function bound to function key 12 - *---------------------------------------------------------------------------*/ -static void -fkey12(void) -{ - if(meta_down) - more_chars = (u_char *)"\0x8FQ"; /* PF2 */ - else - more_chars = (u_char *)"\033[24~"; /* F12 */ -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 1 - *---------------------------------------------------------------------------*/ -static void -sfkey1(void) -{ - if(meta_down) - { - if(vsp->ukt.length[6]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[6]]); - else - more_chars = (u_char *)"\033[23~"; /* F11 */ - } - else - { - do_vgapage(4); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 2 - *---------------------------------------------------------------------------*/ -static void -sfkey2(void) -{ - if(meta_down) - { - if(vsp->ukt.length[7]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[7]]); - else - more_chars = (u_char *)"\033[24~"; /* F12 */ - } - else - { - do_vgapage(5); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 3 - *---------------------------------------------------------------------------*/ -static void -sfkey3(void) -{ - if(meta_down) - { - if(vsp->ukt.length[8]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[8]]); - else - more_chars = (u_char *)"\033[25~"; /* F13 */ - } - else - { - do_vgapage(6); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 4 - *---------------------------------------------------------------------------*/ -static void -sfkey4(void) -{ - if(meta_down) - { - if(vsp->ukt.length[9]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[9]]); - else - more_chars = (u_char *)"\033[26~"; /* F14 */ - } - else - { - do_vgapage(7); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 5 - *---------------------------------------------------------------------------*/ -static void -sfkey5(void) -{ - if(meta_down) - { - if(vsp->ukt.length[11]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[11]]); - else - more_chars = (u_char *)"\033[28~"; /* Help */ - } - else - { - if(current_video_screen <= 0) - do_vgapage(totalscreens-1); - else - do_vgapage(current_video_screen - 1); - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 6 - *---------------------------------------------------------------------------*/ -static void -sfkey6(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[0]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[0]]); - else - more_chars = (u_char *)"\033[17~"; /* F6 */ - } - else if(vsp->ukt.length[12]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[12]]); - else - more_chars = (u_char *)"\033[29~"; /* DO */ -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 7 - *---------------------------------------------------------------------------*/ -static void -sfkey7(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[1]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[1]]); - else - more_chars = (u_char *)"\033[18~"; /* F7 */ - } - else if(vsp->ukt.length[14]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[14]]); - else - more_chars = (u_char *)"\033[31~"; /* F17 */ -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 8 - *---------------------------------------------------------------------------*/ -static void -sfkey8(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[2]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[2]]); - else - more_chars = (u_char *)"\033[19~"; /* F8 */ - } - else if(vsp->ukt.length[14]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[15]]); - else - more_chars = (u_char *)"\033[32~"; /* F18 */ -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 9 - *---------------------------------------------------------------------------*/ -static void -sfkey9(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[3]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[3]]); - else - more_chars = (u_char *)"\033[20~"; /* F9 */ - } - else if(vsp->ukt.length[16]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[16]]); - else - more_chars = (u_char *)"\033[33~"; /* F19 */ -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 10 - *---------------------------------------------------------------------------*/ -static void -sfkey10(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[4]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[4]]); - else - more_chars = (u_char *)"\033[21~"; /* F10 */ - } - else if(vsp->ukt.length[17]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[17]]); - else - more_chars = (u_char *)"\033[34~"; /* F20 */ -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 11 - *---------------------------------------------------------------------------*/ -static void -sfkey11(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[6]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[6]]); - else - more_chars = (u_char *)"\033[23~"; /* F11 */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to SHIFTED function key 12 - *---------------------------------------------------------------------------*/ -static void -sfkey12(void) -{ - if(!meta_down) - { - if(vsp->ukt.length[7]) /* entry available ? */ - more_chars = (u_char *) - &(vsp->udkbuf[vsp->ukt.first[7]]); - else - more_chars = (u_char *)"\033[24~"; /* F12 */ - } -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 1 - *---------------------------------------------------------------------------*/ -static void -cfkey1(void) -{ - if(vsp->which_fkl == SYS_FKL) - toggl_columns(vsp); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 2 - *---------------------------------------------------------------------------*/ -static void -cfkey2(void) -{ - if(vsp->which_fkl == SYS_FKL) - vt_ris(vsp); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 3 - *---------------------------------------------------------------------------*/ -static void -cfkey3(void) -{ - if(vsp->which_fkl == SYS_FKL) - toggl_24l(vsp); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 4 - *---------------------------------------------------------------------------*/ -static void -cfkey4(void) -{ - -#if PCVT_SHOWKEYS - if(vsp->which_fkl == SYS_FKL) - toggl_kbddbg(vsp); -#endif /* PCVT_SHOWKEYS */ - -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 5 - *---------------------------------------------------------------------------*/ -static void -cfkey5(void) -{ - if(vsp->which_fkl == SYS_FKL) - toggl_bell(vsp); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 6 - *---------------------------------------------------------------------------*/ -static void -cfkey6(void) -{ - if(vsp->which_fkl == SYS_FKL) - toggl_sevenbit(vsp); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 7 - *---------------------------------------------------------------------------*/ -static void -cfkey7(void) -{ - if(vsp->which_fkl == SYS_FKL) - toggl_dspf(vsp); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 8 - *---------------------------------------------------------------------------*/ -static void -cfkey8(void) -{ - if(vsp->which_fkl == SYS_FKL) - toggl_awm(vsp); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 9 - *---------------------------------------------------------------------------*/ -static void -cfkey9(void) -{ - if(vsp->labels_on) /* toggle label display on/off */ - fkl_off(vsp); - else - fkl_on(vsp); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 10 - *---------------------------------------------------------------------------*/ -static void -cfkey10(void) -{ - if(vsp->labels_on) /* toggle user/system fkey labels */ - { - if(vsp->which_fkl == USR_FKL) - sw_sfkl(vsp); - else if(vsp->which_fkl == SYS_FKL) - sw_ufkl(vsp); - } -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 11 - *---------------------------------------------------------------------------*/ -static void -cfkey11(void) -{ - if(vsp->vt_pure_mode == M_PUREVT) - set_emulation_mode(vsp, M_HPVT); - else if(vsp->vt_pure_mode == M_HPVT) - set_emulation_mode(vsp, M_PUREVT); -} - -/*---------------------------------------------------------------------------* - * function bound to control function key 12 - *---------------------------------------------------------------------------*/ -static void -cfkey12(void) -{ -} - -#endif /* PCVT_VT220KEYB */ - -#endif /* NVT > 0 */ - -/* ------------------------------- EOF -------------------------------------*/ diff --git a/sys/i386/isa/pcvt/pcvt_kbd.h b/sys/i386/isa/pcvt/pcvt_kbd.h deleted file mode 100644 index fa6d2e1..0000000 --- a/sys/i386/isa/pcvt/pcvt_kbd.h +++ /dev/null @@ -1,567 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. - * - * Copyright (c) 1992, 1993 Brian Dunford-Shore and Holger Veit. - * - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz and Don Ahn. - * - * This code is derived from software contributed to 386BSD by - * Holger Veit. - * - * 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_kbd.h, 3.20, Last Edit-Date: [Sun Apr 2 18:59:08 1995] - * - */ - -/*---------------------------------------------------------------------------* - * - * pcvt_kbd.h VT220 Driver Keyboard Interface Header - * ------------------------------------------------------ - * -hm split off from pcvt_kbd.c - * -hm patch from Lon Willett to fix mapping of Control-R scancode - * - *---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------* - * this is one sub-entry for the table. the type can be either - * "pointer to a string" or "pointer to a function" - *---------------------------------------------------------------------------*/ -typedef struct -{ - u_char subtype; /* subtype, string or function */ -#ifdef PCVT_ALT_ENH - u_short str_leng; /* if string, stringlength */ -#endif - union what - { - u_char *string; /* ptr to string, null terminated */ - void (*func)(void); /* ptr to function */ - } what; -} entry; - -/*---------------------------------------------------------------------------* - * this is the "outer" table - *---------------------------------------------------------------------------*/ -typedef struct -{ - u_short type; /* type of key */ - u_short ovlindex; /* -hv- index into overload table */ - entry unshift; /* normal default codes/funcs */ - entry shift; /* shifted default codes/funcs */ - entry ctrl; /* control default codes/funcs */ -#ifdef PCVT_ALT_ENH - entry alt; /* normal default codes/funcs */ - entry alt_shift; /* shifted default codes/funcs */ - entry alt_ctrl; /* control default codes/funcs */ - entry alt_ctrl_shift; /* normal default codes/funcs */ -#endif -} Keycap_def; - -#define IDX0 0 /* default indexvalue into ovl table */ - -#define STR KBD_SUBT_STR /* subtype = ptr to string */ -#define FNC KBD_SUBT_FNC /* subtype = ptr to function */ - -#define CODE_SIZE 5 - -/*---------------------------------------------------------------------------* - * the overlaytable table is a static fixed size scratchpad where all the - * overloaded definitions are stored. - * an entry consists of a short (holding the new type attribute) and - * four entries for a new keydefinition. - *---------------------------------------------------------------------------*/ - -#define OVLTBL_SIZE 64 /* 64 keys can be overloaded */ - -#define Ovl_tbl struct kbd_ovlkey - -static Ovl_tbl *ovltbl; /* the table itself */ - -static ovlinitflag = 0; /* the init flag for the table */ - -/* - * key codes >= 128 denote "virtual" shift/control - * They are resolved before any keymapping is handled - */ - -#if PCVT_SCANSET == 2 -static u_char scantokey[] = { -/* -0- -1- -2- -3- -4- -5- -6- -7- This layout is valid for US only */ -/*00*/ 0,120, 0,116,114,112,113,123, /* ?? F9 ?? F5 F3 F1 F2 F12 */ -/*08*/ 0,121,119,117,115, 16, 1, 0, /* ?? F10 F8 F6 F4 TAB ` ?? */ -/*10*/ 0, 60, 44, 0, 58, 17, 2, 0, /* ?? ALl SHl ?? CTl Q 1 ?? */ -/*18*/ 0, 0, 46, 32, 31, 18, 3, 0, /* ?? Z S A W 2 ?? ?? */ -/*20*/ 0, 48, 47, 33, 19, 5, 4, 0, /* ?? C X D E 4 3 ?? */ -/*28*/ 0, 61, 49, 34, 21, 20, 6, 0, /* ?? SP V F T R 5 ?? */ -/*30*/ 0, 51, 50, 36, 35, 22, 7, 0, /* ?? N B H G Y 6 ?? */ -/*38*/ 0, 0, 52, 37, 23, 8, 9, 0, /* ?? ?? M J U 7 8 ?? */ -/*40*/ 0, 53, 38, 24, 25, 11, 10, 0, /* ?? , K I O 0 9 ?? */ -/*48*/ 0, 54, 55, 39, 40, 26, 12, 0, /* ?? . / L ; P - ?? */ -/*50*/ 0, 0, 41, 0, 27, 13, 0, 0, /* ?? ?? " ?? [ = ?? ?? */ -/*58*/ 30, 57, 43, 28, 0, 29, 0, 0, /* CAP SHr ENT ] ?? \ ?? ?? */ -/*60*/ 0, 45, 0, 0, 0, 0, 15, 0, /* ?? NL1 ?? ?? ?? ?? BS ?? */ -/*68*/ 0, 93, 0, 92, 91, 0, 0, 0, /* ?? KP1 ?? KP4 KP7 ?? ?? ?? */ -/*70*/ 99,104, 98, 97,102, 96,110, 90, /* KP0 KP. KP2 KP5 KP6 KP8 ESC NUM */ -/*78*/ 122,106,103,105,100,101,125, 0, /* F11 KP+ KP3 KP- KP* KP9 LOC ?? */ -/*80*/ 0, 0, 0,118,127 /* ?? ?? ?? F7 SyRQ */ -}; - -static u_char extscantokey[] = { -/* -0- -1- -2- -3- -4- -5- -6- -7- This layout is valid for US only */ -/*00*/ 0,120, 0,116,114,112,113,123, /* ?? F9 ?? F5 F3 F1 F2 F12 */ -/*08*/ 0,121,119,117,115, 16, 1, 0, /* ?? F10 F8 F6 F4 TAB ` ?? */ -/*10*/ 0, 62,128, 0, 64, 17, 2, 0, /* ?? ALr vSh ?? CTr Q 1 ?? */ -/*18*/ 0, 0, 46, 32, 31, 18, 3, 0, /* ?? Z S A W 2 ?? ?? */ -/*20*/ 0, 48, 47, 33, 19, 5, 4, 0, /* ?? C X D E 4 3 ?? */ -/*28*/ 0, 61, 49, 34, 21, 20, 6, 0, /* ?? SP V F T R 5 ?? */ -/*30*/ 0, 51, 50, 36, 35, 22, 7, 0, /* ?? N B H G Y 6 ?? */ -/*38*/ 0, 0, 52, 37, 23, 8, 9, 0, /* ?? ?? M J U 7 8 ?? */ -/*40*/ 0, 53, 38, 24, 25, 11, 10, 0, /* ?? , K I O 0 9 ?? */ -/*48*/ 0, 54, 95, 39, 40, 26, 12, 0, /* ?? . KP/ L ; P - ?? */ -/*50*/ 0, 0, 41, 0, 27, 13, 0, 0, /* ?? ?? " ?? [ = ?? ?? */ -/*58*/ 30, 57,108, 28, 0, 29, 0, 0, /* CAP SHr KPE ] ?? \ ?? ?? */ -/*60*/ 0, 45, 0, 0, 0, 0, 15, 0, /* ?? NL1 ?? ?? ?? ?? BS ?? */ -/*68*/ 0, 81, 0, 79, 80, 0, 0, 0, /* ?? END ?? LA HOM ?? ?? ?? */ -/*70*/ 75, 76, 84, 97, 89, 83,110, 90, /* INS DEL DA KP5 RA UA ESC NUM */ -/*78*/ 122,106, 86,105,124, 85,126, 0, /* F11 KP+ PD KP- PSc PU Brk ?? */ -/*80*/ 0, 0, 0,118,127 /* ?? ?? ?? F7 SysRq */ -}; - -#else /* PCVT_SCANSET != 2 */ - -static u_char scantokey[] = { -/* -0- -1- -2- -3- -4- -5- -6- -7- This layout is valid for US only */ -/*00*/ 0,110, 2, 3, 4, 5, 6, 7, /* ?? ESC 1 2 3 4 5 6 */ -/*08*/ 8, 9, 10, 11, 12, 13, 15, 16, /* 7 8 9 0 - = BS TAB */ -/*10*/ 17, 18, 19, 20, 21, 22, 23, 24, /* Q W E R T Y U I */ -/*18*/ 25, 26, 27, 28, 43, 58, 31, 32, /* O P [ ] ENT CTl A S */ -/*20*/ 33, 34, 35, 36, 37, 38, 39, 40, /* D F G H J K L ; */ -/*28*/ 41, 1, 44, 29, 46, 47, 48, 49, /* ' ` SHl \ Z X C V */ -/*30*/ 50, 51, 52, 53, 54, 55, 57,100, /* B N M , . / SHr KP* */ -/*38*/ 60, 61, 30,112,113,114,115,116, /* ALl SP CAP F1 F2 F3 F4 F5 */ -/*40*/ 117,118,119,120,121, 90,125, 91, /* F6 F7 F8 F9 F10 NUM LOC KP7 */ -/*48*/ 96,101,105, 92, 97,102,106, 93, /* KP8 KP9 KP- KP4 KP5 KP6 KP+ KP1 */ -/*50*/ 98,103, 99,104,127, 0, 45,122, /* KP2 KP3 KP0 KP. SyRq?? NL1 F11 */ -/*58*/ 123 /* F12 */ -}; - -static u_char extscantokey[] = { -/* -0- -1- -2- -3- -4- -5- -6- -7- This layout is valid for US only */ -/*00*/ 0,110, 2, 3, 4, 5, 6, 7, /* ?? ESC 1 2 3 4 5 6 */ -/*08*/ 8, 9, 10, 11, 12, 13, 15, 16, /* 7 8 9 0 - = BS TAB */ -/*10*/ 17, 18, 19, 20, 21, 22, 23, 24, /* Q W E R T Y U I */ -/*18*/ 25, 26, 27, 28,108, 64, 31, 32, /* O P [ ] KPE CTr A S */ -/*20*/ 33, 34, 35, 36, 37, 38, 39, 40, /* D F G H J K L ; */ -/*28*/ 41, 1,128, 29, 46, 47, 48, 49, /* ' ` vSh \ Z X C V */ -/*30*/ 50, 51, 52, 53, 54, 95, 57,124, /* B N M , . KP/ SHr KP* */ -/*38*/ 62, 61, 30,112,113,114,115,116, /* ALr SP CAP F1 F2 F3 F4 F5 */ -/*40*/ 117,118,119,120,121, 90,126, 80, /* F6 F7 F8 F9 F10 NUM Brk HOM */ -/*48*/ 83, 85,105, 79, 97, 89,106, 81, /* UA PU KP- LA KP5 RA KP+ END */ -/*50*/ 84, 86, 75, 76, 0, 0, 45,122, /* DA PD INS DEL ?? ?? NL1 F11 */ -/*58*/ 123, /* F12 */ -}; -#endif /* PCVT_SCANSET == 2 */ - -static Keycap_def key2ascii[] = -{ - -#ifdef PCVT_ALT_ENH - -#define C (u_char *) -#define U (u_short) -#define V (void *) -#define S STR -#define F FNC -#define I IDX0 - -#define DFAULT {S, 0, C ""} - -/* DONT EVER OVERLOAD KEY 0, THIS IS A KEY THAT MUSTN'T EXIST */ - -/* type index unshift shift ctrl alt alt_shift alt_ctrl alt_ctrl_shift */ -/* -------------------------------------------------------------------------------------------------------------------------------------------------- */ -/* 0*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 1*/ KBD_ASCII, I, {S,1,C "`"}, {S,1,C "~"}, {S,1,C "`"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 2*/ KBD_ASCII, I, {S,1,C "1"}, {S,1,C "!"}, {S,1,C "1"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 3*/ KBD_ASCII, I, {S,1,C "2"}, {S,1,C "@"}, {S,1,C "\000"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 4*/ KBD_ASCII, I, {S,1,C "3"}, {S,1,C "#"}, {S,1,C "3"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 5*/ KBD_ASCII, I, {S,1,C "4"}, {S,1,C "$"}, {S,1,C "4"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 6*/ KBD_ASCII, I, {S,1,C "5"}, {S,1,C "%"}, {S,1,C "5"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 7*/ KBD_ASCII, I, {S,1,C "6"}, {S,1,C "^"}, {S,1,C "\036"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 8*/ KBD_ASCII, I, {S,1,C "7"}, {S,1,C "&"}, {S,1,C "7"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 9*/ KBD_ASCII, I, {S,1,C "8"}, {S,1,C "*"}, {S,1,C "9"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 10*/ KBD_ASCII, I, {S,1,C "9"}, {S,1,C "("}, {S,1,C "9"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 11*/ KBD_ASCII, I, {S,1,C "0"}, {S,1,C ")"}, {S,1,C "0"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 12*/ KBD_ASCII, I, {S,1,C "-"}, {S,1,C "_"}, {S,1,C "\037"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 13*/ KBD_ASCII, I, {S,1,C "="}, {S,1,C "+"}, {S,1,C "="}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 14*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 15*/ KBD_ASCII, I, {S,1,C "\177"}, {S,1,C "\010"}, {S,1,C "\177"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 16*/ KBD_ASCII, I, {S,1,C "\t"}, {S,1,C "\t"}, {S,1,C "\t"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 17*/ KBD_ASCII, I, {S,1,C "q"}, {S,1,C "Q"}, {S,1,C "\021"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 18*/ KBD_ASCII, I, {S,1,C "w"}, {S,1,C "W"}, {S,1,C "\027"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 19*/ KBD_ASCII, I, {S,1,C "e"}, {S,1,C "E"}, {S,1,C "\005"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 20*/ KBD_ASCII, I, {S,1,C "r"}, {S,1,C "R"}, {S,1,C "\022"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 21*/ KBD_ASCII, I, {S,1,C "t"}, {S,1,C "T"}, {S,1,C "\024"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 22*/ KBD_ASCII, I, {S,1,C "y"}, {S,1,C "Y"}, {S,1,C "\031"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 23*/ KBD_ASCII, I, {S,1,C "u"}, {S,1,C "U"}, {S,1,C "\025"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 24*/ KBD_ASCII, I, {S,1,C "i"}, {S,1,C "I"}, {S,1,C "\011"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 25*/ KBD_ASCII, I, {S,1,C "o"}, {S,1,C "O"}, {S,1,C "\017"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 26*/ KBD_ASCII, I, {S,1,C "p"}, {S,1,C "P"}, {S,1,C "\020"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 27*/ KBD_ASCII, I, {S,1,C "["}, {S,1,C "{"}, {S,1,C "\033"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 28*/ KBD_ASCII, I, {S,1,C "]"}, {S,1,C "}"}, {S,1,C "\035"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 29*/ KBD_ASCII, I, {S,1,C "\\"}, {S,1,C "|"}, {S,1,C "\034"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 30*/ KBD_CAPS, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 31*/ KBD_ASCII, I, {S,1,C "a"}, {S,1,C "A"}, {S,1,C "\001"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 32*/ KBD_ASCII, I, {S,1,C "s"}, {S,1,C "S"}, {S,1,C "\023"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 33*/ KBD_ASCII, I, {S,1,C "d"}, {S,1,C "D"}, {S,1,C "\004"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 34*/ KBD_ASCII, I, {S,1,C "f"}, {S,1,C "F"}, {S,1,C "\006"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 35*/ KBD_ASCII, I, {S,1,C "g"}, {S,1,C "G"}, {S,1,C "\007"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 36*/ KBD_ASCII, I, {S,1,C "h"}, {S,1,C "H"}, {S,1,C "\010"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 37*/ KBD_ASCII, I, {S,1,C "j"}, {S,1,C "J"}, {S,1,C "\n"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 38*/ KBD_ASCII, I, {S,1,C "k"}, {S,1,C "K"}, {S,1,C "\013"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 39*/ KBD_ASCII, I, {S,1,C "l"}, {S,1,C "L"}, {S,1,C "\014"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 40*/ KBD_ASCII, I, {S,1,C ";"}, {S,1,C ":"}, {S,1,C ";"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 41*/ KBD_ASCII, I, {S,1,C "'"}, {S,1,C "\""}, {S,1,C "'"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 42*/ KBD_ASCII, I, {S,1,C "\\"}, {S,1,C "|"}, {S,1,C "\034"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 43*/ KBD_RETURN,I, {S,1,C "\r"}, {S,1,C "\r"}, {S,1,C "\r"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 44*/ KBD_SHIFT, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 45*/ KBD_ASCII, I, {S,1,C "<"}, {S,1,C ">"}, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 46*/ KBD_ASCII, I, {S,1,C "z"}, {S,1,C "Z"}, {S,1,C "\032"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 47*/ KBD_ASCII, I, {S,1,C "x"}, {S,1,C "X"}, {S,1,C "\030"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 48*/ KBD_ASCII, I, {S,1,C "c"}, {S,1,C "C"}, {S,1,C "\003"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 49*/ KBD_ASCII, I, {S,1,C "v"}, {S,1,C "V"}, {S,1,C "\026"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 50*/ KBD_ASCII, I, {S,1,C "b"}, {S,1,C "B"}, {S,1,C "\002"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 51*/ KBD_ASCII, I, {S,1,C "n"}, {S,1,C "N"}, {S,1,C "\016"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 52*/ KBD_ASCII, I, {S,1,C "m"}, {S,1,C "M"}, {S,1,C "\r"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 53*/ KBD_ASCII, I, {S,1,C ","}, {S,1,C "<"}, {S,1,C ","}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 54*/ KBD_ASCII, I, {S,1,C "."}, {S,1,C ">"}, {S,1,C "."}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 55*/ KBD_ASCII, I, {S,1,C "/"}, {S,1,C "?"}, {S,1,C "/"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 56*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 57*/ KBD_SHIFT, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 58*/ KBD_CTL, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 59*/ KBD_ASCII, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 60*/ KBD_META, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -#if !PCVT_NULLCHARS -/* 61*/ KBD_ASCII, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -#else -/* 61*/ KBD_ASCII, I, DFAULT, DFAULT, {S,1,C "\000"}, DFAULT, DFAULT, DFAULT, DFAULT, -#endif /* PCVT_NULLCHARS */ -/* 62*/ KBD_META, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 63*/ KBD_ASCII, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 64*/ KBD_CTL, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 65*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 66*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 67*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 68*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 69*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 70*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 71*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 72*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 73*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 74*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 75*/ KBD_FUNC, I, {S,4,C "\033[2~"}, {S,4,C "\033[2~"}, {S,4,C "\033[2~"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 76*/ KBD_FUNC, I, {S,4,C "\033[3~"}, {S,4,C "\033[3~"}, {S,4,C "\033[3~"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 77*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 78*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 79*/ KBD_CURSOR,I, {S,4,C "\033[D"}, {S,4,C "\033OD"}, {S,4,C "\033[D"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 80*/ KBD_FUNC, I, {S,4,C "\033[1~"}, {S,4,C "\033[1~"}, {S,4,C "\033[1~"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 81*/ KBD_FUNC, I, {S,4,C "\033[4~"}, {S,4,C "\033[4~"}, {S,4,C "\033[4~"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 82*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 83*/ KBD_CURSOR,I, {S,4,C "\033[A"}, {S,4,C "\033OA"}, {S,4,C "\033[A"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 84*/ KBD_CURSOR,I, {S,4,C "\033[B"}, {S,4,C "\033OB"}, {S,4,C "\033[B"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 85*/ KBD_FUNC, I, {S,4,C "\033[5~"}, {S,4,C "\033[5~"}, {S,4,C "\033[5~"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 86*/ KBD_FUNC, I, {S,4,C "\033[6~"}, {S,4,C "\033[6~"}, {S,4,C "\033[6~"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 87*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 88*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 89*/ KBD_CURSOR,I, {S,3,C "\033[C"}, {S,3,C "\033OC"}, {S,3,C "\033[C"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 90*/ KBD_NUM, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 91*/ KBD_KP, I, {S,1,C "7"}, {S,2,C "\033Ow"}, {S,1,C "7"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 92*/ KBD_KP, I, {S,1,C "4"}, {S,2,C "\033Ot"}, {S,1,C "4"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 93*/ KBD_KP, I, {S,1,C "1"}, {S,2,C "\033Oq"}, {S,1,C "1"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 94*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/* 95*/ KBD_KP, I, {S,1,C "/"}, {S,1,C "/"}, {S,1,C "/"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 96*/ KBD_KP, I, {S,1,C "8"}, {S,2,C "\033Ox"}, {S,1,C "8"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 97*/ KBD_KP, I, {S,1,C "5"}, {S,2,C "\033Ou"}, {S,1,C "5"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 98*/ KBD_KP, I, {S,1,C "2"}, {S,2,C "\033Or"}, {S,1,C "2"}, DFAULT, DFAULT, DFAULT, DFAULT, -/* 99*/ KBD_KP, I, {S,1,C "0"}, {S,2,C "\033Op"}, {S,1,C "0"}, DFAULT, DFAULT, DFAULT, DFAULT, -/*100*/ KBD_KP, I, {S,1,C "*"}, {S,1,C "*"}, {S,1,C "*"}, DFAULT, DFAULT, DFAULT, DFAULT, -/*101*/ KBD_KP, I, {S,1,C "9"}, {S,2,C "\033Oy"}, {S,1,C "9"}, DFAULT, DFAULT, DFAULT, DFAULT, -/*102*/ KBD_KP, I, {S,1,C "6"}, {S,2,C "\033Ov"}, {S,1,C "6"}, DFAULT, DFAULT, DFAULT, DFAULT, -/*103*/ KBD_KP, I, {S,1,C "3"}, {S,2,C "\033Os"}, {S,1,C "3"}, DFAULT, DFAULT, DFAULT, DFAULT, -/*104*/ KBD_KP, I, {S,1,C "."}, {S,2,C "\033On"}, {S,1,C "."}, DFAULT, DFAULT, DFAULT, DFAULT, -/*105*/ KBD_KP, I, {S,1,C "-"}, {S,2,C "\033Om"}, {S,1,C "-"}, DFAULT, DFAULT, DFAULT, DFAULT, -/*106*/ KBD_KP, I, {S,1,C "+"}, {S,1,C "+"}, {S,1,C "+"}, DFAULT, DFAULT, DFAULT, DFAULT, -/*107*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/*108*/ KBD_RETURN,I, {S,1,C "\r"}, {S,2,C "\033OM"}, {S,1,C "\r"}, DFAULT, DFAULT, DFAULT, DFAULT, -/*109*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/*110*/ KBD_ASCII, I, {S,1,C "\033"}, {S,2,C "\033"}, {S,1,C "\033"}, DFAULT, DFAULT, DFAULT, DFAULT, -/*111*/ KBD_NONE, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/*112*/ KBD_FUNC, I, {F,0,V fkey1}, {F,0,V sfkey1}, {F,0,V cfkey1}, DFAULT, DFAULT, DFAULT, DFAULT, -/*113*/ KBD_FUNC, I, {F,0,V fkey2}, {F,0,V sfkey2}, {F,0,V cfkey2}, DFAULT, DFAULT, DFAULT, DFAULT, -/*114*/ KBD_FUNC, I, {F,0,V fkey3}, {F,0,V sfkey3}, {F,0,V cfkey3}, DFAULT, DFAULT, DFAULT, DFAULT, -/*115*/ KBD_FUNC, I, {F,0,V fkey4}, {F,0,V sfkey4}, {F,0,V cfkey4}, DFAULT, DFAULT, DFAULT, DFAULT, -/*116*/ KBD_FUNC, I, {F,0,V fkey5}, {F,0,V sfkey5}, {F,0,V cfkey5}, DFAULT, DFAULT, DFAULT, DFAULT, -/*117*/ KBD_FUNC, I, {F,0,V fkey6}, {F,0,V sfkey6}, {F,0,V cfkey6}, DFAULT, DFAULT, DFAULT, DFAULT, -/*118*/ KBD_FUNC, I, {F,0,V fkey7}, {F,0,V sfkey7}, {F,0,V cfkey7}, DFAULT, DFAULT, DFAULT, DFAULT, -/*119*/ KBD_FUNC, I, {F,0,V fkey8}, {F,0,V sfkey8}, {F,0,V cfkey8}, DFAULT, DFAULT, DFAULT, DFAULT, -/*120*/ KBD_FUNC, I, {F,0,V fkey9}, {F,0,V sfkey9}, {F,0,V cfkey9}, DFAULT, DFAULT, DFAULT, DFAULT, -/*121*/ KBD_FUNC, I, {F,0,V fkey10}, {F,0,V sfkey10}, {F,0,V cfkey10}, DFAULT, DFAULT, DFAULT, DFAULT, -/*122*/ KBD_FUNC, I, {F,0,V fkey11}, {F,0,V sfkey11}, {F,0,V cfkey11}, DFAULT, DFAULT, DFAULT, DFAULT, -/*123*/ KBD_FUNC, I, {F,0,V fkey12}, {F,0,V sfkey12}, {F,0,V cfkey12}, DFAULT, DFAULT, DFAULT, DFAULT, -/*124*/ KBD_KP, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/*125*/ KBD_SCROLL,I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/*126*/ KBD_BREAK, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, -/*127*/ KBD_FUNC, I, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, DFAULT, - -#undef C -#undef U -#undef V -#undef S -#undef F -#undef I -#undef DFLT -}; - -#else /* PCVT_ALT_ENH */ - -/* define some shorthands to make the table (almost) fit into 80 columns */ -#define C (u_char *) -#define V (void *) -#define S STR -#define F FNC -#define I IDX0 - -/* DONT EVER OVERLOAD KEY 0, THIS IS A KEY THAT MUSTN'T EXIST */ - -/* type index unshift shift ctrl */ -/* ---------------------------------------------------------- */ -/* 0*/ KBD_NONE, I, {S,C "df"}, {S,C ""}, {S,C ""}, -/* 1*/ KBD_ASCII, I, {S,C "`"}, {S,C "~"}, {S,C "`"}, -/* 2*/ KBD_ASCII, I, {S,C "1"}, {S,C "!"}, {S,C "1"}, -/* 3*/ KBD_ASCII, I, {S,C "2"}, {S,C "@"}, {S,C "\000"}, -/* 4*/ KBD_ASCII, I, {S,C "3"}, {S,C "#"}, {S,C "3"}, -/* 5*/ KBD_ASCII, I, {S,C "4"}, {S,C "$"}, {S,C "4"}, -/* 6*/ KBD_ASCII, I, {S,C "5"}, {S,C "%"}, {S,C "5"}, -/* 7*/ KBD_ASCII, I, {S,C "6"}, {S,C "^"}, {S,C "\036"}, -/* 8*/ KBD_ASCII, I, {S,C "7"}, {S,C "&"}, {S,C "7"}, -/* 9*/ KBD_ASCII, I, {S,C "8"}, {S,C "*"}, {S,C "8"}, -/* 10*/ KBD_ASCII, I, {S,C "9"}, {S,C "("}, {S,C "9"}, -/* 11*/ KBD_ASCII, I, {S,C "0"}, {S,C ")"}, {S,C "0"}, -/* 12*/ KBD_ASCII, I, {S,C "-"}, {S,C "_"}, {S,C "\037"}, -/* 13*/ KBD_ASCII, I, {S,C "="}, {S,C "+"}, {S,C "="}, -/* 14*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 15*/ KBD_ASCII, I, {S,C "\177"}, {S,C "\010"}, {S,C "\177"}, /* BS */ -/* 16*/ KBD_ASCII, I, {S,C "\t"}, {S,C "\t"}, {S,C "\t"}, /* TAB */ -/* 17*/ KBD_ASCII, I, {S,C "q"}, {S,C "Q"}, {S,C "\021"}, -/* 18*/ KBD_ASCII, I, {S,C "w"}, {S,C "W"}, {S,C "\027"}, -/* 19*/ KBD_ASCII, I, {S,C "e"}, {S,C "E"}, {S,C "\005"}, -/* 20*/ KBD_ASCII, I, {S,C "r"}, {S,C "R"}, {S,C "\022"}, -/* 21*/ KBD_ASCII, I, {S,C "t"}, {S,C "T"}, {S,C "\024"}, -/* 22*/ KBD_ASCII, I, {S,C "y"}, {S,C "Y"}, {S,C "\031"}, -/* 23*/ KBD_ASCII, I, {S,C "u"}, {S,C "U"}, {S,C "\025"}, -/* 24*/ KBD_ASCII, I, {S,C "i"}, {S,C "I"}, {S,C "\011"}, -/* 25*/ KBD_ASCII, I, {S,C "o"}, {S,C "O"}, {S,C "\017"}, -/* 26*/ KBD_ASCII, I, {S,C "p"}, {S,C "P"}, {S,C "\020"}, -/* 27*/ KBD_ASCII, I, {S,C "["}, {S,C "{"}, {S,C "\033"}, -/* 28*/ KBD_ASCII, I, {S,C "]"}, {S,C "}"}, {S,C "\035"}, -/* 29*/ KBD_ASCII, I, {S,C "\\"}, {S,C "|"}, {S,C "\034"}, -/* 30*/ KBD_CAPS, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 31*/ KBD_ASCII, I, {S,C "a"}, {S,C "A"}, {S,C "\001"}, -/* 32*/ KBD_ASCII, I, {S,C "s"}, {S,C "S"}, {S,C "\023"}, -/* 33*/ KBD_ASCII, I, {S,C "d"}, {S,C "D"}, {S,C "\004"}, -/* 34*/ KBD_ASCII, I, {S,C "f"}, {S,C "F"}, {S,C "\006"}, -/* 35*/ KBD_ASCII, I, {S,C "g"}, {S,C "G"}, {S,C "\007"}, -/* 36*/ KBD_ASCII, I, {S,C "h"}, {S,C "H"}, {S,C "\010"}, -/* 37*/ KBD_ASCII, I, {S,C "j"}, {S,C "J"}, {S,C "\n"}, -/* 38*/ KBD_ASCII, I, {S,C "k"}, {S,C "K"}, {S,C "\013"}, -/* 39*/ KBD_ASCII, I, {S,C "l"}, {S,C "L"}, {S,C "\014"}, -/* 40*/ KBD_ASCII, I, {S,C ";"}, {S,C ":"}, {S,C ";"}, -/* 41*/ KBD_ASCII, I, {S,C "'"}, {S,C "\""}, {S,C "'"}, -/* 42*/ KBD_ASCII, I, {S,C "\\"}, {S,C "|"}, {S,C "\034"}, /* special */ -/* 43*/ KBD_RETURN,I, {S,C "\r"}, {S,C "\r"}, {S,C "\r"}, /* RETURN */ -/* 44*/ KBD_SHIFT, I, {S,C ""}, {S,C ""}, {S,C ""}, /* SHIFT left */ -/* 45*/ KBD_ASCII, I, {S,C "<"}, {S,C ">"}, {S,C ""}, -/* 46*/ KBD_ASCII, I, {S,C "z"}, {S,C "Z"}, {S,C "\032"}, -/* 47*/ KBD_ASCII, I, {S,C "x"}, {S,C "X"}, {S,C "\030"}, -/* 48*/ KBD_ASCII, I, {S,C "c"}, {S,C "C"}, {S,C "\003"}, -/* 49*/ KBD_ASCII, I, {S,C "v"}, {S,C "V"}, {S,C "\026"}, -/* 50*/ KBD_ASCII, I, {S,C "b"}, {S,C "B"}, {S,C "\002"}, -/* 51*/ KBD_ASCII, I, {S,C "n"}, {S,C "N"}, {S,C "\016"}, -/* 52*/ KBD_ASCII, I, {S,C "m"}, {S,C "M"}, {S,C "\r"}, -/* 53*/ KBD_ASCII, I, {S,C ","}, {S,C "<"}, {S,C ","}, -/* 54*/ KBD_ASCII, I, {S,C "."}, {S,C ">"}, {S,C "."}, -/* 55*/ KBD_ASCII, I, {S,C "/"}, {S,C "?"}, {S,C "/"}, -/* 56*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 57*/ KBD_SHIFT, I, {S,C ""}, {S,C ""}, {S,C ""}, /* SHIFT right */ -/* 58*/ KBD_CTL, I, {S,C ""}, {S,C ""}, {S,C ""}, /* CTL left */ -/* 59*/ KBD_ASCII, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 60*/ KBD_META, I, {S,C ""}, {S,C ""}, {S,C ""}, /* ALT left */ -#if !PCVT_NULLCHARS -/* 61*/ KBD_ASCII, I, {S,C " "}, {S,C " "}, {S,C " "}, /* SPACE */ -#else -/* 61*/ KBD_ASCII, I, {S,C " "}, {S,C " "}, {S,C "\000"}, /* SPACE */ -#endif /* PCVT_NULLCHARS */ -/* 62*/ KBD_META, I, {S,C ""}, {S,C ""}, {S,C ""}, /* ALT right */ -/* 63*/ KBD_ASCII, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 64*/ KBD_CTL, I, {S,C ""}, {S,C ""}, {S,C ""}, /* CTL right */ -/* 65*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 66*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 67*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 68*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 69*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 70*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 71*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 72*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 73*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 74*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 75*/ KBD_FUNC, I, {S,C "\033[2~"},{S,C "\033[2~"},{S,C "\033[2~"},/* INS */ -/* 76*/ KBD_FUNC, I, {S,C "\033[3~"},{S,C "\033[3~"},{S,C "\033[3~"},/* DEL */ -/* 77*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 78*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 79*/ KBD_CURSOR,I, {S,C "\033[D"},{S,C "\033OD"},{S,C "\033[D"}, /* CU <- */ -/* 80*/ KBD_FUNC, I, {S,C "\033[1~"},{S,C "\033[1~"},{S,C "\033[1~"},/* HOME = FIND*/ -/* 81*/ KBD_FUNC, I, {S,C "\033[4~"},{S,C "\033[4~"},{S,C "\033[4~"},/* END = SELECT */ -/* 82*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 83*/ KBD_CURSOR,I, {S,C "\033[A"},{S,C "\033OA"},{S,C "\033[A"}, /* CU ^ */ -/* 84*/ KBD_CURSOR,I, {S,C "\033[B"},{S,C "\033OB"},{S,C "\033[B"}, /* CU v */ -/* 85*/ KBD_FUNC, I, {S,C "\033[5~"},{S,C "\033[5~"},{S,C "\033[5~"},/*PG UP*/ -/* 86*/ KBD_FUNC, I, {S,C "\033[6~"},{S,C "\033[6~"},{S,C "\033[6~"},/*PG DN*/ -/* 87*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 88*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 89*/ KBD_CURSOR,I, {S,C "\033[C"},{S,C "\033OC"},{S,C "\033[C"}, /* CU -> */ -/* 90*/ KBD_NUM, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 91*/ KBD_KP, I, {S,C "7"}, {S,C "\033Ow"},{S,C "7"}, -/* 92*/ KBD_KP, I, {S,C "4"}, {S,C "\033Ot"},{S,C "4"}, -/* 93*/ KBD_KP, I, {S,C "1"}, {S,C "\033Oq"},{S,C "1"}, -/* 94*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/* 95*/ KBD_KP, I, {S,C "/"}, {S,C "/"}, {S,C "/"}, -/* 96*/ KBD_KP, I, {S,C "8"}, {S,C "\033Ox"},{S,C "8"}, -/* 97*/ KBD_KP, I, {S,C "5"}, {S,C "\033Ou"},{S,C "5"}, -/* 98*/ KBD_KP, I, {S,C "2"}, {S,C "\033Or"},{S,C "2"}, -/* 99*/ KBD_KP, I, {S,C "0"}, {S,C "\033Op"},{S,C "0"}, -/*100*/ KBD_KP, I, {S,C "*"}, {S,C "*"}, {S,C "*"}, -/*101*/ KBD_KP, I, {S,C "9"}, {S,C "\033Oy"},{S,C "9"}, -/*102*/ KBD_KP, I, {S,C "6"}, {S,C "\033Ov"},{S,C "6"}, -/*103*/ KBD_KP, I, {S,C "3"}, {S,C "\033Os"},{S,C "3"}, -/*104*/ KBD_KP, I, {S,C "."}, {S,C "\033On"},{S,C "."}, -/*105*/ KBD_KP, I, {S,C "-"}, {S,C "\033Om"},{S,C "-"}, -/*106*/ KBD_KP, I, {S,C "+"}, {S,C "+"}, {S,C "+"}, -/*107*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/*108*/ KBD_RETURN,I, {S,C "\r"}, {S,C "\033OM"},{S,C "\r"}, /* KP ENTER */ -/*109*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/*110*/ KBD_ASCII, I, {S,C "\033"}, {S,C "\033"}, {S,C "\033"}, -/*111*/ KBD_NONE, I, {S,C ""}, {S,C ""}, {S,C ""}, -/*112*/ KBD_FUNC, I, {F,V fkey1}, {F,V sfkey1}, {F,V cfkey1}, /* F1 */ -/*113*/ KBD_FUNC, I, {F,V fkey2}, {F,V sfkey2}, {F,V cfkey2}, /* F2 */ -/*114*/ KBD_FUNC, I, {F,V fkey3}, {F,V sfkey3}, {F,V cfkey3}, /* F3 */ -/*115*/ KBD_FUNC, I, {F,V fkey4}, {F,V sfkey4}, {F,V cfkey4}, /* F4 */ -/*116*/ KBD_FUNC, I, {F,V fkey5}, {F,V sfkey5}, {F,V cfkey5}, /* F5 */ -/*117*/ KBD_FUNC, I, {F,V fkey6}, {F,V sfkey6}, {F,V cfkey6}, /* F6 */ -/*118*/ KBD_FUNC, I, {F,V fkey7}, {F,V sfkey7}, {F,V cfkey7}, /* F7 */ -/*119*/ KBD_FUNC, I, {F,V fkey8}, {F,V sfkey8}, {F,V cfkey8}, /* F8 */ -/*120*/ KBD_FUNC, I, {F,V fkey9}, {F,V sfkey9}, {F,V cfkey9}, /* F9 */ -/*121*/ KBD_FUNC, I, {F,V fkey10}, {F,V sfkey10}, {F,V cfkey10}, /* F10 */ -/*122*/ KBD_FUNC, I, {F,V fkey11}, {F,V sfkey11}, {F,V cfkey11}, /* F11 */ -/*123*/ KBD_FUNC, I, {F,V fkey12}, {F,V sfkey12}, {F,V cfkey12}, /* F12 */ -/*124*/ KBD_KP, I, {S,C ""}, {S,C ""}, {S,C ""}, -/*125*/ KBD_SCROLL,I, {S,C ""}, {S,C ""}, {S,C ""}, -/*126*/ KBD_BREAK, I, {S,C ""}, {S,C ""}, {S,C ""}, -/*127*/ KBD_FUNC, I, {S,C ""}, {S,C ""}, {S,C ""}, /* SysRq */ - -#undef C -#undef V -#undef S -#undef F -#undef I -}; - -#endif /* PCVT_ALT_ENH */ - -static short keypad2num[] = { - 7, 4, 1, -1, -1, 8, 5, 2, 0, -1, 9, 6, 3, -1, -1, -1, -1 -}; - -#if PCVT_USL_VT_COMPAT - -#define N_KEYNUMS 128 - -/* - * this is the reverse mapping from keynumbers to scanset 1 codes - * it is used to emulate the SysV-style GIO_KEYMAP ioctl cmd - */ - -static u_char key2scan1[N_KEYNUMS] = { - 0,0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, /* 0 */ - 0x0a,0x0b,0x0c,0x0d, 0,0x0e,0x0f,0x10,0x11,0x12, /* 10 */ - 0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x2b, /* 20 */ - 0x3a,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26, /* 30 */ - 0x27,0x28, 0,0x1c,0x2a,0x56,0x2c,0x2d,0x2e,0x2f, /* 40 */ - 0x30,0x31,0x32,0x33,0x34,0x35,0x56,0x36,0x1d, 0, /* 50 */ - 0x38,0x39, 0, 0, 0, 0, 0, 0, 0, 0, /* 60 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 70 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 */ - 0x45,0x47,0x4b,0x4f, 0, 0,0x48,0x4c,0x50,0x52, /* 90 */ - 0x37,0x49,0x4d,0x51,0x53,0x4a,0x4e, 0, 0, 0, /* 100 */ - 0x01, 0,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42, /* 110 */ - 0x43,0x44,0x57,0x58, 0,0x46, 0,0x54 /* 120 */ -}; - -/* - * SysV is brain-dead enough to stick on the IBM code page 437. So we - * have to translate our keymapping into IBM 437 (possibly losing keys), - * in order to have the X server convert it back into ISO8859.1 - */ - -/* NB: this table only contains the mapping for codes >= 128 */ - -static u_char iso2ibm437[] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0xff, 0xad, 0x9b, 0x9c, 0, 0x9d, 0, 0x40, - 0x6f, 0x63, 0x61, 0xae, 0, 0, 0, 0, - 0xf8, 0xf1, 0xfd, 0x33, 0, 0xe6, 0, 0xfa, - 0, 0x31, 0x6f, 0xaf, 0xac, 0xab, 0, 0xa8, - 0x41, 0x41, 0x41, 0x41, 0x8e, 0x8f, 0x92, 0x80, - 0x45, 0x90, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49, - 0x81, 0xa5, 0x4f, 0x4f, 0x4f, 0x4f, 0x99, 0x4f, - 0x4f, 0x55, 0x55, 0x55, 0x9a, 0x59, 0, 0xe1, - 0x85, 0xa0, 0x83, 0x61, 0x84, 0x86, 0x91, 0x87, - 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, - 0, 0xa4, 0x95, 0xa2, 0x93, 0x6f, 0x94, 0x6f, - 0x6f, 0x97, 0xa3, 0x96, 0x81, 0x98, 0, 0 -}; - -#endif /* PCVT_USL_VT_COMPAT */ - diff --git a/sys/i386/isa/pcvt/pcvt_out.c b/sys/i386/isa/pcvt/pcvt_out.c deleted file mode 100644 index 09cc75c..0000000 --- a/sys/i386/isa/pcvt/pcvt_out.c +++ /dev/null @@ -1,2182 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. - * - * Copyright (c) 1992, 1993 Brian Dunford-Shore. - * - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz and Don Ahn. - * - * 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_out.c, 3.20, Last Edit-Date: [Sun Apr 2 18:59:11 1995] - * - */ - -/*---------------------------------------------------------------------------* - * - * pcvt_out.c VT220 Terminal Emulator - * --------------------------------------- - * -hm ------------ Release 3.00 -------------- - * -hm integrating NetBSD-current patches - * -hm integrating patch from Thomas Gellekum - * -hm bugfix: clear last line when hpmode 28lines and force 24 - * -hm right fkey labels after soft/hard reset - * -hm patch from Joerg for comconsole operation - * -hm patch from Lon Willet to preserve the initial cursor shape - * -hm if FAT_CURSOR is defined, you get the old cursor type back .. - * -hm patch from Lon Willett regarding winsize settings - * -hm applying patch from Joerg fixing Crtat bug, non VGA startup bug - * -hm setting variable color for CGA and MDA/HGC in coldinit - * -hm fixing bug initializing cursor position on startup - * -hm fixing support for EGA boards in vt_coldinit() - * - *---------------------------------------------------------------------------*/ - -#include "vt.h" -#if NVT > 0 - -#define PCVT_INCLUDE_VT_SELATTR /* get inline function from pcvt_hdr.h */ - -#include <i386/isa/pcvt/pcvt_hdr.h> /* global include */ -#include <vm/vm.h> -#include <vm/vm_param.h> -#include <vm/pmap.h> - -extern u_short csd_ascii[]; /* pcvt_tbl.h */ -extern u_short csd_supplemental[]; - -static void write_char (struct video_state *svsp, int attrib, int ch); -static void check_scroll ( struct video_state *svsp ); -static void hp_entry ( U_char ch, struct video_state *svsp ); -static void vt_coldinit ( void ); -static void wrfkl ( int num, u_char *string, struct video_state *svsp ); -static void writefkl ( int num, u_char *string, struct video_state *svsp ); - - -/*---------------------------------------------------------------------------* - * do character set transformation and write to display memory (inline) - *---------------------------------------------------------------------------*/ - -#define video (svsp->Crtat + svsp->cur_offset) - -static __inline void write_char (svsp, attrib, ch) -struct video_state *svsp; -u_short attrib, ch; /* XXX inefficient interface */ -{ - if ((ch >= 0x20) && (ch <= 0x7f)) /* use GL if ch >= 0x20 */ - { - if(!svsp->ss) /* single shift G2/G3 -> GL ? */ - { - *video = attrib | (*svsp->GL)[ch-0x20]; - } - else - { - *video = attrib | (*svsp->Gs)[ch-0x20]; - svsp->ss = 0; - } - } - else - { - svsp->ss = 0; - - if(ch >= 0x80) /* display controls C1 */ - { - if(ch >= 0xA0) /* use GR if ch >= 0xA0 */ - { - *video = attrib | (*svsp->GR)[ch-0xA0]; - } - else - { - if(vgacs[svsp->vga_charset].secondloaded) - { - *video = attrib | ((ch-0x60) | CSH); - } - else /* use normal ibm charset for - control display */ - { - *video = attrib | ch; - } - } - } - else /* display controls C0 */ - { - if(vgacs[svsp->vga_charset].secondloaded) - { - *video = attrib | (ch | CSH); - } - else /* use normal ibm charset for control display*/ - { - *video = attrib | ch; - } - } - } -} - -/*---------------------------------------------------------------------------* - * emulator main entry - *---------------------------------------------------------------------------*/ -void -sput (u_char *s, U_char kernel, int len, int page) -{ - register struct video_state *svsp; - u_short attrib; - u_short ch; - - if(page >= PCVT_NSCREENS) /* failsafe */ - page = 0; - - svsp = &vs[page]; /* pointer to current screen state */ - - if(do_initialization) /* first time called ? */ - vt_coldinit(); /* yes, we have to init ourselves */ - - if(svsp == vsp) /* on current displayed page ? */ - { - cursor_pos_valid = 0; /* do not update cursor */ - -#if PCVT_SCREENSAVER - if(scrnsv_active) /* screen blanked ? */ - pcvt_scrnsv_reset(); /* unblank NOW ! */ - else - reset_screen_saver = 1; /* do it asynchronously */ -#endif /* PCVT_SCREENSAVER */ - - } - - attrib = kernel ? kern_attr : svsp->c_attr; - - while (len-- > 0) - if (ch = *(s++)) - { - if(svsp->sevenbit) - ch &= 0x7f; - - if(((ch <= 0x1f) || (ch == 0x7f)) && (svsp->transparent == 0)) - { - - /* always process control-chars in the range 0x00..0x1f, 0x7f !!! */ - - if(svsp->dis_fnc) - { - if(svsp->lastchar && svsp->m_awm - && (svsp->lastrow == svsp->row)) - { - svsp->cur_offset++; - svsp->col = 0; - svsp->lastchar = 0; - check_scroll(svsp); - } - - if(svsp->irm) - bcopy((svsp->Crtat + svsp->cur_offset), - (svsp->Crtat + svsp->cur_offset) + 1, - (((svsp->maxcol)-1) - svsp->col)*CHR); - - write_char(svsp, attrib, ch); - - vt_selattr(svsp); - - if(svsp->col >= ((svsp->maxcol)-1) - && ch != 0x0a && ch != 0x0b && ch != 0x0c) - { - svsp->lastchar = 1; - svsp->lastrow = svsp->row; - } - else if(ch == 0x0a || ch == 0x0b || ch == 0x0c) - { - svsp->cur_offset -= svsp->col; - svsp->cur_offset += svsp->maxcol; - svsp->col = 0; - svsp->lastchar = 0; - check_scroll(svsp); /* check scroll up */ - } - else - { - svsp->cur_offset++; - svsp->col++; - svsp->lastchar = 0; - } - } - else - { - switch(ch) - { - case 0x00: /* NUL */ - case 0x01: /* SOH */ - case 0x02: /* STX */ - case 0x03: /* ETX */ - case 0x04: /* EOT */ - case 0x05: /* ENQ */ - case 0x06: /* ACK */ - break; - - case 0x07: /* BEL */ - if(svsp->bell_on) - sysbeep(PCVT_SYSBEEPF/1500, hz/4); - break; - - case 0x08: /* BS */ - if(svsp->col > 0) - { - svsp->cur_offset--; - svsp->col--; - } - break; - - case 0x09: /* TAB */ - while(svsp->col < ((svsp->maxcol)-1)) - { - svsp->cur_offset++; - if(svsp-> - tab_stops[++svsp->col]) - break; - } - break; - - case 0x0a: /* LF */ - case 0x0b: /* VT */ - case 0x0c: /* FF */ - if(svsp->lnm) - { - svsp->cur_offset -= svsp->col; - svsp->cur_offset += - svsp->maxcol; - svsp->col = 0; - } - else - { - svsp->cur_offset += - svsp->maxcol; - } - check_scroll(svsp); - break; - - case 0x0d: /* CR */ - svsp->cur_offset -= svsp->col; - svsp->col = 0; - break; - - case 0x0e: /* SO */ - svsp->GL = &svsp->G1; - break; - - case 0x0f: /* SI */ - svsp->GL = &svsp->G0; - break; - - case 0x10: /* DLE */ - case 0x11: /* DC1/XON */ - case 0x12: /* DC2 */ - case 0x13: /* DC3/XOFF */ - case 0x14: /* DC4 */ - case 0x15: /* NAK */ - case 0x16: /* SYN */ - case 0x17: /* ETB */ - break; - - case 0x18: /* CAN */ - svsp->state = STATE_INIT; - clr_parms(svsp); - break; - - case 0x19: /* EM */ - break; - - case 0x1a: /* SUB */ - svsp->state = STATE_INIT; - clr_parms(svsp); - break; - - case 0x1b: /* ESC */ - svsp->state = STATE_ESC; - clr_parms(svsp); - break; - - case 0x1c: /* FS */ - case 0x1d: /* GS */ - case 0x1e: /* RS */ - case 0x1f: /* US */ - case 0x7f: /* DEL */ - break; - } - } - } - else - { - - /* char range 0x20...0x73, 0x80...0xff processing */ - /* depends on current state */ - - switch(svsp->state) - { - case STATE_INIT: - if(svsp->lastchar && svsp->m_awm && - (svsp->lastrow == svsp->row)) - { - svsp->cur_offset++; - svsp->col = 0; - svsp->lastchar = 0; - check_scroll(svsp); - } - - if(svsp->irm) - bcopy ((svsp->Crtat - + svsp->cur_offset), - (svsp->Crtat - + svsp->cur_offset) + 1, - (((svsp->maxcol)-1) - - svsp->col) * CHR); - - write_char(svsp, attrib, ch); - - vt_selattr(svsp); - - if(svsp->col >= ((svsp->maxcol)-1)) - { - svsp->lastchar = 1; - svsp->lastrow = svsp->row; - } - else - { - svsp->lastchar = 0; - svsp->cur_offset++; - svsp->col++; - } - break; - - case STATE_ESC: - switch(ch) - { - case ' ': /* ESC sp family */ - svsp->state = STATE_BLANK; - break; - - case '#': /* ESC # family */ - svsp->state = STATE_HASH; - break; - - case '&': /* ESC & family (HP) */ - if(svsp->vt_pure_mode == - M_HPVT) - { - svsp->state = - STATE_AMPSND; - svsp->hp_state = - SHP_INIT; - } - else - svsp->state = - STATE_INIT; - break; - - case '(': /* ESC ( family */ - svsp->state = STATE_BROPN; - break; - - case ')': /* ESC ) family */ - svsp->state = STATE_BRCLO; - break; - - case '*': /* ESC * family */ - svsp->state = STATE_STAR; - break; - - case '+': /* ESC + family */ - svsp->state = STATE_PLUS; - break; - - case '-': /* ESC - family */ - svsp->state = STATE_MINUS; - break; - - case '.': /* ESC . family */ - svsp->state = STATE_DOT; - break; - - case '/': /* ESC / family */ - svsp->state = STATE_SLASH; - break; - - case '7': /* SAVE CURSOR */ - vt_sc(svsp); - svsp->state = STATE_INIT; - break; - - case '8': /* RESTORE CURSOR */ - vt_rc(svsp); - if (!kernel) - attrib = svsp->c_attr; - svsp->state = STATE_INIT; - break; - - case '=': /* keypad application mode */ -#if !PCVT_INHIBIT_NUMLOCK - vt_keyappl(svsp); -#endif - svsp->state = STATE_INIT; - break; - - case '>': /* keypad numeric mode */ -#if !PCVT_INHIBIT_NUMLOCK - vt_keynum(svsp); -#endif - svsp->state = STATE_INIT; - break; - - case 'D': /* INDEX */ - vt_ind(svsp); - svsp->state = STATE_INIT; - break; - - case 'E': /* NEXT LINE */ - vt_nel(svsp); - svsp->state = STATE_INIT; - break; - - case 'H': /* set TAB at current col */ - svsp->tab_stops[svsp->col] = 1; - svsp->state = STATE_INIT; - break; - - case 'M': /* REVERSE INDEX */ - vt_ri(svsp); - svsp->state = STATE_INIT; - break; - - case 'N': /* SINGLE SHIFT G2 */ - svsp->Gs = &svsp->G2; - svsp->ss = 1; - svsp->state = STATE_INIT; - break; - - case 'O': /* SINGLE SHIFT G3 */ - svsp->Gs = &svsp->G3; - svsp->ss = 1; - svsp->state = STATE_INIT; - break; - - case 'P': /* DCS detected */ - svsp->dcs_state = DCS_INIT; - svsp->state = STATE_DCS; - break; - - case 'Z': /* What are you = ESC [ c */ - vt_da(svsp); - svsp->state = STATE_INIT; - break; - - case '[': /* CSI detected */ - clr_parms(svsp); - svsp->state = STATE_CSI; - break; - - case '\\': /* String Terminator */ - svsp->state = STATE_INIT; - break; - - case 'c': /* hard reset */ - vt_ris(svsp); - if (!kernel) - attrib = svsp->c_attr; - svsp->state = STATE_INIT; - break; - -#if PCVT_SETCOLOR - case 'd': /* set color sgr */ - if(color) - { - /* set shiftwidth=4 */ - sgr_tab_color - [svsp-> - vtsgr] = - svsp->c_attr - >> 8; - user_attr = - sgr_tab_color - [0] << 8; - } - svsp->state = STATE_INIT; - break; -#endif /* PCVT_SETCOLOR */ - case 'n': /* Lock Shift G2 -> GL */ - svsp->GL = &svsp->G2; - svsp->state = STATE_INIT; - break; - - case 'o': /* Lock Shift G3 -> GL */ - svsp->GL = &svsp->G3; - svsp->state = STATE_INIT; - break; - - case '}': /* Lock Shift G2 -> GR */ - svsp->GR = &svsp->G2; - svsp->state = STATE_INIT; - break; - - case '|': /* Lock Shift G3 -> GR */ - svsp->GR = &svsp->G3; - svsp->state = STATE_INIT; - break; - - case '~': /* Lock Shift G1 -> GR */ - svsp->GR = &svsp->G1; - svsp->state = STATE_INIT; - break; - - default: - svsp->state = STATE_INIT; - break; - } - break; - - case STATE_BLANK: /* ESC space [FG], which are */ - svsp->state = STATE_INIT; /* currently ignored*/ - break; - - case STATE_HASH: - switch(ch) - { - case '3': /* double height top half */ - case '4': /*double height bottom half*/ - case '5': /*single width sngle height*/ - case '6': /*double width sngle height*/ - svsp->state = STATE_INIT; - break; - - case '8': /* fill sceen with 'E's */ - vt_aln(svsp); - svsp->state = STATE_INIT; - break; - - default: /* anything else */ - svsp->state = STATE_INIT; - break; - } - break; - - case STATE_BROPN: /* designate G0 */ - case STATE_BRCLO: /* designate G1 */ - case STATE_STAR: /* designate G2 */ - case STATE_PLUS: /* designate G3 */ - case STATE_MINUS: /* designate G1 (96) */ - case STATE_DOT: /* designate G2 (96) */ - case STATE_SLASH: /* designate G3 (96) */ - svsp->which[svsp->whichi++] = ch; - if(ch >= 0x20 && ch <= 0x2f - && svsp->whichi <= 2) - break; - else if(ch >=0x30 && ch <= 0x7e) - { - svsp->which[svsp->whichi] = '\0'; - vt_designate(svsp); - } - svsp->whichi = 0; - svsp->state = STATE_INIT; - break; - - case STATE_CSIQM: /* DEC private modes */ - switch(ch) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': /* parameters */ - svsp->parms[svsp->parmi] *= 10; - svsp->parms[svsp->parmi] += - (ch -'0'); - break; - - case ';': /* next parameter */ - svsp->parmi = - (svsp->parmi+1 < MAXPARMS) ? - svsp->parmi+1 : svsp->parmi; - break; - - case 'h': /* set mode */ - vt_set_dec_priv_qm(svsp); - svsp->state = STATE_INIT; - break; - - case 'l': /* reset mode */ - vt_reset_dec_priv_qm(svsp); - svsp->state = STATE_INIT; - break; - - case 'n': /* Reports */ - vt_dsr(svsp); - svsp->state = STATE_INIT; - break; - - case 'K': /* selective erase in line */ - vt_sel(svsp); - svsp->state = STATE_INIT; - break; - - case 'J':/*selective erase in display*/ - vt_sed(svsp); - svsp->state = STATE_INIT; - break; - - default: - svsp->state = STATE_INIT; - break; - - } - break; - - case STATE_CSI: - switch(ch) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': /* parameters */ - svsp->parms[svsp->parmi] *= 10; - svsp->parms[svsp->parmi] += - (ch -'0'); - break; - - case ';': /* next parameter */ - svsp->parmi = - (svsp->parmi+1 < MAXPARMS) ? - svsp->parmi+1 : svsp->parmi; - break; - - case '?': /* ESC [ ? family */ - svsp->state = STATE_CSIQM; - break; - - case '@': /* insert char */ - vt_ic(svsp); - svsp->state = STATE_INIT; - break; - - case '"': /* select char attribute */ - svsp->state = STATE_SCA; - break; - - case '\'': /* for DECELR/DECSLE */ -/* XXX */ /* another state needed -hm */ - break; - - case '!': /* soft terminal reset */ - svsp->state = STATE_STR; - break; - - case 'A': /* cursor up */ - vt_cuu(svsp); - svsp->state = STATE_INIT; - break; - - case 'B': /* cursor down */ - vt_cud(svsp); - svsp->state = STATE_INIT; - break; - - case 'C': /* cursor forward */ - vt_cuf(svsp); - svsp->state = STATE_INIT; - break; - - case 'D': /* cursor backward */ - vt_cub(svsp); - svsp->state = STATE_INIT; - break; - - case 'H': /* direct cursor addressing*/ - vt_curadr(svsp); - svsp->state = STATE_INIT; - break; - - case 'J': /* erase screen */ - vt_clreos(svsp); - svsp->state = STATE_INIT; - break; - - case 'K': /* erase line */ - vt_clreol(svsp); - svsp->state = STATE_INIT; - break; - - case 'L': /* insert line */ - vt_il(svsp); - svsp->state = STATE_INIT; - break; - - case 'M': /* delete line */ - vt_dl(svsp); - svsp->state = STATE_INIT; - break; - - case 'P': /* delete character */ - vt_dch(svsp); - svsp->state = STATE_INIT; - break; - - case 'S': /* scroll up */ - vt_su(svsp); - svsp->state = STATE_INIT; - break; - - case 'T': /* scroll down */ - vt_sd(svsp); - svsp->state = STATE_INIT; - break; - - case 'X': /* erase character */ - vt_ech(svsp); - svsp->state = STATE_INIT; - break; - - case 'c': /* device attributes */ - vt_da(svsp); - svsp->state = STATE_INIT; - break; - - case 'f': /* direct cursor addressing*/ - vt_curadr(svsp); - svsp->state = STATE_INIT; - break; - - case 'g': /* clear tabs */ - vt_clrtab(svsp); - svsp->state = STATE_INIT; - break; - - case 'h': /* set mode(s) */ - vt_set_ansi(svsp); - svsp->state = STATE_INIT; - break; - - case 'i': /* media copy */ - vt_mc(svsp); - svsp->state = STATE_INIT; - break; - - case 'l': /* reset mode(s) */ - vt_reset_ansi(svsp); - svsp->state = STATE_INIT; - break; - - case 'm': /* select graphic rendition*/ - vt_sgr(svsp); - if (!kernel) - attrib = svsp->c_attr; - svsp->state = STATE_INIT; - break; - - case 'n': /* reports */ - vt_dsr(svsp); - svsp->state = STATE_INIT; - break; - - case 'r': /* set scrolling region */ - vt_stbm(svsp); - svsp->state = STATE_INIT; - break; - - case 'x': /*request/report parameters*/ - vt_reqtparm(svsp); - svsp->state = STATE_INIT; - break; - - case 'y': /* invoke selftest(s) */ - vt_tst(svsp); - svsp->state = STATE_INIT; - break; - - case 'z': /* DECELR, ignored */ - case '{': /* DECSLE, ignored */ - svsp->state = STATE_INIT; - break; - - default: - svsp->state = STATE_INIT; - break; - } - break; - - case STATE_AMPSND: - hp_entry(ch,svsp); - break; - - case STATE_DCS: - vt_dcsentry(ch,svsp); - break; - - case STATE_SCA: - switch(ch) - { - case 'q': - vt_sca(svsp); - svsp->state = STATE_INIT; - break; - - default: - svsp->state = STATE_INIT; - break; - } - break; - - case STATE_STR: - switch(ch) - { - case 'p': /* soft terminal reset */ - vt_str(svsp); - if (!kernel) - attrib = svsp->c_attr; - svsp->state = STATE_INIT; - break; - - default: - svsp->state = STATE_INIT; - break; - } - break; - - default: /* failsafe */ - svsp->state = STATE_INIT; - break; - - } - } - - svsp->row = svsp->cur_offset / svsp->maxcol; /* current row update */ - - /* take care of last character on line behaviour */ - - if(svsp->lastchar && (svsp->col < ((svsp->maxcol)-1))) - svsp->lastchar = 0; - } - - if(svsp == vsp) /* on current displayed page ? */ - cursor_pos_valid = 1; /* position is valid now */ -} - -/*---------------------------------------------------------------------------* - * this is the absolute cold initialization of the emulator - *---------------------------------------------------------------------------*/ -static void -vt_coldinit(void) -{ - u_short volatile *cp; - u_short was; - int nscr, charset; - int equipment; - u_short *SaveCrtat; - struct video_state *svsp; - - Crtat = (u_short *)MONO_BUF; /* XXX assume static relocation works */ - SaveCrtat = Crtat; - cp = Crtat + (CGA_BUF-MONO_BUF)/CHR; - - do_initialization = 0; /* reset init necessary flag */ - - /* get the equipment byte from the RTC chip */ - - equipment = ((rtcin(RTC_EQUIPMENT)) >> 4) & 0x03; - - switch(equipment) - { - case EQ_EGAVGA: - - /* set memory start to CGA == B8000 */ - - Crtat = Crtat + (CGA_BUF-MONO_BUF)/CHR; - - /* find out, what monitor is connected */ - - was = *cp; - *cp = (u_short) 0xA55A; - if (*cp != 0xA55A) - { - addr_6845 = MONO_BASE; - color = 0; - } - else - { - *cp = was; - addr_6845 = CGA_BASE; - color = 1; - } - - if(vga_test()) /* EGA or VGA ? */ - { - adaptor_type = VGA_ADAPTOR; - totalfonts = 8; - - if(color == 0) - { - mda2egaorvga(); - Crtat = SaveCrtat; /* mono start */ - } - - /* find out which chipset we are running on */ - vga_type = vga_chipset(); - } - else - { - adaptor_type = EGA_ADAPTOR; - totalfonts = 4; - - if(color == 0) - { - mda2egaorvga(); - Crtat = SaveCrtat; /* mono start */ - } - } - - /* decouple ega/vga charsets and intensity */ - set_2ndcharset(); - - break; - - case EQ_40COLOR: /* XXX should panic in 40 col mode ! */ - case EQ_80COLOR: - Crtat = Crtat + (CGA_BUF-MONO_BUF)/CHR; - addr_6845 = CGA_BASE; - adaptor_type = CGA_ADAPTOR; - color = 1; - totalfonts = 0; - break; - - case EQ_80MONO: - addr_6845 = MONO_BASE; - adaptor_type = MDA_ADAPTOR; - color = 0; - totalfonts = 0; - break; - } - - /* establish default colors */ - - if(color) - { - kern_attr = (COLOR_KERNEL_FG | COLOR_KERNEL_BG) << 8; - user_attr = sgr_tab_color[0] << 8; - } - else - { - kern_attr = (MONO_KERNEL_FG | MONO_KERNEL_BG) << 8; - if(adaptor_type == MDA_ADAPTOR) - user_attr = sgr_tab_imono[0] << 8; - else - user_attr = sgr_tab_mono[0] << 8; - } - - totalscreens = 1; /* for now until malloced */ - - for(nscr = 0, svsp = vs; nscr < PCVT_NSCREENS; nscr++, svsp++) - { - svsp->Crtat = Crtat; /* all same until malloc'ed */ - svsp->Memory = Crtat; /* until malloc'ed */ - svsp->cur_offset = 0; /* cursor offset */ - svsp->c_attr = user_attr; /* non-kernel attributes */ - svsp->bell_on = 1; /* enable bell */ - svsp->sevenbit = 0; /* set to 8-bit path */ - svsp->dis_fnc = 0; /* disable display functions */ - svsp->transparent = 0; /* disable internal tranparency */ - svsp->lastchar = 0; /* VTxxx behaviour of last */ - /* char on line */ - svsp->report_chars = NULL; /* VTxxx reports init */ - svsp->report_count = 0; /* VTxxx reports init */ - svsp->state = STATE_INIT; /* main state machine init */ - svsp->m_awm = 1; /* enable auto wrap mode */ - svsp->m_om = 0; /* origin mode = absolute */ - svsp->sc_flag = 0; /* init saved cursor flag */ - svsp->which_fkl = SYS_FKL; /* display system fkey-labels */ - svsp->labels_on = 1; /* if in HP-mode, display */ - /* fkey-labels */ - svsp->attribute = 0; /* HP mode init */ - svsp->key = 0; /* HP mode init */ - svsp->l_len = 0; /* HP mode init */ - svsp->s_len = 0; /* HP mode init */ - svsp->m_len = 0; /* HP mode init */ - svsp->i = 0; /* HP mode init */ - svsp->vt_pure_mode = M_PUREVT; /* initial mode: pure VT220*/ - svsp->vga_charset = CH_SET0; /* use bios default charset */ - -#if PCVT_24LINESDEF /* true compatibility */ - svsp->screen_rows = 24; /* default 24 rows on screen */ -#else /* full screen */ - svsp->screen_rows = 25; /* default 25 rows on screen */ -#endif /* PCVT_24LINESDEF */ - - svsp->screen_rowsize = 25; /* default 25 rows on screen */ - svsp->scrr_beg = 0; /* scrolling region begin row*/ - svsp->scrr_len = svsp->screen_rows; /* scrolling region length*/ - svsp->scrr_end = svsp->scrr_len - 1;/* scrolling region end */ - - if(nscr == 0) - { - if(adaptor_type == VGA_ADAPTOR) - { - /* only VGA can read cursor shape registers ! */ - /* Preserve initial cursor shape */ - outb(addr_6845,CRTC_CURSTART); - svsp->cursor_start = inb(addr_6845+1); - outb(addr_6845,CRTC_CUREND); - svsp->cursor_end = inb(addr_6845+1); - } - else - { - /* MDA,HGC,CGA,EGA registers are write-only */ - svsp->cursor_start = 0; - svsp->cursor_end = 15; - } - } - else - { - svsp->cursor_start = vs[0].cursor_start; - svsp->cursor_end = vs[0].cursor_end; - } - -#ifdef FAT_CURSOR - svsp->cursor_start = 0; - svsp->cursor_end = 15; /* cursor lower scanline */ -#endif - - svsp->cursor_on = 1; /* cursor is on */ - svsp->ckm = 1; /* normal cursor key mode */ - svsp->irm = 0; /* replace mode */ - svsp->lnm = 0; /* CR only */ - svsp->selchar = 0; /* selective attribute off */ - svsp->G0 = csd_ascii; /* G0 = ascii */ - svsp->G1 = csd_ascii; /* G1 = ascii */ - svsp->G2 = csd_supplemental; /* G2 = supplemental */ - svsp->G3 = csd_supplemental; /* G3 = supplemental */ - svsp->GL = &svsp->G0; /* GL = G0 */ - svsp->GR = &svsp->G2; /* GR = G2 */ - svsp->whichi = 0; /* char set designate init */ - svsp->which[0] = '\0'; /* char set designate init */ - svsp->hp_state = SHP_INIT; /* init HP mode state machine*/ - svsp->dcs_state = DCS_INIT; /* init DCS mode state machine*/ - svsp->ss = 0; /* init single shift 2/3 */ - svsp->Gs = NULL; /* Gs single shift 2/3 */ - svsp->maxcol = SCR_COL80; /* 80 columns now (MUST!!!) */ - svsp->wd132col = 0; /* help good old WD .. */ - svsp->scroll_lock = 0; /* scrollock off */ - -#if PCVT_INHIBIT_NUMLOCK - svsp->num_lock = 0; /* numlock off */ -#else - svsp->num_lock = 1; /* numlock on */ -#endif - - svsp->caps_lock = 0; /* capslock off */ - svsp->shift_lock = 0; /* shiftlock off */ - -#if PCVT_24LINESDEF /* true compatibility */ - svsp->force24 = 1; /* force 24 lines */ -#else /* maximum screen size */ - svsp->force24 = 0; /* no 24 lines force yet */ -#endif /* PCVT_24LINESDEF */ - - vt_clearudk(svsp); /* clear vt220 udk's */ - - vt_str(svsp); /* init emulator */ - - if(nscr == 0) - { - /* - * Preserve data on the startup screen that - * precedes the cursor position. Leave the - * cursor where it was found. - */ - unsigned cursorat; - int filllen; - - /* CRTC regs 0x0e and 0x0f are r/w everywhere */ - - outb(addr_6845, CRTC_CURSORH); - cursorat = inb(addr_6845+1) << 8; - outb(addr_6845, CRTC_CURSORL); - cursorat |= inb(addr_6845+1); - - /* - * Reject cursors that are more than one row off a - * 25-row screen. syscons sets the cursor offset - * to 0xffff. The scroll up fixup fails for this - * because the assignment to svsp->row overflows - * and perhaps for other reasons. - */ - if (cursorat > 25 * svsp->maxcol) - cursorat = 25 * svsp->maxcol; - - svsp->cur_offset = cursorat; - svsp->row = cursorat / svsp->maxcol; - svsp->col = cursorat % svsp->maxcol; - - if (svsp->row >= svsp->screen_rows) - { - - /* - * Scroll up; this should only happen when - * PCVT_24LINESDEF is set - */ - int nscroll = - svsp->row + 1 - - svsp->screen_rows; - bcopy (svsp->Crtat - + nscroll*svsp->maxcol, - svsp->Crtat, - svsp->screen_rows - * svsp->maxcol * CHR); - svsp->row -= nscroll; - svsp->cur_offset -= - nscroll * svsp->maxcol; - } - - filllen = (svsp->maxcol * svsp->screen_rowsize) - - svsp->cur_offset; - - if (filllen > 0) - fillw(user_attr | ' ', - svsp->Crtat+svsp->cur_offset, - filllen); - } - -#if PCVT_USL_VT_COMPAT - svsp->smode.mode = VT_AUTO; - svsp->smode.relsig = svsp->smode.acqsig = - svsp->smode.frsig = 0; - svsp->proc = 0; - svsp->pid = svsp->vt_status = 0; -#endif /* PCVT_USL_VT_COMPAT */ - - } - - for(charset = 0;charset < NVGAFONTS;charset++) - { - vgacs[charset].loaded = 0; /* not populated yet */ - vgacs[charset].secondloaded = 0; /* not populated yet */ - - switch(adaptor_type) - { - case VGA_ADAPTOR: - - /* - * for a VGA, do not assume any - * constant - instead, read the actual - * values. This avoid problems with - * LCD displays that apparently happen - * to use font matrices up to 19 - * scan lines and 475 scan lines - * total in order to make use of the - * whole screen area - */ - - outb(addr_6845, CRTC_VDE); - vgacs[charset].scr_scanlines = - inb(addr_6845 + 1); - outb(addr_6845, CRTC_MAXROW); - vgacs[charset].char_scanlines = - inb(addr_6845 + 1); - break; - - case EGA_ADAPTOR: - /* 0x5D for 25 lines */ - vgacs[charset].scr_scanlines = 0x5D; - /* 0x4D for 25 lines */ - vgacs[charset].char_scanlines = 0x4D; - break; - - case CGA_ADAPTOR: - case MDA_ADAPTOR: - default: - /* These shouldn't be used for CGA/MDA */ - vgacs[charset].scr_scanlines = 0; - vgacs[charset].char_scanlines = 0; - break; - } - vgacs[charset].screen_size = SIZ_25ROWS; /* set screen size */ - } - - vgacs[0].loaded = 1; /* The BIOS loaded this at boot */ - - /* set cursor for first screen */ - - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - outb(addr_6845+1,vs[0].cursor_start); - outb(addr_6845,CRTC_CUREND); /* cursor end reg */ - outb(addr_6845+1,vs[0].cursor_end); - - /* this is to satisfy ddb */ - - if(!keyboard_is_initialized) - kbd_code_init1(); -} - -/*---------------------------------------------------------------------------* - * get kernel memory for virtual screens - * - * CAUTION: depends on "can_do_132col" being set properly, or - * depends on vga_type() being run before calling this !!! - * - *---------------------------------------------------------------------------*/ -void -vt_coldmalloc(void) -{ - int nscr; - int screen_max_size; - - /* we need to initialize in case we are not the console */ - - if(do_initialization) - vt_coldinit(); - - switch(adaptor_type) - { - default: - case MDA_ADAPTOR: - case CGA_ADAPTOR: - screen_max_size = MAXROW_MDACGA * MAXCOL_MDACGA * CHR; - break; - - case EGA_ADAPTOR: - screen_max_size = MAXROW_EGA * MAXCOL_EGA * CHR; - break; - - case VGA_ADAPTOR: - if(can_do_132col) - screen_max_size = - MAXROW_VGA * MAXCOL_SVGA * CHR; - else - screen_max_size = - MAXROW_VGA * MAXCOL_VGA * CHR; - } - - for(nscr = 0; nscr < PCVT_NSCREENS; nscr++) - { - if((vs[nscr].Memory = - (u_short *)malloc(screen_max_size * 2, M_DEVBUF, M_WAITOK)) - == NULL) - { - printf("pcvt: screen memory malloc failed, " - "NSCREEN=%d, nscr=%d\n", - PCVT_NSCREENS, nscr); - break; - } - if(nscr != 0) - { - vs[nscr].Crtat = vs[nscr].Memory; - fillw(user_attr | ' ', - vs[nscr].Crtat, - vs[nscr].maxcol * vs[nscr].screen_rowsize); - totalscreens++; - } - } -} - -/*---------------------------------------------------------------------------* - * check if we must scroll up screen - *---------------------------------------------------------------------------*/ -static void -check_scroll(struct video_state *svsp) -{ - if(!svsp->abs_write) - { - /* we write within scroll region */ - - if(svsp->cur_offset >= ((svsp->scrr_end + 1) * svsp->maxcol)) - { - /* the following piece of code has to be protected */ - /* from trying to switch to another virtual screen */ - /* while being in there ... */ - - critical_scroll = 1; /* flag protect ON */ - - roll_up(svsp, 1); /* rolling up .. */ - - svsp->cur_offset -= svsp->maxcol;/* update position */ - - if(switch_page != -1) /* someone wanted to switch ? */ - { - vgapage(switch_page); /* yes, then switch ! */ - switch_page = -1; /* reset switch flag */ - } - - critical_scroll = 0; /* flag protect OFF */ - } - } - else - { - /* clip, if outside of screen */ - - if (svsp->cur_offset >= svsp->screen_rows * svsp->maxcol) - svsp->cur_offset -= svsp->maxcol; - } -} - -/*---------------------------------------------------------------------------* - * write to one user function key label - *---------------------------------------------------------------------------*/ -static void -writefkl(int num, u_char *string, struct video_state *svsp) -{ - if((num < 0) || (num > 7)) /* range ok ? */ - return; - - strncpy(svsp->ufkl[num], string, 16); /* save string in static array */ - - if(svsp->which_fkl == USR_FKL) - wrfkl(num,string,svsp); -} - -/*---------------------------------------------------------------------------* - * write to one system function key label - *---------------------------------------------------------------------------*/ -void -swritefkl(int num, u_char *string, struct video_state *svsp) -{ - if((num < 0) || (num > 7)) /* range ok ? */ - return; - - strncpy(svsp->sfkl[num], string, 16); /* save string in static array */ - - if(svsp->which_fkl == SYS_FKL) - wrfkl(num,string,svsp); -} - -/*---------------------------------------------------------------------------* - * write function key label onto screen - *---------------------------------------------------------------------------*/ -static void -wrfkl(int num, u_char *string, struct video_state *svsp) -{ - register u_short *p; - register u_short *p1; - register int cnt = 0; - - if(!svsp->labels_on || (svsp->vt_pure_mode == M_PUREVT)) - return; - - p = (svsp->Crtat - + (svsp->screen_rows * svsp->maxcol)); /* screen_rows+1 line */ - - if(svsp->maxcol == SCR_COL80) - { - if(num < 4) /* labels 1 .. 4 */ - p += (num * LABEL_LEN); - else /* labels 5 .. 8 */ - p += ((num * LABEL_LEN) + LABEL_MID + 1); - } - else - { - if(num < 4) /* labels 1 .. 4 */ - p += (num * (LABEL_LEN + 6)); - else /* labels 5 .. 8 */ - p += ((num * (LABEL_LEN + 6)) + LABEL_MID + 11); - - } - p1 = p + svsp->maxcol; /* second label line */ - - while((*string != '\0') && (cnt < 8)) - { - *p = ((0x70 << 8) + (*string & 0xff)); - p++; - string++; - cnt++; - } - while(cnt < 8) - { - *p = ((0x70 << 8) + ' '); - p++; - cnt++; - } - - while((*string != '\0') && (cnt < 16)) - { - *p1 = ((0x70 << 8) + (*string & 0xff)); - p1++; - string++; - cnt++; - } - while(cnt < 16) - { - *p1 = ((0x70 << 8) + ' '); - p1++; - cnt++; - } -} - -/*---------------------------------------------------------------------------* - * remove (=blank) function key labels, row/col and status line - *---------------------------------------------------------------------------*/ -void -fkl_off(struct video_state *svsp) -{ - register u_short *p; - register int num; - register int size; - - svsp->labels_on = 0; - - if((vgacs[svsp->vga_charset].screen_size==SIZ_28ROWS) && svsp->force24) - size = 4; - else - size = 3; - - p = (svsp->Crtat + (svsp->screen_rows * svsp->maxcol)); - - for(num = 0; num < (size * svsp->maxcol); num++) - *p++ = ' '; -} - -/*---------------------------------------------------------------------------* - * (re-) display function key labels, row/col and status line - *---------------------------------------------------------------------------*/ -void -fkl_on(struct video_state *svsp) -{ - svsp->labels_on = 1; - - if(svsp->which_fkl == SYS_FKL) - sw_sfkl(svsp); - else if(svsp->which_fkl == USR_FKL) - sw_ufkl(svsp); -} - -/*---------------------------------------------------------------------------* - * set emulation mode, switch between pure VTxxx mode and HP/VTxxx mode - *---------------------------------------------------------------------------*/ -void -set_emulation_mode(struct video_state *svsp, int mode) -{ - if(svsp->vt_pure_mode == mode) - return; - - clr_parms(svsp); /* escape parameter init */ - svsp->state = STATE_INIT; /* initial state */ - svsp->scrr_beg = 0; /* start of scrolling region */ - svsp->sc_flag = 0; /* invalidate saved cursor position */ - svsp->transparent = 0; /* disable control code processing */ - - if(mode == M_HPVT) /* vt-pure -> hp/vt-mode */ - { - svsp->screen_rows = svsp->screen_rowsize - 3; - if (svsp->force24 && svsp->screen_rows == 25) - svsp->screen_rows = 24; - - if (svsp->row >= svsp->screen_rows) { - /* Scroll up */ - int nscroll = svsp->row + 1 - svsp->screen_rows; - bcopy (svsp->Crtat + nscroll * svsp->maxcol, - svsp->Crtat, - svsp->screen_rows * svsp->maxcol * CHR); - svsp->row -= nscroll; - svsp->cur_offset -= nscroll * svsp->maxcol; - } - - svsp->vt_pure_mode = M_HPVT; - - if (svsp->vs_tty) - svsp->vs_tty->t_winsize.ws_row = svsp->screen_rows; - - svsp->scrr_len = svsp->screen_rows; - svsp->scrr_end = svsp->scrr_len - 1; - - update_hp(svsp); - } - else if(mode == M_PUREVT) /* hp/vt-mode -> vt-pure */ - { - fillw(user_attr | ' ', - svsp->Crtat + svsp->screen_rows * svsp->maxcol, - (svsp->screen_rowsize - svsp->screen_rows) - * svsp->maxcol); - - svsp->vt_pure_mode = M_PUREVT; - - svsp->screen_rows = svsp->screen_rowsize; - if (svsp->force24 && svsp->screen_rows == 25) - svsp->screen_rows = 24; - - if (svsp->vs_tty) - svsp->vs_tty->t_winsize.ws_row = svsp->screen_rows; - - svsp->scrr_len = svsp->screen_rows; - svsp->scrr_end = svsp->scrr_len - 1; - } - -#if PCVT_SIGWINCH - if (svsp->vs_tty && svsp->vs_tty->t_pgrp) - pgsignal(svsp->vs_tty->t_pgrp, SIGWINCH, 1); -#endif /* PCVT_SIGWINCH */ - -} - -/*---------------------------------------------------------------------------* - * initialize user function key labels - *---------------------------------------------------------------------------*/ -void -init_ufkl(struct video_state *svsp) -{ - writefkl(0,(u_char *)" f1",svsp); /* init fkey labels */ - writefkl(1,(u_char *)" f2",svsp); - writefkl(2,(u_char *)" f3",svsp); - writefkl(3,(u_char *)" f4",svsp); - writefkl(4,(u_char *)" f5",svsp); - writefkl(5,(u_char *)" f6",svsp); - writefkl(6,(u_char *)" f7",svsp); - writefkl(7,(u_char *)" f8",svsp); -} - -/*---------------------------------------------------------------------------* - * initialize system user function key labels - *---------------------------------------------------------------------------*/ -void -init_sfkl(struct video_state *svsp) -{ - /* 1234567812345678 */ - if(can_do_132col) - /* 1234567812345678 */ - swritefkl(0,(u_char *)"132 COLUMNS ",svsp); - else - swritefkl(0,(u_char *)" ",svsp); - - /* 1234567812345678 */ - swritefkl(1,(u_char *)"SOFT-RSTTERMINAL",svsp); - - if(svsp->force24) - swritefkl(2,(u_char *)"FORCE24 ENABLE *",svsp); - else - swritefkl(2,(u_char *)"FORCE24 ENABLE ",svsp); - -#if PCVT_SHOWKEYS /* 1234567812345678 */ - if(svsp == &vs[0]) - swritefkl(3,(u_char *)"KEYBSCANDISPLAY ",svsp); - else - swritefkl(3,(u_char *)" ",svsp); -#else - swritefkl(3,(u_char *)" ",svsp); -#endif /* PCVT_SHOWKEYS */ - - /* 1234567812345678 */ - if(svsp->bell_on) - swritefkl(4,(u_char *)"BELL ENABLE *",svsp); - else - swritefkl(4,(u_char *)"BELL ENABLE ",svsp); - - if(svsp->sevenbit) - swritefkl(5,(u_char *)"8-BIT ENABLE ",svsp); - else - swritefkl(5,(u_char *)"8-BIT ENABLE *",svsp); - - swritefkl(6,(u_char *)"DISPLAY FUNCTNS ",svsp); - - swritefkl(7,(u_char *)"AUTOWRAPENABLE *",svsp); - /* 1234567812345678 */ -} - -/*---------------------------------------------------------------------------* - * switch display to user function key labels - *---------------------------------------------------------------------------*/ -void -sw_ufkl(struct video_state *svsp) -{ - int i; - svsp->which_fkl = USR_FKL; - for(i = 0; i < 8; i++) - wrfkl(i,svsp->ufkl[i],svsp); -} - -/*---------------------------------------------------------------------------* - * switch display to system function key labels - *---------------------------------------------------------------------------*/ -void -sw_sfkl(struct video_state *svsp) -{ - int i; - svsp->which_fkl = SYS_FKL; - for(i = 0; i < 8; i++) - wrfkl(i,svsp->sfkl[i],svsp); -} - -/*---------------------------------------------------------------------------* - * toggle force 24 lines - *---------------------------------------------------------------------------*/ -void -toggl_24l(struct video_state *svsp) -{ - if(svsp->which_fkl == SYS_FKL) - { - if(svsp->force24) - { - svsp->force24 = 0; - swritefkl(2,(u_char *)"FORCE24 ENABLE ",svsp); - } - else - { - svsp->force24 = 1; - swritefkl(2,(u_char *)"FORCE24 ENABLE *",svsp); - } - set_screen_size(svsp, vgacs[(svsp->vga_charset)].screen_size); - } -} - -#if PCVT_SHOWKEYS -/*---------------------------------------------------------------------------* - * toggle keyboard scancode display - *---------------------------------------------------------------------------*/ -void -toggl_kbddbg(struct video_state *svsp) -{ - if((svsp->which_fkl == SYS_FKL) && (svsp == &vs[0])) - { - if(keyboard_show) - { - keyboard_show = 0; - swritefkl(3,(u_char *)"KEYBSCANDISPLAY ",svsp); - } - else - { - keyboard_show = 1; - swritefkl(3,(u_char *)"KEYBSCANDISPLAY*",svsp); - } - } -} -#endif /* PCVT_SHOWKEYS */ - -/*---------------------------------------------------------------------------* - * toggle display functions - *---------------------------------------------------------------------------*/ -void -toggl_dspf(struct video_state *svsp) -{ - if(svsp->which_fkl == SYS_FKL) - { - if(svsp->dis_fnc) - { - svsp->dis_fnc = 0; - swritefkl(6,(u_char *)"DISPLAY FUNCTNS ",svsp); - } - else - { - svsp->dis_fnc = 1; - swritefkl(6,(u_char *)"DISPLAY FUNCTNS*",svsp); - } - } -} - -/*---------------------------------------------------------------------------* - * auto wrap on/off - *---------------------------------------------------------------------------*/ -void -toggl_awm(struct video_state *svsp) -{ - if(svsp->which_fkl == SYS_FKL) - { - if(svsp->m_awm) - { - svsp->m_awm = 0; - swritefkl(7,(u_char *)"AUTOWRAPENABLE ",svsp); - } - else - { - svsp->m_awm = 1; - swritefkl(7,(u_char *)"AUTOWRAPENABLE *",svsp); - } - } -} - -/*---------------------------------------------------------------------------* - * bell on/off - *---------------------------------------------------------------------------*/ -void -toggl_bell(struct video_state *svsp) -{ - if(svsp->which_fkl == SYS_FKL) - { - if(svsp->bell_on) - { - svsp->bell_on = 0; - swritefkl(4,(u_char *)"BELL ENABLE ",svsp); - } - else - { - svsp->bell_on = 1; - swritefkl(4,(u_char *)"BELL ENABLE *",svsp); - } - } -} - -/*---------------------------------------------------------------------------* - * 7/8 bit usage - *---------------------------------------------------------------------------*/ -void -toggl_sevenbit(struct video_state *svsp) -{ - if(svsp->which_fkl == SYS_FKL) - { - if(svsp->sevenbit) - { - svsp->sevenbit = 0; - swritefkl(5,(u_char *)"8-BIT ENABLE *",svsp); - } - else - { - svsp->sevenbit = 1; - swritefkl(5,(u_char *)"8-BIT ENABLE ",svsp); - } - } -} - -/*---------------------------------------------------------------------------* - * 80 / 132 columns - *---------------------------------------------------------------------------*/ -void -toggl_columns(struct video_state *svsp) -{ - if(svsp->which_fkl == SYS_FKL) - { - if(svsp->maxcol == SCR_COL132) - { - if(vt_col(svsp, SCR_COL80)) - svsp->maxcol = 80; - } - else - { - if(vt_col(svsp, SCR_COL132)) - svsp->maxcol = 132; - } - } -} - -/*---------------------------------------------------------------------------* - * toggle vga 80/132 column operation - *---------------------------------------------------------------------------*/ -int -vt_col(struct video_state *svsp, int cols) -{ - if(vga_col(svsp, cols) == 0) - return(0); - - if(cols == SCR_COL80) - swritefkl(0,(u_char *)"132 COLUMNS ",svsp); - else - swritefkl(0,(u_char *)"132 COLUMNS*",svsp); - - fillw(user_attr | ' ', - svsp->Crtat, - svsp->maxcol * svsp->screen_rowsize); - - clr_parms(svsp); /* escape parameter init */ - svsp->state = STATE_INIT; /* initial state */ - svsp->col = 0; /* init row */ - svsp->row = 0; /* init col */ - svsp->cur_offset = 0; /* cursor offset init */ - svsp->sc_flag = 0; /* invalidate saved cursor position */ - svsp->scrr_beg = 0; /* reset scrolling region */ - svsp->scrr_len = svsp->screen_rows; /*reset scrolling region legnth */ - svsp->scrr_end = svsp->scrr_len - 1; - svsp->transparent = 0; /* disable control code processing */ - svsp->selchar = 0; /* selective attr off */ - vt_initsel(svsp); /* re-init sel attr */ - - update_hp(svsp); /* update labels, row/col, page ind */ - - /* Update winsize struct to reflect screen size */ - - if(svsp->vs_tty) - { - svsp->vs_tty->t_winsize.ws_row = svsp->screen_rows; - svsp->vs_tty->t_winsize.ws_col = svsp->maxcol; - - svsp->vs_tty->t_winsize.ws_xpixel = - (cols == SCR_COL80)? 720: 1056; - svsp->vs_tty->t_winsize.ws_ypixel = 400; - -#if PCVT_SIGWINCH - if(svsp->vs_tty->t_pgrp) - pgsignal(svsp->vs_tty->t_pgrp, SIGWINCH, 1); -#endif /* PCVT_SIGWINCH */ - } - - return(1); -} - -/*---------------------------------------------------------------------------* - * update HP stuff on screen - *---------------------------------------------------------------------------*/ -void -update_hp(struct video_state *svsp) -{ - if(svsp->vt_pure_mode != M_HPVT) - return; - - fillw (user_attr | ' ', - svsp->Crtat + svsp->screen_rows * svsp->maxcol, - (svsp->screen_rowsize - svsp->screen_rows) * svsp->maxcol); - - if (!svsp->labels_on) - return; - - /* update fkey labels */ - - fkl_off(svsp); - fkl_on(svsp); - - if(vsp == svsp) - { - /* update current displayed screen indicator */ - - *((svsp->Crtat + ((svsp->screen_rows + 2) * svsp->maxcol)) - + svsp->maxcol - 3) = user_attr | '['; - *((svsp->Crtat + ((svsp->screen_rows + 2) * svsp->maxcol)) - + svsp->maxcol - 2) = user_attr | current_video_screen + '0'; - *((svsp->Crtat + ((svsp->screen_rows + 2) * svsp->maxcol)) - + svsp->maxcol - 1) = user_attr | ']'; - } -} - -/*---------------------------------------------------------------------------* - * initialize ANSI escape sequence parameter buffers - *---------------------------------------------------------------------------*/ -void -clr_parms(struct video_state *svsp) -{ - register int i; - for(i=0; i < MAXPARMS; i++) - svsp->parms[i] = 0; - svsp->parmi = 0; -} - - -/*---------------------------------------------------------------------------* - * - * partial HP 2392 ANSI mode Emulator - * ================================== - * - * this part takes over the emulation of some escape sequences - * needed to handle the function key labels - * - * They are modeled after the corresponding escape sequences - * introduced with the HP2392 terminals from Hewlett-Packard. - * - * see: - * "HP2392A, Display Terminal Reference Manual", - * HP Manual Part Number 02390-90001 - * and: - * Reference Manual Supplement - * "2392A Display Terminal Option 049, ANSI Operation" - * HP Manual Part Number 02390-90023EN - * - *---------------------------------------------------------------------------*/ - -static void -hp_entry(U_char ch, struct video_state *svsp) -{ - switch(svsp->hp_state) - { - case SHP_INIT: - switch(ch) - { - case 'f': - svsp->hp_state = SHP_AND_F; - svsp->attribute = 0; - svsp->key = 0; - svsp->l_len = 0; - svsp->s_len = 0; - svsp->i = 0; - break; - - case 'j': - svsp->m_len = 0; - svsp->hp_state = SHP_AND_J; - break; - - case 's': - svsp->hp_state = SHP_AND_ETE; - break; - - default: - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - break; - } - break; - - case SHP_AND_F: - if((ch >= '0') && (ch <= '8')) - { - svsp->attribute = ch; - svsp->hp_state = SHP_AND_Fa; - } - else - { - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - } - break; - - case SHP_AND_Fa: - if(ch == 'a') - svsp->hp_state = SHP_AND_Fak; - else if(ch == 'k') - { - svsp->key = svsp->attribute; - svsp->hp_state = SHP_AND_Fakd; - } - else - { - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - } - break; - - case SHP_AND_Fak: - if((ch >= '1') && (ch <= '8')) - { - svsp->key = ch; - svsp->hp_state = SHP_AND_Fak1; - } - else - { - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - } - break; - - case SHP_AND_Fak1: - if(ch == 'k') - svsp->hp_state = SHP_AND_Fakd; - else - { - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - } - break; - - case SHP_AND_Fakd: - if(svsp->l_len > 16) - { - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - } - else if(ch >= '0' && ch <= '9') - { - svsp->l_len *= 10; - svsp->l_len += (ch -'0'); - } - else if(ch == 'd') - svsp->hp_state = SHP_AND_FakdL; - else - { - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - } - break; - - case SHP_AND_FakdL: - if(svsp->s_len > 80) - { - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - } - else if(ch >= '0' && ch <= '9') - { - svsp->s_len *= 10; - svsp->s_len += (ch -'0'); - } - else if(ch == 'L') - { - svsp->hp_state = SHP_AND_FakdLl; - svsp->transparent = 1; - } - else - { - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - } - break; - - case SHP_AND_FakdLl: - svsp->l_buf[svsp->i] = ch; - if(svsp->i >= svsp->l_len-1) - { - svsp->hp_state = SHP_AND_FakdLls; - svsp->i = 0; - if(svsp->s_len == 0) - { - svsp->state = STATE_INIT; - svsp->hp_state = SHP_INIT; - svsp->transparent = 0; - svsp->i = 0; - svsp->l_buf[svsp->l_len] = '\0'; - svsp->s_buf[svsp->s_len] = '\0'; - writefkl((svsp->key - '0' -1), - svsp->l_buf, svsp); - } - } - else - svsp->i++; - break; - - case SHP_AND_FakdLls: - svsp->s_buf[svsp->i] = ch; - if(svsp->i >= svsp->s_len-1) - { - svsp->state = STATE_INIT; - svsp->hp_state = SHP_INIT; - svsp->transparent = 0; - svsp->i = 0; - svsp->l_buf[svsp->l_len] = '\0'; - svsp->s_buf[svsp->s_len] = '\0'; - writefkl((svsp->key - '0' -1), svsp->l_buf, - svsp); - } - else - svsp->i++; - break; - - case SHP_AND_J: - switch(ch) - { - case '@': /* enable user keys, remove */ - /* all labels & status from */ - /* screen */ - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - fkl_off(svsp); - break; - - case 'A': /* enable & display "modes" */ - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - fkl_on(svsp); - sw_sfkl(svsp); - break; - - case 'B': /* enable & display "user" */ - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - fkl_on(svsp); - sw_ufkl(svsp); - break; - - case 'C': /* remove (clear) status line*/ - /* and restore current labels*/ - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - fkl_on(svsp); - break; - - case 'R': /* enable usr/menu keys */ - /* and fkey label modes */ - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - break; - - case 'S': /* disable usr/menu keys */ - /* and fkey label modes */ - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': /* parameters for esc & j xx L mm */ - svsp->m_len *= 10; - svsp->m_len += (ch -'0'); - break; - - case 'L': - svsp->hp_state = SHP_AND_JL; - svsp->i = 0; - svsp->transparent = 1; - break; - - default: - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - break; - - } - break; - - - case SHP_AND_JL: - svsp->m_buf[svsp->i] = ch; - if(svsp->i >= svsp->m_len-1) - { - svsp->state = STATE_INIT; - svsp->hp_state = SHP_INIT; - svsp->transparent = 0; - svsp->i = 0; - svsp->m_buf[svsp->m_len] = '\0'; - /* display status line */ - /* needs to be implemented */ - /* see 2392 man, 3-14 */ - - } - else - svsp->i++; - break; - - case SHP_AND_ETE: /* eat chars until uppercase */ - if(ch >= '@' && ch <= 'Z') - { - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - svsp->transparent = 0; - } - break; - - default: - svsp->hp_state = SHP_INIT; - svsp->state = STATE_INIT; - svsp->transparent = 0; - break; - } -} - -#endif /* NVT > 0 */ - -/* ------------------------- E O F ------------------------------------------*/ - diff --git a/sys/i386/isa/pcvt/pcvt_sup.c b/sys/i386/isa/pcvt/pcvt_sup.c deleted file mode 100644 index de7f938..0000000 --- a/sys/i386/isa/pcvt/pcvt_sup.c +++ /dev/null @@ -1,2216 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. - * - * Copyright (c) 1992, 1993 Brian Dunford-Shore and Scott Turner. - * - * Copyright (C) 1992, 1993 Soeren Schmidt. - * - * All rights reserved. - * - * For the sake of compatibility, portions of this code regarding the - * X server interface are taken from Soeren Schmidt's syscons driver. - * - * 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, Joerg Wunsch, Scott Turner and Soeren Schmidt. - * 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_sup.c, 3.20, Last Edit-Date: [Thu Apr 6 10:49:44 1995] - * - */ - -/*---------------------------------------------------------------------------* - * - * pcvt_sup.c VT220 Driver Support Routines - * --------------------------------------------- - * -hm ------------ Release 3.00 -------------- - * -hm integrating NetBSD-current patches - * -hm removed paranoid delay()/DELAY() from vga_test() - * -hm removing vgapage() protection if PCVT_KBD_FIFO - * -hm some new CONF_ - values - * -hm Joerg's patches for FreeBSD ttymalloc - * -hm applying Joerg's patches for FreeBSD 2.0 - * -hm applying Lon Willet's patches for NetBSD - * -hm NetBSD PR #400: patch to short-circuit TIOCSWINSZ - * -hm getting PCVT_BURST reported correctly for FreeBSD 2.0 - * -hm applying patch from Joerg fixing Crtat bug - * -hm moving ega/vga coldinit support code to mda2egaorvga() - * -hm patch from Thomas Eberhardt fixing force 24 lines fkey update - * - *---------------------------------------------------------------------------*/ - -#include "vt.h" -#if NVT > 0 - -#include <i386/isa/pcvt/pcvt_hdr.h> /* global include */ - -#include <sys/resource.h> - -static void vid_cursor ( struct cursorshape *data ); -static void vgasetfontattr ( struct vgafontattr *data ); -static void vgagetfontattr ( struct vgafontattr *data ); -static void vgaloadchar ( struct vgaloadchar *data ); -static void vid_getscreen ( struct screeninfo *data, Dev_t dev ); -static void vid_setscreen ( struct screeninfo *data, Dev_t dev ); -static void setchargen ( void ); -static void setchargen3 ( void ); -static void resetchargen ( void ); -static void vgareadpel ( struct vgapel *data, Dev_t dev ); -static void vgawritepel ( struct vgapel *data, Dev_t dev ); -static void vgapcvtid ( struct pcvtid *data ); -static void vgapcvtinfo ( struct pcvtinfo *data ); - -#ifdef XSERVER -static unsigned char * compute_charset_base ( unsigned fontset ); -#endif /* XSERVER */ - -static struct callout_handle async_update_ch = - CALLOUT_HANDLE_INITIALIZER(&async_update_ch); - -#if PCVT_SCREENSAVER -static void scrnsv_timedout ( void *arg ); -static struct callout_handle scrnsv_timeout_ch = - CALLOUT_HANDLE_INITIALIZER(&scrnsv_timeout_ch); -static u_short *savedscreen = (u_short *)0; /* ptr to screen contents */ -static size_t scrnsv_size = (size_t)-1; /* size of saved image */ - -#ifndef XSERVER -static unsigned scrnsv_timeout = 0; /* initially off */ -static void pcvt_set_scrnsv_tmo ( int timeout );/* else declared global */ -#endif /* XSERVER */ - -#if PCVT_PRETTYSCRNS -static u_short *scrnsv_current = (u_short *)0; /* attention char ptr */ -static struct callout_handle scrnsv_blink_ch = - CALLOUT_HANDLE_INITIALIZER(&scrnsv_blink_ch); -static void scrnsv_blink ( void * ); -static u_short getrand ( void ); -#endif /* PCVT_PRETTYSCRNS */ - -#endif /* PCVT_SCREENSAVER */ - - -/*---------------------------------------------------------------------------* - * execute vga ioctls - *---------------------------------------------------------------------------*/ -int -vgaioctl(Dev_t dev, int cmd, caddr_t data, int flag) -{ - if(minor(dev) >= PCVT_NSCREENS) - return -1; - -/* - * Some of the commands are not applicable if the vt in question, or the - * current vt is in graphics mode (i.e., the X server acts on it); they - * will cause an EAGAIN (resource temporarily unavailable) to be returned. - */ - -#ifdef XSERVER -#if PCVT_USL_VT_COMPAT -#define is_dev_grafx vs[minor(dev)].vt_status & VT_GRAFX -#define is_current_grafx vsp->vt_status & VT_GRAFX -#else /* old X interface */ -#define is_dev_grafx pcvt_xmode -#define is_current_grafx pcvt_xmode -#endif /* PCVT_USL_VT_COMPAT */ -#else /* !XSERVER */ -#define is_dev_grafx 0 /* not applicable */ -#define is_current_grafx 0 -#endif /* XSERVER */ - - switch(cmd) - { - case VGACURSOR: - if(is_current_grafx) - return EAGAIN; - vid_cursor((struct cursorshape *)data); - break; - - case VGALOADCHAR: - if((adaptor_type != VGA_ADAPTOR) && - (adaptor_type != EGA_ADAPTOR)) - return -1; - if(is_current_grafx) - return EAGAIN; - vgaloadchar((struct vgaloadchar *)data); - break; - - case VGASETFONTATTR: - if((adaptor_type != VGA_ADAPTOR) && - (adaptor_type != EGA_ADAPTOR)) - return -1; - -#if PCVT_SCREENSAVER - pcvt_scrnsv_reset(); -#endif /* PCVT_SCREENSAVER */ - - vgasetfontattr((struct vgafontattr *)data); - break; - - case VGAGETFONTATTR: - if((adaptor_type != VGA_ADAPTOR) && - (adaptor_type != EGA_ADAPTOR)) - return -1; - vgagetfontattr((struct vgafontattr *)data); - break; - - case VGASETSCREEN: - -#if defined XSERVER && !PCVT_USL_VT_COMPAT - /* avoid screen switch if using old X mode */ - if(is_dev_grafx) - return EAGAIN; -#endif /* XSERVER && !PCVT_USL_VT_COMPAT */ - -#if PCVT_SCREENSAVER - pcvt_scrnsv_reset(); -#endif /* PCVT_SCREENSAVER */ - - vid_setscreen((struct screeninfo *)data, dev); - break; - - case VGAGETSCREEN: - vid_getscreen((struct screeninfo *)data, dev); - break; - - case VGAREADPEL: - if(adaptor_type != VGA_ADAPTOR) - return -1; - if(is_dev_grafx) - return EAGAIN; - vgareadpel((struct vgapel *)data, dev); - break; - - case VGAWRITEPEL: - if(adaptor_type != VGA_ADAPTOR) - return -1; - if(is_dev_grafx) - return EAGAIN; - vgawritepel((struct vgapel *)data, dev); - break; - -#if PCVT_SCREENSAVER - case VGASCREENSAVER: - if(is_current_grafx) - return EAGAIN; - pcvt_set_scrnsv_tmo(*(int *)data); - pcvt_scrnsv_reset(); - break; -#endif /* PCVT_SCREENSAVER */ - - case VGAPCVTID: - vgapcvtid((struct pcvtid *)data); - break; - - case VGAPCVTINFO: - vgapcvtinfo((struct pcvtinfo *)data); - break; - - case VGASETCOLMS: - if(is_dev_grafx) - return EAGAIN; - if(*(int *)data == 80) - (void)vt_col(&vs[minor(dev)], SCR_COL80); - else if(*(int *)data == 132) - { - if(vt_col(&vs[minor(dev)], SCR_COL132) == 0) - return EINVAL; /* not a VGA */ - } - else - return EINVAL; - break; - - case TIOCSWINSZ: - /* do nothing here */ - break; - - default: - return -1; - } - return 0; - -#undef is_dev_grafx -#undef is_current_grafx -} - -/*---------------------------------------------------------------------------* - * video ioctl - return driver id - *---------------------------------------------------------------------------*/ -static void -vgapcvtid(struct pcvtid *data) -{ - snprintf(data->name, sizeof(data->name), "%s", PCVTIDNAME); - data->rmajor = PCVTIDMAJOR; - data->rminor = PCVTIDMINOR; -} - -/*---------------------------------------------------------------------------* - * video ioctl - return driver compile time options data - *---------------------------------------------------------------------------*/ -static void -vgapcvtinfo(struct pcvtinfo *data) -{ -#if PCVT_NETBSD - data->opsys = CONF_NETBSD; - data->opsysrel = PCVT_NETBSD; -#elif PCVT_FREEBSD - data->opsys = CONF_FREEBSD; - data->opsysrel = PCVT_FREEBSD; -#else - data->opsys = CONF_UNKNOWNOPSYS; - data->opsysrel = 0; -#endif - - data->nscreens = PCVT_NSCREENS; - data->scanset = PCVT_SCANSET; - data->updatefast= PCVT_UPDATEFAST; - data->updateslow= PCVT_UPDATESLOW; - data->sysbeepf = PCVT_SYSBEEPF; - -#if PCVT_NETBSD || PCVT_FREEBSD >= 200 - data->pcburst = PCVT_PCBURST; -#else - data->pcburst = 1; -#endif - -#if PCVT_KBD_FIFO - data->kbd_fifo_sz = PCVT_KBD_FIFO_SZ; -#else - data->kbd_fifo_sz = 0; -#endif - - data->compile_opts = (0 - -#if PCVT_VT220KEYB - | CONF_VT220KEYB -#endif -#if PCVT_SCREENSAVER - | CONF_SCREENSAVER -#endif -#if PCVT_PRETTYSCRNS - | CONF_PRETTYSCRNS -#endif -#if PCVT_CTRL_ALT_DEL - | CONF_CTRL_ALT_DEL -#endif -#if PCVT_USEKBDSEC - | CONF_USEKBDSEC -#endif -#if PCVT_24LINESDEF - | CONF_24LINESDEF -#endif -#if PCVT_EMU_MOUSE - | CONF_EMU_MOUSE -#endif -#if PCVT_SHOWKEYS - | CONF_SHOWKEYS -#endif -#if PCVT_KEYBDID - | CONF_KEYBDID -#endif -#if PCVT_SIGWINCH - | CONF_SIGWINCH -#endif -#if PCVT_NULLCHARS - | CONF_NULLCHARS -#endif -#if PCVT_BACKUP_FONTS - | CONF_BACKUP_FONTS -#endif -#if PCVT_SW0CNOUTP /* was FORCE8BIT */ - | CONF_SW0CNOUTP -#endif -#if PCVT_SETCOLOR - | CONF_SETCOLOR -#endif -#if PCVT_132GENERIC - | CONF_132GENERIC -#endif -#if PCVT_PALFLICKER - | CONF_PALFLICKER -#endif -#if PCVT_WAITRETRACE - | CONF_WAITRETRACE -#endif -#ifdef XSERVER - | CONF_XSERVER -#endif -#if PCVT_USL_VT_COMPAT - | CONF_USL_VT_COMPAT -#endif -#if PCVT_PORTIO_DELAY - | CONF_PORTIO_DELAY -#endif -#if PCVT_INHIBIT_NUMLOCK - | CONF_INHIBIT_NUMLOCK -#endif -#if PCVT_META_ESC - | CONF_META_ESC -#endif -#if PCVT_KBD_FIFO - | CONF_KBD_FIFO -#endif -#if PCVT_NOFASTSCROLL - | CONF_NOFASTSCROLL -#endif -#if PCVT_SLOW_INTERRUPT - | CONF_SLOW_INTERRUPT -#endif -#if PCVT_NO_LED_UPDATE - | CONF_NO_LED_UPDATE -#endif - ); -} - -/*---------------------------------------------------------------------------* - * video ioctl - set cursor appearence - *---------------------------------------------------------------------------*/ -static void -vid_cursor(struct cursorshape *data) -{ - int screen; - int start; - int end; - int line_height; - int character_set; - - /* for which virtual screen, -1 for current */ - screen = data->screen_no; - - if(screen == -1) /* current ? */ - screen = current_video_screen; - else if(screen > totalscreens - 1) - screen = totalscreens - 1; - else if(screen < 0) - screen = 0; - - if(adaptor_type == VGA_ADAPTOR || adaptor_type == EGA_ADAPTOR) - { - character_set = vs[screen].vga_charset; - character_set = (character_set < 0) ? 0 : - ((character_set < totalfonts) ? - character_set : - totalfonts-1); - - line_height = vgacs[character_set].char_scanlines & 0x1F; - } - else if(adaptor_type == MDA_ADAPTOR) - { - line_height = 14; - } - else - { - line_height = 8; /* CGA */ - } - - start = (data->start < 0) ? 0 : - ((data->start > line_height) ? line_height : data->start); - - if((vga_family == VGA_F_TRI) && (start == 0)) - start = 1; - - end = (data->end < 0) ? 0 : - ((data->end > line_height) ? line_height : data->end); - - vs[screen].cursor_start = start; - vs[screen].cursor_end = end; - - if(screen == current_video_screen) - { - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - outb(addr_6845+1, start); - outb(addr_6845,CRTC_CUREND); /* cursor end reg */ - outb(addr_6845+1, end); - } -} - -/*---------------------------------------------------------------------------* - * ega/vga ioctl - set font attributes - *---------------------------------------------------------------------------*/ -static void -vgasetfontattr(struct vgafontattr *data) -{ - register int i; - int vga_character_set; - int lines_per_character; - int totscanlines; - int size; - - vga_character_set = data->character_set; - vga_character_set = (vga_character_set < 0) ? 0 : - ((vga_character_set < totalfonts) ? - vga_character_set : totalfonts-1); - - vgacs[vga_character_set].loaded = data->font_loaded; - - /* Limit Characters to 32 scanlines doubled */ - vgacs[vga_character_set].char_scanlines = - (data->character_scanlines & 0x1F) - | 0x40; /* always set bit 9 of line cmp reg */ - - if(adaptor_type == EGA_ADAPTOR) - /* ...and screen height to scan 350 lines */ - vgacs[vga_character_set].scr_scanlines = - (data->screen_scanlines > 0x5d) ? - 0x5d : data->screen_scanlines; - else - /* ...and screen height to scan 480 lines */ - vgacs[vga_character_set].scr_scanlines = - (data->screen_scanlines > 0xdF) ? - 0xdF : data->screen_scanlines; - - lines_per_character = - (int)(0x1F & vgacs[vga_character_set].char_scanlines)+1; - - totscanlines = 0x101 + (int)vgacs[vga_character_set].scr_scanlines; - - size = data->screen_size; - - if(adaptor_type == EGA_ADAPTOR) - { - switch(size) - { - case SIZ_25ROWS: /* This case is always OK */ - break; - - case SIZ_35ROWS: - if(totscanlines/lines_per_character >= 35) - size = SIZ_35ROWS; - else - size = SIZ_25ROWS; - break; - - case SIZ_43ROWS: - default: - if(totscanlines/lines_per_character >= 43) - size = SIZ_43ROWS; - else if(totscanlines/lines_per_character >= 35) - size = SIZ_35ROWS; - else - size = SIZ_25ROWS; - break; - } - } - else - { - switch(size) - { - case SIZ_25ROWS: /* This case is always OK */ - break; - - case SIZ_28ROWS: - if(totscanlines/lines_per_character >= 28) - size = SIZ_28ROWS; - else - size = SIZ_25ROWS; - break; - - case SIZ_40ROWS: - if(totscanlines/lines_per_character >= 40) - size = SIZ_40ROWS; - else if(totscanlines/lines_per_character >= 28) - size = SIZ_28ROWS; - else - size = SIZ_25ROWS; - break; - - case SIZ_50ROWS: - default: - if(totscanlines/lines_per_character >= 50) - size = SIZ_50ROWS; - else if(totscanlines/lines_per_character >= 40) - size = SIZ_40ROWS; - else if(totscanlines/lines_per_character >= 28) - size = SIZ_28ROWS; - else - size = SIZ_25ROWS; - break; - } - } - - vgacs[vga_character_set].screen_size = size; - - for (i = 0;i < PCVT_NSCREENS;i++) - { - if(vga_character_set == vs[i].vga_charset) - set_charset(&(vs[i]),vga_character_set); - } - -#if !PCVT_USL_VT_COMPAT - vgapage(current_video_screen); -#else - switch_screen(current_video_screen, 0, 0); -#endif /* !PCVT_USL_VT_COMPAT */ - -} - -/*---------------------------------------------------------------------------* - * ega/vga ioctl - get font attributes - *---------------------------------------------------------------------------*/ -static void -vgagetfontattr(struct vgafontattr *data) -{ - int vga_character_set; - - vga_character_set = data->character_set; - vga_character_set = (vga_character_set < 0) ? 0 : - ((vga_character_set < (int)totalfonts) ? - vga_character_set : - (int)(totalfonts-1)); - - data->character_set = (int)vga_character_set; - - data->font_loaded = (int)vgacs[vga_character_set].loaded; - - data->character_scanlines = - (int)vgacs[vga_character_set].char_scanlines - & 0x1f; /* do not display the overflow bits */ - - data->screen_scanlines = (int)vgacs[vga_character_set].scr_scanlines; - - data->screen_size = (int)vgacs[vga_character_set].screen_size; -} - -/*---------------------------------------------------------------------------* - * ega/vga ioctl - load a character shape into character set - *---------------------------------------------------------------------------*/ -static void -vgaloadchar(struct vgaloadchar *data) -{ - int vga_character_set; - int character; - int lines_per_character; - - vga_character_set = data->character_set; - vga_character_set = (vga_character_set < 0) ? 0 : - ((vga_character_set < (int)totalfonts) ? - vga_character_set : (int)(totalfonts-1)); - - character = (data->character < 0) ? 0 : - ((data->character > 255) ? 255 : data->character); - - lines_per_character = (int)data->character_scanlines; - lines_per_character = (lines_per_character < 0) ? 0 : - ((lines_per_character > 32) ? 32 : lines_per_character); - - loadchar(vga_character_set,character,lines_per_character, - data->char_table); -} - -/*---------------------------------------------------------------------------* - * video ioctl - get screen information - *---------------------------------------------------------------------------*/ -static void -vid_getscreen(struct screeninfo *data, Dev_t dev) -{ - int device = minor(dev); - data->adaptor_type = adaptor_type; /* video adapter installed */ - data->monitor_type = color; /* monitor type installed */ - data->totalfonts = totalfonts; /* no of downloadble fonts */ - data->totalscreens = totalscreens; /* no of virtual screens */ - data->screen_no = device; /* this screen number */ - data->current_screen = current_video_screen; /* displayed screen no */ - /* screen size */ - data->screen_size = vgacs[(vs[device].vga_charset)].screen_size; - /* pure VT mode or HP/VT mode */ - data->pure_vt_mode = vs[device].vt_pure_mode; - data->vga_family = vga_family; /* manufacturer, family */ - data->vga_type = vga_type; /* detected chipset type */ - data->vga_132 = can_do_132col; /* 132 column support */ - data->force_24lines = vs[device].force24; /* force 24 lines */ -} - -/*---------------------------------------------------------------------------* - * video ioctl - set screen information - *---------------------------------------------------------------------------*/ -static void -vid_setscreen(struct screeninfo *data, Dev_t dev) -{ - int screen; - - if(data->current_screen == -1) - { - screen = minor(dev); - } - else - { - if(data->current_screen >= PCVT_NSCREENS) - return; /* XXXXXX */ - screen = data->current_screen; - } - - vgapage(screen); - -#if defined XSERVER && PCVT_USL_VT_COMPAT - { - int x = spltty(), waitfor = screen + 1; - /* if the vt is yet to be released by a process, wait here */ - if(vs[screen].vt_status & VT_WAIT_REL) - (void)usl_vt_ioctl(dev, VT_WAITACTIVE, - (caddr_t)&waitfor, 0, 0); - splx(x); - } - /* make sure the switch really happened */ - if(screen != current_video_screen) - return; /* XXX should say "EAGAIN" here */ -#endif /* defined XSERVER && PCVT_USL_VT_COMPAT */ - - if((data->screen_size != -1) || (data->force_24lines != -1)) - { - if(data->screen_size == -1) - data->screen_size = - vgacs[(vs[screen].vga_charset)].screen_size; - - if(data->force_24lines != -1) - { - vs[screen].force24 = data->force_24lines; - - if(vs[screen].force24) - { - swritefkl(2,(u_char *)"FORCE24 ENABLE *", - &vs[screen]); - } - else - { - swritefkl(2,(u_char *)"FORCE24 ENABLE ", - &vs[screen]); - } - } - - if((data->screen_size == SIZ_25ROWS) || - (data->screen_size == SIZ_28ROWS) || - (data->screen_size == SIZ_35ROWS) || - (data->screen_size == SIZ_40ROWS) || - (data->screen_size == SIZ_43ROWS) || - (data->screen_size == SIZ_50ROWS)) - { - if(data->screen_no == -1) - set_screen_size(vsp, data->screen_size); - else - set_screen_size(&vs[minor(dev)], - data->screen_size); - } - } - - if(data->pure_vt_mode != -1) - { - if((data->pure_vt_mode == M_HPVT) || - (data->pure_vt_mode == M_PUREVT)) - { - if(data->screen_no == -1) - set_emulation_mode(vsp, data->pure_vt_mode); - else - set_emulation_mode(&vs[minor(dev)], - data->pure_vt_mode); - } - } -} - -/*---------------------------------------------------------------------------* - * set screen size/resolution for a virtual screen - *---------------------------------------------------------------------------*/ -void -set_screen_size(struct video_state *svsp, int size) -{ - int i; - - for(i = 0; i < totalfonts; i++) - { - if(vgacs[i].screen_size == size) - { - set_charset(svsp, i); - clr_parms(svsp); /* escape parameter init */ - svsp->state = STATE_INIT; /* initial state */ - svsp->scrr_beg = 0; /* start of scrolling region */ - svsp->sc_flag = 0; /* invalidate saved cursor - * position */ - svsp->transparent = 0; /* disable control code - * processing */ - - /* Update tty to reflect screen size */ - - if (svsp->vs_tty) - { - svsp->vs_tty->t_winsize.ws_col = svsp->maxcol; - svsp->vs_tty->t_winsize.ws_xpixel = - (svsp->maxcol == 80)? 720: 1056; - svsp->vs_tty->t_winsize.ws_ypixel = 400; - svsp->vs_tty->t_winsize.ws_row = - svsp->screen_rows; - } - /* screen_rows already calculated in set_charset() */ - if(svsp->vt_pure_mode == M_HPVT && svsp->labels_on) - { - if(svsp->which_fkl == SYS_FKL) - sw_sfkl(svsp); - else if(svsp->which_fkl == USR_FKL) - sw_ufkl(svsp); - } - - - svsp->scrr_len = svsp->screen_rows; - svsp->scrr_end = svsp->scrr_len - 1; - -#if PCVT_SIGWINCH - if (svsp->vs_tty && svsp->vs_tty->t_pgrp) - pgsignal(svsp->vs_tty->t_pgrp, SIGWINCH, 1); -#endif /* PCVT_SIGWINCH */ - - break; - } - } -} - -/*---------------------------------------------------------------------------* - * VGA ioctl - read DAC palette entry - *---------------------------------------------------------------------------*/ -static void -vgareadpel(struct vgapel *data, Dev_t dev) -{ - register unsigned vpage = minor(dev); - register unsigned idx = data->idx; - - if(idx >= NVGAPEL) - return; /* no such entry */ - - /* do not read VGA palette directly, use saved values */ - data->r = vs[vpage].palette[idx].r; - data->g = vs[vpage].palette[idx].g; - data->b = vs[vpage].palette[idx].b; -} - -/*---------------------------------------------------------------------------* - * VGA ioctl - write DAC palette entry - *---------------------------------------------------------------------------*/ -static void -vgawritepel(struct vgapel *data, Dev_t dev) -{ - register unsigned vpage = minor(dev); - register unsigned idx = data->idx; - - if(idx >= NVGAPEL) - return; /* no such entry */ - - /* first, update saved values for this video screen */ - vs[vpage].palette[idx].r = data->r; - vs[vpage].palette[idx].g = data->g; - vs[vpage].palette[idx].b = data->b; - - /* if this happens on active screen, update VGA DAC, too */ - if(vpage == current_video_screen) - vgapaletteio(idx, &vs[vpage].palette[idx], 1); -} - -/*---------------------------------------------------------------------------* - * VGA physical IO - read/write one palette entry - *---------------------------------------------------------------------------*/ -void -vgapaletteio(unsigned idx, struct rgb *val, int writeit) -{ - -#if PCVT_PALFLICKER - vga_screen_off(); -#endif /* PCVT_PALFLICKER */ - - if(writeit) - { - outb(VGA_DAC + 2, idx); - -#if PCVT_WAITRETRACE - wait_retrace(); -#endif /* PCVT_WAITRETRACE */ - - outb(VGA_DAC + 3, val->r & VGA_PMSK); - -#if PCVT_WAITRETRACE - wait_retrace(); -#endif /* PCVT_WAITRETRACE */ - - outb(VGA_DAC + 3, val->g & VGA_PMSK); - -#if PCVT_WAITRETRACE - wait_retrace(); -#endif /* PCVT_WAITRETRACE */ - - outb(VGA_DAC + 3, val->b & VGA_PMSK); - } - else /* read it */ - { - outb(VGA_DAC + 1, idx); - -#if PCVT_WAITRETRACE - wait_retrace(); -#endif /* PCVT_WAITRETRACE */ - - val->r = inb(VGA_DAC + 3) & VGA_PMSK; - -#if PCVT_WAITRETRACE - wait_retrace(); -#endif /* PCVT_WAITRETRACE */ - - val->g = inb(VGA_DAC + 3) & VGA_PMSK; - -#if PCVT_WAITRETRACE - wait_retrace(); -#endif /* PCVT_WAITRETRACE */ - - val->b = inb(VGA_DAC + 3) & VGA_PMSK; - } - -#if PCVT_PALFLICKER - vga_screen_on(); -#endif /* PCVT_PALFLICKER */ - -} - -/*---------------------------------------------------------------------------* - * - * update asynchronous: cursor, cursor pos displ, sys load, keyb scan - * - * arg is: - * UPDATE_START = do update; requeue - * UPDATE_STOP = suspend updates - * UPDATE_KERN = do update for kernel printfs - * - *---------------------------------------------------------------------------*/ -void -async_update(void *arg) -{ - static int lastpos = 0; - static int counter = PCVT_UPDATESLOW; - -#ifdef XSERVER - /* need a method to suspend the updates */ - - if(arg == UPDATE_STOP) - { - untimeout(async_update, UPDATE_START, async_update_ch); - return; - } -#endif /* XSERVER */ - - /* first check if update is possible */ - - if(chargen_access /* does no-one load characters? */ -#ifdef XSERVER /* is vt0 not in graphics mode? */ -#if !PCVT_USL_VT_COMPAT - || pcvt_xmode /* XXX necessary ????? */ -#endif /* PCVT_USL_VT_COMPAT */ -#endif /* XSERVER */ - ) - { - goto async_update_exit; /* do not update anything */ - } - -#if PCVT_SCREENSAVER - if(reset_screen_saver && (counter == PCVT_UPDATESLOW)) - { - pcvt_scrnsv_reset(); /* yes, do it */ - reset_screen_saver = 0; /* re-init */ - } - else if(scrnsv_active) /* is the screen not blanked? */ - { - goto async_update_exit; /* do not update anything */ - } -#endif /* PCVT_SCREENSAVER */ - - /*-------------------------------------------------------------------*/ - /* this takes place on EVERY virtual screen (if not in X mode etc...)*/ - /*-------------------------------------------------------------------*/ - - if ( cursor_pos_valid && - (lastpos != (vsp->Crtat + vsp->cur_offset - Crtat))) - { - lastpos = vsp->Crtat + vsp->cur_offset - Crtat; - outb(addr_6845, CRTC_CURSORH); /* high register */ - outb(addr_6845+1, ((lastpos) >> 8)); - outb(addr_6845, CRTC_CURSORL); /* low register */ - outb(addr_6845+1, (lastpos)); - } - - if (arg == UPDATE_KERN) /* Magic arg: for kernel printfs */ - return; - - if(--counter) /* below is possible update */ - goto async_update_exit; /* just now and then ..... */ - counter = PCVT_UPDATESLOW; /* caution, see screensaver above !! */ - - /*-------------------------------------------------------------------*/ - /* this takes place ONLY on screen 0 if in HP mode, labels on, !X */ - /*-------------------------------------------------------------------*/ - - /* additional processing for HP necessary ? */ - - if((vs[0].vt_pure_mode == M_HPVT) && (vs[0].labels_on)) - { - static volatile u_char buffer[] = - "System Load: 1min: 0.00 5min: 0.00 15min: 0.00"; - register int tmp, i; -#if PCVT_SHOWKEYS - extern u_char rawkeybuf[80]; - - if(keyboard_show) - { - for(i = 0; i < 80; i++) - { - *((vs[0].Crtat+((vs[0].screen_rows+2) - * vs[0].maxcol))+i) = - user_attr | rawkeybuf[i]; - } - } - else - { -#endif /* PCVT_SHOWKEYS */ - - /* display load averages in last line (taken from tty.c) */ - i = 18; -#ifdef NEW_AVERUNNABLE - tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) - >> FSHIFT; -#else - tmp = (averunnable[0] * 100 + FSCALE / 2) >> FSHIFT; -#endif - - buffer[i++] = - ((((tmp/100)/10) == 0) ? - ' ' : - ((tmp/100)/10) + '0'); - buffer[i++] = ((tmp/100)%10) + '0'; - buffer[i++] = '.'; - buffer[i++] = ((tmp%100)/10) + '0'; - buffer[i++] = ((tmp%100)%10) + '0'; - i += 6; -#ifdef NEW_AVERUNNABLE - tmp = (averunnable.ldavg[1] * 100 + FSCALE / 2) - >> FSHIFT; -#else - tmp = (averunnable[1] * 100 + FSCALE / 2) >> FSHIFT; -#endif - buffer[i++] = ((((tmp/100)/10) == 0) ? - ' ' : - ((tmp/100)/10) + '0'); - buffer[i++] = ((tmp/100)%10) + '0'; - buffer[i++] = '.'; - buffer[i++] = ((tmp%100)/10) + '0'; - buffer[i++] = ((tmp%100)%10) + '0'; - i += 7; -#ifdef NEW_AVERUNNABLE - tmp = (averunnable.ldavg[2] * 100 + FSCALE / 2) - >> FSHIFT; -#else - tmp = (averunnable[2] * 100 + FSCALE / 2) >> FSHIFT; -#endif - buffer[i++] = ((((tmp/100)/10) == 0) ? - ' ' : - ((tmp/100)/10) + '0'); - buffer[i++] = ((tmp/100)%10) + '0'; - buffer[i++] = '.'; - buffer[i++] = ((tmp%100)/10) + '0'; - buffer[i++] = ((tmp%100)%10) + '0'; - buffer[i] = '\0'; - - for(i = 0; buffer[i]; i++) - { - *((vs[0].Crtat + - ((vs[0].screen_rows + 2) * vs[0].maxcol) - ) + i - ) = user_attr | buffer[i]; - } - -#if PCVT_SHOWKEYS - for(; i < 77; i++) - { - *((vs[0].Crtat + - ((vs[0].screen_rows + 2) * vs[0].maxcol) - ) + i - ) = user_attr | ' '; - } - - } -#endif /* PCVT_SHOWKEYS */ - } - - /*-------------------------------------------------------------------*/ - /* this takes place on EVERY screen which is in HP mode, labels on,!X*/ - /*-------------------------------------------------------------------*/ - - if((vsp->vt_pure_mode == M_HPVT) && (vsp->labels_on)) - { - register int col = vsp->col+1; - register u_short *p = vsp->Crtat + - (vsp->screen_rows * vsp->maxcol); - - /* update column display between labels */ - - if(vsp->maxcol == SCR_COL132) - { - p += (SCR_COL132 - SCR_COL80)/2; - - if(col >= 100) - { - *(p + LABEL_COLU) = user_attr | '1'; - col -= 100; - } - else - { - *(p + LABEL_COLU) = user_attr | '0'; - } - } - *(p + LABEL_COLH) = user_attr | ((col/10) + '0'); - *(p + LABEL_COLL) = user_attr | ((col%10) + '0'); - - /* update row display between labels */ - - *(p + LABEL_ROWH) = (user_attr | (((vsp->row+1)/10) + '0')); - *(p + LABEL_ROWL) = (user_attr | (((vsp->row+1)%10) + '0')); - } - -async_update_exit: - - if(arg == UPDATE_START) - { - async_update_ch = timeout(async_update, UPDATE_START, - PCVT_UPDATEFAST); - } -} - -/*---------------------------------------------------------------------------* - * set character set for virtual screen - *---------------------------------------------------------------------------*/ -void -set_charset(struct video_state *svsp, int curvgacs) -{ - static int sizetab[] = { 25, 28, 35, 40, 43, 50 }; - int oldsize, oldrows, newsize, newrows; - - if((curvgacs < 0) || (curvgacs > (NVGAFONTS-1))) - return; - - svsp->vga_charset = curvgacs; - - select_vga_charset(curvgacs); - - oldsize = svsp->screen_rowsize; - oldrows = svsp->screen_rows; - newsize = sizetab[(vgacs[curvgacs].screen_size)]; - newrows = newsize; - if (svsp->vt_pure_mode == M_HPVT) - newrows -= 3; - if (newrows == 25 && svsp->force24) - newrows = 24; - if (newrows < oldrows) { - int nscroll = svsp->row + 1 - newrows; - - if (svsp->row >= oldrows) /* Sanity check */ - nscroll = oldrows - newrows; - if (nscroll > 0) { - /* Scroll up */ - bcopy (svsp->Crtat + nscroll * svsp->maxcol, - svsp->Crtat, - newrows * svsp->maxcol * CHR); - svsp->row -= nscroll; - svsp->cur_offset -= nscroll * svsp->maxcol; - } - if (newrows < newsize) - fillw(user_attr | ' ', - svsp->Crtat + newrows * svsp->maxcol, - (newsize - newrows) * svsp->maxcol); - } else if (oldrows < newsize) - fillw(user_attr | ' ', - svsp->Crtat + oldrows * svsp->maxcol, - (newsize - oldrows) * svsp->maxcol); - - svsp->screen_rowsize = newsize; - svsp->screen_rows = newrows; - - /* Clip scrolling region */ - if(svsp->scrr_end > svsp->screen_rows - 1) - svsp->scrr_end = svsp->screen_rows - 1; - svsp->scrr_len = svsp->scrr_end - svsp->scrr_beg + 1; - - /* Clip cursor pos */ - - if(svsp->cur_offset > (svsp->scrr_len * svsp->maxcol)) - svsp->cur_offset = (svsp->scrr_len * svsp->maxcol) + svsp->col; -} - -/*---------------------------------------------------------------------------* - * select a vga character set - *---------------------------------------------------------------------------*/ -void -select_vga_charset(int vga_charset) -{ - int first, second; - int fflag = 0; - int sflag = 0; - u_char cmap = 0; - - static u_char cmaptaba[] = - {0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13}; - - static u_char cmaptabb[] = - {0x00, 0x04, 0x08, 0x0c, 0x20, 0x24, 0x28, 0x2c}; - - if((adaptor_type != EGA_ADAPTOR) && (adaptor_type != VGA_ADAPTOR)) - return; - - if((vga_charset < 0) || (vga_charset >= totalfonts)) - return; - - if(!vgacs[vga_charset].loaded) - return; - - /*-------------------------------------------------------------- - find the the first and second charset of a given resolution. - the first is used for lower 256 and the second (if any) is - used for the upper 256 entries of a complete 512 entry ega/ - vga charset. - --------------------------------------------------------------*/ - - for(first = 0; first < totalfonts; first++) - { - if(!vgacs[first].loaded) - continue; - if(vgacs[first].screen_size != vgacs[vga_charset].screen_size) - continue; - if(vgacs[first].char_scanlines != - vgacs[vga_charset].char_scanlines) - continue; - if(vgacs[first].scr_scanlines != - vgacs[vga_charset].scr_scanlines) - continue; - fflag = 1; - break; - } - - if(fflag != 1) - return; - - for(second = first+1; second < totalfonts; second++) - { - if(!vgacs[second].loaded) - continue; - if(vgacs[second].screen_size != vgacs[vga_charset].screen_size) - continue; - if(vgacs[second].char_scanlines != - vgacs[vga_charset].char_scanlines) - continue; - if(vgacs[second].scr_scanlines != - vgacs[vga_charset].scr_scanlines) - continue; - sflag = 1; - break; - } - - cmap = cmaptaba[first]; - if(sflag) - { - cmap |= cmaptabb[second]; - vgacs[first].secondloaded = second; - } - else - { - vgacs[first].secondloaded = 0; /*cs 0 can never become a 2nd!*/ - } - - if(vsp->wd132col) - { - cmap = (vga_charset & 0x07); - cmap |= 0x10; - } - - outb(TS_INDEX, TS_FONTSEL); /* character map select register */ - outb(TS_DATA, cmap); /* new char map */ - - outb(addr_6845, CRTC_MAXROW); /* max scan line reg */ - outb(addr_6845+1, - vgacs[first].char_scanlines); /* scanlines/char */ - - outb(addr_6845, CRTC_VDE); /* vert display enable end */ - outb(addr_6845+1, - vgacs[first].scr_scanlines); /* low byte of scr scanlines */ - - if((color == 0) && (adaptor_type == VGA_ADAPTOR)) - { - outb(addr_6845, CRTC_ULOC); /* underline location reg */ - outb(addr_6845+1, (vgacs[first].char_scanlines & 0x1F)); - } -} - -/*---------------------------------------------------------------------------* - * switch vga-card to load a character set - *---------------------------------------------------------------------------*/ -static void -setchargen(void) -{ - chargen_access = 1; /* flag we are accessing the chargen ram */ - - /* program sequencer to access character generator */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x01); /* synchronous reset */ - - outb(TS_INDEX, TS_WRPLMASK); - outb(TS_DATA, 0x04); /* write to map 2 */ - - outb(TS_INDEX, TS_MEMMODE); - outb(TS_DATA, 0x07); /* sequential addressing */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); /* clear synchronous reset */ - - /* program graphics controller to access character generator */ - - outb(GDC_INDEX, GDC_RDPLANESEL); - outb(GDC_DATA, 0x02); /* select map 2 for cpu reads */ - - outb(GDC_INDEX, GDC_MODE); - outb(GDC_DATA, 0x00); /* disable odd-even addressing */ - - outb(GDC_INDEX, GDC_MISC); - outb(GDC_DATA, 0x00); /* map starts at 0xA000 */ -} - -/*---------------------------------------------------------------------------* - * switch vga-card to load a character set to plane 3 - *---------------------------------------------------------------------------*/ -static void -setchargen3(void) -{ - chargen_access = 1; /* flag we are accessing the chargen ram */ - - /* program sequencer to access character generator */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x01); /* synchronous reset */ - - outb(TS_INDEX, TS_WRPLMASK); - outb(TS_DATA, 0x08); /* write to map 3 */ - - outb(TS_INDEX, TS_MEMMODE); - outb(TS_DATA, 0x07); /* sequential addressing */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); /* clear synchronous reset */ - - /* program graphics controller to access character generator */ - - outb(GDC_INDEX, GDC_RDPLANESEL); - outb(GDC_DATA, 0x03); /* select map 3 for cpu reads */ - - outb(GDC_INDEX, GDC_MODE); - outb(GDC_DATA, 0x00); /* disable odd-even addressing */ - - outb(GDC_INDEX, GDC_MISC); - outb(GDC_DATA, 0x00); /* map starts at 0xA000 */ -} - -/*---------------------------------------------------------------------------* - * switch back vga-card to normal operation - *---------------------------------------------------------------------------*/ -static void -resetchargen(void) -{ - /* program sequencer to access video ram */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x01); /* synchronous reset */ - - outb(TS_INDEX, TS_WRPLMASK); - outb(TS_DATA, 0x03); /* write to map 0 & 1 */ - - outb(TS_INDEX, TS_MEMMODE); - outb(TS_DATA, 0x03); /* odd-even addressing */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); /* clear synchronous reset */ - - /* program graphics controller to access character generator */ - - outb(GDC_INDEX, GDC_RDPLANESEL); - outb(GDC_DATA, 0x00); /* select map 0 for cpu reads */ - - outb(GDC_INDEX, GDC_MODE); - outb(GDC_DATA, 0x10); /* enable odd-even addressing */ - - outb(GDC_INDEX, GDC_MISC); - if(color) - outb(GDC_DATA, 0x0e); /* map starts at 0xb800 */ - else - outb(GDC_DATA, 0x0a); /* map starts at 0xb000 */ - - chargen_access = 0; /* flag we are NOT accessing the chargen ram */ -} - -#if PCVT_WAITRETRACE -/*---------------------------------------------------------------------------* - * wait for being in a retrace time window - * NOTE: this is __VERY__ bad programming practice in this environment !! - *---------------------------------------------------------------------------*/ - -static void -wait_retrace(void) -{ - if(color) - { - while(!(inb(GN_INPSTAT1C) & 0x01)) - ; - } - else - { - while(!(inb(GN_INPSTAT1M) & 0x01)) - ; - } -} - -#endif /* PCVT_WAITRETRACE */ - -/*---------------------------------------------------------------------------* - * switch screen off (VGA only) - *---------------------------------------------------------------------------*/ -void -vga_screen_off(void) -{ - unsigned char old; - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x01); /* synchronous reset */ - - outb(TS_INDEX, TS_MODE); /* clocking mode reg */ - old = inb(TS_DATA); /* get current value */ - - outb(TS_INDEX, TS_MODE); /* clocking mode reg */ - outb(TS_DATA, (old | 0x20)); /* screen off bit on */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); /* clear synchronous reset */ -} - -/*---------------------------------------------------------------------------* - * switch screen back on (VGA only) - *---------------------------------------------------------------------------*/ -void -vga_screen_on(void) -{ - unsigned char old; - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x01); /* synchronous reset */ - - outb(TS_INDEX, TS_MODE); /* clocking mode reg */ - old = inb(TS_DATA); /* get current value */ - - outb(TS_INDEX, TS_MODE); /* clocking mode reg */ - outb(TS_DATA, (old & ~0x20)); /* screen off bit off */ - - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); /* clear synchronous reset */ -} - -/*---------------------------------------------------------------------------* - * compute character set base address (in kernel map) - *---------------------------------------------------------------------------*/ -static unsigned char * -compute_charset_base(unsigned fontset) -{ - unsigned char *d = (unsigned char *)Crtat; - - static int charset_offset[8] = { 0x0000, 0x4000, 0x8000, 0xC000, - 0x2000, 0x6000, 0xA000, 0xE000 }; - - static int charsetw_offset[8] = { 0x0000, 0x2000, 0x4000, 0x6000, - 0x8000, 0xA000, 0xC000, 0xE000 }; - - switch(adaptor_type) - { - case EGA_ADAPTOR: - fontset = (fontset > 3) ? 3 : fontset; - break; - - case VGA_ADAPTOR: - fontset = (fontset > 7) ? 7 : fontset; - break; - - default: - return 0; - } - - if(color) - d -= (0xB8000 - 0xA0000); /* Point to 0xA0000 */ - else - d -= (0xB0000 - 0xA0000); /* Point to 0xA0000 */ - - if(vsp->wd132col) - d += charsetw_offset[fontset]; /* Load into Character set n */ - else - d += charset_offset[fontset]; /* Load into Character set n */ - - return d; -} - -/*---------------------------------------------------------------------------* - * load a char into ega/vga character generator ram - *---------------------------------------------------------------------------*/ -void -loadchar(int fontset, int character, int char_scanlines, u_char *char_table) -{ - unsigned char *d; - -#if PCVT_BACKUP_FONTS - unsigned char *bak; -#endif /* PCVT_BACKUP_FONTS */ - - int j, k; - - if((d = compute_charset_base(fontset)) == 0) - return; - - d += (character * 32); /* 32 bytes per character */ - - if(vsp->wd132col && - (fontset == 1||fontset == 3||fontset == 5||fontset == 7)) - setchargen3(); /* access chargen ram */ - else - setchargen(); /* access chargen ram */ - - for(j = k = 0; j < char_scanlines; j++) /* x bit high characters */ - { - *d = char_table[k]; - d++; - k++; - } - for(; j < 32; j++) /* Up to 32 bytes per character image*/ - { - *d = 0x00; - d++; - } - - resetchargen(); /* access video ram */ - -#if PCVT_BACKUP_FONTS - if(saved_charsets[fontset] == 0) - saved_charsets[fontset] = - (u_char *)malloc(32 * 256, M_DEVBUF, M_WAITOK); - - if((bak = saved_charsets[fontset])) - { - /* make a backup copy of this char */ - bak += (character * 32); - bzero(bak, 32); - bcopy(char_table, bak, char_scanlines); - } -#ifdef DIAGNOSTIC - else - panic("pcvt loadchar: no backup buffer"); -#endif /* DIAGNOSTIC */ - -#endif /* PCVT_BACKUP_FONTS */ - -} - -/*---------------------------------------------------------------------------* - * save/restore character set n to addr b - *---------------------------------------------------------------------------*/ -#if !PCVT_BACKUP_FONTS - -void -vga_move_charset(unsigned n, unsigned char *b, int save_it) -{ - unsigned char *d = compute_charset_base(n); - -#ifdef DIAGNOSTIC - if(d == 0) - panic("vga_move_charset: wrong adaptor"); -#endif - - if(vsp->wd132col && (n == 1||n == 3||n == 5||n == 7)) - { - setchargen3(); - d -= 0x2000; - } - else - { - setchargen(); - } - - /* PLEASE, leave the following alone using bcopyb, as several */ - /* chipsets have problems if their memory is accessed with 32 */ - /* or 16 bits wide, don't change this to using bcopy for speed! */ - - if(save_it) - bcopyb(d, b, 256 /* chars */ * 32 /* bytes per char */); - else - bcopyb(b, d, 256 /* chars */ * 32 /* bytes per char */); - - resetchargen(); -} - -#else /* PCVT_BACKUP_FONTS */ - -/* since there are always backed up copies, we do not save anything here */ -/* parameter "b" is totally ignored */ - -void -vga_move_charset(unsigned n, unsigned char *b, int save_it) -{ - unsigned char *d = compute_charset_base(n); - - if(save_it) - return; - - if(saved_charsets[n] == 0) -#ifdef DIAGNOSTIC - panic("pcvt: restoring unbuffered charset"); -#else - return; -#endif - -#ifdef DIAGNOSTIC - if(d == 0) - panic("vga_move_charset: wrong adaptor"); -#endif - - if(vsp->wd132col && (n == 1||n == 3||n == 5||n == 7)) - { - setchargen3(); - d -= 0x2000; - } - else - { - setchargen(); - } - - /* PLEASE, leave the following alone using bcopyb, as several */ - /* chipsets have problems if their memory is accessed with 32 */ - /* or 16 bits wide, don't change this to using bcopy for speed! */ - - bcopyb(saved_charsets[n], d, - 256 /* chars */ * 32 /* bytes per char */); - - resetchargen(); -} - -#endif /* PCVT_BACKUP_FONTS */ - - -#if !PCVT_USL_VT_COMPAT -/*---------------------------------------------------------------------------* - * switch to virtual screen n (0 ... PCVT_NSCREENS-1) - *---------------------------------------------------------------------------*/ -void -vgapage(int n) -{ - -#if !PCVT_KBD_FIFO - int x; -#endif /* !PCVT_KBD_FIFO */ - - int cols = vsp->maxcol; /* get current col val */ - - if(n < 0 || n >= totalscreens) - return; - -#if !PCVT_KBD_FIFO - x = spltty(); /* protect us */ -#endif /* !PCVT_KBD_FIFO */ - - /* video board memory -> kernel memory */ - - bcopy(vsp->Crtat, vsp->Memory, vsp->screen_rows * vsp->maxcol * CHR); - - vsp->Crtat = vsp->Memory; /* operate in memory now */ - - /* update global screen pointers/variables */ - - current_video_screen = n; /* current screen no */ - -#if !PCVT_NETBSD && !(PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200) - pcconsp = &pccons[n]; /* current tty */ -#elif PCVT_FREEBSD > 110 && PCVT_FREEBSD < 200 - pcconsp = pccons[n]; /* current tty */ -#else - pcconsp = pc_tty[n]; /* current tty */ -#endif - - vsp = &vs[n]; /* current video state ptr */ - - /* kernel memory -> video board memory */ - - bcopy(vsp->Crtat, Crtat, vsp->screen_rows * vsp->maxcol * CHR); - - vsp->Crtat = Crtat; /* operate on screen now */ - - outb(addr_6845, CRTC_STARTADRH); - outb(addr_6845+1, 0); - outb(addr_6845, CRTC_STARTADRL); - outb(addr_6845+1, 0); - -#if !PCVT_KBD_FIFO - splx(x); -#endif /* !PCVT_KBD_FIFO */ - - select_vga_charset(vsp->vga_charset); - - if(vsp->maxcol != cols) - vga_col(vsp, vsp->maxcol); /* select 80/132 columns */ - - outb(addr_6845, CRTC_CURSORH); /* select high register */ - outb(addr_6845+1, vsp->cur_offset >> 8); - outb(addr_6845, CRTC_CURSORL); /* select low register */ - outb(addr_6845+1, vsp->cur_offset); - - if(vsp->cursor_on) - { - outb(addr_6845, CRTC_CURSTART); /* select high register */ - outb(addr_6845+1, vsp->cursor_start); - outb(addr_6845, CRTC_CUREND); /* select low register */ - outb(addr_6845+1, vsp->cursor_end); - } - else - { - sw_cursor(0); - } - - if(adaptor_type == VGA_ADAPTOR) - { - unsigned i; - - /* switch VGA DAC palette entries */ - - for(i = 0; i < NVGAPEL; i++) - vgapaletteio(i, &vsp->palette[i], 1); - } - - update_led(); /* update led's */ - - update_hp(vsp); /* update fkey labels, if present */ -} -#endif /* !PCVT_USL_VT_COMPAT */ - -/*---------------------------------------------------------------------------* - * test if it is a vga - *---------------------------------------------------------------------------*/ - -int -vga_test(void) -{ - u_char old, new, check; - - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - old = inb(addr_6845+1); /* get current value */ - - new = old | CURSOR_ON_BIT; /* set cursor on by setting bit 5 on */ - - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - outb(addr_6845+1,new); /* cursor should be on now */ - - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - check = inb(addr_6845+1); /* get current value */ - - if(check != new) - { - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - outb(addr_6845+1,old); /* failsafe */ - return(0); /* must be ega */ - } - - new = old & ~CURSOR_ON_BIT; /* turn cursor off by clearing bit 5 */ - - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - outb(addr_6845+1,new); /* cursor should be off now */ - - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - check = inb(addr_6845+1); /* get current value */ - - if(check != new) - { - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - outb(addr_6845+1,old); /* failsafe */ - return(0); /* must be ega */ - } - - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - outb(addr_6845+1,old); /* failsafe */ - - return(1); /* vga */ -} - -/*---------------------------------------------------------------------------* - * convert upper/lower sixel font array to vga font array - *---------------------------------------------------------------------------*/ -void -sixel_vga(struct sixels *sixelp, u_char *vgachar) -{ - register int i, j; - register int shift; - register u_char mask; - - for(j = 0; j < 16; j++) - vgachar[j] = 0; - - mask = 0x01; - for(j = 0; j < 6; j++) - { - for(i = 0, shift = 7; i < 8; i++, shift--) - vgachar[j] |= ((((sixelp->upper[i]) & mask) >> j) - << shift); - mask <<= 1; - } - - mask = 0x01; - for(j = 0; j < 4; j++) - { - for(i = 0, shift = 7; i < 8; i++, shift--) - vgachar[j+6] |= ((((sixelp->lower[i]) & mask) >>j) - << shift); - mask <<= 1; - } -} - -/*---------------------------------------------------------------------------* - * Expand 8x10 EGA/VGA characters to 8x16 EGA/VGA characters - *---------------------------------------------------------------------------*/ -void -vga10_vga16(u_char *invga, u_char *outvga) -{ - register int i,j; - - /* - * Keep the top and bottom scanlines the same and double every scan - * line in between. - */ - - outvga[0] = invga[0]; - outvga[1] = invga[1]; - outvga[14] = invga[8]; - outvga[15] = invga[9]; - - for(i = j = 2;i < 8 && j < 14;i++,j += 2) - { - outvga[j] = invga[i]; - outvga[j+1] = invga[i]; - } -} - -/*---------------------------------------------------------------------------* - * Expand 8x10 EGA/VGA characters to 8x14 EGA/VGA characters - *---------------------------------------------------------------------------*/ -void -vga10_vga14(u_char *invga, u_char *outvga) -{ - register int i; - - /* - * Double the top two and bottom two scanlines and copy everything - * in between. - */ - - outvga[0] = invga[0]; - outvga[1] = invga[0]; - outvga[2] = invga[1]; - outvga[3] = invga[1]; - outvga[10] = invga[8]; - outvga[11] = invga[8]; - outvga[12] = invga[9]; - outvga[13] = invga[9]; - - for(i = 2;i < 8;i++) - outvga[i+2] = invga[i]; -} - -/*---------------------------------------------------------------------------* - * Expand 8x10 EGA/VGA characters to 8x10 EGA/VGA characters - *---------------------------------------------------------------------------*/ -void -vga10_vga10(u_char *invga, u_char *outvga) -{ - register int i; - - for(i = 0;i < 10;i++) - outvga[i] = invga[i]; -} - -/*---------------------------------------------------------------------------* - * Contract 8x10 EGA/VGA characters to 8x8 EGA/VGA characters - *---------------------------------------------------------------------------*/ -void -vga10_vga8(u_char *invga, u_char *outvga) -{ - /* Skip scanlines 3 and 7 */ - - outvga[0] = invga[0]; - outvga[1] = invga[1]; - outvga[2] = invga[2]; - outvga[3] = invga[4]; - outvga[4] = invga[5]; - outvga[5] = invga[6]; - outvga[6] = invga[8]; - outvga[7] = invga[9]; -} - -/*---------------------------------------------------------------------------* - * force a vga card to behave like an ega for debugging - *---------------------------------------------------------------------------*/ -#if FORCE_EGA -void -force_ega(void) -{ - unsigned char vgareg; - - if(adaptor_type == VGA_ADAPTOR) - { - adaptor_type = EGA_ADAPTOR; - totalfonts = 4; - vgareg = inb(GN_MISCOUTR); /* Miscellaneous Output Register */ - vgareg |= 128; /* Set 350 scanline mode */ - vgareg &= ~64; - outb(GN_MISCOUTW,vgareg); - } -} -#endif /* FORCE_EGA */ - -/*---------------------------------------------------------------------------* - * disconnect attribute bit 3 from generating intensity - * (and use it for a second character set !) - *---------------------------------------------------------------------------*/ -void -set_2ndcharset(void) -{ - if(color) /* prepare to access index register! */ - inb(GN_INPSTAT1C); - else - inb(GN_INPSTAT1M); - - /* select color plane enable reg, caution: set ATC access bit ! */ - - outb(ATC_INDEX, (ATC_COLPLEN | ATC_ACCESS)); - outb(ATC_DATAW, 0x07); /* disable plane 3 */ -} - -#if PCVT_SCREENSAVER -#if PCVT_PRETTYSCRNS - -/*---------------------------------------------------------------------------* - * produce some kinda random number, had a look into the system library... - *---------------------------------------------------------------------------*/ -static u_short -getrand(void) -{ -#if !PCVT_FREEBSD - extern struct timeval time; /* time-of-day register */ -#endif - static unsigned long seed = 1; - register u_short res = (u_short)seed; - seed = seed * 1103515245L + time_second; - return res; -} - -/*---------------------------------------------------------------------------* - * produce "nice" screensaving .... - *---------------------------------------------------------------------------*/ -static void -scrnsv_blink(void * arg) -{ - static struct rgb blink_rgb[8] = - { - {63, 63, 63}, /* white */ - {0, 63, 42}, /* pale green */ - {63, 63, 0}, /* yellow */ - {63, 21, 63}, /* violet */ - {42, 63, 0}, /* yellow-green */ - {63, 42, 0}, /* amber */ - {63, 42, 42}, /* rose */ - {21, 42, 42} /* cyan */ - }; - register u_short r = getrand(); - unsigned pos = (r % (scrnsv_size / 2)); - - *scrnsv_current = /* (0 << 8) + */ ' '; - scrnsv_current = vsp->Crtat + pos; - *scrnsv_current = (7 /* LIGHTGRAY */ << 8) + '*'; - if(adaptor_type == VGA_ADAPTOR) - vgapaletteio(7 /* LIGHTGRAY */, &blink_rgb[(r >> 4) & 7], 1); - scrnsv_blink_ch = timeout(scrnsv_blink, NULL, hz); -} - -#endif /* PCVT_PRETTYSCRNS */ - -/*---------------------------------------------------------------------------* - * set timeout time - *---------------------------------------------------------------------------*/ -#ifndef XSERVER -static void -pcvt_set_scrnsv_tmo(int timeout) -#else -void -pcvt_set_scrnsv_tmo(int timeout) -#endif /* XSERVER */ -{ - int x = splhigh(); - - if(scrnsv_timeout) - untimeout(scrnsv_timedout, NULL, scrnsv_timeout_ch); - - scrnsv_timeout = timeout; - pcvt_scrnsv_reset(); /* sanity */ - splx(x); - if(timeout == 0 && savedscreen) - { - /* release buffer when screen saver turned off */ - free(savedscreen, M_TEMP); - savedscreen = (u_short *)0; - } -} - -/*---------------------------------------------------------------------------* - * we were timed out - *---------------------------------------------------------------------------*/ -static void -scrnsv_timedout(void *arg) -{ - /* this function is called by timeout() */ - /* raise priority to avoid conflicts with kbd intr */ - int x = spltty(); - - /* - * due to some undefined problems with video adaptor RAM - * access timing, the following has been splitted into - * two pieces called subsequently with a time difference - * of 100 millisec - */ - - if(++scrnsv_active == 1) - { - register size_t s; - /* - * first, allocate a buffer - * do only if none allocated yet or another size required - * this reduces malloc() overhead by avoiding successive - * calls to malloc() and free() if they would have requested - * the same buffer - * - * XXX This is inherited from old days where no buffering - * happened at all. Meanwhile we should use the standard - * screen buffer instead. Any volunteers? :-) [At least, - * this code proved to work...] - */ - - s = sizeof(u_short) * vsp->screen_rowsize * vsp->maxcol; - - if(savedscreen == (u_short *)0 || s != scrnsv_size) - { - /* really need to allocate */ - if(savedscreen) - free(savedscreen, M_TEMP); - scrnsv_size = s; - if((savedscreen = - (u_short *)malloc(s, M_TEMP, M_NOWAIT)) - == (u_short *)0) - { - /* - * didn't get the buffer memory, - * turn off screen saver - */ - scrnsv_timeout = scrnsv_active = 0; - splx(x); - return; - } - } - /* save current screen */ - bcopy(vsp->Crtat, savedscreen, scrnsv_size); - - /* on VGA's, make sure palette is set to blank screen */ - if(adaptor_type == VGA_ADAPTOR) - { - struct rgb black = {0, 0, 0}; - vgapaletteio(0 /* BLACK */, &black, 1); - } - /* prepare for next time... */ - scrnsv_timeout_ch = timeout(scrnsv_timedout, NULL, hz / 10); - } - else - { - /* second call, now blank the screen */ - /* fill screen with blanks */ - fillw(/* (BLACK<<8) + */ ' ', vsp->Crtat, scrnsv_size / 2); - -#if PCVT_PRETTYSCRNS - scrnsv_current = vsp->Crtat; - scrnsv_blink_ch = timeout(scrnsv_blink, NULL, hz); -#endif /* PCVT_PRETTYSCRNS */ - - sw_cursor(0); /* cursor off on mda/cga */ - } - splx(x); -} - -/*---------------------------------------------------------------------------* - * interface to screensaver "subsystem" - *---------------------------------------------------------------------------*/ -void -pcvt_scrnsv_reset(void) -{ - /* - * to save lotta time with superfluous timeout()/untimeout() calls - * when having massive output operations, we remember the last - * second of kernel timer we've rescheduled scrnsv_timedout() - */ - static long last_schedule = 0L; - register int x = splhigh(); - int reschedule = 0; - - if((scrnsv_active == 1 || scrnsv_timeout) && - last_schedule != time_second) - { - last_schedule = time_second; - reschedule = 1; - untimeout(scrnsv_timedout, NULL, scrnsv_timeout_ch); - } - if(scrnsv_active) - { - -#if PCVT_PRETTYSCRNS - if(scrnsv_active > 1) - untimeout(scrnsv_blink, NULL, scrnsv_blink_ch); -#endif /* PCVT_PRETTYSCRNS */ - - bcopy(savedscreen, vsp->Crtat, scrnsv_size); - if(adaptor_type == VGA_ADAPTOR) - { - /* back up VGA palette info */ - vgapaletteio(0 /* BLACK */, &vsp->palette[0], 1); - -#if PCVT_PRETTYSCRNS - vgapaletteio(7 /* LIGHTGRAY */, &vsp->palette[7], 1); -#endif /* PCVT_PRETTYSCRNS */ - - } - scrnsv_active = 0; - - if(vsp->cursor_on) - sw_cursor(1); /* cursor on */ - } - - if(reschedule) - { - /* mark next timeout */ - scrnsv_timeout_ch = timeout(scrnsv_timedout, NULL, - scrnsv_timeout * hz); - } - splx(x); -} - -#endif /* PCVT_SCREENSAVER */ - -/*---------------------------------------------------------------------------* - * switch cursor on/off - *---------------------------------------------------------------------------*/ -void -sw_cursor(int onoff) -{ - if(adaptor_type == EGA_ADAPTOR) - { - int start, end; - if(onoff) - { - start = vsp->cursor_start; - end = vsp->cursor_end; - } - else - { - int cs = vs[current_video_screen].vga_charset; - - cs = (cs < 0) ? 0 : ((cs < totalfonts) ? - cs : totalfonts-1); - - start = (vgacs[cs].char_scanlines & 0x1F) + 1; - end = 0; - } - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - outb(addr_6845+1, start); - outb(addr_6845,CRTC_CUREND); /* cursor end reg */ - outb(addr_6845+1, end); - } - else /* mda, cga, vga */ - { - outb(addr_6845,CRTC_CURSTART); /* cursor start reg */ - if(onoff) - outb(addr_6845+1, vsp->cursor_start); - else - outb(addr_6845+1, CURSOR_ON_BIT); - } -} - -/*---------------------------------------------------------------------------* - * cold init support, if a mono monitor is attached to a - * vga or ega, it comes up with a mda emulation. switch - * board to generic ega/vga mode in this case. - *---------------------------------------------------------------------------*/ -void -mda2egaorvga(void) -{ - /* - * program sequencer to access - * video ram - */ - - /* synchronous reset */ - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x01); - - /* write to map 0 & 1 */ - outb(TS_INDEX, TS_WRPLMASK); - outb(TS_DATA, 0x03); - - /* odd-even addressing */ - outb(TS_INDEX, TS_MEMMODE); - outb(TS_DATA, 0x03); - - /* clear synchronous reset */ - outb(TS_INDEX, TS_SYNCRESET); - outb(TS_DATA, 0x03); - - /* - * program graphics controller - * to access character - * generator - */ - - /* select map 0 for cpu reads */ - outb(GDC_INDEX, GDC_RDPLANESEL); - outb(GDC_DATA, 0x00); - - /* enable odd-even addressing */ - outb(GDC_INDEX, GDC_MODE); - outb(GDC_DATA, 0x10); - - /* map starts at 0xb000 */ - outb(GDC_INDEX, GDC_MISC); - outb(GDC_DATA, 0x0a); -} - -#endif /* NVT > 0 */ - -/* ------------------------- E O F ------------------------------------------*/ diff --git a/sys/i386/isa/pcvt/pcvt_tbl.h b/sys/i386/isa/pcvt/pcvt_tbl.h deleted file mode 100644 index c515679..0000000 --- a/sys/i386/isa/pcvt/pcvt_tbl.h +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis. - * - * 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 - * 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_tbl.h, 3.20, Last Edit-Date: [Sun Apr 2 18:59:19 1995] - * - */ - -/*---------------------------------------------------------------------------* - * - * pcvt_tbl.h VT220 Driver Character Set Conversion Tables - * ------------------------------------------------------------ - * -hm splitting off pccons_out.c - * -hm default tables for pure mda/hcg/cga - * - * in pcvt_out.c, hooks are provided for the following charactersets: - * - * HAVECS_BRITISH - * HAVECS_ASCII - * HAVECS_FINNISH - * HAVECS_NORWEGIANDANISH - * HAVECS_SWEDISH - * HAVECS_GERMAN - * HAVECS_FRENCHCANADA - * HAVECS_FRENCH - * HAVECS_ITALIAN - * HAVECS_SPANISH - * HAVECS_SPECIAL - * HAVECS_ALTERNATEROM1 - * HAVECS_ALTERNATEROM2 - * HAVECS_ROMAN8 - * HAVECS_DUTCH - * HAVECS_SUPPLEMENTAL - * HAVECS_SWISS - * HAVECS_TECHNICAL - * HAVECS_ISOLATIN - * - * to add support for a new charcterset, you have to provide the - * table named "cs_<charset>",define the according "HAVECS_<CHARSET>" - * and recompile everything. ref: pcvt_out.c, vt_designate() - * - *---------------------------------------------------------------------------*/ - -/*===========================================================================* - * DEFAULT TABLES FOR MDA/HCG/CGA - *===========================================================================*/ - -/*---------------------------------------------------------------------------* - * ASCII Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSD_ASCII -u_short csd_ascii[CSSIZE] = { -/* 20 */ 0x20 | CSL, 0x21 | CSL, 0x22 | CSL, 0x23 | CSL, -/* 24 */ 0x24 | CSL, 0x25 | CSL, 0x26 | CSL, 0x27 | CSL, -/* 28 */ 0x28 | CSL, 0x29 | CSL, 0x2A | CSL, 0x2B | CSL, -/* 2C */ 0x2C | CSL, 0x2D | CSL, 0x2E | CSL, 0x2F | CSL, - -/* 30 */ 0x30 | CSL, 0x31 | CSL, 0x32 | CSL, 0x33 | CSL, -/* 34 */ 0x34 | CSL, 0x35 | CSL, 0x36 | CSL, 0x37 | CSL, -/* 38 */ 0x38 | CSL, 0x39 | CSL, 0x3A | CSL, 0x3B | CSL, -/* 3C */ 0x3C | CSL, 0x3D | CSL, 0x3E | CSL, 0x3F | CSL, - -/* 40 */ 0x40 | CSL, 0x41 | CSL, 0x42 | CSL, 0x43 | CSL, -/* 44 */ 0x44 | CSL, 0x45 | CSL, 0x46 | CSL, 0x47 | CSL, -/* 48 */ 0x48 | CSL, 0x49 | CSL, 0x4A | CSL, 0x4B | CSL, -/* 4C */ 0x4C | CSL, 0x4D | CSL, 0x4E | CSL, 0x4F | CSL, - -/* 50 */ 0x50 | CSL, 0x51 | CSL, 0x52 | CSL, 0x53 | CSL, -/* 54 */ 0x54 | CSL, 0x55 | CSL, 0x56 | CSL, 0x57 | CSL, -/* 58 */ 0x58 | CSL, 0x59 | CSL, 0x5A | CSL, 0x5B | CSL, -/* 5C */ 0x5C | CSL, 0x5D | CSL, 0x5E | CSL, 0x5F | CSL, - -/* 60 */ 0x60 | CSL, 0x61 | CSL, 0x62 | CSL, 0x63 | CSL, -/* 64 */ 0x64 | CSL, 0x65 | CSL, 0x66 | CSL, 0x67 | CSL, -/* 68 */ 0x68 | CSL, 0x69 | CSL, 0x6A | CSL, 0x6B | CSL, -/* 6C */ 0x6C | CSL, 0x6D | CSL, 0x6E | CSL, 0x6F | CSL, - -/* 70 */ 0x70 | CSL, 0x71 | CSL, 0x72 | CSL, 0x73 | CSL, -/* 74 */ 0x74 | CSL, 0x75 | CSL, 0x76 | CSL, 0x77 | CSL, -/* 78 */ 0x78 | CSL, 0x79 | CSL, 0x7A | CSL, 0x7B | CSL, -/* 7C */ 0x7C | CSL, 0x7D | CSL, 0x7E | CSL, 0x7F | CSL, -}; - -/*---------------------------------------------------------------------------* - * DEC Supplemental Graphic Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSD_SUPPLEMENTAL -u_short csd_supplemental[CSSIZE] = { -/* 20 */ 0x20 | CSL, 0xAD | CSL, 0x9B | CSL, 0x9C | CSL, -/* 24 */ 0x20 | CSL, 0x9D | CSL, 0x20 | CSL, 0x20 | CSL, -/* 28 */ 0x20 | CSL, 0x20 | CSL, 0xA6 | CSL, 0xAE | CSL, -/* 2C */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, - -/* 30 */ 0xF8 | CSL, 0xF1 | CSL, 0xFD | CSL, 0x20 | CSL, -/* 34 */ 0x20 | CSL, 0xE6 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 38 */ 0x20 | CSL, 0x20 | CSL, 0xA7 | CSL, 0xAF | CSL, -/* 3C */ 0xAC | CSL, 0xAB | CSL, 0x20 | CSL, 0xA8 | CSL, - -/* 40 */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 44 */ 0x8E | CSL, 0x8F | CSL, 0x92 | CSL, 0x80 | CSL, -/* 48 */ 0x20 | CSL, 0x90 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 4C */ 0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL, - -/* 50 */ 0x20 | CSL, 0xA5 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 54 */ 0x20 | CSL, 0x20 | CSL, 0x99 | CSL, 0x20 | CSL, -/* 58 */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 5C */ 0x9A | CSL, 0x20 | CSL, 0x20 | CSL, 0xE1 | CSL, - -/* 60 */ 0x85 | CSL, 0xA0 | CSL, 0x83 | CSL, 0x20 | CSL, -/* 64 */ 0x84 | CSL, 0x86 | CSL, 0x91 | CSL, 0x87 | CSL, -/* 68 */ 0x8A | CSL, 0x82 | CSL, 0x88 | CSL, 0x89 | CSL, -/* 6C */ 0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL, - -/* 70 */ 0x20 | CSL, 0xA4 | CSL, 0x95 | CSL, 0xA2 | CSL, -/* 74 */ 0x93 | CSL, 0x20 | CSL, 0x94 | CSL, 0x20 | CSL, -/* 78 */ 0x20 | CSL, 0x97 | CSL, 0xA3 | CSL, 0x96 | CSL, -/* 7C */ 0x81 | CSL, 0x98 | CSL, 0x20 | CSL, 0x20 | CSL -}; - -/*---------------------------------------------------------------------------* - * DEC Special Graphic Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSD_SPECIAL -u_short csd_special[CSSIZE] = { -/* 20 */ 0x20 | CSL, 0x21 | CSL, 0x22 | CSL, 0x23 | CSL, -/* 24 */ 0x24 | CSL, 0x25 | CSL, 0x26 | CSL, 0x27 | CSL, -/* 28 */ 0x28 | CSL, 0x29 | CSL, 0x2A | CSL, 0x2B | CSL, -/* 2C */ 0x2C | CSL, 0x2D | CSL, 0x2E | CSL, 0x2F | CSL, - -/* 30 */ 0x30 | CSL, 0x31 | CSL, 0x32 | CSL, 0x33 | CSL, -/* 34 */ 0x34 | CSL, 0x35 | CSL, 0x36 | CSL, 0x37 | CSL, -/* 38 */ 0x38 | CSL, 0x39 | CSL, 0x3A | CSL, 0x3B | CSL, -/* 3C */ 0x3C | CSL, 0x3D | CSL, 0x3E | CSL, 0x3F | CSL, - -/* 40 */ 0x40 | CSL, 0x41 | CSL, 0x42 | CSL, 0x43 | CSL, -/* 44 */ 0x44 | CSL, 0x45 | CSL, 0x46 | CSL, 0x47 | CSL, -/* 48 */ 0x48 | CSL, 0x49 | CSL, 0x4A | CSL, 0x4B | CSL, -/* 4C */ 0x4C | CSL, 0x4D | CSL, 0x4E | CSL, 0x4F | CSL, - -/* 50 */ 0x50 | CSL, 0x51 | CSL, 0x52 | CSL, 0x53 | CSL, -/* 54 */ 0x54 | CSL, 0x55 | CSL, 0x56 | CSL, 0x57 | CSL, -/* 58 */ 0x58 | CSL, 0x59 | CSL, 0x5A | CSL, 0x5B | CSL, -/* 5C */ 0x5C | CSL, 0x5D | CSL, 0x5E | CSL, 0x20 | CSL, - -/* 60 */ 0x20 | CSL, 0xB0 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 64 */ 0x20 | CSL, 0x20 | CSL, 0xF8 | CSL, 0xF1 | CSL, -/* 68 */ 0x20 | CSL, 0x20 | CSL, 0xD9 | CSL, 0xBF | CSL, -/* 6C */ 0xDA | CSL, 0xC0 | CSL, 0xC5 | CSL, 0x20 | CSL, - -/* 70 */ 0x20 | CSL, 0xC4 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 74 */ 0xC3 | CSL, 0xB4 | CSL, 0xC1 | CSL, 0xC2 | CSL, -/* 78 */ 0xB3 | CSL, 0xF3 | CSL, 0xF2 | CSL, 0xE3 | CSL, -/* 7C */ 0x20 | CSL, 0x9C | CSL, 0x20 | CSL, 0x20 | CSL -}; - -/*---------------------------------------------------------------------------* - * DEC Technical Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSD_TECHNICAL -u_short csd_technical[CSSIZE] = { -/* 20 */ 0xFE | CSH, 0xFB | CSL, 0xDA | CSL, 0xC4 | CSL, -/* 24 */ 0xF4 | CSL, 0xF5 | CSL, 0xB3 | CSL, 0xDA | CSL, -/* 28 */ 0xC0 | CSL, 0xBF | CSL, 0xD9 | CSL, 0x20 | CSL, -/* 2C */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, - -/* 30 */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 34 */ 0x20 | CSL, 0xAA | CSL, 0xA9 | CSL, 0x3E | CSL, -/* 38 */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 3C */ 0xF3 | CSL, 0x20 | CSL, 0xF2 | CSL, 0x20 | CSL, - -/* 40 */ 0x20 | CSL, 0x20 | CSL, 0xEC | CSL, 0xF6 | CSL, -/* 44 */ 0x20 | CSL, 0x20 | CSL, 0xE8 | CSL, 0xE2 | CSL, -/* 48 */ 0x20 | CSL, 0xF7 | CSL, 0xE9 | CSL, 0x78 | CSL, -/* 4C */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0xF0 | CSL, - -/* 50 */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0xE4 | CSL, -/* 54 */ 0x20 | CSL, 0x20 | CSL, 0xFB | CSL, 0xEA | CSL, -/* 58 */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 5C */ 0xEF | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, - -/* 60 */ 0xAA | CSL, 0xE0 | CSL, 0xE1 | CSL, 0x20 | CSL, -/* 64 */ 0xEB | CSL, 0x20 | CSL, 0xED | CSL, 0x59 | CSL, -/* 68 */ 0x20 | CSL, 0x20 | CSL, 0xE9 | CSL, 0x20 | CSL, -/* 6C */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, - -/* 70 */ 0xE3 | CSL, 0x20 | CSL, 0x20 | CSL, 0xE5 | CSL, -/* 74 */ 0xE7 | CSL, 0x20 | CSL, 0x9F | CSL, 0x20 | CSL, -/* 78 */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 7C */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL -}; - -/*---------------------------------------------------------------------------* - * ISO Latin-1 Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSD_ISOLATIN -u_short csd_isolatin[CSSIZE] = { -/* 20 */ 0x20 | CSL, 0xAD | CSL, 0x9B | CSL, 0x9C | CSL, -/* 24 */ 0x20 | CSL, 0x9D | CSL, 0x7C | CSL, 0x20 | CSL, -/* 28 */ 0x22 | CSL, 0x20 | CSL, 0xA6 | CSL, 0xAE | CSL, -/* 2C */ 0xAA | CSL, 0x2D | CSL, 0x20 | CSL, 0x2D | CSL, - -/* 30 */ 0xF8 | CSL, 0xF1 | CSL, 0xFD | CSL, 0x20 | CSL, -/* 34 */ 0x27 | CSL, 0xE6 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 38 */ 0x20 | CSL, 0x20 | CSL, 0xA7 | CSL, 0xAF | CSL, -/* 3C */ 0xAC | CSL, 0xAB | CSL, 0x20 | CSL, 0xA8 | CSL, - -/* 40 */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 44 */ 0x8E | CSL, 0x8F | CSL, 0x92 | CSL, 0x80 | CSL, -/* 48 */ 0x20 | CSL, 0x90 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 4C */ 0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL, - -/* 50 */ 0x20 | CSL, 0xA5 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 54 */ 0x20 | CSL, 0x20 | CSL, 0x99 | CSL, 0x78 | CSL, -/* 58 */ 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, 0x20 | CSL, -/* 5C */ 0x9A | CSL, 0x20 | CSL, 0x20 | CSL, 0xE1 | CSL, - -/* 60 */ 0x85 | CSL, 0xA0 | CSL, 0x83 | CSL, 0x20 | CSL, -/* 64 */ 0x84 | CSL, 0x86 | CSL, 0x91 | CSL, 0x87 | CSL, -/* 68 */ 0x8A | CSL, 0x82 | CSL, 0x88 | CSL, 0x89 | CSL, -/* 6C */ 0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL, - -/* 70 */ 0x20 | CSL, 0xA4 | CSL, 0x95 | CSL, 0xA2 | CSL, -/* 74 */ 0x93 | CSL, 0x20 | CSL, 0x94 | CSL, 0xF6 | CSL, -/* 78 */ 0x20 | CSL, 0x97 | CSL, 0xA3 | CSL, 0x96 | CSL, -/* 7C */ 0x81 | CSL, 0x20 | CSL, 0x20 | CSL, 0x98 | CSL -}; - -/*===========================================================================* - * EXTENDED TABLES FOR EGA/VGA - *===========================================================================*/ - -/*---------------------------------------------------------------------------* - * ASCII Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSE_ASCII -u_short cse_ascii[CSSIZE] = { -/* 20 */ 0x20 | CSL, 0x21 | CSL, 0x22 | CSL, 0x23 | CSL, -/* 24 */ 0x24 | CSL, 0x25 | CSL, 0x26 | CSL, 0x27 | CSL, -/* 28 */ 0x28 | CSL, 0x29 | CSL, 0x2A | CSL, 0x2B | CSL, -/* 2C */ 0x2C | CSL, 0x2D | CSL, 0x2E | CSL, 0x2F | CSL, - -/* 30 */ 0x30 | CSL, 0x31 | CSL, 0x32 | CSL, 0x33 | CSL, -/* 34 */ 0x34 | CSL, 0x35 | CSL, 0x36 | CSL, 0x37 | CSL, -/* 38 */ 0x38 | CSL, 0x39 | CSL, 0x3A | CSL, 0x3B | CSL, -/* 3C */ 0x3C | CSL, 0x3D | CSL, 0x3E | CSL, 0x3F | CSL, - -/* 40 */ 0x40 | CSL, 0x41 | CSL, 0x42 | CSL, 0x43 | CSL, -/* 44 */ 0x44 | CSL, 0x45 | CSL, 0x46 | CSL, 0x47 | CSL, -/* 48 */ 0x48 | CSL, 0x49 | CSL, 0x4A | CSL, 0x4B | CSL, -/* 4C */ 0x4C | CSL, 0x4D | CSL, 0x4E | CSL, 0x4F | CSL, - -/* 50 */ 0x50 | CSL, 0x51 | CSL, 0x52 | CSL, 0x53 | CSL, -/* 54 */ 0x54 | CSL, 0x55 | CSL, 0x56 | CSL, 0x57 | CSL, -/* 58 */ 0x58 | CSL, 0x59 | CSL, 0x5A | CSL, 0x5B | CSL, -/* 5C */ 0x5C | CSL, 0x5D | CSL, 0x5E | CSL, 0x5F | CSL, - -/* 60 */ 0x60 | CSL, 0x61 | CSL, 0x62 | CSL, 0x63 | CSL, -/* 64 */ 0x64 | CSL, 0x65 | CSL, 0x66 | CSL, 0x67 | CSL, -/* 68 */ 0x68 | CSL, 0x69 | CSL, 0x6A | CSL, 0x6B | CSL, -/* 6C */ 0x6C | CSL, 0x6D | CSL, 0x6E | CSL, 0x6F | CSL, - -/* 70 */ 0x70 | CSL, 0x71 | CSL, 0x72 | CSL, 0x73 | CSL, -/* 74 */ 0x74 | CSL, 0x75 | CSL, 0x76 | CSL, 0x77 | CSL, -/* 78 */ 0x78 | CSL, 0x79 | CSL, 0x7A | CSL, 0x7B | CSL, -/* 7C */ 0x7C | CSL, 0x7D | CSL, 0x7E | CSL, 0xB0 | CSL, -}; - -/*---------------------------------------------------------------------------* - * DEC Supplemental Graphic Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSE_SUPPLEMENTAL -u_short cse_supplemental[CSSIZE] = { -/* 20 */ 0x20 | CSL, 0xAD | CSL, 0x9B | CSL, 0x9C | CSL, -/* 24 */ 0x9F | CSH, 0x67 | CSH, 0x9F | CSH, 0x15 | CSL, -/* 28 */ 0x9D | CSH, 0x9C | CSH, 0xA6 | CSL, 0xAE | CSL, -/* 2C */ 0x9F | CSH, 0x9F | CSH, 0x9F | CSH, 0x9F | CSH, - -/* 30 */ 0xF8 | CSL, 0xF1 | CSL, 0xFD | CSL, 0x9B | CSH, -/* 34 */ 0x9F | CSH, 0xE6 | CSL, 0x14 | CSL, 0x99 | CSH, -/* 38 */ 0x9F | CSH, 0x98 | CSH, 0xA7 | CSL, 0xAF | CSL, -/* 3C */ 0xAC | CSL, 0xAB | CSL, 0x9F | CSH, 0xA8 | CSL, - -/* 40 */ 0x97 | CSH, 0x96 | CSH, 0x95 | CSH, 0x94 | CSH, -/* 44 */ 0x8E | CSL, 0x8F | CSL, 0x92 | CSL, 0x80 | CSL, -/* 48 */ 0x93 | CSH, 0x90 | CSL, 0x92 | CSH, 0x91 | CSH, -/* 4C */ 0x90 | CSH, 0x8F | CSH, 0x8E | CSH, 0x8D | CSH, - -/* 50 */ 0x9F | CSH, 0xA5 | CSL, 0x8C | CSH, 0x8B | CSH, -/* 54 */ 0x8A | CSH, 0x89 | CSH, 0x99 | CSL, 0x88 | CSH, -/* 58 */ 0x87 | CSH, 0x86 | CSH, 0x85 | CSH, 0x84 | CSH, -/* 5C */ 0x9A | CSL, 0x83 | CSH, 0x9F | CSH, 0xE1 | CSL, - -/* 60 */ 0x85 | CSL, 0xA0 | CSL, 0x83 | CSL, 0x82 | CSH, -/* 64 */ 0x84 | CSL, 0x86 | CSL, 0x91 | CSL, 0x87 | CSL, -/* 68 */ 0x8A | CSL, 0x82 | CSL, 0x88 | CSL, 0x89 | CSL, -/* 6C */ 0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL, - -/* 70 */ 0x9F | CSH, 0xA4 | CSL, 0x95 | CSL, 0xA2 | CSL, -/* 74 */ 0x93 | CSL, 0x81 | CSH, 0x94 | CSL, 0x80 | CSH, -/* 78 */ 0x7F | CSH, 0x97 | CSL, 0xA3 | CSL, 0x96 | CSL, -/* 7C */ 0x81 | CSL, 0x98 | CSL, 0x9F | CSH, 0x20 | CSL -}; - -/*---------------------------------------------------------------------------* - * DEC Special Graphic Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSE_SPECIAL -u_short cse_special[CSSIZE] = { -/* 20 */ 0x20 | CSL, 0x21 | CSL, 0x22 | CSL, 0x23 | CSL, -/* 24 */ 0x24 | CSL, 0x25 | CSL, 0x26 | CSL, 0x27 | CSL, -/* 28 */ 0x28 | CSL, 0x29 | CSL, 0x2A | CSL, 0x2B | CSL, -/* 2C */ 0x2C | CSL, 0x2D | CSL, 0x2E | CSL, 0x2F | CSL, - -/* 30 */ 0x30 | CSL, 0x31 | CSL, 0x32 | CSL, 0x33 | CSL, -/* 34 */ 0x34 | CSL, 0x35 | CSL, 0x36 | CSL, 0x37 | CSL, -/* 38 */ 0x38 | CSL, 0x39 | CSL, 0x3A | CSL, 0x3B | CSL, -/* 3C */ 0x3C | CSL, 0x3D | CSL, 0x3E | CSL, 0x3F | CSL, - -/* 40 */ 0x40 | CSL, 0x41 | CSL, 0x42 | CSL, 0x43 | CSL, -/* 44 */ 0x44 | CSL, 0x45 | CSL, 0x46 | CSL, 0x47 | CSL, -/* 48 */ 0x48 | CSL, 0x49 | CSL, 0x4A | CSL, 0x4B | CSL, -/* 4C */ 0x4C | CSL, 0x4D | CSL, 0x4E | CSL, 0x4F | CSL, - -/* 50 */ 0x50 | CSL, 0x51 | CSL, 0x52 | CSL, 0x53 | CSL, -/* 54 */ 0x54 | CSL, 0x55 | CSL, 0x56 | CSL, 0x57 | CSL, -/* 58 */ 0x58 | CSL, 0x59 | CSL, 0x5A | CSL, 0x5B | CSL, -/* 5C */ 0x5C | CSL, 0x5D | CSL, 0x5E | CSL, 0x20 | CSL, - -/* 60 */ 0x04 | CSL, 0xB0 | CSL, 0x09 | CSH, 0x0C | CSH, -/* 64 */ 0x0D | CSH, 0x0A | CSH, 0xF8 | CSL, 0xF1 | CSL, -/* 68 */ 0x00 | CSH, 0x0B | CSH, 0xD9 | CSL, 0xBF | CSL, -/* 6C */ 0xDA | CSL, 0xC0 | CSL, 0xC5 | CSL, 0x7D | CSH, - -/* 70 */ 0x7C | CSH, 0x7B | CSH, 0x7A | CSH, 0x79 | CSH, -/* 74 */ 0xC3 | CSL, 0xB4 | CSL, 0xC1 | CSL, 0xC2 | CSL, -/* 78 */ 0xB3 | CSL, 0xF3 | CSL, 0xF2 | CSL, 0xE3 | CSL, -/* 7C */ 0x78 | CSH, 0x9C | CSL, 0x99 | CSH, 0x20 | CSL -}; - -/*---------------------------------------------------------------------------* - * DEC Technical Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSE_TECHNICAL -u_short cse_technical[CSSIZE] = { -/* 20 */ 0x20 | CSL, 0x65 | CSH, 0xDA | CSL, 0xC4 | CSL, -/* 24 */ 0xF4 | CSL, 0xF5 | CSL, 0xB3 | CSL, 0xDA | CSL, -/* 28 */ 0xC0 | CSL, 0xBF | CSL, 0xD9 | CSL, 0x61 | CSH, -/* 2C */ 0x62 | CSH, 0x63 | CSH, 0x64 | CSH, 0x5F | CSH, - -/* 30 */ 0x60 | CSH, 0x5E | CSH, 0x5D | CSH, 0x5C | CSH, -/* 34 */ 0x5B | CSH, 0xAA | CSL, 0xA9 | CSL, 0x3E | CSL, -/* 38 */ 0x9F | CSH, 0x9F | CSH, 0x9F | CSH, 0x9F | CSH, -/* 3C */ 0xF3 | CSL, 0x78 | CSH, 0xF2 | CSL, 0x5A | CSH, - -/* 40 */ 0x59 | CSH, 0x58 | CSH, 0xEC | CSL, 0xF6 | CSL, -/* 44 */ 0x57 | CSH, 0x56 | CSH, 0xE8 | CSL, 0xE2 | CSL, -/* 48 */ 0x77 | CSH, 0x55 | CSH, 0x54 | CSH, 0x6E | CSH, -/* 4C */ 0x53 | CSH, 0x52 | CSH, 0x51 | CSH, 0xF0 | CSL, - -/* 50 */ 0x50 | CSH, 0x4F | CSH, 0x9F | CSH, 0xE4 | CSL, -/* 54 */ 0x9F | CSH, 0x9F | CSH, 0xFB | CSL, 0xEA | CSL, -/* 58 */ 0x4E | CSH, 0x4D | CSH, 0x4C | CSH, 0x4B | CSH, -/* 5C */ 0xEF | CSL, 0x4A | CSH, 0x49 | CSH, 0x48 | CSH, - -/* 60 */ 0xAA | CSL, 0xE0 | CSL, 0xE1 | CSL, 0x47 | CSH, -/* 64 */ 0xEB | CSL, 0x46 | CSH, 0xED | CSL, 0x59 | CSL, -/* 68 */ 0x45 | CSH, 0x44 | CSH, 0xE9 | CSL, 0x9E | CSH, -/* 6C */ 0x43 | CSH, 0x9F | CSH, 0x76 | CSL, 0x42 | CSH, - -/* 70 */ 0xE3 | CSL, 0x41 | CSH, 0x40 | CSH, 0xE5 | CSL, -/* 74 */ 0xE7 | CSL, 0x9F | CSH, 0x9F | CSL, 0x66 | CSH, -/* 78 */ 0x68 | CSH, 0x7E | CSH, 0x9A | CSH, 0x1B | CSL, -/* 7C */ 0x18 | CSL, 0x1A | CSL, 0x19 | CSL, 0x20 | CSL -}; - -/*---------------------------------------------------------------------------* - * ISO Latin-1 Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSE_ISOLATIN -u_short cse_isolatin[CSSIZE] = { -/* 20 */ 0x20 | CSL, 0xAD | CSL, 0x9B | CSL, 0x9C | CSL, -/* 24 */ 0x9D | CSH, 0x9D | CSL, 0x7C | CSL, 0x15 | CSL, -/* 28 */ 0x77 | CSH, 0x9C | CSH, 0xA6 | CSL, 0xAE | CSL, -/* 2C */ 0x76 | CSH, 0x75 | CSH, 0x74 | CSH, 0x73 | CSH, - -/* 30 */ 0xF8 | CSL, 0xF1 | CSL, 0xFD | CSL, 0x9B | CSH, -/* 34 */ 0x72 | CSH, 0xE6 | CSL, 0x14 | CSL, 0x99 | CSH, -/* 38 */ 0x71 | CSH, 0x98 | CSH, 0xA7 | CSL, 0xAF | CSL, -/* 3C */ 0xAC | CSL, 0xAB | CSL, 0x70 | CSH, 0xA8 | CSL, - -/* 40 */ 0x97 | CSH, 0x96 | CSH, 0x95 | CSH, 0x94 | CSH, -/* 44 */ 0x8E | CSL, 0x8F | CSL, 0x92 | CSL, 0x80 | CSL, -/* 48 */ 0x93 | CSH, 0x90 | CSL, 0x92 | CSH, 0x91 | CSH, -/* 4C */ 0x90 | CSH, 0x8F | CSH, 0x8E | CSH, 0x8D | CSH, - -/* 50 */ 0x6F | CSH, 0xA5 | CSL, 0x8C | CSH, 0x8B | CSH, -/* 54 */ 0x8A | CSH, 0x89 | CSH, 0x99 | CSL, 0x6E | CSH, -/* 58 */ 0x87 | CSH, 0x86 | CSH, 0x85 | CSH, 0x84 | CSH, -/* 5C */ 0x9A | CSL, 0x6D | CSH, 0x6C | CSH, 0xE1 | CSL, - -/* 60 */ 0x85 | CSL, 0xA0 | CSL, 0x83 | CSL, 0x82 | CSH, -/* 64 */ 0x84 | CSL, 0x86 | CSL, 0x91 | CSL, 0x87 | CSL, -/* 68 */ 0x8A | CSL, 0x82 | CSL, 0x88 | CSL, 0x89 | CSL, -/* 6C */ 0x8D | CSL, 0xA1 | CSL, 0x8C | CSL, 0x8B | CSL, - -/* 70 */ 0x6B | CSH, 0xA4 | CSL, 0x95 | CSL, 0xA2 | CSL, -/* 74 */ 0x93 | CSL, 0x81 | CSH, 0x94 | CSL, 0xF6 | CSL, -/* 78 */ 0x7F | CSH, 0x97 | CSL, 0xA3 | CSL, 0x96 | CSL, -/* 7C */ 0x81 | CSL, 0x69 | CSH, 0x6A | CSH, 0x98 | CSL -}; - -/*---------------------------------------------------------------------------* - * Downloadable Characterset - *---------------------------------------------------------------------------*/ -#define HAVECSE_DOWNLOADABLE -u_short cse_downloadable[CSSIZE] = { -/* 20 */ 0xA0 | CSH, 0xA1 | CSH, 0xA2 | CSH, 0xA3 | CSH, -/* 24 */ 0xA4 | CSH, 0xA5 | CSH, 0xA6 | CSH, 0xA7 | CSH, -/* 28 */ 0xA8 | CSH, 0xA9 | CSH, 0xAA | CSH, 0xAB | CSH, -/* 2C */ 0xAC | CSH, 0xAD | CSH, 0xAE | CSH, 0xAF | CSH, - -/* 30 */ 0xB0 | CSH, 0xB1 | CSH, 0xB2 | CSH, 0xB3 | CSH, -/* 34 */ 0xB4 | CSH, 0xB5 | CSH, 0xB6 | CSH, 0xB7 | CSH, -/* 38 */ 0xB8 | CSH, 0xB9 | CSH, 0xBA | CSH, 0xBB | CSH, -/* 3C */ 0xBC | CSH, 0xBD | CSH, 0xBE | CSH, 0xBF | CSH, - -/* 40 */ 0xC0 | CSH, 0xC1 | CSH, 0xC2 | CSH, 0xC3 | CSH, -/* 44 */ 0xC4 | CSH, 0xC5 | CSH, 0xC6 | CSH, 0xC7 | CSH, -/* 48 */ 0xC8 | CSH, 0xC9 | CSH, 0xCA | CSH, 0xCB | CSH, -/* 4C */ 0xCC | CSH, 0xCD | CSH, 0xCE | CSH, 0xCF | CSH, - -/* 50 */ 0xD0 | CSH, 0xD1 | CSH, 0xD2 | CSH, 0xD3 | CSH, -/* 54 */ 0xD4 | CSH, 0xD5 | CSH, 0xD6 | CSH, 0xD7 | CSH, -/* 58 */ 0xD8 | CSH, 0xD9 | CSH, 0xDA | CSH, 0xDB | CSH, -/* 5C */ 0xDC | CSH, 0xDD | CSH, 0xDE | CSH, 0xDF | CSH, - -/* 60 */ 0xE0 | CSH, 0xE1 | CSH, 0xE2 | CSH, 0xE3 | CSH, -/* 64 */ 0xE4 | CSH, 0xE5 | CSH, 0xE6 | CSH, 0xE7 | CSH, -/* 68 */ 0xE8 | CSH, 0xE9 | CSH, 0xEA | CSH, 0xEB | CSH, -/* 6C */ 0xEC | CSH, 0xED | CSH, 0xEE | CSH, 0xEF | CSH, - -/* 70 */ 0xF0 | CSH, 0xF1 | CSH, 0xF2 | CSH, 0xF3 | CSH, -/* 74 */ 0xF4 | CSH, 0xF5 | CSH, 0xF6 | CSH, 0xF7 | CSH, -/* 78 */ 0xF8 | CSH, 0xF9 | CSH, 0xFA | CSH, 0xFB | CSH, -/* 7C */ 0xFC | CSH, 0xFD | CSH, 0xFE | CSH, 0xFF | CSH, -}; - -/* ------------------------- E O F ------------------------------------------*/ diff --git a/sys/i386/isa/pcvt/pcvt_vtf.c b/sys/i386/isa/pcvt/pcvt_vtf.c deleted file mode 100644 index e3f7878..0000000 --- a/sys/i386/isa/pcvt/pcvt_vtf.c +++ /dev/null @@ -1,2187 +0,0 @@ -/* - * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. - * - * Copyright (c) 1992, 1993 Brian Dunford-Shore. - * - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz and Don Ahn. - * - * 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_vtf.c, 3.20, Last Edit-Date: [Wed Apr 5 18:08:50 1995] - */ - -/*---------------------------------------------------------------------------* - * - * pcvt_vtf.c VT220 Terminal Emulator Functions - * ------------------------------------------------- - * -hm ------------ Release 3.00 -------------- - * -hm integrating NetBSD-current patches - * -hm integrating patch from Thomas Gellekum - * -hm fixed bug fkey labels not properly (re)set after ris - * -hm Michael Havemester fixed NOFASTSCROLL define bug - * -hm set caps/scroll/num_lock in vt_str() and made led_update() - * -hm applying patch from Joerg fixing Crtat bug - * -hm fixing NOFASTSCROLL operation for MDA/Hercules - * -jw/hm fixing bug in roll_up() and roll_down() - * -hm fastscroll/Crtat bugfix from Lon Willett - * -hm patch for non-XSERVER/UCONSOLE compiles from Rafal Boni - * -hm bugfix: PCVT_USL_COMPAT renamed to PCVT_USL_VT_COMPAT ... - * - *---------------------------------------------------------------------------*/ - -#include "vt.h" -#if NVT > 0 - -#define PCVT_INCLUDE_VT_SELATTR /* get inline function from pcvt_hdr.h */ - -#include <i386/isa/pcvt/pcvt_hdr.h> /* global include */ -#include <i386/isa/pcvt/pcvt_tbl.h> /* character set conversion tables */ - -static void clear_dld ( struct video_state *svsp ); -static void init_dld ( struct video_state *svsp ); -static void init_udk ( struct video_state *svsp ); -static void respond ( struct video_state *svsp ); -static void roll_down ( struct video_state *svsp, int n ); -static void selective_erase ( struct video_state *svsp, u_short *pcrtat, - int length ); -static void swcsp ( struct video_state *svsp, u_short *ctp ); - -/*---------------------------------------------------------------------------* - * DECSTBM - set top and bottom margins - *---------------------------------------------------------------------------*/ -void -vt_stbm(struct video_state *svsp) -{ - /* both 0 => scrolling region = entire screen */ - - if((svsp->parms[0] == 0) && (svsp->parms[1] == 0)) - { - svsp->cur_offset = 0; - svsp->scrr_beg = 0; - svsp->scrr_len = svsp->screen_rows; - svsp->scrr_end = svsp->scrr_len - 1; - svsp->col = 0; - return; - } - - if(svsp->parms[1] <= svsp->parms[0]) - return; - - /* range parm 1 */ - - if(svsp->parms[0] < 1) - svsp->parms[0] = 1; - else if(svsp->parms[0] > svsp->screen_rows-1) - svsp->parms[0] = svsp->screen_rows-1; - - /* range parm 2 */ - - if(svsp->parms[1] < 2) - svsp->parms[1] = 2; - else if(svsp->parms[1] > svsp->screen_rows) - svsp->parms[1] = svsp->screen_rows; - - svsp->scrr_beg = svsp->parms[0]-1; /* begin of scrolling region */ - svsp->scrr_len = svsp->parms[1] - svsp->parms[0] + 1; /* no of lines */ - svsp->scrr_end = svsp->parms[1]-1; - - /* cursor to first pos */ - if(svsp->m_om) - svsp->cur_offset = svsp->scrr_beg * svsp->maxcol; - else - svsp->cur_offset = 0; - - svsp->col = 0; -} - -/*---------------------------------------------------------------------------* - * SGR - set graphic rendition - *---------------------------------------------------------------------------*/ -void -vt_sgr(struct video_state *svsp) -{ - register int i = 0; - u_short setcolor = 0; - char colortouched = 0; - - do - { - switch(svsp->parms[i++]) - { - case 0: /* reset to normal attributes */ - svsp->vtsgr = VT_NORMAL; - break; - - case 1: /* bold */ - svsp->vtsgr |= VT_BOLD; - break; - - case 4: /* underline */ - svsp->vtsgr |= VT_UNDER; - break; - - case 5: /* blinking */ - svsp->vtsgr |= VT_BLINK; - break; - - case 7: /* reverse */ - svsp->vtsgr |= VT_INVERSE; - break; - - case 22: /* not bold */ - svsp->vtsgr &= ~VT_BOLD; - break; - - case 24: /* not underlined */ - svsp->vtsgr &= ~VT_UNDER; - break; - - case 25: /* not blinking */ - svsp->vtsgr &= ~VT_BLINK; - break; - - case 27: /* not reverse */ - svsp->vtsgr &= ~VT_INVERSE; - break; - - case 30: /* foreground colors */ - case 31: - case 32: - case 33: - case 34: - case 35: - case 36: - case 37: - if(color) - { - colortouched = 1; - setcolor |= ((fgansitopc[(svsp->parms[i-1]-30) & 7]) << 8); - } - break; - - case 40: /* background colors */ - case 41: - case 42: - case 43: - case 44: - case 45: - case 46: - case 47: - if(color) - { - colortouched = 1; - setcolor |= ((bgansitopc[(svsp->parms[i-1]-40) & 7]) << 8); - } - break; - } - } - while(i <= svsp->parmi); - if(color) - { - if(colortouched) - svsp->c_attr = setcolor; - else - svsp->c_attr = ((sgr_tab_color[svsp->vtsgr]) << 8); - } - else - { - if(adaptor_type == MDA_ADAPTOR) - svsp->c_attr = ((sgr_tab_imono[svsp->vtsgr]) << 8); - else - svsp->c_attr = ((sgr_tab_mono[svsp->vtsgr]) << 8); - } -} - -/*---------------------------------------------------------------------------* - * CUU - cursor up - *---------------------------------------------------------------------------*/ -void -vt_cuu(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if (p <= 0) /* parameter min */ - p = 1; - - p = min(p, svsp->row - svsp->scrr_beg); - - if (p <= 0) - return; - - svsp->cur_offset -= (svsp->maxcol * p); -} - -/*---------------------------------------------------------------------------* - * CUD - cursor down - *---------------------------------------------------------------------------*/ -void -vt_cud(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if (p <= 0) - p = 1; - - p = min(p, svsp->scrr_end - svsp->row); - - if (p <= 0) - return; - - svsp->cur_offset += (svsp->maxcol * p); -} - -/*---------------------------------------------------------------------------* - * CUF - cursor forward - *---------------------------------------------------------------------------*/ -void -vt_cuf(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if(svsp->col == ((svsp->maxcol)-1)) /* already at right margin */ - return; - - if(p <= 0) /* parameter min = 1 */ - p = 1; - else if(p > ((svsp->maxcol)-1)) /* parameter max = 79 */ - p = ((svsp->maxcol)-1); - - if((svsp->col + p) > ((svsp->maxcol)-1))/* not more than right margin */ - p = ((svsp->maxcol)-1) - svsp->col; - - svsp->cur_offset += p; - svsp->col += p; -} - -/*---------------------------------------------------------------------------* - * CUB - cursor backward - *---------------------------------------------------------------------------*/ -void -vt_cub(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if(svsp->col == 0) /* already at left margin ? */ - return; - - if(p <= 0) /* parameter min = 1 */ - p = 1; - else if(p > ((svsp->maxcol)-1)) /* parameter max = 79 */ - p = ((svsp->maxcol)-1); - - if((svsp->col - p) <= 0) /* not more than left margin */ - p = svsp->col; - - svsp->cur_offset -= p; - svsp->col -= p; -} - -/*---------------------------------------------------------------------------* - * ED - erase in display - *---------------------------------------------------------------------------*/ -void -vt_clreos(struct video_state *svsp) -{ - switch(svsp->parms[0]) - { - case 0: - fillw(user_attr | ' ', svsp->Crtat + svsp->cur_offset, - svsp->Crtat + - (svsp->maxcol * svsp->screen_rows) - - (svsp->Crtat + svsp->cur_offset)); - break; - - case 1: - fillw(user_attr | ' ', svsp->Crtat, - svsp->Crtat + svsp->cur_offset - - svsp->Crtat + 1 ); - break; - - case 2: - fillw(user_attr | ' ', svsp->Crtat, - svsp->maxcol * svsp->screen_rows); - break; - } -} - -/*---------------------------------------------------------------------------* - * EL - erase in line - *---------------------------------------------------------------------------*/ -void -vt_clreol(struct video_state *svsp) -{ - switch(svsp->parms[0]) - { - case 0: - fillw(user_attr | ' ', - svsp->Crtat + svsp->cur_offset, - svsp->maxcol-svsp->col); - break; - - case 1: - fillw(user_attr | ' ', - svsp->Crtat + svsp->cur_offset - svsp->col, - svsp->col + 1); - break; - - case 2: - fillw(user_attr | ' ', - svsp->Crtat + svsp->cur_offset - svsp->col, - svsp->maxcol); - break; - } -} - -/*---------------------------------------------------------------------------* - * CUP - cursor position / HVP - horizontal & vertical position - *---------------------------------------------------------------------------*/ -void -vt_curadr(struct video_state *svsp) -{ - if(svsp->m_om) /* relative to scrolling region */ - { - if((svsp->parms[0] == 0) && (svsp->parms[1] == 0)) - { - svsp->cur_offset = svsp->scrr_beg * svsp->maxcol; - svsp->col = 0; - svsp->abs_write = 0; - return; - } - - if(svsp->parms[0] <= 0) - svsp->parms[0] = 1; - else if(svsp->parms[0] > svsp->scrr_len) - svsp->parms[0] = svsp->scrr_len; - - if(svsp->parms[1] <= 0 ) - svsp->parms[1] = 1; - if(svsp->parms[1] > svsp->maxcol) - svsp->parms[1] = svsp->maxcol; - - svsp->cur_offset = (svsp->scrr_beg * svsp->maxcol) + - ((svsp->parms[0] - 1) * svsp->maxcol) + - svsp->parms[1] - 1; - svsp->col = svsp->parms[1] - 1; - svsp->abs_write = 0; - } - else /* relative to screen start */ - { - if((svsp->parms[0] == 0) && (svsp->parms[1] == 0)) - { - svsp->cur_offset = 0; - svsp->col = 0; - svsp->abs_write = 0; - return; - } - - if(svsp->parms[0] <= 0) - svsp->parms[0] = 1; - else if(svsp->parms[0] > svsp->screen_rows) - svsp->parms[0] = svsp->screen_rows; - - if(svsp->parms[1] <= 0 ) - svsp->parms[1] = 1; - if(svsp->parms[1] > svsp->maxcol) /* col */ - svsp->parms[1] = svsp->maxcol; - - svsp->cur_offset = (((svsp->parms[0]-1)*svsp->maxcol) + - (svsp->parms[1]-1)); - svsp->col = svsp->parms[1]-1; - - if (svsp->cur_offset >= - ((svsp->scrr_beg + svsp->scrr_len + 1) * svsp->maxcol)) - - svsp->abs_write = 1; - else - svsp->abs_write = 0; - } -} - -/*---------------------------------------------------------------------------* - * RIS - reset to initial state (hard emulator runtime reset) - *---------------------------------------------------------------------------*/ -void -vt_ris(struct video_state *svsp) -{ - fillw(user_attr | ' ', svsp->Crtat, svsp->maxcol * svsp->screen_rows); - svsp->cur_offset = 0; /* cursor upper left corner */ - svsp->col = 0; - svsp->row = 0; - svsp->lnm = 0; /* CR only */ - clear_dld(svsp); /* clear download charset */ - vt_clearudk(svsp); /* clear user defined keys */ - svsp->selchar = 0; /* selective attribute off */ - vt_str(svsp); /* and soft terminal reset */ -} - -/*---------------------------------------------------------------------------* - * DECSTR - soft terminal reset (SOFT emulator runtime reset) - *---------------------------------------------------------------------------*/ -void -vt_str(struct video_state *svsp) -{ - int i; - - clr_parms(svsp); /* escape parameter init */ - svsp->state = STATE_INIT; /* initial state */ - - svsp->dis_fnc = 0; /* display functions reset */ - - svsp->sc_flag = 0; /* save cursor position */ - svsp->transparent = 0; /* enable control code processing */ - - for(i = 0; i < MAXTAB; i++) /* setup tabstops */ - { - if(!(i % 8)) - svsp->tab_stops[i] = 1; - else - svsp->tab_stops[i] = 0; - } - - svsp->irm = 0; /* replace mode */ - svsp->m_om = 0; /* origin mode */ - svsp->m_awm = 1; /* auto wrap mode */ - -#if PCVT_INHIBIT_NUMLOCK - svsp->num_lock = 0; /* keypad application mode */ -#else - svsp->num_lock = 1; /* keypad numeric mode */ -#endif - - svsp->scroll_lock = 0; /* reset keyboard modes */ - svsp->caps_lock = 0; - - svsp->ckm = 1; /* cursor key mode = "normal" ... */ - svsp->scrr_beg = 0; /* start of scrolling region */ - svsp->scrr_len = svsp->screen_rows; /* no. of lines in scrolling region */ - svsp->abs_write = 0; /* scrr is complete screen */ - svsp->scrr_end = svsp->scrr_len - 1; - - if(adaptor_type == EGA_ADAPTOR || adaptor_type == VGA_ADAPTOR) - { - svsp->G0 = cse_ascii; /* G0 = ascii */ - svsp->G1 = cse_ascii; /* G1 = ascii */ - svsp->G2 = cse_supplemental; /* G2 = supplemental */ - svsp->G3 = cse_supplemental; /* G3 = supplemental */ - svsp->GL = &svsp->G0; /* GL = G0 */ - svsp->GR = &svsp->G2; /* GR = G2 */ - } - else - { - svsp->G0 = csd_ascii; /* G0 = ascii */ - svsp->G1 = csd_ascii; /* G1 = ascii */ - svsp->G2 = csd_supplemental; /* G2 = supplemental */ - svsp->G3 = csd_supplemental; /* G3 = supplemental */ - svsp->GL = &svsp->G0; /* GL = G0 */ - svsp->GR = &svsp->G2; /* GR = G2 */ - } - - svsp->vtsgr = VT_NORMAL; /* no attributes */ - svsp->c_attr = user_attr; /* reset sgr to normal */ - - svsp->selchar = 0; /* selective attribute off */ - vt_initsel(svsp); - - init_ufkl(svsp); /* init user fkey labels */ - init_sfkl(svsp); /* init system fkey labels */ - - update_led(); /* update keyboard LED's */ -} - -/*---------------------------------------------------------------------------* - * RI - reverse index, move cursor up - *---------------------------------------------------------------------------*/ -void -vt_ri(struct video_state *svsp) -{ - if(svsp->cur_offset >= ((svsp->scrr_beg * svsp->maxcol) + svsp->maxcol)) - svsp->cur_offset -= svsp->maxcol; - else - roll_down(svsp, 1); -} - -/*---------------------------------------------------------------------------* - * IND - index, move cursor down - *---------------------------------------------------------------------------*/ -void -vt_ind(struct video_state *svsp) -{ - if(svsp->cur_offset < (svsp->scrr_end * svsp->maxcol)) - svsp->cur_offset += svsp->maxcol; - else - roll_up(svsp, 1); -} - -/*---------------------------------------------------------------------------* - * NEL - next line, first pos of next line - *---------------------------------------------------------------------------*/ -void -vt_nel(struct video_state *svsp) -{ - if(svsp->cur_offset < (svsp->scrr_end * svsp->maxcol)) - { - svsp->cur_offset += (svsp->maxcol-svsp->col); - svsp->col = 0; - } - else - { - roll_up(svsp, 1); - svsp->cur_offset -= svsp->col; - svsp->col = 0; - } -} - -/*---------------------------------------------------------------------------* - * set dec private modes, esc [ ? x h - *---------------------------------------------------------------------------*/ -void -vt_set_dec_priv_qm(struct video_state *svsp) -{ - switch(svsp->parms[0]) - { - case 0: /* error, ignored */ - case 1: /* CKM - cursor key mode */ - svsp->ckm = 1; - break; - - case 2: /* ANM - ansi/vt52 mode */ - break; - - case 3: /* COLM - column mode */ - vt_col(svsp, SCR_COL132); - break; - - case 4: /* SCLM - scrolling mode */ - case 5: /* SCNM - screen mode */ - break; - - case 6: /* OM - origin mode */ - svsp->m_om = 1; - break; - - case 7: /* AWM - auto wrap mode */ - svsp->m_awm = 1; - swritefkl(7,(u_char *)"AUTOWRAPENABLE *",svsp); - break; - - case 8: /* ARM - auto repeat mode */ - kbrepflag = 1; - break; - - case 9: /* INLM - interlace mode */ - case 10: /* EDM - edit mode */ - case 11: /* LTM - line transmit mode */ - case 12: /* */ - case 13: /* SCFDM - space compression / field delimiting */ - case 14: /* TEM - transmit execution mode */ - case 15: /* */ - case 16: /* EKEM - edit key execution mode */ - break; - - case 25: /* TCEM - text cursor enable mode */ - if(vsp == svsp) - sw_cursor(1); /* cursor on */ - svsp->cursor_on = 1; - break; - - case 42: /* NRCM - 7bit NRC characters */ - break; - } -} - -/*---------------------------------------------------------------------------* - * reset dec private modes, esc [ ? x l - *---------------------------------------------------------------------------*/ -void -vt_reset_dec_priv_qm(struct video_state *svsp) -{ - switch(svsp->parms[0]) - { - case 0: /* error, ignored */ - case 1: /* CKM - cursor key mode */ - svsp->ckm = 0; - break; - - case 2: /* ANM - ansi/vt52 mode */ - break; - - case 3: /* COLM - column mode */ - vt_col(svsp, SCR_COL80); - break; - - case 4: /* SCLM - scrolling mode */ - case 5: /* SCNM - screen mode */ - break; - - case 6: /* OM - origin mode */ - svsp->m_om = 0; - break; - - case 7: /* AWM - auto wrap mode */ - svsp->m_awm = 0; - swritefkl(7,(u_char *)"AUTOWRAPENABLE ",svsp); - break; - - case 8: /* ARM - auto repeat mode */ - kbrepflag = 0; - break; - - case 9: /* INLM - interlace mode */ - case 10: /* EDM - edit mode */ - case 11: /* LTM - line transmit mode */ - case 12: /* */ - case 13: /* SCFDM - space compression / field delimiting */ - case 14: /* TEM - transmit execution mode */ - case 15: /* */ - case 16: /* EKEM - edit key execution mode */ - break; - - case 25: /* TCEM - text cursor enable mode */ - if(vsp == svsp) - sw_cursor(0); /* cursor off */ - svsp->cursor_on = 0; - break; - - case 42: /* NRCM - 7bit NRC characters */ - break; - } -} - -/*---------------------------------------------------------------------------* - * set ansi modes, esc [ x - *---------------------------------------------------------------------------*/ -void -vt_set_ansi(struct video_state *svsp) -{ - switch(svsp->parms[0]) - { - case 0: /* error, ignored */ - case 1: /* GATM - guarded area transfer mode */ - case 2: /* KAM - keyboard action mode */ - case 3: /* CRM - Control Representation mode */ - break; - - case 4: /* IRM - insert replacement mode */ - svsp->irm = 1; /* Insert mode */ - break; - - case 5: /* SRTM - status report transfer mode */ - case 6: /* ERM - erasue mode */ - case 7: /* VEM - vertical editing mode */ - case 10: /* HEM - horizontal editing mode */ - case 11: /* PUM - position unit mode */ - case 12: /* SRM - send-receive mode */ - case 13: /* FEAM - format effector action mode */ - case 14: /* FETM - format effector transfer mode */ - case 15: /* MATM - multiple area transfer mode */ - case 16: /* TTM - transfer termination */ - case 17: /* SATM - selected area transfer mode */ - case 18: /* TSM - tabulation stop mode */ - case 19: /* EBM - editing boundary mode */ - break; - - case 20: /* LNM - line feed / newline mode */ - svsp->lnm = 1; - break; - } -} - -/*---------------------------------------------------------------------------* - * reset ansi modes, esc [ x - *---------------------------------------------------------------------------*/ -void -vt_reset_ansi(struct video_state *svsp) -{ - switch(svsp->parms[0]) - { - case 0: /* error, ignored */ - case 1: /* GATM - guarded area transfer mode */ - case 2: /* KAM - keyboard action mode */ - case 3: /* CRM - Control Representation mode */ - break; - - case 4: /* IRM - insert replacement mode */ - svsp->irm = 0; /* Replace mode */ - break; - - case 5: /* SRTM - status report transfer mode */ - case 6: /* ERM - erasue mode */ - case 7: /* VEM - vertical editing mode */ - case 10: /* HEM - horizontal editing mode */ - case 11: /* PUM - position unit mode */ - case 12: /* SRM - send-receive mode */ - case 13: /* FEAM - format effector action mode */ - case 14: /* FETM - format effector transfer mode */ - case 15: /* MATM - multiple area transfer mode */ - case 16: /* TTM - transfer termination */ - case 17: /* SATM - selected area transfer mode */ - case 18: /* TSM - tabulation stop mode */ - case 19: /* EBM - editing boundary mode */ - break; - - case 20: /* LNM - line feed / newline mode */ - svsp->lnm = 0; - break; - } -} - -/*---------------------------------------------------------------------------* - * clear tab stop(s) - *---------------------------------------------------------------------------*/ -void -vt_clrtab(struct video_state *svsp) -{ - int i; - - if(svsp->parms[0] == 0) - svsp->tab_stops[svsp->col] = 0; - else if(svsp->parms[0] == 3) - { - for(i=0; i<MAXTAB; i++) - svsp->tab_stops[i] = 0; - } -} - -/*---------------------------------------------------------------------------* - * DECSC - save cursor & attributes - *---------------------------------------------------------------------------*/ -void -vt_sc(struct video_state *svsp) -{ - svsp->sc_flag = 1; - svsp->sc_row = svsp->row; - svsp->sc_col = svsp->col; - svsp->sc_cur_offset = svsp->cur_offset; - svsp->sc_attr = svsp->c_attr; - svsp->sc_awm = svsp->m_awm; - svsp->sc_om = svsp->m_om; - svsp->sc_G0 = svsp->G0; - svsp->sc_G1 = svsp->G1; - svsp->sc_G2 = svsp->G2; - svsp->sc_G3 = svsp->G3; - svsp->sc_GL = svsp->GL; - svsp->sc_GR = svsp->GR; - svsp->sc_sel = svsp->selchar; - svsp->sc_vtsgr = svsp->vtsgr; -} - -/*---------------------------------------------------------------------------* - * DECRC - restore cursor & attributes - *---------------------------------------------------------------------------*/ -void -vt_rc(struct video_state *svsp) -{ - if(svsp->sc_flag == 1) - { - svsp->sc_flag = 0; - svsp->row = svsp->sc_row; - svsp->col = svsp->sc_col; - svsp->cur_offset = svsp->sc_cur_offset; - svsp->c_attr = svsp->sc_attr; - svsp->m_awm = svsp->sc_awm; - svsp->m_om = svsp->sc_om; - svsp->G0 = svsp->sc_G0; - svsp->G1 = svsp->sc_G1; - svsp->G2 = svsp->sc_G2; - svsp->G3 = svsp->sc_G3; - svsp->GL = svsp->sc_GL; - svsp->GR = svsp->sc_GR; - svsp->selchar = svsp->sc_sel; - svsp->vtsgr = svsp->sc_vtsgr; - } -} - -/*---------------------------------------------------------------------------* - * designate a character set as G0, G1, G2 or G3 for 94/96 char sets - *---------------------------------------------------------------------------*/ -void -vt_designate(struct video_state *svsp) -{ - u_short *ctp = NULL; - u_char ch; - - if(svsp->whichi == 1) - ch = svsp->which[0]; - else - { - int i; - - if(svsp->dld_id[0] == '\0') - return; - - if(!(((adaptor_type == EGA_ADAPTOR) || - (adaptor_type == VGA_ADAPTOR)) && - (vgacs[svsp->vga_charset].secondloaded))) - { - return; - } - - for(i = (svsp->whichi)-1; i >= 0; i--) - { - if(svsp->which[i] != svsp->dld_id[i]) - return; - } -#ifdef HAVECSE_DOWNLOADABLE - ctp = cse_downloadable; - swcsp(svsp, ctp); -#endif - return; - } - - if(((adaptor_type == EGA_ADAPTOR) || (adaptor_type == VGA_ADAPTOR)) && - (vgacs[svsp->vga_charset].secondloaded)) - { - if((ch == svsp->dld_id[0]) && (svsp->dld_id[1] == '\0')) - { -#ifdef HAVECSE_DOWNLOADABLE - ctp = cse_downloadable; - swcsp(svsp, ctp); -#endif - return; - } - - switch(ch) - { - case 'A': /* British or ISO-Latin-1 */ - switch(svsp->state) - { - case STATE_BROPN: /* designate G0 */ - case STATE_BRCLO: /* designate G1 */ - case STATE_STAR: /* designate G2 */ - case STATE_PLUS: /* designate G3 */ -#ifdef HAVECSE_BRITISH - ctp = cse_british; -#endif - break; - - case STATE_MINUS: /* designate G1 (96)*/ - case STATE_DOT: /* designate G2 (96)*/ - case STATE_SLASH: /* designate G3 (96)*/ -#ifdef HAVECSE_ISOLATIN - ctp = cse_isolatin; -#endif - break; - } - break; - - case 'B': /* USASCII */ -#ifdef HAVECSE_ASCII - ctp = cse_ascii; -#endif - break; - - case 'C': /* Finnish */ - case '5': /* Finnish */ -#ifdef HAVECSE_FINNISH - ctp = cse_finnish; -#endif - break; - - case 'E': /* Norwegian/Danish */ - case '6': /* Norwegian/Danish */ -#ifdef HAVECSE_NORWEGIANDANISH - ctp = cse_norwegiandanish; -#endif - break; - - case 'H': /* Swedish */ - case '7': /* Swedish */ -#ifdef HAVECSE_SWEDISH - ctp = cse_swedish; -#endif - break; - - case 'K': /* German */ -#ifdef HAVECSE_GERMAN - ctp = cse_german; -#endif - break; - - case 'Q': /* French Canadien */ -#ifdef HAVECSE_FRENCHCANADA - ctp = cse_frenchcanada; -#endif - break; - - case 'R': /* French */ -#ifdef HAVECSE_FRENCH - ctp = cse_french; -#endif - break; - - case 'Y': /* Italian */ -#ifdef HAVECSE_ITALIAN - ctp = cse_italian; -#endif - break; - - case 'Z': /* Spanish */ -#ifdef HAVECSE_SPANISH - ctp = cse_spanish; -#endif - break; - - case '0': /* special graphics */ -#ifdef HAVECSE_SPECIAL - ctp = cse_special; -#endif - break; - - case '1': /* alternate ROM */ -#ifdef HAVECSE_ALTERNATEROM1 - ctp = cse_alternaterom1; -#endif - break; - - case '2': /* alt ROM, spec graphics */ -#ifdef HAVECSE_ALTERNATEROM2 - ctp = cse_alternaterom2; -#endif - break; - - case '3': /* HP Roman 8, upper 128 chars*/ -#ifdef HAVECSE_ROMAN8 - ctp = cse_roman8; -#endif - break; - - case '4': /* Dutch */ -#ifdef HAVECSE_DUTCH - ctp = cse_dutch; -#endif - break; - - case '<': /* DEC Supplemental */ -#ifdef HAVECSE_SUPPLEMENTAL - ctp = cse_supplemental; -#endif - break; - - case '=': /* Swiss */ -#ifdef HAVECSE_SWISS - ctp = cse_swiss; -#endif - break; - - case '>': /* DEC Technical */ -#ifdef HAVECSE_TECHNICAL - ctp = cse_technical; -#endif - break; - - default: - break; - } - } - else - { - switch(ch) - { - case 'A': /* British or ISO-Latin-1 */ - switch(svsp->state) - { - case STATE_BROPN: /* designate G0 */ - case STATE_BRCLO: /* designate G1 */ - case STATE_STAR: /* designate G2 */ - case STATE_PLUS: /* designate G3 */ -#ifdef HAVECSD_BRITISH - ctp = csd_british; -#endif - break; - - case STATE_MINUS: /* designate G1 (96)*/ - case STATE_DOT: /* designate G2 (96)*/ - case STATE_SLASH: /* designate G3 (96)*/ -#ifdef HAVECSD_ISOLATIN - ctp = csd_isolatin; -#endif - break; - } - break; - - case 'B': /* USASCII */ -#ifdef HAVECSD_ASCII - ctp = csd_ascii; -#endif - break; - - case 'C': /* Finnish */ - case '5': /* Finnish */ -#ifdef HAVECSD_FINNISH - ctp = csd_finnish; -#endif - break; - - case 'E': /* Norwegian/Danish */ - case '6': /* Norwegian/Danish */ -#ifdef HAVECSD_NORWEGIANDANISH - ctp = csd_norwegiandanish; -#endif - break; - - case 'H': /* Swedish */ - case '7': /* Swedish */ -#ifdef HAVECSD_SWEDISH - ctp = csd_swedish; -#endif - break; - - case 'K': /* German */ -#ifdef HAVECSD_GERMAN - ctp = csd_german; -#endif - break; - - case 'Q': /* French Canadien */ -#ifdef HAVECSD_FRENCHCANADA - ctp = csd_frenchcanada; -#endif - break; - - case 'R': /* French */ -#ifdef HAVECSD_FRENCH - ctp = csd_french; -#endif - break; - - case 'Y': /* Italian */ -#ifdef HAVECSD_ITALIAN - ctp = csd_italian; -#endif - break; - - case 'Z': /* Spanish */ -#ifdef HAVECSD_SPANISH - ctp = csd_spanish; -#endif - break; - - case '0': /* special graphics */ -#ifdef HAVECSD_SPECIAL - ctp = csd_special; -#endif - break; - - case '1': /* alternate ROM */ -#ifdef HAVECSD_ALTERNATEROM1 - ctp = csd_alternaterom1; -#endif - break; - - case '2': /* alt ROM, spec graphics */ -#ifdef HAVECSD_ALTERNATEROM2 - ctp = csd_alternaterom2; -#endif - break; - - case '3': /* HP Roman 8, upper 128 chars*/ -#ifdef HAVECSD_ROMAN8 - ctp = csd_roman8; -#endif - break; - - case '4': /* Dutch */ -#ifdef HAVECSD_DUTCH - ctp = csd_dutch; -#endif - break; - - case '<': /* DEC Supplemental */ -#ifdef HAVECSD_SUPPLEMENTAL - ctp = csd_supplemental; -#endif - break; - - case '=': /* Swiss */ -#ifdef HAVECSD_SWISS - ctp = csd_swiss; -#endif - break; - - case '>': /* DEC Technical */ -#ifdef HAVECSD_TECHNICAL - ctp = csd_technical; -#endif - break; - - default: - break; - } - } - swcsp(svsp, ctp); -} - -/*---------------------------------------------------------------------------* - * device attributes - *---------------------------------------------------------------------------*/ -void -vt_da(struct video_state *svsp) -{ - static u_char *response = (u_char *)DA_VT220; - - svsp->report_chars = response; - svsp->report_count = 18; - respond(svsp); -} - -/*---------------------------------------------------------------------------* - * screen alignment display - *---------------------------------------------------------------------------*/ -void -vt_aln(struct video_state *svsp) -{ - register int i; - - svsp->cur_offset = 0; - svsp->col = 0; - - for(i=0; i < (svsp->screen_rows*svsp->maxcol); i++) - { - *(svsp->Crtat + svsp->cur_offset) = user_attr | 'E'; - vt_selattr(svsp); - svsp->cur_offset++; - svsp->col++; - } - - svsp->cur_offset = 0; /* reset everything ! */ - svsp->col = 0; - svsp->row = 0; -} - -/*---------------------------------------------------------------------------* - * request terminal parameters - *---------------------------------------------------------------------------*/ -void -vt_reqtparm(struct video_state *svsp) -{ - static u_char *answr = (u_char *)"\033[3;1;1;120;120;1;0x"; - - svsp->report_chars = answr; - svsp->report_count = 20; - respond(svsp); -} - -/*---------------------------------------------------------------------------* - * invoke selftest - *---------------------------------------------------------------------------*/ -void -vt_tst(struct video_state *svsp) -{ - clear_dld(svsp); -} - -/*---------------------------------------------------------------------------* - * device status reports - *---------------------------------------------------------------------------*/ -void -vt_dsr(struct video_state *svsp) -{ - static u_char *answr = (u_char *)"\033[0n"; - static u_char *panswr = (u_char *)"\033[?13n"; /* Printer Unattached */ - static u_char *udkanswr = (u_char *)"\033[?21n"; /* UDK Locked */ - static u_char *langanswr = (u_char *)"\033[?27;1n"; /* North American*/ - static u_char buffer[16]; - int i = 0; - - switch(svsp->parms[0]) - { - case 5: /* return status */ - svsp->report_chars = answr; - svsp->report_count = 4; - respond(svsp); - break; - - case 6: /* return cursor position */ - buffer[i++] = 0x1b; - buffer[i++] = '['; - if((svsp->row+1) > 10) - buffer[i++] = ((svsp->row+1) / 10) + '0'; - buffer[i++] = ((svsp->row+1) % 10) + '0'; - buffer[i++] = ';'; - if((svsp->col+1) > 10) - buffer[i++] = ((svsp->col+1) / 10) + '0'; - buffer[i++] = ((svsp->col+1) % 10) + '0'; - buffer[i++] = 'R'; - buffer[i++] = '\0'; - - svsp->report_chars = buffer; - svsp->report_count = i; - respond(svsp); - break; - - case 15: /* return printer status */ - svsp->report_chars = panswr; - svsp->report_count = 6; - respond(svsp); - break; - - case 25: /* return udk status */ - svsp->report_chars = udkanswr; - svsp->report_count = 6; - respond(svsp); - break; - - case 26: /* return language status */ - svsp->report_chars = langanswr; - svsp->report_count = 8; - respond(svsp); - break; - - default: /* nothing else valid */ - break; - } -} - -/*---------------------------------------------------------------------------* - * IL - insert line - *---------------------------------------------------------------------------*/ -void -vt_il(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if((svsp->row >= svsp->scrr_beg) && (svsp->row <= svsp->scrr_end)) - { - if(p <= 0) - p = 1; - else if(p > svsp->scrr_end - svsp->row) - p = svsp->scrr_end - svsp->row; - - svsp->cur_offset -= svsp->col; - svsp->col = 0; - if(svsp->row == svsp->scrr_beg) - roll_down(svsp, p); - else - { - bcopy(svsp->Crtat + svsp->cur_offset, - svsp->Crtat + svsp->cur_offset + (p * svsp->maxcol), - svsp->maxcol * (svsp->scrr_end-svsp->row+1-p) * CHR ); - - fillw(user_attr | ' ', - svsp->Crtat + svsp->cur_offset, - p * svsp->maxcol); - } - } -} - -/*---------------------------------------------------------------------------* - * ICH - insert character - *---------------------------------------------------------------------------*/ -void -vt_ic(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if(p <= 0) - p = 1; - else if(p > svsp->maxcol-svsp->col) - p = svsp->maxcol-svsp->col; - - while(p--) - { - bcopy((svsp->Crtat + svsp->cur_offset), - (svsp->Crtat + svsp->cur_offset) + 1, - (((svsp->maxcol)-1)-svsp->col) * CHR); - - *(svsp->Crtat + svsp->cur_offset) = user_attr | ' '; - vt_selattr(svsp); - } -} - -/*---------------------------------------------------------------------------* - * DL - delete line - *---------------------------------------------------------------------------*/ -void -vt_dl(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if((svsp->row >= svsp->scrr_beg) && (svsp->row <= svsp->scrr_end)) - { - if(p <= 0) - p = 1; - else if(p > svsp->scrr_end - svsp->row) - p = svsp->scrr_end - svsp->row; - - svsp->cur_offset -= svsp->col; - svsp->col = 0; - - if(svsp->row == svsp->scrr_beg) - roll_up(svsp, p); - else - { - bcopy(svsp->Crtat + svsp->cur_offset + (p * svsp->maxcol), - svsp->Crtat + svsp->cur_offset, - svsp->maxcol * (svsp->scrr_end-svsp->row+1-p) * CHR ); - - fillw(user_attr | ' ', - svsp->Crtat + ((svsp->scrr_end-p+1) * svsp->maxcol), - p * svsp->maxcol); - } - } -} - -/*---------------------------------------------------------------------------* - * DCH - delete character - *---------------------------------------------------------------------------*/ -void -vt_dch(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if(p <= 0) - p = 1; - else if(p > svsp->maxcol-svsp->col) - p = svsp->maxcol-svsp->col; - - while(p--) - { - bcopy((svsp->Crtat + svsp->cur_offset)+1, - (svsp->Crtat + svsp->cur_offset), - (((svsp->maxcol)-1) - svsp->col)* CHR ); - - *((svsp->Crtat + svsp->cur_offset) + - ((svsp->maxcol)-1)-svsp->col) = user_attr | ' '; - } -} - -/*---------------------------------------------------------------------------* - * scroll up - *---------------------------------------------------------------------------*/ -void -vt_su(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if(p <= 0) - p = 1; - else if(p > svsp->screen_rows-1) - p = svsp->screen_rows-1; - - roll_up(svsp, p); -} - -/*---------------------------------------------------------------------------* - * scroll down - *---------------------------------------------------------------------------*/ -void -vt_sd(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if(p <= 0) - p = 1; - else if(p > svsp->screen_rows-1) - p = svsp->screen_rows-1; - - roll_down(svsp, p); -} - -/*---------------------------------------------------------------------------* - * ECH - erase character - *---------------------------------------------------------------------------*/ -void -vt_ech(struct video_state *svsp) -{ - register int p = svsp->parms[0]; - - if(p <= 0) - p = 1; - else if(p > svsp->maxcol-svsp->col) - p = svsp->maxcol-svsp->col; - - fillw(user_attr | ' ', (svsp->Crtat + svsp->cur_offset), p); -} - -/*---------------------------------------------------------------------------* - * media copy (NO PRINTER AVAILABLE IN KERNEL ...) - *---------------------------------------------------------------------------*/ -void -vt_mc(struct video_state *svsp) -{ -} - -/*---------------------------------------------------------------------------* - * Device Control String State Machine Entry for: - * - * DECUDK - user-defined keys and - * DECDLD - downloadable charset - * - *---------------------------------------------------------------------------*/ -void -vt_dcsentry(U_char ch, struct video_state *svsp) -{ - switch(svsp->dcs_state) - { - case DCS_INIT: - switch(ch) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': /* parameters */ - svsp->parms[svsp->parmi] *= 10; - svsp->parms[svsp->parmi] += (ch -'0'); - break; - - case ';': /* next parameter */ - svsp->parmi = - (svsp->parmi+1 < MAXPARMS) ? - svsp->parmi+1 : svsp->parmi; - break; - - case '|': /* DECUDK */ - svsp->transparent = 1; - init_udk(svsp); - svsp->dcs_state = DCS_AND_UDK; - break; - - case '{': /* DECDLD */ - svsp->transparent = 1; - init_dld(svsp); - svsp->dcs_state = DCS_DLD_DSCS; - break; - - default: /* failsafe */ - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - break; - } - break; - - case DCS_AND_UDK: /* DCS ... | */ - switch(ch) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': /* fkey number */ - svsp->udk_fnckey *= 10; - svsp->udk_fnckey += (ch -'0'); - break; - - case '/': /* Key */ - svsp->dcs_state = DCS_UDK_DEF; - break; - - case 0x1b: /* ESC */ - svsp->dcs_state = DCS_UDK_ESC; - break; - - default: - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - break; - } - break; - - case DCS_UDK_DEF: /* DCS ... | fnckey / */ - switch(ch) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if(svsp->udk_deflow) /* low nibble */ - { - svsp->udk_def[svsp->udk_defi] |= (ch -'0'); - svsp->udk_deflow = 0; - svsp->udk_defi = (svsp->udk_defi+1 >= MAXUDKDEF) ? - svsp->udk_defi : svsp->udk_defi+1; - } - else /* high nibble */ - { - svsp->udk_def[svsp->udk_defi] = ((ch -'0') << 4); - svsp->udk_deflow = 1; - } - break; - - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - if(svsp->udk_deflow) /* low nibble */ - { - svsp->udk_def[svsp->udk_defi] |= (ch - 'a' + 10); - svsp->udk_deflow = 0; - svsp->udk_defi = (svsp->udk_defi+1 >= MAXUDKDEF) ? - svsp->udk_defi : svsp->udk_defi+1; - } - else /* high nibble */ - { - svsp->udk_def[svsp->udk_defi] = ((ch - 'a' + 10) << 4); - svsp->udk_deflow = 1; - } - break; - - - - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - if(svsp->udk_deflow) /* low nibble */ - { - svsp->udk_def[svsp->udk_defi] |= (ch - 'A' + 10); - svsp->udk_deflow = 0; - svsp->udk_defi = (svsp->udk_defi+1 >= MAXUDKDEF) ? - svsp->udk_defi : svsp->udk_defi+1; - } - else /* high nibble */ - { - svsp->udk_def[svsp->udk_defi] = ((ch - 'A' + 10) << 4); - svsp->udk_deflow = 1; - } - break; - - case ';': /* next function key */ - vt_udk(svsp); - svsp->dcs_state = DCS_AND_UDK; - break; - - case 0x1b: /* ESC */ - svsp->dcs_state = DCS_UDK_ESC; - break; - - default: - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - break; - } - break; - - case DCS_UDK_ESC: /* DCS ... | fkey/def ... ESC */ - switch(ch) - { - case '\\': /* ST */ - vt_udk(svsp); - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - break; - - default: - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - break; - } - break; - - - case DCS_DLD_DSCS: /* got DCS ... { */ - if(ch >= ' ' && ch <= '/') /* intermediates ... */ - { - svsp->dld_dscs[svsp->dld_dscsi] = ch; - svsp->dld_id[svsp->dld_dscsi] = ch; - if(svsp->dld_dscsi >= DSCS_LENGTH) - { - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - svsp->dld_id[0] = '\0'; - } - else - { - svsp->dld_dscsi++; - } - } - else if(ch >= '0' && ch <= '~') /* final .... */ - { - svsp->dld_dscs[svsp->dld_dscsi] = ch; - svsp->dld_id[svsp->dld_dscsi++] = ch; - svsp->dld_id[svsp->dld_dscsi] = '\0'; - svsp->dcs_state = DCS_DLD_DEF; - } - else - { - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - svsp->dld_id[0] = '\0'; - } - break; - - case DCS_DLD_DEF: /* DCS ... { dscs */ - switch(ch) - { - case 0x1b: /* ESC */ - svsp->dcs_state = DCS_DLD_ESC; - break; - - case '/': /* sixel upper / lower divider */ - svsp->dld_sixel_lower = 1; - break; - - case ';': /* character divider */ - vt_dld(svsp); - svsp->parms[1]++; /* next char */ - break; - - default: - if (svsp->dld_sixel_lower) - { - if(ch >= '?' && ch <= '~') - svsp->sixel.lower[svsp->dld_sixelli] = ch - '?'; - svsp->dld_sixelli = - (svsp->dld_sixelli+1 < MAXSIXEL) ? - svsp->dld_sixelli+1 : svsp->dld_sixelli; - } - else - { - if(ch >= '?' && ch <= '~') - svsp->sixel.upper[svsp->dld_sixelui] = ch - '?'; - svsp->dld_sixelui = - (svsp->dld_sixelui+1 < MAXSIXEL) ? - svsp->dld_sixelui+1 : svsp->dld_sixelui; - } - break; - } - break; - - case DCS_DLD_ESC: /* DCS ... { dscs ... / ... ESC */ - switch(ch) - { - case '\\': /* String Terminator ST */ - vt_dld(svsp); - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - break; - - default: - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - svsp->dld_id[0] = '\0'; - break; - } - break; - - default: - svsp->transparent = 0; - svsp->state = STATE_INIT; - svsp->dcs_state = DCS_INIT; - break; - } -} - -/*---------------------------------------------------------------------------* - * User Defineable Keys - *---------------------------------------------------------------------------*/ -void -vt_udk(struct video_state *svsp) -{ - int key, start, max, i; - int usedff = 0; - - if(svsp->parms[0] != 1) /* clear all ? */ - { - vt_clearudk(svsp); - svsp->parms[0] = 1; - } - - if(svsp->udk_fnckey < 17 || svsp->udk_fnckey > 34) - { - init_udk(svsp); - return; - } - - key = svsp->udk_fnckey - 17; /* index into table */ - - if(svsp->ukt.length[key] == 0) /* never used ? */ - { - if(svsp->udkff < MAXUDKDEF-2) /* space available ? */ - { - start = svsp->udkff; /* next sequential */ - max = MAXUDKDEF - svsp->udkff; /* space available */ - svsp->ukt.first[key] = start; /* start entry */ - usedff = 1; /* flag to update later */ - } - else /* no space */ - { - init_udk(svsp); - return; - } - } - else /* in use, redefine */ - { - start = svsp->ukt.first[key]; /* start entry */ - max = svsp->ukt.length[key]; /* space available */ - } - - if(max < 2) /* hmmm .. */ - { - init_udk(svsp); - return; - } - - max--; /* adjust for tailing '\0' */ - - for(i = 0; i < max && i < svsp->udk_defi; i++) - svsp->udkbuf[start++] = svsp->udk_def[i]; - - svsp->udkbuf[start] = '\0'; /* make it a string, see pcvt_kbd.c */ - svsp->ukt.length[key] = i+1; /* count for tailing '\0' */ - if(usedff) - svsp->udkff += (i+2); /* new start location */ - - init_udk(svsp); -} - -/*---------------------------------------------------------------------------* - * clear all User Defineable Keys - *---------------------------------------------------------------------------*/ -void -vt_clearudk(struct video_state *svsp) -{ - register int i; - - for(i = 0; i < MAXUDKEYS; i++) - { - svsp->ukt.first[i] = 0; - svsp->ukt.length[i] = 0; - } - svsp->udkff = 0; -} - -/*---------------------------------------------------------------------------* - * Down line LoaDable Fonts - *---------------------------------------------------------------------------*/ -void -vt_dld(struct video_state *svsp) -{ - unsigned char vgacharset; - unsigned char vgachar[16]; - unsigned char vgacharb[16]; - - if(vgacs[svsp->vga_charset].secondloaded) - vgacharset = vgacs[svsp->vga_charset].secondloaded; - else - return; - - svsp->parms[1] = (svsp->parms[1] < 1) ? 1 : - ((svsp->parms[1] > 0x7E) ? 0x7E : svsp->parms[1]); - - if(svsp->parms[2] != 1) /* Erase all characters ? */ - { - clear_dld(svsp); - svsp->parms[2] = 1; /* Only erase all characters once per sequence */ - } - - sixel_vga(&(svsp->sixel),vgachar); - - switch(vgacs[vgacharset].char_scanlines & 0x1F) - { - case 7: - vga10_vga8(vgachar,vgacharb); - break; - - case 9: - default: - vga10_vga10(vgachar,vgacharb); - break; - - case 13: - vga10_vga14(vgachar,vgacharb); - break; - - case 15: - vga10_vga16(vgachar,vgacharb); - break; - } - - loadchar(vgacharset, svsp->parms[1] + 0xA0, 16, vgacharb); - - init_dld(svsp); -} - -/*---------------------------------------------------------------------------* - * select character attributes - *---------------------------------------------------------------------------*/ -void -vt_sca(struct video_state *svsp) -{ - switch(svsp->parms[0]) - { - case 1: - svsp->selchar = 1; - break; - case 0: - case 2: - default: - svsp->selchar = 0; - break; - } -} - -/*---------------------------------------------------------------------------* - * initalize selective attribute bit array - *---------------------------------------------------------------------------*/ -void -vt_initsel(struct video_state *svsp) -{ - register int i; - - for(i = 0;i < MAXDECSCA;i++) - svsp->decsca[i] = 0; -} - -/*---------------------------------------------------------------------------* - * DECSEL - selective erase in line - *---------------------------------------------------------------------------*/ -void -vt_sel(struct video_state *svsp) -{ - switch(svsp->parms[0]) - { - case 0: - selective_erase(svsp, (svsp->Crtat + svsp->cur_offset), - svsp->maxcol-svsp->col); - break; - - case 1: - selective_erase(svsp, (svsp->Crtat + svsp->cur_offset)- - svsp->col, svsp->col + 1); - break; - - case 2: - selective_erase(svsp, (svsp->Crtat + svsp->cur_offset)- - svsp->col, svsp->maxcol); - break; - } -} - -/*---------------------------------------------------------------------------* - * DECSED - selective erase in display - *---------------------------------------------------------------------------*/ -void -vt_sed(struct video_state *svsp) -{ - switch(svsp->parms[0]) - { - case 0: - selective_erase(svsp, (svsp->Crtat + svsp->cur_offset), - svsp->Crtat + (svsp->maxcol * svsp->screen_rows) - - (svsp->Crtat + svsp->cur_offset)); - break; - - case 1: - selective_erase(svsp, svsp->Crtat, - (svsp->Crtat + svsp->cur_offset) - svsp->Crtat + 1 ); - break; - - case 2: - selective_erase(svsp, svsp->Crtat, - svsp->maxcol * svsp->screen_rows); - break; - } -} - -/*---------------------------------------------------------------------------* - * scroll screen n lines up - *---------------------------------------------------------------------------*/ -void -roll_up(struct video_state *svsp, int n) -{ - -#if (PCVT_NOFASTSCROLL==0) - - if(svsp->scrr_beg == 0 && /* if scroll region is whole screen */ - svsp->scrr_len == svsp->screen_rows && - (svsp != vsp || /* and either running in memory */ - (svsp->screen_rows == svsp->screen_rowsize && /* or no fkeys */ - adaptor_type != MDA_ADAPTOR))) /* and not on MDA/Hercules */ - { - u_short *Memory = - -#if PCVT_USL_VT_COMPAT - (vsp != svsp || (vsp->vt_status & VT_GRAFX)) ? -#else - (vsp != svsp) ? -#endif - - svsp->Memory : Crtat; - - if(svsp->Crtat > (Memory + (svsp->screen_rows - n) * - svsp->maxcol)) - { - bcopy(svsp->Crtat + svsp->maxcol * n, Memory, - svsp->maxcol * (svsp->screen_rows - n) * CHR); - - svsp->Crtat = Memory; - } - else - { - svsp->Crtat += n * svsp->maxcol; - } - -#if PCVT_USL_VT_COMPAT - if(vsp == svsp && !(vsp->vt_status & VT_GRAFX)) -#else - if(vsp == svsp) -#endif - - { - outb(addr_6845, CRTC_STARTADRH); - outb(addr_6845+1, (svsp->Crtat - Crtat) >> 8); - outb(addr_6845, CRTC_STARTADRL); - outb(addr_6845+1, (svsp->Crtat - Crtat)); - } - } - else -#endif - { - bcopy( svsp->Crtat + ((svsp->scrr_beg + n) * svsp->maxcol), - svsp->Crtat + (svsp->scrr_beg * svsp->maxcol), - svsp->maxcol * (svsp->scrr_len - n) * CHR ); - } - - fillw( user_attr | ' ', - svsp->Crtat + ((svsp->scrr_end - n + 1) * svsp->maxcol), - n * svsp->maxcol); - -/*XXX*/ if(svsp->scroll_lock && svsp->openf && curproc) - tsleep((caddr_t)&(svsp->scroll_lock), PPAUSE, "scrlck", 0); -} - -/*---------------------------------------------------------------------------* - * scroll screen n lines down - *---------------------------------------------------------------------------*/ -static void -roll_down(struct video_state *svsp, int n) -{ - -#if (PCVT_NOFASTSCROLL==0) - - if(svsp->scrr_beg == 0 && /* if scroll region is whole screen */ - svsp->scrr_len == svsp->screen_rows && - (svsp != vsp || /* and either running in memory */ - (svsp->screen_rows == svsp->screen_rowsize && /* or no fkeys */ - adaptor_type != MDA_ADAPTOR))) /* and not on MDA/Hercules */ - { - u_short *Memory = - -#if PCVT_USL_VT_COMPAT - (vsp != svsp || (vsp->vt_status & VT_GRAFX)) ? -#else - (vsp != svsp) ? -#endif - svsp->Memory : Crtat; - - if (svsp->Crtat < (Memory + n * svsp->maxcol)) - { - bcopy(svsp->Crtat, - Memory + svsp->maxcol * (svsp->screen_rows + n), - svsp->maxcol * (svsp->screen_rows - n) * CHR); - - svsp->Crtat = Memory + svsp->maxcol * svsp->screen_rows; - } - else - { - svsp->Crtat -= n * svsp->maxcol; - } - -#if PCVT_USL_VT_COMPAT - if(vsp == svsp && !(vsp->vt_status & VT_GRAFX)) -#else - if(vsp == svsp) -#endif - - { - outb(addr_6845, CRTC_STARTADRH); - outb(addr_6845+1, (svsp->Crtat - Crtat) >> 8); - outb(addr_6845, CRTC_STARTADRL); - outb(addr_6845+1, (svsp->Crtat - Crtat)); - } - } - else -#endif - { - bcopy( svsp->Crtat + (svsp->scrr_beg * svsp->maxcol), - svsp->Crtat + ((svsp->scrr_beg + n) * svsp->maxcol), - svsp->maxcol * (svsp->scrr_len - n) * CHR ); - } - - fillw( user_attr | ' ', - svsp->Crtat + (svsp->scrr_beg * svsp->maxcol), - n * svsp->maxcol); - -/*XXX*/ if(svsp->scroll_lock && svsp->openf && curproc) - tsleep((caddr_t)&(svsp->scroll_lock), PPAUSE, "scrlck", 0); -} - -/*---------------------------------------------------------------------------* - * switch charset pointers - *---------------------------------------------------------------------------*/ -static void -swcsp(struct video_state *svsp, u_short *ctp) -{ - if(ctp == NULL) - return; - - switch(svsp->state) - { - case STATE_BROPN: /* designate G0 */ - svsp->G0 = ctp; - break; - - case STATE_BRCLO: /* designate G1 */ - case STATE_MINUS: /* designate G1 (96) */ - svsp->G1 = ctp; - break; - - case STATE_STAR: /* designate G2 */ - case STATE_DOT: /* designate G2 (96) */ - svsp->G2 = ctp; - break; - - case STATE_PLUS: /* designate G3 */ - case STATE_SLASH: /* designate G3 (96) */ - svsp->G3 = ctp; - break; - } -} - -/*---------------------------------------------------------------------------* - * process terminal responses - *---------------------------------------------------------------------------*/ -static void -respond(struct video_state *svsp) -{ - if(!(svsp->openf)) /* are we opened ? */ - return; - - while (*svsp->report_chars && svsp->report_count > 0) - { - (*linesw[svsp->vs_tty->t_line].l_rint) - (*svsp->report_chars++ & 0xff, svsp->vs_tty); - svsp->report_count--; - } -} - -/*---------------------------------------------------------------------------* - * Initialization for User Defineable Keys - *---------------------------------------------------------------------------*/ -static void -init_udk(struct video_state *svsp) -{ - svsp->udk_defi = 0; - svsp->udk_deflow = 0; - svsp->udk_fnckey = 0; -} - -/*---------------------------------------------------------------------------* - * Clear loaded downloadable (DLD) character set - *---------------------------------------------------------------------------*/ -static void -clear_dld(struct video_state *svsp) -{ - register int i; - unsigned char vgacharset; - unsigned char vgachar[16]; - - if(vgacs[svsp->vga_charset].secondloaded) - vgacharset = vgacs[svsp->vga_charset].secondloaded; - else - return; - - for(i=0;i < 16;i++) /* A zeroed character, vt220 has inverted '?' */ - vgachar[i] = 0x00; - - for(i=1;i <= 94;i++) /* Load (erase) all characters */ - loadchar(vgacharset, i + 0xA0, 16, vgachar); -} - -/*---------------------------------------------------------------------------* - * Initialization for Down line LoaDable Fonts - *---------------------------------------------------------------------------*/ -static void -init_dld(struct video_state *svsp) -{ - register int i; - - svsp->dld_dscsi = 0; - svsp->dld_sixel_lower = 0; - svsp->dld_sixelli = 0; - svsp->dld_sixelui = 0; - - for(i = 0;i < MAXSIXEL;i++) - svsp->sixel.lower[i] = svsp->sixel.upper[i] = 0; -} - -/*---------------------------------------------------------------------------* - * selective erase a region - *---------------------------------------------------------------------------*/ -static void -selective_erase(struct video_state *svsp, u_short *pcrtat, int length) -{ - register int i, j; - - for(j = pcrtat - svsp->Crtat, i = 0;i < length;i++,pcrtat++) - { - if(!(svsp->decsca[INT_INDEX(j+i)] & (1 << BIT_INDEX(j+i)))) - { - *pcrtat &= 0xFF00; /* Keep the video character attributes */ - *pcrtat += ' '; /* Erase the character */ - } - } -} - -#endif /* NVT > 0 */ - -/* ------------------------- E O F ------------------------------------------*/ - |