summaryrefslogtreecommitdiffstats
path: root/sys/dev/syscons
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1993-07-30 02:20:26 +0000
committerjkh <jkh@FreeBSD.org>1993-07-30 02:20:26 +0000
commit2366a822335e391ec97f45247d79064dba141c35 (patch)
tree0ff9b934d8232fb5aa2929784e8f6e0fd78e54ba /sys/dev/syscons
parent9c1c8ff17c9e850e55c75ddca0caf4ceda22fa96 (diff)
downloadFreeBSD-src-2366a822335e391ec97f45247d79064dba141c35.zip
FreeBSD-src-2366a822335e391ec97f45247d79064dba141c35.tar.gz
Updated syscons to 0.2b - please test this! It won't be in the ALPHA
release, but it's still worth testing.
Diffstat (limited to 'sys/dev/syscons')
-rw-r--r--sys/dev/syscons/syscons.c1185
1 files changed, 721 insertions, 464 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index 6081c65..6828aca 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -1,3 +1,4 @@
+#define STAR_SAVER
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@@ -39,11 +40,10 @@
*
* virtual consoles, SYSV ioctl's, ANSI emulation
*
- * @(#)syscons.c 0.2 930402
- *
- * Modified further to provide full (updated) pccons emulation and
- * hooks for init_main.c. Jordan Hubbard, 930725
+ * @(#)syscons.c 0.2b 930531
*
+ * Further changes 29 July 93 by Jordan Hubbard - provide full pccons and
+ * FreeBSD compatability.
*/
#include "param.h"
@@ -63,7 +63,7 @@
#include "i386/isa/icu.h"
#include "i386/isa/isa.h"
#include "i386/isa/isa_device.h"
-#include "i386/include/pc/display.h"
+#include "machine/pc/display.h"
#include "i386/i386/cons.h"
#include "machine/psl.h"
#include "machine/frame.h"
@@ -71,7 +71,6 @@
#include "ddb.h"
#include "iso8859.font"
#include "kbdtables.h"
-/*#include "asm.h"*/
#if NSC > 0
#ifndef NCONS
@@ -79,7 +78,8 @@
#endif
/* status flags */
-#define LOCK_KEY_MASK 0x00007
+#define LOCK_KEY_MASK 0x0000F
+#define LED_MASK 0x00007
#define UNKNOWN_MODE 0x00010
#define KBD_RAW_MODE 0x00020
#define SWITCH_WAIT_REL 0x00040
@@ -90,9 +90,10 @@
#define CGA_BUF 0xFE0B8000
#define VGA_BUF 0xFE0A0000
#define VIDEOMEM 0x000A0000
+#define MEMSIZE 0x00020000
/* misc defines */
-#define MAX_ESC_PAR 2
+#define MAX_ESC_PAR 3
#define TEXT80x25 1
#define TEXT80x50 2
#define COL 80
@@ -114,21 +115,27 @@
#define GDCIDX 0x3CE /* graph data controller idx */
#define GDCREG 0x3CF /* graph data controller data */
-typedef struct scr_stat {
- u_short *crt_base; /* address of screen memory */
- u_short *scr; /* buffer when off screen */
- u_short *crtat; /* cursor address */
+typedef struct term_stat {
int esc; /* processing escape sequence */
int n_par; /* # of parameters to ESC */
int last_par; /* last parameter # */
int par[MAX_ESC_PAR]; /* contains ESC parameters */
+ int attr; /* current attributes */
+ int std_attr; /* normal attributes */
+ int rev_attr; /* reverse attributes */
+} term_stat;
+
+typedef struct scr_stat {
+ u_short *crt_base; /* address of screen memory */
+ u_short *scr; /* buffer when off screen */
+ u_short *crtat; /* cursor address */
int posx; /* current X position */
int posy; /* current Y position */
int max_posx; /* X size */
int max_posy; /* X size */
- int attr; /* current attributes */
- int std_attr; /* normal attributes */
- int rev_attr; /* reverse attributes */
+ term_stat term; /* terminal emulation stuff */
+ char cursor_start; /* cursor start line # */
+ char cursor_end; /* cursor start end # */
u_char border; /* border color */
u_short bell_duration;
u_short bell_pitch;
@@ -137,24 +144,46 @@ typedef struct scr_stat {
pid_t pid; /* pid of controlling proc */
struct proc *proc; /* proc* of controlling proc */
struct vt_mode smode; /* switch mode */
- } scr_stat;
+} scr_stat;
+
+typedef struct default_attr {
+ int std_attr; /* normal attributes */
+ int rev_attr; /* reverse attributes */
+} default_attr;
+
+static default_attr user_default = {
+ (FG_LIGHTGREY | BG_BLACK) << 8,
+ (FG_BLACK | BG_LIGHTGREY) << 8
+};
+
+static default_attr kernel_default = {
+ (FG_WHITE | BG_BLACK) << 8,
+ (FG_BLACK | BG_LIGHTGREY) << 8
+};
+
+static default_attr *current_default;
static scr_stat cons_scr_stat[NCONS];
static scr_stat *cur_scr_stat = &cons_scr_stat[0];
static scr_stat *new_scp, *old_scp;
+static term_stat kernel_console;
static int switch_in_progress = 0;
u_short *Crtat = (u_short *)MONO_BUF;
static u_short *crtat = 0;
static u_int crtc_addr = MONO_BASE;
-static u_char shfts = 0, ctls = 0, alts = 0;
+static char crtc_vga = 0;
+static u_char shfts = 0, ctls = 0, alts = 0, agrs = 0;
+static u_char nlkcnt = 0, clkcnt = 0, slkcnt = 0, alkcnt = 0;
static char palette[3*256];
static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab);
static int cur_cursor_pos = -1;
static char in_putc, nx_scr;
static char saved_console = -1; /* saved console number */
-static long blank_time = 0; /* screen saver timout value */
-static scrmap_t scr_map;
+static long scrn_blank_time = 0; /* screen saver timout value */
+static int scrn_blanked = 0; /* screen saver active flag */
+static long scrn_time_stamp;
+static u_char scr_map[256];
struct tty pccons[NCONS];
struct tty *cur_pccons = &pccons[0];
@@ -171,7 +200,7 @@ struct pcconsoftc {
char cs_lastc; /* last char sent */
int cs_timo; /* timeouts since interrupt */
u_long cs_wedgecnt; /* times restarted */
- } pcconsoftc = {0, 0, 0, 0};
+} pcconsoftc = {0, 0, 0, 0};
/* special characters */
@@ -203,17 +232,18 @@ static struct tty *get_pccons(dev_t dev);
static scr_stat *get_scr_stat(dev_t dev);
static int get_scr_num(scr_stat *scp);
static void cursor_shape(int start, int end);
+static void get_cursor_shape(int *start, int *end);
static void cursor_pos(void);
static void clear_screen(scr_stat *scp);
static switch_scr(u_int next_scr);
static void exchange_scr(void);
-static void move_crsr(scr_stat *scp, u_int x, u_int y);
+static void move_crsr(scr_stat *scp, int x, int y);
static void move_up(u_short *s, u_short *d, u_int len);
static void move_down(u_short *s, u_short *d, u_int len);
static void scan_esc(scr_stat *scp, u_char c);
static void ansi_put(scr_stat *scp, u_char c);
void consinit(void);
-static void sput(u_char c, u_char ca);
+static void sput(u_char c);
static u_char *get_fstr(u_int c, u_int *len);
static update_leds(int which);
void reset_cpu(void);
@@ -231,13 +261,13 @@ static change_winsize(struct tty *tp, int x, int y);
struct isa_driver scdriver = {
pcprobe, pcattach, "sc",
- };
+};
int pcprobe(struct isa_device *dev)
{
u_char c;
- int i, again = 0;
+ int again = 0;
/* Enable interrupts and keyboard controller */
kbd_wait();
@@ -254,11 +284,7 @@ int pcprobe(struct isa_device *dev)
again = 1;
}
}
- /*
- * pick up keyboard reset return code SOS
- * some keyboards / controllers hangs if this is enabled
- */
- /* while ((c=inb(KB_DATA))!=0xAA); */
+ kbd_wait();
return 1;
}
@@ -266,29 +292,42 @@ int pcprobe(struct isa_device *dev)
int pcattach(struct isa_device *dev)
{
scr_stat *scp;
- int i;
+ int start = -1, end = -1, i;
- if (crtc_addr == MONO_BASE)
- printf("VGA mono");
- else
- printf("VGA color");
+ if (crtc_vga)
+ if (crtc_addr == MONO_BASE)
+ printf(" VGA mono");
+ else
+ printf(" VGA color");
+ else
+ if (crtc_addr == MONO_BASE)
+ printf(" MDA/hercules");
+ else
+ printf(" CGA/EGA");
if (NCONS > 1)
printf(" <%d virtual consoles>\n", NCONS);
else
printf("\n");
- save_palette();
- load_font(0, 16, font_8x16);
- load_font(1, 8, font_8x8);
+ if (crtc_vga) {
+ get_cursor_shape(&start, &end);
+ save_palette();
+ load_font(0, 16, font_8x16);
+ load_font(1, 8, font_8x8);
+ load_font(2, 14, font_8x14);
+ }
+ current_default = &user_default;
for (i = 0; i < NCONS; i++) {
scp = &cons_scr_stat[i];
- scp->mode = TEXT80x25;
scp->scr = (u_short *)malloc(COL * ROW * 2, M_DEVBUF, M_NOWAIT);
- scp->std_attr = (FG_LIGHTGREY | BG_BLACK) << 8;
- scp->rev_attr = (FG_BLACK | BG_LIGHTGREY) << 8;
- scp->attr = scp->std_attr;
+ scp->mode = TEXT80x25;
+ scp->term.esc = 0;
+ scp->term.std_attr = current_default->std_attr;
+ scp->term.rev_attr = current_default->rev_attr;
+ scp->term.attr = scp->term.std_attr;
scp->border = BG_BLACK;
- scp->esc = 0;
+ scp->cursor_start = start;
+ scp->cursor_end = end;
scp->max_posx = COL;
scp->max_posy = ROW;
scp->bell_pitch = 800;
@@ -299,9 +338,10 @@ int pcattach(struct isa_device *dev)
scp->smode.mode = VT_AUTO;
if (i > 0) {
scp->crt_base = scp->crtat = scp->scr;
- fillw(scp->attr | ' ', scp->scr, COL * ROW);
+ fillw(scp->term.attr|scr_map[0x20], scp->scr, COL*ROW);
}
}
+ /* get cursor going */
cursor_pos();
}
@@ -406,7 +446,10 @@ scintr(dev_t dev, int irq, int cpl)
int c, len;
u_char *cp;
- scrn_saver(0);
+ /* make screensaver happy */
+ scrn_time_stamp = time.tv_sec;
+ if (scrn_blanked)
+ scrn_saver(0);
c = sgetc(1);
if (c & 0x100)
return;
@@ -439,42 +482,50 @@ pcparam(struct tty *tp, struct termios *t)
pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
{
- int i, error;
+ int error;
struct tty *tp;
struct syscframe *fp;
scr_stat *scp;
tp = get_pccons(dev);
if (!tp)
- return(ENXIO);
+ return ENXIO;
scp = get_scr_stat(tp->t_dev);
switch (cmd) { /* process console hardware related ioctl's */
case CONS_BLANKTIME: /* set screen saver timeout (0 = no saver) */
- blank_time = *(int*)data;
+ scrn_blank_time = *(int*)data;
return 0;
case CONS_80x25TEXT: /* set 80x25 text mode */
+ if (!crtc_vga)
+ return ENXIO;
scp->mode = TEXT80x25;
scp->max_posy = 25;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->max_posx, scp->max_posy);
free(scp->scr, M_DEVBUF);
scp->scr = (u_short *)malloc(scp->max_posx*scp->max_posy*2,
M_DEVBUF, M_NOWAIT);
+ if (scp != cur_scr_stat)
+ scp->crt_base = scp->scr;
+ set_mode(scp);
+ clear_screen(scp);
+ change_winsize(tp, scp->max_posx, scp->max_posy);
return 0;
case CONS_80x50TEXT: /* set 80x50 text mode */
+ if (!crtc_vga)
+ return ENXIO;
scp->mode = TEXT80x50;
scp->max_posy = 50;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->max_posx, scp->max_posy);
free(scp->scr, M_DEVBUF);
scp->scr = (u_short *)malloc(scp->max_posx*scp->max_posy*2,
M_DEVBUF, M_NOWAIT);
+ if (scp != cur_scr_stat)
+ scp->crt_base = scp->scr;
+ set_mode(scp);
+ clear_screen(scp);
+ change_winsize(tp, scp->max_posx, scp->max_posy);
return 0;
case CONS_GETINFO: /* get current (virtual) console info */
@@ -485,10 +536,10 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
ptr->mv_row = scp->posy;
ptr->mv_csz = scp->max_posx;
ptr->mv_rsz = scp->max_posy;
- ptr->mv_norm.fore = (scp->std_attr & 0x0f00)>>8;
- ptr->mv_norm.back = (scp->std_attr & 0xf000)>>12;
- ptr->mv_rev.fore = (scp->rev_attr & 0x0f00)>>8;
- ptr->mv_rev.back = (scp->rev_attr & 0xf000)>>12;
+ ptr->mv_norm.fore = (scp->term.std_attr & 0x0f00)>>8;
+ ptr->mv_norm.back = (scp->term.std_attr & 0xf000)>>12;
+ ptr->mv_rev.fore = (scp->term.rev_attr & 0x0f00)>>8;
+ ptr->mv_rev.back = (scp->term.rev_attr & 0xf000)>>12;
ptr->mv_grfc.fore = 0; /* not supported */
ptr->mv_grfc.back = 0; /* not supported */
ptr->mv_ovscan = scp->border;
@@ -586,9 +637,12 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
switch (*data) {
case KD_TEXT: /* switch to TEXT (known) mode */
/* restore fonts & palette ! */
- load_font(0, 16, font_8x16);
- load_font(1, 8, font_8x8);
- load_palette();
+ if (crtc_vga) {
+ load_font(0, 16, font_8x16);
+ load_font(1, 8, font_8x8);
+ load_font(2, 14, font_8x14);
+ load_palette();
+ }
/* FALL THROUGH */
case KD_TEXT1: /* switch to TEXT (known) mode */
@@ -611,17 +665,19 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return 0;
case KDSBORDER: /* set border color of this (virtual) console */
+ if (!crtc_vga)
+ return ENXIO;
scp->border = *data;
if (scp == cur_scr_stat)
set_border(scp->border);
return 0;
case KDSKBSTATE: /* set keyboard state (locks) */
- if (*data >= 0 && *data < 4) {
+ if (*data >= 0 && *data <= LOCK_KEY_MASK) {
scp->status &= ~LOCK_KEY_MASK;
scp->status |= *data;
if (scp == cur_scr_stat)
- update_leds(scp->status & LOCK_KEY_MASK);
+ update_leds(scp->status & LED_MASK);
return 0;
}
return EINVAL;
@@ -685,14 +741,17 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return 0;
case KDSETLED: /* set keyboard LED status */
- scp->status &= ~LOCK_KEY_MASK;
- scp->status |= (*data & LOCK_KEY_MASK);
- if (scp == cur_scr_stat)
- update_leds(scp->status & LOCK_KEY_MASK);
- return 0;
+ if (*data >= 0 && *data <= LED_MASK) {
+ scp->status &= ~LED_MASK;
+ scp->status |= *data;
+ if (scp == cur_scr_stat)
+ update_leds(scp->status & LED_MASK);
+ return 0;
+ }
+ return EINVAL;
case KDGETLED: /* get keyboard LED status */
- *data = scp->status & LOCK_KEY_MASK;
+ *data = scp->status & LED_MASK;
return 0;
case GETFKEY: /* get functionkey string */
@@ -720,11 +779,11 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return EINVAL;
case GIO_SCRNMAP: /* get output translation table */
- bcopy(&scr_map, data, sizeof(scrmap_t));
+ bcopy(&scr_map, data, sizeof(scr_map));
return 0;
case PIO_SCRNMAP: /* set output translation table */
- bcopy(data, &scr_map, sizeof(scrmap_t));
+ bcopy(data, &scr_map, sizeof(scr_map));
return 0;
case GIO_KEYMAP: /* get keyboard translation table */
@@ -736,30 +795,42 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return 0;
case PIO_FONT8x8: /* set 8x8 dot font */
- bcopy(data, &font_8x8, sizeof(fnt8_t));
- load_font(1, 8, font_8x16);
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(data, &font_8x8, sizeof(font_8x8));
+ load_font(1, 8, font_8x8);
return 0;
case GIO_FONT8x8: /* get 8x8 dot font */
- bcopy(&font_8x8, data, sizeof(fnt8_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(&font_8x8, data, sizeof(font_8x8));
return 0;
case PIO_FONT8x14: /* set 8x14 dot font */
- bcopy(data, &font_8x14, sizeof(fnt14_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(data, &font_8x14, sizeof(font_8x14));
load_font(2, 14, font_8x14);
return 0;
case GIO_FONT8x14: /* get 8x14 dot font */
- bcopy(&font_8x14, data, sizeof(fnt14_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(&font_8x14, data, sizeof(font_8x14));
return 0;
case PIO_FONT8x16: /* set 8x16 dot font */
- bcopy(data, &font_8x16, sizeof(fnt16_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(data, &font_8x16, sizeof(font_8x16));
load_font(0, 16, font_8x16);
return 0;
case GIO_FONT8x16: /* get 8x16 dot font */
- bcopy(&font_8x16, data, sizeof(fnt16_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(&font_8x16, data, sizeof(font_8x16));
return 0;
case CONSOLE_X_MODE_ON: /* just to be compatible */
@@ -777,8 +848,12 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
case CONSOLE_X_MODE_OFF:/* just to be compatible */
fp = (struct syscframe *)p->p_regs;
fp->sf_eflags &= ~PSL_IOPL;
- load_font(0, 16, font_8x16);
- load_font(1, 8, font_8x8);
+ if (crtc_vga) {
+ load_font(0, 16, font_8x16);
+ load_font(1, 8, font_8x8);
+ load_font(2, 14, font_8x14);
+ load_palette();
+ }
scp->status &= ~UNKNOWN_MODE;
set_mode(scp);
clear_screen(scp);
@@ -787,18 +862,18 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
saved_console = -1;
return 0;
- case CONSOLE_X_BELL:
- /*
- * if set, data is a pointer to a length 2 array of
- * integers. data[0] is the pitch in Hz and data[1]
- * is the duration in msec.
- */
- if (data)
- sysbeep(1187500/ ((int*)data)[0],
- ((int*)data)[1] * hz/ 3000);
- else
- sysbeep(0x31b, hz/4);
- return 0;
+ case CONSOLE_X_BELL:
+ /*
+ * if set, data is a pointer to a length 2 array of
+ * integers. data[0] is the pitch in Hz and data[1]
+ * is the duration in msec.
+ */
+ if (data)
+ sysbeep(1187500/ ((int*)data)[0],
+ ((int*)data)[1] * hz/ 3000);
+ else
+ sysbeep(0x31b, hz/4);
+ return 0;
default:
break;
@@ -851,9 +926,11 @@ pcstart(struct tty *tp)
if (scp->status & SLKED)
break;
c = getc(&tp->t_out);
+ tp->t_state |= TS_BUSY;
splx(s);
ansi_put(scp, c);
s = spltty();
+ tp->t_state &= ~TS_BUSY;
}
splx(s);
}
@@ -887,8 +964,8 @@ pccnputc(dev_t dev, char c)
if (cur_scr_stat->status & UNKNOWN_MODE)
return;
if (c == '\n')
- sput('\r', FG_LIGHTGREY | BG_BLACK);
- sput(c, FG_LIGHTGREY | BG_BLACK);
+ sput('\r');
+ sput(c);
pos = cur_scr_stat->crtat - cur_scr_stat->crt_base;
if (pos != cur_cursor_pos) {
cur_cursor_pos = pos;
@@ -911,105 +988,152 @@ pccngetc(dev_t dev)
return(c);
}
-#ifndef DONT_BLANK
+#if !defined(STAR_SAVER) && !defined(SNAKE_SAVER)
void scrn_saver(int test)
{
u_char val;
- static int blanked = 0;
- static long time_stamp;
-
- if (test && blank_time) {
- if (time.tv_sec > time_stamp + blank_time) {
- blanked = 1;
- outb(TSIDX, 0x01); val = inb(TSREG);
- outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
+
+ if (test) {
+ scrn_blanked = 1;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
+ }
+ else {
+ scrn_blanked = 0;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
+ }
+}
+#endif
+#if defined(STAR_SAVER) || defined(SNAKE_SAVER)
+
+static u_long rand_next = 1;
+
+static rand()
+{
+ return ((rand_next = rand_next * 1103515245 + 12345) & 0x7FFFFFFF);
+}
+#endif
+#ifdef STAR_SAVER
+/*
+ * Alternate saver that got its inspiration from a well known utility
+ * package for an unfamous OS.
+ */
+
+#define NUM_STARS 50
+
+void scrn_saver(int test)
+{
+ scr_stat *scp = cur_scr_stat;
+ int cell, i;
+ char pattern[] = {"...........++++*** "};
+ char colors[] = {FG_DARKGREY, FG_LIGHTGREY,
+ FG_WHITE, FG_LIGHTCYAN};
+ static u_short stars[NUM_STARS][2];
+
+ if (test) {
+ if (!scrn_blanked) {
+ bcopy(Crtat, scp->scr,
+ scp->max_posx * scp->max_posy * 2);
+ fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat,
+ scp->max_posx * scp->max_posy);
+ set_border(0);
+ i = scp->max_posy * scp->max_posx + 5;
+ outb(crtc_addr, 14);
+ outb(crtc_addr+1, i >> 8);
+ outb(crtc_addr, 15);
+ outb(crtc_addr+1, i & 0xff);
+ scrn_blanked = 1;
+ for(i=0; i<NUM_STARS; i++) {
+ stars[i][0] =
+ rand() % (scp->max_posx*scp->max_posy);
+ stars[i][1] = 0;
+ }
+ }
+ cell = rand() % NUM_STARS;
+ *((u_short*)(Crtat + stars[cell][0])) =
+ scr_map[pattern[stars[cell][1]]] |
+ colors[rand()%sizeof(colors)] << 8;
+ if ((stars[cell][1]+=(rand()%4)) >= sizeof(pattern)-1) {
+ stars[cell][0] = rand() % (scp->max_posx*scp->max_posy);
+ stars[cell][1] = 0;
}
}
else {
- time_stamp = time.tv_sec;
- if (blanked) {
- blanked = 0;
- outb(TSIDX, 0x01); val = inb(TSREG);
- outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
+ if (scrn_blanked) {
+ bcopy(scp->scr, Crtat, scp->max_posx*scp->max_posy*2);
+ cur_cursor_pos = -1;
+ set_border(scp->border);
+ scrn_blanked = 0;
}
}
}
-
-#else
+#endif
+#ifdef SNAKE_SAVER
/*
* alternative screen saver for cards that do not like blanking
- * donated by Christoph Robitchko
*/
-static u_short cur_cursor_shape; /* remember cursor shape */
void scrn_saver(int test)
{
const char saves[] = {"386BSD"};
- static int blanked = 0;
static u_char *savs[sizeof(saves)-1];
static int dirx, diry;
- static long time_stamp;
- static u_short save_cursor;
int f;
scr_stat *scp = cur_scr_stat;
- if (test && blank_time) {
- if (time.tv_sec > time_stamp + blank_time) {
- if (!blanked) {
- bcopy(Crtat, scp->scr,
- scp->max_posx * scp->max_posy * 2);
- fillw(0x07<<8 | ' ', Crtat,
- scp->max_posx * scp->max_posy);
- set_border(0);
- dirx = (scp->posx ? 1 : -1);
- diry = (scp->posy ?
- scp->max_posx : -scp->max_posx);
- for (f=0; f< sizeof(saves)-1; f++)
- savs[f] = (u_char *)Crtat + 2 *
- (scp->posx+scp->posy*scp->max_posx);
- *(savs[0]) = *saves;
- f = scp->max_posy * scp->max_posx + 5;
- outb(crtc_addr, 14);
- outb(crtc_addr+1, f >> 8);
- outb(crtc_addr, 15);
- outb(crtc_addr+1, f & 0xff);
- save_cursor = cur_cursor_shape;
- blanked = 1;
- }
- if (blanked++ < 4)
- return;
- blanked = 1;
- *(savs[sizeof(saves)-2]) = ' ';
- for (f=sizeof(saves)-2; f > 0; f--)
- savs[f] = savs[f-1];
- f = (savs[0] - (u_char *)Crtat) / 2;
- if ((f % scp->max_posx) == 0 ||
- (f % scp->max_posx) == scp->max_posx - 1)
- dirx = -dirx;
- if ((f / scp->max_posx) == 0 ||
- (f / scp->max_posx) == scp->max_posy - 1)
- diry = -diry;
- savs[0] += 2*dirx + 2*diry;
- for (f=sizeof(saves)-2; f>=0; f--)
- *(savs[f]) = saves[f];
+ if (test) {
+ if (!scrn_blanked) {
+ bcopy(Crtat, scp->scr,
+ scp->max_posx * scp->max_posy * 2);
+ fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat,
+ scp->max_posx * scp->max_posy);
+ set_border(0);
+ dirx = (scp->posx ? 1 : -1);
+ diry = (scp->posy ?
+ scp->max_posx : -scp->max_posx);
+ for (f=0; f< sizeof(saves)-1; f++)
+ savs[f] = (u_char *)Crtat + 2 *
+ (scp->posx+scp->posy*scp->max_posx);
+ *(savs[0]) = scr_map[*saves];
+ f = scp->max_posy * scp->max_posx + 5;
+ outb(crtc_addr, 14);
+ outb(crtc_addr+1, f >> 8);
+ outb(crtc_addr, 15);
+ outb(crtc_addr+1, f & 0xff);
+ scrn_blanked = 1;
}
+ if (scrn_blanked++ < 4)
+ return;
+ scrn_blanked = 1;
+ *(savs[sizeof(saves)-2]) = scr_map[0x20];
+ for (f=sizeof(saves)-2; f > 0; f--)
+ savs[f] = savs[f-1];
+ f = (savs[0] - (u_char *)Crtat) / 2;
+ if ((f % scp->max_posx) == 0 ||
+ (f % scp->max_posx) == scp->max_posx - 1 ||
+ (rand() % 50) == 0)
+ dirx = -dirx;
+ if ((f / scp->max_posx) == 0 ||
+ (f / scp->max_posx) == scp->max_posy - 1 ||
+ (rand() % 20) == 0)
+ diry = -diry;
+ savs[0] += 2*dirx + 2*diry;
+ for (f=sizeof(saves)-2; f>=0; f--)
+ *(savs[f]) = scr_map[saves[f]];
}
else {
- time_stamp = time.tv_sec;
- if (blanked) {
+ if (scrn_blanked) {
bcopy(scp->scr, Crtat,
scp->max_posx * scp->max_posy * 2);
cur_cursor_pos = -1;
- cursor_shape((save_cursor >> 8) & 0xff,
- save_cursor & 0xff);
set_border(scp->border);
- blanked = 0;
+ scrn_blanked = 0;
}
}
}
-
-#endif /* DONT_BLANK */
+#endif
static void cursor_shape(int start, int end)
{
@@ -1017,34 +1141,42 @@ static void cursor_shape(int start, int end)
outb(crtc_addr+1, start & 0xFF);
outb(crtc_addr, 11);
outb(crtc_addr+1, end & 0xFF);
-#ifdef DONT_BLANK
- cur_cursor_shape = ((start & 0xff) << 8) | (end & 0xff);
-#endif
+}
+
+
+static void get_cursor_shape(int *start, int *end)
+{
+ outb(crtc_addr, 10);
+ *start = inb(crtc_addr+1) & 0x1F;
+ outb(crtc_addr, 11);
+ *end = inb(crtc_addr+1) & 0x1F;
}
static void cursor_pos(void)
{
- int pos = cur_scr_stat->crtat - cur_scr_stat->crt_base;
+ int pos;
if (cur_scr_stat->status & UNKNOWN_MODE)
return;
- scrn_saver(1);
- if (pos != cur_cursor_pos) {
+ if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time))
+ scrn_saver(1);
+ pos = cur_scr_stat->crtat - cur_scr_stat->crt_base;
+ if (!scrn_blanked && pos != cur_cursor_pos) {
cur_cursor_pos = pos;
- outb(crtc_addr,14);
- outb(crtc_addr+1,pos >> 8);
- outb(crtc_addr,15);
- outb(crtc_addr+1,pos&0xff);
+ outb(crtc_addr, 14);
+ outb(crtc_addr+1, pos>>8);
+ outb(crtc_addr, 15);
+ outb(crtc_addr+1, pos&0xff);
}
- timeout(cursor_pos,0,hz/20);
+ timeout(cursor_pos, 0, hz/20);
}
static void clear_screen(scr_stat *scp)
{
move_crsr(scp, 0, 0);
- fillw(scp->attr | ' ', scp->crt_base,
+ fillw(scp->term.attr | scr_map[0x20], scp->crt_base,
scp->max_posx * scp->max_posy);
}
@@ -1052,9 +1184,12 @@ static void clear_screen(scr_stat *scp)
static switch_scr(u_int next_scr)
{
if (in_putc) { /* don't switch if in putc */
- nx_scr = next_scr + 1;
+ nx_scr = next_scr+1;
return 0;
}
+ if (switch_in_progress &&
+ (cur_scr_stat->proc != pfind(cur_scr_stat->pid)))
+ switch_in_progress = 0;
if (next_scr >= NCONS || switch_in_progress) {
sysbeep(800, hz/4);
return -1;
@@ -1102,7 +1237,7 @@ static void exchange_scr(void)
cur_pccons = new_pccons;
if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE)
shfts = ctls = alts = 0;
- update_leds(new_scp->status & LOCK_KEY_MASK);
+ update_leds(new_scp->status & LED_MASK);
set_mode(new_scp);
new_scp->crt_base = Crtat;
move_crsr(new_scp, new_scp->posx, new_scp->posy);
@@ -1111,7 +1246,7 @@ static void exchange_scr(void)
}
-static void move_crsr(scr_stat *scp, u_int x, u_int y)
+static void move_crsr(scr_stat *scp, int x, int y)
{
if (x < 0 || y < 0 || x >= scp->max_posx || y >= scp->max_posy)
return;
@@ -1141,18 +1276,18 @@ static void scan_esc(scr_stat *scp, u_char c)
{
static u_char ansi_col[16] =
{0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15};
- int i, n, m;
+ int i, n;
u_short *src, *dst, count;
- if (scp->esc == 1) {
+ if (scp->term.esc == 1) {
switch (c) {
case '[': /* Start ESC [ sequence */
- scp->esc = 2;
- scp->last_par = -1;
- for (i = scp->n_par; i < MAX_ESC_PAR; i++)
- scp->par[i] = 1;
- scp->n_par = 0;
+ scp->term.esc = 2;
+ scp->term.last_par = -1;
+ for (i = scp->term.n_par; i < MAX_ESC_PAR; i++)
+ scp->term.par[i] = 1;
+ scp->term.n_par = 0;
return;
case 'M': /* Move cursor up 1 line, scroll if at top */
@@ -1162,13 +1297,13 @@ static void scan_esc(scr_stat *scp, u_char c)
move_up(scp->crt_base,
scp->crt_base + scp->max_posx,
(scp->max_posy - 1) * scp->max_posx);
- fillw(scp->attr | ' ',
+ fillw(scp->term.attr | scr_map[0x20],
scp->crt_base, scp->max_posx);
}
break;
#if notyet
case 'Q':
- scp->esc = 4;
+ scp->term.esc = 4;
break;
#endif
case 'c': /* Clear screen & home */
@@ -1176,87 +1311,90 @@ static void scan_esc(scr_stat *scp, u_char c)
break;
}
}
- else if (scp->esc == 2) {
+ else if (scp->term.esc == 2) {
if (c >= '0' && c <= '9') {
- if (scp->n_par < MAX_ESC_PAR) {
- if (scp->last_par != scp->n_par) {
- scp->last_par = scp->n_par;
- scp->par[scp->n_par] = 0;
+ if (scp->term.n_par < MAX_ESC_PAR) {
+ if (scp->term.last_par != scp->term.n_par) {
+ scp->term.last_par = scp->term.n_par;
+ scp->term.par[scp->term.n_par] = 0;
}
else
- scp->par[scp->n_par] *= 10;
- scp->par[scp->n_par] += c - '0';
+ scp->term.par[scp->term.n_par] *= 10;
+ scp->term.par[scp->term.n_par] += c - '0';
return;
}
}
- scp->n_par = scp->last_par + 1;
+ scp->term.n_par = scp->term.last_par + 1;
switch (c) {
case ';':
- if (scp->n_par < MAX_ESC_PAR)
+ if (scp->term.n_par < MAX_ESC_PAR)
return;
break;
case '=':
- scp->esc = 3;
- scp->last_par = -1;
- for (i = scp->n_par; i < MAX_ESC_PAR; i++)
- scp->par[i] = 1;
- scp->n_par = 0;
+ scp->term.esc = 3;
+ scp->term.last_par = -1;
+ for (i = scp->term.n_par; i < MAX_ESC_PAR; i++)
+ scp->term.par[i] = 1;
+ scp->term.n_par = 0;
return;
case 'A': /* up n rows */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx, scp->posy - n);
break;
case 'B': /* down n rows */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx, scp->posy + n);
break;
case 'C': /* right n columns */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx + n, scp->posy);
break;
case 'D': /* left n columns */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx - n, scp->posy);
break;
case 'E': /* cursor to start of line n lines down */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, 0, scp->posy + n);
break;
case 'F': /* cursor to start of line n lines up */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, 0, scp->posy - n);
break;
case 'f': /* System V consoles .. */
case 'H': /* Cursor move */
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
move_crsr(scp, 0, 0);
- else if (scp->n_par == 2)
- move_crsr(scp, scp->par[1] - 1, scp->par[0] - 1);
+ else if (scp->term.n_par == 2)
+ move_crsr(scp, scp->term.par[1] - 1,
+ scp->term.par[0] - 1);
break;
case 'J': /* Clear all or part of display */
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
n = 0;
else
- n = scp->par[0];
+ n = scp->term.par[0];
switch (n) {
case 0: /* clear form cursor to end of display */
- fillw(scp->attr | ' ', scp->crtat,
- scp->crt_base + scp->max_posx *
- scp->max_posy - scp->crtat);
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crtat, scp->crt_base +
+ scp->max_posx * scp->max_posy -
+ scp->crtat);
break;
case 1: /* clear from beginning of display to cursor */
- fillw(scp->attr | ' ', scp->crt_base,
- scp->crtat - scp->crt_base);
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crt_base,
+ scp->crtat - scp->crt_base);
break;
case 2: /* clear entire display */
clear_screen(scp);
@@ -1265,41 +1403,42 @@ static void scan_esc(scr_stat *scp, u_char c)
break;
case 'K': /* Clear all or part of line */
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
n = 0;
else
- n = scp->par[0];
+ n = scp->term.par[0];
switch (n) {
case 0: /* clear form cursor to end of line */
- fillw(scp->attr | ' ', scp->crtat,
- scp->max_posx - scp->posx);
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crtat, scp->max_posx - scp->posx);
break;
case 1: /* clear from beginning of line to cursor */
- fillw(scp->attr | ' ',
- scp->crtat - (scp->max_posx - scp->posx),
- (scp->max_posx - scp->posx) + 1);
+ fillw(scp->term.attr|scr_map[0x20],
+ scp->crtat - (scp->max_posx - scp->posx),
+ (scp->max_posx - scp->posx) + 1);
break;
case 2: /* clear entire line */
- fillw(scp->attr | ' ',
- scp->crtat - (scp->max_posx - scp->posx),
- scp->max_posx);
+ fillw(scp->term.attr|scr_map[0x20],
+ scp->crtat - (scp->max_posx - scp->posx),
+ scp->max_posx);
break;
}
break;
case 'L': /* Insert n lines */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if (n > scp->max_posy - scp->posy)
n = scp->max_posy - scp->posy;
src = scp->crt_base + scp->posy * scp->max_posx;
dst = src + n * scp->max_posx;
count = scp->max_posy - (scp->posy + n);
move_up(src, dst, count * scp->max_posx);
- fillw(scp->attr | ' ', src, n * scp->max_posx);
+ fillw(scp->term.attr | scr_map[0x20], src,
+ n * scp->max_posx);
break;
case 'M': /* Delete n lines */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if (n > scp->max_posy - scp->posy)
n = scp->max_posy - scp->posy;
dst = scp->crt_base + scp->posy * scp->max_posx;
@@ -1307,11 +1446,12 @@ static void scan_esc(scr_stat *scp, u_char c)
count = scp->max_posy - (scp->posy + n);
move_down(src, dst, count * scp->max_posx);
src = dst + count * scp->max_posx;
- fillw(scp->attr | ' ', src, n * scp->max_posx);
+ fillw(scp->term.attr | scr_map[0x20], src,
+ n * scp->max_posx);
break;
case 'P': /* Delete n chars */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if (n > scp->max_posx - scp->posx)
n = scp->max_posx - scp->posx;
dst = scp->crtat;
@@ -1319,49 +1459,51 @@ static void scan_esc(scr_stat *scp, u_char c)
count = scp->max_posx - (scp->posx + n);
move_down(src, dst, count);
src = dst + count;
- fillw(scp->attr | ' ', src, n);
+ fillw(scp->term.attr | scr_map[0x20], src, n);
break;
case '@': /* Insert n chars */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if (n > scp->max_posx - scp->posx)
n = scp->max_posx - scp->posx;
src = scp->crtat;
dst = src + n;
count = scp->max_posx - (scp->posx + n);
move_up(src, dst, count);
- fillw(scp->attr | ' ', src, n);
+ fillw(scp->term.attr | scr_map[0x20], src, n);
break;
case 'S': /* scroll up n lines */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
bcopy(scp->crt_base + (scp->max_posx * n),
- scp->crt_base,
- scp->max_posx * (scp->max_posy - n) *
- sizeof(u_short));
- fillw(scp->attr | ' ',
- scp->crt_base + scp->max_posx *
- (scp->max_posy - 1),
- scp->max_posx);
+ scp->crt_base,
+ scp->max_posx * (scp->max_posy - n) *
+ sizeof(u_short));
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crt_base + scp->max_posx *
+ (scp->max_posy - 1),
+ scp->max_posx);
break;
case 'T': /* scroll down n lines */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
bcopy(scp->crt_base,
- scp->crt_base + (scp->max_posx * n),
- scp->max_posx * (scp->max_posy - n) *
- sizeof(u_short));
- fillw(scp->attr | ' ', scp->crt_base, scp->max_posx);
+ scp->crt_base + (scp->max_posx * n),
+ scp->max_posx * (scp->max_posy - n) *
+ sizeof(u_short));
+ fillw(scp->term.attr | scr_map[0x20], scp->crt_base,
+ scp->max_posx);
break;
case 'X': /* delete n characters in line */
- n = scp->par[0]; if (n < 1) n = 1;
- fillw(scp->attr | ' ', scp->crt_base + scp->posx +
+ n = scp->term.par[0]; if (n < 1) n = 1;
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crt_base + scp->posx +
((scp->max_posx*scp->posy) * sizeof(u_short)), n);
break;
case 'Z': /* move n tabs backwards */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if ((i = scp->posx & 0xf8) == scp->posx)
i -= 8*n;
else
@@ -1372,202 +1514,213 @@ static void scan_esc(scr_stat *scp, u_char c)
break;
case '`': /* move cursor to column n */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, n, scp->posy);
break;
case 'a': /* move cursor n columns to the right */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx + n, scp->posy);
break;
case 'd': /* move cursor to row n */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx, n);
break;
case 'e': /* move cursor n rows down */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx, scp->posy + n);
break;
case 'm': /* change attribute */
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
n = 0;
else
- n = scp->par[0];
+ n = scp->term.par[0];
switch (n) {
case 0: /* back to normal */
- scp->attr = scp->std_attr;
+ scp->term.attr = scp->term.std_attr;
break;
case 1: /* highlight (bold) */
- scp->attr &= 0xFF00;
- scp->attr |= 0x0800;
+ scp->term.attr &= 0xFF00;
+ scp->term.attr |= 0x0800;
break;
case 4: /* highlight (underline) */
- scp->attr &= 0x0F00;
- scp->attr |= 0x0800;
+ scp->term.attr &= 0x0F00;
+ scp->term.attr |= 0x0800;
break;
case 5: /* blink */
- scp->attr &= 0xFF00;
- scp->attr |= 0x8000;
+ scp->term.attr &= 0xFF00;
+ scp->term.attr |= 0x8000;
break;
case 7: /* reverse video */
- scp->attr = scp->rev_attr;
+ scp->term.attr = scp->term.rev_attr;
break;
case 30: case 31: case 32: case 33: /* set fg color */
case 34: case 35: case 36: case 37:
- scp->attr = (scp->attr & 0xF0FF)
+ scp->term.attr = (scp->term.attr & 0xF0FF)
| (ansi_col[(n - 30) & 7] << 8);
break;
case 40: case 41: case 42: case 43: /* set bg color */
case 44: case 45: case 46: case 47:
- scp->attr = (scp->attr & 0x0FFF)
+ scp->term.attr = (scp->term.attr & 0x0FFF)
| (ansi_col[(n - 40) & 7] << 12);
break;
}
break;
case 'x':
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
n = 0;
else
- n = scp->par[0];
+ n = scp->term.par[0];
switch (n) {
case 0: /* reset attributes */
- scp->attr = scp->std_attr = FG_LIGHTGREY << 8;
+ scp->term.attr = scp->term.std_attr =
+ current_default->std_attr;
+ scp->term.rev_attr = current_default->rev_attr;
break;
case 1: /* set ansi background */
- scp->attr = scp->std_attr =
- (scp->std_attr & 0x0F00)
- | (ansi_col[(scp->par[1])&0x0F] << 12);
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.std_attr & 0x0F00) |
+ (ansi_col[(scp->term.par[1])&0x0F]<<12);
break;
case 2: /* set ansi foreground */
- scp->attr = scp->std_attr =
- (scp->std_attr & 0xF000)
- | (ansi_col[(scp->par[1])&0x0F] << 8);
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.std_attr & 0xF000) |
+ (ansi_col[(scp->term.par[1])&0x0F]<<8);
break;
case 3: /* set ansi attribute directly */
- scp->attr = scp->std_attr =
- (scp->par[1] & 0xFF) << 8;
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.par[1]&0xFF)<<8;
break;
case 5: /* set ansi reverse video background */
- scp->rev_attr =
- (scp->rev_attr & 0x0F00)
- | (ansi_col[(scp->par[1]) & 0x0F] << 12);
+ scp->term.rev_attr =
+ (scp->term.rev_attr & 0x0F00) |
+ (ansi_col[(scp->term.par[1])&0x0F]<<12);
break;
case 6: /* set ansi reverse video foreground */
- scp->rev_attr =
- (scp->rev_attr & 0xF000)
- | (ansi_col[(scp->par[1]) & 0x0F] << 8);
+ scp->term.rev_attr =
+ (scp->term.rev_attr & 0xF000) |
+ (ansi_col[(scp->term.par[1])&0x0F]<<8);
break;
case 7: /* set ansi reverse video directly */
- scp->rev_attr = (scp->par[1] & 0xFF) << 8;
+ scp->term.rev_attr = (scp->term.par[1]&0xFF)<<8;
break;
}
break;
case 'z': /* switch to (virtual) console n */
- if (scp->n_par == 1)
- switch_scr(scp->par[0]);
+ if (scp->term.n_par == 1)
+ switch_scr(scp->term.par[0]);
break;
}
}
- else if (scp->esc == 3) {
+ else if (scp->term.esc == 3) {
if (c >= '0' && c <= '9') {
- if (scp->n_par < MAX_ESC_PAR) {
- if (scp->last_par != scp->n_par) {
- scp->last_par = scp->n_par;
- scp->par[scp->n_par] = 0;
+ if (scp->term.n_par < MAX_ESC_PAR) {
+ if (scp->term.last_par != scp->term.n_par) {
+ scp->term.last_par = scp->term.n_par;
+ scp->term.par[scp->term.n_par] = 0;
}
else
- scp->par[scp->n_par] *= 10;
- scp->par[scp->n_par] += c - '0';
+ scp->term.par[scp->term.n_par] *= 10;
+ scp->term.par[scp->term.n_par] += c - '0';
return;
}
}
- scp->n_par = scp->last_par + 1;
+ scp->term.n_par = scp->term.last_par + 1;
switch (c) {
case ';':
- if (scp->n_par < MAX_ESC_PAR)
+ if (scp->term.n_par < MAX_ESC_PAR)
return;
break;
case 'A': /* set display border color */
- if (scp->n_par == 1)
- scp->border=scp->par[0] & 0xff;
+ if (scp->term.n_par == 1)
+ scp->border=scp->term.par[0] & 0xff;
if (scp == cur_scr_stat)
set_border(scp->border);
break;
case 'B': /* set bell pitch and duration */
- if (scp->n_par == 2) {
- scp->bell_pitch = scp->par[0];
- scp->bell_duration = scp->par[1]*10;
+ if (scp->term.n_par == 2) {
+ scp->bell_pitch = scp->term.par[0];
+ scp->bell_duration = scp->term.par[1]*10;
}
break;
case 'C': /* set cursor shape (start & end line) */
- if (scp->n_par == 2)
- cursor_shape(scp->par[0], scp->par[1]);
+ if (scp->term.n_par == 2) {
+ scp->cursor_start = scp->term.par[0] & 0x1F;
+ scp->cursor_end = scp->term.par[1] & 0x1F;
+ if (scp == cur_scr_stat)
+ cursor_shape(scp->cursor_start,
+ scp->cursor_end);
+ }
break;
case 'F': /* set ansi foreground */
- if (scp->n_par == 1)
- scp->attr = scp->std_attr =
- (scp->std_attr & 0xF000)
- | ((scp->par[0] & 0x0F) << 8);
+ if (scp->term.n_par == 1)
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.std_attr & 0xF000)
+ | ((scp->term.par[0] & 0x0F) << 8);
break;
case 'G': /* set ansi background */
- if (scp->n_par == 1)
- scp->attr = scp->std_attr =
- (scp->std_attr & 0x0F00)
- | ((scp->par[0] & 0x0F) << 12);
+ if (scp->term.n_par == 1)
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.std_attr & 0x0F00)
+ | ((scp->term.par[0] & 0x0F) << 12);
break;
case 'H': /* set ansi reverse video foreground */
- if (scp->n_par == 1)
- scp->rev_attr =
- (scp->rev_attr & 0xF000)
- | ((scp->par[0] & 0x0F) << 8);
+ if (scp->term.n_par == 1)
+ scp->term.rev_attr =
+ (scp->term.rev_attr & 0xF000)
+ | ((scp->term.par[0] & 0x0F) << 8);
break;
case 'I': /* set ansi reverse video background */
- if (scp->n_par == 1)
- scp->rev_attr =
- (scp->rev_attr & 0x0F00)
- | ((scp->par[0] & 0x0F) << 12);
+ if (scp->term.n_par == 1)
+ scp->term.rev_attr =
+ (scp->term.rev_attr & 0x0F00)
+ | ((scp->term.par[0] & 0x0F) << 12);
break;
}
}
- scp->esc = 0;
+ scp->term.esc = 0;
}
-#define wrtchar(scp, c) ( *scp->crtat = (c), scp->crtat++, scp->posx++ )
-
static void ansi_put(scr_stat *scp, u_char c)
{
- int s;
-
- if (scp == cur_scr_stat )
- scrn_saver(0);
if (scp->status & UNKNOWN_MODE)
return;
+
+ /* make screensaver happy */
+ if (scp == cur_scr_stat) {
+ scrn_time_stamp = time.tv_sec;
+ if (scrn_blanked)
+ scrn_saver(0);
+ }
in_putc++;
- if (scp->esc)
+ if (scp->term.esc)
scan_esc(scp, c);
else switch(c) {
- case 0x1B:
- scp->esc = 1;
- scp->n_par = 0;
+ case 0x1B: /* start escape sequence */
+ scp->term.esc = 1;
+ scp->term.n_par = 0;
+ break;
+ case 0x07:
+ if (scp == cur_scr_stat)
+ sysbeep(scp->bell_pitch, scp->bell_duration);
break;
- case '\t':
- do {
- wrtchar(scp, scp->attr | ' ');
- } while (scp->posx % 8);
+ case '\t': /* non-destructive tab */
+ scp->crtat += (8 - scp->posx % 8);
+ scp->posx += (8 - scp->posx % 8);
break;
case '\b': /* non-destructive backspace */
if (scp->crtat > scp->crt_base) {
@@ -1580,43 +1733,36 @@ static void ansi_put(scr_stat *scp, u_char c)
}
}
break;
- case '\r':
+ case '\r': /* return to pos 0 */
move_crsr(scp, 0, scp->posy);
break;
- case '\n':
+ case '\n': /* newline, same pos */
scp->crtat += scp->max_posx;
scp->posy++;
break;
- case '\f':
+ case '\f': /* form feed, clears screen */
clear_screen(scp);
break;
default:
- if (c == 7) {
- if (scp == cur_scr_stat)
- sysbeep(scp->bell_pitch, scp->bell_duration);
- }
/* Print only printables */
- else {
- wrtchar(scp, scp->attr | c);
- if (scp->posx >= scp->max_posx) {
- scp->posx = 0;
- scp->posy++;
- }
- break;
+ *scp->crtat = (scp->term.attr | scr_map[c]);
+ scp->crtat++;
+ if (++scp->posx >= scp->max_posx) {
+ scp->posx = 0;
+ scp->posy++;
}
+ break;
}
if (scp->crtat >= scp->crt_base + scp->max_posy * scp->max_posx) {
bcopy(scp->crt_base + scp->max_posx, scp->crt_base,
scp->max_posx * (scp->max_posy - 1) * sizeof(u_short));
- fillw(scp->attr | ' ',
+ fillw(scp->term.attr | scr_map[0x20],
scp->crt_base + scp->max_posx * (scp->max_posy - 1),
scp->max_posx);
scp->crtat -= scp->max_posx;
scp->posy--;
}
- s = spltty();
in_putc--;
- splx(s);
if (nx_scr)
switch_scr(nx_scr - 1);
}
@@ -1625,14 +1771,12 @@ static void ansi_put(scr_stat *scp, u_char c)
void consinit(void)
{
u_short *cp = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short), was;
- scr_stat *scp;
unsigned cursorat;
int i;
/*
* catch that once in a blue moon occurence when consinit is called
* TWICE, adding the CGA_BUF offset again -> poooff
- * thanks to Christoph Robitchko for finding this one !!
*/
if (crtat != 0)
return;
@@ -1650,22 +1794,28 @@ void consinit(void)
crtc_addr = COLOR_BASE;
Crtat = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short);
}
+
/* Extract cursor location */
outb(crtc_addr,14);
cursorat = inb(crtc_addr+1)<<8 ;
outb(crtc_addr,15);
cursorat |= inb(crtc_addr+1);
+ crtat = Crtat + cursorat;
- crtat = Crtat+ cursorat;
+ /* is this a VGA or higher ? */
+ outb(crtc_addr, 7);
+ if (inb(crtc_addr) == 7)
+ crtc_vga = 1;
+ current_default = &user_default;
cons_scr_stat[0].crtat = crtat;
cons_scr_stat[0].crt_base = Crtat;
+ cons_scr_stat[0].term.esc = 0;
+ cons_scr_stat[0].term.std_attr = current_default->std_attr;
+ cons_scr_stat[0].term.rev_attr = current_default->rev_attr;
+ cons_scr_stat[0].term.attr = current_default->std_attr;
cons_scr_stat[0].posx = cursorat % COL;
cons_scr_stat[0].posy = cursorat / COL;
- cons_scr_stat[0].esc = 0;
- cons_scr_stat[0].std_attr = (FG_LIGHTGREY | BG_BLACK) << 8;
- cons_scr_stat[0].rev_attr = (FG_BLACK | BG_LIGHTGREY) << 8;
- cons_scr_stat[0].attr = (FG_LIGHTGREY | BG_BLACK) << 8;
cons_scr_stat[0].border = BG_BLACK;;
cons_scr_stat[0].max_posx = COL;
cons_scr_stat[0].max_posy = ROW;
@@ -1675,21 +1825,31 @@ void consinit(void)
cons_scr_stat[0].smode.mode = VT_AUTO;
cons_scr_stat[0].bell_pitch = 800;
cons_scr_stat[0].bell_duration = 10;
+ kernel_console.esc = 0;
+ kernel_console.std_attr = kernel_default.std_attr;
+ kernel_console.rev_attr = kernel_default.rev_attr;
+ kernel_console.attr = kernel_default.std_attr;
+ /* initialize mapscrn array to */
+ for (i=0; i<sizeof(scr_map); i++)
+ scr_map[i] = i;
clear_screen(&cons_scr_stat[0]);
}
-static void sput(u_char c, u_char ca)
+static void sput(u_char c)
{
- int i;
scr_stat *scp = &cons_scr_stat[0];
+ term_stat save;
if (crtat == 0)
consinit();
- i = scp->attr;
- scp->attr = ca << 8;
+ save = scp->term;
+ scp->term = kernel_console;
+ current_default = &kernel_default;
ansi_put(scp, c);
- scp->attr = i;
+ kernel_console = scp->term;
+ current_default = &user_default;
+ scp->term = save;
}
@@ -1710,18 +1870,15 @@ static u_char *get_fstr(u_int c, u_int *len)
static update_leds(int which)
{
u_char xlate_leds[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
- int i;
kbd_cmd(KB_SETLEDS); /* LED Command */
- kbd_cmd(xlate_leds[which]);
+ kbd_cmd(xlate_leds[which & LED_MASK]);
kbd_wait();
}
volatile void reset_cpu(void)
{
- int i;
-
while (1) {
kbd_cmd(KB_RESET_CPU); /* Reset Command */
DELAY(4000000);
@@ -1736,122 +1893,176 @@ volatile void reset_cpu(void)
*/
u_int sgetc(int noblock)
{
- u_char dt, modifier;
- static u_char esc_flag = 0;
+ u_char val, code, release;
u_int state, action;
- int i;
struct key_t *key;
+ static u_char esc_flag = 0, compose = 0;
+ static u_int chr = 0;
next_code:
kbd_wait();
/* First see if there is something in the keyboard port */
if (inb(KB_STAT) & KB_BUF_FULL)
- dt = inb(KB_DATA);
+ val = inb(KB_DATA);
else if (noblock)
return(0x100);
else
goto next_code;
if (cur_scr_stat->status & KBD_RAW_MODE)
- return dt;
+ return val;
+
+ code = val & 0x7F;
+ release = val & 0x80;
/* Check for cntl-alt-del */
- if ((dt == 83) && ctls && alts)
+ if ((code == 83) && ctls && alts)
cpu_reset();
-
#if NDDB > 0
/* Check for cntl-alt-esc */
- if ((dt == 1) && ctls && alts) {
+ if ((val == 1) && ctls && alts) {
/* if debugger called, try to switch to console 0 */
if (cur_scr_stat->smode.mode == VT_AUTO &&
cons_scr_stat[0].smode.mode == VT_AUTO)
switch_scr(0);
Debugger();
+ return(0x100);
}
#endif
- if (dt == 0xE0 || dt == 0xE1) {
- esc_flag = dt;
- goto next_code;
- }
-
- if ((dt & 0x7F) >= key_map.n_keys)
- goto next_code;
-
- if (esc_flag == 0xE0) {
- switch (dt & 0x7F) {
- case 0x2A: /* This may come because the keyboard keeps */
- case 0x36: /* its own caps lock status, we ignore SOS */
- goto next_code;
- /* NOT REACHED */
- case 0x1C: /* keypad enter key */
- modifier = 0x59;
+ switch (esc_flag) {
+ case 0x00: /* normal scancode */
+ switch(code) {
+ case 0x38: /* left alt (compose key) */
+ if (release && compose) {
+ compose = 0;
+ if (chr > 255) {
+ sysbeep(500, hz/4);
+ chr = 0;
+ }
+ }
+ else {
+ if (!compose) {
+ compose = 1;
+ chr = 0;
+ }
+ }
break;
- case 0x1D: /* right control key */
- modifier = 0x5a;
+ case 0x60:
+ case 0x61:
+ esc_flag = code;
+ goto next_code;
+ }
+ break;
+ case 0x60: /* 0xE0 prefix */
+ esc_flag = 0;
+ switch (code) {
+ case 0x1d: /* right ctrl key */
break;
case 0x35: /* keypad divide key */
- modifier = 0x5b;
+ code = 0x5b;
break;
case 0x37: /* print scrn key */
- modifier = 0x5c;
+ code = 0x5c;
break;
case 0x38: /* right alt key (alt gr) */
- modifier = 0x5d;
+ code = 0x5d;
break;
case 0x47: /* grey home key */
- modifier = 0x5e;
+ code = 0x5e;
break;
case 0x48: /* grey up arrow key */
- modifier = 0x5f;
+ code = 0x5f;
break;
case 0x49: /* grey page up key */
- modifier = 0x60;
+ code = 0x60;
break;
case 0x4b: /* grey left arrow key */
- modifier = 0x61;
+ code = 0x61;
break;
case 0x4d: /* grey right arrow key */
- modifier = 0x62;
+ code = 0x62;
break;
case 0x4f: /* grey end key */
- modifier = 0x63;
+ code = 0x63;
break;
case 0x50: /* grey down arrow key */
- modifier = 0x64;
+ code = 0x64;
break;
case 0x51: /* grey page down key */
- modifier = 0x65;
+ code = 0x65;
break;
case 0x52: /* grey insert key */
- modifier = 0x66;
+ code = 0x66;
break;
case 0x53: /* grey delete key */
- modifier = 0x67;
+ code = 0x67;
break;
- default: /* every thing else is ignored */
+ default: /* ignore everything else */
goto next_code;
- /* NOT REACHED */
}
- dt = (dt & 0x80) | modifier;
- }
- else if (esc_flag == (u_char)0xE1 && ((dt & 0x7F) == 0x1D)) {
- esc_flag = 0x1D;
+ break;
+ case 0x61: /* 0xE1 prefix */
+ esc_flag = 0;
+ if (code == 0x1D)
+ esc_flag = 0x1D;
goto next_code;
+ /* NOT REACHED */
+ case 0x1D: /* pause / break */
+ esc_flag = 0;
+ if (code != 0x45)
+ goto next_code;
+ code = 0x68;
+ break;
}
- else if (esc_flag == 0x1D && ((dt & 0x7F) == 0x45))
- dt = (dt & 0x80) | 0x68;
- esc_flag = 0;
+ if (compose) {
+ switch (code) {
+ case 0x47:
+ case 0x48: /* keypad 7,8,9 */
+ case 0x49:
+ if (!release)
+ chr = (code - 0x40) + chr*10;
+ goto next_code;
+ case 0x4b:
+ case 0x4c: /* keypad 4,5,6 */
+ case 0x4d:
+ if (!release)
+ chr = (code - 0x47) + chr*10;
+ goto next_code;
+ case 0x4f:
+ case 0x50: /* keypad 1,2,3 */
+ case 0x51:
+ if (!release)
+ chr = (code - 0x4e) + chr*10;
+ goto next_code;
+ case 0x52: /* keypad 0 */
+ if (!release)
+ chr *= 10;
+ goto next_code;
+ case 0x38: /* left alt key */
+ break;
+ default:
+ if (chr) {
+ compose = chr = 0;
+ sysbeep(500, hz/4);
+ goto next_code;
+ }
+ break;
+ }
+ }
+
state = (shfts ? 1 : 0 ) | (2 * (ctls ? 1 : 0)) | (4 * (alts ? 1 : 0));
- key = &key_map.key[dt & 0x7F];
+ if ((!agrs && (cur_scr_stat->status & ALKED))
+ || (agrs && !(cur_scr_stat->status & ALKED)))
+ code += ALTGR_OFFSET;
+ key = &key_map.key[code];
if ( ((key->flgs & FLAG_LOCK_C) && (cur_scr_stat->status & CLKED))
|| ((key->flgs & FLAG_LOCK_N) && (cur_scr_stat->status & NLKED)) )
state ^= 1;
/* Check for make/break */
action = key->map[state];
- if (dt & 0x80) {
- /* break */
+ if (release) { /* key released */
if (key->spcl & 0x80) {
switch (action) {
case LSH:
@@ -1872,37 +2083,72 @@ next_code:
case RALT:
alts &= ~2;
break;
+ case NLK:
+ nlkcnt = 0;
+ break;
+ case CLK:
+ clkcnt = 0;
+ break;
+ case SLK:
+ slkcnt = 0;
+ break;
+ case ASH:
+ agrs = 0;
+ break;
}
}
+ if (chr && !compose) {
+ action = chr;
+ chr = 0;
+ return (action);
+ }
} else {
- /* make */
+ /* key pressed */
if (key->spcl & (0x80>>state)) {
switch (action) {
/* LOCKING KEYS */
case NLK:
- if (cur_scr_stat->status & NLKED)
- cur_scr_stat->status &= ~NLKED;
- else
- cur_scr_stat->status |= NLKED;
- update_leds(cur_scr_stat->status&LOCK_KEY_MASK);
+ if (!nlkcnt) {
+ nlkcnt++;
+ if (cur_scr_stat->status & NLKED)
+ cur_scr_stat->status &= ~NLKED;
+ else
+ cur_scr_stat->status |= NLKED;
+ update_leds(cur_scr_stat->status & LED_MASK);
+ }
break;
case CLK:
- if (cur_scr_stat->status & CLKED)
- cur_scr_stat->status &= ~CLKED;
- else
- cur_scr_stat->status |= CLKED;
- update_leds(cur_scr_stat->status&LOCK_KEY_MASK);
+ if (!clkcnt) {
+ clkcnt++;
+ if (cur_scr_stat->status & CLKED)
+ cur_scr_stat->status &= ~CLKED;
+ else
+ cur_scr_stat->status |= CLKED;
+ update_leds(cur_scr_stat->status & LED_MASK);
+ }
break;
case SLK:
- if (cur_scr_stat->status & SLKED) {
- cur_scr_stat->status &= ~SLKED;
- pcstart(&pccons[get_scr_num(cur_scr_stat)]);
- }
- else
- cur_scr_stat->status |= SLKED;
- update_leds(cur_scr_stat->status&LOCK_KEY_MASK);
+ if (!slkcnt) {
+ slkcnt++;
+ if (cur_scr_stat->status & SLKED) {
+ cur_scr_stat->status &= ~SLKED;
+ pcstart(&pccons[get_scr_num(cur_scr_stat)]);
+ }
+ else
+ cur_scr_stat->status |= SLKED;
+ update_leds(cur_scr_stat->status & LED_MASK);
+ }
break;
-
+ case ALK:
+ if (!alkcnt) {
+ alkcnt++;
+ if (cur_scr_stat->status & ALKED)
+ cur_scr_stat->status &= ~ALKED;
+ else
+ cur_scr_stat->status |= ALKED;
+ }
+ break;
+
/* NON-LOCKING KEYS */
case LSH:
shfts |= 1;
@@ -1922,6 +2168,11 @@ next_code:
case RALT:
alts |= 2;
break;
+ case ASH:
+ agrs = 1;
+ break;
+ case NOP:
+ break;
default:
if (action >= F_SCR && action <= L_SCR) {
switch_scr(action - F_SCR);
@@ -1938,54 +2189,44 @@ next_code:
goto next_code;
}
-/* -hv- 22-Apr-93: to make init_main more portable */
-void cons_highlight(void)
+/* July '93, jkh. Added in for init_main.c */
+void cons_highlight()
{
- scr_stat *scp = &cons_scr_stat[0];
-
- scp->attr &= 0xFF00;
- scp->attr |= 0x0800;
+ cons_scr_stat[0].term.attr &= 0xFF00;
+ cons_scr_stat[0].term.attr |= 0x0800;
}
-void cons_normal(void)
+void cons_normal()
{
- scr_stat *scp = &cons_scr_stat[0];
-
- scp->attr = scp->std_attr;
+ cons_scr_stat[0].term.attr = cons_scr_stat[0].term.std_attr;
}
int getchar(void)
{
char thechar;
- int delay, x;
+ int s;
pcconsoftc.cs_flags |= CSF_POLLING;
- x = splhigh();
- sput('>', FG_RED | BG_BLACK);
+ s = splhigh();
+ sput('>');
thechar = (char) sgetc(0);
pcconsoftc.cs_flags &= ~CSF_POLLING;
- splx(x);
+ splx(s);
switch (thechar) {
default:
- if (thechar >= ' ')
- sput(thechar, FG_RED | BG_BLACK);
+ if (thechar >= scr_map[0x20])
+ sput(thechar);
return(thechar);
case cr:
case lf:
- sput(cr, FG_RED | BG_BLACK);
- sput(lf, FG_RED | BG_BLACK);
+ sput(cr); sput(lf);
return(lf);
case bs:
case del:
- sput(bs, FG_RED | BG_BLACK);
- sput(' ', FG_RED | BG_BLACK);
- sput(bs, FG_RED | BG_BLACK);
+ sput(bs); sput(scr_map[0x20]); sput(bs);
return(thechar);
case cntld:
- sput('^', FG_RED | BG_BLACK) ;
- sput('D', FG_RED | BG_BLACK) ;
- sput('\r', FG_RED | BG_BLACK) ;
- sput('\n', FG_RED | BG_BLACK) ;
+ sput('^'); sput('D'); sput('\r'); sput('\n');
return(0);
}
}
@@ -2018,11 +2259,25 @@ static void kbd_cmd(u_char command)
static void set_mode(scr_stat *scp)
{
u_char byte;
+ int s;
if (scp != cur_scr_stat)
return;
+ /* (re)activate cursor */
+ untimeout(cursor_pos, 0);
+ cursor_pos();
+
+ /* change cursor type if set */
+ if (scp->cursor_start != -1 && scp->cursor_end != -1)
+ cursor_shape(scp->cursor_start, scp->cursor_end);
+
+ /* mode change only on VGA's */
+ if (!crtc_vga)
+ return;
+
/* setup video hardware for the given mode */
+ s = splhigh();
switch(scp->mode) {
case TEXT80x25:
outb(crtc_addr, 9); byte = inb(crtc_addr+1);
@@ -2037,13 +2292,11 @@ static void set_mode(scr_stat *scp)
default:
return;
}
+ splx(s);
/* set border color for this (virtual) console */
set_border(scp->border);
-
- /* (re)activate cursor */
- untimeout(cursor_pos, 0);
- cursor_pos();
+ return;
}
@@ -2057,13 +2310,14 @@ static void set_border(int color)
static load_font(int segment, int size, char* font)
{
- int ch, line;
+ int ch, line, s;
u_char val;
outb(TSIDX, 0x01); val = inb(TSREG); /* blank screen */
outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
/* setup vga for loading fonts (graphics plane mode) */
+ s = splhigh();
inb(crtc_addr+6); /* reset flip/flop */
outb(ATC, 0x30); outb(ATC, 0x01);
outb(TSIDX, 0x02); outb(TSREG, 0x04);
@@ -2071,11 +2325,13 @@ static load_font(int segment, int size, char* font)
outb(GDCIDX, 0x04); outb(GDCREG, 0x02);
outb(GDCIDX, 0x05); outb(GDCREG, 0x00);
outb(GDCIDX, 0x06); outb(GDCREG, 0x05); /* addr = a0000, 64kb */
+ splx(s);
for (ch=0; ch < 256; ch++)
for (line=0; line < size; line++)
*((char *)atdevbase+(segment*0x4000)+(ch*32)+line) =
font[(ch*size)+line];
/* setup vga for text mode again */
+ s = splhigh();
inb(crtc_addr+6); /* reset flip/flop */
outb(ATC, 0x30); outb(ATC, 0x0C);
outb(TSIDX, 0x02); outb(TSREG, 0x03);
@@ -2088,6 +2344,7 @@ static load_font(int segment, int size, char* font)
else {
outb(GDCIDX, 0x06); outb(GDCREG, 0x0E); /* addr = b8000, 32kb */
}
+ splx(s);
outb(TSIDX, 0x01); val = inb(TSREG); /* unblank screen */
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
}
OpenPOWER on IntegriCloud