Sync with sys/i386/isa/syscons.c and syscons.h revisions 1.229 and

1.36, respectively.
This commit is contained in:
KATO Takenori 1997-11-25 09:51:46 +00:00
parent 681be1a529
commit 0e9aeea5a4
2 changed files with 233 additions and 146 deletions

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* $Id: syscons.c,v 1.61 1997/10/27 10:58:30 kato Exp $ * $Id: syscons.c,v 1.62 1997/11/07 12:54:00 kato Exp $
*/ */
#include "sc.h" #include "sc.h"
@ -102,6 +102,9 @@
#define COLD 0 #define COLD 0
#define WARM 1 #define WARM 1
#define MODE_MAP_SIZE (M_VGA_CG320 + 1)
#define MODE_PARAM_SIZE 64
/* XXX use sc_bcopy where video memory is concerned */ /* XXX use sc_bcopy where video memory is concerned */
#define sc_bcopy generic_bcopy #define sc_bcopy generic_bcopy
extern void generic_bcopy(const void *, void *, size_t); extern void generic_bcopy(const void *, void *, size_t);
@ -173,7 +176,10 @@ extern
#endif #endif
unsigned char font_16[256*16]; unsigned char font_16[256*16];
char palette[256*3]; char palette[256*3];
static char vgaregs[64]; static char *mode_map[MODE_MAP_SIZE];
static char vgaregs[MODE_PARAM_SIZE];
static char vgaregs2[MODE_PARAM_SIZE];
static int rows_offset = 1;
static char *cut_buffer; static char *cut_buffer;
static u_short mouse_and_mask[16] = { static u_short mouse_and_mask[16] = {
0xc000, 0xe000, 0xf000, 0xf800, 0xc000, 0xe000, 0xf000, 0xf800,
@ -245,6 +251,9 @@ static int sckbdprobe(int unit, int flags);
static void scstart(struct tty *tp); static void scstart(struct tty *tp);
static void scmousestart(struct tty *tp); static void scmousestart(struct tty *tp);
static void scinit(void); static void scinit(void);
static void map_mode_table(char *map[], char *table, int max);
static u_char map_mode_num(u_char mode);
static char *get_mode_param(scr_stat *scp, u_char mode);
static u_int scgetc(u_int flags); static u_int scgetc(u_int flags);
#define SCGETC_CN 1 #define SCGETC_CN 1
#define SCGETC_NONBLOCK 2 #define SCGETC_NONBLOCK 2
@ -271,10 +280,14 @@ static void set_keyboard(int command, int data);
static void update_leds(int which); static void update_leds(int which);
static void set_vgaregs(char *modetable); static void set_vgaregs(char *modetable);
static void read_vgaregs(char *buf); static void read_vgaregs(char *buf);
#define COMP_IDENTICAL 0
#define COMP_SIMILAR 1
#define COMP_DIFFERENT 2
static int comp_vgaregs(u_char *buf1, u_char *buf2); static int comp_vgaregs(u_char *buf1, u_char *buf2);
static void dump_vgaregs(u_char *buf); static void dump_vgaregs(u_char *buf);
static void set_font_mode(void); #define PARAM_BUFSIZE 6
static void set_normal_mode(void); static void set_font_mode(u_char *buf);
static void set_normal_mode(u_char *buf);
static void set_destructive_cursor(scr_stat *scp); static void set_destructive_cursor(scr_stat *scp);
static void set_mouse_pos(scr_stat *scp); static void set_mouse_pos(scr_stat *scp);
static void mouse_cut_start(scr_stat *scp); static void mouse_cut_start(scr_stat *scp);
@ -550,7 +563,7 @@ scvidprobe(int unit, int flags)
if (ISMAPPED(pa, sizeof(u_long))) { if (ISMAPPED(pa, sizeof(u_long))) {
segoff = *(u_long *)pa_to_va(pa); segoff = *(u_long *)pa_to_va(pa);
pa = (((segoff & 0xffff0000) >> 12) + (segoff & 0xffff)); pa = (((segoff & 0xffff0000) >> 12) + (segoff & 0xffff));
if (ISMAPPED(pa, 64)) if (ISMAPPED(pa, MODE_PARAM_SIZE))
video_mode_ptr = (char *)pa_to_va(pa); video_mode_ptr = (char *)pa_to_va(pa);
} }
} }
@ -731,6 +744,7 @@ scattach(struct isa_device *dev)
{ {
scr_stat *scp; scr_stat *scp;
dev_t cdev = makedev(CDEV_MAJOR, 0); dev_t cdev = makedev(CDEV_MAJOR, 0);
char *p;
#ifdef DEVFS #ifdef DEVFS
int vc; int vc;
#endif #endif
@ -795,18 +809,26 @@ scattach(struct isa_device *dev)
update_leds(scp->status); update_leds(scp->status);
#ifndef PC98 #ifndef PC98
if (bootverbose) { if ((crtc_type == KD_VGA) && bootverbose) {
printf("sc%d: BIOS video mode:%d\n", printf("sc%d: BIOS video mode:%d\n",
dev->id_unit, *(u_char *)pa_to_va(0x449)); dev->id_unit, *(u_char *)pa_to_va(0x449));
printf("sc%d: VGA registers upon power-up\n", dev->id_unit); printf("sc%d: VGA registers upon power-up\n", dev->id_unit);
dump_vgaregs(vgaregs); dump_vgaregs(vgaregs);
printf("sc%d: video mode:%d\n", dev->id_unit, scp->mode); printf("sc%d: video mode:%d\n", dev->id_unit, scp->mode);
if (video_mode_ptr != NULL) { printf("sc%d: VGA registers in BIOS for mode:%d\n",
printf("sc%d: VGA registers for mode:%d\n",
dev->id_unit, scp->mode); dev->id_unit, scp->mode);
dump_vgaregs(video_mode_ptr + (64*scp->mode)); dump_vgaregs(vgaregs2);
p = get_mode_param(scp, scp->mode);
if (p != NULL) {
printf("sc%d: VGA registers to be used for mode:%d\n",
dev->id_unit, scp->mode);
dump_vgaregs(p);
} }
printf("sc%d: rows_offset:%d\n", dev->id_unit, rows_offset);
} }
if ((crtc_type == KD_VGA) && (video_mode_ptr == NULL))
printf("sc%d: WARNING: video mode switching is only partially supported\n",
dev->id_unit);
#endif #endif
printf("sc%d: ", dev->id_unit); printf("sc%d: ", dev->id_unit);
@ -1043,11 +1065,12 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
int error; int error;
u_int i; u_int i;
struct tty *tp; struct tty *tp;
scr_stat *scp;
u_short *usp; u_short *usp;
#ifdef PC98 #ifdef PC98
u_short *atr_usp; u_short *atr_usp;
#endif #endif
scr_stat *scp; char *mp;
tp = scdevtotty(dev); tp = scdevtotty(dev);
if (!tp) if (!tp)
@ -1414,8 +1437,12 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
case SW_ENH_B80x43: case SW_ENH_C80x43: case SW_ENH_B80x43: case SW_ENH_C80x43:
case SW_EGAMONO80x25: case SW_EGAMONO80x25:
if (!crtc_vga || video_mode_ptr == NULL) if (!crtc_vga)
return ENXIO; return ENODEV;
mp = get_mode_param(scp, cmd & 0xff);
if (mp == NULL)
return ENODEV;
if (scp->history != NULL) if (scp->history != NULL)
i = imax(scp->history_size / scp->xsize i = imax(scp->history_size / scp->xsize
- imax(SC_HISTORY_SIZE, scp->ysize), 0); - imax(SC_HISTORY_SIZE, scp->ysize), 0);
@ -1451,9 +1478,8 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
default: default:
if ((cmd & 0xff) > M_VGA_CG320) if ((cmd & 0xff) > M_VGA_CG320)
return EINVAL; return EINVAL;
else scp->xsize = mp[0];
scp->xsize = *(video_mode_ptr+((cmd&0xff)*64)); scp->ysize = mp[1] + rows_offset;
scp->ysize = *(video_mode_ptr+((cmd&0xff)*64)+1)+1;
break; break;
} }
scp->mode = cmd & 0xff; scp->mode = cmd & 0xff;
@ -1485,6 +1511,7 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
set_mode(scp); set_mode(scp);
scp->status &= ~UNKNOWN_MODE; scp->status &= ~UNKNOWN_MODE;
clear_screen(scp); clear_screen(scp);
if (tp->t_winsize.ws_col != scp->xsize if (tp->t_winsize.ws_col != scp->xsize
|| tp->t_winsize.ws_row != scp->ysize) { || tp->t_winsize.ws_row != scp->ysize) {
tp->t_winsize.ws_col = scp->xsize; tp->t_winsize.ws_col = scp->xsize;
@ -1499,12 +1526,15 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
case SW_CG640x350: case SW_ENH_CG640: case SW_CG640x350: case SW_ENH_CG640:
case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320: case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320:
if (!crtc_vga || video_mode_ptr == NULL) if (!crtc_vga)
return ENXIO; return ENODEV;
mp = get_mode_param(scp, cmd & 0xff);
if (mp == NULL)
return ENODEV;
scp->mode = cmd & 0xFF; scp->mode = cmd & 0xFF;
scp->xpixel = (*(video_mode_ptr + (scp->mode*64))) * 8; scp->xpixel = mp[0] * 8;
scp->ypixel = (*(video_mode_ptr + (scp->mode*64) + 1) + 1) * scp->ypixel = (mp[1] + rows_offset) * mp[2];
(*(video_mode_ptr + (scp->mode*64) + 2));
if (scp == cur_console) if (scp == cur_console)
set_mode(scp); set_mode(scp);
scp->status |= UNKNOWN_MODE; /* graphics mode */ scp->status |= UNKNOWN_MODE; /* graphics mode */
@ -1519,8 +1549,12 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return 0; return 0;
case SW_VGA_MODEX: case SW_VGA_MODEX:
if (!crtc_vga || video_mode_ptr == NULL) if (!crtc_vga)
return ENXIO; return ENODEV;
mp = get_mode_param(scp, cmd & 0xff);
if (mp == NULL)
return ENODEV;
scp->mode = cmd & 0xFF; scp->mode = cmd & 0xFF;
if (scp == cur_console) if (scp == cur_console)
set_mode(scp); set_mode(scp);
@ -1661,7 +1695,7 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
#ifdef PC98 #ifdef PC98
scp->status &= ~UNKNOWN_MODE; scp->status &= ~UNKNOWN_MODE;
#else #else
if (crtc_vga && video_mode_ptr) if (crtc_vga)
#endif #endif
set_mode(scp); set_mode(scp);
scp->status &= ~UNKNOWN_MODE; scp->status &= ~UNKNOWN_MODE;
@ -2352,7 +2386,7 @@ exchange_scr(void)
if (old_scp->mode != new_scp->mode || (old_scp->status & UNKNOWN_MODE) || (new_scp->status & UNKNOWN_MODE)){ if (old_scp->mode != new_scp->mode || (old_scp->status & UNKNOWN_MODE) || (new_scp->status & UNKNOWN_MODE)){
#else #else
if (old_scp->mode != new_scp->mode || (old_scp->status & UNKNOWN_MODE)){ if (old_scp->mode != new_scp->mode || (old_scp->status & UNKNOWN_MODE)){
if (crtc_vga && video_mode_ptr) if (crtc_vga)
#endif #endif
set_mode(new_scp); set_mode(new_scp);
} }
@ -3614,8 +3648,36 @@ scinit(void)
#ifndef PC98 #ifndef PC98
/* discard the video mode table if we are not familiar with it... */ /* discard the video mode table if we are not familiar with it... */
if (video_mode_ptr) { if (video_mode_ptr) {
if (comp_vgaregs(vgaregs, video_mode_ptr + 64*console[0]->mode)) bzero(mode_map, sizeof(mode_map));
bcopy(video_mode_ptr + MODE_PARAM_SIZE*console[0]->mode,
vgaregs2, sizeof(vgaregs2));
switch (comp_vgaregs(vgaregs, video_mode_ptr
+ MODE_PARAM_SIZE*console[0]->mode)) {
case COMP_IDENTICAL:
map_mode_table(mode_map, video_mode_ptr, M_VGA_CG320 + 1);
/*
* This is a kludge for Toshiba DynaBook SS433 whose BIOS video
* mode table entry has the actual # of rows at the offset 1;
* BIOSes from other manufacturers store the # of rows - 1 there.
* XXX
*/
rows_offset = vgaregs[1] + 1
- video_mode_ptr[MODE_PARAM_SIZE*console[0]->mode + 1];
break;
case COMP_SIMILAR:
map_mode_table(mode_map, video_mode_ptr, M_VGA_CG320 + 1);
mode_map[console[0]->mode] = vgaregs;
rows_offset = vgaregs[1] + 1
- video_mode_ptr[MODE_PARAM_SIZE*console[0]->mode + 1];
vgaregs[1] -= rows_offset - 1;
break;
case COMP_DIFFERENT:
default:
video_mode_ptr = NULL; video_mode_ptr = NULL;
mode_map[console[0]->mode] = vgaregs;
rows_offset = 1;
break;
}
} }
#endif #endif
/* copy screen to temporary buffer */ /* copy screen to temporary buffer */
@ -3649,6 +3711,54 @@ scinit(void)
#endif #endif
} }
static void
map_mode_table(char *map[], char *table, int max)
{
int i;
for(i = 0; i < max; ++i)
map[i] = table + i*MODE_PARAM_SIZE;
for(; i < MODE_MAP_SIZE; ++i)
map[i] = NULL;
}
static u_char
map_mode_num(u_char mode)
{
static struct {
u_char from;
u_char to;
} mode_map[] = {
{ M_ENH_B80x43, M_ENH_B80x25 },
{ M_ENH_C80x43, M_ENH_C80x25 },
{ M_VGA_M80x30, M_VGA_M80x25 },
{ M_VGA_C80x30, M_VGA_C80x25 },
{ M_VGA_M80x50, M_VGA_M80x25 },
{ M_VGA_C80x50, M_VGA_C80x25 },
{ M_VGA_M80x60, M_VGA_M80x25 },
{ M_VGA_C80x60, M_VGA_C80x25 },
{ M_VGA_MODEX, M_VGA_CG320 },
};
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 char
*get_mode_param(scr_stat *scp, u_char mode)
{
if (mode >= MODE_MAP_SIZE)
mode = map_mode_num(mode);
if (mode < MODE_MAP_SIZE)
return mode_map[mode];
else
return NULL;
}
static scr_stat static scr_stat
*alloc_scp() *alloc_scp()
{ {
@ -3704,6 +3814,7 @@ init_scp(scr_stat *scp)
scp->mode = M_B80x25; scp->mode = M_B80x25;
else else
scp->mode = M_C80x25; scp->mode = M_C80x25;
scp->initial_mode = scp->mode;
#endif #endif
scp->font_size = 16; scp->font_size = 16;
@ -4497,12 +4608,22 @@ update_leds(int which)
void void
set_mode(scr_stat *scp) set_mode(scr_stat *scp)
{ {
char *modetable; char special_modetable[MODE_PARAM_SIZE];
char special_modetable[64]; char *mp;
if (scp != cur_console) if (scp != cur_console)
return; return;
/*
* even if mode switching is disabled, we can change back
* to the initial mode or the custom mode based on the initial
* mode if we have saved register values upon start-up.
*/
mp = get_mode_param(scp, scp->mode);
if (mp == NULL)
return;
bcopy(mp, &special_modetable, sizeof(special_modetable));
/* setup video hardware for the given mode */ /* setup video hardware for the given mode */
#ifdef PC98 #ifdef PC98
#ifdef LINE30 #ifdef LINE30
@ -4528,24 +4649,12 @@ set_mode(scr_stat *scp)
} }
#else /* IBM-PC */ #else /* IBM-PC */
switch (scp->mode) { switch (scp->mode) {
case M_VGA_M80x60: case M_VGA_C80x60: case M_VGA_M80x60:
bcopy(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64);
goto special_80x60;
case M_VGA_C80x60:
bcopy(video_mode_ptr+(64*M_VGA_C80x25), &special_modetable, 64);
special_80x60:
special_modetable[2] = 0x08; special_modetable[2] = 0x08;
special_modetable[19] = 0x47; special_modetable[19] = 0x47;
goto special_480l; goto special_480l;
case M_VGA_M80x30: case M_VGA_C80x30: case M_VGA_M80x30:
bcopy(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64);
goto special_80x30;
case M_VGA_C80x30:
bcopy(video_mode_ptr+(64*M_VGA_C80x25), &special_modetable, 64);
special_80x30:
special_modetable[19] = 0x4f; special_modetable[19] = 0x4f;
special_480l: special_480l:
special_modetable[9] |= 0xc0; special_modetable[9] |= 0xc0;
@ -4555,29 +4664,16 @@ set_mode(scr_stat *scp)
special_modetable[28] = 0xdf; special_modetable[28] = 0xdf;
special_modetable[31] = 0xe7; special_modetable[31] = 0xe7;
special_modetable[32] = 0x04; special_modetable[32] = 0x04;
modetable = special_modetable;
goto setup_mode; goto setup_mode;
case M_ENH_B80x43: case M_ENH_C80x43: case M_ENH_B80x43:
bcopy(video_mode_ptr+(64*M_ENH_B80x25), &special_modetable, 64);
goto special_80x43;
case M_ENH_C80x43:
bcopy(video_mode_ptr+(64*M_ENH_C80x25), &special_modetable, 64);
special_80x43:
special_modetable[28] = 87; special_modetable[28] = 87;
goto special_80x50; goto special_80x50;
case M_VGA_M80x50: case M_VGA_C80x50: case M_VGA_M80x50:
bcopy(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64);
goto special_80x50;
case M_VGA_C80x50:
bcopy(video_mode_ptr+(64*M_VGA_C80x25), &special_modetable, 64);
special_80x50: special_80x50:
special_modetable[2] = 8; special_modetable[2] = 8;
special_modetable[19] = 7; special_modetable[19] = 7;
modetable = special_modetable;
goto setup_mode; goto setup_mode;
case M_VGA_C40x25: case M_VGA_C80x25: case M_VGA_C40x25: case M_VGA_C80x25:
@ -4588,10 +4684,9 @@ set_mode(scr_stat *scp)
case M_ENH_B80x25: case M_ENH_C80x25: case M_ENH_B80x25: case M_ENH_C80x25:
case M_EGAMONO80x25: case M_EGAMONO80x25:
modetable = video_mode_ptr + (scp->mode * 64);
setup_mode: setup_mode:
set_vgaregs(modetable); set_vgaregs(special_modetable);
scp->font_size = *(modetable + 2); scp->font_size = special_modetable[2];
/* set font type (size) */ /* set font type (size) */
if (scp->font_size < 14) { if (scp->font_size < 14) {
@ -4613,8 +4708,6 @@ set_mode(scr_stat *scp)
break; break;
case M_VGA_MODEX: case M_VGA_MODEX:
/* start out with std 320x200x256 mode */
bcopy(video_mode_ptr+(64*M_VGA_CG320), &special_modetable, 64);
/* "unchain" the VGA mode */ /* "unchain" the VGA mode */
special_modetable[5-1+0x04] &= 0xf7; special_modetable[5-1+0x04] &= 0xf7;
special_modetable[5-1+0x04] |= 0x04; special_modetable[5-1+0x04] |= 0x04;
@ -4635,17 +4728,15 @@ set_mode(scr_stat *scp)
special_modetable[10+0x16] = 0x06; special_modetable[10+0x16] = 0x06;
/* set vertical sync polarity to reflect aspect ratio */ /* set vertical sync polarity to reflect aspect ratio */
special_modetable[9] = 0xe3; special_modetable[9] = 0xe3;
modetable = special_modetable;
goto setup_grmode; goto setup_grmode;
case M_BG320: case M_CG320: case M_BG640: case M_BG320: case M_CG320: case M_BG640:
case M_CG320_D: case M_CG640_E: case M_CG320_D: case M_CG640_E:
case M_CG640x350: case M_ENH_CG640: case M_CG640x350: case M_ENH_CG640:
case M_BG640x480: case M_CG640x480: case M_VGA_CG320: case M_BG640x480: case M_CG640x480: case M_VGA_CG320:
modetable = video_mode_ptr + (scp->mode * 64);
setup_grmode: setup_grmode:
set_vgaregs(modetable); set_vgaregs(special_modetable);
scp->font_size = FONT_NONE; scp->font_size = FONT_NONE;
break; break;
@ -4726,7 +4817,7 @@ read_vgaregs(char *buf)
int i, j; int i, j;
int s; int s;
bzero(buf, 64); bzero(buf, MODE_PARAM_SIZE);
s = splhigh(); s = splhigh();
@ -4767,25 +4858,57 @@ read_vgaregs(char *buf)
static int static int
comp_vgaregs(u_char *buf1, u_char *buf2) comp_vgaregs(u_char *buf1, u_char *buf2)
{ {
static struct {
u_char mask;
} params[MODE_PARAM_SIZE] = {
0xff, 0x00, 0xff, /* COLS, ROWS, POINTS */
0xff, 0xff, /* page length */
0xfe, 0xff, 0xff, 0xff, /* sequencer registers */
0xf3, /* misc register */
0xff, 0xff, 0xff, 0x7f, 0xff, /* CRTC */
0xff, 0xff, 0xff, 0x7f, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xff, 0x7f, 0xff, 0xff,
0x7f, 0xff, 0xff, 0xef, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, /* attribute controller registers */
0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, /* GDC register */
0xff, 0xff, 0xff, 0xff,
};
int identical = TRUE;
int i; int i;
for (i = 0; i < sizeof(params)/sizeof(params[0]); ++i) {
if (params[i].mask == 0) /* don't care */
continue;
if ((buf1[i] & params[i].mask) != (buf2[i] & params[i].mask))
return COMP_DIFFERENT;
if (buf1[i] != buf2[i])
identical = FALSE;
}
return (identical) ? COMP_IDENTICAL : COMP_SIMILAR;
#if 0
for(i = 0; i < 20; ++i) { for(i = 0; i < 20; ++i) {
if (*buf1++ != *buf2++) if (*buf1++ != *buf2++)
return 1; return COMP_DIFFERENT;
} }
buf1 += 2; /* skip the cursor shape */ buf1 += 2; /* skip the cursor shape */
buf2 += 2; buf2 += 2;
for(i = 22; i < 24; ++i) { for(i = 22; i < 24; ++i) {
if (*buf1++ != *buf2++) if (*buf1++ != *buf2++)
return 1; return COMP_DIFFERENT;
} }
buf1 += 2; /* skip the cursor position */ buf1 += 2; /* skip the cursor position */
buf2 += 2; buf2 += 2;
for(i = 26; i < 64; ++i) { for(i = 26; i < MODE_PARAM_SIZE; ++i) {
if (*buf1++ != *buf2++) if (*buf1++ != *buf2++)
return 1; return COMP_DIFFERENT;
} }
return 0; return COMP_IDENTICAL;
#endif
} }
static void static void
@ -4793,7 +4916,7 @@ dump_vgaregs(u_char *buf)
{ {
int i; int i;
for(i = 0; i < 64;) { for(i = 0; i < MODE_PARAM_SIZE;) {
printf("%02x ", buf[i]); printf("%02x ", buf[i]);
if ((++i % 16) == 0) if ((++i % 16) == 0)
printf("\n"); printf("\n");
@ -4801,10 +4924,19 @@ dump_vgaregs(u_char *buf)
} }
static void static void
set_font_mode() set_font_mode(u_char *buf)
{ {
int s = splhigh(); int s = splhigh();
/* save register values */
outb(TSIDX, 0x02); buf[0] = inb(TSREG);
outb(TSIDX, 0x04); buf[1] = inb(TSREG);
outb(GDCIDX, 0x04); buf[2] = inb(GDCREG);
outb(GDCIDX, 0x05); buf[3] = inb(GDCREG);
outb(GDCIDX, 0x06); buf[4] = inb(GDCREG);
inb(crtc_addr + 6);
outb(ATC, 0x10); buf[5] = inb(ATC + 1);
/* setup vga for loading fonts (graphics plane mode) */ /* setup vga for loading fonts (graphics plane mode) */
inb(crtc_addr+6); /* reset flip-flop */ inb(crtc_addr+6); /* reset flip-flop */
outb(ATC, 0x10); outb(ATC, 0x01); outb(ATC, 0x10); outb(ATC, 0x01);
@ -4828,80 +4960,36 @@ set_font_mode()
} }
static void static void
set_normal_mode() set_normal_mode(u_char *buf)
{ {
char *modetable; char *modetable;
int s = splhigh(); int s = splhigh();
switch (cur_console->mode) {
case M_VGA_M80x60:
case M_VGA_M80x50:
case M_VGA_M80x30:
modetable = video_mode_ptr + (64*M_VGA_M80x25);
break;
case M_VGA_C80x60:
case M_VGA_C80x50:
case M_VGA_C80x30:
modetable = video_mode_ptr + (64*M_VGA_C80x25);
break;
case M_ENH_B80x43:
modetable = video_mode_ptr + (64*M_ENH_B80x25);
break;
case M_ENH_C80x43:
modetable = video_mode_ptr + (64*M_ENH_C80x25);
break;
case M_VGA_C40x25: case M_VGA_C80x25:
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:
case M_EGAMONO80x25:
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:
modetable = video_mode_ptr + (cur_console->mode * 64);
break;
default:
modetable = video_mode_ptr + (64*M_VGA_C80x25);
}
if (video_mode_ptr == NULL)
modetable = vgaregs;
/* setup vga for normal operation mode again */ /* setup vga for normal operation mode again */
inb(crtc_addr+6); /* reset flip-flop */ inb(crtc_addr+6); /* reset flip-flop */
outb(ATC, 0x10); outb(ATC, modetable[0x10+35]); outb(ATC, 0x10); outb(ATC, buf[5]);
inb(crtc_addr+6); /* reset flip-flop */ inb(crtc_addr+6); /* reset flip-flop */
outb(ATC, 0x20); /* enable palette */ outb(ATC, 0x20); /* enable palette */
#if SLOW_VGA #if SLOW_VGA
outb(TSIDX, 0x02); outb(TSREG, modetable[0x02+4]); outb(TSIDX, 0x02); outb(TSREG, buf[0]);
outb(TSIDX, 0x04); outb(TSREG, modetable[0x04+4]); outb(TSIDX, 0x04); outb(TSREG, buf[1]);
outb(GDCIDX, 0x04); outb(GDCREG, modetable[0x04+55]); outb(GDCIDX, 0x04); outb(GDCREG, buf[2]);
outb(GDCIDX, 0x05); outb(GDCREG, modetable[0x05+55]); outb(GDCIDX, 0x05); outb(GDCREG, buf[3]);
outb(GDCIDX, 0x06); outb(GDCREG, modetable[0x06+55]);
if (crtc_addr == MONO_BASE) { if (crtc_addr == MONO_BASE) {
outb(GDCIDX, 0x06); outb(GDCREG,(modetable[0x06+55] & 0x03) | 0x08); outb(GDCIDX, 0x06); outb(GDCREG,(buf[4] & 0x03) | 0x08);
} } else {
else { outb(GDCIDX, 0x06); outb(GDCREG,(buf[4] & 0x03) | 0x0c);
outb(GDCIDX, 0x06); outb(GDCREG,(modetable[0x06+55] & 0x03) | 0x0c);
} }
#else #else
outw(TSIDX, 0x0002 | (modetable[0x02+4]<<8)); outw(TSIDX, 0x0002 | (buf[0] << 8));
outw(TSIDX, 0x0004 | (modetable[0x04+4]<<8)); outw(TSIDX, 0x0004 | (buf[1] << 8));
outw(GDCIDX, 0x0004 | (modetable[0x04+55]<<8)); outw(GDCIDX, 0x0004 | (buf[2] << 8));
outw(GDCIDX, 0x0005 | (modetable[0x05+55]<<8)); outw(GDCIDX, 0x0005 | (buf[3] << 8));
if (crtc_addr == MONO_BASE) if (crtc_addr == MONO_BASE)
outw(GDCIDX, 0x0006 | (((modetable[0x06+55] & 0x03) | 0x08)<<8)); outw(GDCIDX, 0x0006 | (((buf[4] & 0x03) | 0x08)<<8));
else else
outw(GDCIDX, 0x0006 | (((modetable[0x06+55] & 0x03) | 0x0c)<<8)); outw(GDCIDX, 0x0006 | (((buf[4] & 0x03) | 0x0c)<<8));
#endif #endif
splx(s); splx(s);
} }
@ -4912,12 +5000,9 @@ copy_font(int operation, int font_type, char* font_image)
{ {
#ifndef PC98 #ifndef PC98
int ch, line, segment, fontsize; int ch, line, segment, fontsize;
u_char buf[PARAM_BUFSIZE];
u_char val; u_char val;
/* dont mess with console we dont know video mode on */
if (cur_console->status & UNKNOWN_MODE)
return;
switch (font_type) { switch (font_type) {
default: default:
case FONT_8: case FONT_8:
@ -4935,7 +5020,7 @@ copy_font(int operation, int font_type, char* font_image)
} }
outb(TSIDX, 0x01); val = inb(TSREG); /* disable screen */ outb(TSIDX, 0x01); val = inb(TSREG); /* disable screen */
outb(TSIDX, 0x01); outb(TSREG, val | 0x20); outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
set_font_mode(); set_font_mode(buf);
for (ch=0; ch < 256; ch++) for (ch=0; ch < 256; ch++)
for (line=0; line < fontsize; line++) for (line=0; line < fontsize; line++)
if (operation) if (operation)
@ -4944,7 +5029,7 @@ copy_font(int operation, int font_type, char* font_image)
else else
font_image[(ch*fontsize)+line] = font_image[(ch*fontsize)+line] =
*(char *)pa_to_va(VIDEOMEM+(segment)+(ch*32)+line); *(char *)pa_to_va(VIDEOMEM+(segment)+(ch*32)+line);
set_normal_mode(); set_normal_mode(buf);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); /* enable screen */ outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); /* enable screen */
#endif #endif
} }
@ -4953,12 +5038,12 @@ static void
set_destructive_cursor(scr_stat *scp) set_destructive_cursor(scr_stat *scp)
{ {
#ifndef PC98 #ifndef PC98
u_char buf[PARAM_BUFSIZE];
u_char cursor[32]; u_char cursor[32];
caddr_t address; caddr_t address;
int i; int i;
char *font_buffer; char *font_buffer;
if (scp->font_size < 14) { if (scp->font_size < 14) {
font_buffer = font_8; font_buffer = font_8;
address = (caddr_t)VIDEOMEM + 0x8000; address = (caddr_t)VIDEOMEM + 0x8000;
@ -4995,9 +5080,9 @@ set_destructive_cursor(scr_stat *scp)
#if 1 #if 1
while (!(inb(crtc_addr+6) & 0x08)) /* wait for vertical retrace */ ; while (!(inb(crtc_addr+6) & 0x08)) /* wait for vertical retrace */ ;
#endif #endif
set_font_mode(); set_font_mode(buf);
sc_bcopy(cursor, (char *)pa_to_va(address) + DEAD_CHAR * 32, 32); sc_bcopy(cursor, (char *)pa_to_va(address) + DEAD_CHAR * 32, 32);
set_normal_mode(); set_normal_mode(buf);
#endif #endif
} }
@ -5107,6 +5192,7 @@ draw_mouse_image(scr_stat *scp)
caddr_t address; caddr_t address;
int i; int i;
char *font_buffer; char *font_buffer;
u_char buf[PARAM_BUFSIZE];
u_short buffer[32]; u_short buffer[32];
u_short xoffset, yoffset; u_short xoffset, yoffset;
u_short *crt_pos = Crtat + (scp->mouse_pos - scp->scr_buf); u_short *crt_pos = Crtat + (scp->mouse_pos - scp->scr_buf);
@ -5156,13 +5242,13 @@ draw_mouse_image(scr_stat *scp)
#endif #endif
scp->mouse_oldpos = scp->mouse_pos; scp->mouse_oldpos = scp->mouse_pos;
#ifndef PC98 #ifndef PC98
/* wait for vertical retrace to avoid jitter on some videocards */
#if 1 #if 1
/* wait for vertical retrace to avoid jitter on some videocards */
while (!(inb(crtc_addr+6) & 0x08)) /* idle */ ; while (!(inb(crtc_addr+6) & 0x08)) /* idle */ ;
#endif #endif
set_font_mode(); set_font_mode(buf);
sc_bcopy(scp->mouse_cursor, (char *)pa_to_va(address) + 0xd0 * 32, 128); sc_bcopy(scp->mouse_cursor, (char *)pa_to_va(address) + 0xd0 * 32, 128);
set_normal_mode(); set_normal_mode(buf);
*(crt_pos) = (*(scp->mouse_pos)&0xff00)|0xd0; *(crt_pos) = (*(scp->mouse_pos)&0xff00)|0xd0;
*(crt_pos+scp->xsize) = (*(scp->mouse_pos+scp->xsize)&0xff00)|0xd2; *(crt_pos+scp->xsize) = (*(scp->mouse_pos+scp->xsize)&0xff00)|0xd2;
if (scp->mouse_xpos < (scp->xsize-1)*8) { if (scp->mouse_xpos < (scp->xsize-1)*8) {

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* $Id: syscons.h,v 1.18 1997/10/02 09:14:33 kato Exp $ * $Id: syscons.h,v 1.19 1997/10/23 09:26:30 kato Exp $
*/ */
#ifndef _PC98_PC98_SYSCONS_H_ #ifndef _PC98_PC98_SYSCONS_H_
@ -198,6 +198,7 @@ typedef struct scr_stat {
u_short bell_duration; u_short bell_duration;
u_short bell_pitch; u_short bell_pitch;
u_char border; /* border color */ u_char border; /* border color */
u_char initial_mode; /* initial mode */
u_char mode; /* mode */ u_char mode; /* mode */
pid_t pid; /* pid of controlling proc */ pid_t pid; /* pid of controlling proc */
struct proc *proc; /* proc* of controlling proc */ struct proc *proc; /* proc* of controlling proc */