Files
oldlinux-files/bin-src/vc.shar
2024-02-19 00:21:55 -05:00

2282 lines
58 KiB
Plaintext

echo x - README
sed '/^X/s///' > README << '/'
XFollowing are patches to allow Linux to have Virtual Consoles.
X
XFor those not in the know, VCs allow swapping screen images
Xwith just the touch of a function key, between virtual sessions.
X
XBefore you go any further, this has been tested on only my
Xmachine! Through this door, you enter the world of BETA land.
X
X-----------------------------------------------------------------
X
XVC comes configure to use 50 line mode of a VGA which requires
Xthe use of the shoelace patches that I posted some time ago.
XYou can probably find them on nic.funet.fi or tsx-11.
XI only ever compiled them under minix, so I don't know.
X
XIf you don't have a VGA, or shoelace or you just don't want 50 line
Xmode, then change in kernel/chr_dev/console.c the constant:
XORIG_VIDEO_LINES from 50 back to 25. You can also save some
Xkernel space by change MAX_SCR_ROWS back to 25 from 50.
XMe, I like 50 lines, even with virtual console (claustaphobia).
X
XAnyways the steps are:
X
X 0 - Backup your system.
X
X 1 - Apply patches: move vc.cdif to your source directory /usr/src
X or whatever. kernel, fs, init, and include must be right
X below this. Now:
X
X patch -p0 < vc.cdif
X
X 2 - If you are not using 50 lines (as above), edit console.c now.
X If you are using 50 lines, make sure termcap entry is in /etc.
X Also, I change TERM=console50 in my .profile.
X
X 3 - Recompile
X
X 4 - Compile setterm.c and and doshell.c and put executables in
X /usr/local/bin
X
X 5 - Assuming that you already have tty1 and tty2 done, the following
X ttys must be created as follows:
X
X mknod /dev/tty3 c 4 3
X mknod /dev/tty4 c 4 4
X mknod /dev/tty64 c 4 64
X mknod /dev/tty65 c 4 65
X
X 6 - Reboot with the new Image.
X
X 7 - chmod u+x startcons
X
X 8 - Execute startcons
X
X 9 - If you were using serial ports before (tty1/tty2) they
X are now renamed to tty64/tty65.
X
XYou should now have four virtual consoles, selectable with F1-F4.
XIf you want, you can modify NR_CONSOLES in include/linux/tty.h
Xto an appropriate value and recompile. With this implementation,
X12 is the limit since there is not toggle key. But more than 11
Xmeans no dumping processes.
X
X
XTechnical notes.
X
X The ttys are changed: tty0 is always the current window, while
X ttyn is virtual terminal n selected with function key Fn.
X tty64/tty65 are now the serial ports.
X Startcons can be started from /etc/rc, but TERM=dumb.
X
XProblems:
X
X Standout seems not to work with less, vi, em ,etc; even though
X setterm shows it to be working fine.
X
X Function keys escape sequences were not being caught by console
X (even before my patches), and resulted in characters and beeping.
X Therefore, I have disabled their interpretation in keyboard.S.
X Assembler is not my bag, and I don't know why keystrokes, which
X are infrequent events, need to be handled in assembler.
X
X Leds and caps/num locks are not saved/restored currently.
X
XGoal:
X
X Quantity not quality.
X
XAcknowledgement:
X
X Gordon Irlam of course, for the original.
X
X
X
X
X********************************************************************
X
Xpmacdona@sol.uvic.ca
XPeter.MacDonald@bcsystems.gov.bc.ca
X
/
echo x - doshell.c
sed '/^X/s///' > doshell.c << '/'
X#include <stdio.h>
X#include <sys/file.h>
X#include <errno.h>
X
Xextern char *sys_errlist[];
X
Xmain(int argc, char *argv[])
X{
X
X if (argc != 3) {
X fprintf(stderr, "usage: doshell <ttyname> <shellname> &\n");
X exit(1);
X }
X
X /* close down fd's */
X close(0);
X close(1);
X close(2);
X
X /* detach from parent process's group */
X setsid();
X
X /* open new tty */
X if (open(argv[1], O_RDWR, 0) == -1)
X exit(2);
X dup(0);
X dup(0);
X execlp(argv[2], "-", 0);
X /* should appear on new tty...: */
X fprintf(stderr, "can't exec shell: %s\n", sys_errlist[errno]);
X exit(3);
X}
X
/
echo x - setterm.c
sed '/^X/s///' > setterm.c << '/'
X/* setterm.c, set terminal attributes.
X *
X * Copyright (C) 1990 Gordon Irlam (gordoni@cs.ua.oz.au). Conditions of use,
X * modification, and redistribution are contained in the file COPYRIGHT that
X * forms part of this distribution.
X *
X *
X * Syntax:
X *
X * setterm
X * [ -term terminal_name ]
X * [ -reset ]
X * [ -initialize ]
X * [ -cursor [on|off] ]
X * [ -keyboard pc|olivetti|dutch|extended ]
X * [ -linewrap [on|off] ]
X * [ -snow [on|off] ]
X * [ -softscroll [on|off] ]
X * [ -default ]
X * [ -foreground black|red|green|yellow|blue|magenta|cyan|white|default ]
X * [ -background black|red|green|yellow|blue|magenta|cyan|white|default ]
X * [ -bold [on|off] ]
X * [ -blink [on|off] ]
X * [ -reverse [on|off] ]
X * [ -underline [on|off] ]
X * [ -store ]
X * [ -clear [all|rest] ]
X *
X *
X * Semantics:
X *
X * Setterm writes to standard output a character string that will invoke the
X * specified terminal capabilities. Where possibile termcap is consulted to
X * find the string to use. Some options however do not corresponding to a
X * termcap capability. In this case if the terminal type is "minix-vc", or
X * "minix-vcam" the string that invokes the specified capabilities on the PC
X * Minix virtual console driver is output. Options that are not implemented
X * by the terminal are ignored.
X *
X * The following options are non-obvious.
X *
X * -term can be used to override the TERM environment variable.
X *
X * -reset displays the terminal reset string, which typically resets the
X * terminal to its power on state.
X *
X * -initialize displays the terminal initialization string, which typically
X * sets the terminal's rendering options, and other attributes to the
X * default values.
X *
X * -default sets the terminal's rendering options to the default values.
X *
X * -store stores the terminal's current rendering options as the default
X * values.
X */
X
X#include<stdlib.h>
X#include<stdio.h>
X#include<termcap.h>
X
X/* Constants. */
X
X/* Known special terminal types. */
X#define VCTERM "console"
X#define VCTERM_AM "minix-vcam"
X
X/* Termcap constants. */
X#define TC_BUF_SIZE 1024 /* Size of termcap(3) buffer. */
X#define TC_ENT_SIZE 50 /* Size of termcap(3) entry buffer. */
X
X/* General constants. */
X#define TRUE 1
X#define FALSE 0
X
X/* Keyboard types. */
X#define PC 0
X#define OLIVETTI 1
X#define DUTCH 2
X#define EXTENDED 3
X
X/* Colors. */
X/*
X#define BLACK 0
X#define RED 1
X#define GREEN 2
X#define YELLOW 3
X#define BLUE 4
X#define MAGENTA 5
X#define CYAN 6
X#define WHITE 7
X#define DEFAULT 9 */
X/* Colors. */
X#define BLACK 0
X#define BLUE 1
X#define GREEN 2
X#define CYAN 3
X#define RED 4
X#define MAGENTA 5
X#define YELLOW 6
X#define WHITE 7
X#define DEFAULT 9
X
X/* Control sequences. */
X#define ESC "\033"
X#define DCS "\033P"
X#define ST "\033\\"
X
X/* Static variables. */
X
Xchar tc_buf[TC_BUF_SIZE]; /* Termcap buffer. */
X
X/* Option flags. Set if the option is to be invoked. */
Xint opt_term, opt_reset, opt_initialize, opt_cursor, opt_keyboard;
Xint opt_linewrap, opt_snow, opt_softscroll, opt_default, opt_foreground;
Xint opt_background, opt_bold, opt_blink, opt_reverse, opt_underline;
Xint opt_store, opt_clear;
X
X/* Option controls. The variable names have been contracted to ensure
X * uniqueness.
X */
Xchar *opt_te_terminal_name; /* Terminal name. */
Xint opt_cu_on, opt_li_on, opt_sn_on, opt_so_on, opt_bo_on, opt_bl_on;
Xint opt_re_on, opt_un_on; /* Boolean switches. */
Xint opt_ke_type; /* Keyboard type. */
Xint opt_fo_color, opt_ba_color; /* Colors. */
Xint opt_cl_all; /* Clear all or rest. */
X
X/* Command line parsing routines.
X *
X * Note that it is an error for a given option to be invoked more than once.
X */
X
Xvoid parse_term(argc, argv, option, opt_term, bad_arg)
Xint argc; /* Number of arguments for this option. */
Xchar *argv[]; /* Arguments for this option. */
Xint *option; /* Term flag to set. */
Xchar **opt_term; /* Terminal name to set. */
Xint *bad_arg; /* Set to true if an error is detected. */
X{
X/* Parse a -term specification. */
X
X if (argc != 1 || *option) *bad_arg = TRUE;
X *option = TRUE;
X if (argc == 1) {
X *opt_term = argv[0];
X }
X}
X
Xvoid parse_none(argc, argv, option, bad_arg)
Xint argc; /* Number of arguments for this option. */
Xchar *argv[]; /* Arguments for this option. */
Xint *option; /* Option flag to set. */
Xint *bad_arg; /* Set to true if an error is detected. */
X{
X/* Parse a parameterless specification. */
X
X if (argc != 0 || *option) *bad_arg = TRUE;
X *option = TRUE;
X}
X
Xvoid parse_switch(argc, argv, option, opt_on, bad_arg)
Xint argc; /* Number of arguments for this option. */
Xchar *argv[]; /* Arguments for this option. */
Xint *option; /* Option flag to set. */
Xint *opt_on; /* Boolean option switch to set or reset. */
Xint *bad_arg; /* Set to true if an error is detected. */
X{
X/* Parse a boolean (on/off) specification. */
X
X if (argc > 1 || *option) *bad_arg = TRUE;
X *option = TRUE;
X if (argc == 1) {
X if (strcmp(argv[0], "on") == 0)
X *opt_on = TRUE;
X else if (strcmp(argv[0], "off") == 0)
X *opt_on = FALSE;
X else
X *bad_arg = TRUE;
X } else {
X *opt_on = TRUE;
X }
X}
X
Xvoid parse_keyboard(argc, argv, option, opt_keyboard, bad_arg)
Xint argc; /* Number of arguments for this option. */
Xchar *argv[]; /* Arguments for this option. */
Xint *option; /* Keyboard flag to set. */
Xint *opt_keyboard; /* Keyboard type to set. */
Xint *bad_arg; /* Set to true if an error is detected. */
X{
X/* Parse a -keyboard specification. */
X
X if (argc != 1 || *option) *bad_arg = TRUE;
X *option = TRUE;
X if (argc == 1) {
X if (strcmp(argv[0], "pc") == 0)
X *opt_keyboard = PC;
X else if (strcmp(argv[0], "olivetti") == 0)
X *opt_keyboard = OLIVETTI;
X else if (strcmp(argv[0], "dutch") == 0)
X *opt_keyboard = DUTCH;
X else if (strcmp(argv[0], "extended") == 0)
X *opt_keyboard = EXTENDED;
X else
X *bad_arg = TRUE;
X }
X}
X
Xvoid par_color(argc, argv, option, opt_color, bad_arg)
Xint argc; /* Number of arguments for this option. */
Xchar *argv[]; /* Arguments for this option. */
Xint *option; /* Color flag to set. */
Xint *opt_color; /* Color to set. */
Xint *bad_arg; /* Set to true if an error is detected. */
X{
X/* Parse a -foreground or -background specification. */
X
X if (argc != 1 || *option) *bad_arg = TRUE;
X *option = TRUE;
X if (argc == 1) {
X if (strcmp(argv[0], "black") == 0)
X *opt_color = BLACK;
X else if (strcmp(argv[0], "red") == 0)
X *opt_color = RED;
X else if (strcmp(argv[0], "green") == 0)
X *opt_color = GREEN;
X else if (strcmp(argv[0], "yellow") == 0)
X *opt_color = YELLOW;
X else if (strcmp(argv[0], "blue") == 0)
X *opt_color = BLUE;
X else if (strcmp(argv[0], "magenta") == 0)
X *opt_color = MAGENTA;
X else if (strcmp(argv[0], "cyan") == 0)
X *opt_color = CYAN;
X else if (strcmp(argv[0], "white") == 0)
X *opt_color = WHITE;
X else if (strcmp(argv[0], "default") == 0)
X *opt_color = DEFAULT;
X else
X *bad_arg = TRUE;
X }
X}
X
Xvoid parse_clear(argc, argv, option, opt_all, bad_arg)
Xint argc; /* Number of arguments for this option. */
Xchar *argv[]; /* Arguments for this option. */
Xint *option; /* Clear flag to set. */
Xint *opt_all; /* Clear all switch to set or reset. */
Xint *bad_arg; /* Set to true if an error is detected. */
X{
X/* Parse a -clear specification. */
X
X if (argc > 1 || *option) *bad_arg = TRUE;
X *option = TRUE;
X if (argc == 1) {
X if (strcmp(argv[0], "all") == 0)
X *opt_all = TRUE;
X else if (strcmp(argv[0], "rest") == 0)
X *opt_all = FALSE;
X else
X *bad_arg = TRUE;
X } else {
X *opt_all = TRUE;
X }
X}
X
Xvoid parse_option(option, argc, argv, bad_arg)
Xchar *option; /* Option with leading '-' removed. */
Xint argc; /* Number of arguments for this option. */
Xchar *argv[]; /* Arguments for this option. */
Xint *bad_arg; /* Set to true if an error is detected. */
X{
X/* Parse a single specification. */
X
X if (strcmp(option, "term") == 0)
X parse_term(argc, argv, &opt_term, &opt_te_terminal_name, bad_arg);
X else if (strcmp(option, "reset") == 0)
X parse_none(argc, argv, &opt_reset, bad_arg);
X else if (strcmp(option, "initialize") == 0)
X parse_none(argc, argv, &opt_initialize, bad_arg);
X else if (strcmp(option, "cursor") == 0)
X parse_switch(argc, argv, &opt_cursor, &opt_cu_on, bad_arg);
X else if (strcmp(option, "keyboard") == 0)
X parse_keyboard(argc, argv, &opt_keyboard, &opt_ke_type, bad_arg);
X else if (strcmp(option, "linewrap") == 0)
X parse_switch(argc, argv, &opt_linewrap, &opt_li_on, bad_arg);
X else if (strcmp(option, "snow") == 0)
X parse_switch(argc, argv, &opt_snow, &opt_sn_on, bad_arg);
X else if (strcmp(option, "softscroll") == 0)
X parse_switch(argc, argv, &opt_softscroll, &opt_so_on, bad_arg);
X else if (strcmp(option, "default") == 0)
X parse_none(argc, argv, &opt_default, bad_arg);
X else if (strcmp(option, "foreground") == 0)
X par_color(argc, argv, &opt_foreground, &opt_fo_color, bad_arg);
X else if (strcmp(option, "background") == 0)
X par_color(argc, argv, &opt_background, &opt_ba_color, bad_arg);
X else if (strcmp(option, "bold") == 0)
X parse_switch(argc, argv, &opt_bold, &opt_bo_on, bad_arg);
X else if (strcmp(option, "blink") == 0)
X parse_switch(argc, argv, &opt_blink, &opt_bl_on, bad_arg);
X else if (strcmp(option, "reverse") == 0)
X parse_switch(argc, argv, &opt_reverse, &opt_re_on, bad_arg);
X else if (strcmp(option, "underline") == 0)
X parse_switch(argc, argv, &opt_underline, &opt_un_on, bad_arg);
X else if (strcmp(option, "store") == 0)
X parse_none(argc, argv, &opt_store, bad_arg);
X else if (strcmp(option, "clear") == 0)
X parse_clear(argc, argv, &opt_clear, &opt_cl_all, bad_arg);
X else
X *bad_arg = TRUE;
X}
X
X/* End of command line parsing routines. */
X
Xvoid usage(prog_name)
Xchar *prog_name; /* Name of this program. */
X{
X/* Print error message about arguments, and the command's syntax. */
X
X fprintf(stderr, "%s: Argument error, usage\n", prog_name);
X fprintf(stderr, "\n");
X fprintf(stderr, "%s\n", prog_name);
X fprintf(stderr, " [ -term terminal_name ]\n");
X fprintf(stderr, " [ -reset ]\n");
X fprintf(stderr, " [ -initialize ]\n");
X fprintf(stderr, " [ -cursor [on|off] ]\n");
X fprintf(stderr, " [ -keyboard pc|olivetti|dutch|extended ]\n");
X fprintf(stderr, " [ -linewrap [on|off] ]\n");
X fprintf(stderr, " [ -snow [on|off] ]\n");
X fprintf(stderr, " [ -softscroll [on|off] ]\n");
X fprintf(stderr, " [ -default ]\n");
X fprintf(stderr, " [ -foreground black|red|green|yellow|blue|magenta");
X fprintf(stderr, "|cyan|white|default ]\n");
X fprintf(stderr, " [ -background black|red|green|yellow|blue|magenta");
X fprintf(stderr, "|cyan|white|default ]\n");
X fprintf(stderr, " [ -bold [on|off] ]\n");
X fprintf(stderr, " [ -blink [on|off] ]\n");
X fprintf(stderr, " [ -reverse [on|off] ]\n");
X fprintf(stderr, " [ -underline [on|off] ]\n");
X fprintf(stderr, " [ -store ]\n");
X fprintf(stderr, " [ -clear [all|rest] ]\n");
X}
X
Xchar tc_ent_buf[TC_ENT_SIZE]; /* Buffer for storing a termcap entry. */
X
Xchar *tc_entry(name)
Xchar *name; /* Termcap capability string to lookup. */
X{
X/* Return the specified termcap string, or an empty string if no such termcap
X * capability exists.
X */
X
X char *buf_ptr;
X
X buf_ptr = tc_ent_buf;
X if (tgetstr(name, &buf_ptr) == NULL) tc_ent_buf[0] = '\0';
X return tc_ent_buf;
X}
X
Xvoid perform_sequence(vcterm)
Xint vcterm; /* Set if terminal is a virtual console. */
X{
X/* Perform the selected options. */
X
X /* -reset. */
X if (opt_reset) {
X printf("%s", tc_entry("rs"));
X }
X
X /* -initialize. */
X if (opt_initialize) {
X printf("%s", tc_entry("is"));
X }
X
X /* -cursor [on|off]. */
X if (opt_cursor) {
X if (opt_cu_on)
X printf("%s", tc_entry("ve"));
X else
X printf("%s", tc_entry("vi"));
X }
X
X /* -keyboard pc|olivetti|dutch|extended. Vc only. */
X if (opt_keyboard && vcterm) {
X switch (opt_ke_type) {
X case PC:
X printf("%s%s%s", DCS, "keyboard.pc", ST);
X break;
X case OLIVETTI:
X printf("%s%s%s", DCS, "keyboard.olivetti", ST);
X break;
X case DUTCH:
X printf("%s%s%s", DCS, "keyboard.dutch", ST);
X break;
X case EXTENDED:
X printf("%s%s%s", DCS, "keyboard.extended", ST);
X break;
X }
X }
X
X /* -linewrap [on|off]. Vc only. */
X if (opt_linewrap && vcterm) {
X if (opt_li_on)
X printf("%s%s%s", DCS, "linewrap.on", ST);
X else
X printf("%s%s%s", DCS, "linewrap.off", ST);
X }
X
X /* -snow [on|off]. Vc only. */
X if (opt_snow && vcterm) {
X if (opt_sn_on)
X printf("%s%s%s", DCS, "snow.on", ST);
X else
X printf("%s%s%s", DCS, "snow.off", ST);
X }
X
X /* -softscroll [on|off]. Vc only. */
X if (opt_softscroll && vcterm) {
X if (opt_so_on)
X printf("%s%s%s", DCS, "softscroll.on", ST);
X else
X printf("%s%s%s", DCS, "softscroll.off", ST);
X }
X
X /* -default. Vc sets default rendition, otherwise clears all
X * attributes.
X */
X if (opt_default) {
X if (vcterm)
X printf("%s%s", ESC, "[0m");
X else
X printf("%s", tc_entry("me"));
X }
X
X /* -foreground black|red|green|yellow|blue|magenta|cyan|white|default.
X * Vc only.
X */
X if (opt_foreground && vcterm) {
X printf("%s%s%c%s", ESC, "[3", '0' + opt_fo_color, "m");
X }
X
X /* -background black|red|green|yellow|blue|magenta|cyan|white|default.
X * Vc only.
X */
X if (opt_background && vcterm) {
X printf("%s%s%c%s", ESC, "[4", '0' + opt_ba_color, "m");
X }
X
X /* -bold [on|off]. Vc behaves as expected, otherwise off turns off
X * all attributes.
X */
X if (opt_bold) {
X if (opt_bo_on)
X printf("%s", tc_entry("md"));
X else {
X if (vcterm)
X printf("%s%s", ESC, "[22m");
X else
X printf("%s", tc_entry("me"));
X }
X }
X
X /* -blink [on|off]. Vc behaves as expected, otherwise off turns off
X * all attributes.
X */
X if (opt_blink) {
X if (opt_bl_on)
X printf("%s", tc_entry("mb"));
X else {
X if (vcterm)
X printf("%s%s", ESC, "[25m");
X else
X printf("%s", tc_entry("me"));
X }
X }
X
X /* -reverse [on|off]. Vc behaves as expected, otherwise off turns
X * off all attributes.
X */
X if (opt_reverse) {
X if (opt_re_on)
X printf("%s", tc_entry("mr"));
X else {
X if (vcterm)
X printf("%s%s", ESC, "[27m");
X else
X printf("%s", tc_entry("me"));
X }
X }
X
X /* -underline [on|off]. */
X if (opt_underline) {
X if (opt_un_on)
X printf("%s", tc_entry("us"));
X else
X printf("%s", tc_entry("ue"));
X }
X
X /* -store. Vc only. */
X if (opt_store && vcterm) {
X printf("%s%s%s", DCS, "rendition.set", ST);
X }
X
X /* -clear [all|rest]. */
X if (opt_clear) {
X if (opt_cl_all)
X printf("%s", tc_entry("cl"));
X else
X printf("%s", tc_entry("cd"));
X }
X}
X
Xvoid main(argc, argv)
Xint argc;
Xchar *argv[];
X{
X int bad_arg; /* Set if error in arguments. */
X int arg, modifier;
X char *term; /* Terminal type. */
X int vcterm; /* Set if terminal is a virtual console. */
X
X int bag_arg = FALSE;
X
X if (argc < 2) bad_arg = TRUE;
X
X /* Parse arguments. */
X
X for (arg = 1; arg < argc;) {
X if (*argv[arg] == '-') {
X
X /* Parse a single option. */
X
X for (modifier = arg + 1; modifier < argc; modifier++) {
X if (*argv[modifier] == '-') break;
X }
X parse_option(argv[arg] + 1, modifier - arg - 1,
X &argv[arg + 1], &bad_arg);
X arg = modifier;
X } else {
X
X bad_arg = TRUE;
X arg++;
X }
X }
X
X /* Display syntax message if error in arguments. */
X
X if (bad_arg) {
X usage(argv[0]);
X exit(1);
X }
X
X /* Find out terminal name. */
X
X if (opt_term) {
X term = opt_te_terminal_name;
X } else {
X term = getenv("TERM");
X if (term == NULL) {
X fprintf(stderr, "%s: $TERM is not defined.\n", argv[0]);
X exit(1);
X }
X }
X
X /* Find termcap entry. */
X
X if (tgetent(tc_buf, term) != 1) {
X fprintf(stderr, "%s: Could not find termcap entry for %s.\n",
X argv[0], term);
X exit(1);
X }
X
X /* See if the terminal is a virtual console terminal. */
X
X vcterm = (strcmp(term, VCTERM) == 0) || (strcmp(term, VCTERM_AM) == 0);
X
X /* Perform the selected options. */
X
X perform_sequence(vcterm);
X
X exit(0);
X}
/
echo x - startcons
sed '/^X/s///' > startcons << '/'
X/usr/local/bin/doshell /dev/tty2 /bin/sh &
X/usr/local/bin/doshell /dev/tty3 /bin/sh &
X/usr/local/bin/doshell /dev/tty4 /bin/sh &
X/usr/local/bin/setterm -term console -foreground black -background cyan \
X -clear rest > /dev/tty1
X/usr/local/bin/setterm -term console -foreground white -background blue \
X -clear all > /dev/tty2
X/usr/local/bin/setterm -term console -foreground blue -background cyan \
X -clear all > /dev/tty3
X/usr/local/bin/setterm -term console -foreground cyan -background blue \
X -clear all > /dev/tty4
/
echo x - termcap
sed '/^X/s///' > termcap << '/'
Xd3|vt300|vt320|dec vt300 series:\
X :tc=vt200:
Xdl|vt200|vt220|vt200-js|vt220-js|dec vt200 series with jump scroll:\
X :im=\E[4h:ei=\E[4l:mi:dc=\E[P:dm=:ed=:al=\E[L:dl=\E[M:\
X :cs=\E[%i%d;%dr:sf=\ED:sr=\EM:sb=\EM:\
X :ce=\E[K:cl=\E[H\E[J:cd=\E[J:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\
X :so=\E[7m:se=\E[27m:us=\E[4m:ue=\E[24m:\
X :md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:\
X :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H:\
X :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
X :tc=vt100:
Xd0|vt100|vt100-am|vt100am|dec vt100:\
X :do=^J:co#80:li#24:cl=50\E[;H\E[2J:sf=5\ED:\
X :le=^H:bs:am:cm=5\E[%i%d;%dH:nd=2\E[C:up=2\E[A:\
X :ce=3\E[K:cd=50\E[J:so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\
X :md=2\E[1m:mr=2\E[7m:mb=2\E[5m:me=2\E[m:is=\E[1;24r\E[24;1H:\
X :rf=/usr/share/lib/tabset/vt100:\
X :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:ks=\E[?1h\E=:ke=\E[?1l\E>:\
X :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=^H:\
X :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:pt:sr=5\EM:vt#3:xn:\
X :sc=\E7:rc=\E8:cs=\E[%i%d;%dr:
X#
X# ok, Linux hasn't yet a complete vt100, so we just use the features
X# available. This should hopefully change. Note! We also change the
X# nr of lines to 25. We don't need no steenking waits either (and I
X# don't think we even could handle them, either in the termcap or in
X# the console driver)
X#
X# cl - clear screen
X# sf - scroll forward
X# le - left
X# am - auto-wrap (flag)
X# xn - ignore nl at end of line (flag)
X# ce - clear to end of line
X# cd - clear down
X# cm - cursor move
X# nd - next d? (right)
X# up - up
X# do - down
X# us - underline set
X# ue - underline off
X# so - reverse
X# se - normal
X# md - dim
X# mr - reverse
X# mb - bold
Xdumb|console:\
X :do=^J:co#80:li#25:cl=\E[H\E[J:sf=\ED:\
X :le=^H:bs:am:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\
X :ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\
X :md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:is=\E[1;25r\E[25;1H:\
X :it#8:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:kb=^H:\
X :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:pt:sr=\EM:vt#3:xn:\
X :sc=\E7:rc=\E8:cs=\E[%i%d;%dr:
X#
Xdumb50|console50:\
X :do=^J:co#80:li#50:cl=\E[H\E[J:sf=\ED:\
X :le=^H:bs:am:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\
X :ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\
X :md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:is=\E[1;50r\E[50;1H:\
X :it#8:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:kb=^H:\
X :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:pt:sr=\EM:vt#3:xn:\
X :sc=\E7:rc=\E8:cs=\E[%i%d;%dr:
/
echo x - vc.cdif
sed '/^X/s///' > vc.cdif << '/'
X*** kernel/chr_drv/console.c.orig Tue Dec 10 00:53:28 1991
X--- kernel/chr_drv/console.c Mon Dec 23 22:56:39 1991
X***************
X*** 31,36 ****
X--- 31,37 ----
X #include <linux/tty.h>
X #include <asm/io.h>
X #include <asm/system.h>
X+ #include <string.h>
X
X /*
X * These are set up by the setup-routine at boot-time:
X***************
X*** 41,47 ****
X #define ORIG_VIDEO_PAGE (*(unsigned short *)0x90004)
X #define ORIG_VIDEO_MODE ((*(unsigned short *)0x90006) & 0xff)
X #define ORIG_VIDEO_COLS (((*(unsigned short *)0x90006) & 0xff00) >> 8)
X! #define ORIG_VIDEO_LINES (25)
X #define ORIG_VIDEO_EGA_AX (*(unsigned short *)0x90008)
X #define ORIG_VIDEO_EGA_BX (*(unsigned short *)0x9000a)
X #define ORIG_VIDEO_EGA_CX (*(unsigned short *)0x9000c)
X--- 42,48 ----
X #define ORIG_VIDEO_PAGE (*(unsigned short *)0x90004)
X #define ORIG_VIDEO_MODE ((*(unsigned short *)0x90006) & 0xff)
X #define ORIG_VIDEO_COLS (((*(unsigned short *)0x90006) & 0xff00) >> 8)
X! #define ORIG_VIDEO_LINES (50)
X #define ORIG_VIDEO_EGA_AX (*(unsigned short *)0x90008)
X #define ORIG_VIDEO_EGA_BX (*(unsigned short *)0x9000a)
X #define ORIG_VIDEO_EGA_CX (*(unsigned short *)0x9000c)
X***************
X*** 57,80 ****
X
X static unsigned char video_type; /* Type of display being used */
X static unsigned long video_num_columns; /* Number of text columns */
X static unsigned long video_size_row; /* Bytes per row */
X static unsigned long video_num_lines; /* Number of test lines */
X static unsigned char video_page; /* Initial video page */
X- static unsigned long video_mem_start; /* Start of video RAM */
X- static unsigned long video_mem_end; /* End of video RAM (sort of) */
X static unsigned short video_port_reg; /* Video register select port */
X static unsigned short video_port_val; /* Video register value port */
X! static unsigned short video_erase_char; /* Char+Attrib to erase with */
X
X! static unsigned long origin; /* Used for EGA/VGA fast scroll */
X! static unsigned long scr_end; /* Used for EGA/VGA fast scroll */
X! static unsigned long pos;
X! static unsigned long x,y;
X! static unsigned long top,bottom;
X! static unsigned long state=0;
X! static unsigned long npar,par[NPAR];
X! static unsigned long ques=0;
X! static unsigned char attr=0x07;
X
X static void sysbeep(void);
X
X--- 58,118 ----
X
X static unsigned char video_type; /* Type of display being used */
X static unsigned long video_num_columns; /* Number of text columns */
X+ static unsigned long video_mem_base; /* Base of video memory */
X+ static unsigned long video_mem_term; /* End of video memory */
X static unsigned long video_size_row; /* Bytes per row */
X static unsigned long video_num_lines; /* Number of test lines */
X static unsigned char video_page; /* Initial video page */
X static unsigned short video_port_reg; /* Video register select port */
X static unsigned short video_port_val; /* Video register value port */
X! static int candocolor = 0;
X
X! #define MAX_SCR_ROWS 50
X! #define MAX_SCR_COLS 80
X! #define SCR_CHARS (MAX_SCR_ROWS * MAX_SCR_COLS)
X! #define SCR_SIZE (video_size_row*video_num_lines)
X! static struct {
X! unsigned char vc_attr;
X! unsigned char vc_def_attr;
X! unsigned long vc_ques;
X! unsigned long vc_state;
X! unsigned long vc_origin; /* Used for EGA/VGA fast scroll */
X! unsigned long vc_scr_end; /* Used for EGA/VGA fast scroll */
X! unsigned long vc_pos;
X! unsigned long vc_x,vc_y;
X! unsigned long vc_top,vc_bottom;
X! unsigned long vc_npar,vc_par[NPAR];
X! unsigned long vc_video_mem_start; /* Start of video RAM */
X! unsigned long vc_video_mem_end; /* End of video RAM (sort of) */
X! unsigned vc_saved_x;
X! unsigned vc_saved_y;
X! unsigned short vc_video_erase_char;
X! int vc_iscolor;
X! } vc_cons [NR_CONSOLES];
X! static struct {
X! unsigned short screen[SCR_CHARS];
X! } vc_scrbuf[NR_CONSOLES];
X!
X! #define origin (vc_cons[currcons].vc_origin)
X! #define scr_end (vc_cons[currcons].vc_scr_end)
X! #define pos (vc_cons[currcons].vc_pos)
X! #define top (vc_cons[currcons].vc_top)
X! #define bottom (vc_cons[currcons].vc_bottom)
X! #define x (vc_cons[currcons].vc_x)
X! #define y (vc_cons[currcons].vc_y)
X! #define state (vc_cons[currcons].vc_state)
X! #define npar (vc_cons[currcons].vc_npar)
X! #define par (vc_cons[currcons].vc_par)
X! #define ques (vc_cons[currcons].vc_ques)
X! #define attr (vc_cons[currcons].vc_attr)
X! #define saved_x (vc_cons[currcons].vc_saved_x)
X! #define saved_y (vc_cons[currcons].vc_saved_y)
X! #define video_mem_start (vc_cons[currcons].vc_video_mem_start)
X! #define video_mem_end (vc_cons[currcons].vc_video_mem_end)
X! #define def_attr (vc_cons[currcons].vc_def_attr)
X! #define video_erase_char (vc_cons[currcons].vc_video_erase_char)
X! #define iscolor (vc_cons[currcons].vc_iscolor)
X! int fg_console = 0;
X
X static void sysbeep(void);
X
X***************
X*** 85,91 ****
X #define RESPONSE "\033[?1;2c"
X
X /* NOTE! gotoxy thinks x==video_num_columns is ok */
X! static inline void gotoxy(unsigned int new_x,unsigned int new_y)
X {
X if (new_x > video_num_columns || new_y >= video_num_lines)
X return;
X--- 123,129 ----
X #define RESPONSE "\033[?1;2c"
X
X /* NOTE! gotoxy thinks x==video_num_columns is ok */
X! static inline void gotoxy(int currcons, int new_x,unsigned int new_y)
X {
X if (new_x > video_num_columns || new_y >= video_num_lines)
X return;
X***************
X*** 94,100 ****
X pos=origin + y*video_size_row + (x<<1);
X }
X
X! static inline void set_origin(void)
X {
X cli();
X outb_p(12, video_port_reg);
X--- 132,138 ----
X pos=origin + y*video_size_row + (x<<1);
X }
X
X! static inline void set_origin(int currcons)
X {
X cli();
X outb_p(12, video_port_reg);
X***************
X*** 104,112 ****
X sti();
X }
X
X! static void scrup(void)
X {
X! if (video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_EGAM)
X {
X if (!top && bottom == video_num_lines) {
X origin += video_size_row;
X--- 142,151 ----
X sti();
X }
X
X! static void scrup(int currcons)
X {
X! if ((currcons == fg_console) &&
X! ((video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_EGAM)))
X {
X if (!top && bottom == video_num_lines) {
X origin += video_size_row;
X***************
X*** 136,142 ****
X "D" (scr_end-video_size_row)
X :"cx","di");
X }
X! set_origin();
X } else {
X __asm__("cld\n\t"
X "rep\n\t"
X--- 175,181 ----
X "D" (scr_end-video_size_row)
X :"cx","di");
X }
X! set_origin(currcons);
X } else {
X __asm__("cld\n\t"
X "rep\n\t"
X***************
X*** 167,175 ****
X }
X }
X
X! static void scrdown(void)
X {
X! if (video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_EGAM)
X {
X __asm__("std\n\t"
X "rep\n\t"
X--- 206,215 ----
X }
X }
X
X! static void scrdown(int currcons)
X {
X! if ((currcons == fg_console) &&
X! ((video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_EGAM)))
X {
X __asm__("std\n\t"
X "rep\n\t"
X***************
X*** 201,207 ****
X }
X }
X
X! static void lf(void)
X {
X if (y+1<bottom) {
X y++;
X--- 241,247 ----
X }
X }
X
X! static void lf(int currcons)
X {
X if (y+1<bottom) {
X y++;
X***************
X*** 208,217 ****
X pos += video_size_row;
X return;
X }
X! scrup();
X }
X
X! static void ri(void)
X {
X if (y>top) {
X y--;
X--- 248,257 ----
X pos += video_size_row;
X return;
X }
X! scrup(currcons);
X }
X
X! static void ri(int currcons)
X {
X if (y>top) {
X y--;
X***************
X*** 218,233 ****
X pos -= video_size_row;
X return;
X }
X! scrdown();
X }
X
X! static void cr(void)
X {
X pos -= x<<1;
X x=0;
X }
X
X! static void del(void)
X {
X if (x) {
X pos -= 2;
X--- 258,273 ----
X pos -= video_size_row;
X return;
X }
X! scrdown(currcons);
X }
X
X! static void cr(int currcons)
X {
X pos -= x<<1;
X x=0;
X }
X
X! static void del(int currcons)
X {
X if (x) {
X pos -= 2;
X***************
X*** 236,247 ****
X }
X }
X
X! static void csi_J(int par)
X {
X long count __asm__("cx");
X long start __asm__("di");
X
X! switch (par) {
X case 0: /* erase from cursor to end of display */
X count = (scr_end-pos)>>1;
X start = pos;
X--- 276,287 ----
X }
X }
X
X! static void csi_J(int currcons, int vpar)
X {
X long count __asm__("cx");
X long start __asm__("di");
X
X! switch (vpar) {
X case 0: /* erase from cursor to end of display */
X count = (scr_end-pos)>>1;
X start = pos;
X***************
X*** 265,276 ****
X :"cx","di");
X }
X
X! static void csi_K(int par)
X {
X long count __asm__("cx");
X long start __asm__("di");
X
X! switch (par) {
X case 0: /* erase from cursor to end of line */
X if (x>=video_num_columns)
X return;
X--- 305,316 ----
X :"cx","di");
X }
X
X! static void csi_K(int currcons, int vpar)
X {
X long count __asm__("cx");
X long start __asm__("di");
X
X! switch (vpar) {
X case 0: /* erase from cursor to end of line */
X if (x>=video_num_columns)
X return;
X***************
X*** 296,317 ****
X :"cx","di");
X }
X
X! void csi_m(void)
X {
X int i;
X
X for (i=0;i<=npar;i++)
X switch (par[i]) {
X! case 0:attr=0x07;break;
X! case 1:attr=0x0f;break;
X! case 4:attr=0x0f;break;
X! case 7:attr=0x70;break;
X! case 27:attr=0x07;break;
X }
X }
X
X! static inline void set_cursor(void)
X {
X cli();
X outb_p(14, video_port_reg);
X outb_p(0xff&((pos-video_mem_start)>>9), video_port_val);
X--- 336,379 ----
X :"cx","di");
X }
X
X! void csi_m(int currcons )
X {
X int i;
X
X for (i=0;i<=npar;i++)
X switch (par[i]) {
X! case 0: attr=(iscolor?def_attr:0x07);break; /* default */
X! case 1: attr=(iscolor?def_attr|0x08:0x0f);break; /* bold */
X! case 4: attr=(iscolor?def_attr|0x08:0x0f);break; /* underline */
X! case 7: attr=(iscolor?(def_attr<<4)|(def_attr>>4):0x70);break; /* negative */
X! case 22: /* not bold */
X! case 24: /* not underline */
X! case 25: /* not blinking */
X! break;
X! case 27: attr=(iscolor?def_attr:0x07);break; /* positive image */
X! case 39: if (iscolor) attr=(attr & 0xf0) | (def_attr & 0x0f); break;
X! case 49: if (iscolor) attr=(attr & 0x0f) | (def_attr & 0xf0); break;
X! default:
X! if (!candocolor)
X! break;
X! iscolor = 1;
X! if ((par[i]>=30) && (par[i]<=38))
X! def_attr = (def_attr & 0xf0) | (par[i]-30);
X! else /* Background color */
X! if ((par[i]>=40) && (par[i]<=48))
X! { def_attr = (def_attr & 0x0f) | ((par[i]-40)<<4);
X! video_erase_char = (video_erase_char&0x0ff) | (def_attr<<8);
X! }
X! else
X! break;
X! attr = def_attr;
X }
X }
X
X! static inline void set_cursor(int currcons)
X {
X+ if (currcons != fg_console)
X+ return;
X cli();
X outb_p(14, video_port_reg);
X outb_p(0xff&((pos-video_mem_start)>>9), video_port_val);
X***************
X*** 320,326 ****
X sti();
X }
X
X! static void respond(struct tty_struct * tty)
X {
X char * p = RESPONSE;
X
X--- 382,388 ----
X sti();
X }
X
X! static void respond(int currcons, struct tty_struct * tty)
X {
X char * p = RESPONSE;
X
X***************
X*** 333,339 ****
X copy_to_cooked(tty);
X }
X
X! static void insert_char(void)
X {
X int i=x;
X unsigned short tmp, old = video_erase_char;
X--- 395,401 ----
X copy_to_cooked(tty);
X }
X
X! static void insert_char(int currcons)
X {
X int i=x;
X unsigned short tmp, old = video_erase_char;
X***************
X*** 347,353 ****
X }
X }
X
X! static void insert_line(void)
X {
X int oldtop,oldbottom;
X
X--- 409,415 ----
X }
X }
X
X! static void insert_line(int currcons)
X {
X int oldtop,oldbottom;
X
X***************
X*** 355,366 ****
X oldbottom=bottom;
X top=y;
X bottom = video_num_lines;
X! scrdown();
X top=oldtop;
X bottom=oldbottom;
X }
X
X! static void delete_char(void)
X {
X int i;
X unsigned short * p = (unsigned short *) pos;
X--- 417,428 ----
X oldbottom=bottom;
X top=y;
X bottom = video_num_lines;
X! scrdown(currcons);
X top=oldtop;
X bottom=oldbottom;
X }
X
X! static void delete_char(int currcons)
X {
X int i;
X unsigned short * p = (unsigned short *) pos;
X***************
X*** 375,381 ****
X *p = video_erase_char;
X }
X
X! static void delete_line(void)
X {
X int oldtop,oldbottom;
X
X--- 437,443 ----
X *p = video_erase_char;
X }
X
X! static void delete_line(int currcons)
X {
X int oldtop,oldbottom;
X
X***************
X*** 383,394 ****
X oldbottom=bottom;
X top=y;
X bottom = video_num_lines;
X! scrup();
X top=oldtop;
X bottom=oldbottom;
X }
X
X! static void csi_at(unsigned int nr)
X {
X if (nr > video_num_columns)
X nr = video_num_columns;
X--- 445,456 ----
X oldbottom=bottom;
X top=y;
X bottom = video_num_lines;
X! scrup(currcons);
X top=oldtop;
X bottom=oldbottom;
X }
X
X! static void csi_at(int currcons, unsigned int nr)
X {
X if (nr > video_num_columns)
X nr = video_num_columns;
X***************
X*** 395,404 ****
X else if (!nr)
X nr = 1;
X while (nr--)
X! insert_char();
X }
X
X! static void csi_L(unsigned int nr)
X {
X if (nr > video_num_lines)
X nr = video_num_lines;
X--- 457,466 ----
X else if (!nr)
X nr = 1;
X while (nr--)
X! insert_char(currcons);
X }
X
X! static void csi_L(int currcons, unsigned int nr)
X {
X if (nr > video_num_lines)
X nr = video_num_lines;
X***************
X*** 405,414 ****
X else if (!nr)
X nr = 1;
X while (nr--)
X! insert_line();
X }
X
X! static void csi_P(unsigned int nr)
X {
X if (nr > video_num_columns)
X nr = video_num_columns;
X--- 467,476 ----
X else if (!nr)
X nr = 1;
X while (nr--)
X! insert_line(currcons);
X }
X
X! static void csi_P(int currcons, unsigned int nr)
X {
X if (nr > video_num_columns)
X nr = video_num_columns;
X***************
X*** 415,424 ****
X else if (!nr)
X nr = 1;
X while (nr--)
X! delete_char();
X }
X
X! static void csi_M(unsigned int nr)
X {
X if (nr > video_num_lines)
X nr = video_num_lines;
X--- 477,486 ----
X else if (!nr)
X nr = 1;
X while (nr--)
X! delete_char(currcons);
X }
X
X! static void csi_M(int currcons, unsigned int nr)
X {
X if (nr > video_num_lines)
X nr = video_num_lines;
X***************
X*** 425,452 ****
X else if (!nr)
X nr=1;
X while (nr--)
X! delete_line();
X }
X
X! static int saved_x=0;
X! static int saved_y=0;
X!
X! static void save_cur(void)
X {
X saved_x=x;
X saved_y=y;
X }
X
X! static void restore_cur(void)
X {
X! gotoxy(saved_x, saved_y);
X }
X
X void con_write(struct tty_struct * tty)
X {
X int nr;
X char c;
X
X nr = CHARS(tty->write_q);
X while (nr--) {
X GETCH(tty->write_q,c);
X--- 487,525 ----
X else if (!nr)
X nr=1;
X while (nr--)
X! delete_line(currcons);
X }
X
X! static void save_cur(int currcons)
X {
X saved_x=x;
X saved_y=y;
X }
X
X! static void restore_cur(int currcons)
X {
X! gotoxy(currcons,saved_x, saved_y);
X }
X
X+ static int myattr;
X void con_write(struct tty_struct * tty)
X {
X int nr;
X char c;
X
X+ int currcons;
X+
X+ for (currcons = 0; currcons<=NR_CONSOLES; currcons++)
X+ if (tty == TTY_TABLE(currcons))
X+ break;
X+ if (currcons>NR_CONSOLES)
X+ panic("con_write: illegal tty");
X+ if (!currcons) /* tty0 always writes to the current one. */
X+ currcons = fg_console;
X+ else
X+ currcons--;
X+
X+ myattr = attr;
X nr = CHARS(tty->write_q);
X while (nr--) {
X GETCH(tty->write_q,c);
X***************
X*** 456,464 ****
X if (x>=video_num_columns) {
X x -= video_num_columns;
X pos -= video_size_row;
X! lf();
X }
X! __asm__("movb _attr,%%ah\n\t"
X "movw %%ax,%1\n\t"
X ::"a" (c),"m" (*(short *)pos)
X :"ax");
X--- 529,537 ----
X if (x>=video_num_columns) {
X x -= video_num_columns;
X pos -= video_size_row;
X! lf(currcons);
X }
X! __asm__("movb _myattr,%%ah\n\t"
X "movw %%ax,%1\n\t"
X ::"a" (c),"m" (*(short *)pos)
X :"ax");
X***************
X*** 467,477 ****
X } else if (c==27)
X state=1;
X else if (c==10 || c==11 || c==12)
X! lf();
X else if (c==13)
X! cr();
X else if (c==ERASE_CHAR(tty))
X! del();
X else if (c==8) {
X if (x) {
X x--;
X--- 540,550 ----
X } else if (c==27)
X state=1;
X else if (c==10 || c==11 || c==12)
X! lf(currcons);
X else if (c==13)
X! cr(currcons);
X else if (c==ERASE_CHAR(tty))
X! del(currcons);
X else if (c==8) {
X if (x) {
X x--;
X***************
X*** 484,490 ****
X if (x>video_num_columns) {
X x -= video_num_columns;
X pos -= video_size_row;
X! lf();
X }
X c=9;
X } else if (c==7)
X--- 557,563 ----
X if (x>video_num_columns) {
X x -= video_num_columns;
X pos -= video_size_row;
X! lf(currcons);
X }
X c=9;
X } else if (c==7)
X***************
X*** 495,511 ****
X if (c=='[')
X state=2;
X else if (c=='E')
X! gotoxy(0,y+1);
X else if (c=='M')
X! ri();
X else if (c=='D')
X! lf();
X else if (c=='Z')
X! respond(tty);
X else if (x=='7')
X! save_cur();
X else if (x=='8')
X! restore_cur();
X break;
X case 2:
X for(npar=0;npar<NPAR;npar++)
X--- 568,584 ----
X if (c=='[')
X state=2;
X else if (c=='E')
X! gotoxy(currcons,0,y+1);
X else if (c=='M')
X! ri(currcons);
X else if (c=='D')
X! lf(currcons);
X else if (c=='Z')
X! respond(currcons,tty);
X else if (x=='7')
X! save_cur(currcons);
X else if (x=='8')
X! restore_cur(currcons);
X break;
X case 2:
X for(npar=0;npar<NPAR;npar++)
X***************
X*** 512,517 ****
X--- 585,594 ----
X par[npar]=0;
X npar=0;
X state=3;
X+ /*if (c =='[')
X+ { state=5;
X+ break;
X+ } */
X if (ques=(c=='?'))
X break;
X case 3:
X***************
X*** 527,587 ****
X switch(c) {
X case 'G': case '`':
X if (par[0]) par[0]--;
X! gotoxy(par[0],y);
X break;
X case 'A':
X if (!par[0]) par[0]++;
X! gotoxy(x,y-par[0]);
X break;
X case 'B': case 'e':
X if (!par[0]) par[0]++;
X! gotoxy(x,y+par[0]);
X break;
X case 'C': case 'a':
X if (!par[0]) par[0]++;
X! gotoxy(x+par[0],y);
X break;
X case 'D':
X if (!par[0]) par[0]++;
X! gotoxy(x-par[0],y);
X break;
X case 'E':
X if (!par[0]) par[0]++;
X! gotoxy(0,y+par[0]);
X break;
X case 'F':
X if (!par[0]) par[0]++;
X! gotoxy(0,y-par[0]);
X break;
X case 'd':
X if (par[0]) par[0]--;
X! gotoxy(x,par[0]);
X break;
X case 'H': case 'f':
X if (par[0]) par[0]--;
X if (par[1]) par[1]--;
X! gotoxy(par[1],par[0]);
X break;
X case 'J':
X! csi_J(par[0]);
X break;
X case 'K':
X! csi_K(par[0]);
X break;
X case 'L':
X! csi_L(par[0]);
X break;
X case 'M':
X! csi_M(par[0]);
X break;
X case 'P':
X! csi_P(par[0]);
X break;
X case '@':
X! csi_at(par[0]);
X break;
X case 'm':
X! csi_m();
X break;
X case 'r':
X if (par[0]) par[0]--;
X--- 604,664 ----
X switch(c) {
X case 'G': case '`':
X if (par[0]) par[0]--;
X! gotoxy(currcons,par[0],y);
X break;
X case 'A':
X if (!par[0]) par[0]++;
X! gotoxy(currcons,x,y-par[0]);
X break;
X case 'B': case 'e':
X if (!par[0]) par[0]++;
X! gotoxy(currcons,x,y+par[0]);
X break;
X case 'C': case 'a':
X if (!par[0]) par[0]++;
X! gotoxy(currcons,x+par[0],y);
X break;
X case 'D':
X if (!par[0]) par[0]++;
X! gotoxy(currcons,x-par[0],y);
X break;
X case 'E':
X if (!par[0]) par[0]++;
X! gotoxy(currcons,0,y+par[0]);
X break;
X case 'F':
X if (!par[0]) par[0]++;
X! gotoxy(currcons,0,y-par[0]);
X break;
X case 'd':
X if (par[0]) par[0]--;
X! gotoxy(currcons,x,par[0]);
X break;
X case 'H': case 'f':
X if (par[0]) par[0]--;
X if (par[1]) par[1]--;
X! gotoxy(currcons,par[1],par[0]);
X break;
X case 'J':
X! csi_J(currcons,par[0]);
X break;
X case 'K':
X! csi_K(currcons,par[0]);
X break;
X case 'L':
X! csi_L(currcons,par[0]);
X break;
X case 'M':
X! csi_M(currcons,par[0]);
X break;
X case 'P':
X! csi_P(currcons,par[0]);
X break;
X case '@':
X! csi_at(currcons,par[0]);
X break;
X case 'm':
X! csi_m(currcons);
X break;
X case 'r':
X if (par[0]) par[0]--;
X***************
X*** 593,607 ****
X }
X break;
X case 's':
X! save_cur();
X break;
X case 'u':
X! restore_cur();
X break;
X }
X }
X }
X! set_cursor();
X }
X
X /*
X--- 670,688 ----
X }
X break;
X case 's':
X! save_cur(currcons);
X break;
X case 'u':
X! restore_cur(currcons);
X break;
X }
X+ break;
X+ case 5:
X+ /* Function Key */
X+ break;
X }
X }
X! set_cursor(currcons);
X }
X
X /*
X***************
X*** 619,624 ****
X--- 700,706 ----
X register unsigned char a;
X char *display_desc = "????";
X char *display_ptr;
X+ int currcons = 0, i, j, maxj;
X
X video_num_columns = ORIG_VIDEO_COLS;
X video_size_row = video_num_columns * 2;
X***************
X*** 646,651 ****
X--- 728,734 ----
X }
X else /* If not, it is color. */
X {
X+ candocolor = 1;
X video_mem_start = 0xb8000;
X video_port_reg = 0x3d4;
X video_port_val = 0x3d5;
X***************
X*** 662,667 ****
X--- 745,752 ----
X display_desc = "*CGA";
X }
X }
X+ video_mem_base = video_mem_start;
X+ video_mem_term = video_mem_end;
X
X /* Let the user known what kind of display driver we are using */
X
X***************
X*** 678,690 ****
X scr_end = video_mem_start + video_num_lines * video_size_row;
X top = 0;
X bottom = video_num_lines;
X
X! gotoxy(ORIG_X,ORIG_Y);
X set_trap_gate(0x21,&keyboard_interrupt);
X outb_p(inb_p(0x21)&0xfd,0x21);
X a=inb_p(0x61);
X outb_p(a|0x80,0x61);
X! outb(a,0x61);
X }
X /* from bsd-net-2: */
X
X--- 763,791 ----
X scr_end = video_mem_start + video_num_lines * video_size_row;
X top = 0;
X bottom = video_num_lines;
X+ attr=0x07;
X+ def_attr=0x07;
X+ state=0;
X+ ques = 0;
X+ iscolor = 0;
X
X! gotoxy(currcons,ORIG_X,ORIG_Y);
X set_trap_gate(0x21,&keyboard_interrupt);
X outb_p(inb_p(0x21)&0xfd,0x21);
X a=inb_p(0x61);
X outb_p(a|0x80,0x61);
X! outb_p(a,0x61);
X! for (i=1; i<NR_CONSOLES; i++)
X! { vc_cons[i] = vc_cons[0];
X! vc_cons[i].vc_origin = (unsigned long)vc_scrbuf[i].screen;
X! vc_cons[i].vc_scr_end = vc_cons[i].vc_origin + video_num_lines * video_size_row;
X! vc_cons[i].vc_video_mem_start = vc_cons[i].vc_origin;
X! vc_cons[i].vc_video_mem_end = (i ? vc_cons[i].vc_scr_end : video_mem_term);
X! vc_cons[i].vc_pos=vc_cons[i].vc_video_mem_start + y*video_size_row + (x<<1);
X! maxj = video_num_lines*video_num_columns;
X! for (j=0; j<maxj; j++)
X! vc_scrbuf[i].screen[j] = video_erase_char;
X! }
X }
X /* from bsd-net-2: */
X
X***************
X*** 707,710 ****
X--- 808,957 ----
X outb(0x06, 0x42);
X /* 1/8 second */
X beepcount = HZ/8;
X+ }
X+
X+
X+
X+ static int kb_ack( int data_port)
X+ {
X+ int retries;
X+
X+ retries = 0x1000;
X+ while (--retries != 0 && inb_p(data_port) != 0xFA)
X+ ; /* wait for ack */
X+ return(retries); /* nonzero if ack received */
X+ }
X+
X+ static int kb_wait(int status_port)
X+ {
X+ int retries = 0x1000;
X+ while ((--retries != 0) && (inb_p(status_port) & 0x02))
X+ ;
X+ return(retries);
X+ }
X+
X+ /* Set the LEDs on the caps lock and num lock keys.
X+ static void set_leds( int currcons, int oldcons )
X+ {
X+
X+ int leds, mode, data_port, status_port;
X+ extern unsigned char kbd_leds[2];
X+ extern unsigned char kbd_mode[2];
X+
X+ vc_cons[oldcons].saveled = kbd_leds[0];
X+ vc_cons[oldcons].savemode = kbd_mode[0];
X+ leds = vc_cons[currcons].saveled;
X+ mode = vc_cons[currcons].savemode;
X+ kbd_leds[0] = leds;
X+ kbd_mode[0] = mode;
X+ leds = (((mode>>6)&2) | ((mode>>5)&4));
X+
X+ #ifdef PS_TWO
X+ if (ps) {
X+ data_port = 0x68;
X+ status_port = 0x72;
X+ } else
X+ #endif
X+ {
X+ data_port = 0x60;
X+ status_port = 0x64;
X+ }
X+
X+ kb_wait(status_port);
X+ outb_p(data_port, 0xED);
X+ kb_ack(data_port);
X+
X+ kb_wait(status_port);
X+ outb_p(data_port, leds);
X+ kb_ack(data_port);
X+ } */
X+
X+
X+ static void get_scrmem(int currcons)
X+ {
X+ if ((video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_EGAM) &&
X+ (origin != video_mem_start))
X+ { unsigned long i;
X+ i = scr_end-origin;
X+ memcpy((void *)vc_scrbuf[fg_console].screen, (void *)origin, i );
X+ memcpy( (void*)(((char*)vc_scrbuf[fg_console].screen)+i),
X+ (void *)video_mem_base, SCR_SIZE-i);
X+ }
X+ else
X+ memcpy((void *)vc_scrbuf[fg_console].screen,
X+ (void *)video_mem_base, SCR_SIZE);
X+ origin =
X+ video_mem_start = (unsigned long)vc_scrbuf[fg_console].screen;
X+ video_mem_end = video_mem_start+sizeof(vc_scrbuf[0]);
X+ scr_end = video_mem_start + video_num_lines * video_size_row;
X+ top = 0;
X+ pos=origin + y*video_size_row + (x<<1);
X+ bottom = video_num_lines;
X+ }
X+
X+ static void set_scrmem(int currcons)
X+ {
X+ video_mem_start = video_mem_base;
X+ video_mem_end = video_mem_term;
X+ origin = video_mem_start;
X+ scr_end = video_mem_start + video_num_lines * video_size_row;
X+ top = 0;
X+ bottom = video_num_lines;
X+ pos=origin + y*video_size_row + (x<<1);
X+ memcpy((void *)video_mem_base, (void *)vc_scrbuf[fg_console].screen,
X+ SCR_SIZE);
X+ }
X+
X+ static void swap_screen(int num)
X+ {
X+ if (num == fg_console)
X+ return;
X+ cli();
X+ get_scrmem(fg_console);
X+ fg_console = num;
X+ table_list[0] = &tty_table[num+1].read_q;
X+ table_list[1] = &tty_table[num+1].write_q;
X+ set_scrmem(fg_console);
X+ sti();
X+ if (video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_EGAM)
X+ set_origin(fg_console);
X+ set_cursor(num);
X+ }
X+
X+ static void change_console(int num)
X+ {
X+ /* Bring virtual console num to the foreground, or cycle to next console if
X+ * num is -1.
X+ */
X+
X+ int new_console, old_console;
X+
X+ if (num >= NR_CONSOLES) return;
X+
X+ old_console = new_console = fg_console;
X+
X+ /* Value of fg_console is accessed asynchronously by keyboard() interrupt
X+ * routine, need to perform lock because update can't be guaranteed to be
X+ * atomic.
X+ */
X+ if (num == -1) {
X+ new_console++;
X+ if (new_console >= NR_CONSOLES) new_console = 0;
X+ } else
X+ new_console = num;
X+
X+ /* Set leds and display for new console. */
X+ /* set_leds(new_console,old_console); */
X+ swap_screen(new_console);
X+ }
X+
X+
X+ extern void show_stat(void);
X+
X+ void display_stat( long regeax )
X+ {
X+ if (regeax<NR_CONSOLES)
X+ change_console( regeax );
X+ else
X+ show_stat();
X }
X*** kernel/exit.c.orig Mon Dec 16 13:37:26 1991
X--- kernel/exit.c Mon Dec 16 13:38:50 1991
X***************
X*** 122,128 ****
X iput(current->executable);
X current->executable=NULL;
X if (current->leader && current->tty >= 0)
X! tty_table[current->tty].pgrp = 0;
X if (last_task_used_math == current)
X last_task_used_math = NULL;
X if (current->leader)
X--- 122,128 ----
X iput(current->executable);
X current->executable=NULL;
X if (current->leader && current->tty >= 0)
X! TTY_TABLE(current->tty)->pgrp = 0;
X if (last_task_used_math == current)
X last_task_used_math = NULL;
X if (current->leader)
X*** kernel/chr_drv/keyboard.S.orig Wed Dec 4 15:07:59 1991
X--- kernel/chr_drv/keyboard.S Mon Dec 23 21:59:12 1991
X***************
X*** 208,222 ****
X * this routine handles function keys
X */
X func:
X! pushl %eax
X pushl %ecx
X pushl %edx
X! call _show_stat
X popl %edx
X popl %ecx
X! popl %eax
X! subb $0x3B,%al
X! jb end_func
X cmpb $9,%al
X jbe ok_func
X subb $18,%al
X--- 208,223 ----
X * this routine handles function keys
X */
X func:
X! subb $0x3B,%al
X! jb end_func
X pushl %ecx
X pushl %edx
X! pushl %eax
X! call _display_stat
X! popl %eax
X popl %edx
X popl %ecx
X! jmp end_func
X cmpb $9,%al
X jbe ok_func
X subb $18,%al
X*** init/main.c.orig Sun Dec 22 19:54:50 1991
X--- init/main.c Mon Dec 23 09:33:02 1991
X***************
X*** 170,176 ****
X int pid,i;
X
X setup((void *) &drive_info);
X! (void) open("/dev/tty0",O_RDWR,0);
X (void) dup(0);
X (void) dup(0);
X printf("%d buffers = %d bytes buffer space\n\r",NR_BUFFERS,
X--- 170,176 ----
X int pid,i;
X
X setup((void *) &drive_info);
X! (void) open("/dev/tty1",O_RDWR,0);
X (void) dup(0);
X (void) dup(0);
X printf("%d buffers = %d bytes buffer space\n\r",NR_BUFFERS,
X***************
X*** 194,200 ****
X if (!pid) {
X close(0);close(1);close(2);
X setsid();
X! (void) open("/dev/tty0",O_RDWR,0);
X (void) dup(0);
X (void) dup(0);
X _exit(execve("/bin/sh",argv,envp));
X--- 194,200 ----
X if (!pid) {
X close(0);close(1);close(2);
X setsid();
X! (void) open("/dev/tty1",O_RDWR,0);
X (void) dup(0);
X (void) dup(0);
X _exit(execve("/bin/sh",argv,envp));
X*** fs/open.c.orig Mon Dec 16 13:37:40 1991
X--- fs/open.c Sun Dec 22 23:07:07 1991
X***************
X*** 164,170 ****
X if (MAJOR(inode->i_zone[0])==4) {
X if (current->leader && current->tty<0) {
X current->tty = MINOR(inode->i_zone[0]);
X! tty_table[current->tty].pgrp = current->pgrp;
X }
X } else if (MAJOR(inode->i_zone[0])==5)
X if (current->tty<0) {
X--- 164,170 ----
X if (MAJOR(inode->i_zone[0])==4) {
X if (current->leader && current->tty<0) {
X current->tty = MINOR(inode->i_zone[0]);
X! TTY_TABLE(current->tty)->pgrp = current->pgrp;
X }
X } else if (MAJOR(inode->i_zone[0])==5)
X if (current->tty<0) {
X*** kernel/chr_drv/serial.c.orig Mon Dec 16 13:30:34 1991
X--- kernel/chr_drv/serial.c Mon Dec 16 13:34:06 1991
X***************
X*** 38,45 ****
X {
X set_intr_gate(0x24,rs1_interrupt);
X set_intr_gate(0x23,rs2_interrupt);
X! init(tty_table[1].read_q.data);
X! init(tty_table[2].read_q.data);
X outb(inb_p(0x21)&0xE7,0x21);
X }
X
X--- 38,45 ----
X {
X set_intr_gate(0x24,rs1_interrupt);
X set_intr_gate(0x23,rs2_interrupt);
X! init(TTY_TABLE(FIRST_SERIAL_DEV)->read_q.data);
X! init(TTY_TABLE(FIRST_SERIAL_DEV+1)->read_q.data);
X outb(inb_p(0x21)&0xE7,0x21);
X }
X
X*** include/linux/tty.h.orig Mon Dec 16 13:40:23 1991
X--- include/linux/tty.h Sun Dec 22 18:30:38 1991
X***************
X*** 21,26 ****
X--- 21,33 ----
X char buf[TTY_BUF_SIZE];
X };
X
X+ #define NR_SERIAL 2
X+ #define NR_CONSOLES 4
X+ #define NR_TTYS (NR_SERIAL+NR_CONSOLES+1)
X+ #define FIRST_SERIAL_DEV 64
X+ #define TTY_TABLE(ttynum) (((ttynum) < FIRST_SERIAL_DEV) ? tty_table+(ttynum) :\
X+ tty_table+(ttynum)+NR_CONSOLES-FIRST_SERIAL_DEV+1)
X+
X #define INC(a) ((a) = ((a)+1) & (TTY_BUF_SIZE-1))
X #define DEC(a) ((a) = ((a)-1) & (TTY_BUF_SIZE-1))
X #define EMPTY(a) ((a).head == (a).tail)
X***************
X*** 53,58 ****
X--- 60,66 ----
X };
X
X extern struct tty_struct tty_table[];
X+ extern struct tty_queue *table_list[];
X
X /* intr=^C quit=^| erase=del kill=^U
X eof=^D vtime=\0 vmin=\1 sxtc=\0
X*** kernel/chr_drv/tty_io.c.orig Mon Dec 16 12:59:00 1991
X--- kernel/chr_drv/tty_io.c Mon Dec 23 23:05:44 1991
X***************
X*** 48,54 ****
X #define O_NLRET(tty) _O_FLAG((tty),ONLRET)
X #define O_LCUC(tty) _O_FLAG((tty),OLCUC)
X
X! struct tty_struct tty_table[] = {
X {
X {ICRNL, /* change incoming CR to NL */
X OPOST|ONLCR, /* change outgoing NL to CRNL */
X--- 48,54 ----
X #define O_NLRET(tty) _O_FLAG((tty),ONLRET)
X #define O_LCUC(tty) _O_FLAG((tty),OLCUC)
X
X! struct tty_struct tty_table[NR_TTYS] = {
X {
X {ICRNL, /* change incoming CR to NL */
X OPOST|ONLCR, /* change outgoing NL to CRNL */
X***************
X*** 90,96 ****
X {0,0,0,0,""}
X }
X };
X-
X /*
X * these are the tables used by the machine code handlers.
X * you can implement pseudo-tty's or something by changing
X--- 90,95 ----
X***************
X*** 137,145 ****
X sti();
X }
X
X void wait_for_keypress(void)
X {
X! sleep_if_empty(&tty_table[0].secondary);
X }
X
X void copy_to_cooked(struct tty_struct * tty)
X--- 136,145 ----
X sti();
X }
X
X+ extern int fg_console;
X void wait_for_keypress(void)
X {
X! sleep_if_empty(&tty_table[fg_console+1].secondary);
X }
X
X void copy_to_cooked(struct tty_struct * tty)
X***************
X*** 227,232 ****
X--- 227,236 ----
X wake_up(&tty->secondary.proc_list);
X }
X
X+ #define IS_A_SERIAL(chan) (((chan)>=FIRST_SERIAL_DEV) && ((chan)<=(FIRST_SERIAL_DEV+1)))
X+ #define IS_A_CONSOLE(chan) ((chan)<=NR_CONSOLES)
X+ #define IS_A_TTY(chan) (IS_A_SERIAL(chan) || IS_A_CONSOLE(chan))
X+
X int tty_read(unsigned channel, char * buf, int nr)
X {
X struct tty_struct * tty;
X***************
X*** 234,241 ****
X int minimum,time,flag=0;
X long oldalarm;
X
X! if (channel>2 || nr<0) return -1;
X! tty = &tty_table[channel];
X oldalarm = current->alarm;
X time = 10L*tty->termios.c_cc[VTIME];
X minimum = tty->termios.c_cc[VMIN];
X--- 238,245 ----
X int minimum,time,flag=0;
X long oldalarm;
X
X! if ((!IS_A_TTY(channel)) || nr<0) return -1;
X! tty = TTY_TABLE(channel);
X oldalarm = current->alarm;
X time = 10L*tty->termios.c_cc[VTIME];
X minimum = tty->termios.c_cc[VMIN];
X***************
X*** 293,300 ****
X struct tty_struct * tty;
X char c, *b=buf;
X
X! if (channel>2 || nr<0) return -1;
X! tty = channel + tty_table;
X while (nr>0) {
X sleep_if_full(&tty->write_q);
X if (current->signal)
X--- 297,304 ----
X struct tty_struct * tty;
X char c, *b=buf;
X
X! if ((!IS_A_TTY(channel)) || nr<0) return -1;
X! tty = TTY_TABLE(channel);
X while (nr>0) {
X sleep_if_full(&tty->write_q);
X if (current->signal)
X***************
X*** 340,349 ****
X * totally innocent.
X */
X void do_tty_interrupt(int tty)
X! {
X! copy_to_cooked(tty_table+tty);
X }
X
X void chr_dev_init(void)
X {
X }
X--- 344,368 ----
X * totally innocent.
X */
X void do_tty_interrupt(int tty)
X! { if (tty == 0)
X! tty = fg_console+1;
X! else
X! if ((tty>=1) && (tty<=2))
X! tty = tty + NR_CONSOLES;
X! copy_to_cooked(TTY_TABLE(tty));
X }
X
X void chr_dev_init(void)
X {
X+ int i;
X+ for (i=NR_SERIAL; i>0; i--) /* Move serial ports up. */
X+ tty_table[NR_CONSOLES+i] = tty_table[i];
X+ for (i=1; i<=NR_CONSOLES; i++)
X+ tty_table[i] = tty_table[0];
X+ table_list[0] = &(TTY_TABLE(1)->read_q);
X+ table_list[1] = &(TTY_TABLE(1)->write_q);
X+ table_list[2] = &(TTY_TABLE(FIRST_SERIAL_DEV)->read_q);
X+ table_list[3] = &(TTY_TABLE(FIRST_SERIAL_DEV)->write_q);
X+ table_list[4] = &(TTY_TABLE(FIRST_SERIAL_DEV+1)->read_q);
X+ table_list[5] = &(TTY_TABLE(FIRST_SERIAL_DEV+1)->write_q);
X }
/