summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorKATO Takenori <kato@FreeBSD.org>1997-10-13 09:00:26 +0000
committerKATO Takenori <kato@FreeBSD.org>1997-10-13 09:00:26 +0000
commit806e9cd433a49ce2b064a7aa69eacb7d33cd96c7 (patch)
treea0d9a68719a7b6977b77649127eda6e54223e242 /sys
parent9a0963757a8afd4c9a8e3841ad4d33296c2fe2be (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/pc98/pc98/syscons.c86
-rw-r--r--sys/pc98/pc98/syscons.h19
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