diff options
| author | KATO Takenori <kato@FreeBSD.org> | 1997-10-13 09:00:26 +0000 |
|---|---|---|
| committer | KATO Takenori <kato@FreeBSD.org> | 1997-10-13 09:00:26 +0000 |
| commit | 806e9cd433a49ce2b064a7aa69eacb7d33cd96c7 (patch) | |
| tree | a0d9a68719a7b6977b77649127eda6e54223e242 /sys | |
| parent | 9a0963757a8afd4c9a8e3841ad4d33296c2fe2be (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/pc98/pc98/syscons.c | 86 | ||||
| -rw-r--r-- | sys/pc98/pc98/syscons.h | 19 |
2 files changed, 83 insertions, 22 deletions
diff --git a/sys/pc98/pc98/syscons.c b/sys/pc98/pc98/syscons.c index 1852767a8e9c..397e94574027 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.13.2.19 1997/09/08 03:02:00 kato Exp $ + * $Id: syscons.c,v 1.13.2.20 1997/09/08 03:03:22 kato Exp $ */ #include "sc.h" @@ -1275,6 +1275,24 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) pgsignal(tp->t_pgrp, SIGWINCH, 1); } return 0; + + case SW_VGA_MODEX: + if (!crtc_vga || video_mode_ptr == NULL) + return ENXIO; + scp->mode = cmd & 0xFF; + 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; + tp->t_winsize.ws_ypixel = scp->ypixel; + pgsignal(tp->t_pgrp, SIGWINCH, 1); + } + return 0; #endif /* PC98 */ case VT_SETMODE: /* set screen switcher mode */ @@ -1461,13 +1479,19 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case KDSKBMODE: /* set keyboard mode */ switch (*data) { case K_RAW: /* switch to RAW scancode mode */ + scp->status &= ~KBD_CODE_MODE; scp->status |= KBD_RAW_MODE; return 0; + case K_CODE: /* switch to CODE mode */ + scp->status &= ~KBD_RAW_MODE; + scp->status |= KBD_CODE_MODE; + return 0; + case K_XLATE: /* switch to XLT ascii mode */ if (scp == cur_console && scp->status & KBD_RAW_MODE) shfts = ctls = alts = agrs = metas = 0; - scp->status &= ~KBD_RAW_MODE; + scp->status &= ~(KBD_RAW_MODE | KBD_CODE_MODE); return 0; default: return EINVAL; @@ -1475,7 +1499,8 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) /* NOT REACHED */ case KDGKBMODE: /* get keyboard mode */ - *data = (scp->status & KBD_RAW_MODE) ? K_RAW : K_XLATE; + *data = (scp->status & KBD_RAW_MODE) ? K_RAW : + ((scp->status & KBD_CODE_MODE) ? K_CODE : K_XLATE); return 0; case KDMKTONE: /* sound the bell */ @@ -2012,13 +2037,13 @@ exchange_scr(void) } move_crsr(new_scp, new_scp->xpos, new_scp->ypos); #ifndef PC98 - if ((old_scp->status & UNKNOWN_MODE) && crtc_vga) { - if (flags & CHAR_CURSOR) - set_destructive_cursor(new_scp); + if (!(new_scp->status & UNKNOWN_MODE) && (flags & CHAR_CURSOR)) + set_destructive_cursor(new_scp); + if ((old_scp->status & UNKNOWN_MODE) && crtc_vga) load_palette(palette); - } #endif - if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE) + if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE || + old_scp->status & KBD_CODE_MODE || new_scp->status & KBD_CODE_MODE) shfts = ctls = alts = agrs = metas = 0; update_leds(new_scp->status); delayed_next_scr = FALSE; @@ -3631,6 +3656,9 @@ next_code: break; } + if (cur_console->status & KBD_CODE_MODE) + return (keycode | (scancode & 0x80)); + /* if scroll-lock pressed allow history browsing */ if (cur_console->history && cur_console->status & SLKED) { int i; @@ -4279,12 +4307,40 @@ setup_mode: mark_all(scp); break; + 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 */ + special_modetable[5-1+0x04] &= 0xf7; + special_modetable[5-1+0x04] |= 0x04; + /* turn off doubleword mode */ + special_modetable[10+0x14] &= 0xbf; + /* turn off word adressing */ + special_modetable[10+0x17] |= 0x40; + /* set logical screen width */ + special_modetable[10+0x13] = 80; + /* set 240 lines */ + special_modetable[10+0x11] = 0x2c; + special_modetable[10+0x06] = 0x0d; + special_modetable[10+0x07] = 0x3e; + special_modetable[10+0x10] = 0xea; + special_modetable[10+0x11] = 0xac; + special_modetable[10+0x12] = 0xdf; + special_modetable[10+0x15] = 0xe7; + special_modetable[10+0x16] = 0x06; + /* set vertical sync polarity to reflect aspect ratio */ + special_modetable[9] = 0xe3; + + modetable = special_modetable; + goto setup_grmode; + 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)); + modetable = video_mode_ptr + (scp->mode * 64); +setup_grmode: + set_vgaregs(modetable); scp->font_size = FONT_NONE; break; @@ -4642,14 +4698,18 @@ set_mouse_pos(scr_stat *scp) scp->mouse_xpos = 0; if (scp->mouse_ypos < 0) scp->mouse_ypos = 0; + if (scp->status & UNKNOWN_MODE) { + if (scp->mouse_xpos > scp->xpixel) + scp->mouse_xpos = scp->xpixel-1; + if (scp->mouse_ypos > scp->ypixel) + scp->mouse_ypos = scp->ypixel-1; + return; + } if (scp->mouse_xpos > (scp->xsize*8)-2) scp->mouse_xpos = (scp->xsize*8)-2; if (scp->mouse_ypos > (scp->ysize*scp->font_size)-2) scp->mouse_ypos = (scp->ysize*scp->font_size)-2; - if (scp->status & UNKNOWN_MODE) - return; - if (scp->mouse_xpos != last_xpos || scp->mouse_ypos != last_ypos) { scp->status |= MOUSE_MOVED; diff --git a/sys/pc98/pc98/syscons.h b/sys/pc98/pc98/syscons.h index d3ca7ae6afd7..35517a1350e0 100644 --- a/sys/pc98/pc98/syscons.h +++ b/sys/pc98/pc98/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: syscons.h,v 1.7.2.3 1997/03/09 13:30:08 kato Exp $ + * $Id: syscons.h,v 1.7.2.4 1997/07/10 10:48:38 kato Exp $ */ #ifndef _PC98_PC98_SYSCONS_H_ @@ -56,14 +56,15 @@ #define LED_MASK 0x00007 #define UNKNOWN_MODE 0x00010 #define KBD_RAW_MODE 0x00020 -#define SWITCH_WAIT_REL 0x00040 -#define SWITCH_WAIT_ACQ 0x00080 -#define BUFFER_SAVED 0x00100 -#define CURSOR_ENABLED 0x00200 -#define MOUSE_ENABLED 0x00400 -#define MOUSE_MOVED 0x00800 -#define MOUSE_CUTTING 0x01000 -#define MOUSE_VISIBLE 0x02000 +#define KBD_CODE_MODE 0x00040 +#define SWITCH_WAIT_REL 0x00080 +#define SWITCH_WAIT_ACQ 0x00100 +#define BUFFER_SAVED 0x00200 +#define CURSOR_ENABLED 0x00400 +#define MOUSE_ENABLED 0x00800 +#define MOUSE_MOVED 0x01000 +#define MOUSE_CUTTING 0x02000 +#define MOUSE_VISIBLE 0x04000 /* configuration flags */ #define VISUAL_BELL 0x00001 |
