summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/alpha/include/console.h107
-rw-r--r--sys/amd64/amd64/locore.S24
-rw-r--r--sys/amd64/amd64/locore.s24
-rw-r--r--sys/dev/syscons/syscons.c438
-rw-r--r--sys/i386/i386/locore.s24
-rw-r--r--sys/i386/include/console.h107
-rw-r--r--sys/i386/isa/syscons.c438
-rw-r--r--sys/isa/syscons.c438
8 files changed, 1002 insertions, 598 deletions
diff --git a/sys/alpha/include/console.h b/sys/alpha/include/console.h
index 57f4d0b..bb220c6 100644
--- a/sys/alpha/include/console.h
+++ b/sys/alpha/include/console.h
@@ -1,20 +1,30 @@
-/*
- * Copyright (C) 1992, 1993, 1994 Søren Schmidt
+/*-
+ * Copyright (c) 1991-1994 Søren Schmidt
+ * All rights reserved.
*
- * This program is free software; you may redistribute it and/or
- * modify it, provided that it retain the above copyright notice
- * and the following disclaimer.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software withough specific prior written permission
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * Søren Schmidt Email: sos@login.dkuug.dk
- * Tritonvej 36 UUCP: ...uunet!dkuug!login!sos
- * DK9210 Aalborg SO Phone: +45 9814 8076
- *
- * from:@(#)console.h 1.1 940105
- * $Id: console.h,v 1.1 1994/07/03 20:49:53 sos Exp $
+ * $Id$
*/
#ifndef _CONSOLE_H_
@@ -228,4 +238,73 @@ typedef struct ssaver ssaver_t;
#define KB_RESEND 0xFE /* kbd resend cmd answer */
#define KB_RESET 0xFF /* kbd reset */
+/* video mode definitions */
+#define M_B40x25 0 /* black & white 40 columns */
+#define M_C40x25 1 /* color 40 columns */
+#define M_B80x25 2 /* black & white 80 columns */
+#define M_C80x25 3 /* color 80 columns */
+#define M_BG320 4 /* black & white graphics 320x200 */
+#define M_CG320 5 /* color graphics 320x200 */
+#define M_BG640 6 /* black & white graphics 640x200 hi-res */
+#define M_EGAMONO80x25 7 /* ega-mono 80x25 */
+#define M_CG320_D 13 /* ega mode D */
+#define M_CG640_E 14 /* ega mode E */
+#define M_EGAMONOAPA 15 /* ega mode F */
+#define M_CG640x350 16 /* ega mode 10 */
+#define M_ENHMONOAPA2 17 /* ega mode F with extended memory */
+#define M_ENH_CG640 18 /* ega mode 10* */
+#define M_ENH_B40x25 19 /* ega enhanced black & white 40 columns */
+#define M_ENH_C40x25 20 /* ega enhanced color 40 columns */
+#define M_ENH_B80x25 21 /* ega enhanced black & white 80 columns */
+#define M_ENH_C80x25 22 /* ega enhanced color 80 columns */
+#define M_VGA_C40x25 23 /* vga 8x16 font on color */
+#define M_VGA_C80x25 24 /* vga 8x16 font on color */
+#define M_VGA_C80x50 30 /* vga 8x8 font on color */
+#define M_VGA_M80x25 25 /* vga 8x16 font on mono */
+#define M_VGA_M80x50 31 /* vga 8x8 font on color */
+#define M_VGA11 26 /* vga 640x480 2 colors */
+#define M_BG640x480 26
+#define M_VGA12 27 /* vga 640x480 16 colors */
+#define M_CG640x480 27
+#define M_VGA13 28 /* vga 640x200 256 colors */
+#define M_VGA_CG320 28
+#define M_ENH_B80x43 0x70 /* ega black & white 80x43 */
+#define M_ENH_C80x43 0x71 /* ega color 80x43 */
+#define M_HGC_P0 0xe0 /* hercules graphics - page 0 @ B0000 */
+#define M_HGC_P1 0xe1 /* hercules graphics - page 1 @ B8000 */
+#define M_MCA_MODE 0xff /* monochrome adapter mode */
+
+#define SW_B40x25 _IO('S', M_B40x25)
+#define SW_C40x25 _IO('S', M_C40x25)
+#define SW_B80x25 _IO('S', M_B80x25)
+#define SW_C80x25 _IO('S', M_C80x25)
+#define SW_BG320 _IO('S', M_BG320)
+#define SW_CG320 _IO('S', M_CG320)
+#define SW_BG640 _IO('S', M_BG640)
+#define SW_EGAMONO80x25 _IO('S', M_EGAMONO80x25)
+#define SW_CG320_D _IO('S', M_CG320_D)
+#define SW_CG640_E _IO('S', M_CG640_E)
+#define SW_EGAMONOAPA _IO('S', M_EGAMONOAPA)
+#define SW_CG640x350 _IO('S', M_CG640x350)
+#define SW_ENH_MONOAPA2 _IO('S', M_ENHMONOAPA2)
+#define SW_ENH_CG640 _IO('S', M_ENH_CG640)
+#define SW_ENH_B40x25 _IO('S', M_ENH_B40x25)
+#define SW_ENH_C40x25 _IO('S', M_ENH_C40x25)
+#define SW_ENH_B80x25 _IO('S', M_ENH_B80x25)
+#define SW_ENH_C80x25 _IO('S', M_ENH_C80x25)
+#define SW_ENH_B80x43 _IO('S', M_ENH_B80x43)
+#define SW_ENH_C80x43 _IO('S', M_ENH_C80x43)
+#define SW_MCAMODE _IO('S', M_MCA_MODE)
+#define SW_VGA_C40x25 _IO('S', M_VGA_C40x25)
+#define SW_VGA_C80x25 _IO('S', M_VGA_C80x25)
+#define SW_VGA_C80x50 _IO('S', M_VGA_C80x50)
+#define SW_VGA_M80x25 _IO('S', M_VGA_M80x25)
+#define SW_VGA_M80x50 _IO('S', M_VGA_M80x50)
+#define SW_VGA11 _IO('S', M_VGA11)
+#define SW_BG640x480 _IO('S', M_VGA11)
+#define SW_VGA12 _IO('S', M_VGA12)
+#define SW_CG640x480 _IO('S', M_VGA12)
+#define SW_VGA13 _IO('S', M_VGA13)
+#define SW_VGA_CG320 _IO('S', M_VGA13)
+
#endif
diff --git a/sys/amd64/amd64/locore.S b/sys/amd64/amd64/locore.S
index 15b90dd..f804d18 100644
--- a/sys/amd64/amd64/locore.S
+++ b/sys/amd64/amd64/locore.S
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
- * $Id: locore.s,v 1.26 1994/09/05 14:09:41 bde Exp $
+ * $Id: locore.s,v 1.27 1994/09/12 11:38:06 davidg Exp $
*/
/*
@@ -102,9 +102,13 @@ _esym: .long 0 /* ptr to end of syms */
.globl _boothowto,_bootdev,_curpcb
.globl _cpu,_cold,_atdevbase,_cpu_vendor,_cpu_id
+
+ .globl _video_mode_ptr
+
_cpu: .long 0 /* are we 386, 386sx, or 486 */
_cpu_id: .long 0 /* stepping ID */
_cpu_vendor: .space 20 /* CPU origin code */
+_video_mode_ptr: .long 0
_cold: .long 1 /* cold till we are not */
_atdevbase: .long 0 /* location of start of iomem in virtual */
_atdevphys: .long 0 /* location of device mapping ptes (phys) */
@@ -165,6 +169,24 @@ NON_GPROF_ENTRY(btext)
movl 16(%esp),%eax
addl $KERNBASE,%eax
movl %eax,_esym-KERNBASE
+
+ /* get the BIOS video mode pointer */
+ movl $0x4a8, %ecx
+ movl (%ecx), %eax
+ movl %eax, %ecx
+ shrl $12, %ecx
+ andl $0xffff0000, %ecx
+ andl $0x0000ffff, %eax
+ orl %ecx, %eax
+ movl (%eax), %eax
+ movl %eax, %ecx
+ shrl $12, %ecx
+ andl $0xffff0000, %ecx
+ andl $0x0000ffff, %eax
+ orl %ecx, %eax
+ addl $KERNBASE, %eax
+ movl %eax, _video_mode_ptr-KERNBASE
+
#ifdef DISKLESS /* Copy diskless structure */
movl _nfs_diskless_size-KERNBASE,%ecx
movl 20(%esp),%esi
diff --git a/sys/amd64/amd64/locore.s b/sys/amd64/amd64/locore.s
index 15b90dd..f804d18 100644
--- a/sys/amd64/amd64/locore.s
+++ b/sys/amd64/amd64/locore.s
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
- * $Id: locore.s,v 1.26 1994/09/05 14:09:41 bde Exp $
+ * $Id: locore.s,v 1.27 1994/09/12 11:38:06 davidg Exp $
*/
/*
@@ -102,9 +102,13 @@ _esym: .long 0 /* ptr to end of syms */
.globl _boothowto,_bootdev,_curpcb
.globl _cpu,_cold,_atdevbase,_cpu_vendor,_cpu_id
+
+ .globl _video_mode_ptr
+
_cpu: .long 0 /* are we 386, 386sx, or 486 */
_cpu_id: .long 0 /* stepping ID */
_cpu_vendor: .space 20 /* CPU origin code */
+_video_mode_ptr: .long 0
_cold: .long 1 /* cold till we are not */
_atdevbase: .long 0 /* location of start of iomem in virtual */
_atdevphys: .long 0 /* location of device mapping ptes (phys) */
@@ -165,6 +169,24 @@ NON_GPROF_ENTRY(btext)
movl 16(%esp),%eax
addl $KERNBASE,%eax
movl %eax,_esym-KERNBASE
+
+ /* get the BIOS video mode pointer */
+ movl $0x4a8, %ecx
+ movl (%ecx), %eax
+ movl %eax, %ecx
+ shrl $12, %ecx
+ andl $0xffff0000, %ecx
+ andl $0x0000ffff, %eax
+ orl %ecx, %eax
+ movl (%eax), %eax
+ movl %eax, %ecx
+ shrl $12, %ecx
+ andl $0xffff0000, %ecx
+ andl $0x0000ffff, %eax
+ orl %ecx, %eax
+ addl $KERNBASE, %eax
+ movl %eax, _video_mode_ptr-KERNBASE
+
#ifdef DISKLESS /* Copy diskless structure */
movl _nfs_diskless_size-KERNBASE,%ecx
movl 20(%esp),%esi
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index 59720db..9a79895 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -34,7 +34,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: syscons.c,v 1.52 1994/08/20 03:48:42 davidg Exp $
+ * $Id: syscons.c,v 1.53 1994/08/27 16:14:20 davidg Exp $
*/
#include "sc.h"
@@ -85,8 +85,6 @@
/* misc defines */
#define MAX_ESC_PAR 5
-#define TEXT80x25 1
-#define TEXT80x50 2
#define LOAD 1
#define SAVE 0
#define COL 80
@@ -103,6 +101,7 @@
/* defines related to hardware addresses */
#define MONO_BASE 0x3B4 /* crt controller base mono */
#define COLOR_BASE 0x3D4 /* crt controller base color */
+#define MISC 0x3C2 /* misc output register */
#define ATC IO_VGA+0x00 /* attribute controller */
#define TSIDX IO_VGA+0x04 /* timing sequencer idx */
#define TSREG IO_VGA+0x05 /* timing sequencer data */
@@ -240,10 +239,10 @@ static void kbd_wait(void);
static void kbd_cmd(u_char command);
static void set_mode(scr_stat *scp);
static void set_border(int color);
+static void set_vgaregs(char *modetable);
static void copy_font(int direction, int segment, int size, char* font);
static void save_palette(void);
static void load_palette(void);
-static void change_winsize(struct tty *tp, int x, int y);
/* available screen savers */
static void none_saver(int test);
@@ -251,6 +250,7 @@ static void blank_saver(int test);
static void fade_saver(int test);
static void star_saver(int test);
static void snake_saver(int test);
+static void green_saver(int test);
static const struct {
char *name;
@@ -261,6 +261,7 @@ static const struct {
{ "fade", fade_saver }, /* 2 */
{ "star", star_saver }, /* 3 */
{ "snake", snake_saver }, /* 4 */
+ { "green", green_saver }, /* 5 */
};
#define SCRN_SAVER(arg) (*screen_savers[scrn_saver].routine)(arg)
#define NUM_SCRN_SAVERS (sizeof(screen_savers) / sizeof(screen_savers[0]))
@@ -280,12 +281,12 @@ struct tty pccons[NCONS+1];
#define CGA_BUF (KERNBASE+0xB8000)
u_short *Crtat = (u_short *)MONO_BUF;
void consinit(void) {scinit();}
+extern char *video_mode_ptr;
struct isa_driver scdriver = {
pcprobe, pcattach, "sc",
};
-
int
pcprobe(struct isa_device *dev)
{
@@ -334,12 +335,11 @@ gotack:
return (IO_KBDSIZE);
}
-
int
pcattach(struct isa_device *dev)
{
- scr_stat *scp;
- int start = -1, end = -1, i;
+ int i;
+ struct scr_stat *scp;
printf("sc%d: ", dev->id_unit);
if (crtc_vga)
@@ -352,19 +352,11 @@ pcattach(struct isa_device *dev)
printf("MDA/hercules");
else
printf("CGA/EGA");
-
if (NCONS > 1)
printf(" <%d virtual consoles>\n", NCONS);
else
printf("\n");
-#if defined(FAT_CURSOR)
- start = 0;
- end = 18;
- if (crtc_vga) {
-#else
if (crtc_vga) {
- get_cursor_shape(&start, &end);
-#endif
#if !defined(NO_HARDFONTS)
font_8 = font_8x8;
font_14 = font_8x14;
@@ -382,44 +374,20 @@ pcattach(struct isa_device *dev)
#endif
save_palette();
}
- current_default = &user_default;
for (i = 0; i < NCONS; i++) {
scp = &console[i];
- scp->scr_buf = (u_short *)malloc(COL * ROW * 2,
- M_DEVBUF, M_NOWAIT);
- 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.cur_attr = scp->term.std_attr;
- scp->border = BG_BLACK;
- scp->cursor_start = start;
- scp->cursor_end = end;
- scp->xsize = COL;
- scp->ysize = ROW;
- scp->bell_pitch = BELL_PITCH;
- scp->bell_duration = BELL_DURATION;
- scp->status = NLKED;
- scp->pid = 0;
- scp->proc = NULL;
- scp->smode.mode = VT_AUTO;
+ scp->scr_buf = (u_short *)malloc(COL*ROW*2, M_DEVBUF, M_NOWAIT);
if (i > 0) {
scp->crt_base = scp->crtat = scp->scr_buf;
- fillw(scp->term.cur_attr|scr_map[0x20],
- scp->scr_buf, COL*ROW);
+ clear_screen(scp);
}
}
/* get cursor going */
-#if defined(FAT_CURSOR)
- cursor_shape(console[0].cursor_start,
- console[0].cursor_end);
-#endif
cursor_pos(1);
update_leds(console[0].status);
return 0;
}
-
static struct tty
*get_tty_ptr(dev_t dev)
{
@@ -432,7 +400,6 @@ static struct tty
return(VIRTUAL_TTY(unit));
}
-
static scr_stat
*get_scr_stat(dev_t dev)
{
@@ -445,7 +412,6 @@ static scr_stat
return(&console[unit]);
}
-
static int
get_scr_num()
{
@@ -455,7 +421,6 @@ get_scr_num()
return i < NCONS ? i : 0;
}
-
int
pcopen(dev_t dev, int flag, int mode, struct proc *p)
{
@@ -483,7 +448,6 @@ pcopen(dev_t dev, int flag, int mode, struct proc *p)
return((*linesw[tp->t_line].l_open)(dev, tp));
}
-
int
pcclose(dev_t dev, int flag, int mode, struct proc *p)
{
@@ -505,7 +469,6 @@ pcclose(dev_t dev, int flag, int mode, struct proc *p)
return(0);
}
-
int
pcread(dev_t dev, struct uio *uio, int flag)
{
@@ -516,7 +479,6 @@ pcread(dev_t dev, struct uio *uio, int flag)
return((*linesw[tp->t_line].l_read)(tp, uio, flag));
}
-
int
pcwrite(dev_t dev, struct uio *uio, int flag)
{
@@ -527,7 +489,6 @@ pcwrite(dev_t dev, struct uio *uio, int flag)
return((*linesw[tp->t_line].l_write)(tp, uio, flag));
}
-
void
scintr(int unit)
{
@@ -569,7 +530,6 @@ scintr(int unit)
}
}
-
int
pcparam(struct tty *tp, struct termios *t)
{
@@ -582,7 +542,6 @@ pcparam(struct tty *tp, struct termios *t)
return 0;
}
-
int
pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
{
@@ -601,62 +560,81 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
case CONS_BLANKTIME: /* set screen saver timeout (0 = no saver) */
scrn_blank_time = *(int*)data;
return 0;
+
+#define SAVER(p) ((ssaver_t *)(p))
case CONS_SSAVER: /* set screen saver */
- {
- register ssaver_t *sav = (ssaver_t *)data;
- if (sav->num < 0 || sav->num >= NUM_SCRN_SAVERS)
+ if (SAVER(data)->num < 0
+ || SAVER(data)->num >= NUM_SCRN_SAVERS)
return EIO;
SCRN_SAVER(0);
- scrn_saver = sav->num;
- scrn_blank_time = sav->time;
+ scrn_saver = SAVER(data)->num;
+ scrn_blank_time = SAVER(data)->time;
return 0;
- }
+
case CONS_GSAVER: /* get screen saver info */
- {
- register ssaver_t *sav = (ssaver_t *)data;
- if (sav->num < 0)
- sav->num = scrn_saver;
- else if (sav->num >= NUM_SCRN_SAVERS)
+ if (SAVER(data)->num < 0)
+ SAVER(data)->num = scrn_saver;
+ else if (SAVER(data)->num >= NUM_SCRN_SAVERS)
return EIO;
- sav->time = scrn_blank_time;
- strcpy(sav->name, screen_savers[sav->num].name);
+ SAVER(data)->time = scrn_blank_time;
+ strcpy(SAVER(data)->name, screen_savers[SAVER(data)->num].name);
return 0;
+
+ case SW_VGA_C40x25: case SW_VGA_C80x25: /* VGA TEXT MODES */
+ case SW_VGA_M80x25:
+ case SW_VGA_C80x50: case SW_VGA_M80x50:
+ case SW_B40x25: case SW_C40x25:
+ case SW_B80x25: case SW_C80x25:
+ case SW_ENH_B40x25: case SW_ENH_C40x25:
+ case SW_ENH_B80x25: case SW_ENH_C80x25:
+ case SW_ENH_B80x43: case SW_ENH_C80x43:
+
+ if (!crtc_vga)
+ return ENXIO;
+ scp->mode = cmd & 0xFF;
+ scp->status &= ~UNKNOWN_MODE; /* text mode */
+ if (scp->mode < M_VGA_C80x50) {
+ scp->xsize = *(video_mode_ptr + (scp->mode*64));
+ scp->ysize = *(video_mode_ptr + (scp->mode*64) + 1) + 1;
+ }
+ else switch (scp->mode) {
+ case M_VGA_C80x50: case M_VGA_M80x50:
+ scp->xsize = 80;
+ scp->ysize = 50;
+ break;
+ case M_ENH_B80x43: case M_ENH_C80x43:
+ scp->xsize = 80;
+ scp->ysize = 43;
+ break;
}
- case CONS_80x25TEXT: /* set 80x25 text mode */
- if (!crtc_vga)
- return ENXIO;
- scp->mode = TEXT80x25;
- scp->ysize = 25;
free(scp->scr_buf, M_DEVBUF);
- scp->scr_buf = (u_short *)malloc(scp->xsize*scp->ysize*2,
+ scp->scr_buf = (u_short *)malloc(scp->xsize * scp->ysize * 2,
M_DEVBUF, M_NOWAIT);
- if (scp != cur_console)
+ if (scp == cur_console)
+ set_mode(scp);
+ else
scp->crt_base = scp->scr_buf;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->xsize, scp->ysize);
- return 0;
-
- case CONS_80x50TEXT: /* set 80x50 text mode */
- if (!crtc_vga)
- return ENXIO;
- /* is there a 8x8 font loaded ? */
- if (fonts_loaded & FONT_8_LOADED) {
- scp->mode = TEXT80x50;
- scp->ysize = 50;
- free(scp->scr_buf, M_DEVBUF);
- scp->scr_buf =
- (u_short *)malloc(scp->xsize * scp->ysize * 2,
- M_DEVBUF, M_NOWAIT);
- if (scp != cur_console)
- scp->crt_base = scp->scr_buf;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->xsize, scp->ysize);
- return 0;
+ clear_screen(scp);
+ if (tp->t_winsize.ws_col != scp->xsize
+ || tp->t_winsize.ws_row != scp->ysize) {
+ tp->t_winsize.ws_col = scp->xsize;
+ tp->t_winsize.ws_row = scp->ysize;
+ pgsignal(tp->t_pgrp, SIGWINCH, 1);
}
- else
- return EINVAL;
+ return 0;
+
+ /* GRAPHICS MODES */
+ case SW_BG320: case SW_CG320: case SW_BG640:
+ case SW_CG320_D: case SW_CG640_E:
+ case SW_CG640x350: case SW_ENH_CG640:
+ case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320:
+
+ scp->mode = cmd & 0xFF;
+ scp->status |= UNKNOWN_MODE; /* graphics mode */
+ if (scp == cur_console)
+ set_mode(scp);
+ /* clear_graphics();*/
+ return 0;
case CONS_GETVERS: /* get version number */
*(int*)data = 0x103; /* version 1.3 */
@@ -1054,7 +1032,6 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return(ENOTTY);
}
-
void
pcxint(dev_t dev)
{
@@ -1069,7 +1046,6 @@ pcxint(dev_t dev)
pcstart(tp);
}
-
void
pcstart(struct tty *tp)
{
@@ -1109,7 +1085,6 @@ pcstart(struct tty *tp)
splx(s);
}
-
void
pccnprobe(struct consdev *cp)
{
@@ -1125,14 +1100,12 @@ pccnprobe(struct consdev *cp)
cp->cn_pri = CN_INTERNAL;
}
-
void
pccninit(struct consdev *cp)
{
scinit();
}
-
void
pccnputc(dev_t dev, char c)
{
@@ -1151,7 +1124,6 @@ pccnputc(dev_t dev, char c)
}
}
-
int
pccngetc(dev_t dev)
{
@@ -1162,13 +1134,11 @@ pccngetc(dev_t dev)
return(c);
}
-
static void
none_saver(int test)
{
}
-
static void
fade_saver(int test)
{
@@ -1200,7 +1170,6 @@ fade_saver(int test)
}
}
-
static void
blank_saver(int test)
{
@@ -1217,6 +1186,26 @@ blank_saver(int test)
}
}
+static void
+green_saver(int test)
+{
+ u_char val;
+ if (test) {
+ scrn_blanked = 1;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
+ outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
+ outb(crtc_addr + 1, val & ~0x80);
+ }
+ else {
+ scrn_blanked = 0;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
+ outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
+ outb(crtc_addr + 1, val | 0x80);
+ }
+}
+
#define NUM_STARS 50
/*
@@ -1271,7 +1260,6 @@ star_saver(int test)
}
}
-
static void
snake_saver(int test)
{
@@ -1332,7 +1320,6 @@ snake_saver(int test)
}
}
-
static void
cursor_shape(int start, int end)
{
@@ -1342,7 +1329,6 @@ cursor_shape(int start, int end)
outb(crtc_addr+1, end & 0xFF);
}
-
#if !defined(FAT_CURSOR)
static void
get_cursor_shape(int *start, int *end)
@@ -1354,7 +1340,6 @@ get_cursor_shape(int *start, int *end)
}
#endif
-
static void
cursor_pos(int force)
{
@@ -1375,7 +1360,6 @@ cursor_pos(int force)
timeout((timeout_t)cursor_pos, 0, hz/20);
}
-
static void
clear_screen(scr_stat *scp)
{
@@ -1384,7 +1368,6 @@ clear_screen(scr_stat *scp)
scp->xsize * scp->ysize);
}
-
static int
switch_scr(u_int next_scr)
{
@@ -1392,7 +1375,9 @@ switch_scr(u_int next_scr)
(cur_console->proc != pfind(cur_console->pid)))
switch_in_progress = 0;
- if (next_scr >= NCONS || switch_in_progress) {
+ if (next_scr >= NCONS || switch_in_progress
+ || (cur_console->smode.mode == VT_AUTO
+ && cur_console->status & UNKNOWN_MODE)) {
sysbeep(BELL_PITCH, BELL_DURATION);
return EINVAL;
}
@@ -1441,7 +1426,6 @@ switch_scr(u_int next_scr)
return 0;
}
-
static void
exchange_scr(void)
{
@@ -1451,7 +1435,8 @@ exchange_scr(void)
old_scp->crt_base = old_scp->scr_buf;
move_crsr(old_scp, old_scp->xpos, old_scp->ypos);
cur_console = new_scp;
- set_mode(new_scp);
+ if (old_scp->mode != new_scp->mode)
+ set_mode(new_scp);
new_scp->crt_base = Crtat;
move_crsr(new_scp, new_scp->xpos, new_scp->ypos);
bcopy(new_scp->scr_buf, Crtat, new_scp->xsize * new_scp->ysize * 2);
@@ -1467,7 +1452,6 @@ exchange_scr(void)
delayed_next_scr = 0;
}
-
static void
move_crsr(scr_stat *scp, int x, int y)
{
@@ -1478,7 +1462,6 @@ move_crsr(scr_stat *scp, int x, int y)
scp->crtat = scp->crt_base + scp->ypos * scp->xsize + scp->xpos;
}
-
static void
move_up(u_short *s, u_short *d, u_int len)
{
@@ -1488,7 +1471,6 @@ move_up(u_short *s, u_short *d, u_int len)
*--d = *--s;
}
-
static void
move_down(u_short *s, u_short *d, u_int len)
{
@@ -1496,7 +1478,6 @@ move_down(u_short *s, u_short *d, u_int len)
*d++ = *s++;
}
-
static void
scan_esc(scr_stat *scp, u_char c)
{
@@ -1932,7 +1913,6 @@ scan_esc(scr_stat *scp, u_char c)
scp->term.esc = 0;
}
-
static void
ansi_put(scr_stat *scp, u_char c)
{
@@ -2006,13 +1986,13 @@ ansi_put(scr_stat *scp, u_char c)
switch_scr(delayed_next_scr - 1);
}
-
static void
scinit(void)
{
u_short volatile *cp = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short), was;
unsigned cursorat;
- int i;
+ int start = -1, end = -1, i;
+ scr_stat *scp;
/*
* catch that once in a blue moon occurence when scinit is called
@@ -2044,27 +2024,41 @@ scinit(void)
/* is this a VGA or higher ? */
outb(crtc_addr, 7);
- if (inb(crtc_addr) == 7)
+ if (inb(crtc_addr) == 7) {
crtc_vga = 1;
-
+#if defined(FAT_CURSOR)
+ start = 0;
+ end = 18;
+#else
+ get_cursor_shape(&start, &end);
+#endif
+ }
current_default = &user_default;
- console[0].crtat = crtat;
- console[0].crt_base = Crtat;
- console[0].term.esc = 0;
- console[0].term.std_attr = current_default->std_attr;
- console[0].term.rev_attr = current_default->rev_attr;
- console[0].term.cur_attr = current_default->std_attr;
- console[0].xpos = cursorat % COL;
- console[0].ypos = cursorat / COL;
- console[0].border = BG_BLACK;;
- console[0].xsize = COL;
- console[0].ysize = ROW;
- console[0].status = NLKED;
- console[0].pid = 0;
- console[0].proc = NULL;
- console[0].smode.mode = VT_AUTO;
- console[0].bell_pitch = BELL_PITCH;
- console[0].bell_duration = BELL_DURATION;
+ for (i = 0; i < NCONS; i++) {
+ scp = &console[i];
+ scp->mode = M_VGA_C80x25;
+ scp->term.esc = 0;
+ scp->term.std_attr = current_default->std_attr;
+ scp->term.rev_attr = current_default->rev_attr;
+ scp->term.cur_attr = scp->term.std_attr;
+ scp->border = BG_BLACK;
+ scp->cursor_start = start;
+ scp->cursor_end = end;
+ scp->xsize = COL;
+ scp->ysize = ROW;
+ scp->bell_pitch = BELL_PITCH;
+ scp->bell_duration = BELL_DURATION;
+ scp->status = NLKED;
+ scp->pid = 0;
+ scp->proc = NULL;
+ scp->smode.mode = VT_AUTO;
+ if (i == 0) {
+ scp->xpos = cursorat % COL;
+ scp->ypos = cursorat / COL;
+ scp->crt_base = Crtat;
+ scp->crtat = crtat;
+ }
+ }
kernel_console.esc = 0;
kernel_console.std_attr = kernel_default.std_attr;
kernel_console.rev_attr = kernel_default.rev_attr;
@@ -2072,10 +2066,8 @@ scinit(void)
/* initialize mapscrn array to a one to one map */
for (i=0; i<sizeof(scr_map); i++)
scr_map[i] = i;
- clear_screen(&console[0]);
}
-
static void
scput(u_char c)
{
@@ -2100,7 +2092,6 @@ scput(u_char c)
}
}
-
static u_char
*get_fstr(u_int c, u_int *len)
{
@@ -2115,7 +2106,6 @@ static u_char
return(fkey_tab[i].str);
}
-
static void
update_leds(int which)
{
@@ -2135,7 +2125,6 @@ update_leds(int which)
splx(s);
}
-
/*
* scgetc(noblock) - get character from keyboard.
* If noblock = 0 wait until a key is pressed.
@@ -2464,7 +2453,6 @@ next_code:
goto next_code;
}
-
int
getchar(void)
{
@@ -2496,14 +2484,12 @@ getchar(void)
}
}
-
u_int
sgetc(int noblock)
{
return (scgetc(noblock) & 0xff);
}
-
int
pcmmap(dev_t dev, int offset, int nprot)
{
@@ -2512,7 +2498,6 @@ pcmmap(dev_t dev, int offset, int nprot)
return i386_btop((VIDEOMEM + offset));
}
-
static void
kbd_wait(void)
{
@@ -2525,7 +2510,6 @@ kbd_wait(void)
}
}
-
static void
kbd_cmd(u_char command)
{
@@ -2560,52 +2544,112 @@ kbd_cmd(u_char command)
} while (retry--);
}
-
static void
set_mode(scr_stat *scp)
{
- u_char byte;
- int s;
+ char *modetable;
+ char special_modetable[64];
+ int mode, font_size;
if (scp != cur_console)
return;
- /* (re)activate cursor */
- untimeout((timeout_t)cursor_pos, 0);
- cursor_pos(1);
-
- /* 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)
+ if (!crtc_vga) {
+ /* (re)activate cursor */
+ untimeout((timeout_t)cursor_pos, 0);
+ cursor_pos(1);
return;
+ }
/* setup video hardware for the given mode */
- s = splhigh();
- switch(scp->mode) {
- case TEXT80x25:
- outb(crtc_addr, 9); byte = inb(crtc_addr+1);
- outb(crtc_addr, 9); outb(crtc_addr+1, byte | 0x0F);
- outb(TSIDX, 0x03); outb(TSREG, 0x00); /* select font 0 */
+ switch (scp->mode) {
+ case M_VGA_C80x50:
+ bcopy(video_mode_ptr+(64*M_VGA_C80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_VGA_M80x50:
+ bcopy(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_ENH_B80x43:
+ bcopy(video_mode_ptr+(64*M_ENH_B80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ special_modetable[28] = 87;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_ENH_C80x43:
+ bcopy(video_mode_ptr+(64*M_ENH_C80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ special_modetable[28] = 87;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_VGA_C40x25: case M_VGA_C80x25: /* VGA TEXT MODES */
+ case M_VGA_M80x25:
+ case M_B40x25: case M_C40x25:
+ case M_B80x25: case M_C80x25:
+ case M_ENH_B40x25: case M_ENH_C40x25:
+ case M_ENH_B80x25: case M_ENH_C80x25:
+
+ modetable = (char*)(video_mode_ptr + (scp->mode * 64));
+setup_mode:
+ set_vgaregs(modetable);
+ font_size = *(modetable + 2);
+ /* change cursor type if set */
+ if (scp->cursor_start != -1 && scp->cursor_end != -1)
+ cursor_shape(scp->cursor_start,
+ (scp->cursor_end >= font_size)
+ ? font_size - 1
+ : scp->cursor_end);
+
+ /* set font type (size) */
+ switch (font_size) {
+ case 0x08:
+ outb(TSIDX, 0x03); outb(TSREG, 0x05); /* font 1 */
+ break;
+ case 0x0E:
+ outb(TSIDX, 0x03); outb(TSREG, 0x0A); /* font 2 */
+ break;
+ case 0x10:
+ outb(TSIDX, 0x03); outb(TSREG, 0x00); /* font 0 */
+ break;
+ default:
+ outb(TSIDX, 0x03); outb(TSREG, 0x05); /* font 1 */
+ }
+
+ /* (re)activate cursor */
+ untimeout((timeout_t)cursor_pos, 0);
+ cursor_pos(1);
break;
- case TEXT80x50:
- outb(crtc_addr, 9); byte = inb(crtc_addr+1);
- outb(crtc_addr, 9); outb(crtc_addr+1, (byte & 0xF0) | 0x07);
- outb(TSIDX, 0x03); outb(TSREG, 0x05); /* select font 1 */
+
+ case M_BG320: case M_CG320: case M_BG640:
+ case M_CG320_D: case M_CG640_E:
+ case M_CG640x350: case M_ENH_CG640:
+ case M_BG640x480: case M_CG640x480: case M_VGA_CG320:
+
+ set_vgaregs(video_mode_ptr + (scp->mode * 64));
break;
+
default:
+ /* call user defined function XXX */
break;
}
- splx(s);
/* set border color for this (virtual) console */
set_border(scp->border);
return;
}
-
static void
set_border(int color)
{
@@ -2615,6 +2659,38 @@ set_border(int color)
outb(ATC, 0x20); /* enable Palette */
}
+static void
+set_vgaregs(char *modetable)
+{
+ int i, s = splhigh();
+
+ outb(TSIDX, 0x00); outb(TSREG, 0x01); /* stop sequencer */
+ outb(TSIDX, 0x07); outb(TSREG, 0x00); /* unlock registers */
+ for (i=0; i<4; i++) { /* program sequencer */
+ outb(TSIDX, i+1);
+ outb(TSREG, modetable[i+5]);
+ }
+ outb(MISC, modetable[9]); /* set dot-clock */
+ outb(TSIDX, 0x00); outb(TSREG, 0x03); /* start sequencer */
+ outb(crtc_addr, 0x11);
+ outb(crtc_addr+1, inb(crtc_addr+1) & 0x7F);
+ for (i=0; i<25; i++) { /* program crtc */
+ outb(crtc_addr, i);
+ outb(crtc_addr+1, modetable[i+10]);
+ }
+ inb(crtc_addr+6); /* reset flip-flop */
+ for (i=0; i<20; i++) { /* program attribute ctrl */
+ outb(ATC, i);
+ outb(ATC, modetable[i+35]);
+ }
+ for (i=0; i<9; i++) { /* program graph data ctrl */
+ outb(GDCIDX, i);
+ outb(GDCREG, modetable[i+55]);
+ }
+ inb(crtc_addr+6); /* reset flip-flop */
+ outb(ATC ,0x20); /* enable palette */
+ splx(s);
+}
static void
copy_font(int direction, int segment, int size, char* font)
@@ -2626,7 +2702,6 @@ copy_font(int direction, int segment, int size, char* font)
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);
@@ -2634,7 +2709,6 @@ copy_font(int direction, 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++)
if (direction)
@@ -2643,7 +2717,6 @@ copy_font(int direction, int segment, int size, char* font)
else
font[(ch*size)+line] =
*((char *)atdevbase+(segment*0x4000)+(ch*32)+line);
-
/* setup vga for text mode again */
s = splhigh();
inb(crtc_addr+6); /* reset flip/flop */
@@ -2663,7 +2736,6 @@ copy_font(int direction, int segment, int size, char* font)
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
}
-
static void
load_palette(void)
{
@@ -2677,7 +2749,6 @@ load_palette(void)
outb(ATC, 0x20); /* enable palette */
}
-
static void
save_palette(void)
{
@@ -2689,15 +2760,4 @@ save_palette(void)
inb(crtc_addr+6); /* reset flip/flop */
}
-
-static void
-change_winsize(struct tty *tp, int x, int y)
-{
- if (tp->t_winsize.ws_col != x || tp->t_winsize.ws_row != y) {
- tp->t_winsize.ws_col = x;
- tp->t_winsize.ws_row = y;
- pgsignal(tp->t_pgrp, SIGWINCH, 1);
- }
-}
-
#endif /* NSC */
diff --git a/sys/i386/i386/locore.s b/sys/i386/i386/locore.s
index 15b90dd..f804d18 100644
--- a/sys/i386/i386/locore.s
+++ b/sys/i386/i386/locore.s
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
- * $Id: locore.s,v 1.26 1994/09/05 14:09:41 bde Exp $
+ * $Id: locore.s,v 1.27 1994/09/12 11:38:06 davidg Exp $
*/
/*
@@ -102,9 +102,13 @@ _esym: .long 0 /* ptr to end of syms */
.globl _boothowto,_bootdev,_curpcb
.globl _cpu,_cold,_atdevbase,_cpu_vendor,_cpu_id
+
+ .globl _video_mode_ptr
+
_cpu: .long 0 /* are we 386, 386sx, or 486 */
_cpu_id: .long 0 /* stepping ID */
_cpu_vendor: .space 20 /* CPU origin code */
+_video_mode_ptr: .long 0
_cold: .long 1 /* cold till we are not */
_atdevbase: .long 0 /* location of start of iomem in virtual */
_atdevphys: .long 0 /* location of device mapping ptes (phys) */
@@ -165,6 +169,24 @@ NON_GPROF_ENTRY(btext)
movl 16(%esp),%eax
addl $KERNBASE,%eax
movl %eax,_esym-KERNBASE
+
+ /* get the BIOS video mode pointer */
+ movl $0x4a8, %ecx
+ movl (%ecx), %eax
+ movl %eax, %ecx
+ shrl $12, %ecx
+ andl $0xffff0000, %ecx
+ andl $0x0000ffff, %eax
+ orl %ecx, %eax
+ movl (%eax), %eax
+ movl %eax, %ecx
+ shrl $12, %ecx
+ andl $0xffff0000, %ecx
+ andl $0x0000ffff, %eax
+ orl %ecx, %eax
+ addl $KERNBASE, %eax
+ movl %eax, _video_mode_ptr-KERNBASE
+
#ifdef DISKLESS /* Copy diskless structure */
movl _nfs_diskless_size-KERNBASE,%ecx
movl 20(%esp),%esi
diff --git a/sys/i386/include/console.h b/sys/i386/include/console.h
index 57f4d0b..bb220c6 100644
--- a/sys/i386/include/console.h
+++ b/sys/i386/include/console.h
@@ -1,20 +1,30 @@
-/*
- * Copyright (C) 1992, 1993, 1994 Søren Schmidt
+/*-
+ * Copyright (c) 1991-1994 Søren Schmidt
+ * All rights reserved.
*
- * This program is free software; you may redistribute it and/or
- * modify it, provided that it retain the above copyright notice
- * and the following disclaimer.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software withough specific prior written permission
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * Søren Schmidt Email: sos@login.dkuug.dk
- * Tritonvej 36 UUCP: ...uunet!dkuug!login!sos
- * DK9210 Aalborg SO Phone: +45 9814 8076
- *
- * from:@(#)console.h 1.1 940105
- * $Id: console.h,v 1.1 1994/07/03 20:49:53 sos Exp $
+ * $Id$
*/
#ifndef _CONSOLE_H_
@@ -228,4 +238,73 @@ typedef struct ssaver ssaver_t;
#define KB_RESEND 0xFE /* kbd resend cmd answer */
#define KB_RESET 0xFF /* kbd reset */
+/* video mode definitions */
+#define M_B40x25 0 /* black & white 40 columns */
+#define M_C40x25 1 /* color 40 columns */
+#define M_B80x25 2 /* black & white 80 columns */
+#define M_C80x25 3 /* color 80 columns */
+#define M_BG320 4 /* black & white graphics 320x200 */
+#define M_CG320 5 /* color graphics 320x200 */
+#define M_BG640 6 /* black & white graphics 640x200 hi-res */
+#define M_EGAMONO80x25 7 /* ega-mono 80x25 */
+#define M_CG320_D 13 /* ega mode D */
+#define M_CG640_E 14 /* ega mode E */
+#define M_EGAMONOAPA 15 /* ega mode F */
+#define M_CG640x350 16 /* ega mode 10 */
+#define M_ENHMONOAPA2 17 /* ega mode F with extended memory */
+#define M_ENH_CG640 18 /* ega mode 10* */
+#define M_ENH_B40x25 19 /* ega enhanced black & white 40 columns */
+#define M_ENH_C40x25 20 /* ega enhanced color 40 columns */
+#define M_ENH_B80x25 21 /* ega enhanced black & white 80 columns */
+#define M_ENH_C80x25 22 /* ega enhanced color 80 columns */
+#define M_VGA_C40x25 23 /* vga 8x16 font on color */
+#define M_VGA_C80x25 24 /* vga 8x16 font on color */
+#define M_VGA_C80x50 30 /* vga 8x8 font on color */
+#define M_VGA_M80x25 25 /* vga 8x16 font on mono */
+#define M_VGA_M80x50 31 /* vga 8x8 font on color */
+#define M_VGA11 26 /* vga 640x480 2 colors */
+#define M_BG640x480 26
+#define M_VGA12 27 /* vga 640x480 16 colors */
+#define M_CG640x480 27
+#define M_VGA13 28 /* vga 640x200 256 colors */
+#define M_VGA_CG320 28
+#define M_ENH_B80x43 0x70 /* ega black & white 80x43 */
+#define M_ENH_C80x43 0x71 /* ega color 80x43 */
+#define M_HGC_P0 0xe0 /* hercules graphics - page 0 @ B0000 */
+#define M_HGC_P1 0xe1 /* hercules graphics - page 1 @ B8000 */
+#define M_MCA_MODE 0xff /* monochrome adapter mode */
+
+#define SW_B40x25 _IO('S', M_B40x25)
+#define SW_C40x25 _IO('S', M_C40x25)
+#define SW_B80x25 _IO('S', M_B80x25)
+#define SW_C80x25 _IO('S', M_C80x25)
+#define SW_BG320 _IO('S', M_BG320)
+#define SW_CG320 _IO('S', M_CG320)
+#define SW_BG640 _IO('S', M_BG640)
+#define SW_EGAMONO80x25 _IO('S', M_EGAMONO80x25)
+#define SW_CG320_D _IO('S', M_CG320_D)
+#define SW_CG640_E _IO('S', M_CG640_E)
+#define SW_EGAMONOAPA _IO('S', M_EGAMONOAPA)
+#define SW_CG640x350 _IO('S', M_CG640x350)
+#define SW_ENH_MONOAPA2 _IO('S', M_ENHMONOAPA2)
+#define SW_ENH_CG640 _IO('S', M_ENH_CG640)
+#define SW_ENH_B40x25 _IO('S', M_ENH_B40x25)
+#define SW_ENH_C40x25 _IO('S', M_ENH_C40x25)
+#define SW_ENH_B80x25 _IO('S', M_ENH_B80x25)
+#define SW_ENH_C80x25 _IO('S', M_ENH_C80x25)
+#define SW_ENH_B80x43 _IO('S', M_ENH_B80x43)
+#define SW_ENH_C80x43 _IO('S', M_ENH_C80x43)
+#define SW_MCAMODE _IO('S', M_MCA_MODE)
+#define SW_VGA_C40x25 _IO('S', M_VGA_C40x25)
+#define SW_VGA_C80x25 _IO('S', M_VGA_C80x25)
+#define SW_VGA_C80x50 _IO('S', M_VGA_C80x50)
+#define SW_VGA_M80x25 _IO('S', M_VGA_M80x25)
+#define SW_VGA_M80x50 _IO('S', M_VGA_M80x50)
+#define SW_VGA11 _IO('S', M_VGA11)
+#define SW_BG640x480 _IO('S', M_VGA11)
+#define SW_VGA12 _IO('S', M_VGA12)
+#define SW_CG640x480 _IO('S', M_VGA12)
+#define SW_VGA13 _IO('S', M_VGA13)
+#define SW_VGA_CG320 _IO('S', M_VGA13)
+
#endif
diff --git a/sys/i386/isa/syscons.c b/sys/i386/isa/syscons.c
index 59720db..9a79895 100644
--- a/sys/i386/isa/syscons.c
+++ b/sys/i386/isa/syscons.c
@@ -34,7 +34,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: syscons.c,v 1.52 1994/08/20 03:48:42 davidg Exp $
+ * $Id: syscons.c,v 1.53 1994/08/27 16:14:20 davidg Exp $
*/
#include "sc.h"
@@ -85,8 +85,6 @@
/* misc defines */
#define MAX_ESC_PAR 5
-#define TEXT80x25 1
-#define TEXT80x50 2
#define LOAD 1
#define SAVE 0
#define COL 80
@@ -103,6 +101,7 @@
/* defines related to hardware addresses */
#define MONO_BASE 0x3B4 /* crt controller base mono */
#define COLOR_BASE 0x3D4 /* crt controller base color */
+#define MISC 0x3C2 /* misc output register */
#define ATC IO_VGA+0x00 /* attribute controller */
#define TSIDX IO_VGA+0x04 /* timing sequencer idx */
#define TSREG IO_VGA+0x05 /* timing sequencer data */
@@ -240,10 +239,10 @@ static void kbd_wait(void);
static void kbd_cmd(u_char command);
static void set_mode(scr_stat *scp);
static void set_border(int color);
+static void set_vgaregs(char *modetable);
static void copy_font(int direction, int segment, int size, char* font);
static void save_palette(void);
static void load_palette(void);
-static void change_winsize(struct tty *tp, int x, int y);
/* available screen savers */
static void none_saver(int test);
@@ -251,6 +250,7 @@ static void blank_saver(int test);
static void fade_saver(int test);
static void star_saver(int test);
static void snake_saver(int test);
+static void green_saver(int test);
static const struct {
char *name;
@@ -261,6 +261,7 @@ static const struct {
{ "fade", fade_saver }, /* 2 */
{ "star", star_saver }, /* 3 */
{ "snake", snake_saver }, /* 4 */
+ { "green", green_saver }, /* 5 */
};
#define SCRN_SAVER(arg) (*screen_savers[scrn_saver].routine)(arg)
#define NUM_SCRN_SAVERS (sizeof(screen_savers) / sizeof(screen_savers[0]))
@@ -280,12 +281,12 @@ struct tty pccons[NCONS+1];
#define CGA_BUF (KERNBASE+0xB8000)
u_short *Crtat = (u_short *)MONO_BUF;
void consinit(void) {scinit();}
+extern char *video_mode_ptr;
struct isa_driver scdriver = {
pcprobe, pcattach, "sc",
};
-
int
pcprobe(struct isa_device *dev)
{
@@ -334,12 +335,11 @@ gotack:
return (IO_KBDSIZE);
}
-
int
pcattach(struct isa_device *dev)
{
- scr_stat *scp;
- int start = -1, end = -1, i;
+ int i;
+ struct scr_stat *scp;
printf("sc%d: ", dev->id_unit);
if (crtc_vga)
@@ -352,19 +352,11 @@ pcattach(struct isa_device *dev)
printf("MDA/hercules");
else
printf("CGA/EGA");
-
if (NCONS > 1)
printf(" <%d virtual consoles>\n", NCONS);
else
printf("\n");
-#if defined(FAT_CURSOR)
- start = 0;
- end = 18;
- if (crtc_vga) {
-#else
if (crtc_vga) {
- get_cursor_shape(&start, &end);
-#endif
#if !defined(NO_HARDFONTS)
font_8 = font_8x8;
font_14 = font_8x14;
@@ -382,44 +374,20 @@ pcattach(struct isa_device *dev)
#endif
save_palette();
}
- current_default = &user_default;
for (i = 0; i < NCONS; i++) {
scp = &console[i];
- scp->scr_buf = (u_short *)malloc(COL * ROW * 2,
- M_DEVBUF, M_NOWAIT);
- 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.cur_attr = scp->term.std_attr;
- scp->border = BG_BLACK;
- scp->cursor_start = start;
- scp->cursor_end = end;
- scp->xsize = COL;
- scp->ysize = ROW;
- scp->bell_pitch = BELL_PITCH;
- scp->bell_duration = BELL_DURATION;
- scp->status = NLKED;
- scp->pid = 0;
- scp->proc = NULL;
- scp->smode.mode = VT_AUTO;
+ scp->scr_buf = (u_short *)malloc(COL*ROW*2, M_DEVBUF, M_NOWAIT);
if (i > 0) {
scp->crt_base = scp->crtat = scp->scr_buf;
- fillw(scp->term.cur_attr|scr_map[0x20],
- scp->scr_buf, COL*ROW);
+ clear_screen(scp);
}
}
/* get cursor going */
-#if defined(FAT_CURSOR)
- cursor_shape(console[0].cursor_start,
- console[0].cursor_end);
-#endif
cursor_pos(1);
update_leds(console[0].status);
return 0;
}
-
static struct tty
*get_tty_ptr(dev_t dev)
{
@@ -432,7 +400,6 @@ static struct tty
return(VIRTUAL_TTY(unit));
}
-
static scr_stat
*get_scr_stat(dev_t dev)
{
@@ -445,7 +412,6 @@ static scr_stat
return(&console[unit]);
}
-
static int
get_scr_num()
{
@@ -455,7 +421,6 @@ get_scr_num()
return i < NCONS ? i : 0;
}
-
int
pcopen(dev_t dev, int flag, int mode, struct proc *p)
{
@@ -483,7 +448,6 @@ pcopen(dev_t dev, int flag, int mode, struct proc *p)
return((*linesw[tp->t_line].l_open)(dev, tp));
}
-
int
pcclose(dev_t dev, int flag, int mode, struct proc *p)
{
@@ -505,7 +469,6 @@ pcclose(dev_t dev, int flag, int mode, struct proc *p)
return(0);
}
-
int
pcread(dev_t dev, struct uio *uio, int flag)
{
@@ -516,7 +479,6 @@ pcread(dev_t dev, struct uio *uio, int flag)
return((*linesw[tp->t_line].l_read)(tp, uio, flag));
}
-
int
pcwrite(dev_t dev, struct uio *uio, int flag)
{
@@ -527,7 +489,6 @@ pcwrite(dev_t dev, struct uio *uio, int flag)
return((*linesw[tp->t_line].l_write)(tp, uio, flag));
}
-
void
scintr(int unit)
{
@@ -569,7 +530,6 @@ scintr(int unit)
}
}
-
int
pcparam(struct tty *tp, struct termios *t)
{
@@ -582,7 +542,6 @@ pcparam(struct tty *tp, struct termios *t)
return 0;
}
-
int
pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
{
@@ -601,62 +560,81 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
case CONS_BLANKTIME: /* set screen saver timeout (0 = no saver) */
scrn_blank_time = *(int*)data;
return 0;
+
+#define SAVER(p) ((ssaver_t *)(p))
case CONS_SSAVER: /* set screen saver */
- {
- register ssaver_t *sav = (ssaver_t *)data;
- if (sav->num < 0 || sav->num >= NUM_SCRN_SAVERS)
+ if (SAVER(data)->num < 0
+ || SAVER(data)->num >= NUM_SCRN_SAVERS)
return EIO;
SCRN_SAVER(0);
- scrn_saver = sav->num;
- scrn_blank_time = sav->time;
+ scrn_saver = SAVER(data)->num;
+ scrn_blank_time = SAVER(data)->time;
return 0;
- }
+
case CONS_GSAVER: /* get screen saver info */
- {
- register ssaver_t *sav = (ssaver_t *)data;
- if (sav->num < 0)
- sav->num = scrn_saver;
- else if (sav->num >= NUM_SCRN_SAVERS)
+ if (SAVER(data)->num < 0)
+ SAVER(data)->num = scrn_saver;
+ else if (SAVER(data)->num >= NUM_SCRN_SAVERS)
return EIO;
- sav->time = scrn_blank_time;
- strcpy(sav->name, screen_savers[sav->num].name);
+ SAVER(data)->time = scrn_blank_time;
+ strcpy(SAVER(data)->name, screen_savers[SAVER(data)->num].name);
return 0;
+
+ case SW_VGA_C40x25: case SW_VGA_C80x25: /* VGA TEXT MODES */
+ case SW_VGA_M80x25:
+ case SW_VGA_C80x50: case SW_VGA_M80x50:
+ case SW_B40x25: case SW_C40x25:
+ case SW_B80x25: case SW_C80x25:
+ case SW_ENH_B40x25: case SW_ENH_C40x25:
+ case SW_ENH_B80x25: case SW_ENH_C80x25:
+ case SW_ENH_B80x43: case SW_ENH_C80x43:
+
+ if (!crtc_vga)
+ return ENXIO;
+ scp->mode = cmd & 0xFF;
+ scp->status &= ~UNKNOWN_MODE; /* text mode */
+ if (scp->mode < M_VGA_C80x50) {
+ scp->xsize = *(video_mode_ptr + (scp->mode*64));
+ scp->ysize = *(video_mode_ptr + (scp->mode*64) + 1) + 1;
+ }
+ else switch (scp->mode) {
+ case M_VGA_C80x50: case M_VGA_M80x50:
+ scp->xsize = 80;
+ scp->ysize = 50;
+ break;
+ case M_ENH_B80x43: case M_ENH_C80x43:
+ scp->xsize = 80;
+ scp->ysize = 43;
+ break;
}
- case CONS_80x25TEXT: /* set 80x25 text mode */
- if (!crtc_vga)
- return ENXIO;
- scp->mode = TEXT80x25;
- scp->ysize = 25;
free(scp->scr_buf, M_DEVBUF);
- scp->scr_buf = (u_short *)malloc(scp->xsize*scp->ysize*2,
+ scp->scr_buf = (u_short *)malloc(scp->xsize * scp->ysize * 2,
M_DEVBUF, M_NOWAIT);
- if (scp != cur_console)
+ if (scp == cur_console)
+ set_mode(scp);
+ else
scp->crt_base = scp->scr_buf;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->xsize, scp->ysize);
- return 0;
-
- case CONS_80x50TEXT: /* set 80x50 text mode */
- if (!crtc_vga)
- return ENXIO;
- /* is there a 8x8 font loaded ? */
- if (fonts_loaded & FONT_8_LOADED) {
- scp->mode = TEXT80x50;
- scp->ysize = 50;
- free(scp->scr_buf, M_DEVBUF);
- scp->scr_buf =
- (u_short *)malloc(scp->xsize * scp->ysize * 2,
- M_DEVBUF, M_NOWAIT);
- if (scp != cur_console)
- scp->crt_base = scp->scr_buf;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->xsize, scp->ysize);
- return 0;
+ clear_screen(scp);
+ if (tp->t_winsize.ws_col != scp->xsize
+ || tp->t_winsize.ws_row != scp->ysize) {
+ tp->t_winsize.ws_col = scp->xsize;
+ tp->t_winsize.ws_row = scp->ysize;
+ pgsignal(tp->t_pgrp, SIGWINCH, 1);
}
- else
- return EINVAL;
+ return 0;
+
+ /* GRAPHICS MODES */
+ case SW_BG320: case SW_CG320: case SW_BG640:
+ case SW_CG320_D: case SW_CG640_E:
+ case SW_CG640x350: case SW_ENH_CG640:
+ case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320:
+
+ scp->mode = cmd & 0xFF;
+ scp->status |= UNKNOWN_MODE; /* graphics mode */
+ if (scp == cur_console)
+ set_mode(scp);
+ /* clear_graphics();*/
+ return 0;
case CONS_GETVERS: /* get version number */
*(int*)data = 0x103; /* version 1.3 */
@@ -1054,7 +1032,6 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return(ENOTTY);
}
-
void
pcxint(dev_t dev)
{
@@ -1069,7 +1046,6 @@ pcxint(dev_t dev)
pcstart(tp);
}
-
void
pcstart(struct tty *tp)
{
@@ -1109,7 +1085,6 @@ pcstart(struct tty *tp)
splx(s);
}
-
void
pccnprobe(struct consdev *cp)
{
@@ -1125,14 +1100,12 @@ pccnprobe(struct consdev *cp)
cp->cn_pri = CN_INTERNAL;
}
-
void
pccninit(struct consdev *cp)
{
scinit();
}
-
void
pccnputc(dev_t dev, char c)
{
@@ -1151,7 +1124,6 @@ pccnputc(dev_t dev, char c)
}
}
-
int
pccngetc(dev_t dev)
{
@@ -1162,13 +1134,11 @@ pccngetc(dev_t dev)
return(c);
}
-
static void
none_saver(int test)
{
}
-
static void
fade_saver(int test)
{
@@ -1200,7 +1170,6 @@ fade_saver(int test)
}
}
-
static void
blank_saver(int test)
{
@@ -1217,6 +1186,26 @@ blank_saver(int test)
}
}
+static void
+green_saver(int test)
+{
+ u_char val;
+ if (test) {
+ scrn_blanked = 1;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
+ outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
+ outb(crtc_addr + 1, val & ~0x80);
+ }
+ else {
+ scrn_blanked = 0;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
+ outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
+ outb(crtc_addr + 1, val | 0x80);
+ }
+}
+
#define NUM_STARS 50
/*
@@ -1271,7 +1260,6 @@ star_saver(int test)
}
}
-
static void
snake_saver(int test)
{
@@ -1332,7 +1320,6 @@ snake_saver(int test)
}
}
-
static void
cursor_shape(int start, int end)
{
@@ -1342,7 +1329,6 @@ cursor_shape(int start, int end)
outb(crtc_addr+1, end & 0xFF);
}
-
#if !defined(FAT_CURSOR)
static void
get_cursor_shape(int *start, int *end)
@@ -1354,7 +1340,6 @@ get_cursor_shape(int *start, int *end)
}
#endif
-
static void
cursor_pos(int force)
{
@@ -1375,7 +1360,6 @@ cursor_pos(int force)
timeout((timeout_t)cursor_pos, 0, hz/20);
}
-
static void
clear_screen(scr_stat *scp)
{
@@ -1384,7 +1368,6 @@ clear_screen(scr_stat *scp)
scp->xsize * scp->ysize);
}
-
static int
switch_scr(u_int next_scr)
{
@@ -1392,7 +1375,9 @@ switch_scr(u_int next_scr)
(cur_console->proc != pfind(cur_console->pid)))
switch_in_progress = 0;
- if (next_scr >= NCONS || switch_in_progress) {
+ if (next_scr >= NCONS || switch_in_progress
+ || (cur_console->smode.mode == VT_AUTO
+ && cur_console->status & UNKNOWN_MODE)) {
sysbeep(BELL_PITCH, BELL_DURATION);
return EINVAL;
}
@@ -1441,7 +1426,6 @@ switch_scr(u_int next_scr)
return 0;
}
-
static void
exchange_scr(void)
{
@@ -1451,7 +1435,8 @@ exchange_scr(void)
old_scp->crt_base = old_scp->scr_buf;
move_crsr(old_scp, old_scp->xpos, old_scp->ypos);
cur_console = new_scp;
- set_mode(new_scp);
+ if (old_scp->mode != new_scp->mode)
+ set_mode(new_scp);
new_scp->crt_base = Crtat;
move_crsr(new_scp, new_scp->xpos, new_scp->ypos);
bcopy(new_scp->scr_buf, Crtat, new_scp->xsize * new_scp->ysize * 2);
@@ -1467,7 +1452,6 @@ exchange_scr(void)
delayed_next_scr = 0;
}
-
static void
move_crsr(scr_stat *scp, int x, int y)
{
@@ -1478,7 +1462,6 @@ move_crsr(scr_stat *scp, int x, int y)
scp->crtat = scp->crt_base + scp->ypos * scp->xsize + scp->xpos;
}
-
static void
move_up(u_short *s, u_short *d, u_int len)
{
@@ -1488,7 +1471,6 @@ move_up(u_short *s, u_short *d, u_int len)
*--d = *--s;
}
-
static void
move_down(u_short *s, u_short *d, u_int len)
{
@@ -1496,7 +1478,6 @@ move_down(u_short *s, u_short *d, u_int len)
*d++ = *s++;
}
-
static void
scan_esc(scr_stat *scp, u_char c)
{
@@ -1932,7 +1913,6 @@ scan_esc(scr_stat *scp, u_char c)
scp->term.esc = 0;
}
-
static void
ansi_put(scr_stat *scp, u_char c)
{
@@ -2006,13 +1986,13 @@ ansi_put(scr_stat *scp, u_char c)
switch_scr(delayed_next_scr - 1);
}
-
static void
scinit(void)
{
u_short volatile *cp = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short), was;
unsigned cursorat;
- int i;
+ int start = -1, end = -1, i;
+ scr_stat *scp;
/*
* catch that once in a blue moon occurence when scinit is called
@@ -2044,27 +2024,41 @@ scinit(void)
/* is this a VGA or higher ? */
outb(crtc_addr, 7);
- if (inb(crtc_addr) == 7)
+ if (inb(crtc_addr) == 7) {
crtc_vga = 1;
-
+#if defined(FAT_CURSOR)
+ start = 0;
+ end = 18;
+#else
+ get_cursor_shape(&start, &end);
+#endif
+ }
current_default = &user_default;
- console[0].crtat = crtat;
- console[0].crt_base = Crtat;
- console[0].term.esc = 0;
- console[0].term.std_attr = current_default->std_attr;
- console[0].term.rev_attr = current_default->rev_attr;
- console[0].term.cur_attr = current_default->std_attr;
- console[0].xpos = cursorat % COL;
- console[0].ypos = cursorat / COL;
- console[0].border = BG_BLACK;;
- console[0].xsize = COL;
- console[0].ysize = ROW;
- console[0].status = NLKED;
- console[0].pid = 0;
- console[0].proc = NULL;
- console[0].smode.mode = VT_AUTO;
- console[0].bell_pitch = BELL_PITCH;
- console[0].bell_duration = BELL_DURATION;
+ for (i = 0; i < NCONS; i++) {
+ scp = &console[i];
+ scp->mode = M_VGA_C80x25;
+ scp->term.esc = 0;
+ scp->term.std_attr = current_default->std_attr;
+ scp->term.rev_attr = current_default->rev_attr;
+ scp->term.cur_attr = scp->term.std_attr;
+ scp->border = BG_BLACK;
+ scp->cursor_start = start;
+ scp->cursor_end = end;
+ scp->xsize = COL;
+ scp->ysize = ROW;
+ scp->bell_pitch = BELL_PITCH;
+ scp->bell_duration = BELL_DURATION;
+ scp->status = NLKED;
+ scp->pid = 0;
+ scp->proc = NULL;
+ scp->smode.mode = VT_AUTO;
+ if (i == 0) {
+ scp->xpos = cursorat % COL;
+ scp->ypos = cursorat / COL;
+ scp->crt_base = Crtat;
+ scp->crtat = crtat;
+ }
+ }
kernel_console.esc = 0;
kernel_console.std_attr = kernel_default.std_attr;
kernel_console.rev_attr = kernel_default.rev_attr;
@@ -2072,10 +2066,8 @@ scinit(void)
/* initialize mapscrn array to a one to one map */
for (i=0; i<sizeof(scr_map); i++)
scr_map[i] = i;
- clear_screen(&console[0]);
}
-
static void
scput(u_char c)
{
@@ -2100,7 +2092,6 @@ scput(u_char c)
}
}
-
static u_char
*get_fstr(u_int c, u_int *len)
{
@@ -2115,7 +2106,6 @@ static u_char
return(fkey_tab[i].str);
}
-
static void
update_leds(int which)
{
@@ -2135,7 +2125,6 @@ update_leds(int which)
splx(s);
}
-
/*
* scgetc(noblock) - get character from keyboard.
* If noblock = 0 wait until a key is pressed.
@@ -2464,7 +2453,6 @@ next_code:
goto next_code;
}
-
int
getchar(void)
{
@@ -2496,14 +2484,12 @@ getchar(void)
}
}
-
u_int
sgetc(int noblock)
{
return (scgetc(noblock) & 0xff);
}
-
int
pcmmap(dev_t dev, int offset, int nprot)
{
@@ -2512,7 +2498,6 @@ pcmmap(dev_t dev, int offset, int nprot)
return i386_btop((VIDEOMEM + offset));
}
-
static void
kbd_wait(void)
{
@@ -2525,7 +2510,6 @@ kbd_wait(void)
}
}
-
static void
kbd_cmd(u_char command)
{
@@ -2560,52 +2544,112 @@ kbd_cmd(u_char command)
} while (retry--);
}
-
static void
set_mode(scr_stat *scp)
{
- u_char byte;
- int s;
+ char *modetable;
+ char special_modetable[64];
+ int mode, font_size;
if (scp != cur_console)
return;
- /* (re)activate cursor */
- untimeout((timeout_t)cursor_pos, 0);
- cursor_pos(1);
-
- /* 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)
+ if (!crtc_vga) {
+ /* (re)activate cursor */
+ untimeout((timeout_t)cursor_pos, 0);
+ cursor_pos(1);
return;
+ }
/* setup video hardware for the given mode */
- s = splhigh();
- switch(scp->mode) {
- case TEXT80x25:
- outb(crtc_addr, 9); byte = inb(crtc_addr+1);
- outb(crtc_addr, 9); outb(crtc_addr+1, byte | 0x0F);
- outb(TSIDX, 0x03); outb(TSREG, 0x00); /* select font 0 */
+ switch (scp->mode) {
+ case M_VGA_C80x50:
+ bcopy(video_mode_ptr+(64*M_VGA_C80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_VGA_M80x50:
+ bcopy(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_ENH_B80x43:
+ bcopy(video_mode_ptr+(64*M_ENH_B80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ special_modetable[28] = 87;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_ENH_C80x43:
+ bcopy(video_mode_ptr+(64*M_ENH_C80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ special_modetable[28] = 87;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_VGA_C40x25: case M_VGA_C80x25: /* VGA TEXT MODES */
+ case M_VGA_M80x25:
+ case M_B40x25: case M_C40x25:
+ case M_B80x25: case M_C80x25:
+ case M_ENH_B40x25: case M_ENH_C40x25:
+ case M_ENH_B80x25: case M_ENH_C80x25:
+
+ modetable = (char*)(video_mode_ptr + (scp->mode * 64));
+setup_mode:
+ set_vgaregs(modetable);
+ font_size = *(modetable + 2);
+ /* change cursor type if set */
+ if (scp->cursor_start != -1 && scp->cursor_end != -1)
+ cursor_shape(scp->cursor_start,
+ (scp->cursor_end >= font_size)
+ ? font_size - 1
+ : scp->cursor_end);
+
+ /* set font type (size) */
+ switch (font_size) {
+ case 0x08:
+ outb(TSIDX, 0x03); outb(TSREG, 0x05); /* font 1 */
+ break;
+ case 0x0E:
+ outb(TSIDX, 0x03); outb(TSREG, 0x0A); /* font 2 */
+ break;
+ case 0x10:
+ outb(TSIDX, 0x03); outb(TSREG, 0x00); /* font 0 */
+ break;
+ default:
+ outb(TSIDX, 0x03); outb(TSREG, 0x05); /* font 1 */
+ }
+
+ /* (re)activate cursor */
+ untimeout((timeout_t)cursor_pos, 0);
+ cursor_pos(1);
break;
- case TEXT80x50:
- outb(crtc_addr, 9); byte = inb(crtc_addr+1);
- outb(crtc_addr, 9); outb(crtc_addr+1, (byte & 0xF0) | 0x07);
- outb(TSIDX, 0x03); outb(TSREG, 0x05); /* select font 1 */
+
+ case M_BG320: case M_CG320: case M_BG640:
+ case M_CG320_D: case M_CG640_E:
+ case M_CG640x350: case M_ENH_CG640:
+ case M_BG640x480: case M_CG640x480: case M_VGA_CG320:
+
+ set_vgaregs(video_mode_ptr + (scp->mode * 64));
break;
+
default:
+ /* call user defined function XXX */
break;
}
- splx(s);
/* set border color for this (virtual) console */
set_border(scp->border);
return;
}
-
static void
set_border(int color)
{
@@ -2615,6 +2659,38 @@ set_border(int color)
outb(ATC, 0x20); /* enable Palette */
}
+static void
+set_vgaregs(char *modetable)
+{
+ int i, s = splhigh();
+
+ outb(TSIDX, 0x00); outb(TSREG, 0x01); /* stop sequencer */
+ outb(TSIDX, 0x07); outb(TSREG, 0x00); /* unlock registers */
+ for (i=0; i<4; i++) { /* program sequencer */
+ outb(TSIDX, i+1);
+ outb(TSREG, modetable[i+5]);
+ }
+ outb(MISC, modetable[9]); /* set dot-clock */
+ outb(TSIDX, 0x00); outb(TSREG, 0x03); /* start sequencer */
+ outb(crtc_addr, 0x11);
+ outb(crtc_addr+1, inb(crtc_addr+1) & 0x7F);
+ for (i=0; i<25; i++) { /* program crtc */
+ outb(crtc_addr, i);
+ outb(crtc_addr+1, modetable[i+10]);
+ }
+ inb(crtc_addr+6); /* reset flip-flop */
+ for (i=0; i<20; i++) { /* program attribute ctrl */
+ outb(ATC, i);
+ outb(ATC, modetable[i+35]);
+ }
+ for (i=0; i<9; i++) { /* program graph data ctrl */
+ outb(GDCIDX, i);
+ outb(GDCREG, modetable[i+55]);
+ }
+ inb(crtc_addr+6); /* reset flip-flop */
+ outb(ATC ,0x20); /* enable palette */
+ splx(s);
+}
static void
copy_font(int direction, int segment, int size, char* font)
@@ -2626,7 +2702,6 @@ copy_font(int direction, int segment, int size, char* font)
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);
@@ -2634,7 +2709,6 @@ copy_font(int direction, 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++)
if (direction)
@@ -2643,7 +2717,6 @@ copy_font(int direction, int segment, int size, char* font)
else
font[(ch*size)+line] =
*((char *)atdevbase+(segment*0x4000)+(ch*32)+line);
-
/* setup vga for text mode again */
s = splhigh();
inb(crtc_addr+6); /* reset flip/flop */
@@ -2663,7 +2736,6 @@ copy_font(int direction, int segment, int size, char* font)
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
}
-
static void
load_palette(void)
{
@@ -2677,7 +2749,6 @@ load_palette(void)
outb(ATC, 0x20); /* enable palette */
}
-
static void
save_palette(void)
{
@@ -2689,15 +2760,4 @@ save_palette(void)
inb(crtc_addr+6); /* reset flip/flop */
}
-
-static void
-change_winsize(struct tty *tp, int x, int y)
-{
- if (tp->t_winsize.ws_col != x || tp->t_winsize.ws_row != y) {
- tp->t_winsize.ws_col = x;
- tp->t_winsize.ws_row = y;
- pgsignal(tp->t_pgrp, SIGWINCH, 1);
- }
-}
-
#endif /* NSC */
diff --git a/sys/isa/syscons.c b/sys/isa/syscons.c
index 59720db..9a79895 100644
--- a/sys/isa/syscons.c
+++ b/sys/isa/syscons.c
@@ -34,7 +34,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: syscons.c,v 1.52 1994/08/20 03:48:42 davidg Exp $
+ * $Id: syscons.c,v 1.53 1994/08/27 16:14:20 davidg Exp $
*/
#include "sc.h"
@@ -85,8 +85,6 @@
/* misc defines */
#define MAX_ESC_PAR 5
-#define TEXT80x25 1
-#define TEXT80x50 2
#define LOAD 1
#define SAVE 0
#define COL 80
@@ -103,6 +101,7 @@
/* defines related to hardware addresses */
#define MONO_BASE 0x3B4 /* crt controller base mono */
#define COLOR_BASE 0x3D4 /* crt controller base color */
+#define MISC 0x3C2 /* misc output register */
#define ATC IO_VGA+0x00 /* attribute controller */
#define TSIDX IO_VGA+0x04 /* timing sequencer idx */
#define TSREG IO_VGA+0x05 /* timing sequencer data */
@@ -240,10 +239,10 @@ static void kbd_wait(void);
static void kbd_cmd(u_char command);
static void set_mode(scr_stat *scp);
static void set_border(int color);
+static void set_vgaregs(char *modetable);
static void copy_font(int direction, int segment, int size, char* font);
static void save_palette(void);
static void load_palette(void);
-static void change_winsize(struct tty *tp, int x, int y);
/* available screen savers */
static void none_saver(int test);
@@ -251,6 +250,7 @@ static void blank_saver(int test);
static void fade_saver(int test);
static void star_saver(int test);
static void snake_saver(int test);
+static void green_saver(int test);
static const struct {
char *name;
@@ -261,6 +261,7 @@ static const struct {
{ "fade", fade_saver }, /* 2 */
{ "star", star_saver }, /* 3 */
{ "snake", snake_saver }, /* 4 */
+ { "green", green_saver }, /* 5 */
};
#define SCRN_SAVER(arg) (*screen_savers[scrn_saver].routine)(arg)
#define NUM_SCRN_SAVERS (sizeof(screen_savers) / sizeof(screen_savers[0]))
@@ -280,12 +281,12 @@ struct tty pccons[NCONS+1];
#define CGA_BUF (KERNBASE+0xB8000)
u_short *Crtat = (u_short *)MONO_BUF;
void consinit(void) {scinit();}
+extern char *video_mode_ptr;
struct isa_driver scdriver = {
pcprobe, pcattach, "sc",
};
-
int
pcprobe(struct isa_device *dev)
{
@@ -334,12 +335,11 @@ gotack:
return (IO_KBDSIZE);
}
-
int
pcattach(struct isa_device *dev)
{
- scr_stat *scp;
- int start = -1, end = -1, i;
+ int i;
+ struct scr_stat *scp;
printf("sc%d: ", dev->id_unit);
if (crtc_vga)
@@ -352,19 +352,11 @@ pcattach(struct isa_device *dev)
printf("MDA/hercules");
else
printf("CGA/EGA");
-
if (NCONS > 1)
printf(" <%d virtual consoles>\n", NCONS);
else
printf("\n");
-#if defined(FAT_CURSOR)
- start = 0;
- end = 18;
- if (crtc_vga) {
-#else
if (crtc_vga) {
- get_cursor_shape(&start, &end);
-#endif
#if !defined(NO_HARDFONTS)
font_8 = font_8x8;
font_14 = font_8x14;
@@ -382,44 +374,20 @@ pcattach(struct isa_device *dev)
#endif
save_palette();
}
- current_default = &user_default;
for (i = 0; i < NCONS; i++) {
scp = &console[i];
- scp->scr_buf = (u_short *)malloc(COL * ROW * 2,
- M_DEVBUF, M_NOWAIT);
- 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.cur_attr = scp->term.std_attr;
- scp->border = BG_BLACK;
- scp->cursor_start = start;
- scp->cursor_end = end;
- scp->xsize = COL;
- scp->ysize = ROW;
- scp->bell_pitch = BELL_PITCH;
- scp->bell_duration = BELL_DURATION;
- scp->status = NLKED;
- scp->pid = 0;
- scp->proc = NULL;
- scp->smode.mode = VT_AUTO;
+ scp->scr_buf = (u_short *)malloc(COL*ROW*2, M_DEVBUF, M_NOWAIT);
if (i > 0) {
scp->crt_base = scp->crtat = scp->scr_buf;
- fillw(scp->term.cur_attr|scr_map[0x20],
- scp->scr_buf, COL*ROW);
+ clear_screen(scp);
}
}
/* get cursor going */
-#if defined(FAT_CURSOR)
- cursor_shape(console[0].cursor_start,
- console[0].cursor_end);
-#endif
cursor_pos(1);
update_leds(console[0].status);
return 0;
}
-
static struct tty
*get_tty_ptr(dev_t dev)
{
@@ -432,7 +400,6 @@ static struct tty
return(VIRTUAL_TTY(unit));
}
-
static scr_stat
*get_scr_stat(dev_t dev)
{
@@ -445,7 +412,6 @@ static scr_stat
return(&console[unit]);
}
-
static int
get_scr_num()
{
@@ -455,7 +421,6 @@ get_scr_num()
return i < NCONS ? i : 0;
}
-
int
pcopen(dev_t dev, int flag, int mode, struct proc *p)
{
@@ -483,7 +448,6 @@ pcopen(dev_t dev, int flag, int mode, struct proc *p)
return((*linesw[tp->t_line].l_open)(dev, tp));
}
-
int
pcclose(dev_t dev, int flag, int mode, struct proc *p)
{
@@ -505,7 +469,6 @@ pcclose(dev_t dev, int flag, int mode, struct proc *p)
return(0);
}
-
int
pcread(dev_t dev, struct uio *uio, int flag)
{
@@ -516,7 +479,6 @@ pcread(dev_t dev, struct uio *uio, int flag)
return((*linesw[tp->t_line].l_read)(tp, uio, flag));
}
-
int
pcwrite(dev_t dev, struct uio *uio, int flag)
{
@@ -527,7 +489,6 @@ pcwrite(dev_t dev, struct uio *uio, int flag)
return((*linesw[tp->t_line].l_write)(tp, uio, flag));
}
-
void
scintr(int unit)
{
@@ -569,7 +530,6 @@ scintr(int unit)
}
}
-
int
pcparam(struct tty *tp, struct termios *t)
{
@@ -582,7 +542,6 @@ pcparam(struct tty *tp, struct termios *t)
return 0;
}
-
int
pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
{
@@ -601,62 +560,81 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
case CONS_BLANKTIME: /* set screen saver timeout (0 = no saver) */
scrn_blank_time = *(int*)data;
return 0;
+
+#define SAVER(p) ((ssaver_t *)(p))
case CONS_SSAVER: /* set screen saver */
- {
- register ssaver_t *sav = (ssaver_t *)data;
- if (sav->num < 0 || sav->num >= NUM_SCRN_SAVERS)
+ if (SAVER(data)->num < 0
+ || SAVER(data)->num >= NUM_SCRN_SAVERS)
return EIO;
SCRN_SAVER(0);
- scrn_saver = sav->num;
- scrn_blank_time = sav->time;
+ scrn_saver = SAVER(data)->num;
+ scrn_blank_time = SAVER(data)->time;
return 0;
- }
+
case CONS_GSAVER: /* get screen saver info */
- {
- register ssaver_t *sav = (ssaver_t *)data;
- if (sav->num < 0)
- sav->num = scrn_saver;
- else if (sav->num >= NUM_SCRN_SAVERS)
+ if (SAVER(data)->num < 0)
+ SAVER(data)->num = scrn_saver;
+ else if (SAVER(data)->num >= NUM_SCRN_SAVERS)
return EIO;
- sav->time = scrn_blank_time;
- strcpy(sav->name, screen_savers[sav->num].name);
+ SAVER(data)->time = scrn_blank_time;
+ strcpy(SAVER(data)->name, screen_savers[SAVER(data)->num].name);
return 0;
+
+ case SW_VGA_C40x25: case SW_VGA_C80x25: /* VGA TEXT MODES */
+ case SW_VGA_M80x25:
+ case SW_VGA_C80x50: case SW_VGA_M80x50:
+ case SW_B40x25: case SW_C40x25:
+ case SW_B80x25: case SW_C80x25:
+ case SW_ENH_B40x25: case SW_ENH_C40x25:
+ case SW_ENH_B80x25: case SW_ENH_C80x25:
+ case SW_ENH_B80x43: case SW_ENH_C80x43:
+
+ if (!crtc_vga)
+ return ENXIO;
+ scp->mode = cmd & 0xFF;
+ scp->status &= ~UNKNOWN_MODE; /* text mode */
+ if (scp->mode < M_VGA_C80x50) {
+ scp->xsize = *(video_mode_ptr + (scp->mode*64));
+ scp->ysize = *(video_mode_ptr + (scp->mode*64) + 1) + 1;
+ }
+ else switch (scp->mode) {
+ case M_VGA_C80x50: case M_VGA_M80x50:
+ scp->xsize = 80;
+ scp->ysize = 50;
+ break;
+ case M_ENH_B80x43: case M_ENH_C80x43:
+ scp->xsize = 80;
+ scp->ysize = 43;
+ break;
}
- case CONS_80x25TEXT: /* set 80x25 text mode */
- if (!crtc_vga)
- return ENXIO;
- scp->mode = TEXT80x25;
- scp->ysize = 25;
free(scp->scr_buf, M_DEVBUF);
- scp->scr_buf = (u_short *)malloc(scp->xsize*scp->ysize*2,
+ scp->scr_buf = (u_short *)malloc(scp->xsize * scp->ysize * 2,
M_DEVBUF, M_NOWAIT);
- if (scp != cur_console)
+ if (scp == cur_console)
+ set_mode(scp);
+ else
scp->crt_base = scp->scr_buf;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->xsize, scp->ysize);
- return 0;
-
- case CONS_80x50TEXT: /* set 80x50 text mode */
- if (!crtc_vga)
- return ENXIO;
- /* is there a 8x8 font loaded ? */
- if (fonts_loaded & FONT_8_LOADED) {
- scp->mode = TEXT80x50;
- scp->ysize = 50;
- free(scp->scr_buf, M_DEVBUF);
- scp->scr_buf =
- (u_short *)malloc(scp->xsize * scp->ysize * 2,
- M_DEVBUF, M_NOWAIT);
- if (scp != cur_console)
- scp->crt_base = scp->scr_buf;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->xsize, scp->ysize);
- return 0;
+ clear_screen(scp);
+ if (tp->t_winsize.ws_col != scp->xsize
+ || tp->t_winsize.ws_row != scp->ysize) {
+ tp->t_winsize.ws_col = scp->xsize;
+ tp->t_winsize.ws_row = scp->ysize;
+ pgsignal(tp->t_pgrp, SIGWINCH, 1);
}
- else
- return EINVAL;
+ return 0;
+
+ /* GRAPHICS MODES */
+ case SW_BG320: case SW_CG320: case SW_BG640:
+ case SW_CG320_D: case SW_CG640_E:
+ case SW_CG640x350: case SW_ENH_CG640:
+ case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320:
+
+ scp->mode = cmd & 0xFF;
+ scp->status |= UNKNOWN_MODE; /* graphics mode */
+ if (scp == cur_console)
+ set_mode(scp);
+ /* clear_graphics();*/
+ return 0;
case CONS_GETVERS: /* get version number */
*(int*)data = 0x103; /* version 1.3 */
@@ -1054,7 +1032,6 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return(ENOTTY);
}
-
void
pcxint(dev_t dev)
{
@@ -1069,7 +1046,6 @@ pcxint(dev_t dev)
pcstart(tp);
}
-
void
pcstart(struct tty *tp)
{
@@ -1109,7 +1085,6 @@ pcstart(struct tty *tp)
splx(s);
}
-
void
pccnprobe(struct consdev *cp)
{
@@ -1125,14 +1100,12 @@ pccnprobe(struct consdev *cp)
cp->cn_pri = CN_INTERNAL;
}
-
void
pccninit(struct consdev *cp)
{
scinit();
}
-
void
pccnputc(dev_t dev, char c)
{
@@ -1151,7 +1124,6 @@ pccnputc(dev_t dev, char c)
}
}
-
int
pccngetc(dev_t dev)
{
@@ -1162,13 +1134,11 @@ pccngetc(dev_t dev)
return(c);
}
-
static void
none_saver(int test)
{
}
-
static void
fade_saver(int test)
{
@@ -1200,7 +1170,6 @@ fade_saver(int test)
}
}
-
static void
blank_saver(int test)
{
@@ -1217,6 +1186,26 @@ blank_saver(int test)
}
}
+static void
+green_saver(int test)
+{
+ u_char val;
+ if (test) {
+ scrn_blanked = 1;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
+ outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
+ outb(crtc_addr + 1, val & ~0x80);
+ }
+ else {
+ scrn_blanked = 0;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
+ outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
+ outb(crtc_addr + 1, val | 0x80);
+ }
+}
+
#define NUM_STARS 50
/*
@@ -1271,7 +1260,6 @@ star_saver(int test)
}
}
-
static void
snake_saver(int test)
{
@@ -1332,7 +1320,6 @@ snake_saver(int test)
}
}
-
static void
cursor_shape(int start, int end)
{
@@ -1342,7 +1329,6 @@ cursor_shape(int start, int end)
outb(crtc_addr+1, end & 0xFF);
}
-
#if !defined(FAT_CURSOR)
static void
get_cursor_shape(int *start, int *end)
@@ -1354,7 +1340,6 @@ get_cursor_shape(int *start, int *end)
}
#endif
-
static void
cursor_pos(int force)
{
@@ -1375,7 +1360,6 @@ cursor_pos(int force)
timeout((timeout_t)cursor_pos, 0, hz/20);
}
-
static void
clear_screen(scr_stat *scp)
{
@@ -1384,7 +1368,6 @@ clear_screen(scr_stat *scp)
scp->xsize * scp->ysize);
}
-
static int
switch_scr(u_int next_scr)
{
@@ -1392,7 +1375,9 @@ switch_scr(u_int next_scr)
(cur_console->proc != pfind(cur_console->pid)))
switch_in_progress = 0;
- if (next_scr >= NCONS || switch_in_progress) {
+ if (next_scr >= NCONS || switch_in_progress
+ || (cur_console->smode.mode == VT_AUTO
+ && cur_console->status & UNKNOWN_MODE)) {
sysbeep(BELL_PITCH, BELL_DURATION);
return EINVAL;
}
@@ -1441,7 +1426,6 @@ switch_scr(u_int next_scr)
return 0;
}
-
static void
exchange_scr(void)
{
@@ -1451,7 +1435,8 @@ exchange_scr(void)
old_scp->crt_base = old_scp->scr_buf;
move_crsr(old_scp, old_scp->xpos, old_scp->ypos);
cur_console = new_scp;
- set_mode(new_scp);
+ if (old_scp->mode != new_scp->mode)
+ set_mode(new_scp);
new_scp->crt_base = Crtat;
move_crsr(new_scp, new_scp->xpos, new_scp->ypos);
bcopy(new_scp->scr_buf, Crtat, new_scp->xsize * new_scp->ysize * 2);
@@ -1467,7 +1452,6 @@ exchange_scr(void)
delayed_next_scr = 0;
}
-
static void
move_crsr(scr_stat *scp, int x, int y)
{
@@ -1478,7 +1462,6 @@ move_crsr(scr_stat *scp, int x, int y)
scp->crtat = scp->crt_base + scp->ypos * scp->xsize + scp->xpos;
}
-
static void
move_up(u_short *s, u_short *d, u_int len)
{
@@ -1488,7 +1471,6 @@ move_up(u_short *s, u_short *d, u_int len)
*--d = *--s;
}
-
static void
move_down(u_short *s, u_short *d, u_int len)
{
@@ -1496,7 +1478,6 @@ move_down(u_short *s, u_short *d, u_int len)
*d++ = *s++;
}
-
static void
scan_esc(scr_stat *scp, u_char c)
{
@@ -1932,7 +1913,6 @@ scan_esc(scr_stat *scp, u_char c)
scp->term.esc = 0;
}
-
static void
ansi_put(scr_stat *scp, u_char c)
{
@@ -2006,13 +1986,13 @@ ansi_put(scr_stat *scp, u_char c)
switch_scr(delayed_next_scr - 1);
}
-
static void
scinit(void)
{
u_short volatile *cp = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short), was;
unsigned cursorat;
- int i;
+ int start = -1, end = -1, i;
+ scr_stat *scp;
/*
* catch that once in a blue moon occurence when scinit is called
@@ -2044,27 +2024,41 @@ scinit(void)
/* is this a VGA or higher ? */
outb(crtc_addr, 7);
- if (inb(crtc_addr) == 7)
+ if (inb(crtc_addr) == 7) {
crtc_vga = 1;
-
+#if defined(FAT_CURSOR)
+ start = 0;
+ end = 18;
+#else
+ get_cursor_shape(&start, &end);
+#endif
+ }
current_default = &user_default;
- console[0].crtat = crtat;
- console[0].crt_base = Crtat;
- console[0].term.esc = 0;
- console[0].term.std_attr = current_default->std_attr;
- console[0].term.rev_attr = current_default->rev_attr;
- console[0].term.cur_attr = current_default->std_attr;
- console[0].xpos = cursorat % COL;
- console[0].ypos = cursorat / COL;
- console[0].border = BG_BLACK;;
- console[0].xsize = COL;
- console[0].ysize = ROW;
- console[0].status = NLKED;
- console[0].pid = 0;
- console[0].proc = NULL;
- console[0].smode.mode = VT_AUTO;
- console[0].bell_pitch = BELL_PITCH;
- console[0].bell_duration = BELL_DURATION;
+ for (i = 0; i < NCONS; i++) {
+ scp = &console[i];
+ scp->mode = M_VGA_C80x25;
+ scp->term.esc = 0;
+ scp->term.std_attr = current_default->std_attr;
+ scp->term.rev_attr = current_default->rev_attr;
+ scp->term.cur_attr = scp->term.std_attr;
+ scp->border = BG_BLACK;
+ scp->cursor_start = start;
+ scp->cursor_end = end;
+ scp->xsize = COL;
+ scp->ysize = ROW;
+ scp->bell_pitch = BELL_PITCH;
+ scp->bell_duration = BELL_DURATION;
+ scp->status = NLKED;
+ scp->pid = 0;
+ scp->proc = NULL;
+ scp->smode.mode = VT_AUTO;
+ if (i == 0) {
+ scp->xpos = cursorat % COL;
+ scp->ypos = cursorat / COL;
+ scp->crt_base = Crtat;
+ scp->crtat = crtat;
+ }
+ }
kernel_console.esc = 0;
kernel_console.std_attr = kernel_default.std_attr;
kernel_console.rev_attr = kernel_default.rev_attr;
@@ -2072,10 +2066,8 @@ scinit(void)
/* initialize mapscrn array to a one to one map */
for (i=0; i<sizeof(scr_map); i++)
scr_map[i] = i;
- clear_screen(&console[0]);
}
-
static void
scput(u_char c)
{
@@ -2100,7 +2092,6 @@ scput(u_char c)
}
}
-
static u_char
*get_fstr(u_int c, u_int *len)
{
@@ -2115,7 +2106,6 @@ static u_char
return(fkey_tab[i].str);
}
-
static void
update_leds(int which)
{
@@ -2135,7 +2125,6 @@ update_leds(int which)
splx(s);
}
-
/*
* scgetc(noblock) - get character from keyboard.
* If noblock = 0 wait until a key is pressed.
@@ -2464,7 +2453,6 @@ next_code:
goto next_code;
}
-
int
getchar(void)
{
@@ -2496,14 +2484,12 @@ getchar(void)
}
}
-
u_int
sgetc(int noblock)
{
return (scgetc(noblock) & 0xff);
}
-
int
pcmmap(dev_t dev, int offset, int nprot)
{
@@ -2512,7 +2498,6 @@ pcmmap(dev_t dev, int offset, int nprot)
return i386_btop((VIDEOMEM + offset));
}
-
static void
kbd_wait(void)
{
@@ -2525,7 +2510,6 @@ kbd_wait(void)
}
}
-
static void
kbd_cmd(u_char command)
{
@@ -2560,52 +2544,112 @@ kbd_cmd(u_char command)
} while (retry--);
}
-
static void
set_mode(scr_stat *scp)
{
- u_char byte;
- int s;
+ char *modetable;
+ char special_modetable[64];
+ int mode, font_size;
if (scp != cur_console)
return;
- /* (re)activate cursor */
- untimeout((timeout_t)cursor_pos, 0);
- cursor_pos(1);
-
- /* 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)
+ if (!crtc_vga) {
+ /* (re)activate cursor */
+ untimeout((timeout_t)cursor_pos, 0);
+ cursor_pos(1);
return;
+ }
/* setup video hardware for the given mode */
- s = splhigh();
- switch(scp->mode) {
- case TEXT80x25:
- outb(crtc_addr, 9); byte = inb(crtc_addr+1);
- outb(crtc_addr, 9); outb(crtc_addr+1, byte | 0x0F);
- outb(TSIDX, 0x03); outb(TSREG, 0x00); /* select font 0 */
+ switch (scp->mode) {
+ case M_VGA_C80x50:
+ bcopy(video_mode_ptr+(64*M_VGA_C80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_VGA_M80x50:
+ bcopy(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_ENH_B80x43:
+ bcopy(video_mode_ptr+(64*M_ENH_B80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ special_modetable[28] = 87;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_ENH_C80x43:
+ bcopy(video_mode_ptr+(64*M_ENH_C80x25), &special_modetable, 64);
+ special_modetable[2] = 8;
+ special_modetable[19] = 7;
+ special_modetable[28] = 87;
+ modetable = special_modetable;
+ goto setup_mode;
+
+ case M_VGA_C40x25: case M_VGA_C80x25: /* VGA TEXT MODES */
+ case M_VGA_M80x25:
+ case M_B40x25: case M_C40x25:
+ case M_B80x25: case M_C80x25:
+ case M_ENH_B40x25: case M_ENH_C40x25:
+ case M_ENH_B80x25: case M_ENH_C80x25:
+
+ modetable = (char*)(video_mode_ptr + (scp->mode * 64));
+setup_mode:
+ set_vgaregs(modetable);
+ font_size = *(modetable + 2);
+ /* change cursor type if set */
+ if (scp->cursor_start != -1 && scp->cursor_end != -1)
+ cursor_shape(scp->cursor_start,
+ (scp->cursor_end >= font_size)
+ ? font_size - 1
+ : scp->cursor_end);
+
+ /* set font type (size) */
+ switch (font_size) {
+ case 0x08:
+ outb(TSIDX, 0x03); outb(TSREG, 0x05); /* font 1 */
+ break;
+ case 0x0E:
+ outb(TSIDX, 0x03); outb(TSREG, 0x0A); /* font 2 */
+ break;
+ case 0x10:
+ outb(TSIDX, 0x03); outb(TSREG, 0x00); /* font 0 */
+ break;
+ default:
+ outb(TSIDX, 0x03); outb(TSREG, 0x05); /* font 1 */
+ }
+
+ /* (re)activate cursor */
+ untimeout((timeout_t)cursor_pos, 0);
+ cursor_pos(1);
break;
- case TEXT80x50:
- outb(crtc_addr, 9); byte = inb(crtc_addr+1);
- outb(crtc_addr, 9); outb(crtc_addr+1, (byte & 0xF0) | 0x07);
- outb(TSIDX, 0x03); outb(TSREG, 0x05); /* select font 1 */
+
+ case M_BG320: case M_CG320: case M_BG640:
+ case M_CG320_D: case M_CG640_E:
+ case M_CG640x350: case M_ENH_CG640:
+ case M_BG640x480: case M_CG640x480: case M_VGA_CG320:
+
+ set_vgaregs(video_mode_ptr + (scp->mode * 64));
break;
+
default:
+ /* call user defined function XXX */
break;
}
- splx(s);
/* set border color for this (virtual) console */
set_border(scp->border);
return;
}
-
static void
set_border(int color)
{
@@ -2615,6 +2659,38 @@ set_border(int color)
outb(ATC, 0x20); /* enable Palette */
}
+static void
+set_vgaregs(char *modetable)
+{
+ int i, s = splhigh();
+
+ outb(TSIDX, 0x00); outb(TSREG, 0x01); /* stop sequencer */
+ outb(TSIDX, 0x07); outb(TSREG, 0x00); /* unlock registers */
+ for (i=0; i<4; i++) { /* program sequencer */
+ outb(TSIDX, i+1);
+ outb(TSREG, modetable[i+5]);
+ }
+ outb(MISC, modetable[9]); /* set dot-clock */
+ outb(TSIDX, 0x00); outb(TSREG, 0x03); /* start sequencer */
+ outb(crtc_addr, 0x11);
+ outb(crtc_addr+1, inb(crtc_addr+1) & 0x7F);
+ for (i=0; i<25; i++) { /* program crtc */
+ outb(crtc_addr, i);
+ outb(crtc_addr+1, modetable[i+10]);
+ }
+ inb(crtc_addr+6); /* reset flip-flop */
+ for (i=0; i<20; i++) { /* program attribute ctrl */
+ outb(ATC, i);
+ outb(ATC, modetable[i+35]);
+ }
+ for (i=0; i<9; i++) { /* program graph data ctrl */
+ outb(GDCIDX, i);
+ outb(GDCREG, modetable[i+55]);
+ }
+ inb(crtc_addr+6); /* reset flip-flop */
+ outb(ATC ,0x20); /* enable palette */
+ splx(s);
+}
static void
copy_font(int direction, int segment, int size, char* font)
@@ -2626,7 +2702,6 @@ copy_font(int direction, int segment, int size, char* font)
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);
@@ -2634,7 +2709,6 @@ copy_font(int direction, 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++)
if (direction)
@@ -2643,7 +2717,6 @@ copy_font(int direction, int segment, int size, char* font)
else
font[(ch*size)+line] =
*((char *)atdevbase+(segment*0x4000)+(ch*32)+line);
-
/* setup vga for text mode again */
s = splhigh();
inb(crtc_addr+6); /* reset flip/flop */
@@ -2663,7 +2736,6 @@ copy_font(int direction, int segment, int size, char* font)
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
}
-
static void
load_palette(void)
{
@@ -2677,7 +2749,6 @@ load_palette(void)
outb(ATC, 0x20); /* enable palette */
}
-
static void
save_palette(void)
{
@@ -2689,15 +2760,4 @@ save_palette(void)
inb(crtc_addr+6); /* reset flip/flop */
}
-
-static void
-change_winsize(struct tty *tp, int x, int y)
-{
- if (tp->t_winsize.ws_col != x || tp->t_winsize.ws_row != y) {
- tp->t_winsize.ws_col = x;
- tp->t_winsize.ws_row = y;
- pgsignal(tp->t_pgrp, SIGWINCH, 1);
- }
-}
-
#endif /* NSC */
OpenPOWER on IntegriCloud