Sync with sys/i386/isa/syscons.c and syscons.h revisions 1.254 and
1.37, respectively.
This commit is contained in:
parent
7fe482c8b0
commit
c31348ec3f
@ -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.75 1998/02/10 02:51:32 kato Exp $
|
||||
* $Id: syscons.c,v 1.76 1998/02/12 08:16:34 kato Exp $
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
@ -57,6 +57,7 @@
|
||||
#include <machine/pc/display.h>
|
||||
#include <machine/apm_bios.h>
|
||||
#include <machine/random.h>
|
||||
#include <machine/bootinfo.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_param.h>
|
||||
@ -101,8 +102,6 @@
|
||||
#define SC_MAX_HISTORY_SIZE (SC_HISTORY_SIZE * MAXCONS)
|
||||
#endif
|
||||
|
||||
#define SC_MOUSE_CHAR (0x03)
|
||||
|
||||
#if !defined(SC_MOUSE_CHAR)
|
||||
#define SC_MOUSE_CHAR (0xd0)
|
||||
#endif
|
||||
@ -131,7 +130,6 @@ typedef struct old_mouse_info {
|
||||
} old_mouse_info_t;
|
||||
|
||||
/* XXX use sc_bcopy where video memory is concerned */
|
||||
#define sc_bcopy generic_bcopy
|
||||
extern void generic_bcopy(const void *, void *, size_t);
|
||||
|
||||
static default_attr user_default = {
|
||||
@ -192,6 +190,7 @@ static long scrn_time_stamp;
|
||||
u_char scr_map[256];
|
||||
u_char scr_rmap[256];
|
||||
char *video_mode_ptr = NULL;
|
||||
static int vesa_mode;
|
||||
int fonts_loaded = 0
|
||||
#ifdef STD8X16FONT
|
||||
| FONT_16
|
||||
@ -290,6 +289,7 @@ static void sccnupdate(scr_stat *scp);
|
||||
static scr_stat *get_scr_stat(dev_t dev);
|
||||
static scr_stat *alloc_scp(void);
|
||||
static void init_scp(scr_stat *scp);
|
||||
static void sc_bcopy(u_short *p, int from, int to, int mark);
|
||||
static int get_scr_num(void);
|
||||
static timeout_t scrn_timer;
|
||||
static void scrn_update(scr_stat *scp, int show_cursor);
|
||||
@ -297,7 +297,7 @@ static void stop_scrn_saver(void (*saver)(int));
|
||||
static void clear_screen(scr_stat *scp);
|
||||
static int switch_scr(scr_stat *scp, u_int next_scr);
|
||||
static void exchange_scr(void);
|
||||
static inline void move_crsr(scr_stat *scp, int x, int y);
|
||||
static void move_crsr(scr_stat *scp, int x, int y);
|
||||
static void scan_esc(scr_stat *scp, u_char c);
|
||||
static void draw_cursor_image(scr_stat *scp);
|
||||
static void remove_cursor_image(scr_stat *scp);
|
||||
@ -399,7 +399,7 @@ at2pc98(unsigned int attr)
|
||||
/*
|
||||
* These functions need to be before calls to them so they can be inlined.
|
||||
*/
|
||||
static inline void
|
||||
static void
|
||||
draw_cursor_image(scr_stat *scp)
|
||||
{
|
||||
u_short cursor_image, *ptr;
|
||||
@ -413,6 +413,12 @@ draw_cursor_image(scr_stat *scp)
|
||||
#else
|
||||
ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
|
||||
|
||||
if (vesa_mode) {
|
||||
sc_bcopy(scp->scr_buf, scp->cursor_pos - scp->scr_buf,
|
||||
scp->cursor_pos - scp->scr_buf, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
/* do we have a destructive cursor ? */
|
||||
if (flags & CHAR_CURSOR) {
|
||||
prev_image = scp->cursor_saveunder;
|
||||
@ -438,8 +444,7 @@ draw_cursor_image(scr_stat *scp)
|
||||
cursor_image &= 0xff00;
|
||||
cursor_image |= DEAD_CHAR;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
cursor_image = (*(ptr) & 0x00ff) | *(scp->cursor_pos) & 0xff00;
|
||||
scp->cursor_saveunder = cursor_image;
|
||||
if (!(flags & BLINK_CURSOR)||((flags & BLINK_CURSOR)&&(blinkrate & 4))){
|
||||
@ -458,24 +463,19 @@ draw_cursor_image(scr_stat *scp)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
static void
|
||||
remove_cursor_image(scr_stat *scp)
|
||||
{
|
||||
#ifndef PC98
|
||||
/*
|
||||
u_short cursor_image, *ptr;
|
||||
|
||||
ptr = Crtat + (scp->cursor_oldpos - scp->scr_buf);
|
||||
|
||||
cursor_image = scp->cursor_saveunder;
|
||||
*ptr = cursor_image;
|
||||
SOS */
|
||||
|
||||
*(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder;
|
||||
if (vesa_mode)
|
||||
sc_bcopy(scp->scr_buf, scp->cursor_pos - scp->scr_buf,
|
||||
scp->cursor_pos - scp->scr_buf, 0);
|
||||
else
|
||||
*(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
static void
|
||||
move_crsr(scr_stat *scp, int x, int y)
|
||||
{
|
||||
if (x < 0)
|
||||
@ -543,7 +543,12 @@ scvidprobe(int unit, int flags)
|
||||
cp = (u_short *)CGA_BUF;
|
||||
was = *cp;
|
||||
*cp = (u_short) 0xA55A;
|
||||
if (*cp == 0xA55A) {
|
||||
if (bootinfo.bi_vesa == 0x102) {
|
||||
vesa_mode = bootinfo.bi_vesa;
|
||||
Crtat = (u_short *)pa_to_va(0xA0000);
|
||||
crtc_type = KD_PIXEL;
|
||||
bzero(Crtat, 800*600/8);
|
||||
} else if (*cp == 0xA55A) {
|
||||
Crtat = (u_short *)CGA_BUF;
|
||||
crtc_addr = COLOR_BASE;
|
||||
crtc_type = KD_CGA;
|
||||
@ -559,45 +564,43 @@ scvidprobe(int unit, int flags)
|
||||
}
|
||||
*cp = was;
|
||||
|
||||
/*
|
||||
* Check rtc and BIOS date area.
|
||||
* XXX: don't use BIOSDATA_EQUIPMENT, it is not a dead copy
|
||||
* of RTC_EQUIPMENT. The bit 4 and 5 of the ETC_EQUIPMENT are
|
||||
* zeros for EGA and VGA. However, the EGA/VGA BIOS will set
|
||||
* these bits in BIOSDATA_EQUIPMENT according to the monitor
|
||||
* type detected.
|
||||
*/
|
||||
switch ((rtcin(RTC_EQUIPMENT) >> 4) & 3) { /* bit 4 and 5 */
|
||||
case 0: /* EGA/VGA, or nothing */
|
||||
crtc_type = KD_EGA;
|
||||
/* the color adapter may be in the 40x25 mode... XXX */
|
||||
break;
|
||||
case 1: /* CGA 40x25 */
|
||||
/* switch to the 80x25 mode? XXX */
|
||||
/* FALL THROUGH */
|
||||
case 2: /* CGA 80x25 */
|
||||
/* `crtc_type' has already been set... */
|
||||
/* crtc_type = KD_CGA; */
|
||||
break;
|
||||
case 3: /* MDA */
|
||||
/* `crtc_type' has already been set... */
|
||||
/* crtc_type = KD_MONO; */
|
||||
break;
|
||||
}
|
||||
if (crtc_type != KD_PIXEL) {
|
||||
/*
|
||||
* Check rtc and BIOS date area.
|
||||
* XXX: don't use BIOSDATA_EQUIPMENT, it is not a dead copy
|
||||
* of RTC_EQUIPMENT. The bit 4 and 5 of the ETC_EQUIPMENT are
|
||||
* zeros for EGA and VGA. However, the EGA/VGA BIOS will set
|
||||
* these bits in BIOSDATA_EQUIPMENT according to the monitor
|
||||
* type detected.
|
||||
*/
|
||||
switch ((rtcin(RTC_EQUIPMENT) >> 4) & 3) { /* bit 4 and 5 */
|
||||
case 0: /* EGA/VGA, or nothing */
|
||||
crtc_type = KD_EGA;
|
||||
/* the color adapter may be in the 40x25 mode... XXX */
|
||||
break;
|
||||
case 1: /* CGA 40x25 */
|
||||
/* switch to the 80x25 mode? XXX */
|
||||
/* FALL THROUGH */
|
||||
case 2: /* CGA 80x25 */
|
||||
/* `crtc_type' has already been set... */
|
||||
/* crtc_type = KD_CGA; */
|
||||
break;
|
||||
case 3: /* MDA */
|
||||
/* `crtc_type' has already been set... */
|
||||
/* crtc_type = KD_MONO; */
|
||||
break;
|
||||
}
|
||||
|
||||
/* is this a VGA or higher ? */
|
||||
outb(crtc_addr, 7);
|
||||
if (inb(crtc_addr) == 7) {
|
||||
/* is this a VGA or higher ? */
|
||||
outb(crtc_addr, 7);
|
||||
if (inb(crtc_addr) == 7) {
|
||||
|
||||
crtc_type = KD_VGA;
|
||||
crtc_vga = TRUE;
|
||||
read_vgaregs(vgaregs);
|
||||
crtc_type = KD_VGA;
|
||||
crtc_vga = TRUE;
|
||||
read_vgaregs(vgaregs);
|
||||
|
||||
/* Get the BIOS video mode pointer */
|
||||
segoff = *(u_long *)pa_to_va(0x4a8);
|
||||
pa = (((segoff & 0xffff0000) >> 12) + (segoff & 0xffff));
|
||||
if (ISMAPPED(pa, sizeof(u_long))) {
|
||||
segoff = *(u_long *)pa_to_va(pa);
|
||||
/* Get the BIOS video mode pointer */
|
||||
segoff = *(u_long *)pa_to_va(0x4a8);
|
||||
pa = (((segoff & 0xffff0000) >> 12) + (segoff & 0xffff));
|
||||
if (ISMAPPED(pa, MODE_PARAM_SIZE))
|
||||
video_mode_ptr = (char *)pa_to_va(pa);
|
||||
@ -890,6 +893,9 @@ scattach(struct isa_device *dev)
|
||||
case KD_CGA:
|
||||
printf("CGA");
|
||||
break;
|
||||
case KD_PIXEL:
|
||||
printf("Graphics display (VESA mode = 0x%x)", vesa_mode);
|
||||
break;
|
||||
case KD_MONO:
|
||||
case KD_HERCULES:
|
||||
default:
|
||||
@ -2249,11 +2255,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
|
||||
case PIO_FONT8x16: /* set 8x16 dot font */
|
||||
if (!crtc_vga)
|
||||
if (!crtc_vga && crtc_type != KD_PIXEL)
|
||||
return ENXIO;
|
||||
bcopy(data, font_16, 16*256);
|
||||
fonts_loaded |= FONT_16;
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
if (crtc_vga && !(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
@ -2261,7 +2267,7 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x16: /* get 8x16 dot font */
|
||||
if (!crtc_vga)
|
||||
if (!crtc_vga && crtc_type != KD_PIXEL)
|
||||
return ENXIO;
|
||||
if (fonts_loaded & FONT_16) {
|
||||
bcopy(font_16, data, 16*256);
|
||||
@ -2517,18 +2523,17 @@ scrn_update(scr_stat *scp, int show_cursor)
|
||||
{
|
||||
/* update screen image */
|
||||
if (scp->start <= scp->end) {
|
||||
sc_bcopy(scp->scr_buf + scp->start, Crtat + scp->start,
|
||||
(1 + scp->end - scp->start) * sizeof(u_short));
|
||||
sc_bcopy(scp->scr_buf, scp->start, scp->end, 0);
|
||||
#ifdef PC98
|
||||
sc_bcopy(scp->atr_buf + scp->start, Atrat + scp->start,
|
||||
(1 + scp->end - scp->start) * sizeof(u_short));
|
||||
generic_bcopy(scp->atr_buf + scp->start, Atrat + scp->start,
|
||||
(1 + scp->end - scp->start) * sizeof(u_short));
|
||||
#endif
|
||||
}
|
||||
|
||||
/* we are not to show the cursor and the mouse pointer... */
|
||||
if (!show_cursor) {
|
||||
scp->end = 0;
|
||||
scp->start = scp->xsize*scp->ysize;
|
||||
scp->start = scp->xsize*scp->ysize - 1;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2584,7 +2589,7 @@ scrn_update(scr_stat *scp, int show_cursor)
|
||||
draw_cutmarking(scp);
|
||||
|
||||
scp->end = 0;
|
||||
scp->start = scp->xsize*scp->ysize;
|
||||
scp->start = scp->xsize*scp->ysize - 1;
|
||||
}
|
||||
|
||||
int
|
||||
@ -2727,6 +2732,9 @@ exchange_scr(void)
|
||||
update_leds(new_scp->status);
|
||||
delayed_next_scr = FALSE;
|
||||
mark_all(new_scp);
|
||||
if (vesa_mode == 0x102) {
|
||||
bzero(Crtat, 800*600/8);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -4001,8 +4009,9 @@ scinit(void)
|
||||
}
|
||||
#endif
|
||||
/* copy screen to temporary buffer */
|
||||
sc_bcopy(Crtat, sc_buffer,
|
||||
console[0]->xsize * console[0]->ysize * sizeof(u_short));
|
||||
if (crtc_type != KD_PIXEL)
|
||||
generic_bcopy(Crtat, 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;
|
||||
@ -5486,7 +5495,7 @@ set_destructive_cursor(scr_stat *scp)
|
||||
while (!(inb(crtc_addr+6) & 0x08)) /* wait for vertical retrace */ ;
|
||||
#endif
|
||||
set_font_mode(buf);
|
||||
sc_bcopy(cursor, (char *)pa_to_va(address) + DEAD_CHAR * 32, 32);
|
||||
generic_bcopy(cursor, (char *)pa_to_va(address) + DEAD_CHAR * 32, 32);
|
||||
set_normal_mode(buf);
|
||||
#endif
|
||||
}
|
||||
@ -5791,8 +5800,7 @@ draw_mouse_image(scr_stat *scp)
|
||||
while (!(inb(crtc_addr+6) & 0x08)) /* idle */ ;
|
||||
#endif
|
||||
set_font_mode(buf);
|
||||
sc_bcopy(scp->mouse_cursor, (char *)pa_to_va(address) + SC_MOUSE_CHAR * 32,
|
||||
128);
|
||||
generic_bcopy(scp->mouse_cursor, (char *)pa_to_va(address) + SC_MOUSE_CHAR * 32, 128);
|
||||
set_normal_mode(buf);
|
||||
*(crt_pos) = (*(scp->mouse_pos) & 0xff00) | SC_MOUSE_CHAR;
|
||||
*(crt_pos+scp->xsize) =
|
||||
@ -6000,6 +6008,31 @@ blink_screen(void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sc_bcopy(u_short *p, int from, int to, int mark)
|
||||
{
|
||||
if (!vesa_mode) {
|
||||
generic_bcopy(p+from, Crtat+from, (to-from+1)*sizeof (u_short));
|
||||
} else if (vesa_mode == 0x102) {
|
||||
u_char *d;
|
||||
int i,j;
|
||||
|
||||
for (i = from ; i <= to ; i++) {
|
||||
for (j = 0 ; j < 16; j++) {
|
||||
d = (u_char *)Crtat;
|
||||
d += 10 + 6*16*100;
|
||||
d += (i%80);
|
||||
d += 16*100*(i/80);
|
||||
d += 100*j;
|
||||
if (mark)
|
||||
*d++ = 255^font_16[(p[i]&0xff)*16+j];
|
||||
else
|
||||
*d++ = font_16[(p[i]&0xff)*16+j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SC_SPLASH_SCREEN
|
||||
static void
|
||||
toggle_splash_screen(scr_stat *scp)
|
||||
|
@ -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.20 1997/11/25 09:51:46 kato Exp $
|
||||
* $Id: syscons.h,v 1.21 1998/01/12 15:34:18 kato Exp $
|
||||
*/
|
||||
|
||||
#ifndef _PC98_PC98_SYSCONS_H_
|
||||
@ -48,7 +48,7 @@
|
||||
}
|
||||
#define mark_all(scp) {\
|
||||
scp->start = 0;\
|
||||
scp->end = scp->xsize * scp->ysize;\
|
||||
scp->end = scp->xsize * scp->ysize - 1;\
|
||||
}
|
||||
|
||||
/* status flags */
|
||||
|
Loading…
Reference in New Issue
Block a user