Port syscons to the alpha. The driver itself has moved to sys/isa as it will

hopefully become a portable driver usable by all architectures.  The api
support files have had to be copied to sys/alpha/include since userland
programs expect to find them in <machine/*.h>.

All the revision history of the i386 syscons has been retained by a
repository copy.
This commit is contained in:
Doug Rabson 1998-08-06 09:15:54 +00:00
parent 11afcc8f9f
commit 08b66b4483
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=38138
11 changed files with 241 additions and 116 deletions

View file

@ -25,7 +25,8 @@
* (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: console.h,v 1.37 1998/07/06 06:29:06 imp Exp $
* $Id$
* from: i386/include console.h,v 1.38
*/
#ifndef _MACHINE_CONSOLE_H_

View file

@ -20,7 +20,8 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: mouse.h,v 1.9 1997/12/07 08:08:50 yokota Exp $
* $Id$
* from: i386/include mouse.h,v 1.10
*/
#ifndef _MACHINE_MOUSE_H_

View file

@ -23,7 +23,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: bios.h,v 1.1 1997/08/01 06:04:59 msmith Exp $
* $Id$
* from: i386/include/pc bios.h,v 1.2
*/
/*

View file

@ -2,6 +2,7 @@
* IBM PC display definitions
*
* $Id$
* from: i386/include/pc display.h,v 1.4
*/
/* Color attributes for foreground text */

View file

@ -4,6 +4,7 @@
* how to decipher DOS disk structures in coexisting with DOS
*
* $Id$
* from: i386/include/pc msdos.h,v 1.4
*/
#define MSECTOR_SIZE 512 /* MSDOS sector size in bytes */

View file

@ -26,11 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: kbdio.c,v 1.11 1997/07/20 14:10:05 bde Exp $
* $Id$
* from: i386/isa kbdio.c,v 1.12
*/
#include "sc.h"
#include "vt.h"
/* #include "vt.h" */
#define NVT 0
#include "psm.h"
#include "opt_kbdio.h"

View file

@ -26,7 +26,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: kbdio.h,v 1.6 1997/02/22 09:36:47 peter Exp $
* $Id$
* from: i386/isa kbdio.h,v 1.7
*/
#ifndef _I386_ISA_KBDIO_H_

View file

