summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/syscons/scvesactl.c17
-rw-r--r--sys/dev/syscons/scvidctl.c41
-rw-r--r--sys/dev/syscons/syscons.c197
-rw-r--r--sys/dev/syscons/syscons.h4
-rw-r--r--sys/i386/include/console.h24
-rw-r--r--sys/i386/isa/scvesactl.c17
-rw-r--r--sys/i386/isa/scvidctl.c41
-rw-r--r--sys/i386/isa/syscons.c197
-rw-r--r--sys/i386/isa/syscons.h4
-rw-r--r--sys/i386/isa/vesa.c53
-rw-r--r--sys/i386/isa/videoio.c202
11 files changed, 650 insertions, 147 deletions
diff --git a/sys/dev/syscons/scvesactl.c b/sys/dev/syscons/scvesactl.c
index 9678177..5896e24 100644
--- a/sys/dev/syscons/scvesactl.c
+++ b/sys/dev/syscons/scvesactl.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: scvesactl.c,v 1.1 1998/09/15 18:16:37 sos Exp $
*/
#include "sc.h"
@@ -50,7 +50,11 @@
static int (*prev_user_ioctl)(dev_t dev, int cmd, caddr_t data, int flag,
struct proc *p);
-extern struct tty *scdevtotty(dev_t dev);
+/* external functions */
+struct tty *scdevtotty(dev_t dev);
+
+/* functions in this module */
+int vesa_ioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p);
int
vesa_ioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
@@ -79,6 +83,15 @@ vesa_ioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
else
goto vesa_text;
+ /* generic text modes */
+ case SW_TEXT_132x25: case SW_TEXT_132x30:
+ case SW_TEXT_132x43: case SW_TEXT_132x50:
+ case SW_TEXT_132x60:
+ adp = get_adapter(scp);
+ if (!(adp->va_flags & V_ADP_MODECHANGE))
+ return ENODEV;
+ return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0);
+
/* text modes */
case SW_VESA_C80x60:
case SW_VESA_C132x25:
diff --git a/sys/dev/syscons/scvidctl.c b/sys/dev/syscons/scvidctl.c
index 464933e..8deada6 100644
--- a/sys/dev/syscons/scvidctl.c
+++ b/sys/dev/syscons/scvidctl.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: scvidctl.c,v 1.1 1998/09/15 18:16:37 sos Exp $
*/
#include "sc.h"
@@ -49,7 +49,6 @@
/* video ioctl */
extern scr_stat *cur_console;
-extern u_short *Crtat;
extern int fonts_loaded;
extern int sc_history_size;
extern u_char palette[];
@@ -233,13 +232,28 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
if (scp->scr_buf != NULL) {
printf("set_pixel_mode(): mode:%x, col:%d, row:%d, font:%d\n",
scp->mode, xsize, ysize, fontsize);
- printf("set_pixel_mode(): Crtat:%x, %dx%d, xoff:%d, yoff:%d\n",
- Crtat, info.vi_width, info.vi_height,
+ printf("set_pixel_mode(): window:%x, %dx%d, xoff:%d, yoff:%d\n",
+ adp->va_window, info.vi_width, info.vi_height,
(info.vi_width/8 - xsize)/2,
(info.vi_height/fontsize - ysize)/2);
}
#endif
+ if ((info.vi_width < xsize*8) || (info.vi_height < ysize*fontsize))
+ return EINVAL;
+
+ /* only 16 color, 4 plane modes are supported XXX */
+ if ((info.vi_depth != 4) || (info.vi_planes != 4))
+ return ENODEV;
+
+ /*
+ * set_pixel_mode() currently does not support video modes whose
+ * memory size is larger than 64K. Because such modes require
+ * bank switching to access the entire screen. XXX
+ */
+ if (info.vi_width*info.vi_height/8 > info.vi_window_size*1024)
+ return ENODEV;
+
/* stop screen saver, etc */
s = spltty();
if ((error = sc_clean_up(scp))) {
@@ -268,9 +282,8 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
sc_alloc_history_buffer(scp, sc_history_size, i, FALSE);
splx(s);
- /* FIXME */
if (scp == cur_console)
- bzero(Crtat, scp->xpixel*scp->ypixel/8);
+ set_border(scp, scp->border);
scp->status &= ~UNKNOWN_MODE;
@@ -335,6 +348,12 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
return ((*biosvidsw.set_win_org)(scp->adp, *(u_int *)data)
? ENODEV : 0);
+ /* generic text modes */
+ case SW_TEXT_80x25: case SW_TEXT_80x30:
+ case SW_TEXT_80x43: case SW_TEXT_80x50:
+ case SW_TEXT_80x60:
+ /* FALL THROUGH */
+
/* VGA TEXT MODES */
case SW_VGA_C40x25:
case SW_VGA_C80x25: case SW_VGA_M80x25:
@@ -411,12 +430,8 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
scp->status |= UNKNOWN_MODE;
splx(s);
/* no restore fonts & palette */
- if (scp == cur_console) {
+ if (scp == cur_console)
set_mode(scp);
- /* FIXME */
- if (scp->status & PIXEL_MODE)
- bzero(Crtat, scp->xpixel*scp->ypixel/8);
- }
sc_clear_screen(scp);
scp->status &= ~UNKNOWN_MODE;
return 0;
@@ -424,7 +439,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case KD_PIXEL: /* pixel (raster) display */
if (!(scp->status & (GRAPHICS_MODE | PIXEL_MODE)))
return EINVAL;
- if (!(scp->status & PIXEL_MODE))
+ if (scp->status & GRAPHICS_MODE)
return sc_set_pixel_mode(scp, tp, scp->xsize, scp->ysize,
scp->font_size);
s = spltty();
@@ -437,8 +452,6 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
if (scp == cur_console) {
set_mode(scp);
load_palette(scp, palette);
- /* FIXME */
- bzero(Crtat, scp->xpixel*scp->ypixel/8);
}
sc_clear_screen(scp);
scp->status &= ~UNKNOWN_MODE;
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index 50e0f19..6af764f 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id$
+ * $Id: syscons.c,v 1.278 1998/09/15 18:16:37 sos Exp $
*/
#include "sc.h"
@@ -121,6 +121,7 @@ typedef struct old_mouse_info {
/* XXX use sc_bcopy where video memory is concerned */
extern void generic_bcopy(const void *, void *, size_t);
+extern void generic_bzero(void *, size_t);
static default_attr user_default = {
(FG_LIGHTGREY | BG_BLACK) << 8,
@@ -293,6 +294,7 @@ static void do_bell(scr_stat *scp, int pitch, int duration);
static timeout_t blink_screen;
#ifdef SC_SPLASH_SCREEN
static void scsplash_init(scr_stat *scp);
+static void scsplash_term(scr_stat *scp);
static void scsplash_saver(int show);
#define scsplash_stick(stick) (sticky_splash = (stick))
#else
@@ -326,7 +328,8 @@ static struct cdevsw sc_cdevsw = {
static void
draw_cursor_image(scr_stat *scp)
{
- u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
+ u_short cursor_image;
+ u_short *ptr;
u_short prev_image;
if (ISPIXELSC(scp)) {
@@ -335,6 +338,9 @@ draw_cursor_image(scr_stat *scp)
return;
}
+ ptr = (u_short *)(get_adapter(scp)->va_window)
+ + (scp->cursor_pos - scp->scr_buf);
+
/* do we have a destructive cursor ? */
if (flags & CHAR_CURSOR) {
prev_image = scp->cursor_saveunder;
@@ -383,9 +389,11 @@ remove_cursor_image(scr_stat *scp)
{
if (ISPIXELSC(scp))
sc_bcopy(scp, scp->scr_buf, scp->cursor_oldpos - scp->scr_buf,
- scp->cursor_oldpos - scp->scr_buf, 0);
+ scp->cursor_oldpos - scp->scr_buf, 0);
else
- *(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder;
+ *((u_short *)(get_adapter(scp)->va_window)
+ + (scp->cursor_oldpos - scp->scr_buf))
+ = scp->cursor_saveunder;
}
static void
@@ -412,13 +420,14 @@ scprobe(struct isa_device *dev)
printf("sc%d: no video adapter is found.\n", dev->id_unit);
return (0);
}
- (*biosvidsw.diag)(bootverbose);
+
#if defined(VESA) && defined(VM86)
if (vesa_load())
return FALSE;
- (*biosvidsw.diag)(bootverbose);
#endif
+ (*biosvidsw.diag)(bootverbose);
+
sc_port = dev->id_iobase;
if (sckbdprobe(dev->id_unit, dev->id_flags))
return (IO_KBDSIZE);
@@ -663,9 +672,15 @@ scattach(struct isa_device *dev)
#if defined(VESA) && defined(VM86)
if ((flags & VESA800X600)
&& ((*biosvidsw.get_info)(scp->adp, M_VESA_800x600, &info) == 0)) {
+#ifdef SC_SPLASH_SCREEN
+ scsplash_term(scp);
+#endif
sc_set_graphics_mode(scp, NULL, M_VESA_800x600);
sc_set_pixel_mode(scp, NULL, COL, ROW, 16);
initial_video_mode = M_VESA_800x600;
+#ifdef SC_SPLASH_SCREEN
+ scsplash_init(scp);
+#endif
}
#endif /* VESA && VM86 */
@@ -2310,10 +2325,8 @@ exchange_scr(void)
{
move_crsr(old_scp, old_scp->xpos, old_scp->ypos);
cur_console = new_scp;
- if (old_scp->mode != new_scp->mode || ISUNKNOWNSC(old_scp)) {
- if (adp_flags & V_ADP_MODECHANGE)
- set_mode(new_scp);
- }
+ if (old_scp->mode != new_scp->mode || ISUNKNOWNSC(old_scp))
+ set_mode(new_scp);
move_crsr(new_scp, new_scp->xpos, new_scp->ypos);
if (ISTEXTSC(new_scp) && (flags & CHAR_CURSOR))
set_destructive_cursor(new_scp);
@@ -2326,10 +2339,6 @@ exchange_scr(void)
update_leds(new_scp->status);
delayed_next_scr = FALSE;
mark_all(new_scp);
-
- /* FIXME: the screen size may be larger than a 64K segment. */
- if (ISPIXELSC(new_scp))
- bzero(Crtat, new_scp->xpixel*new_scp->ypixel/8);
}
static void
@@ -2496,7 +2505,7 @@ scan_esc(scr_stat *scp, u_char c)
scp->xsize - scp->xpos);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf +
- scp->xsize - scp->xpos);
+ scp->xsize - 1 - scp->xpos);
break;
case 1: /* clear from beginning of line to cursor */
fillw(scp->term.cur_color | scr_map[0x20],
@@ -2510,7 +2519,7 @@ scan_esc(scr_stat *scp, u_char c)
scp->cursor_pos - scp->xpos,
scp->xsize);
mark_for_update(scp, scp->ypos * scp->xsize);
- mark_for_update(scp, (scp->ypos + 1) * scp->xsize);
+ mark_for_update(scp, (scp->ypos + 1) * scp->xsize - 1);
break;
}
break;
@@ -2555,7 +2564,7 @@ scan_esc(scr_stat *scp, u_char c)
src = dst + count;
fillw(scp->term.cur_color | scr_map[0x20], src, n);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
- mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count);
+ mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count - 1);
break;
case '@': /* Insert n chars */
@@ -2568,7 +2577,7 @@ scan_esc(scr_stat *scp, u_char c)
bcopy(src, dst, count * sizeof(u_short));
fillw(scp->term.cur_color | scr_map[0x20], src, n);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
- mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count);
+ mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count - 1);
break;
case 'S': /* scroll up n lines */
@@ -2604,7 +2613,7 @@ scan_esc(scr_stat *scp, u_char c)
fillw(scp->term.cur_color | scr_map[0x20],
scp->cursor_pos, n);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
- mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n);
+ mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n - 1);
break;
case 'Z': /* move n tabs backwards */
@@ -3023,8 +3032,8 @@ scinit(void)
/* copy screen to temporary buffer */
if (ISTEXTSC(console[0]))
- generic_bcopy(Crtat, sc_buffer,
- console[0]->xsize * console[0]->ysize * sizeof(u_short));
+ generic_bcopy((ushort *)(get_adapter(console[0])->va_window), sc_buffer,
+ console[0]->xsize * console[0]->ysize * sizeof(u_short));
console[0]->scr_buf = console[0]->mouse_pos = console[0]->mouse_oldpos
= sc_buffer;
@@ -3993,6 +4002,9 @@ set_mode(scr_stat *scp)
}
mark_all(scp);
}
+
+ if (scp->status & PIXEL_MODE)
+ generic_bzero((u_char *)(adp->va_window), scp->xpixel*scp->ypixel/8);
set_border(scp, scp->border);
/* move hardware cursor out of the way */
@@ -4002,6 +4014,46 @@ set_mode(scr_stat *scp)
}
void
+set_border(scr_stat *scp, int color)
+{
+ u_char *p;
+ int xoff;
+ int yoff;
+ int xlen;
+ int ylen;
+ int i;
+
+ (*biosvidsw.set_border)(scp->adp, color);
+
+ if (scp->status & PIXEL_MODE) {
+ outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
+ outw(GDCIDX, 0x0003); /* data rotate/function select */
+ outw(GDCIDX, 0x0f01); /* set/reset enable */
+ outw(GDCIDX, 0xff08); /* bit mask */
+ outw(GDCIDX, (color << 8) | 0x00); /* set/reset */
+ p = (u_char *)(get_adapter(scp)->va_window);
+ xoff = scp->xoff;
+ yoff = scp->yoff*scp->font_size;
+ xlen = scp->xpixel/8;
+ ylen = scp->ysize*scp->font_size;
+ if (yoff > 0) {
+ generic_bzero(p, xlen*yoff);
+ generic_bzero(p + xlen*(yoff + ylen),
+ xlen*scp->ypixel - xlen*(yoff + ylen));
+ }
+ if (xoff > 0) {
+ for (i = 0; i < ylen; ++i) {
+ generic_bzero(p + xlen*(yoff + i), xoff);
+ generic_bzero(p + xlen*(yoff + i) + xoff + scp->xsize,
+ xlen - xoff - scp->xsize);
+ }
+ }
+ outw(GDCIDX, 0x0000); /* set/reset */
+ outw(GDCIDX, 0x0001); /* set/reset enable */
+ }
+}
+
+void
copy_font(scr_stat *scp, int operation, int font_size, u_char *buf)
{
/*
@@ -4322,7 +4374,8 @@ draw_mouse_image(scr_stat *scp)
{
u_short buffer[32];
u_short xoffset, yoffset;
- u_short *crt_pos = Crtat + (scp->mouse_pos - scp->scr_buf);
+ u_short *crt_pos = (u_short *)(get_adapter(scp)->va_window)
+ + (scp->mouse_pos - scp->scr_buf);
u_char *font_buffer;
int font_size;
int i;
@@ -4394,10 +4447,13 @@ draw_mouse_image(scr_stat *scp)
static void
remove_mouse_image(scr_stat *scp)
{
- u_short *crt_pos = Crtat + (scp->mouse_oldpos - scp->scr_buf);
+ u_short *crt_pos;
if (!ISTEXTSC(scp))
return;
+
+ crt_pos = (u_short *)(get_adapter(scp)->va_window)
+ + (scp->mouse_oldpos - scp->scr_buf);
*(crt_pos) = *(scp->mouse_oldpos);
*(crt_pos+1) = *(scp->mouse_oldpos+1);
*(crt_pos+scp->xsize) = *(scp->mouse_oldpos+scp->xsize);
@@ -4409,11 +4465,13 @@ remove_mouse_image(scr_stat *scp)
static void
draw_cutmarking(scr_stat *scp)
{
+ u_short *crt_pos;
u_short *ptr;
u_short och, nch;
+ crt_pos = (u_short *)(get_adapter(scp)->va_window);
for (ptr=scp->scr_buf; ptr<=(scp->scr_buf+(scp->xsize*scp->ysize)); ptr++) {
- nch = och = *(Crtat + (ptr - scp->scr_buf));
+ nch = och = *(crt_pos + (ptr - scp->scr_buf));
/* are we outside the selected area ? */
if ( ptr < (scp->mouse_cut_start > scp->mouse_cut_end ?
scp->mouse_cut_end : scp->mouse_cut_start) ||
@@ -4435,7 +4493,7 @@ draw_cutmarking(scr_stat *scp)
}
}
if (nch != och)
- *(Crtat + (ptr - scp->scr_buf)) = nch;
+ *(crt_pos + (ptr - scp->scr_buf)) = nch;
}
}
@@ -4484,10 +4542,12 @@ blink_screen(void *arg)
else {
if (blink_in_progress & 1)
fillw(kernel_default.std_color | scr_map[0x20],
- Crtat, scp->xsize * scp->ysize);
+ (u_short *)(get_adapter(scp)->va_window),
+ scp->xsize * scp->ysize);
else
fillw(kernel_default.rev_color | scr_map[0x20],
- Crtat, scp->xsize * scp->ysize);
+ (u_short *)(get_adapter(scp)->va_window),
+ scp->xsize * scp->ysize);
blink_in_progress--;
timeout(blink_screen, scp, hz / 10);
}
@@ -4497,15 +4557,19 @@ void
sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark)
{
u_char *font;
- u_char *d, *e;
+ u_char volatile *d;
+ u_char *e;
u_char *f;
int font_size;
int line_length;
int xsize;
+ u_short bg;
int i, j;
+ u_char c;
if (ISTEXTSC(scp)) {
- generic_bcopy(p+from, Crtat+from, (to-from+1)*sizeof (u_short));
+ generic_bcopy(p + from, (u_short *)(get_adapter(scp)->va_window) + from,
+ (to - from + 1)*sizeof(u_short));
} else /* if ISPIXELSC(scp) */ {
if (mark)
mark = 255;
@@ -4518,20 +4582,72 @@ sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark)
font = font_14;
line_length = scp->xpixel/8;
xsize = scp->xsize;
- d = (u_char *)Crtat
+ d = (u_char *)(get_adapter(scp)->va_window)
+ scp->xoff + scp->yoff*font_size*line_length
+ (from%xsize) + font_size*line_length*(from/xsize);
+
+ outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
+ outw(GDCIDX, 0x0003); /* data rotate/function select */
+ outw(GDCIDX, 0x0f01); /* set/reset enable */
+ bg = -1;
for (i = from ; i <= to ; i++) {
- e = d;
+ /* set background color in EGA/VGA latch */
+ if (bg != (p[i] & 0xf000)) {
+ bg = (p[i] & 0xf000);
+ outw(GDCIDX, (bg >> 4) | 0x00); /* set/reset */
+ outw(GDCIDX, 0xff08); /* bit mask */
+ *d = 0;
+ c = *d; /* set the background color in the latch */
+ }
+ /* foreground color */
+ outw(GDCIDX, (p[i] & 0x0f00) | 0x00); /* set/reset */
+ e = (u_char *)d;
f = &font[(p[i] & 0x00ff)*font_size];
for (j = 0 ; j < font_size; j++, f++) {
- *e = mark^*f;
+ outw(GDCIDX, ((*f^mark) << 8) | 0x08); /* bit mask */
+ *e = 0;
e += line_length;
}
d++;
if ((i % xsize) == xsize - 1)
d += scp->xoff*2 + (font_size - 1)*line_length;
}
+ outw(GDCIDX, 0x0000); /* set/reset */
+ outw(GDCIDX, 0x0001); /* set/reset enable */
+ outw(GDCIDX, 0xff08); /* bit mask */
+
+#if 0 /* VGA only */
+ outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
+ outw(GDCIDX, 0x0003); /* data rotate/function select */
+ outw(GDCIDX, 0x0f01); /* set/reset enable */
+ outw(GDCIDX, 0xff08); /* bit mask */
+ bg = -1;
+ for (i = from ; i <= to ; i++) {
+ /* set background color in EGA/VGA latch */
+ if (bg != (p[i] & 0xf000)) {
+ bg = (p[i] & 0xf000);
+ outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
+ outw(GDCIDX, (bg >> 4) | 0x00); /* set/reset */
+ *d = 0;
+ c = *d; /* set the background color in the latch */
+ outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
+ }
+ /* foreground color */
+ outw(GDCIDX, (p[i] & 0x0f00) | 0x00); /* set/reset */
+ e = (u_char *)d;
+ f = &font[(p[i] & 0x00ff)*font_size];
+ for (j = 0 ; j < font_size; j++, f++) {
+ *e = *f^mark;
+ e += line_length;
+ }
+ d++;
+ if ((i % xsize) == xsize - 1)
+ d += scp->xoff*2 + (font_size - 1)*line_length;
+ }
+ outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
+ outw(GDCIDX, 0x0000); /* set/reset */
+ outw(GDCIDX, 0x0001); /* set/reset enable */
+#endif /* 0 */
}
}
@@ -4542,14 +4658,6 @@ scsplash_init(scr_stat *scp)
{
video_info_t info;
- /*
- * We currently assume the splash screen always use
- * VGA_CG320 mode and abort installation if this mode is not
- * supported with this video card. XXX
- */
- if ((*biosvidsw.get_info)(scp->adp, M_VGA_CG320, &info))
- return;
-
if (scsplash_load(scp) == 0 && add_scrn_saver(scsplash_saver) == 0) {
default_saver = scsplash_saver;
scrn_blank_time = DEFAULT_BLANKTIME;
@@ -4562,6 +4670,15 @@ scsplash_init(scr_stat *scp)
}
static void
+scsplash_term(scr_stat *scp)
+{
+ default_saver = none_saver;
+ scsplash_stick(FALSE);
+ remove_scrn_saver(scsplash_saver);
+ scsplash_unload(scp);
+}
+
+static void
scsplash_saver(int show)
{
if (show)
diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h
index 315946b..dd4ec8c 100644
--- a/sys/dev/syscons/syscons.h
+++ b/sys/dev/syscons/syscons.h
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id$
+ * $Id: syscons.h,v 1.40 1998/09/15 18:16:38 sos Exp $
*/
#ifndef _I386_ISA_SYSCONS_H_
@@ -210,9 +210,9 @@ int set_mode(scr_stat *scp);
scr_stat *sc_get_scr_stat(dev_t dev);
void copy_font(scr_stat *scp, int operation, int font_size, u_char *font_image);
+void set_border(scr_stat *scp, int color);
#define save_palette(scp, pal) (*biosvidsw.save_palette)((scp)->adp, pal)
#define load_palette(scp, pal) (*biosvidsw.load_palette)((scp)->adp, pal)
-#define set_border(scp, col) (*biosvidsw.set_border)((scp)->adp, col)
#define get_adapter(scp) (*biosvidsw.adapter)((scp)->adp)
int add_scrn_saver(void (*this)(int));
diff --git a/sys/i386/include/console.h b/sys/i386/include/console.h
index 3373e60..638b74b 100644
--- a/sys/i386/include/console.h
+++ b/sys/i386/include/console.h
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: console.h,v 1.38 1998/08/03 11:30:28 yokota Exp $
+ * $Id: console.h,v 1.39 1998/09/15 18:16:37 sos Exp $
*/
#ifndef _MACHINE_CONSOLE_H_
@@ -437,6 +437,17 @@ typedef struct {int scr_size[3];} scr_size_t;
#define M_HGC_P1 0xe1 /* hercules graphics - page 1 @ B8000 */
#define M_MCA_MODE 0xff /* monochrome adapter mode */
+#define M_TEXT_80x25 200 /* generic text modes */
+#define M_TEXT_80x30 201
+#define M_TEXT_80x43 202
+#define M_TEXT_80x50 203
+#define M_TEXT_80x60 204
+#define M_TEXT_132x25 205
+#define M_TEXT_132x30 206
+#define M_TEXT_132x43 207
+#define M_TEXT_132x50 208
+#define M_TEXT_132x60 209
+
#define SW_PC98_80x25 _IO('S', M_PC98_80x25)
#define SW_PC98_80x30 _IO('S', M_PC98_80x30)
#define SW_B40x25 _IO('S', M_B40x25)
@@ -478,6 +489,17 @@ typedef struct {int scr_size[3];} scr_size_t;
#define SW_VGA_CG640 _IO('S', M_VGA_CG640)
#define SW_VGA_MODEX _IO('S', M_VGA_MODEX)
+#define SW_TEXT_80x25 _IO('S', M_TEXT_80x25)
+#define SW_TEXT_80x30 _IO('S', M_TEXT_80x30)
+#define SW_TEXT_80x43 _IO('S', M_TEXT_80x43)
+#define SW_TEXT_80x50 _IO('S', M_TEXT_80x50)
+#define SW_TEXT_80x60 _IO('S', M_TEXT_80x60)
+#define SW_TEXT_132x25 _IO('S', M_TEXT_132x25)
+#define SW_TEXT_132x30 _IO('S', M_TEXT_132x30)
+#define SW_TEXT_132x43 _IO('S', M_TEXT_132x43)
+#define SW_TEXT_132x50 _IO('S', M_TEXT_132x50)
+#define SW_TEXT_132x60 _IO('S', M_TEXT_132x60)
+
#define M_VESA_BASE 0x100 /* VESA mode number base */
#define M_VESA_CG640x400 0x100 /* 640x400, 256 color */
diff --git a/sys/i386/isa/scvesactl.c b/sys/i386/isa/scvesactl.c
index 9678177..5896e24 100644
--- a/sys/i386/isa/scvesactl.c
+++ b/sys/i386/isa/scvesactl.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: scvesactl.c,v 1.1 1998/09/15 18:16:37 sos Exp $
*/
#include "sc.h"
@@ -50,7 +50,11 @@
static int (*prev_user_ioctl)(dev_t dev, int cmd, caddr_t data, int flag,
struct proc *p);
-extern struct tty *scdevtotty(dev_t dev);
+/* external functions */
+struct tty *scdevtotty(dev_t dev);
+
+/* functions in this module */
+int vesa_ioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p);
int
vesa_ioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
@@ -79,6 +83,15 @@ vesa_ioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
else
goto vesa_text;
+ /* generic text modes */
+ case SW_TEXT_132x25: case SW_TEXT_132x30:
+ case SW_TEXT_132x43: case SW_TEXT_132x50:
+ case SW_TEXT_132x60:
+ adp = get_adapter(scp);
+ if (!(adp->va_flags & V_ADP_MODECHANGE))
+ return ENODEV;
+ return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0);
+
/* text modes */
case SW_VESA_C80x60:
case SW_VESA_C132x25:
diff --git a/sys/i386/isa/scvidctl.c b/sys/i386/isa/scvidctl.c
index 464933e..8deada6 100644
--- a/sys/i386/isa/scvidctl.c
+++ b/sys/i386/isa/scvidctl.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: scvidctl.c,v 1.1 1998/09/15 18:16:37 sos Exp $
*/
#include "sc.h"
@@ -49,7 +49,6 @@
/* video ioctl */
extern scr_stat *cur_console;
-extern u_short *Crtat;
extern int fonts_loaded;
extern int sc_history_size;
extern u_char palette[];
@@ -233,13 +232,28 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
if (scp->scr_buf != NULL) {
printf("set_pixel_mode(): mode:%x, col:%d, row:%d, font:%d\n",
scp->mode, xsize, ysize, fontsize);
- printf("set_pixel_mode(): Crtat:%x, %dx%d, xoff:%d, yoff:%d\n",
- Crtat, info.vi_width, info.vi_height,
+ printf("set_pixel_mode(): window:%x, %dx%d, xoff:%d, yoff:%d\n",
+ adp->va_window, info.vi_width, info.vi_height,
(info.vi_width/8 - xsize)/2,
(info.vi_height/fontsize - ysize)/2);
}
#endif
+ if ((info.vi_width < xsize*8) || (info.vi_height < ysize*fontsize))
+ return EINVAL;
+
+ /* only 16 color, 4 plane modes are supported XXX */
+ if ((info.vi_depth != 4) || (info.vi_planes != 4))
+ return ENODEV;
+
+ /*
+ * set_pixel_mode() currently does not support video modes whose
+ * memory size is larger than 64K. Because such modes require
+ * bank switching to access the entire screen. XXX
+ */
+ if (info.vi_width*info.vi_height/8 > info.vi_window_size*1024)
+ return ENODEV;
+
/* stop screen saver, etc */
s = spltty();
if ((error = sc_clean_up(scp))) {
@@ -268,9 +282,8 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
sc_alloc_history_buffer(scp, sc_history_size, i, FALSE);
splx(s);
- /* FIXME */
if (scp == cur_console)
- bzero(Crtat, scp->xpixel*scp->ypixel/8);
+ set_border(scp, scp->border);
scp->status &= ~UNKNOWN_MODE;
@@ -335,6 +348,12 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
return ((*biosvidsw.set_win_org)(scp->adp, *(u_int *)data)
? ENODEV : 0);
+ /* generic text modes */
+ case SW_TEXT_80x25: case SW_TEXT_80x30:
+ case SW_TEXT_80x43: case SW_TEXT_80x50:
+ case SW_TEXT_80x60:
+ /* FALL THROUGH */
+
/* VGA TEXT MODES */
case SW_VGA_C40x25:
case SW_VGA_C80x25: case SW_VGA_M80x25:
@@ -411,12 +430,8 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
scp->status |= UNKNOWN_MODE;
splx(s);
/* no restore fonts & palette */
- if (scp == cur_console) {
+ if (scp == cur_console)
set_mode(scp);
- /* FIXME */
- if (scp->status & PIXEL_MODE)
- bzero(Crtat, scp->xpixel*scp->ypixel/8);
- }
sc_clear_screen(scp);
scp->status &= ~UNKNOWN_MODE;
return 0;
@@ -424,7 +439,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case KD_PIXEL: /* pixel (raster) display */
if (!(scp->status & (GRAPHICS_MODE | PIXEL_MODE)))
return EINVAL;
- if (!(scp->status & PIXEL_MODE))
+ if (scp->status & GRAPHICS_MODE)
return sc_set_pixel_mode(scp, tp, scp->xsize, scp->ysize,
scp->font_size);
s = spltty();
@@ -437,8 +452,6 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
if (scp == cur_console) {
set_mode(scp);
load_palette(scp, palette);
- /* FIXME */
- bzero(Crtat, scp->xpixel*scp->ypixel/8);
}
sc_clear_screen(scp);
scp->status &= ~UNKNOWN_MODE;
diff --git a/sys/i386/isa/syscons.c b/sys/i386/isa/syscons.c
index 50e0f19..6af764f 100644
--- a/sys/i386/isa/syscons.c
+++ b/sys/i386/isa/syscons.c
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id$
+ * $Id: syscons.c,v 1.278 1998/09/15 18:16:37 sos Exp $
*/
#include "sc.h"
@@ -121,6 +121,7 @@ typedef struct old_mouse_info {
/* XXX use sc_bcopy where video memory is concerned */
extern void generic_bcopy(const void *, void *, size_t);
+extern void generic_bzero(void *, size_t);
static default_attr user_default = {
(FG_LIGHTGREY | BG_BLACK) << 8,
@@ -293,6 +294,7 @@ static void do_bell(scr_stat *scp, int pitch, int duration);
static timeout_t blink_screen;
#ifdef SC_SPLASH_SCREEN
static void scsplash_init(scr_stat *scp);
+static void scsplash_term(scr_stat *scp);
static void scsplash_saver(int show);
#define scsplash_stick(stick) (sticky_splash = (stick))
#else
@@ -326,7 +328,8 @@ static struct cdevsw sc_cdevsw = {
static void
draw_cursor_image(scr_stat *scp)
{
- u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
+ u_short cursor_image;
+ u_short *ptr;
u_short prev_image;
if (ISPIXELSC(scp)) {
@@ -335,6 +338,9 @@ draw_cursor_image(scr_stat *scp)
return;
}
+ ptr = (u_short *)(get_adapter(scp)->va_window)
+ + (scp->cursor_pos - scp->scr_buf);
+
/* do we have a destructive cursor ? */
if (flags & CHAR_CURSOR) {
prev_image = scp->cursor_saveunder;
@@ -383,9 +389,11 @@ remove_cursor_image(scr_stat *scp)
{
if (ISPIXELSC(scp))
sc_bcopy(scp, scp->scr_buf, scp->cursor_oldpos - scp->scr_buf,
- scp->cursor_oldpos - scp->scr_buf, 0);
+ scp->cursor_oldpos - scp->scr_buf, 0);
else
- *(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder;
+ *((u_short *)(get_adapter(scp)->va_window)
+ + (scp->cursor_oldpos - scp->scr_buf))
+ = scp->cursor_saveunder;
}
static void
@@ -412,13 +420,14 @@ scprobe(struct isa_device *dev)
printf("sc%d: no video adapter is found.\n", dev->id_unit);
return (0);
}
- (*biosvidsw.diag)(bootverbose);
+
#if defined(VESA) && defined(VM86)
if (vesa_load())
return FALSE;
- (*biosvidsw.diag)(bootverbose);
#endif
+ (*biosvidsw.diag)(bootverbose);
+
sc_port = dev->id_iobase;
if (sckbdprobe(dev->id_unit, dev->id_flags))
return (IO_KBDSIZE);
@@ -663,9 +672,15 @@ scattach(struct isa_device *dev)
#if defined(VESA) && defined(VM86)
if ((flags & VESA800X600)
&& ((*biosvidsw.get_info)(scp->adp, M_VESA_800x600, &info) == 0)) {
+#ifdef SC_SPLASH_SCREEN
+ scsplash_term(scp);
+#endif
sc_set_graphics_mode(scp, NULL, M_VESA_800x600);
sc_set_pixel_mode(scp, NULL, COL, ROW, 16);
initial_video_mode = M_VESA_800x600;
+#ifdef SC_SPLASH_SCREEN
+ scsplash_init(scp);
+#endif
}
#endif /* VESA && VM86 */
@@ -2310,10 +2325,8 @@ exchange_scr(void)
{
move_crsr(old_scp, old_scp->xpos, old_scp->ypos);
cur_console = new_scp;
- if (old_scp->mode != new_scp->mode || ISUNKNOWNSC(old_scp)) {
- if (adp_flags & V_ADP_MODECHANGE)
- set_mode(new_scp);
- }
+ if (old_scp->mode != new_scp->mode || ISUNKNOWNSC(old_scp))
+ set_mode(new_scp);
move_crsr(new_scp, new_scp->xpos, new_scp->ypos);
if (ISTEXTSC(new_scp) && (flags & CHAR_CURSOR))
set_destructive_cursor(new_scp);
@@ -2326,10 +2339,6 @@ exchange_scr(void)
update_leds(new_scp->status);
delayed_next_scr = FALSE;
mark_all(new_scp);
-
- /* FIXME: the screen size may be larger than a 64K segment. */
- if (ISPIXELSC(new_scp))
- bzero(Crtat, new_scp->xpixel*new_scp->ypixel/8);
}
static void
@@ -2496,7 +2505,7 @@ scan_esc(scr_stat *scp, u_char c)
scp->xsize - scp->xpos);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf +
- scp->xsize - scp->xpos);
+ scp->xsize - 1 - scp->xpos);
break;
case 1: /* clear from beginning of line to cursor */
fillw(scp->term.cur_color | scr_map[0x20],
@@ -2510,7 +2519,7 @@ scan_esc(scr_stat *scp, u_char c)
scp->cursor_pos - scp->xpos,
scp->xsize);
mark_for_update(scp, scp->ypos * scp->xsize);
- mark_for_update(scp, (scp->ypos + 1) * scp->xsize);
+ mark_for_update(scp, (scp->ypos + 1) * scp->xsize - 1);
break;
}
break;
@@ -2555,7 +2564,7 @@ scan_esc(scr_stat *scp, u_char c)
src = dst + count;
fillw(scp->term.cur_color | scr_map[0x20], src, n);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
- mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count);
+ mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count - 1);
break;
case '@': /* Insert n chars */
@@ -2568,7 +2577,7 @@ scan_esc(scr_stat *scp, u_char c)
bcopy(src, dst, count * sizeof(u_short));
fillw(scp->term.cur_color | scr_map[0x20], src, n);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
- mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count);
+ mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count - 1);
break;
case 'S': /* scroll up n lines */
@@ -2604,7 +2613,7 @@ scan_esc(scr_stat *scp, u_char c)
fillw(scp->term.cur_color | scr_map[0x20],
scp->cursor_pos, n);
mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
- mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n);
+ mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n - 1);
break;
case 'Z': /* move n tabs backwards */
@@ -3023,8 +3032,8 @@ scinit(void)
/* copy screen to temporary buffer */
if (ISTEXTSC(console[0]))
- generic_bcopy(Crtat, sc_buffer,
- console[0]->xsize * console[0]->ysize * sizeof(u_short));
+ generic_bcopy((ushort *)(get_adapter(console[0])->va_window), sc_buffer,
+ console[0]->xsize * console[0]->ysize * sizeof(u_short));
console[0]->scr_buf = console[0]->mouse_pos = console[0]->mouse_oldpos
= sc_buffer;
@@ -3993,6 +4002,9 @@ set_mode(scr_stat *scp)
}
mark_all(scp);
}
+
+ if (scp->status & PIXEL_MODE)
+ generic_bzero((u_char *)(adp->va_window), scp->xpixel*scp->ypixel/8);
set_border(scp, scp->border);
/* move hardware cursor out of the way */
@@ -4002,6 +4014,46 @@ set_mode(scr_stat *scp)
}
void
+set_border(scr_stat *scp, int color)
+{
+ u_char *p;
+ int xoff;
+ int yoff;
+ int xlen;
+ int ylen;
+ int i;
+
+ (*biosvidsw.set_border)(scp->adp, color);
+
+ if (scp->status & PIXEL_MODE) {
+ outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
+ outw(GDCIDX, 0x0003); /* data rotate/function select */
+ outw(GDCIDX, 0x0f01); /* set/reset enable */
+ outw(GDCIDX, 0xff08); /* bit mask */
+ outw(GDCIDX, (color << 8) | 0x00); /* set/reset */
+ p = (u_char *)(get_adapter(scp)->va_window);
+ xoff = scp->xoff;
+ yoff = scp->yoff*scp->font_size;
+ xlen = scp->xpixel/8;
+ ylen = scp->ysize*scp->font_size;
+ if (yoff > 0) {
+ generic_bzero(p, xlen*yoff);
+ generic_bzero(p + xlen*(yoff + ylen),
+ xlen*scp->ypixel - xlen*(yoff + ylen));
+ }
+ if (xoff > 0) {
+ for (i = 0; i < ylen; ++i) {
+ generic_bzero(p + xlen*(yoff + i), xoff);
+ generic_bzero(p + xlen*(yoff + i) + xoff + scp->xsize,
+ xlen - xoff - scp->xsize);
+ }
+ }
+ outw(GDCIDX, 0x0000); /* set/reset */
+ outw(GDCIDX, 0x0001); /* set/reset enable */
+ }
+}
+
+void
copy_font(scr_stat *scp, int operation, int font_size, u_char *buf)
{
/*
@@ -4322,7 +4374,8 @@ draw_mouse_image(scr_stat *scp)
{
u_short buffer[32];
u_short xoffset, yoffset;
- u_short *crt_pos = Crtat + (scp->mouse_pos - scp->scr_buf);
+ u_short *crt_pos = (u_short *)(get_adapter(scp)->va_window)
+ + (scp->mouse_pos - scp->scr_buf);
u_char *font_buffer;
int font_size;
int i;
@@ -4394,10 +4447,13 @@ draw_mouse_image(scr_stat *scp)
static void
remove_mouse_image(scr_stat *scp)
{
- u_short *crt_pos = Crtat + (scp->mouse_oldpos - scp->scr_buf);
+ u_short *crt_pos;
if (!ISTEXTSC(scp))
return;
+
+ crt_pos = (u_short *)(get_adapter(scp)->va_window)
+ + (scp->mouse_oldpos - scp->scr_buf);
*(crt_pos) = *(scp->mouse_oldpos);
*(crt_pos+1) = *(scp->mouse_oldpos+1);
*(crt_pos+scp->xsize) = *(scp->mouse_oldpos+scp->xsize);
@@ -4409,11 +4465,13 @@ remove_mouse_image(scr_stat *scp)
static void
draw_cutmarking(scr_stat *scp)
{
+ u_short *crt_pos;
u_short *ptr;
u_short och, nch;
+ crt_pos = (u_short *)(get_adapter(scp)->va_window);
for (ptr=scp->scr_buf; ptr<=(scp->scr_buf+(scp->xsize*scp->ysize)); ptr++) {
- nch = och = *(Crtat + (ptr - scp->scr_buf));
+ nch = och = *(crt_pos + (ptr - scp->scr_buf));
/* are we outside the selected area ? */
if ( ptr < (scp->mouse_cut_start > scp->mouse_cut_end ?
scp->mouse_cut_end : scp->mouse_cut_start) ||
@@ -4435,7 +4493,7 @@ draw_cutmarking(scr_stat *scp)
}
}
if (nch != och)
- *(Crtat + (ptr - scp->scr_buf)) = nch;
+ *(crt_pos + (ptr - scp->scr_buf)) = nch;
}
}
@@ -4484,10 +4542,12 @@ blink_screen(void *arg)
else {
if (blink_in_progress & 1)
fillw(kernel_default.std_color | scr_map[0x20],
- Crtat, scp->xsize * scp->ysize);
+ (u_short *)(get_adapter(scp)->va_window),
+ scp->xsize * scp->ysize);
else
fillw(kernel_default.rev_color | scr_map[0x20],
- Crtat, scp->xsize * scp->ysize);
+ (u_short *)(get_adapter(scp)->va_window),
+ scp->xsize * scp->ysize);
blink_in_progress--;
timeout(blink_screen, scp, hz / 10);
}
@@ -4497,15 +4557,19 @@ void
sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark)
{
u_char *font;
- u_char *d, *e;
+ u_char volatile *d;
+ u_char *e;
u_char *f;
int font_size;
int line_length;
int xsize;
+ u_short bg;
int i, j;
+ u_char c;
if (ISTEXTSC(scp)) {
- generic_bcopy(p+from, Crtat+from, (to-from+1)*sizeof (u_short));
+ generic_bcopy(p + from, (u_short *)(get_adapter(scp)->va_window) + from,
+ (to - from + 1)*sizeof(u_short));
} else /* if ISPIXELSC(scp) */ {
if (mark)
mark = 255;
@@ -4518,20 +4582,72 @@ sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark)
font = font_14;
line_length = scp->xpixel/8;
xsize = scp->xsize;
- d = (u_char *)Crtat
+ d = (u_char *)(get_adapter(scp)->va_window)
+ scp->xoff + scp->yoff*font_size*line_length
+ (from%xsize) + font_size*line_length*(from/xsize);
+
+ outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
+ outw(GDCIDX, 0x0003); /* data rotate/function select */
+ outw(GDCIDX, 0x0f01); /* set/reset enable */
+ bg = -1;
for (i = from ; i <= to ; i++) {
- e = d;
+ /* set background color in EGA/VGA latch */
+ if (bg != (p[i] & 0xf000)) {
+ bg = (p[i] & 0xf000);
+ outw(GDCIDX, (bg >> 4) | 0x00); /* set/reset */
+ outw(GDCIDX, 0xff08); /* bit mask */
+ *d = 0;
+ c = *d; /* set the background color in the latch */
+ }
+ /* foreground color */
+ outw(GDCIDX, (p[i] & 0x0f00) | 0x00); /* set/reset */
+ e = (u_char *)d;
f = &font[(p[i] & 0x00ff)*font_size];
for (j = 0 ; j < font_size; j++, f++) {
- *e = mark^*f;
+ outw(GDCIDX, ((*f^mark) << 8) | 0x08); /* bit mask */
+ *e = 0;
e += line_length;
}
d++;
if ((i % xsize) == xsize - 1)
d += scp->xoff*2 + (font_size - 1)*line_length;
}
+ outw(GDCIDX, 0x0000); /* set/reset */
+ outw(GDCIDX, 0x0001); /* set/reset enable */
+ outw(GDCIDX, 0xff08); /* bit mask */
+
+#if 0 /* VGA only */
+ outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
+ outw(GDCIDX, 0x0003); /* data rotate/function select */
+ outw(GDCIDX, 0x0f01); /* set/reset enable */
+ outw(GDCIDX, 0xff08); /* bit mask */
+ bg = -1;
+ for (i = from ; i <= to ; i++) {
+ /* set background color in EGA/VGA latch */
+ if (bg != (p[i] & 0xf000)) {
+ bg = (p[i] & 0xf000);
+ outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
+ outw(GDCIDX, (bg >> 4) | 0x00); /* set/reset */
+ *d = 0;
+ c = *d; /* set the background color in the latch */
+ outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
+ }
+ /* foreground color */
+ outw(GDCIDX, (p[i] & 0x0f00) | 0x00); /* set/reset */
+ e = (u_char *)d;
+ f = &font[(p[i] & 0x00ff)*font_size];
+ for (j = 0 ; j < font_size; j++, f++) {
+ *e = *f^mark;
+ e += line_length;
+ }
+ d++;
+ if ((i % xsize) == xsize - 1)
+ d += scp->xoff*2 + (font_size - 1)*line_length;
+ }
+ outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
+ outw(GDCIDX, 0x0000); /* set/reset */
+ outw(GDCIDX, 0x0001); /* set/reset enable */
+#endif /* 0 */
}
}
@@ -4542,14 +4658,6 @@ scsplash_init(scr_stat *scp)
{
video_info_t info;
- /*
- * We currently assume the splash screen always use
- * VGA_CG320 mode and abort installation if this mode is not
- * supported with this video card. XXX
- */
- if ((*biosvidsw.get_info)(scp->adp, M_VGA_CG320, &info))
- return;
-
if (scsplash_load(scp) == 0 && add_scrn_saver(scsplash_saver) == 0) {
default_saver = scsplash_saver;
scrn_blank_time = DEFAULT_BLANKTIME;
@@ -4562,6 +4670,15 @@ scsplash_init(scr_stat *scp)
}
static void
+scsplash_term(scr_stat *scp)
+{
+ default_saver = none_saver;
+ scsplash_stick(FALSE);
+ remove_scrn_saver(scsplash_saver);
+ scsplash_unload(scp);
+}
+
+static void
scsplash_saver(int show)
{
if (show)
diff --git a/sys/i386/isa/syscons.h b/sys/i386/isa/syscons.h
index 315946b..dd4ec8c 100644
--- a/sys/i386/isa/syscons.h
+++ b/sys/i386/isa/syscons.h
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id$
+ * $Id: syscons.h,v 1.40 1998/09/15 18:16:38 sos Exp $
*/
#ifndef _I386_ISA_SYSCONS_H_
@@ -210,9 +210,9 @@ int set_mode(scr_stat *scp);
scr_stat *sc_get_scr_stat(dev_t dev);
void copy_font(scr_stat *scp, int operation, int font_size, u_char *font_image);
+void set_border(scr_stat *scp, int color);
#define save_palette(scp, pal) (*biosvidsw.save_palette)((scp)->adp, pal)
#define load_palette(scp, pal) (*biosvidsw.load_palette)((scp)->adp, pal)
-#define set_border(scp, col) (*biosvidsw.set_border)((scp)->adp, col)
#define get_adapter(scp) (*biosvidsw.adapter)((scp)->adp)
int add_scrn_saver(void (*this)(int));
diff --git a/sys/i386/isa/vesa.c b/sys/i386/isa/vesa.c
index 768b647..ab8588f 100644
--- a/sys/i386/isa/vesa.c
+++ b/sys/i386/isa/vesa.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: vesa.c,v 1.1 1998/09/15 18:16:38 sos Exp $
*/
#include "sc.h"
@@ -133,9 +133,10 @@ static int vesa_bios_load_palette(int start, int colors, u_char *palette);
#define STATE_ALL (STATE_HW | STATE_DATA | STATE_DAC | STATE_REG)
static int vesa_bios_state_buf_size(void);
static int vesa_bios_save_restore(int code, void *p, size_t size);
-static int translate_flags(u_int16_t vflags);
+static int vesa_map_gen_mode_num(int type, int color, int mode);
+static int vesa_translate_flags(u_int16_t vflags);
static int vesa_bios_init(void);
-static void clear_modes(video_info_t *info, int color);
+static void vesa_clear_modes(video_info_t *info, int color);
static void
dump_buffer(u_char *buf, size_t len)
@@ -282,8 +283,30 @@ vesa_bios_save_restore(int code, void *p, size_t size)
return ((err != 0) || (vmf.vmf_eax != 0x4f));
}
+/* map a generic video mode to a known mode */
static int
-translate_flags(u_int16_t vflags)
+vesa_map_gen_mode_num(int type, int color, int mode)
+{
+ static struct {
+ int from;
+ int to;
+ } mode_map[] = {
+ { M_TEXT_132x25, M_VESA_C132x25 },
+ { M_TEXT_132x43, M_VESA_C132x43 },
+ { M_TEXT_132x50, M_VESA_C132x50 },
+ { M_TEXT_132x60, M_VESA_C132x60 },
+ };
+ int i;
+
+ for (i = 0; i < sizeof(mode_map)/sizeof(mode_map[0]); ++i) {
+ if (mode_map[i].from == mode)
+ return mode_map[i].to;
+ }
+ return mode;
+}
+
+static int
+vesa_translate_flags(u_int16_t vflags)
{
static struct {
u_int16_t mask;
@@ -373,8 +396,8 @@ vesa_bios_init(void)
vesa_vmode[modes].vi_buffer = vmode.v_lfb;
vesa_vmode[modes].vi_buffer_size = vmode.v_offscreen;
/* pixel format, memory model... */
- vesa_vmode[modes].vi_flags = translate_flags(vmode.v_modeattr)
- | V_INFO_VESA;
+ vesa_vmode[modes].vi_flags
+ = vesa_translate_flags(vmode.v_modeattr) | V_INFO_VESA;
++modes;
}
vesa_vmode[modes].vi_mode = EOT;
@@ -386,7 +409,7 @@ vesa_bios_init(void)
}
static void
-clear_modes(video_info_t *info, int color)
+vesa_clear_modes(video_info_t *info, int color)
{
while (info->vi_mode != EOT) {
if ((info->vi_flags & V_INFO_COLOR) != color)
@@ -432,6 +455,9 @@ vesa_get_info(int ad, int mode, video_info_t *info)
if (ad != vesa_adp->va_index)
return 1;
+
+ mode = vesa_map_gen_mode_num(vesa_adp->va_type,
+ vesa_adp->va_flags & V_ADP_COLOR, mode);
for (i = 0; vesa_vmode[i].vi_mode != EOT; ++i) {
if (vesa_vmode[i].vi_mode == NA)
continue;
@@ -490,6 +516,8 @@ vesa_set_mode(int ad, int mode)
if (ad != vesa_adp->va_index)
return (*prevvidsw.set_mode)(ad, mode);
+ mode = vesa_map_gen_mode_num(vesa_adp->va_type,
+ vesa_adp->va_flags & V_ADP_COLOR, mode);
#ifdef SC_VIDEO_DEBUG
printf("VESA: set_mode(): %d(%x) -> %d(%x)\n",
vesa_adp->va_mode, vesa_adp->va_mode, mode, mode);
@@ -697,6 +725,11 @@ vesa_diag(int level)
u_int32_t p;
int i;
+#ifndef VESA_MODULE
+ /* call the previous handler first */
+ (*prevvidsw.diag)(level);
+#endif
+
/* general adapter information */
printf("VESA: v%d.%d, %dk memory, flags:0x%x, mode table:%p (%x)\n",
((vesa_adp_info->v_version & 0xf000) >> 12) * 10
@@ -806,9 +839,9 @@ vesa_load(void)
/* remove conflicting modes if we have more than one adapter */
if (adapters > 1) {
- clear_modes(vesa_vmode,
- (vesa_adp->va_flags & V_ADP_COLOR) ?
- V_INFO_COLOR : 0);
+ vesa_clear_modes(vesa_vmode,
+ (vesa_adp->va_flags & V_ADP_COLOR) ?
+ V_INFO_COLOR : 0);
}
#ifdef VESA_MODULE
diff --git a/sys/i386/isa/videoio.c b/sys/i386/isa/videoio.c
index 85c8f8d..681134c 100644
--- a/sys/i386/isa/videoio.c
+++ b/sys/i386/isa/videoio.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: videoio.c,v 1.1 1998/09/15 18:16:38 sos Exp $
*/
#include "sc.h"
@@ -189,6 +189,7 @@ static int rows_offset = 1;
static void map_mode_table(u_char *map[], u_char *table, int max);
static void clear_mode_map(int ad, u_char *map[], int max, int color);
static int map_mode_num(int mode);
+static int map_gen_mode_num(int type, int color, int mode);
static int map_bios_mode_num(int type, int color, int bios_mode);
static u_char *get_mode_param(int mode);
static void fill_adapter_param(int code, video_adapter_t *adp);
@@ -249,7 +250,7 @@ clear_mode_map(int ad, u_char *map[], int max, int color)
}
}
-/* the non-standard video mode is based on a standard mode... */
+/* map the non-standard video mode to a known mode number */
static int
map_mode_num(int mode)
{
@@ -276,6 +277,58 @@ map_mode_num(int mode)
return mode;
}
+/* map a generic video mode to a known mode number */
+static int
+map_gen_mode_num(int type, int color, int mode)
+{
+ static struct {
+ int from;
+ int to_color;
+ int to_mono;
+ } mode_map[] = {
+ { M_TEXT_80x30, M_VGA_C80x30, M_VGA_M80x30, },
+ { M_TEXT_80x43, M_ENH_C80x43, M_ENH_B80x43, },
+ { M_TEXT_80x50, M_VGA_C80x50, M_VGA_M80x50, },
+ { M_TEXT_80x60, M_VGA_C80x60, M_VGA_M80x60, },
+ };
+ int i;
+
+ if (mode == M_TEXT_80x25) {
+ switch (type) {
+
+ case KD_VGA:
+ if (color)
+ return M_VGA_C80x25;
+ else
+ return M_VGA_M80x25;
+ break;
+
+ case KD_EGA:
+ if (color)
+ return M_ENH_C80x25;
+ else
+ return M_EGAMONO80x25;
+ break;
+
+ case KD_CGA:
+ return M_C80x25;
+
+ case KD_MONO:
+ case KD_HERCULES:
+ return M_EGAMONO80x25; /* XXX: this name is confusing */
+
+ default:
+ return -1;
+ }
+ }
+
+ for (i = 0; i < sizeof(mode_map)/sizeof(mode_map[0]); ++i) {
+ if (mode_map[i].from == mode)
+ return ((color) ? mode_map[i].to_color : mode_map[i].to_mono);
+ }
+ return mode;
+}
+
/* turn the BIOS video number into our video mode number */
static int
map_bios_mode_num(int type, int color, int bios_mode)
@@ -356,7 +409,7 @@ static u_char
{
if (mode >= V_MODE_MAP_SIZE)
mode = map_mode_num(mode);
- if (mode < V_MODE_MAP_SIZE)
+ if ((mode >= 0) && (mode < V_MODE_MAP_SIZE))
return mode_map[mode];
else
return NULL;
@@ -480,9 +533,14 @@ comp_adpregs(u_char *buf1, u_char *buf2)
return (identical) ? COMP_IDENTICAL : COMP_SIMILAR;
}
-/* exported functions */
+/* entry points */
-/* all adapters */
+/*
+ * init()
+ * Return the # of video adapters found; usually 1 or 0.
+ *
+ * all adapters
+ */
static int
vid_init(void)
{
@@ -739,7 +797,13 @@ vid_init(void)
return adapters;
}
-/* all adapters */
+/*
+ * adapter();
+ * Return a pointer to the video_adapter structure of the requested
+ * adapter.
+ *
+ * all adapters
+ */
static video_adapter_t
*vid_adapter(int ad)
{
@@ -750,7 +814,12 @@ static video_adapter_t
return &adapter[ad];
}
-/* all adapters */
+/*
+ * get_info():
+ * Return the video_info structure of the requested video mode.
+ *
+ * all adapters
+ */
static int
vid_get_info(int ad, int mode, video_info_t *info)
{
@@ -761,6 +830,8 @@ vid_get_info(int ad, int mode, video_info_t *info)
if ((ad < 0) || (ad >= adapters))
return 1;
+ mode = map_gen_mode_num(adapter[ad].va_type,
+ adapter[ad].va_flags & V_ADP_COLOR, mode);
if (adapter[ad].va_flags & V_ADP_MODECHANGE) {
/*
* If the parameter table entry for this mode is not found,
@@ -789,7 +860,14 @@ vid_get_info(int ad, int mode, video_info_t *info)
return 1;
}
-/* all adapters */
+/*
+ * query_mode():
+ * Find a video mode matching the requested parameters.
+ * Fields filled with 0 are considered "don't care" fields and
+ * match any modes.
+ *
+ * all adapters
+ */
static int
vid_query_mode(int ad, video_info_t *info)
{
@@ -836,7 +914,12 @@ vid_query_mode(int ad, video_info_t *info)
return -1;
}
-/* EGA/VGA */
+/*
+ * set_mode():
+ * Change the video mode.
+ *
+ * EGA/VGA
+ */
static int
vid_set_mode(int ad, int mode)
{
@@ -845,6 +928,8 @@ vid_set_mode(int ad, int mode)
prologue(ad, V_ADP_MODECHANGE, 1);
+ mode = map_gen_mode_num(adapter[ad].va_type,
+ adapter[ad].va_flags & V_ADP_COLOR, mode);
if (vid_get_info(ad, mode, &info))
return 1;
params.sig = V_STATE_SIG;
@@ -1061,7 +1146,12 @@ set_normal_mode(video_adapter_t *adp, u_char *buf)
splx(s);
}
-/* EGA/VGA */
+/*
+ * save_font():
+ * Read the font data in the requested font page from the video adapter.
+ *
+ * EGA/VGA
+ */
static int
vid_save_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
{
@@ -1092,6 +1182,7 @@ vid_save_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
if (page > 3)
segment -= 0xe000;
+#ifndef SC_BAD_FLICKER
if (adapter[ad].va_type == KD_VGA) { /* what about EGA? XXX */
s = splhigh();
outb(TSIDX, 0x00); outb(TSREG, 0x01);
@@ -1100,6 +1191,7 @@ vid_save_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
outb(TSIDX, 0x00); outb(TSREG, 0x03);
splx(s);
}
+#endif
set_font_mode(&adapter[ad], buf);
if (fontsize == 32) {
@@ -1114,6 +1206,7 @@ vid_save_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
}
set_normal_mode(&adapter[ad], buf);
+#ifndef SC_BAD_FLICKER
if (adapter[ad].va_type == KD_VGA) {
s = splhigh();
outb(TSIDX, 0x00); outb(TSREG, 0x01);
@@ -1121,11 +1214,19 @@ vid_save_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
outb(TSIDX, 0x00); outb(TSREG, 0x03);
splx(s);
}
+#endif
return 0;
}
-/* EGA/VGA */
+/*
+ * load_font():
+ * Set the font data in the requested font page.
+ * NOTE: it appears that some recent video adapters do not support
+ * the font page other than 0... XXX
+ *
+ * EGA/VGA
+ */
static int
vid_load_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
{
@@ -1156,6 +1257,7 @@ vid_load_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
if (page > 3)
segment -= 0xe000;
+#ifndef SC_BAD_FLICKER
if (adapter[ad].va_type == KD_VGA) { /* what about EGA? XXX */
s = splhigh();
outb(TSIDX, 0x00); outb(TSREG, 0x01);
@@ -1164,6 +1266,7 @@ vid_load_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
outb(TSIDX, 0x00); outb(TSREG, 0x03);
splx(s);
}
+#endif
set_font_mode(&adapter[ad], buf);
if (fontsize == 32) {
@@ -1178,6 +1281,7 @@ vid_load_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
}
set_normal_mode(&adapter[ad], buf);
+#ifndef SC_BAD_FLICKER
if (adapter[ad].va_type == KD_VGA) {
s = splhigh();
outb(TSIDX, 0x00); outb(TSREG, 0x01);
@@ -1185,11 +1289,19 @@ vid_load_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
outb(TSIDX, 0x00); outb(TSREG, 0x03);
splx(s);
}
+#endif
return 0;
}
-/* EGA/VGA */
+/*
+ * show_font():
+ * Activate the requested font page.
+ * NOTE: it appears that some recent video adapters do not support
+ * the font page other than 0... XXX
+ *
+ * EGA/VGA
+ */
static int
vid_show_font(int ad, int page)
{
@@ -1207,7 +1319,12 @@ vid_show_font(int ad, int page)
return 0;
}
-/* VGA */
+/*
+ * save_palette():
+ * Read DAC values. The values have expressed in 8 bits.
+ *
+ * VGA
+ */
static int
vid_save_palette(int ad, u_char *palette)
{
@@ -1226,7 +1343,12 @@ vid_save_palette(int ad, u_char *palette)
return 0;
}
-/* VGA */
+/*
+ * load_palette():
+ * Set DAC values.
+ *
+ * VGA
+ */
static int
vid_load_palette(int ad, u_char *palette)
{
@@ -1243,7 +1365,12 @@ vid_load_palette(int ad, u_char *palette)
return 0;
}
-/* CGA/EGA/VGA */
+/*
+ * set_border():
+ * Change the border color.
+ *
+ * CGA/EGA/VGA
+ */
static int
vid_set_border(int ad, int color)
{
@@ -1266,7 +1393,14 @@ vid_set_border(int ad, int color)
return 0;
}
-/* VGA */
+/*
+ * save_state():
+ * Read video register values.
+ * NOTE: this function only reads the standard EGA/VGA registers.
+ * any extra/extended registers of SVGA adapters are not saved.
+ *
+ * VGA
+ */
static int
vid_save_state(int ad, void *p, size_t size)
{
@@ -1345,7 +1479,14 @@ vid_save_state(int ad, void *p, size_t size)
return 0;
}
-/* EGA/VGA */
+/*
+ * load_state():
+ * Set video registers at once.
+ * NOTE: this function only updates the standard EGA/VGA registers.
+ * any extra/extended registers of SVGA adapters are not changed.
+ *
+ * EGA/VGA
+ */
static int
vid_load_state(int ad, void *p)
{
@@ -1402,7 +1543,10 @@ vid_load_state(int ad, void *p)
return 0;
}
-/* all */
+/*
+ * set_origin():
+ * Change the origin (window mapping) of the banked frame buffer.
+ */
static int
vid_set_origin(int ad, off_t offset)
{
@@ -1413,7 +1557,12 @@ vid_set_origin(int ad, off_t offset)
return 1;
}
-/* all */
+/*
+ * read_hw_cursor():
+ * Read the position of the hardware text cursor.
+ *
+ * all adapters
+ */
static int
vid_read_hw_cursor(int ad, int *col, int *row)
{
@@ -1440,7 +1589,13 @@ vid_read_hw_cursor(int ad, int *col, int *row)
return 0;
}
-/* all */
+/*
+ * set_hw_cursor():
+ * Move the hardware text cursor. If the requested position is (-1, -1),
+ * the text cursor won't be shown.
+ *
+ * all adapters
+ */
static int
vid_set_hw_cursor(int ad, int col, int row)
{
@@ -1540,6 +1695,13 @@ dump_buffer(u_char *buf, size_t len)
}
}
+/*
+ * diag():
+ * Print some information about the video adapter and video modes,
+ * with requested level of details.
+ *
+ * all adapters
+ */
static int
vid_diag(int level)
{
OpenPOWER on IntegriCloud