diff options
author | kato <kato@FreeBSD.org> | 1998-04-06 03:37:55 +0000 |
---|---|---|
committer | kato <kato@FreeBSD.org> | 1998-04-06 03:37:55 +0000 |
commit | f5a109a74e09e285994d80b428453509a64aacab (patch) | |
tree | 18e994a7b83f70aa692f487c4601cd7bd8abdd0f | |
parent | 17e8d9b9ca23b6472350ae1eaa7a8b4616d04d08 (diff) | |
download | FreeBSD-src-f5a109a74e09e285994d80b428453509a64aacab.zip FreeBSD-src-f5a109a74e09e285994d80b428453509a64aacab.tar.gz |
Sync with sys/i386/isa/syscons.c revision 1.258.
-rw-r--r-- | sys/pc98/pc98/syscons.c | 205 |
1 files changed, 182 insertions, 23 deletions
diff --git a/sys/pc98/pc98/syscons.c b/sys/pc98/pc98/syscons.c index 28e8e40..d9f8c44 100644 --- a/sys/pc98/pc98/syscons.c +++ b/sys/pc98/pc98/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: syscons.c,v 1.80 1998/03/05 03:31:27 kato Exp $ + * $Id: syscons.c,v 1.81 1998/04/04 17:18:09 kato Exp $ */ #include "sc.h" @@ -294,6 +294,7 @@ static int get_scr_num(void); static timeout_t scrn_timer; static void scrn_update(scr_stat *scp, int show_cursor); static void stop_scrn_saver(void (*saver)(int)); +static int wait_scrn_saver_stop(void); static void clear_screen(scr_stat *scp); static int switch_scr(scr_stat *scp, u_int next_scr); static void exchange_scr(void); @@ -1708,6 +1709,14 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) if (mp == NULL) return ENODEV; + s = spltty(); + if ((error = wait_scrn_saver_stop())) { + splx(s); + return error; + } + + scp->status &= ~MOUSE_VISIBLE; + remove_cutmarking(scp); if (scp->history != NULL) i = imax(scp->history_size / scp->xsize - imax(SC_HISTORY_SIZE, scp->ysize), 0); @@ -1715,27 +1724,41 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) i = 0; switch (cmd & 0xff) { case M_VGA_C80x60: case M_VGA_M80x60: - if (!(fonts_loaded & FONT_8)) + if (!(fonts_loaded & FONT_8)) { + splx(s); return EINVAL; + } + /* + * This is a kludge to fend off scrn_update() while we + * muck around with scp. XXX + */ + scp->status |= UNKNOWN_MODE; scp->xsize = 80; scp->ysize = 60; scp->font_size = 8; break; case M_VGA_C80x50: case M_VGA_M80x50: - if (!(fonts_loaded & FONT_8)) + if (!(fonts_loaded & FONT_8)) { + splx(s); return EINVAL; + } + scp->status |= UNKNOWN_MODE; scp->xsize = 80; scp->ysize = 50; scp->font_size = 8; break; case M_ENH_B80x43: case M_ENH_C80x43: - if (!(fonts_loaded & FONT_8)) + if (!(fonts_loaded & FONT_8)) { + splx(s); return EINVAL; + } + scp->status |= UNKNOWN_MODE; scp->xsize = 80; scp->ysize = 43; scp->font_size = 8; break; case M_VGA_C80x30: case M_VGA_M80x30: + scp->status |= UNKNOWN_MODE; scp->xsize = 80; scp->ysize = 30; scp->font_size = mp[2]; @@ -1743,12 +1766,17 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case M_ENH_C40x25: case M_ENH_B40x25: case M_ENH_C80x25: case M_ENH_B80x25: case M_EGAMONO80x25: - if (!(fonts_loaded & FONT_14)) + if (!(fonts_loaded & FONT_14)) { + splx(s); return EINVAL; + } /* FALL THROUGH */ default: - if ((cmd & 0xff) > M_VGA_CG320) + if ((cmd & 0xff) > M_VGA_CG320) { + splx(s); return EINVAL; + } + scp->status |= UNKNOWN_MODE; scp->xsize = mp[0]; scp->ysize = mp[1] + rows_offset; scp->font_size = mp[2]; @@ -1756,7 +1784,6 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) } #endif - scp->status &= ~MOUSE_VISIBLE; scp->mode = cmd & 0xff; scp->xpixel = scp->xsize * 8; scp->ypixel = scp->ysize * scp->font_size; @@ -1779,6 +1806,8 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) free(cut_buffer, M_DEVBUF); cut_buffer = (char *)malloc(scp->xsize*scp->ysize, M_DEVBUF, M_NOWAIT); cut_buffer[0] = 0x00; + splx(s); + usp = scp->history; scp->history = NULL; if (usp != NULL) { @@ -1808,8 +1837,8 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) #endif if (scp == cur_console) set_mode(scp); - scp->status &= ~UNKNOWN_MODE; clear_screen(scp); + scp->status &= ~UNKNOWN_MODE; if (tp->t_winsize.ws_col != scp->xsize || tp->t_winsize.ws_row != scp->ysize) { @@ -1831,7 +1860,15 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) if (mp == NULL) return ENODEV; + s = spltty(); + if ((error = wait_scrn_saver_stop())) { + splx(s); + return error; + } + scp->status &= ~MOUSE_VISIBLE; + remove_cutmarking(scp); + scp->status |= UNKNOWN_MODE; /* graphics mode */ scp->mode = cmd & 0xFF; scp->xpixel = mp[0] * 8; scp->ypixel = (mp[1] + rows_offset) * mp[2]; @@ -1839,9 +1876,10 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) /* move the mouse cursor at the center of the screen */ scp->mouse_xpos = scp->xpixel / 2; scp->mouse_ypos = scp->ypixel / 2; + splx(s); + if (scp == cur_console) set_mode(scp); - scp->status |= UNKNOWN_MODE; /* graphics mode */ /* clear_graphics();*/ if (tp->t_winsize.ws_xpixel != scp->xpixel @@ -1859,13 +1897,24 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) if (mp == NULL) return ENODEV; + s = spltty(); + if ((error = wait_scrn_saver_stop())) { + splx(s); + return error; + } + + scp->status &= ~MOUSE_VISIBLE; + remove_cutmarking(scp); + scp->status |= UNKNOWN_MODE; /* graphics mode */ scp->mode = cmd & 0xFF; + scp->xpixel = 320; + scp->ypixel = 240; + scp->font_size = FONT_NONE; + splx(s); + if (scp == cur_console) set_mode(scp); - scp->status |= UNKNOWN_MODE; /* graphics mode */ /* clear_graphics();*/ - scp->xpixel = 320; - scp->ypixel = 240; if (tp->t_winsize.ws_xpixel != scp->xpixel || tp->t_winsize.ws_ypixel != scp->ypixel) { tp->t_winsize.ws_xpixel = scp->xpixel; @@ -1984,12 +2033,18 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) #ifndef PC98 /* restore fonts & palette ! */ if (crtc_vga) { +#if 0 + /* + * FONT KLUDGE + * Don't load fonts for now... XXX + */ if (fonts_loaded & FONT_8) copy_font(LOAD, FONT_8, font_8); if (fonts_loaded & FONT_14) copy_font(LOAD, FONT_14, font_14); if (fonts_loaded & FONT_16) copy_font(LOAD, FONT_16, font_16); +#endif load_palette(palette); } @@ -2002,7 +2057,15 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) /* FALL THROUGH */ #endif case KD_TEXT1: /* switch to TEXT (known) mode */ + s = spltty(); + if ((error = wait_scrn_saver_stop())) { + splx(s); + return error; + } scp->status &= ~MOUSE_VISIBLE; + remove_cutmarking(scp); + scp->status |= UNKNOWN_MODE; + splx(s); /* no restore fonts & palette */ #ifdef PC98 scp->status &= ~UNKNOWN_MODE; @@ -2015,11 +2078,18 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return 0; case KD_GRAPHICS: /* switch to GRAPHICS (unknown) mode */ + s = spltty(); + if ((error = wait_scrn_saver_stop())) { + splx(s); + return error; + } scp->status &= ~MOUSE_VISIBLE; + remove_cutmarking(scp); scp->status |= UNKNOWN_MODE; #ifdef PC98 set_mode(scp); #endif + splx(s); return 0; default: return EINVAL; @@ -2219,7 +2289,13 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return ENXIO; bcopy(data, font_8, 8*256); fonts_loaded |= FONT_8; - if (!(cur_console->status & UNKNOWN_MODE)) { + /* + * FONT KLUDGE + * Always use the font page #0. XXX + * Don't load if the current font size is not 8x8. + */ + if (!(cur_console->status & UNKNOWN_MODE) + && (cur_console->font_size < 14)) { copy_font(LOAD, FONT_8, font_8); if (flags & CHAR_CURSOR) set_destructive_cursor(cur_console); @@ -2241,7 +2317,13 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return ENXIO; bcopy(data, font_14, 14*256); fonts_loaded |= FONT_14; - if (!(cur_console->status & UNKNOWN_MODE)) { + /* + * FONT KLUDGE + * Always use the font page #0. XXX + * Don't load if the current font size is not 8x14. + */ + if (!(cur_console->status & UNKNOWN_MODE) + && (cur_console->font_size >= 14) && (cur_console->font_size < 16)) { copy_font(LOAD, FONT_14, font_14); if (flags & CHAR_CURSOR) set_destructive_cursor(cur_console); @@ -2263,7 +2345,13 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return ENXIO; bcopy(data, font_16, 16*256); fonts_loaded |= FONT_16; - if (crtc_vga && !(cur_console->status & UNKNOWN_MODE)) { + /* + * FONT KLUDGE + * Always use the font page #0. XXX + * Don't load if the current font size is not 8x16. + */ + if (crtc_vga && !(cur_console->status & UNKNOWN_MODE) + && (cur_console->font_size >= 16)) { copy_font(LOAD, FONT_16, font_16); if (flags & CHAR_CURSOR) set_destructive_cursor(cur_console); @@ -2634,6 +2722,22 @@ stop_scrn_saver(void (*saver)(int)) (*saver)(FALSE); getmicroruntime(&scrn_time_stamp); mark_all(cur_console); + wakeup((caddr_t)&scrn_blanked); +} + +static int +wait_scrn_saver_stop(void) +{ + int error = 0; + + getmicroruntime(&scrn_time_stamp); + while (scrn_blanked > 0) { + error = tsleep((caddr_t)&scrn_blanked, PZERO | PCATCH, "scrsav", 0); + getmicroruntime(&scrn_time_stamp); + if (error != ERESTART) + break; + } + return error; } static void @@ -4166,21 +4270,39 @@ init_scp(scr_stat *scp) { #ifdef PC98 scp->mode = M_PC98_80x25; + scp->font_size = 16; #else - if (crtc_vga) + switch(crtc_type) { + case KD_VGA: if (crtc_addr == MONO_BASE) scp->mode = M_VGA_M80x25; else scp->mode = M_VGA_C80x25; else + scp->font_size = 16; + break; + case KD_CGA: if (crtc_addr == MONO_BASE) scp->mode = M_B80x25; else scp->mode = M_C80x25; + scp->font_size = 8; + break; + case KD_EGA: + scp->mode = M_B80x25; + else + scp->mode = M_C80x25; + scp->font_size = 14; + break; + case KD_MONO: + case KD_HERCULES: + default: + scp->mode = M_EGAMONO80x25; + scp->font_size = 14; + break; + } scp->initial_mode = scp->mode; - #endif - scp->font_size = 16; scp->xsize = COL; scp->ysize = ROW; scp->xpixel = scp->xsize * 8; @@ -5022,6 +5144,8 @@ set_mode(scr_stat *scp) { char special_modetable[MODE_PARAM_SIZE]; char *mp; + int s; + int i; if (scp != cur_console) return; @@ -5104,16 +5228,29 @@ setup_mode: if (scp->font_size < 14) { if (fonts_loaded & FONT_8) copy_font(LOAD, FONT_8, font_8); - outb(TSIDX, 0x03); outb(TSREG, 0x0A); /* font 2 */ + i = 0x0a; /* font 2 */ } else if (scp->font_size >= 16) { if (fonts_loaded & FONT_16) copy_font(LOAD, FONT_16, font_16); - outb(TSIDX, 0x03); outb(TSREG, 0x00); /* font 0 */ + i = 0x00; /* font 0 */ } else { if (fonts_loaded & FONT_14) copy_font(LOAD, FONT_14, font_14); - outb(TSIDX, 0x03); outb(TSREG, 0x05); /* font 1 */ + i = 0x05; /* font 1 */ } + /* + * FONT KLUDGE: + * This is an interim kludge to display correct font. + * Always use the font page #0 on the video plane 2. + * Somehow we cannot show the font in other font pages on + * some video cards... XXX + */ + i = 0x00; + s = splhigh(); + outb(TSIDX, 0x00); outb(TSREG, 0x01); + outb(TSIDX, 0x03); outb(TSREG, i); + outb(TSIDX, 0x00); outb(TSREG, 0x03); + splx(s); if (flags & CHAR_CURSOR) set_destructive_cursor(scp); mark_all(scp); @@ -5195,7 +5332,6 @@ 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]); @@ -5236,7 +5372,6 @@ read_vgaregs(char *buf) s = splhigh(); outb(TSIDX, 0x00); outb(TSREG, 0x01); /* stop sequencer */ - outb(TSIDX, 0x07); outb(TSREG, 0x00); /* unlock registers */ for (i=0, j=5; i<4; i++) { outb(TSIDX, i+1); buf[j++] = inb(TSREG); @@ -5360,14 +5495,18 @@ set_font_mode(u_char *buf) outb(ATC, 0x20); /* enable palette */ #if SLOW_VGA + outb(TSIDX, 0x00); outb(TSREG, 0x01); outb(TSIDX, 0x02); outb(TSREG, 0x04); outb(TSIDX, 0x04); outb(TSREG, 0x07); + outb(TSIDX, 0x00); outb(TSREG, 0x03); outb(GDCIDX, 0x04); outb(GDCREG, 0x02); outb(GDCIDX, 0x05); outb(GDCREG, 0x00); outb(GDCIDX, 0x06); outb(GDCREG, 0x04); #else + outw(TSIDX, 0x0100); outw(TSIDX, 0x0402); outw(TSIDX, 0x0704); + outw(TSIDX, 0x0300); outw(GDCIDX, 0x0204); outw(GDCIDX, 0x0005); outw(GDCIDX, 0x0406); /* addr = a0000, 64kb */ @@ -5388,8 +5527,10 @@ set_normal_mode(u_char *buf) outb(ATC, 0x20); /* enable palette */ #if SLOW_VGA + outb(TSIDX, 0x00); outb(TSREG, 0x01); outb(TSIDX, 0x02); outb(TSREG, buf[0]); outb(TSIDX, 0x04); outb(TSREG, buf[1]); + outb(TSIDX, 0x00); outb(TSREG, 0x03); outb(GDCIDX, 0x04); outb(GDCREG, buf[2]); outb(GDCIDX, 0x05); outb(GDCREG, buf[3]); if (crtc_addr == MONO_BASE) { @@ -5398,8 +5539,10 @@ set_normal_mode(u_char *buf) outb(GDCIDX, 0x06); outb(GDCREG,(buf[4] & 0x03) | 0x0c); } #else + outw(TSIDX, 0x0100); outw(TSIDX, 0x0002 | (buf[0] << 8)); outw(TSIDX, 0x0004 | (buf[1] << 8)); + outw(TSIDX, 0x0300); outw(GDCIDX, 0x0004 | (buf[2] << 8)); outw(GDCIDX, 0x0005 | (buf[3] << 8)); if (crtc_addr == MONO_BASE) @@ -5436,6 +5579,11 @@ copy_font(int operation, int font_type, char* font_image) fontsize = 16; break; } + /* + * FONT KLUDGE + * Always use the font page #0. XXX + */ + segment = 0x0000; outb(TSIDX, 0x01); val = inb(TSREG); /* disable screen */ outb(TSIDX, 0x01); outb(TSREG, val | 0x20); set_font_mode(buf); @@ -5474,6 +5622,11 @@ set_destructive_cursor(scr_stat *scp) font_buffer = font_14; address = (caddr_t)VIDEOMEM + 0x4000; } + /* + * FONT KLUDGE + * Always use the font page #0. XXX + */ + address = (caddr_t)VIDEOMEM; if (scp->status & MOUSE_VISIBLE) { if ((scp->cursor_saveunder & 0xff) == SC_MOUSE_CHAR) @@ -5767,6 +5920,12 @@ draw_mouse_image(scr_stat *scp) font_buffer = font_14; address = (caddr_t)VIDEOMEM + 0x4000; } + /* + * FONT KLUDGE + * Always use the font page #0. XXX + */ + address = (caddr_t)VIDEOMEM; + xoffset = scp->mouse_xpos % 8; yoffset = scp->mouse_ypos % font_size; |