@ -25,7 +25,8 @@
* (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: kbdtables.h,v 1.39 1998/01/28 08:45:18 yokota Exp $
* $Id$
* from: i386/isa kbdtables.h,v 1.40
*/
#define SET8 0x80 /* set eight bit on */

View file

@ -25,11 +25,14 @@
* (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.271 1998/08/03 09:18:58 yokota Exp $
* $Id$
* from: i386/isa syscons.c,v 1.272
*/
#include "sc.h"
#include "apm.h"
/* #include "apm.h" */
#define NAPM 0
#include "opt_ddb.h"
#include "opt_devfs.h"
#include "opt_syscons.h"
@ -38,6 +41,9 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/reboot.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/bus.h>
#include <sys/conf.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
@ -57,20 +63,19 @@
#include <machine/psl.h>
#include <machine/frame.h>
#include <machine/pc/display.h>
#include <machine/apm_bios.h>
#include <machine/random.h>
#include <machine/bootinfo.h>
/* #include <machine/apm_bios.h> */
/* #include <machine/random.h> */
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
#include <i386/isa/isa.h>
#include <i386/isa/isa_device.h>
#include <i386/isa/timerreg.h>
#include <i386/isa/kbdtables.h>
#include <i386/isa/kbdio.h>
#include <i386/isa/syscons.h>
#include <isa/isareg.h>
#include <isa/isavar.h>
#include <isa/timerreg.h>
#include <isa/kbdtables.h>
#include <isa/kbdio.h>
#include <isa/syscons.h>
#if !defined(MAXCONS)
#define MAXCONS 16
@ -234,9 +239,9 @@ static struct tty sccons[MAXCONS+2];
#endif
#define SC_MOUSE 128
#define SC_CONSOLE 255
#define MONO_BUF pa_to_va(0xB0000)
#define CGA_BUF pa_to_va(0xB8000)
u_short *Crtat;
#define MONO_BUF 0xB0000
#define CGA_BUF 0xB8000
u_int32_t Crtat;
static const int nsccons = MAXCONS+2;
#define WRAPHIST(scp, pointer, offset)\
@ -248,9 +253,10 @@ static const int nsccons = MAXCONS+2;
#define RTC_EQUIPMENT 0x14
/* prototypes */
static int scattach(struct isa_device *dev);
static int scattach(device_t dev);
static int scparam(struct tty *tp, struct termios *t);
static int scprobe(struct isa_device *dev);
static int scprobe(device_t dev);
static void scintr(void *arg);
static int scvidprobe(int unit, int flags);
static int sckbdprobe(int unit, int flags);
static void scstart(struct tty *tp);
@ -324,10 +330,23 @@ static void scsplash(int show);
#define scsplash_stick(stick)
#endif
struct isa_driver scdriver = {
scprobe, scattach, "sc", 1
static device_method_t sc_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, scprobe),
DEVMETHOD(device_attach, scattach),
{ 0, 0 }
};
static driver_t sc_driver = {
"sc",
sc_methods,
DRIVER_TYPE_TTY,
1, /* XXX */
};
static devclass_t sc_devclass;
static d_open_t scopen;
static d_close_t scclose;
static d_read_t scread;
@ -345,10 +364,31 @@ static struct cdevsw scdevsw = {
/*
* These functions need to be before calls to them so they can be inlined.
*/
#ifdef __alpha__
static void fillw(int pat, void *base, size_t cnt)
{
u_short *sp = base;
while (cnt--)
*sp++ = pat;
}
static void fillw_io(int pat, u_int32_t base, size_t cnt)
{
while (cnt--) {
writew(base, pat);
base += 2;
}
}
#endif
static void
draw_cursor_image(scr_stat *scp)
{
u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
u_short cursor_image;
u_int32_t ptr = Crtat + 2*(scp->cursor_pos - scp->scr_buf);
u_short prev_image;
if (VESA_MODE(scp->mode)) {
@ -360,7 +400,7 @@ draw_cursor_image(scr_stat *scp)
/* do we have a destructive cursor ? */
if (flags & CHAR_CURSOR) {
prev_image = scp->cursor_saveunder;
cursor_image = *ptr & 0x00ff;
cursor_image = readw(ptr) & 0x00ff;
if (cursor_image == DEAD_CHAR)
cursor_image = prev_image & 0x00ff;
cursor_image |= *(scp->cursor_pos) & 0xff00;
@ -383,7 +423,7 @@ draw_cursor_image(scr_stat *scp)
cursor_image |= DEAD_CHAR;
}
} else {
cursor_image = (*(ptr) & 0x00ff) | *(scp->cursor_pos) & 0xff00;
cursor_image = (readw(ptr) & 0x00ff) | *(scp->cursor_pos) & 0xff00;
scp->cursor_saveunder = cursor_image;
if (!(flags & BLINK_CURSOR)||((flags & BLINK_CURSOR)&&(blinkrate & 4))){
if ((cursor_image & 0x7000) == 0x7000) {
@ -397,7 +437,7 @@ draw_cursor_image(scr_stat *scp)
}
}
}
*ptr = cursor_image;
writew(ptr, cursor_image);
}
static void
@ -407,7 +447,7 @@ remove_cursor_image(scr_stat *scp)
sc_bcopy(scp, scp->scr_buf, scp->cursor_oldpos - scp->scr_buf,
scp->cursor_oldpos - scp->scr_buf, 0);
else
*(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder;
writew(Crtat + 2*(scp->cursor_oldpos - scp->scr_buf), scp->cursor_saveunder);
}
static void
@ -427,19 +467,20 @@ move_crsr(scr_stat *scp, int x, int y)
}
static int
scprobe(struct isa_device *dev)
scprobe(device_t dev)
{
if (!scvidprobe(dev->id_unit, dev->id_flags)) {
if (!scvidprobe(device_get_unit(dev), isa_get_flags(dev))) {
if (bootverbose)
printf("sc%d: no video adapter is found.\n", dev->id_unit);
printf("sc%d: no video adapter is found.\n", device_get_unit(dev));
return (0);
}
sc_port = dev->id_iobase;
if (sckbdprobe(dev->id_unit, dev->id_flags))
return (IO_KBDSIZE);
sc_port = isa_get_port(dev);
isa_set_portsize(dev, IO_KBDSIZE);
if (sckbdprobe(device_get_unit(dev), isa_get_flags(dev)))
return 0;
else
return ((dev->id_flags & DETECT_KBD) ? 0 : IO_KBDSIZE);
return ((isa_get_flags(dev) & DETECT_KBD) ? ENXIO : 0);
}
/* probe video adapters, return TRUE if found */
@ -450,7 +491,7 @@ scvidprobe(int unit, int flags)
* XXX don't try to `printf' anything here, the console may not have
* been configured yet.
*/
u_short volatile *cp;
u_int32_t cp;
u_short was;
u_int pa;
u_int segoff;
@ -464,36 +505,40 @@ scvidprobe(int unit, int flags)
* bogus common variable so that it can be shared with pcvt, so it
* can't be statically initialized. XXX.
*/
Crtat = (u_short *)MONO_BUF;
Crtat = MONO_BUF;
crtc_type = KD_MONO;
/* If CGA memory seems to work, switch to color. */
cp = (u_short *)CGA_BUF;
was = *cp;
*cp = (u_short) 0xA55A;
cp = CGA_BUF;
was = readw(cp);
writew(cp, 0xA55A);
#ifdef __i386__
bios_video_mode = *(u_char *)pa_to_va(0x449);
if (bootinfo.bi_vesa == 0x102) {
bios_video_mode = bootinfo.bi_vesa;
Crtat = (u_short *)pa_to_va(0xA0000);
Crtat = 0xA0000;
crtc_addr = COLOR_BASE;
crtc_type = KD_VGA;
bzero(Crtat, 800*600/8);
} else if (*cp == 0xA55A) {
Crtat = (u_short *)CGA_BUF;
memset_io(Crtat, 0, 800*600/8);
} else
#endif
if (readw(cp)) {
Crtat = CGA_BUF;
crtc_addr = COLOR_BASE;
crtc_type = KD_CGA;
} else {
cp = Crtat;
was = *cp;
*cp = (u_short) 0xA55A;
if (*cp != 0xA55A) {
was = readw(cp);
writew(cp, 0xA55A);
if (readw(cp) != 0xA55A) {
/* no screen at all, bail out */
Crtat = 0;
return FALSE;
}
}
*cp = was;
writew(cp, was);
if (!VESA_MODE(bios_video_mode)) {
#ifdef __i386__
/*
* Check rtc and BIOS date area.
* XXX: don't use BIOSDATA_EQUIPMENT, it is not a dead copy
@ -519,6 +564,7 @@ scvidprobe(int unit, int flags)
/* crtc_type = KD_MONO; */
break;
}
#endif
/* is this a VGA or higher ? */
outb(crtc_addr, 7);
@ -528,15 +574,17 @@ scvidprobe(int unit, int flags)
crtc_vga = TRUE;
read_vgaregs(vgaregs);
#ifdef __i386__
/* Get the BIOS video mode pointer */
segoff = *(u_int *)pa_to_va(0x4a8);
segoff = readl(0x4a8);
pa = ((segoff & 0xffff0000) >> 12) + (segoff & 0xffff);
if (ISMAPPED(pa, sizeof(u_int))) {
segoff = *(u_int *)pa_to_va(pa);
segoff = readl(pa);
pa = ((segoff & 0xffff0000) >> 12) + (segoff & 0xffff);
if (ISMAPPED(pa, MODE_PARAM_SIZE))
video_mode_ptr = (char *)pa_to_va(pa);
}
#endif
}
}
@ -676,6 +724,16 @@ sckbdprobe(int unit, int flags)
goto fail;
}
}
#ifdef __alpha__
if (send_kbd_command_and_data(
sc_kbdc, KBDC_SET_SCANCODE_SET, 2) != KBD_ACK) {
printf("sc%d: can't set translation.\n", unit);
}
c |= KBD_TRANSLATION;
#endif
/* enable the keyboard port and intr. */
if (!set_controller_command_byte(sc_kbdc,
KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK,
@ -723,17 +781,18 @@ scresume(void *dummy)
#endif
static int
scattach(struct isa_device *dev)
scattach(device_t dev)
{
scr_stat *scp;
dev_t cdev = makedev(CDEV_MAJOR, 0);
char *p;
void *ih;
#ifdef DEVFS
int vc;
#endif
scinit();
flags = dev->id_flags;
flags = isa_get_flags(dev);
if (crtc_type != KD_VGA || VESA_MODE(bios_video_mode))
flags &= ~CHAR_CURSOR;
@ -771,32 +830,32 @@ scattach(struct isa_device *dev)
draw_cursor_image(scp);
/* get screen update going */
scrn_timer((void *)TRUE);
scrn_timer((void*)TRUE);
update_leds(scp->status);
if ((crtc_type == KD_VGA) && bootverbose) {
printf("sc%d: BIOS video mode:%d\n", dev->id_unit, bios_video_mode);
printf("sc%d: VGA registers upon power-up\n", dev->id_unit);
printf("sc%d: BIOS video mode:%d\n", device_get_unit(dev), bios_video_mode);
printf("sc%d: VGA registers upon power-up\n", device_get_unit(dev));
dump_vgaregs(vgaregs);
printf("sc%d: video mode:%d\n", dev->id_unit, scp->mode);
printf("sc%d: video mode:%d\n", device_get_unit(dev), scp->mode);
printf("sc%d: VGA registers in BIOS for mode:%d\n",
dev->id_unit, scp->mode);
device_get_unit(dev), 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);
device_get_unit(dev), scp->mode);
dump_vgaregs(p);
}
printf("sc%d: rows_offset:%d\n", dev->id_unit, rows_offset);
printf("sc%d: rows_offset:%d\n", device_get_unit(dev), rows_offset);
}
if ((crtc_type == KD_VGA) && !VESA_MODE(bios_video_mode)
&& (video_mode_ptr == NULL))
printf("sc%d: WARNING: video mode switching is only partially supported\n",
dev->id_unit);
device_get_unit(dev));
printf("sc%d: ", dev->id_unit);
printf("sc%d: ", device_get_unit(dev));
switch(crtc_type) {
case KD_VGA:
if (VESA_MODE(bios_video_mode))
@ -833,8 +892,6 @@ scattach(struct isa_device *dev)
at_shutdown(scshutdown, NULL, SHUTDOWN_PRE_SYNC);
cdevsw_add(&cdev, &scdevsw, NULL);
#ifdef DEVFS
for (vc = 0; vc < MAXCONS; vc++)
sc_devfs_token[vc] = devfs_add_devswf(&scdevsw, vc, DV_CHR,
@ -845,6 +902,16 @@ scattach(struct isa_device *dev)
sc_console_devfs_token = devfs_add_devswf(&scdevsw, SC_CONSOLE, DV_CHR,
UID_ROOT, GID_WHEEL, 0600, "consolectl");
#endif
ih = BUS_CREATE_INTR(device_get_parent(dev), dev,
isa_get_irq(dev),
scintr, 0);
if (!ih)
return ENXIO;
BUS_CONNECT_INTR(device_get_parent(dev), ih);
return 0;
}
@ -967,8 +1034,8 @@ scwrite(dev_t dev, struct uio *uio, int flag)
return((*linesw[tp->t_line].l_write)(tp, uio, flag));
}
void
scintr(int unit)
static void
scintr(void *arg)
{
static struct tty *cur_tty;
int c, len;
@ -1913,11 +1980,15 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
return error;
if (securelevel > 0)
return EPERM;
#ifdef __i386__
p->p_md.md_regs->tf_eflags |= PSL_IOPL;
#endif
return 0;
case KDDISABIO: /* disallow io operations (default) */
#ifdef __i386__
p->p_md.md_regs->tf_eflags &= ~PSL_IOPL;
#endif
return 0;
case KDSETMODE: /* set current mode of this (virtual) console */
@ -2051,6 +2122,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
case KIOCSOUND: /* make tone (*data) hz */
if (scp == cur_console) {
#if 0
if (*(int*)data) {
int pitch = timer_freq / *(int*)data;
@ -2070,6 +2142,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
outb(IO_PPI, inb(IO_PPI) & 0xFC);
release_timer2();
}
#endif
}
return 0;
@ -2290,6 +2363,7 @@ scmousestart(struct tty *tp)
void
sccnprobe(struct consdev *cp)
{
#if 0
struct isa_device *dvp;
/*
@ -2311,6 +2385,27 @@ sccnprobe(struct consdev *cp)
cp->cn_pri = CN_INTERNAL;
sc_kbdc = kbdc_open(sc_port);
#endif
}
struct consdev sc_cons = {
NULL, NULL, sccngetc, sccncheckc, sccnputc,
NULL, makedev(CDEV_MAJOR, 0), CN_NORMAL,
};
extern struct consdev *cn_tab;
void
sccnattach(void)
{
if (!scvidprobe(0, 0) || !sckbdprobe(0, 0)) {
return;
}
sc_kbdc = kbdc_open(sc_port);
scinit();
cn_tab = &sc_cons;
}
void
@ -2738,7 +2833,7 @@ exchange_scr(void)
delayed_next_scr = FALSE;
mark_all(new_scp);
if (new_scp->mode == 0x102) {
bzero(Crtat, 800*600/8);
memset_io(Crtat, 0, 800*600/8);
}
}
@ -3492,7 +3587,7 @@ scinit(void)
/* copy screen to temporary buffer */
if (!VESA_MODE(console[0]->mode))
generic_bcopy(Crtat, sc_buffer,
memcpy_fromio(sc_buffer, Crtat,
console[0]->xsize * console[0]->ysize * sizeof(u_short));
console[0]->scr_buf = console[0]->mouse_pos = console[0]->mouse_oldpos
@ -3677,8 +3772,8 @@ init_scp(scr_stat *scp)
current_default->std_color;
scp->term.rev_color = current_default->rev_color;
scp->border = BG_BLACK;
scp->cursor_start = *(char *)pa_to_va(0x461);
scp->cursor_end = *(char *)pa_to_va(0x460);
scp->cursor_start = readb(0x461);
scp->cursor_end = readb(0x460);
scp->mouse_xpos = scp->xsize*8/2;
scp->mouse_ypos = scp->ysize*scp->font_size/2;
scp->mouse_cut_start = scp->mouse_cut_end = NULL;
@ -3687,7 +3782,7 @@ init_scp(scr_stat *scp)
scp->mouse_proc = NULL;
scp->bell_pitch = BELL_PITCH;
scp->bell_duration = BELL_DURATION;
scp->status = (*(char *)pa_to_va(0x417) & 0x20) ? NLKED : 0;
scp->status = (readb(0x417) & 0x20) ? NLKED : 0;
scp->status |= CURSOR_ENABLED;
scp->pid = 0;
scp->proc = NULL;
@ -3785,7 +3880,9 @@ scgetc(u_int flags)
if (!(flags & SCGETC_CN)) {
/* do the /dev/random device a favour */
#if 0
add_keyboard_randomness(scancode);
#endif
if (cur_console->status & KBD_RAW_MODE)
return scancode;
@ -4309,7 +4406,7 @@ scmmap(dev_t dev, int offset, int nprot)
{
if (offset > 0x20000 - PAGE_SIZE)
return -1;
return i386_btop((VIDEOMEM + offset));
return (VIDEOMEM + offset) >> PAGE_SHIFT;
}
/*
@ -4634,11 +4731,11 @@ read_vgaregs(char *buf)
inb(crtc_addr+6); /* reset flip-flop */
outb(ATC, 0x20); /* enable palette */
buf[0] = *(char *)pa_to_va(0x44a); /* COLS */
buf[1] = *(char *)pa_to_va(0x484); /* ROWS */
buf[2] = *(char *)pa_to_va(0x485); /* POINTS */
buf[3] = *(char *)pa_to_va(0x44c);
buf[4] = *(char *)pa_to_va(0x44d);
buf[0] = readb(0x44a); /* COLS */
buf[1] = readb(0x484); /* ROWS */
buf[2] = readb(0x485); /* POINTS */
buf[3] = readb(0x44c);
buf[4] = readb(0x44d);
splx(s);
}
@ -4827,11 +4924,11 @@ copy_font(int operation, int font_type, char* font_image)
for (ch=0; ch < 256; ch++)
for (line=0; line < fontsize; line++)
if (operation)
*(char *)pa_to_va(VIDEOMEM+(segment)+(ch*32)+line) =
font_image[(ch*fontsize)+line];
writeb(VIDEOMEM+(segment)+(ch*32)+line,
font_image[(ch*fontsize)+line]);
else
font_image[(ch*fontsize)+line] =
*(char *)pa_to_va(VIDEOMEM+(segment)+(ch*32)+line);
readb(VIDEOMEM+(segment)+(ch*32)+line);
set_normal_mode(buf);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); /* enable screen */
}
@ -4841,27 +4938,27 @@ set_destructive_cursor(scr_stat *scp)
{
u_char buf[PARAM_BUFSIZE];
u_char cursor[32];
caddr_t address;
u_int32_t address;
int i;
char *font_buffer;
if (scp->font_size < 14) {
font_buffer = font_8;
address = (caddr_t)VIDEOMEM + 0x8000;
address = VIDEOMEM + 0x8000;
}
else if (scp->font_size >= 16) {
font_buffer = font_16;
address = (caddr_t)VIDEOMEM;
address = VIDEOMEM;
}
else {
font_buffer = font_14;
address = (caddr_t)VIDEOMEM + 0x4000;
address = VIDEOMEM + 0x4000;
}
/*
* FONT KLUDGE
* Always use the font page #0. XXX
*/
address = (caddr_t)VIDEOMEM;
address = VIDEOMEM;
if (scp->status & MOUSE_VISIBLE) {
if ((scp->cursor_saveunder & 0xff) == SC_MOUSE_CHAR)
@ -4887,7 +4984,7 @@ set_destructive_cursor(scr_stat *scp)
while (!(inb(crtc_addr+6) & 0x08)) /* wait for vertical retrace */ ;
#endif
set_font_mode(buf);
generic_bcopy(cursor, (char *)pa_to_va(address) + DEAD_CHAR * 32, 32);
memcpy_toio(address + DEAD_CHAR * 32, cursor, 32);
set_normal_mode(buf);
}
@ -5130,32 +5227,32 @@ mouse_paste(scr_stat *scp)
static void
draw_mouse_image(scr_stat *scp)
{
caddr_t address;
u_int32_t address;
int i;
char *font_buffer;
u_char buf[PARAM_BUFSIZE];
u_short buffer[32];
u_short xoffset, yoffset;
u_short *crt_pos = Crtat + (scp->mouse_pos - scp->scr_buf);
u_int32_t crt_pos = Crtat + 2*(scp->mouse_pos - scp->scr_buf);
int font_size = scp->font_size;
if (font_size < 14) {
font_buffer = font_8;
address = (caddr_t)VIDEOMEM + 0x8000;
address = VIDEOMEM + 0x8000;
}
else if (font_size >= 16) {
font_buffer = font_16;
address = (caddr_t)VIDEOMEM;
address = VIDEOMEM;
}
else {
font_buffer = font_14;
address = (caddr_t)VIDEOMEM + 0x4000;
address = VIDEOMEM + 0x4000;
}
/*
* FONT KLUDGE
* Always use the font page #0. XXX
*/
address = (caddr_t)VIDEOMEM;
address = VIDEOMEM;
xoffset = scp->mouse_xpos % 8;
yoffset = scp->mouse_ypos % font_size;
@ -5194,15 +5291,15 @@ draw_mouse_image(scr_stat *scp)
while (!(inb(crtc_addr+6) & 0x08)) /* idle */ ;
#endif
set_font_mode(buf);
generic_bcopy(scp->mouse_cursor, (char *)pa_to_va(address) + SC_MOUSE_CHAR * 32, 128);
memcpy_toio(address + SC_MOUSE_CHAR * 32, scp->mouse_cursor, 128);
set_normal_mode(buf);
*(crt_pos) = (*(scp->mouse_pos) & 0xff00) | SC_MOUSE_CHAR;
*(crt_pos+scp->xsize) =
(*(scp->mouse_pos + scp->xsize) & 0xff00) | (SC_MOUSE_CHAR + 2);
writew(crt_pos, (*(scp->mouse_pos) & 0xff00) | SC_MOUSE_CHAR);
writew(crt_pos+2*scp->xsize,
(*(scp->mouse_pos + scp->xsize) & 0xff00) | (SC_MOUSE_CHAR + 2));
if (scp->mouse_xpos < (scp->xsize-1)*8) {
*(crt_pos + 1) = (*(scp->mouse_pos + 1) & 0xff00) | (SC_MOUSE_CHAR + 1);
*(crt_pos+scp->xsize + 1) =
(*(scp->mouse_pos + scp->xsize + 1) & 0xff00) | (SC_MOUSE_CHAR + 3);
writew(crt_pos + 2, (*(scp->mouse_pos + 1) & 0xff00) | (SC_MOUSE_CHAR + 1));
writew(crt_pos+2*scp->xsize + 2,
(*(scp->mouse_pos + scp->xsize + 1) & 0xff00) | (SC_MOUSE_CHAR + 3));
}
mark_for_update(scp, scp->mouse_pos - scp->scr_buf);
mark_for_update(scp, scp->mouse_pos + scp->xsize + 1 - scp->scr_buf);
@ -5211,12 +5308,12 @@ draw_mouse_image(scr_stat *scp)
static void
remove_mouse_image(scr_stat *scp)
{
u_short *crt_pos = Crtat + (scp->mouse_oldpos - scp->scr_buf);
u_int32_t crt_pos = Crtat + 2*(scp->mouse_oldpos - scp->scr_buf);
*(crt_pos) = *(scp->mouse_oldpos);
*(crt_pos+1) = *(scp->mouse_oldpos+1);
*(crt_pos+scp->xsize) = *(scp->mouse_oldpos+scp->xsize);
*(crt_pos+scp->xsize+1) = *(scp->mouse_oldpos+scp->xsize+1);
writew(crt_pos, *(scp->mouse_oldpos));
writew(crt_pos+2, *(scp->mouse_oldpos+1));
writew(crt_pos+2*scp->xsize, *(scp->mouse_oldpos+scp->xsize));
writew(crt_pos+2*scp->xsize+2, *(scp->mouse_oldpos+scp->xsize+1));
mark_for_update(scp, scp->mouse_oldpos - scp->scr_buf);
mark_for_update(scp, scp->mouse_oldpos + scp->xsize + 1 - scp->scr_buf);
}
@ -5228,7 +5325,7 @@ draw_cutmarking(scr_stat *scp)
u_short och, nch;
for (ptr=scp->scr_buf; ptr<=(scp->scr_buf+(scp->xsize*scp->ysize)); ptr++) {
nch = och = *(Crtat + (ptr - scp->scr_buf));
nch = och = readw(Crtat + 2*(ptr - scp->scr_buf));
/* are we outside the selected area ? */
if ( ptr < (scp->mouse_cut_start > scp->mouse_cut_end ?
scp->mouse_cut_end : scp->mouse_cut_start) ||
@ -5250,7 +5347,7 @@ draw_cutmarking(scr_stat *scp)
}
}
if (nch != och)
*(Crtat + (ptr - scp->scr_buf)) = nch;
writew(Crtat + 2*(ptr - scp->scr_buf), nch);
}
}
@ -5322,11 +5419,11 @@ blink_screen(void *arg)
}
else {
if (blink_in_progress & 1)
fillw(kernel_default.std_color | scr_map[0x20],
Crtat, scp->xsize * scp->ysize);
fillw_io(kernel_default.std_color | scr_map[0x20],
Crtat, scp->xsize * scp->ysize);
else
fillw(kernel_default.rev_color | scr_map[0x20],
Crtat, scp->xsize * scp->ysize);
fillw_io(kernel_default.rev_color | scr_map[0x20],
Crtat, scp->xsize * scp->ysize);
blink_in_progress--;
timeout(blink_screen, scp, hz / 10);
}
@ -5336,19 +5433,19 @@ void
sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark)
{
if (!VESA_MODE(scp->mode)) {
generic_bcopy(p+from, Crtat+from, (to-from+1)*sizeof (u_short));
memcpy_toio(Crtat+2*from, p+from, (to-from+1)*sizeof (u_short));
} else if (scp->mode == 0x102) {
u_char *d, *e;
u_int32_t d, e;
int i,j;
if (mark)
mark = 255;
d = (u_char *)Crtat;
d = Crtat;
d += 10 + 6*16*100 + (from%80) + 16*100*(from/80);
for (i = from ; i <= to ; i++) {
e = d;
for (j = 0 ; j < 16; j++) {
*e = mark^font_16[(p[i]&0xff)*16+j];
writeb(e, mark^font_16[(p[i]&0xff)*16+j]);
e+=100;
}
d++;
@ -5393,4 +5490,8 @@ scsplash(int show)
#endif /* SC_SPLASH_SCREEN */
CDEV_DRIVER_MODULE(sc, isa, sc_driver, sc_devclass,
CDEV_MAJOR, scdevsw, 0, 0);
#endif /* NSC */

View file

@ -25,7 +25,8 @@
* (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.38 1998/08/03 09:09:35 yokota Exp $
* $Id$
* from: i386/isa syscons.h,v 1.39
*/
#ifndef _I386_ISA_SYSCONS_H_
@ -35,7 +36,18 @@
#define ISMAPPED(pa, width) \
(((pa) <= (u_long)0x1000 - (width)) \
|| ((pa) >= 0xa0000 && (pa) <= 0x100000 - (width)))
#if 0
#define pa_to_va(pa) (KERNBASE + (pa)) /* works if ISMAPPED(pa...) */
#endif
#ifdef __i386__
#define WRITEB(pa, b) *(u_int8_t*)(KERNBASE + (pa)) = b
#define READB(pa) *(u_int8_t*)(KERNBASE + (pa))
#else
#define WRITEB(pa, b) writeb(pa, b)
#define READB(pa) readb(pa)
#endif
/* printable chars */
#define PRINTABLE(ch) ((ch) > 0x1b || ((ch) > 0x0d && (ch) < 0x1b) \
@ -184,7 +196,9 @@ typedef struct scr_stat {
u_short *history_pos; /* position shown on screen */
u_short *history_save; /* save area index */
int history_size; /* size of history buffer */
#ifdef __i386__
struct apmhook r_hook; /* reconfiguration support */
#endif
#ifdef SC_SPLASH_SCREEN
u_char splash_save_mode; /* saved mode for splash screen */
#endif

View file

@ -32,6 +32,7 @@
*
* from: Header: timerreg.h,v 1.2 93/02/28 15:08:58 mccanne Exp
* $Id$
* from: i386/isa timerreg.h,v 1.5
*/
/*