Rewrite video emulation. Features:

- slightly more accurate VGA hardware emulation;
- more int 10 functions, especially wrt to palette handling;
- first shot at graphics support;
- mode switching.

Bugs:

- graphics too slow;
- only 16 color modes work for now;
- works only under X, and only with 16 bit TrueColor visuals;
- far from being genuinely useful (I can play an old EGA game now, though
  (mahjongg.exe)).

Also, the code has been cleaned up a bit (more to come in a separate commit).
This commit is contained in:
Thomas Gellekum 2001-07-24 11:44:20 +00:00
parent 55fd28c86b
commit 040395f4dd
16 changed files with 3145 additions and 1592 deletions

View file

@ -7,10 +7,10 @@ SRCS= AsyncIO.c ParseBuffer.c bios.c callback.c cpu.c dos.c cmos.c config.c \
cwd.c debug.c disktab.c doscmd.c ems.c emuint.c exe.c i386-pinsn.c \
int.c int10.c int13.c int14.c int16.c int17.c int1a.c int2f.c intff.c \
mem.c mouse.c net.c port.c setver.c signal.c timer.c trace.c trap.c \
tty.c xms.c
tty.c video.c xms.c
CFLAGS+= -I. -DDISASSEMBLER
CLEANFILES= cp437-8x16.pcf.gz emsdriv.sys redir.com
CFLAGS+= -DDISASSEMBLER
CLEANFILES= ${FONTFILES} ${FONTHDRS} emsdriv.sys redir.com
.if ${OBJFORMAT} == "aout"
CLEANFILES+= doscmd.kernel crt0.o doscmd_loader.o
@ -35,6 +35,11 @@ DPADD+= ${XLIBDIR}/libX11.a
CFLAGS+= -DNO_X
.endif
FONTFILES= cp437-8x8.pcf.gz cp437-8x14.pcf.gz cp437-8x16.pcf.gz
FONTHDRS= font8x8.h font8x14.h font8x16.h
beforedepend: ${FONTHDRS}
beforeinstall:
.if ${OBJFORMAT} == "aout"
${INSTALL} ${COPY} -o ${BINOWN} -g ${EXEGRP} -m ${EXEMODE} \
@ -43,10 +48,10 @@ beforeinstall:
${INSTALL} ${COPY} -o ${BINOWN} -g ${EXEGRP} -m ${EXEMODE} \
emsdriv.sys redir.com ${DESTDIR}/usr/libdata/doscmd/
${INSTALL} ${COPY} -o ${BINOWN} -g ${EXEGRP} -m ${SHAREMODE} \
cp437-8x16.pcf.gz ${DESTDIR}/usr/libdata/doscmd/fonts
${FONTFILES} ${DESTDIR}/usr/libdata/doscmd/fonts
cd ${.CURDIR} && \
${INSTALL} ${COPY} -o ${BINOWN} -g ${EXEGRP} -m ${SHAREMODE} \
fonts.dir ${DESTDIR}/usr/libdata/doscmd/fonts
fonts.alias fonts.dir ${DESTDIR}/usr/libdata/doscmd/fonts
.if ${OBJFORMAT} == "aout"
doscmd: ${LIBCRT0} doscmd_loader.o ${LIBGCC} ${LIBC}
@ -57,14 +62,32 @@ doscmd: ${LIBCRT0} doscmd_loader.o ${LIBGCC} ${LIBC}
.depend: doscmd_loader.c
# Bogus dependencies to get more than one binary created by `make all'.
doscmd: cp437-8x16.pcf.gz doscmd.kernel emsdriv.sys redir.com
doscmd: ${FONTFILES} ${FONTHDRS} doscmd.kernel emsdriv.sys redir.com
.else
doscmd: cp437-8x16.pcf.gz emsdriv.sys redir.com
doscmd: ${FONTFILES} ${FONTHDRS} emsdriv.sys redir.com
.endif
cp437-8x8.pcf.gz: cp437-8x8.pcf.gz.uu
uudecode ${.CURDIR}/cp437-8x8.pcf.gz.uu
cp437-8x14.pcf.gz: cp437-8x14.pcf.gz.uu
uudecode ${.CURDIR}/cp437-8x14.pcf.gz.uu
cp437-8x16.pcf.gz: cp437-8x16.pcf.gz.uu
uudecode ${.CURDIR}/cp437-8x16.pcf.gz.uu
font8x8.h:
uudecode -p /usr/src/share/syscons/fonts/cp437-8x8.fnt | \
file2c 'u_int8_t font8x8[] = {' '};' > ${.TARGET}
font8x14.h:
uudecode -p /usr/src/share/syscons/fonts/cp437-8x14.fnt | \
file2c 'u_int8_t font8x14[] = {' '};' > ${.TARGET}
font8x16.h:
uudecode -p /usr/src/share/syscons/fonts/cp437-8x16.fnt | \
file2c 'u_int8_t font8x16[] = {' '};' > ${.TARGET}
emsdriv.sys: emsdriv.sys.uu
uudecode ${.CURDIR}/emsdriv.sys.uu

View file

@ -0,0 +1,113 @@
$FreeBSD$
begin 644 cp437-8x14.pcf.gz
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
8/CR)#Z_*3G)5^.G]#>&?`*T-&*=$6@``
`
end

View file

@ -0,0 +1,104 @@
$FreeBSD$
begin 644 cp437-8x8.pcf.gz
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
6^(@Z=)+K`/[7_A\"WP<A_#T,0$(``)/X
`
end

View file

@ -1,9 +1,42 @@
/*
** No copyright ?!
**
** $FreeBSD$
*/
* Copyright (c) 2001 The FreeBSD Project, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY The FreeBSD Project, Inc. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL The FreeBSD Project, Inc. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
#include "doscmd.h"
#include "video.h"
static u_int32_t decode_modrm(u_int8_t *, u_int16_t, regcontext_t *, int *);
static u_int8_t reg8(u_int8_t c, regcontext_t *);
static u_int16_t reg16(u_int8_t c, regcontext_t *);
#if 0
static u_int32_t reg32(u_int8_t c, regcontext_t *);
#endif
static void write_byte(u_int32_t, u_int8_t);
static void write_word(u_int32_t, u_int16_t);
/*
** Hardware /0 interrupt
@ -68,3 +101,241 @@ cpu_init(void)
ivec[0x3e] = vec; /* floating point emulator */
ivec[0x3f] = vec; /* floating point emulator */
}
/*
* Emulate CPU instructions. We need this for VGA graphics, at least in the 16
* color modes.
*
* The emulator is far from complete. We are adding the instructions as we
* encounter them, so this function is likely to change over time. There are
* no optimizations and we only emulate a single instruction at a time.
*
* As long as there is no support for DPMI or the Operand Size Override prefix
* we won't need the 32-bit registers. This also means that the default
* operand size is 16 bit.
*/
int
emu_instr(regcontext_t *REGS)
{
int prefix = 1;
u_int8_t *cs = (u_int8_t *)(R_CS << 4);
int ip = R_IP;
int instrlen;
int dir;
u_int16_t value;
u_int16_t seg = R_DS;
u_int32_t addr, endaddr;
while (prefix) {
prefix = 0;
switch (cs[ip]) {
case 0x26: /* Segment Override ES */
seg = R_ES;
prefix = 1;
ip++;
break;
case 0x2e: /* Segment Override CS */
seg = R_CS;
prefix = 1;
ip++;
break;
case 0x36: /* Segment Override SS */
seg = R_SS;
prefix = 1;
ip++;
break;
case 0x3e: /* Segment Override DS */
seg = R_DS;
prefix = 1;
ip++;
break;
case 0x64: /* Segment Override FS */
seg = R_FS;
prefix = 1;
ip++;
break;
case 0x65: /* Segment Override GS */
seg = R_GS;
prefix = 1;
ip++;
break;
case 0x88: /* mov r/m8, r8 */
addr = decode_modrm(cs + ip, seg, REGS, &instrlen);
write_byte(addr, reg8(cs[ip + 1], REGS));
ip += 2 + instrlen;
break;
case 0xc6: /* mov r/m8, imm8 */
addr = decode_modrm(cs + ip, seg, REGS, &instrlen);
write_byte(addr, cs[ip + 2 + instrlen]);
ip += 2 + instrlen + 1;
break;
case 0xc7: /* mov r/m32/16, imm32/16 */
addr = decode_modrm(cs + ip, seg, REGS, &instrlen);
value = *(u_int16_t *)&cs[ip + 2 + instrlen];
write_word(addr, value);
ip += 2 + instrlen + 2;
break;
case 0xab: /* stos m32/16*/
break;
case 0xf3: /* rep */
switch (cs[++ip]) {
case 0xab: /* stos m32/16 */
value = R_AX;
/* direction */
dir = (R_EFLAGS & PSL_D) ? -1 : 1;
addr = MAKEPTR(R_ES, R_DI);
endaddr = MAKEPTR(R_ES, R_DI) + dir * R_CX;
if (addr <= endaddr)
while (addr <= endaddr) {
write_word(addr, value);
addr += 2;
}
else
while (addr >= endaddr) {
write_word(addr, value);
addr -= 2;
}
ip += 2;
break;
default:
R_IP = ip--; /* Move IP back to the 'rep' instruction */
return -1;
}
break;
default:
/* unknown instruction, get out of here and let trap.c:sigbus()
catch it. */
return -1;
}
R_IP = ip;
}
return 0;
}
/* Decode the ModR/M byte. Returns the memory address of the operand. 'c'
points to the current instruction, 'seg' contains the value for the current
base segment; this is usually 'DS', but may have been changed by a segment
override prefix. We return the length of the current instruction in
'instrlen' so we can adjust 'IP' on return.
XXX We will probably need a second function for 32-bit instructions.
XXX We do not check for undefined combinations, like Mod=01, R/M=001. */
static u_int32_t
decode_modrm(u_int8_t *c, u_int16_t seg, regcontext_t *REGS, int *instrlen)
{
u_int32_t addr = 0; /* absolute address */
int16_t dspl = 0; /* displacement, signed */
*instrlen = 0;
switch (c[1] & 0xc0) { /* decode Mod */
case 0x00: /* DS:[reg] */
/* 'reg' is selected in the R/M bits */
break;
case 0x40: /* 8 bit displacement */
dspl = (int16_t)(int8_t)c[2];
*instrlen = 1;
break;
case 0x80: /* 16 bit displacement */
dspl = *(int16_t *)&c[2];
*instrlen = 2;
break;
case 0xc0: /* reg in R/M */
if (c[0] & 1) /* 16-bit reg */
return reg16(c[1], REGS);
else /* 8-bit reg */
return reg8(c[1], REGS);
break;
}
switch (c[1] & 0x07) { /* decode R/M */
case 0x00:
addr = MAKEPTR(seg, R_BX + R_SI);
break;
case 0x01:
addr = MAKEPTR(seg, R_BX + R_DI);
break;
case 0x02:
addr = MAKEPTR(seg, R_BP + R_SI);
break;
case 0x03:
addr = MAKEPTR(seg, R_BP + R_DI);
break;
case 0x04:
addr = MAKEPTR(seg, R_SI);
break;
case 0x05:
addr = MAKEPTR(seg, R_DI);
break;
case 0x06:
if ((c[1] & 0xc0) >= 0x40)
addr += R_BP;
else {
addr = MAKEPTR(seg, *(int16_t *)&c[2]);
*instrlen = 2;
}
break;
case 0x07:
addr = MAKEPTR(seg, R_BX + dspl);
break;
}
return addr;
}
static u_int8_t
reg8(u_int8_t c, regcontext_t *REGS)
{
u_int8_t r8[] = {R_AL, R_CL, R_DL, R_BL, R_AH, R_CH, R_DH, R_BH};
/* select 'rrr' bits in ModR/M */
return r8[(c & 0x34) >> 3];
}
static u_int16_t
reg16(u_int8_t c, regcontext_t *REGS)
{
u_int16_t r16[] = {R_AX, R_CX, R_DX, R_BX, R_SP, R_BP, R_SI, R_DI};
return r16[(c & 0x34) >> 3];
}
#if 0
/* not yet */
static u_int32_t
reg32(u_int8_t c, regcontext_t *REGS)
{
u_int32_t r32[] = {R_EAX, R_ECX, R_EDX, R_EBX,
R_ESP, R_EBP, R_ESI, R_EDI};
return r32[(c & 0x34) >> 3];
}
#endif
/* Write an 8-bit value to the location specified by 'addr'. If 'addr' lies
within the video memory region, we call video.c:vga_write(). */
static void
write_byte(u_int32_t addr, u_int8_t val)
{
if (addr >= 0xa0000 && addr < 0xb0000) {
vga_write(addr, val);
} else
*(u_int8_t *)addr = val;
return;
}
/* Write a 16-bit value to the location specified by 'addr'. If 'addr' lies
within the video memory region, we call video.c:vga_write(). */
static void
write_word(u_int32_t addr, u_int16_t val)
{
if (addr >= 0xa0000 && addr < 0xb0000) {
vga_write(addr, (u_int8_t)(val & 0xff));
vga_write(addr + 1, (u_int8_t)((val & 0xff00) >> 8));
} else
*(u_int16_t *)addr = val;
return;
}

View file

@ -38,7 +38,7 @@
.Nd run a subset of real-mode DOS programs
.Sh SYNOPSIS
.Nm
.Fl 23AbDEfHIMOPRrtVvXxYz
.Fl 23AbDEfGHIMOPRrtVvXxYz
.Fl c Ar file
.Fl d Ar file
.Fl i Ar port Ns Xo
@ -138,6 +138,11 @@ Enable debugging of the exec routines.
.\"
.\"
.\"
.It Fl G
Enable debugging of the video (graphics) routines.
.\"
.\"
.\"
.It Fl H
Enable tracing of half implemented calls.
.\"

View file

@ -37,6 +37,8 @@
#include <sys/mman.h>
#include <sys/time.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <limits.h>
#include <paths.h>
@ -52,6 +54,10 @@
#include <machine/vm86.h>
#include "doscmd.h"
#include "cwd.h"
#include "trap.h"
#include "tty.h"
#include "video.h"
/* exports */
int capture_fd = -1;
@ -61,7 +67,7 @@ int booting = 0;
int raw_kbd = 0;
int timer_disable = 0;
struct timeval boot_time;
unsigned long *ivec = (unsigned long *)0;
unsigned long *ivec = (unsigned long *)0;
u_long pending[256]; /* pending interrupts */
int n_pending;
@ -85,7 +91,6 @@ static FILE *find_doscmdrc(void);
static int do_args(int argc, char *argv[]);
static void usage(void);
static int open_name(char *name, char *ext);
static void init_iomap(void);
/* Local option flags &c. */
static int zflag = 0;
@ -113,9 +118,6 @@ main(int argc, char **argv)
regcontext_t *REGS = (regcontext_t *)&uc.uc_mcontext;
int fd;
int i;
char buffer[4096];
FILE *fp;
/* XXX should only be for tty mode */
fd = open (_PATH_DEVNULL, O_RDWR);
@ -202,16 +204,16 @@ main(int argc, char **argv)
}
/* install signal handlers */
setsignal (SIGFPE, sigfpe); /* */
setsignal (SIGALRM, sigalrm); /* */
setsignal (SIGILL, sigill); /* */
setsignal (SIGTRAP, sigtrap); /* */
setsignal (SIGUSR2, sigtrace); /* */
setsignal (SIGINFO, sigtrace); /* */
setsignal(SIGFPE, sigfpe); /* */
setsignal(SIGALRM, sigalrm); /* */
setsignal(SIGILL, sigill); /* */
setsignal(SIGTRAP, sigtrap); /* */
setsignal(SIGUSR2, sigtrace); /* */
setsignal(SIGINFO, sigtrace); /* */
#ifdef USE_VM86
setsignal (SIGURG, sigurg); /* entry from NetBSD vm86 */
setsignal(SIGURG, sigurg); /* entry from NetBSD vm86 */
#else
setsignal (SIGBUS, sigbus); /* entry from FreeBSD, BSD/OS vm86 */
setsignal(SIGBUS, sigbus); /* entry from FreeBSD, BSD/OS vm86 */
#endif
/* Call init functions */
@ -220,6 +222,8 @@ main(int argc, char **argv)
init_io_port_handlers();
bios_init();
cpu_init();
kbd_init();
kbd_bios_init();
video_init();
if (xmode)
mouse_init();
@ -285,6 +289,8 @@ main(int argc, char **argv)
if (vflag) dump_regs(REGS);
fatal ("vm86 returned (no kernel support?)\n");
#undef sc
/* quiet -Wall */
return 0;
}
/*
@ -342,19 +348,19 @@ setup_boot(regcontext_t *REGS)
** try to read the boot sector from the specified disk
*/
static int
try_boot(int booting)
try_boot(int bootdrv)
{
int fd;
fd = disk_fd(booting);
fd = disk_fd(bootdrv);
if (fd < 0) { /* can we boot it? */
debug(D_DISK, "Cannot boot from %c\n", drntol(booting));
debug(D_DISK, "Cannot boot from %c\n", drntol(bootdrv));
return -1;
}
/* read bootblock */
if (read(fd, (char *)0x7c00, 512) != 512) {
debug(D_DISK, "Short read on boot block from %c:\n", drntol(booting));
debug(D_DISK, "Short read on boot block from %c:\n", drntol(bootdrv));
return -1;
}
@ -472,7 +478,6 @@ find_doscmdrc(void)
{
FILE *fp;
char buffer[4096];
int fd;
if ((fp = fopen(".doscmdrc", "r")) == NULL) {
struct passwd *pwd = getpwuid(geteuid());
@ -505,10 +510,10 @@ do_args(int argc, char *argv[])
FILE *fp;
char *col;
while ((c = getopt (argc, argv, "234Oc:TkCIEMPRLAU:S:HDtzvVxXYfbri:o:p:d:")) != -1) {
while ((c = getopt (argc, argv, "234Oc:TkCIEGMPRLAU:S:HDtzvVxXYfbri:o:p:d:")) != -1) {
switch (c) {
case 'd':
if (fp = fopen(optarg, "w")) {
if ((fp = fopen(optarg, "w")) != 0) {
debugf = fp;
setbuf (fp, NULL);
} else
@ -535,7 +540,7 @@ do_args(int argc, char *argv[])
break;
case 'i':
i = 1;
if (col = strchr(optarg, ':')) {
if ((col = strchr(optarg, ':')) != 0) {
*col++ = 0;
i = strtol(col, 0, 0);
}
@ -547,7 +552,7 @@ do_args(int argc, char *argv[])
break;
case 'o':
i = 1;
if (col = strchr(optarg, ':')) {
if ((col = strchr(optarg, ':')) != 0) {
*col++ = 0;
i = strtol(col, 0, 0);
}
@ -559,7 +564,7 @@ do_args(int argc, char *argv[])
break;
case 'p':
i = 1;
if (col = strchr(optarg, ':')) {
if ((col = strchr(optarg, ':')) != 0) {
*col++ = 0;
i = strtol(col, 0, 0);
}
@ -589,6 +594,9 @@ do_args(int argc, char *argv[])
case 'E':
debug_flags |= D_EXEC;
break;
case 'G':
debug_flags |= D_VIDEO;
break;
case 'C':
debug_flags |= D_DOSCALL;
break;

View file

@ -63,7 +63,6 @@
#include "register.h"
#include "dos.h"
#include "callback.h"
#include "cwd.h"
#define drlton(a) ((islower((a)) ? toupper((a)) : (a)) - 'A')
#define drntol(a) ((a) + 'A')
@ -88,6 +87,34 @@ struct vconnect_area {
extern struct vconnect_area vconnect_area;
#define IntState vconnect_area.int_state
/* ParseBuffer.c */
extern int ParseBuffer(char *, char **, int);
/* bios.c */
#define BIOSDATA ((u_char *)0x400)
extern unsigned long rom_config;
extern int nfloppies;
extern int ndisks;
extern int nserial;
extern int nparallel;
extern volatile int poll_cnt;
extern void bios_init(void);
extern void wakeup_poll(void);
extern void reset_poll(void);
extern void sleep_poll(void);
/* cmos.c */
extern time_t delta_clock;
extern void cmos_init(void);
/* config.c */
extern int read_config(FILE *fp);
/* cpu.c */
extern void cpu_init(void);
extern int emu_instr(regcontext_t *);
/* debug.c */
extern int vflag;
@ -100,7 +127,7 @@ extern int debug_flags;
#define D_TRAPS 0x0000200 /* trap-related activity */
#define D_FILE_OPS 0x0000400 /* file-related activity */
#define D_MEMORY 0x0000800 /* memory-related activity */
#define D_HALF 0x0001000 /* for "half-implemented" system calls */
#define D_HALF 0x0001000 /* "half-implemented" system calls */
#define D_FLOAT 0x0002000 /* ??? */
#define D_DISK 0x0004000 /* disk (not file) operations */
#define D_TRAPS2 0x0008000
@ -114,6 +141,7 @@ extern int debug_flags;
#define D_DOSCALL 0x0800000 /* MS-DOS function results */
#define D_XMS 0x1000000 /* XMS calls */
#define D_EMS 0x2000000 /* EMS calls */
#define D_VIDEO 0x4000000 /* video-related activity */
#define TTYF_ECHO 0x00000001
#define TTYF_ECHONL 0x00000003
@ -135,7 +163,12 @@ extern void debug_set(int x);
extern void debug_unset(int x);
extern u_long debug_isset(int x);
/* disktab.c */
extern int map_type(int, int *, int *, int *);
/* doscmd.c */
extern int squirrel_fd(int);
extern int capture_fd;
extern int dead;
extern int xmode;
@ -151,58 +184,18 @@ extern void done(regcontext_t *REGS, int val);
extern void quit(int);
extern void call_on_quit(void (*)(void *), void *);
extern void iomap_port(int port, int count);
/* signal.c */
extern struct sigframe *saved_sigframe;
extern regcontext_t *saved_regcontext;
extern int saved_valid;
extern void setsignal(int s, void (*h)(struct sigframe *));
/* cmos.c */
extern time_t delta_clock;
extern void cmos_init(void);
/* config.c */
extern int read_config(FILE *fp);
/* tty.c */
extern char *xfont;
/* setver.c */
extern void setver(char *, short);
extern short getver(char *);
/* mem.c */
extern char *dosmem;
extern void mem_init(void);
extern int mem_alloc(int size, int owner, int *biggestp);
extern int mem_adjust(int addr, int size, int *availp);
extern void mem_free_owner(int owner);
extern void mem_change_owner(int addr, int owner);
/* intff.c */
extern int int2f_11(regcontext_t *REGS);
extern void intff(regcontext_t *REGS);
/* ems.c */
extern int ems_init();
extern void ems_entry(regcontext_t *REGS);
extern u_long ems_frame_addr;
/* emuint.c */
extern void emuint(regcontext_t *REGS);
/* trap.c */
extern void fake_int(regcontext_t *REGS, int);
extern void sigtrap(struct sigframe *sf);
extern void sigtrace(struct sigframe *sf);
extern void sigalrm(struct sigframe *sf);
extern void sigill(struct sigframe *sf);
extern void sigfpe(struct sigframe *sf);
extern void breakpoint(struct sigframe *sf);
#ifdef USE_VM86
extern void sigurg(struct sigframe *sf);
#else
extern void sigbus(struct sigframe *sf);
#endif
/* i386-pinsn.c */
extern int i386dis(unsigned short, unsigned short,
unsigned char *, char *, int);
/* int.c */
extern void softint(int intnum);
@ -211,19 +204,8 @@ extern void hardint(int intnum);
extern void delay_interrupt(int intnum, void (*func)(int));
extern void resume_interrupt(void);
/* bios.c */
#define BIOSDATA ((u_char *)0x400)
extern unsigned long rom_config;
extern int nfloppies;
extern int ndisks;
extern int nserial;
extern int nparallel;
extern volatile int poll_cnt;
extern void wakeup_poll(void);
extern void reset_poll(void);
extern void sleep_poll(void);
/* int10.c */
extern void int10(regcontext_t *);
/* int13.c */
extern int init_hdisk(int drive, int cyl, int head, int tracksize,
@ -240,55 +222,71 @@ extern void printer_direct(int printer);
extern void printer_spool(int printer, char *print_queue);
extern void printer_timeout(int printer, char *time_out);
/* int2f.c */
extern void int2f(regcontext_t *);
/* intff.c */
extern int int2f_11(regcontext_t *REGS);
extern void intff(regcontext_t *REGS);
/* mem.c */
extern char *dosmem;
extern void mem_init(void);
extern int mem_alloc(int size, int owner, int *biggestp);
extern int mem_adjust(int addr, int size, int *availp);
extern void mem_free_owner(int owner);
extern void mem_change_owner(int addr, int owner);
/* mouse.c */
extern void mouse_init(void);
/* net.c */
extern void net_init(void);
/* port.c */
extern void define_input_port_handler(int, unsigned char (*)(int));
extern void define_output_port_handler(int, void (*)(int, unsigned char));
extern void inb(regcontext_t *, int);
extern void init_io_port_handlers(void);
extern void inx(regcontext_t *, int);
extern void outb(regcontext_t *, int);
extern void outx(regcontext_t *, int);
extern void speaker_init(void);
extern void outb_traceport(int, unsigned char);
extern unsigned char inb_traceport(int);
extern void outb_port(int, unsigned char);
extern unsigned char inb_port(int);
/* setver.c */
extern void setver(char *, short);
extern short getver(char *);
/* signal.c */
extern struct sigframe *saved_sigframe;
extern regcontext_t *saved_regcontext;
extern int saved_valid;
extern void setsignal(int s, void (*h)(struct sigframe *));
/* timer.c */
extern void timer_init(void);
/* trace.c */
extern int resettrace(regcontext_t *);
extern void tracetrap(regcontext_t *);
/* xms.c */
extern int int2f_43(regcontext_t *REGS);
extern void get_raw_extmemory_info(regcontext_t *REGS);
extern int int2f_43(regcontext_t *REGS);
extern void initHMA(void);
extern void xms_init(void);
extern u_long xms_maxsize;
/* ems.c */
extern int ems_init();
extern void ems_entry(regcontext_t *REGS);
extern u_long ems_frame_addr;
/****************************** dirty below here ******************************/
/****************************** dirty below here *****************************/
extern u_long pending[]; /* pending interrupts */
extern int n_pending;
u_char *VREG;
extern int nmice;
extern int redirect0;
extern int redirect1;
extern int redirect2;
extern int kbd_fd;
extern int jmp_okay;
void put_dosenv(char *value);
/* TTY subsystem XXX rewrite! */
int tty_eread(REGISTERS, int, int);
void tty_write(int, int);
void tty_rwrite(int, int, int);
void tty_move(int, int);
void tty_report(int *, int *);
void tty_flush();
void tty_index();
void tty_pause();
int tty_peek(REGISTERS, int);
int tty_state();
void tty_scroll(int, int, int, int, int, int);
void tty_rscroll(int, int, int, int, int, int);
int tty_char(int, int);
void video_setborder(int);
void outb_traceport(int, unsigned char);
unsigned char inb_traceport(int);
void outb_port(int, unsigned char);
unsigned char inb_port(int);

View file

@ -1,407 +0,0 @@
/*
* Copyright (c) 1992, 1993, 1996
* Berkeley Software Design, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Berkeley Software
* Design, Inc.
*
* THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* BSDI font.h,v 2.2 1996/04/08 19:32:35 bostic Exp
*/
unsigned char ascii_font[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81,
0x81, 0xbd, 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe,
0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7,
0xe7, 0x99, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66,
0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc,
0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66,
0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63,
0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06,
0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18,
0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66,
0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b,
0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38,
0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe,
0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18,
0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe,
0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 0x6c,
0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38,
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c,
0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0x86, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30,
0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c,
0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7c, 0xc6, 0xc6, 0xce, 0xd6, 0xd6, 0xe6, 0xc6, 0xc6, 0x7c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06,
0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c,
0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x0e, 0x06, 0x06,
0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x60, 0xc0,
0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6,
0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60,
0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c,
0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc,
0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66,
0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0,
0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78,
0x68, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xf0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde,
0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6,
0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xe6, 0x66, 0x6c, 0x6c, 0x78, 0x78, 0x6c, 0x66,
0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60,
0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6,
0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe,
0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c,
0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c,
0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
0xc6, 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c,
0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
0xc6, 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x6c, 0x38, 0x38, 0x6c, 0x6c, 0xc6,
0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc2, 0xc6, 0xfe,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x30, 0x30, 0x18, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc,
0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60,
0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0xdc, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6,
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c,
0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0,
0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c,
0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66,
0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xec, 0xfe, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66,
0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c,
0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc,
0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xdc, 0x76, 0x62, 0x60, 0x60, 0x60, 0xf0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc,
0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6,
0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xc6, 0x6c, 0x38, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00,
0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2,
0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc,
0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0,
0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00,
0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xcc, 0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc,
0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78,
0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00,
0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60,
0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10,
0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xfe,
0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30,
0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18,
0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18,
0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x10, 0x38,
0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6,
0xc6, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66,
0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xcc, 0x76, 0x36, 0x7e, 0xd8, 0xd8, 0x6e,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe,
0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30,
0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc,
0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x38,
0x6c, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
0x00, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x3c, 0x66, 0x60,
0x60, 0x60, 0x66, 0x3c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e,
0x18, 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0xcc, 0xcc, 0xc6, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18,
0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30,
0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18,
0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60,
0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6,
0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00,
0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30,
0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06,
0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x93, 0x06, 0x0c, 0x1f,
0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66,
0xce, 0x9a, 0x3f, 0x06, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x66, 0xcc, 0x66, 0x33,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11,
0x44, 0x11, 0x44, 0x11, 0x44, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0xdd,
0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00,
0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6,
0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18,
0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30,
0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18,
0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f,
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xfc,
0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xfe,
0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xfe, 0x6c, 0x6c, 0x6c,
0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8,
0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66,
0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c,
0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6,
0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb,
0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x06, 0x7e, 0xcf, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60,
0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00,
0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00,
0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c,
0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x6c, 0x6c,
0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x70, 0x98, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c,
0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
};

View file

@ -1,2 +1,4 @@
1
cp437-8x16.pcf.gz vga
3
cp437-8x8.pcf.gz cp437-8x8
cp437-8x14.pcf.gz cp437-8x14
cp437-8x16.pcf.gz cp437-8x16

View file

@ -32,17 +32,17 @@
* $FreeBSD$
*/
#include <unistd.h>
#include "doscmd.h"
#include "mouse.h"
#include "tty.h"
#include "video.h"
/*
* 0040:0060 contains the start and end of the cursor
*/
#define curs_end BIOSDATA[0x60]
#define curs_start BIOSDATA[0x61]
static int cursoremu = 1;
void
int10(REGISTERS)
int10(regcontext_t *REGS)
{
char *addr;
int i, j;
@ -55,113 +55,256 @@ int10(REGISTERS)
reset_poll();
switch (R_AH) {
case 0x00: /* Set display mode */
debug(D_HALF, "Set video mode to %02x\n", R_AL);
case 0x00: /* Set display mode */
init_mode(R_AL);
break;
case 0x01: /* Define cursor */
curs_start = R_CH;
curs_end = R_CL;
case 0x01: /* Define cursor */
{
int start, end;
start = R_CH;
end = R_CL;
if (cursoremu == 0)
goto out;
/* Cursor emulation */
if (start <= 3 && end <= 3)
goto out;
if (start + 2 >= end) {
/* underline cursor */
start = CharHeight - 3;
end = CharHeight - 2;
goto out;
}
if (start <= 2 || end < start) {
/* block cursor */
start = 0;
end = CharHeight - 2;
goto out;
}
if (start > CharHeight / 2) {
/* half block cursor */
start = CharHeight / 2;
end = 0;
}
out: CursStart = start;
CursEnd = end;
break;
case 0x02: /* Position cursor */
}
case 0x02: /* Position cursor */
if (!xmode)
goto unsupported;
tty_move(R_DH, R_DL);
break;
case 0x03: /* Read cursor position */
case 0x03: /* Read cursor position */
if (!xmode)
goto unsupported;
tty_report(&i, &j);
R_DH = i;
R_DL = j;
R_CH = curs_start;
R_CL = curs_end;
R_CH = CursStart;
R_CL = CursEnd;
break;
case 0x05:
debug(D_HALF, "Select current display page %d\n", R_AL);
debug(D_VIDEO, "Select current display page %d\n", R_AL);
break;
case 0x06: /* initialize window/scroll text upward */
case 0x06: /* initialize window/scroll text upward */
if (!xmode)
goto unsupported;
if (R_AL == 0) /* clear screen */
R_AL = DpyRows + 1;
tty_scroll(R_CH, R_CL,
R_DH, R_DL,
R_AL, R_BH << 8);
R_DH, R_DL,
R_AL, R_BH << 8);
break;
case 0x07: /* initialize window/scroll text downward */
case 0x07: /* initialize window/scroll text downward */
if (!xmode)
goto unsupported;
if (R_AL == 0) /* clear screen */
R_AL = DpyRows + 1;
tty_rscroll(R_CH, R_CL,
R_DH, R_DL,
R_AL, R_BH << 8);
R_DH, R_DL,
R_AL, R_BH << 8);
break;
case 0x08: /* read character/attribute */
case 0x08: /* read character/attribute */
if (!xmode)
goto unsupported;
i = tty_char(-1, -1);
R_AX = i;
break;
case 0x09: /* write character/attribute */
case 0x09: /* write character/attribute */
if (!xmode)
goto unsupported;
tty_rwrite(R_CX, R_AL, R_BL << 8);
break;
case 0x0a: /* write character */
case 0x0a: /* write character */
if (!xmode)
goto unsupported;
debug(D_HALF, "Int 10:0a: Write char: %02x\n", R_AL);
tty_rwrite(R_CX, R_AL, -1);
break;
case 0x0b: /* set border color */
case 0x0b: /* set border color */
if (!xmode)
goto unsupported;
video_setborder(R_BL);
break;
case 0x0e: /* write character */
case 0x0c: /* write graphics pixel */
debug(D_VIDEO, "Write graphics pixel at %d, %d\n", R_CX, R_DX);
break;
case 0x0d: /* read graphics pixel */
debug(D_VIDEO, "Read graphics pixel at %d, %d\n", R_CX, R_DX);
break;
case 0x0e: /* write character */
tty_write(R_AL, -1);
break;
case 0x0f: /* get display mode */
R_AH = 80; /* number of columns */
R_AL = 3; /* color */
R_BH = 0; /* display page */
case 0x0f: /* get current video mode */
R_AH = DpyCols; /* number of columns */
R_AL = VideoMode; /* active mode */
R_BH = 0;/*ActivePage *//* display page */
break;
case 0x10:
if (!xmode)
goto unsupported;
switch (R_AL) {
case 0x01:
video_setborder(R_BH & 0x0f);
case 0x00: /* Set single palette register */
palette[R_BL] = R_BH;
update_pixels();
break;
case 0x02: /* Set pallete registers */
debug(D_HALF, "INT 10 10:02 Set all palette registers\n");
case 0x01: /* Set overscan register */
VGA_ATC[ATC_OverscanColor] = R_BH;
break;
case 0x02: /* Set all palette registers */
addr = (char *)MAKEPTR(R_ES, R_DX);
for (i = 0; i < 16; i++)
palette[i] = *addr++;
VGA_ATC[ATC_OverscanColor] = *addr;
update_pixels();
break;
case 0x03: /* Enable/Disable blinking mode */
video_blink(R_BL ? 1 : 0);
video_blink((R_BL & 1) ? 1 : 0);
break;
case 0x13:
case 0x07: /* Get individual palette register */
R_BH = palette[R_BL];
break;
case 0x08: /* Read overscan register */
R_BH = VGA_ATC[ATC_OverscanColor];
break;
case 0x09: /* Read all palette registers */
addr = (char *)MAKEPTR(R_ES, R_DX);
for (i = 0; i < 16; i++)
*addr++ = palette[i];
*addr = VGA_ATC[ATC_OverscanColor];
break;
case 0x10: /* Set individual DAC register */
dac_rgb[R_BX].red = R_DH & 0x3f;
dac_rgb[R_BX].green = R_CH & 0x3f;
dac_rgb[R_BX].blue = R_CL & 0x3f;
update_pixels();
break;
case 0x12: /* Set block of DAC registers */
addr = (char *)MAKEPTR(R_ES, R_DX);
for (i = R_BX; i < R_BX + R_CX; i++) {
dac_rgb[i].red = *addr++;
dac_rgb[i].green = *addr++;
dac_rgb[i].blue = *addr++;
}
update_pixels();
break;
case 0x13: /* Select video DAC color page */
switch (R_BL) {
case 0:
VGA_ATC[ATC_ModeCtrl] |= (R_BH & 0x01) << 7;
break;
case 1:
VGA_ATC[ATC_ColorSelect] = R_BH & 0x0f;
break;
default:
debug(D_VIDEO, "INT 10 10:13 "
"Bad value for BL: 0x%02x\n", R_BL);
break;
}
case 0x15: /* Read individual DAC register */
R_DH = dac_rgb[R_BX].red;
R_CH = dac_rgb[R_BX].green;
R_CL = dac_rgb[R_BX].blue;
break;
case 0x17: /* Read block of DAC registers */
addr = (char *)MAKEPTR(R_ES, R_DX);
for (i = R_BX; i < R_BX + R_CX; i++) {
*addr++ = dac_rgb[i].red;
*addr++ = dac_rgb[i].green;
*addr++ = dac_rgb[i].blue;
}
break;
case 0x18: /* Set PEL mask */
debug(D_HALF,
"INT 10 10:13 Select color or DAC (%02x, %02x)\n",
R_BL, R_BH);
"INT 10 10:18 Set PEL mask (%02x)\n", R_BL);
break;
case 0x1a: /* get video dac color-page state */
R_BH = 0; /* Current page */
R_BL = 0; /* four pages of 64... */
case 0x19: /* Read PEL mask */
debug(D_HALF, "INT 10 10:19 Read PEL mask\n");
break;
case 0x1a: /* Get video dac color-page state */
R_BH = (VGA_ATC[ATC_ModeCtrl] & 0x80) >> 7;
R_BL = VGA_ATC[ATC_ColorSelect];
break;
case 0x1b: /* Perform gray-scale summing */
debug(D_HALF, "Perform gray-scale summing\n");
break;
default:
unknown_int3(0x10, 0x10, R_AL, REGS);
break;
}
break;
#if 1
case 0x11:
switch (R_AL) {
case 0x00: printf("Tried to load user defined font.\n"); break;
case 0x01: printf("Tried to load 8x14 font.\n"); break;
case 0x02: printf("Tried to load 8x8 font.\n"); break;
case 0x03: printf("Tried to activate character set\n"); break;
case 0x04: printf("Tried to load 8x16 font.\n"); break;
case 0x10: printf("Tried to load and activate user defined font\n"); break;
case 0x11: printf("Tried to load and activate 8x14 font.\n"); break;
case 0x12: printf("Tried to load and activate 8x8 font.\n"); break;
case 0x14: printf("Tried to load and activate 8x16 font.\n"); break;
case 0x00:
debug(D_VIDEO, "Tried to load user defined font.\n");
break;
case 0x01:
debug(D_VIDEO, "Tried to load 8x14 font.\n");
break;
case 0x02:
debug(D_VIDEO, "Tried to load 8x8 font.\n");
break;
case 0x03:
debug(D_VIDEO, "Tried to activate character set\n");
break;
case 0x04:
debug(D_VIDEO, "Tried to load 8x16 font.\n");
break;
case 0x10:
debug(D_VIDEO,
"Tried to load and activate user defined font\n");
break;
case 0x11:
debug(D_VIDEO,
"Tried to load and activate 8x14 font.\n");
break;
case 0x12:
debug(D_VIDEO,
"Tried to load and activate 8x8 font.\n");
break;
case 0x14:
debug(D_VIDEO,
"Tried to load and activate 8x16 font.\n");
break;
case 0x20:
debug(D_VIDEO, "Load second half of 8x8 char set\n");
break;
case 0x21:
debug(D_VIDEO, "Install user defined char set\n");
break;
case 0x22:
debug(D_VIDEO, "Install 8x14 char set\n");
break;
case 0x23:
debug(D_VIDEO, "Install 8x8 char set\n");
break;
case 0x24:
debug(D_VIDEO, "Install 8x16 char set\n");
break;
case 0x30:
R_CX = 14;
R_DL = 24;
R_CX = CharHeight;
R_DL = DpyRows;
switch(R_BH) {
case 0:
PUTVEC(R_ES, R_BP, ivec[0x1f]);
@ -177,9 +320,9 @@ int10(REGISTERS)
case 7:
R_ES = 0;
R_BP = 0;
debug(D_HALF,
"INT 10 11:30 Request font address %02x",
R_BH);
debug(D_VIDEO,
"INT 10 11:30 Request font address %02x",
R_BH);
break;
default:
unknown_int4(0x10, 0x11, 0x30, R_BH, REGS);
@ -191,16 +334,24 @@ int10(REGISTERS)
break;
}
break;
#endif
case 0x12: /* Load multiple DAC color register */
if (!xmode)
goto unsupported;
switch (R_BL) {
case 0x10: /* Read EGA/VGA config */
R_BH = 0; /* Color */
R_BL = 0; /* 64K */
R_BH = NumColors > 1 ? 0 : 1; /* Color */
R_BL = 3; /* 256 K */
break;
case 0x34: /* Cursor emulation */
if (R_AL == 0)
cursoremu = 1;
else
cursoremu = 0;
R_AL = 0x12;
break;
default:
if (vflag)
dump_regs(REGS);
unknown_int3(0x10, 0x12, R_BL, REGS);
break;
}
@ -243,29 +394,34 @@ int10(REGISTERS)
case 0x1a:
if (!xmode)
goto unsupported;
R_AL = 0x1a; /* I am VGA */
R_AL = 0x1a; /* I am VGA */
R_BL = 8; /* Color VGA */
R_BH = 0; /* No other card */
break;
case 0x1b: /* Video Functionality/State information */
if (R_BX == 0) {
addr = (char *)MAKEPTR(R_ES, R_DI);
memcpy(addr, vga_status, 64);
R_AL = 0x1b;
}
break;
case 0x1c: /* Save/Restore video state */
debug(D_VIDEO, "Save/restore video state\n");
R_AL = 0;
break;
case 0x4f: /* get VESA information */
R_AH = 0x01; /* no VESA support */
break;
case 0x1b: /* Functionality state information */
break;
R_AH = 0x01; /* no VESA support */
break;
case 0x6f:
switch (R_AL) {
case 0x00: /* HP-Vectra or Video7 installation check */
R_BX = 0; /* nope, none of that */
switch (R_AL) {
case 0x00: /* HP-Vectra or Video7 installation check */
R_BX = 0; /* nope, none of that */
break;
default:
unknown_int3(0x10, 0x6f, R_AL, REGS);
break;
}
break;
default:
unknown_int3(0x10, 0x6f, R_AL, REGS);
break;
}
break;
case 0xef:
case 0xfe: /* Get video buffer */
break;
@ -277,13 +433,14 @@ int10(REGISTERS)
/* XXX - we should allow secondary buffer here and then
update it as the user requests. */
break;
unsupported:
if (vflag) dump_regs(REGS);
fatal ("int10 function 0x%02x:%02x only available in X mode\n",
R_AH, R_AL);
unknown:
if (vflag)
dump_regs(REGS);
fatal("int10 function 0x%02x:%02x only available in X mode\n",
R_AH, R_AL);
default:
if (vflag)
dump_regs(REGS);
unknown_int3(0x10, R_AH, R_AL, REGS);
break;
}

View file

@ -32,8 +32,12 @@
* $FreeBSD$
*/
#include <machine/trap.h>
#include "doscmd.h"
#include "trap.h"
#include "tty.h"
#include "video.h"
/*
** When the emulator is very busy, it's often common for
@ -60,7 +64,7 @@ fake_int(regcontext_t *REGS, int intnum)
intnum, R_AH, R_CS, R_IP, ivec[intnum]);
switch (intnum) {
case 0x2f: /* multiplex interrupt */
int2f(&REGS->sc);
int2f((regcontext_t *)&REGS->sc);
break;
case 0xff: /* doscmd special */
emuint(REGS);
@ -73,7 +77,7 @@ fake_int(regcontext_t *REGS, int intnum)
return;
}
user_int:
/* user_int: */
debug (D_TRAPS|intnum,
"INT %02x:%02x [%04x:%04x] %04x %04x %04x %04x from %04x:%04x\n",
intnum, R_AH, ivec[intnum] >> 16, ivec[intnum] & 0xffff,
@ -295,9 +299,21 @@ sigbus(struct sigframe *sf)
fatal("SIGBUS in the emulator\n");
if ((int)sf->sf_siginfo != 0) {
fatal("SIGBUS code %d, trapno: %d, err: %d\n",
(int)sf->sf_siginfo, sf->sf_uc.uc_mcontext.mc_trapno,
sf->sf_uc.uc_mcontext.mc_err);
switch (sf->sf_uc.uc_mcontext.mc_trapno) {
case T_PAGEFLT:
debug(D_TRAPS2, "Page fault, trying to access 0x%x\n",
sf->sf_addr);
/* nothing but accesses to video memory can fault for now */
if (vmem_pageflt(sf) == 0)
goto out;
/* FALLTHRU */
default:
dump_regs(REGS);
fatal("SIGBUS code %d, trapno: %d, err: %d\n",
(int)sf->sf_siginfo, sf->sf_uc.uc_mcontext.mc_trapno,
sf->sf_uc.uc_mcontext.mc_err);
/* NOTREACHED */
}
}
addr = (u_char *)MAKEPTR(R_CS, R_IP);
@ -588,7 +604,7 @@ sigalrm(struct sigframe *sf)
/* debug(D_ALWAYS,"tick %d", update_counter); */
update_counter = 0; /* remember we've updated */
video_update(&REGS->sc);
video_update((regcontext_t *)&REGS->sc);
hardint(0x08);
/* debug(D_ALWAYS,"\n"); */

File diff suppressed because it is too large Load diff

68
usr.bin/doscmd/tty.h Normal file
View file

@ -0,0 +1,68 @@
/*
* Copyright (c) 2001 The FreeBSD Project, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY The FreeBSD Project, Inc. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL The FreeBSD Project, Inc. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
/* TTY subsystem XXX rewrite! */
int redirect0;
int redirect1;
int redirect2;
extern int kbd_fd;
extern char *xfont;
u_short KbdRead(void);
u_short KbdPeek(void);
void KbdWrite(u_short);
void Failure();
void get_lines(void);
void get_ximage(void);
void init_window(void);
void init_ximage(int, int);
void load_font(void);
void resize_window(void);
int tty_eread(REGISTERS, int, int);
int tty_estate(void);
void tty_write(int, int);
void tty_rwrite(int, int, int);
void tty_move(int, int);
int tty_read(regcontext_t *, int);
void tty_report(int *, int *);
void tty_flush();
void tty_index();
void tty_pause();
int tty_peek(REGISTERS, int);
int tty_state();
void tty_scroll(int, int, int, int, int, int);
void tty_rscroll(int, int, int, int, int, int);
int tty_char(int, int);
void video_blink(int);
void video_setborder(int);
void video_update(regcontext_t *);
void console_init(void);
void kbd_init(void);
void kbd_bios_init(void);
void update_pixels(void);

713
usr.bin/doscmd/video.c Normal file
View file

@ -0,0 +1,713 @@
/*
* Copyright (c) 2001 The FreeBSD Project, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY The FreeBSD Project, Inc. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL The FreeBSD Project, Inc. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <sys/types.h>
#include <sys/mman.h>
#include <err.h>
#include <paths.h>
#include <unistd.h>
#include "doscmd.h"
#include "AsyncIO.h"
#include "tty.h"
#include "video.h"
#include "vparams.h"
/*
* Global variables
*/
/* VGA registers */
u_int8_t VGA_CRTC[CRTC_Size];
u_int8_t VGA_ATC[ATC_Size];
u_int8_t VGA_TSC[TSC_Size];
u_int8_t VGA_GDC[GDC_Size];
/* VGA status information */
u_int8_t vga_status[64];
/* Table of supported video modes. */
vmode_t vmodelist[] = {
{0x00, 0x17, TEXT, 16, 8, 2, 0xb8000, FONT8x16},
{0x01, 0x17, TEXT, 16, 8, 2, 0xb8000, FONT8x16},
{0x02, 0x18, TEXT, 16, 8, 2, 0xb8000, FONT8x16},
{0x03, 0x18, TEXT, 16, 8, 2, 0xb8000, FONT8x16},
{0x04, 0x04, GRAPHICS, 4, 1, 0, 0xb8000, FONT8x8},
{0x05, 0x05, GRAPHICS, 4, 1, 0, 0xb8000, FONT8x8},
{0x06, 0x06, GRAPHICS, 2, 1, 0, 0xb8000, FONT8x8},
{0x07, 0x19, TEXT, 1, 8, 2, 0xb0000, FONT8x16},
{0x08, 0x08, NOMODE, 0, 0, 0, 0, 0},
{0x09, 0x09, NOMODE, 0, 0, 0, 0, 0},
{0x0a, 0x0a, NOMODE, 0, 0, 0, 0, 0},
{0x0b, 0x0b, NOMODE, 0, 0, 0, 0, 0},
{0x0c, 0x0c, NOMODE, 0, 0, 0, 0, 0},
{0x0d, 0x0d, GRAPHICS, 16, 8, 0, 0xa0000, FONT8x8},
{0x0e, 0x0e, GRAPHICS, 16, 4, 0, 0xa0000, FONT8x8},
{0x0f, 0x11, GRAPHICS, 1, 2, 1, 0xa0000, FONT8x14},
{0x10, 0x12, GRAPHICS, 16, 2, 1, 0xa0000, FONT8x14},
{0x11, 0x1a, GRAPHICS, 2, 1, 3, 0xa0000, FONT8x16},
{0x12, 0x1b, GRAPHICS, 16, 1, 3, 0xa0000, FONT8x16},
/* {0x13, 0x1c, GRAPHICS, 256, 1, 0, 0xa0000, FONT8x8}, */
};
#define NUMMODES (sizeof(vmodelist) / sizeof(vmode_t))
/*
* Local functions
*/
static void init_vga(void);
static u_int8_t video_inb(int);
static void video_outb(int, u_int8_t);
/*
* Local types and variables
*/
/* Save Table and assorted variables */
struct VideoSaveTable {
u_short video_parameter_table[2];
u_short parameter_dynamic_save_area[2]; /* Not used */
u_short alphanumeric_character_set_override[2]; /* Not used */
u_short graphics_character_set_override[2]; /* Not used */
u_short secondary_save_table[2]; /* Not used */
u_short mbz[4];
};
struct SecondaryVideoSaveTable {
u_short length;
u_short display_combination_code_table[2];
u_short alphanumeric_character_set_override[2]; /* Not used */
u_short user_palette_profile_table[2]; /* Not used */
u_short mbz[6];
};
struct VideoSaveTable *vsp;
struct SecondaryVideoSaveTable *svsp;
/*
* Read and write the VGA port
*/
/* Save the selected index register */
static u_int8_t crtc_index, atc_index, tsc_index, gdc_index;
/* Toggle between index and data on port ATC_WritePort */
static u_int8_t set_atc_index = 1;
static u_int8_t
video_inb(int port)
{
switch(port) {
case CRTC_DataPortColor:
return VGA_CRTC[crtc_index];
case CRTC_IndexPortColor:
return crtc_index;
case ATC_ReadPort:
return VGA_ATC[atc_index];
case TSC_DataPort:
return VGA_TSC[tsc_index];
case TSC_IndexPort:
return tsc_index;
case GDC_DataPort:
return VGA_GDC[gdc_index];
case GDC_IndexPort:
return gdc_index;
case VGA_InputStatus1Port:
set_atc_index = 1;
return VGA_InputStatus1;
default:
return 0;
}
}
static void
video_outb(int port, u_int8_t value)
{
/* XXX */
#define row (CursRow0)
#define col (CursCol0)
int cp;
switch (port) {
case CRTC_IndexPortColor:
crtc_index = value;
break;
case CRTC_DataPortColor:
VGA_CRTC[crtc_index] = value;
switch (crtc_index) {
case CRTC_CurLocHi: /* Update cursor position in BIOS */
cp = row * DpyCols + col;
cp &= 0xff;
cp |= value << 8;
row = cp / DpyCols;
col = cp % DpyCols;
break;
case CRTC_CurLocLo: /* Update cursor position in BIOS */
cp = row * DpyCols + col;
cp &= 0xff00;
cp |= value;
row = cp / DpyCols;
col = cp % DpyCols;
break;
default:
debug(D_VIDEO, "outb 0x%04x, 0x%02x at index 0x%02x\n",
port, value, crtc_index);
break;
}
case CRTC_IndexPortMono: /* Not used */
break;
case CRTC_DataPortMono: /* Not used */
break;
case ATC_WritePort:
if (set_atc_index)
atc_index = value;
else {
VGA_ATC[atc_index] = value;
switch (atc_index) {
default:
debug(D_VIDEO, "outb 0x%04x, 0x%02x at index 0x%02x\n",
port, value, crtc_index);
break;
}
}
set_atc_index = 1 - set_atc_index;
break;
case TSC_IndexPort:
tsc_index = value;
break;
case TSC_DataPort:
VGA_TSC[tsc_index] = value;
switch (tsc_index) {
default:
debug(D_VIDEO, "outb 0x%04x, 0x%02x at index 0x%02x\n",
port, value, crtc_index);
break;
}
break;
case GDC_IndexPort:
gdc_index = value;
break;
case GDC_DataPort:
VGA_GDC[gdc_index] = value;
#if 0
switch (gdc_index) {
default:
debug(D_VIDEO, "outb 0x%04x, 0x%02x at index 0x%02x\n",
port, value, crtc_index);
break;
}
#endif
break;
default:
debug(D_ALWAYS, "Unknown port 0x%4x\n", port);
break;
}
return;
#undef row
#undef col
}
void
video_init()
{
/* If we are running under X, get a connection to the X server and create
an empty window of size (1, 1). It makes a couple of init functions a
lot easier. */
if (xmode) {
init_window();
/* Set VGA emulator to a sane state */
init_vga();
/* Initialize mode 3 (text, 80x25, 16 colors) */
init_mode(3);
}
/* Define all known I/O port handlers */
if (!raw_kbd) {
define_input_port_handler(CRTC_IndexPortColor, video_inb);
define_input_port_handler(CRTC_DataPortColor, video_inb);
define_input_port_handler(ATC_ReadPort, video_inb);
define_input_port_handler(TSC_IndexPort, video_inb);
define_input_port_handler(TSC_DataPort, video_inb);
define_input_port_handler(GDC_IndexPort, video_inb);
define_input_port_handler(GDC_DataPort, video_inb);
define_output_port_handler(CRTC_IndexPortColor, video_outb);
define_output_port_handler(CRTC_DataPortColor, video_outb);
define_output_port_handler(ATC_WritePort, video_outb);
define_output_port_handler(TSC_IndexPort, video_outb);
define_output_port_handler(TSC_DataPort, video_outb);
define_output_port_handler(GDC_IndexPort, video_outb);
define_output_port_handler(GDC_DataPort, video_outb);
}
redirect0 = isatty(0) == 0 || !xmode ;
redirect1 = isatty(1) == 0 || !xmode ;
redirect2 = isatty(2) == 0 || !xmode ;
return;
}
void
video_bios_init()
{
u_char *p;
u_long vec;
if (raw_kbd)
return;
/*
* Put the Video Save Table Pointer @ C000:0000
* Put the Secondary Video Save Table Pointer @ C000:0020
* Put the Display Combination Code table @ C000:0040
* Put the Video Parameter table @ C000:1000 - C000:2FFF
*/
BIOS_SaveTablePointer = 0xC0000000;
vsp = (struct VideoSaveTable *)0xC0000L;
memset(vsp, 0, sizeof(struct VideoSaveTable));
svsp = (struct SecondaryVideoSaveTable *)0xC0020L;
vsp->video_parameter_table[0] = 0x1000;
vsp->video_parameter_table[1] = 0xC000;
vsp->secondary_save_table[0] = 0x0020;
vsp->secondary_save_table[1] = 0xC000;
svsp->display_combination_code_table[0] = 0x0040;
svsp->display_combination_code_table[1] = 0xC000;
p = (u_char *)0xC0040;
*p++ = 2; /* Only support 2 combinations currently */
*p++ = 1; /* Version # */
*p++ = 8; /* We won't use more than type 8 */
*p++ = 0; /* Reserved */
*p++ = 0; *p++ = 0; /* No Display No Display */
*p++ = 0; *p++ = 8; /* No Display VGA Color */
memcpy((void *)0xC1000, videoparams, sizeof(videoparams));
ivec[0x1d] = 0xC0001000L; /* Video Parameter Table */
ivec[0x42] = ivec[0x10]; /* Copy of video interrupt */
/* Put the current font at C000:3000; the pixels are copied in
'tty.c:load_font()'. */
ivec[0x1f] = 0xC0003000L;
ivec[0x43] = 0xC0003000L;
BIOSDATA[0x8a] = 1; /* Index into DCC table */
vec = insert_softint_trampoline();
ivec[0x10] = vec;
register_callback(vec, int10, "int 10");
}
/* Initialize the VGA emulator
XXX This is not nearly finished right now.
*/
static void
init_vga(void)
{
int i;
/* Zero-fill 'dac_rgb' on allocation; the default (EGA) table has only
64 entries. */
dac_rgb = (struct dac_colors *)calloc(256, sizeof(struct dac_colors));
if (dac_rgb == NULL)
err(1, "Get memory for dac_rgb");
/* Copy the default DAC table to a working copy we can trash. */
for (i = 0; i < 64; i++)
dac_rgb[i] = dac_default64[i]; /* Structure copy */
/* Point 'palette[]' to the Attribute Controller space. We will only use
the first 16 slots. */
palette = VGA_ATC;
/* Get memory for the video RAM and adjust the plane pointers. */
vram = calloc(256 * 1024, 1); /* XXX */
if (vram == NULL)
warn("Could not get video memory; graphics modes not available.");
/* XXX There is probably a more efficient memory layout... */
vplane0 = vram;
vplane1 = vram + 0x10000;
vplane2 = vram + 0x20000;
vplane3 = vram + 0x30000;
}
/*
* Initialize the requested video mode.
*/
/* Indices into the video parameter table. We will use that array to
initialize the registers on startup and when the video mode changes. */
#define CRTC_Ofs 10
#define ATC_Ofs 35
#define TSC_Ofs 5
#define GDC_Ofs 55
#define MiscOutput_Ofs 9
void
init_mode(int mode)
{
vmode_t vmode;
int idx; /* Index into vmode */
int pidx; /* Index into videoparams */
debug(D_VIDEO, "Set video mode to 0x%02x\n", mode);
idx = find_vmode(mode & 0x7f);
if (idx == -1 || vmodelist[idx].type == NOMODE)
err(1, "Mode 0x%02x is not supported", mode);
vmode = vmodelist[idx];
pidx = vmode.paramindex;
/* Preset VGA registers. */
memcpy(VGA_CRTC, (u_int8_t *)&videoparams[pidx][CRTC_Ofs],
sizeof(VGA_CRTC));
memcpy(VGA_ATC, (u_int8_t *)&videoparams[pidx][ATC_Ofs],
sizeof(VGA_ATC));
/* Warning: the video parameter table does not contain the Sequencer's
Reset register. Its default value is 0x03.*/
VGA_TSC[TSC_Reset] = 0x03;
memcpy(VGA_TSC + 1, (u_int8_t *)&videoparams[pidx][TSC_Ofs],
sizeof(VGA_TSC) - 1);
memcpy(VGA_GDC, (u_int8_t *)&videoparams[pidx][GDC_Ofs],
sizeof(VGA_GDC));
VGA_MiscOutput = videoparams[pidx][MiscOutput_Ofs];
/* Paranoia */
if ((VGA_ATC[ATC_ModeCtrl] & 1) == 1 && vmode.type == TEXT)
err(1, "Text mode requested, but ATC switched to graphics mode!");
if ((VGA_ATC[ATC_ModeCtrl] & 1) == 0 && vmode.type == GRAPHICS)
err(1, "Graphics mode requested, but ATC switched to text mode!");
VideoMode = mode & 0x7f;
DpyCols = (u_int16_t)videoparams[pidx][0];
DpyPageSize = *(u_int16_t *)&videoparams[pidx][3];
ActivePageOfs = 0;
CursCol0 = 0;
CursRow0 = 0;
CursCol1 = 0;
CursRow1 = 0;
CursCol2 = 0;
CursRow2 = 0;
CursCol3 = 0;
CursRow3 = 0;
CursCol4 = 0;
CursRow4 = 0;
CursCol5 = 0;
CursRow5 = 0;
CursCol6 = 0;
CursRow6 = 0;
CursCol7 = 0;
CursRow7 = 0;
CursStart = VGA_CRTC[CRTC_CursStart];
CursEnd = VGA_CRTC[CRTC_CursEnd];
ActivePage = 0;
DpyRows = videoparams[pidx][1];
CharHeight = videoparams[pidx][2];
CRTCPort = vmode.numcolors > 1 ? CRTC_IndexPortColor : CRTC_IndexPortMono;
NumColors = vmode.numcolors;
NumPages = vmode.numpages;
VertResolution = vmode.vrescode;
vmem = (u_int16_t *)vmode.vmemaddr;
/* Copy VGA related BIOS variables from 'vga_status'. */
memcpy(&BIOS_VideoMode, &VideoMode, 33);
BIOS_DpyRows = DpyRows;
BIOS_CharHeight = CharHeight;
_BlockIO();
/* Load 'pixels[]' from default DAC values. */
update_pixels();
/* Update font. */
xfont = vmode.fontname;
load_font();
/* Resize window if necessary. */
resize_window();
_UnblockIO();
/* Mmap video memory for the graphics modes. Write access to 0xa0000 -
0xaffff will generate a T_PAGEFAULT trap in VM86 mode (aside: why not a
SIGSEGV?), which is handled in 'trap.c:sigbus()'. */
if (vmode.type == GRAPHICS) {
vmem = mmap((void *)0xa0000, 64 * 1024, PROT_READ,
MAP_ANON | MAP_FIXED | MAP_INHERIT | MAP_SHARED, -1, 0);
if (vmem == NULL)
fatal("Could not mmap() video memory");
/* Create an XImage to display the graphics screen. */
get_ximage();
} else {
int i;
get_lines();
if (mode & 0x80)
return;
/* Initialize video memory with black background, white foreground */
vattr = 0x0700;
for (i = 0; i < DpyPageSize / 2; ++i)
vmem[i] = vattr;
}
return;
}
/* Find the requested mode in the 'vmodelist' table. This function returns the
index into this table; we will also use the index for accessing the
'videoparams' array. */
int find_vmode(int mode)
{
int i;
for (i = 0; i < NUMMODES; i++)
if (vmodelist[i].modenumber == mode)
return i;
return -1;
}
/* Handle access to the graphics memory.
Simply changing the protection for the memory is not enough, unfortunately.
It would only work for the 256 color modes, where a memory byte contains
the color value of one pixel. The 16 color modes (and 4 color modes) make
use of four bit planes which overlay the first 64K of video memory. The
bits are distributed into these bit planes according to the GDC state, so
we will have to emulate the CPU instructions (see 'cpu.c:emu_instr()').
Handling the 256 color modes will be a bit easier, once we support those at
all. */
int
vmem_pageflt(struct sigframe *sf)
{
regcontext_t *REGS = (regcontext_t *)(&sf->sf_uc.uc_mcontext);
/* The ATC's Mode Control register tells us whether 4 or 8 color bits are
used */
if (VGA_ATC[ATC_ModeCtrl] & (1 << 6)) {
/* 256 colors, allow writes; the protection will be set back to
PROT_READ at the next display update */
mprotect(vmem, 64 * 1024, PROT_READ | PROT_WRITE);
return 0;
}
/* There's no need to change the protection in the 16 color modes, we will
write to 'vram'. Just emulate the next instruction. */
return emu_instr(REGS);
}
/* Write a byte to the video memory. 'vga_write()' is called from
'cpu.c:write_word()' and will emulate the VGA write modes. Not all four
modes are implemented yet, nor are the addressing modes (odd/even, chain4).
(NB: I think the latter will have to be done in 'tty_graphics_update()').
*/
void
vga_write(u_int32_t addr, u_int8_t val)
{
u_int32_t dst;
u_int8_t *latch0, *latch1, *latch2, *latch3;
u_int8_t c0, c1, c2, c3;
u_int8_t m0, m1, m2, m3;
u_int8_t mask;
#if 0
int i;
debug(D_VIDEO, "Write 0x%02x to 0x%x\n", val, addr);
debug(D_VIDEO, "GDC: ");
for (i = 0; i < sizeof(VGA_GDC); i++)
debug(D_VIDEO, "%02x ", VGA_GDC[i]);
debug(D_VIDEO, "\n");
debug(D_VIDEO, "TSC: ");
for (i = 0; i < sizeof(VGA_TSC); i++)
debug(D_VIDEO, "%02x ", VGA_TSC[i]);
debug(D_VIDEO, "\n");
#endif
/* 'addr' lies between 0xa0000 and 0xaffff */
dst = addr - 0xa0000;
/* fill latches */
latch0 = vplane0 + dst;
latch1 = vplane1 + dst;
latch2 = vplane2 + dst;
latch3 = vplane3 + dst;
c0 = *latch0;
c1 = *latch1;
c2 = *latch2;
c3 = *latch3;
/* select write mode */
switch (VGA_GDC[GDC_Mode] & 3) {
case 0:
/* XXX to do: Enable Set Reset register */
mask = VGA_GDC[GDC_BitMask];
/* select function */
switch (VGA_GDC[GDC_DataRotate] & 0x18) {
case 0x00: /* replace */
m0 = VGA_GDC[GDC_SetReset] & 1 ? mask : 0x00;
m1 = VGA_GDC[GDC_SetReset] & 2 ? mask : 0x00;
m2 = VGA_GDC[GDC_SetReset] & 4 ? mask : 0x00;
m3 = VGA_GDC[GDC_SetReset] & 8 ? mask : 0x00;
c0 &= ~mask;
c1 &= ~mask;
c2 &= ~mask;
c3 &= ~mask;
c0 |= m0;
c1 |= m1;
c2 |= m2;
c3 |= m3;
break;
case 0x08: /* and */
m0 = VGA_GDC[GDC_SetReset] & 1 ? 0xff : ~mask;
m1 = VGA_GDC[GDC_SetReset] & 2 ? 0xff : ~mask;
m2 = VGA_GDC[GDC_SetReset] & 4 ? 0xff : ~mask;
m3 = VGA_GDC[GDC_SetReset] & 8 ? 0xff : ~mask;
c0 &= m0;
c1 &= m1;
c2 &= m2;
c3 &= m3;
break;
case 0x10: /* or */
m0 = VGA_GDC[GDC_SetReset] & 1 ? mask : 0x00;
m1 = VGA_GDC[GDC_SetReset] & 2 ? mask : 0x00;
m2 = VGA_GDC[GDC_SetReset] & 4 ? mask : 0x00;
m3 = VGA_GDC[GDC_SetReset] & 8 ? mask : 0x00;
c0 |= m0;
c1 |= m1;
c2 |= m2;
c3 |= m3;
break;
case 0x18: /* xor */
m0 = VGA_GDC[GDC_SetReset] & 1 ? mask : 0x00;
m1 = VGA_GDC[GDC_SetReset] & 2 ? mask : 0x00;
m2 = VGA_GDC[GDC_SetReset] & 4 ? mask : 0x00;
m3 = VGA_GDC[GDC_SetReset] & 8 ? mask : 0x00;
c0 ^= m0;
c1 ^= m1;
c2 ^= m2;
c3 ^= m3;
break;
}
break;
case 1:
/* not yet */
break;
case 2:
mask = VGA_GDC[GDC_BitMask];
/* select function */
switch (VGA_GDC[GDC_DataRotate] & 0x18) {
case 0x00: /* replace */
m0 = (val & 1 ? 0xff : 0x00) & mask;
m1 = (val & 2 ? 0xff : 0x00) & mask;
m2 = (val & 4 ? 0xff : 0x00) & mask;
m3 = (val & 8 ? 0xff : 0x00) & mask;
c0 &= ~mask;
c1 &= ~mask;
c2 &= ~mask;
c3 &= ~mask;
c0 |= m0;
c1 |= m1;
c2 |= m2;
c3 |= m3;
break;
case 0x08: /* AND */
m0 = (val & 1 ? 0xff : 0x00) | ~mask;
m1 = (val & 2 ? 0xff : 0x00) | ~mask;
m2 = (val & 4 ? 0xff : 0x00) | ~mask;
m3 = (val & 8 ? 0xff : 0x00) | ~mask;
c0 &= m0;
c1 &= m1;
c2 &= m2;
c3 &= m3;
break;
case 0x10: /* OR */
m0 = (val & 1 ? 0xff : 0x00) & mask;
m1 = (val & 2 ? 0xff : 0x00) & mask;
m2 = (val & 4 ? 0xff : 0x00) & mask;
m3 = (val & 8 ? 0xff : 0x00) & mask;
c0 |= m0;
c1 |= m1;
c2 |= m2;
c3 |= m3;
break;
case 0x18: /* XOR */
m0 = (val & 1 ? 0xff : 0x00) & mask;
m1 = (val & 2 ? 0xff : 0x00) & mask;
m2 = (val & 4 ? 0xff : 0x00) & mask;
m3 = (val & 8 ? 0xff : 0x00) & mask;
c0 ^= m0;
c1 ^= m1;
c2 ^= m2;
c3 ^= m3;
break;
}
break;
case 3:
/* not yet */
break;
}
/* write back changed byte, depending on Map Mask register */
if (VGA_TSC[TSC_MapMask] & 1)
*latch0 = c0;
if (VGA_TSC[TSC_MapMask] & 2)
*latch1 = c1;
if (VGA_TSC[TSC_MapMask] & 4)
*latch2 = c2;
if (VGA_TSC[TSC_MapMask] & 8)
*latch3 = c3;
return;
}

View file

@ -33,122 +33,344 @@
*/
/*
* Motorola 6845 Video Controller registers
*
* They are read by
* OUT port,code
* IN port+1,res
*
* They are written by
* OUT port,code
* OUT port+1,value
* The VGA CRT Controller
*/
#define MVC_TotHorzChar 0x00 /* Total Horizontal Character */
#define MVC_DispHorzChar 0x01 /* Display Horizontal Character */
#define MVC_HorzSyncChar 0x02 /* Horizontal sync signal after ...char */
#define MVC_HorzSyncDur 0x03 /* Duration of horizontal sync signal in char */
#define MVC_TotVertChar 0x04 /* Total Vertical Character */
#define MVC_AdjVertChar 0x05 /* Adjust Veritcal Character */
#define MVC_DispVertChar 0x06 /* Display Vertical Charcter */
#define MVC_VertSyncChar 0x07 /* Vertical sync signal after .. char */
#define MVC_InterlaceMode 0x08 /* Interlace Mode */
#define MVC_ScanLines 0x09 /* Number of scan lines per screen line */
#define MVC_CurStartLine 0x0a /* Starting line of screen cursor */
#define MVC_CurEndLine 0x0b /* Ending line of screen cursor */
extern u_int8_t VGA_CRTC[];
#define MVC_CurHigh 0x0e /* High byte of cursor position */
#define MVC_CurLow 0x0f /* High byte of cursor position */
/* CRTC registers
We use the VGA register functions and don't care about the MDA. We also
leave out the undocumented registers at 0x22, 0x24, 0x3?. */
#define CRTC_HorzTotal 0x00
#define CRTC_HorzDispEnd 0x01
#define CRTC_StartHorzBlank 0x02
#define CRTC_EndHorzBlank 0x03
#define CRTC_StartHorzRetrace 0x04
#define CRTC_EndHorzRetrace 0x05
#define CRTC_VertTotal 0x06
#define CRTC_Overflow 0x07
#define CRTC_ResetRowScan 0x08
#define CRTC_MaxScanLine 0x09
#define CRTC_CursStart 0x0a
#define CRTC_CursEnd 0x0b
#define CRTC_StartAddrHi 0x0c
#define CRTC_StartAddrLo 0x0d
#define CRTC_CurLocHi 0x0e
#define CRTC_CurLocLo 0x0f
#define CRTC_StartVertRetrace 0x10
#define CRTC_EndVertRetrace 0x11
#define CRTC_VertDispEnd 0x12
#define CRTC_Offset 0x13
#define CRTC_UnderlineLoc 0x14
#define CRTC_StartVertBlank 0x15
#define CRTC_EndVertBlank 0x16
#define CRTC_ModeCtrl 0x17
#define CRTC_LineCompare 0x18
#define CRTC_Size 0x19
/* Port addresses for the CRTC
The registers are read by
OUT index_port, reg_nr
IN data_port, res
They are written by
OUT index_port, reg_nr
OUT data_port, value
*/
#define CRTC_IndexPortColor 0x03d4 /* CRTC Address Register (Color) */
#define CRTC_DataPortColor 0x03d5 /* CRTC Data Register (Color) */
#define CRTC_IndexPortMono 0x03b4 /* CRTC Address Register (Mono) */
#define CRTC_DataPortMono 0x03b5 /* CRTC Data Register (Mono) */
/*
* Additional MDA register
* VGA Attribute Controller
*/
#define MDA_StartDispPageLo 0x0c /* Starting address of displayed screen page (lo byte) */
#define MDA_StartDispPageHi 0x0d /* Starting address of displayed screen page (hi byte) */
#define MDA_BlinkCurAddrHi 0x0e /* Character address of blinking screen cursor (hi byte) */
#define MDA_BlinkCurAddrLo 0x0f /* Character address of blinking screen cursor (lo byte) */
#define MDA_LightPenHi 0x10 /* Light Pen Position (hi byte) */
#define MDA_LightPenLo 0x11 /* Light Pen Position (lo byte) */
extern u_int8_t VGA_ATC[];
#define MDA_Control 0x03b8 /* MDA Control Register Port */
#define MVC_Address 0x03b4 /* MVC Address Register */
#define MVC_Data 0x03b5 /* MVC Data Register */
#define MDA_VideoSeg 0xb800 /* Segmet address of video ram */
/* ATC registers
#define CGA_Control 0x03d8 /* CGA Control Register Port */
#define CGA_Status 0x03da /* CGA Control Register Port */
#define CVC_Address 0x03d4 /* CVC Address Register */
#define CVC_Data 0x03d5 /* CVC Data Register */
The palette registers are here for completeness. We'll always use a
separate array 'palette[]' to access them in our code. */
#define ATC_Palette0 0x00
#define ATC_Palette1 0x01
#define ATC_Palette2 0x02
#define ATC_Palette3 0x03
#define ATC_Palette4 0x04
#define ATC_Palette5 0x05
#define ATC_Palette6 0x06
#define ATC_Palette7 0x07
#define ATC_Palette8 0x08
#define ATC_Palette9 0x09
#define ATC_PaletteA 0x0a
#define ATC_PaletteB 0x0b
#define ATC_PaletteC 0x0c
#define ATC_PaletteD 0x0d
#define ATC_PaletteE 0x0e
#define ATC_PaletteF 0x0f
#define ATC_ModeCtrl 0x10
#define ATC_OverscanColor 0x11
#define ATC_ColorPlaneEnable 0x12
#define ATC_HorzPixelPanning 0x13
#define ATC_ColorSelect 0x14
#define CGA_Black 0x0
#define CGA_Blue 0x1
#define CGA_Green 0x2
#define CGA_Cyan 0x3
#define CGA_Red 0x4
#define CGA_Magenta 0x5
#define CGA_Brown 0x6
#define CGA_LightGray 0x7
#define CGA_DarkGray 0x8
#define CGA_LightBlue 0x9
#define CGA_LightGreen 0xa
#define CGA_LightCyan 0xb
#define CGA_LightRed 0xc
#define CGA_LightMagenta 0xd
#define CGA_Yellow 0xe
#define CGA_White 0xf
#define ATC_Size 0x15
#define VGA_Segment 0xa000 /* Starting Segment of VGA Memory */
#define V_int 0x10 /* interrupt for dealing with screen */
#define V_mode 0 /* code for setting new screen mode */
#define V_curtype 1 /* code for setting new cursor type */
#define V_setcur 2 /* code for addressing cursor */
#define V_readcur 3 /* code for reading cursor location */
#define V_readlp 4 /* code for reading light pen position */
#define V_setpage 5 /* code to select active page */
#define V_scrollup 6 /* code to scroll screen up */
#define V_scrolldn 7 /* code to scroll screen nown */
#define V_readch 8 /* code to read a character from screen */
#define V_writeach 9 /* code to write char and attributes */
#define V_writech 10 /* code to write character only */
#define V_setpal 11 /* code to set new setpal or border */
#define V_wdot 12 /* code to write a dot */
#define V_rdot 13 /* code to read a dot */
#define V_wtty 14 /* code to write as if teletype */
#define V_state 15 /* code to find current screen status */
/* Port addresses for the ATC
#define VM_40x25 0x00
#define VM_80x25 0x02
#define VM_320x200x4 0x04
#define VM_640x200x2 0x06
#define VM_80x25mono 0x07
#define VM_320x200x16 0x0d
#define VM_640x200x16 0x0e
#define VM_640x350mono 0x0f
#define VM_640x350x16 0x10
#define VM_640x480x2 0x11
#define VM_640x480x16 0x12
#define VM_320x200x256 0x13
#define VM_80x30 0x50
#define VM_80x43 0x51
#define VM_80x60 0x52
#define VM_132x25 0x53
#define VM_132x30 0x54
#define VM_132x43 0x55
#define VM_132x60 0x56
#define VM_132x25h 0x57
#define VM_132x30h 0x58
#define VM_132x43h 0x59
#define VM_132x60h 0x5a
#define VM_800x600x16 0x5b
#define VM_640x400x256 0x5c
#define VM_640x480x256 0x5d
#define VM_800x600x256 0x5e
#define VM_1024x768x16 0x5f
#define VM_1024x768x4 0x60
#define VM_768x1024x16 0x61
#define VM_1024x768x256 0x62
The ATC has a combined index/data port at 0x03c0. To quote from Ralf
Brown's ports list: ``Every write access to this register will toggle an
internal index/data selection flipflop, so that consecutive writes to index
& data is possible through this port. To get a defined start condition,
each read access to the input status register #1 (3BAh in mono / 3DAh in
color) resets the flipflop to load index.'' */
#define ATC_WritePort 0x03c0
#define ATC_ReadPort 0x03c1
#define VM_VGA VM_640x480x256
#define VM_EVGA VM_800x600x256
#define VM_SVGAportrait VM_768x1024x16
#define VM_SVGA16 VM_1024x768x16
#define VM_SVGA256 VM_1024x768x256
/*
* VGA Sequencer Controller
*/
extern u_int8_t VGA_TSC[];
/* TSC registers
We leave out the undocumented register at 0x07. */
#define TSC_Reset 0x00
#define TSC_ClockingMode 0x01
#define TSC_MapMask 0x02
#define TSC_CharMapSelect 0x03
#define TSC_MemoryMode 0x04
#define TSC_Size 0x05
/* Port addresses for the TSC */
#define TSC_IndexPort 0x03c4
#define TSC_DataPort 0x03c5
/*
* VGA Graphics Controller
*/
extern u_int8_t VGA_GDC[];
/* GDC registers */
#define GDC_SetReset 0x00
#define GDC_EnableSetReset 0x01
#define GDC_ColorCompare 0x02
#define GDC_DataRotate 0x03
#define GDC_ReadMapSelect 0x04
#define GDC_Mode 0x05
#define GDC_Misc 0x06
#define GDC_ColorDontCare 0x07
#define GDC_BitMask 0x08
#define GDC_Size 0x09
/* Port addresses for the GDC */
#define GDC_IndexPort 0x03ce
#define GDC_DataPort 0x03cf
/*
* Miscellaneous VGA registers
*/
u_int8_t VGA_InputStatus0;
u_int8_t VGA_InputStatus1;
u_int8_t VGA_MiscOutput;
u_int8_t VGA_DAC_PELData;
u_int8_t VGA_DAC_PELMask;
u_int8_t VGA_DAC_PELReadAddr;
u_int8_t VGA_DAC_PELWriteAddr;
u_int8_t VGA_DAC_State;
/* Port addresses for miscellaneous VGA registers */
#define VGA_InputStatus0Port 0x03c2 /* Read-only */
#define VGA_InputStatus1Port 0x03da /* Read-only */
#define VGA_MiscOutputPortW 0x03c2 /* Write-only */
#define VGA_MiscOutputPortR 0x03cc /* Read-only */
/* Port addresses for VGA DAC registers */
#define VGA_DAC_PELDataPort 0x03c9 /* Read/Write */
#define VGA_DAC_PELMaskPort 0x03c6 /* Read/Write */
#define VGA_DAC_PELReadAddrPort 0x03c7 /* Write-only */
#define VGA_DAC_PELWriteAddrPort 0x03c8 /* Read/Write */
#define VGA_DAC_StatePortOut 0x03c7 /* Read-only */
/*
* Additional variables and type definitions
*/
/* To ease access to the palette registers, 'palette[]' will overlay the
Attribute Controller space. */
u_int8_t *palette;
/* Entry type for the DAC table. Each value is actually 6 bits wide. */
struct dac_colors {
u_int8_t red;
u_int8_t green;
u_int8_t blue;
};
/* We need a working copy of the default DAC table. This is filled from
'dac_default{64,256}[]' in 'video.c:init_vga()'. */
struct dac_colors *dac_rgb;
/*
* Video memory
*
* The video memory of a standard VGA card is 256K. For the standard modes,
* this is divided into four planes of 64K which are accessed according to the
* GDC state. Mode 0x13 will also fit within 64K. The higher resolution modes
* (VESA) require a bit more sophistication; we leave that for later
* implementation.
*/
/* Video RAM */
u_int8_t *vram;
/* Pointers to the four bit planes */
u_int8_t *vplane0;
u_int8_t *vplane1;
u_int8_t *vplane2;
u_int8_t *vplane3;
/* Pointer to the video memory. The base address varies with the video mode.
'vmem' is used directly only in the text modes; in the graphics modes, all
writes go to 'vram'. */
u_int16_t *vmem;
/*
* VGA status information
*
* Int 10:1b returns a 64 byte block of status info for the VGA card. This
* block also contains a couple of BIOS variables, so we will use it for
* general housekeeping.
*/
extern u_int8_t vga_status[];
/* Access to the VGA status fields. */
#define StaticFuncTbl *(u_int32_t *)&vga_status[0]
#define VideoMode *(u_int8_t *)&vga_status[4]
#define DpyCols *(u_int16_t *)&vga_status[5]
#define DpyPageSize *(u_int16_t *)&vga_status[7]
#define ActivePageOfs *(u_int16_t *)&vga_status[9]
#define CursCol0 *(u_int8_t *)&vga_status[11]
#define CursRow0 *(u_int8_t *)&vga_status[12]
#define CursCol1 *(u_int8_t *)&vga_status[13]
#define CursRow1 *(u_int8_t *)&vga_status[14]
#define CursCol2 *(u_int8_t *)&vga_status[15]
#define CursRow2 *(u_int8_t *)&vga_status[16]
#define CursCol3 *(u_int8_t *)&vga_status[17]
#define CursRow3 *(u_int8_t *)&vga_status[18]
#define CursCol4 *(u_int8_t *)&vga_status[19]
#define CursRow4 *(u_int8_t *)&vga_status[20]
#define CursCol5 *(u_int8_t *)&vga_status[21]
#define CursRow5 *(u_int8_t *)&vga_status[22]
#define CursCol6 *(u_int8_t *)&vga_status[23]
#define CursRow6 *(u_int8_t *)&vga_status[24]
#define CursCol7 *(u_int8_t *)&vga_status[25]
#define CursRow7 *(u_int8_t *)&vga_status[26]
#define CursStart *(u_int8_t *)&vga_status[27]
#define CursEnd *(u_int8_t *)&vga_status[28]
#define ActivePage *(u_int8_t *)&vga_status[29]
#define CRTCPort *(u_int16_t *)&vga_status[30]
#define CGA_ModeCtrl *(u_int8_t *)&vga_status[32]
#define CGA_ColorSelect *(u_int8_t *)&vga_status[33]
#define DpyRows *(u_int8_t *)&vga_status[34]
#define CharHeight *(u_int16_t *)&vga_status[35]
#define ActiveDCC *(u_int8_t *)&vga_status[37]
#define SecondDCC *(u_int8_t *)&vga_status[38]
#define NumColors *(u_int16_t *)&vga_status[39]
#define NumPages *(u_int8_t *)&vga_status[41]
#define VertResolution *(u_int8_t *)&vga_status[42]
#define PrimaryCharset *(u_int8_t *)&vga_status[43]
#define SecondaryCharset *(u_int8_t *)&vga_status[44]
#define MiscStatus *(u_int8_t *)&vga_status[45]
/*
#define Reserved1 *(u_int16_t *)&vga_status[46]
#define Reserved2 *(u_int8_t *)&vga_status[48]
*/
#define VMemSize *(u_int8_t *)&vga_status[49]
#define SavePointerStatus *(u_int8_t *)&vga_status[50]
/* VGA Static Functionality Table
This table contains mode-independent VGA status information. It is actually
defined in 'vparam.h'; the declaration here is just for completeness. */
extern u_int8_t static_functionality_tbl[];
/* Add some names for the VGA related BIOS variables. */
#define BIOS_VideoMode *(u_int8_t *)&BIOSDATA[0x49]
#define BIOS_DpyCols *(u_int16_t *)&BIOSDATA[0x4a]
#define BIOS_DpyPageSize *(u_int16_t *)&BIOSDATA[0x4c]
#define BIOS_ActivePageOfs *(u_int16_t *)&BIOSDATA[0x4e]
#define BIOS_CursCol0 *(u_int8_t *)&BIOSDATA[0x50]
#define BIOS_CursRow0 *(u_int8_t *)&BIOSDATA[0x51]
#define BIOS_CursCol1 *(u_int8_t *)&BIOSDATA[0x52]
#define BIOS_CursRow1 *(u_int8_t *)&BIOSDATA[0x53]
#define BIOS_CursCol2 *(u_int8_t *)&BIOSDATA[0x54]
#define BIOS_CursRow2 *(u_int8_t *)&BIOSDATA[0x55]
#define BIOS_CursCol3 *(u_int8_t *)&BIOSDATA[0x56]
#define BIOS_CursRow3 *(u_int8_t *)&BIOSDATA[0x57]
#define BIOS_CursCol4 *(u_int8_t *)&BIOSDATA[0x58]
#define BIOS_CursRow4 *(u_int8_t *)&BIOSDATA[0x59]
#define BIOS_CursCol5 *(u_int8_t *)&BIOSDATA[0x5a]
#define BIOS_CursRow5 *(u_int8_t *)&BIOSDATA[0x5b]
#define BIOS_CursCol6 *(u_int8_t *)&BIOSDATA[0x5c]
#define BIOS_CursRow6 *(u_int8_t *)&BIOSDATA[0x5d]
#define BIOS_CursCol7 *(u_int8_t *)&BIOSDATA[0x5e]
#define BIOS_CursRow7 *(u_int8_t *)&BIOSDATA[0x5f]
#define BIOS_CursStart *(u_int8_t *)&BIOSDATA[0x60]
#define BIOS_CursEnd *(u_int8_t *)&BIOSDATA[0x61]
#define BIOS_ActivePage *(u_int8_t *)&BIOSDATA[0x62]
#define BIOS_CRTCPort *(u_int16_t *)&BIOSDATA[0x63]
#define BIOS_CGA_ModeCtrl *(u_int8_t *)&BIOSDATA[0x65]
#define BIOS_CGA_ColorSelect *(u_int8_t *)&BIOSDATA[0x66]
#define BIOS_DpyRows *(u_int8_t *)&BIOSDATA[0x84]
#define BIOS_CharHeight *(u_int16_t *)&BIOSDATA[0x85]
#define BIOS_SaveTablePointer *(u_int32_t *)&BIOSDATA[0xa8]
/*
* Video modes
*
* This started as a big 'switch' statement in 'video.c:init_mode()' which
* soon became too ugly and unmanagable. So, we collect all mode related
* information in one table and define a couple of helper function to access
* it. This will also benefit the VESA support, whenever we get to that.
*/
typedef struct {
int modenumber; /* Mode number */
int paramindex; /* Index into the parameter table */
int type; /* Text or Graphics */
int numcolors; /* Number of colors */
int numpages; /* Number of display pages */
int vrescode; /* 0 = 200, 1 = 350, 2 = 400, 3 = 480 */
u_int32_t vmemaddr; /* Video memory address */
char *fontname; /* Font name */
} vmode_t;
/* Types. 'NOMODE' is one of the 'forbidden' internal modes. */
#define TEXT 0
#define GRAPHICS 1
#define NOMODE -1
extern vmode_t vmodelist[];
/* Font names */
#define FONTVGA "vga"
#define FONT8x8 "vga8x8"
#define FONT8x14 "vga8x14"
#define FONT8x16 "vga8x16" /* same as FONTVGA */
/* External functions in 'video.c'. */
extern void init_mode(int);
extern int find_vmode(int);
extern void vga_write(u_int32_t, u_int8_t);
extern void video_bios_init(void);
extern void video_init(void);
extern int vmem_pageflt(struct sigframe *);
/* Other external variables, mostly from tty.c. Needs to be cleaned up. */
extern int vattr;
void write_vram(void *);

View file

@ -28,295 +28,468 @@
* SUCH DAMAGE.
*
* BSDI vparams.h,v 2.2 1996/04/08 19:33:13 bostic Exp
*
* $FreeBSD$
*/
unsigned char videoparams[][64] = {
{ 0x28, 0x18, 0x08, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0xc7, 0x06, 0x07, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x28, 0x18, 0x08, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0xc7, 0x06, 0x07, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x50, 0x18, 0x08, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0xc7, 0x06, 0x07, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x50, 0x18, 0x08, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0xc7, 0x06, 0x07, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x28, 0x18, 0x08, 0x00, 0x40, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80,
0xbf, 0x1f, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96,
0xb9, 0xa2, 0xff, 0x00, 0x13, 0x15, 0x17, 0x02,
0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0x00, 0xff,
},
{ 0x28, 0x18, 0x08, 0x00, 0x40, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80,
0xbf, 0x1f, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96,
0xb9, 0xa2, 0xff, 0x00, 0x13, 0x15, 0x17, 0x02,
0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0x00, 0xff,
},
{ 0x50, 0x18, 0x08, 0x00, 0x40, 0x01, 0x01, 0x00,
0x06, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96,
0xb9, 0xc2, 0xff, 0x00, 0x17, 0x17, 0x17, 0x17,
0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xff,
},
{ 0x50, 0x18, 0x0e, 0x00, 0x10, 0x00, 0x03, 0x00,
0x03, 0xa6, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0d, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x10, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x0e, 0x00, 0x0f, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x00, 0xff,
},
{ 0x50, 0x18, 0x10, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0x62, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x0f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x10, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x0a, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x00, 0xff,
},
{ 0x28, 0x18, 0x10, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x50, 0x18, 0x10, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0x63, 0x60, 0x4f, 0x50, 0x82, 0x56, 0x82,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0f, 0x00,
0x06, 0x62, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x0f, 0x00, 0x00, 0x08, 0x05, 0x0f, 0xff,
},
{ 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0f, 0x00,
0x06, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x0f, 0x00, 0x00, 0x08, 0x05, 0x0f, 0xff,
},
{ 0x28, 0x18, 0x08, 0x00, 0x20, 0x09, 0x0f, 0x00,
0x06, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80,
0xbf, 0x1f, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96,
0xb9, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
{ 0x50, 0x18, 0x08, 0x00, 0x40, 0x01, 0x0f, 0x00,
0x06, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96,
0xb9, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
{ 0x50, 0x18, 0x0e, 0x00, 0x80, 0x01, 0x0f, 0x00,
0x06, 0xa2, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63,
0xba, 0xe3, 0xff, 0x00, 0x08, 0x00, 0x00, 0x18,
0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0xff,
},
{ 0x50, 0x18, 0x0e, 0x00, 0x80, 0x01, 0x0f, 0x00,
0x06, 0xa3, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63,
0xba, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
{ 0x50, 0x18, 0x0e, 0x00, 0x80, 0x01, 0x0f, 0x00,
0x06, 0xa2, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63,
0xba, 0xe3, 0xff, 0x00, 0x08, 0x00, 0x00, 0x18,
0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0xff,
},
{ 0x50, 0x18, 0x0e, 0x00, 0x80, 0x01, 0x0f, 0x00,
0x06, 0xa3, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63,
0xba, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
{ 0x28, 0x18, 0x0e, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0xa3, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x14, 0x1f, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x28, 0x18, 0x0e, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0xa3, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x14, 0x1f, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x50, 0x18, 0x0e, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0xa3, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x1f, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x50, 0x18, 0x0e, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0xa3, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x1f, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x28, 0x18, 0x10, 0x00, 0x08, 0x08, 0x03, 0x00,
0x02, 0x67, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x0c, 0x00, 0x0f, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x50, 0x18, 0x10, 0x00, 0x10, 0x00, 0x03, 0x00,
0x02, 0x67, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x0c, 0x00, 0x0f, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x50, 0x18, 0x10, 0x00, 0x10, 0x00, 0x03, 0x00,
0x02, 0x66, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x0f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x10, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x0e, 0x00, 0x0f, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x00, 0xff,
},
{ 0x50, 0x1d, 0x10, 0x00, 0xa0, 0x01, 0x0f, 0x00,
0x06, 0xe3, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0x0b, 0x3e, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7,
0x04, 0xc3, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0xff,
},
{ 0x50, 0x1d, 0x10, 0x00, 0xa0, 0x01, 0x0f, 0x00,
0x06, 0xe3, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0x0b, 0x3e, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7,
0x04, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
{ 0x28, 0x18, 0x08, 0x00, 0x20, 0x01, 0x0f, 0x00,
0x0e, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x40, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
0x0d, 0x0e, 0x0f, 0x41, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0f, 0xff,
},
{ 0x50, 0x1d, 0x10, 0x00, 0x20, 0x01, 0x03, 0x00,
0x02, 0xe3, 0x5f, 0x4f, 0x50, 0x82, 0x57, 0x82,
0x08, 0x3e, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0xea, 0x8f, 0xdf, 0x28, 0x00, 0xe7,
0x04, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x84, 0x18, 0x10, 0x00, 0x20, 0x01, 0x03, 0x00,
0x42, 0x62, 0x9b, 0x83, 0x86, 0x9e, 0x8a, 0x1b,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x42, 0x0f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x10, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x0a, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x00, 0xff,
},
{ 0x84, 0x18, 0x10, 0x00, 0x20, 0x01, 0x03, 0x00,
0x42, 0x63, 0x9b, 0x83, 0x86, 0x9e, 0x8a, 0x1b,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x42, 0x0f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Collect some default parameters for the VGA emulator in this file. This is
supposed to be included only from 'video.c' and needs some type definitions
from 'video.h'. */
u_int8_t videoparams[][64] = {
/* Mode 0: Text, 40x25, CGA (200 lines) */
{ 0x28, 0x18, 0x08, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0xc7, 0x06, 0x07, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff
},
/* Mode 1: Text, 40x25, CGA (200 lines) */
{ 0x28, 0x18, 0x08, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0xc7, 0x06, 0x07, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Mode 2: Text, 80x25, CGA (200 lines) */
{ 0x50, 0x18, 0x08, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0xc7, 0x06, 0x07, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Mode 3: Text, 80x25, CGA (200 lines) */
{ 0x50, 0x18, 0x08, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0xc7, 0x06, 0x07, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Mode 4: Graphics, 320x200, 4 colors */
{ 0x28, 0x18, 0x08, 0x00, 0x40, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80,
0xbf, 0x1f, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96,
0xb9, 0xa2, 0xff, 0x00, 0x13, 0x15, 0x17, 0x02,
0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0x00, 0xff,
},
/* Mode 5: Graphics, 320x200, 4 colors */
{ 0x28, 0x18, 0x08, 0x00, 0x40, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80,
0xbf, 0x1f, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96,
0xb9, 0xa2, 0xff, 0x00, 0x13, 0x15, 0x17, 0x02,
0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0x00, 0xff,
},
/* Mode 6: Graphics, 640x200, 2 colors */
{ 0x50, 0x18, 0x08, 0x00, 0x40, 0x01, 0x01, 0x00,
0x06, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96,
0xb9, 0xc2, 0xff, 0x00, 0x17, 0x17, 0x17, 0x17,
0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xff,
},
/* Mode 7: Text, 80x25, mono, MDA (350 lines) */
{ 0x50, 0x18, 0x0e, 0x00, 0x10, 0x00, 0x03, 0x00,
0x03, 0xa6, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0d, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x10, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x0e, 0x00, 0x0f, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x00, 0xff,
},
/* Mode 8: reserved */
{ 0x50, 0x18, 0x10, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0x62, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x0f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x10, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x0a, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x00, 0xff,
},
/* Mode 9: reserved */
{ 0x28, 0x18, 0x10, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Mode a: reserved */
{ 0x50, 0x18, 0x10, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0x63, 0x60, 0x4f, 0x50, 0x82, 0x56, 0x82,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Mode b: reserved */
{ 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0f, 0x00,
0x06, 0x62, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x0f, 0x00, 0x00, 0x08, 0x05, 0x0f, 0xff,
},
/* Mode c: reserved */
{ 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0f, 0x00,
0x06, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x0f, 0x00, 0x00, 0x08, 0x05, 0x0f, 0xff,
},
/* Mode d: Graphics, 320x200, 16 colors */
{ 0x28, 0x18, 0x08, 0x00, 0x20, 0x09, 0x0f, 0x00,
0x06, 0x63, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80,
0xbf, 0x1f, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96,
0xb9, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
/* Mode e: Graphics, 640x200, 16 colors */
{ 0x50, 0x18, 0x08, 0x00, 0x40, 0x01, 0x0f, 0x00,
0x06, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96,
0xb9, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
/* Mode f: Graphics, 640x350, mono (EGA with 64K) */
{ 0x50, 0x18, 0x0e, 0x00, 0x80, 0x01, 0x0f, 0x00,
0x06, 0xa2, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63,
0xba, 0xe3, 0xff, 0x00, 0x08, 0x00, 0x00, 0x18,
0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0xff,
},
/* Mode 10: Graphics, 640x350, 4 colors (EGA with 64K) */
{ 0x50, 0x18, 0x0e, 0x00, 0x80, 0x01, 0x0f, 0x00,
0x06, 0xa3, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63,
0xba, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
/* Mode f: Graphics, 640x350, mono (EGA with >64K) */
{ 0x50, 0x18, 0x0e, 0x00, 0x80, 0x01, 0x0f, 0x00,
0x06, 0xa2, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63,
0xba, 0xe3, 0xff, 0x00, 0x08, 0x00, 0x00, 0x18,
0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0xff,
},
/* Mode 10: Graphics, 640x350, 16 colors (EGA with >64K) */
{ 0x50, 0x18, 0x0e, 0x00, 0x80, 0x01, 0x0f, 0x00,
0x06, 0xa3, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63,
0xba, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
/* Mode 0: Text, 40x25, EGA (350 lines) */
{ 0x28, 0x18, 0x0e, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0xa3, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x14, 0x1f, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Mode 1: Text, 40x25, EGA (350 lines) */
{ 0x28, 0x18, 0x0e, 0x00, 0x08, 0x09, 0x03, 0x00,
0x02, 0xa3, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x14, 0x1f, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Mode 2: Text, 80x25, EGA (350 lines) */
{ 0x50, 0x18, 0x0e, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0xa3, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x1f, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Mode 3: Text, 80x25, EGA (350 lines) */
{ 0x50, 0x18, 0x0e, 0x00, 0x10, 0x01, 0x03, 0x00,
0x02, 0xa3, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4d, 0x0b, 0x0c, 0x00, 0x00,
0x00, 0x00, 0x83, 0x85, 0x5d, 0x28, 0x1f, 0x63,
0xba, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Modes 0, 1: Text, 40x25, VGA (400 lines) */
{ 0x28, 0x18, 0x10, 0x00, 0x08, 0x08, 0x03, 0x00,
0x02, 0x67, 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x0c, 0x00, 0x0f, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Modes 2, 3: Text, 80x25, VGA (400 lines) */
{ 0x50, 0x18, 0x10, 0x00, 0x10, 0x00, 0x03, 0x00,
0x02, 0x67, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x0c, 0x00, 0x0f, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
/* Mode 7: Text, 80x25, mono, VGA (400 lines) */
{ 0x50, 0x18, 0x10, 0x00, 0x10, 0x00, 0x03, 0x00,
0x02, 0x66, 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x0f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x10, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x0e, 0x00, 0x0f, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x00, 0xff,
},
/* Mode 11: Graphics, 640x480, 2 colors */
{ 0x50, 0x1d, 0x10, 0x00, 0xa0, 0x01, 0x0f, 0x00,
0x06, 0xe3, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0x0b, 0x3e, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7,
0x04, 0xc3, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0xff,
},
/* Mode 12: Graphics, 640x480, 16 colors */
{ 0x50, 0x1d, 0x10, 0x00, 0xa0, 0x01, 0x0f, 0x00,
0x06, 0xe3, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0x0b, 0x3e, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7,
0x04, 0xe3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x01, 0x00, 0x0f, 0x00, 0x00,
0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff,
},
/* Mode 13: Graphics, 320x200, 256 colors */
{ 0x28, 0x18, 0x08, 0x00, 0x20, 0x01, 0x0f, 0x00,
0x0e, 0x63, 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80,
0xbf, 0x1f, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28, 0x40, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
0x0d, 0x0e, 0x0f, 0x41, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0f, 0xff,
},
{ 0x50, 0x1d, 0x10, 0x00, 0x20, 0x01, 0x03, 0x00,
0x02, 0xe3, 0x5f, 0x4f, 0x50, 0x82, 0x57, 0x82,
0x08, 0x3e, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0xea, 0x8f, 0xdf, 0x28, 0x00, 0xe7,
0x04, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
{ 0x84, 0x18, 0x10, 0x00, 0x20, 0x01, 0x03, 0x00,
0x42, 0x62, 0x9b, 0x83, 0x86, 0x9e, 0x8a, 0x1b,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x42, 0x0f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x10, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x0a, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x00, 0xff,
},
{ 0x84, 0x18, 0x10, 0x00, 0x20, 0x01, 0x03, 0x00,
0x42, 0x63, 0x9b, 0x83, 0x86, 0x9e, 0x8a, 0x1b,
0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x42, 0x0f, 0x96,
0xb9, 0xa3, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x14, 0x07, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x08, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
},
};
/* The default DAC table for the EGA and VGA 16 color modes. This table is
installed on startup. The values are taken from the output of 'scon -p
list'. */
struct dac_colors dac_default64[] = {
{0, 0, 0}, {0, 0, 42}, {0, 42, 0}, {0, 42, 42},
{42, 0, 0}, {42, 0, 42}, {42, 42, 0}, {42, 42, 42},
{0, 0, 21}, {0, 0, 63}, {0, 42, 21}, {0, 42, 63},
{42, 0, 21}, {42, 0, 63}, {42, 42, 21}, {42, 42, 63},
{0, 21, 0}, {0, 21, 42}, {0, 63, 0}, {0, 63, 42},
{42, 21, 0}, {42, 21, 42}, {42, 63, 0}, {42, 63, 42},
{0, 21, 21}, {0, 21, 63}, {0, 63, 21}, {0, 63, 63},
{42, 21, 21}, {42, 21, 63}, {42, 63, 21}, {42, 63, 63},
{21, 0, 0}, {21, 0, 42}, {21, 42, 0}, {21, 42, 42},
{63, 0, 0}, {63, 0, 42}, {63, 42, 0}, {63, 42, 42},
{21, 0, 21}, {21, 0, 63}, {21, 42, 21}, {21, 42, 63},
{63, 0, 21}, {63, 0, 63}, {63, 42, 21}, {63, 42, 63},
{21, 21, 0}, {21, 21, 42}, {21, 63, 0}, {21, 63, 42},
{63, 21, 0}, {63, 21, 42}, {63, 63, 0}, {63, 63, 42},
{21, 21, 21}, {21, 21, 63}, {21, 63, 21}, {21, 63, 63},
{63, 21, 21}, {63, 21, 63}, {63, 63, 21}, {63, 63, 63}
};
/* The default DAC table for the 256 color mode. The values are taken from the
output of 'vdacc.exe', from Michael Tischler's book ``PC intern 4''. */
struct dac_colors dac_default256[] = {
/* 16 CGA colors */
{0, 0, 0}, {0, 0, 42}, {0, 42, 0}, {0, 42, 42},
{42, 0, 0}, {42, 0, 42}, {42, 21, 0}, {42, 42, 42},
{21, 21, 21}, {21, 21, 63}, {21, 63, 21}, {21, 63, 63},
{63, 21, 21}, {63, 21, 63}, {63, 63, 21}, {63, 63, 63},
/* grayscale */
{0, 0, 0}, {5, 5, 5}, {8, 8, 8}, {11, 11, 11},
{14, 14, 14}, {17, 17, 17}, {20, 20, 20}, {24, 24, 24},
{28, 28, 28}, {32, 32, 32}, {36, 36, 36}, {40, 40, 40},
{45, 45, 45}, {50, 50, 50}, {56, 56, 56}, {63, 63, 63},
/* high intensity, high saturation */
{0, 0, 63}, {16, 0, 63}, {31, 0, 63}, {47, 0, 63},
{63, 0, 63}, {63, 0, 47}, {63, 0, 31}, {63, 0, 16},
{63, 63, 0}, {63, 16, 0}, {63, 31, 0}, {63, 47, 0},
{63, 63, 0}, {47, 63, 0}, {31, 63, 0}, {16, 63, 0},
{0, 63, 0}, {0, 63, 16}, {0, 63, 31}, {0, 63, 47},
{0, 63, 63}, {0, 47, 63}, {0, 31, 63}, {0, 16, 63},
/* high intensity, medium saturation */
{31, 31, 63}, {39, 31, 63}, {47, 31, 63}, {55, 31, 63},
{63, 31, 63}, {63, 31, 55}, {63, 31, 47}, {63, 31, 39},
{63, 31, 31}, {63, 39, 31}, {63, 47, 31}, {63, 55, 31},
{63, 63, 31}, {55, 63, 31}, {47, 63, 31}, {39, 63, 31},
{31, 63, 31}, {31, 63, 39}, {31, 63, 47}, {31, 63, 55},
{31, 63, 63}, {31, 55, 63}, {31, 47, 63}, {31, 39, 63},
/* high intensity, low saturation */
{45, 45, 63}, {49, 45, 63}, {54, 45, 63}, {58, 45, 63},
{63, 45, 63}, {63, 45, 58}, {63, 45, 54}, {63, 45, 49},
{63, 45, 45}, {63, 49, 45}, {63, 54, 45}, {63, 58, 45},
{63, 63, 45}, {58, 63, 45}, {54, 63, 45}, {49, 63, 45},
{45, 63, 45}, {45, 63, 49}, {45, 63, 54}, {45, 63, 58},
{45, 63, 63}, {45, 58, 63}, {45, 54, 63}, {45, 49, 63},
/* medium intensity, high saturation */
{0, 0, 28}, {7, 0, 28}, {14, 0, 28}, {21, 0, 28},
{28, 0, 28}, {28, 0, 21}, {28, 0, 14}, {28, 0, 7},
{28, 0, 0}, {28, 7, 0}, {28, 14, 0}, {28, 21, 0},
{28, 28, 0}, {21, 28, 0}, {14, 28, 0}, {7, 28, 0},
{0, 28, 0}, {0, 28, 7}, {0, 28, 14}, {0, 28, 21},
{0, 28, 28}, {0, 21, 28}, {0, 14, 28}, {0, 7, 28},
/* medium intensity, medium saturation */
{14, 14, 28}, {17, 14, 28}, {21, 14, 28}, {24, 14, 28},
{28, 14, 28}, {28, 14, 24}, {28, 14, 21}, {28, 14, 17},
{28, 14, 14}, {28, 17, 14}, {28, 21, 14}, {28, 24, 14},
{28, 28, 14}, {24, 28, 14}, {21, 28, 14}, {17, 28, 14},
{14, 28, 14}, {14, 28, 17}, {14, 28, 21}, {14, 28, 24},
{14, 28, 28}, {14, 24, 28}, {14, 21, 28}, {14, 17, 28},
/* medium intensity, low saturation */
{20, 20, 28}, {22, 20, 28}, {24, 20, 28}, {26, 20, 28},
{28, 20, 28}, {28, 20, 26}, {28, 20, 24}, {28, 20, 22},
{28, 20, 20}, {28, 22, 20}, {28, 24, 20}, {28, 26, 20},
{28, 28, 20}, {26, 28, 20}, {24, 28, 20}, {22, 28, 20},
{20, 28, 20}, {20, 28, 22}, {20, 28, 24}, {20, 28, 26},
{20, 28, 28}, {20, 26, 28}, {20, 24, 28}, {20, 22, 28},
/* low intensity, high saturation */
{0, 0, 16}, {4, 0, 16}, {8, 0, 16}, {12, 0, 16},
{16, 0, 16}, {16, 0, 12}, {16, 0, 8}, {16, 0, 4},
{16, 0, 0}, {16, 4, 0}, {16, 8, 0}, {16, 12, 0},
{16, 16, 0}, {12, 16, 0}, {8, 16, 0}, {4, 16, 0},
{0, 16, 0}, {0, 16, 4}, {0, 16, 8}, {0, 16, 12},
{0, 16, 16}, {0, 12, 16}, {0, 8, 16}, {0, 4, 16},
/* low intensity, medium saturation */
{8, 8, 16}, {10, 8, 16}, {12, 8, 16}, {14, 8, 16},
{16, 8, 16}, {16, 8, 14}, {16, 8, 12}, {16, 8, 10},
{16, 8, 8}, {16, 10, 8}, {16, 12, 8}, {16, 14, 8},
{16, 16, 8}, {14, 16, 8}, {12, 16, 8}, {10, 16, 8},
{8, 16, 8}, {8, 16, 10}, {8, 16, 12}, {8, 16, 14},
{8, 16, 16}, {8, 14, 16}, {8, 12, 16}, {8, 10, 16},
/* low intensity, low saturation */
{11, 11, 16}, {12, 11, 16}, {13, 11, 16}, {15, 11, 16},
{16, 11, 16}, {16, 11, 15}, {16, 11, 13}, {16, 11, 12},
{16, 11, 11}, {16, 12, 11}, {16, 13, 11}, {16, 15, 11},
{16, 16, 11}, {15, 16, 11}, {13, 16, 11}, {12, 16, 11},
{11, 16, 11}, {11, 16, 12}, {11, 16, 13}, {11, 16, 15},
{11, 16, 16}, {11, 15, 16}, {11, 13, 16}, {11, 12, 16},
/* black */
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}
};
/* The Static Functionality Table, a collection of mode-independent status
info. */
u_int8_t static_functionality_table[] = {
0x0c, /* Video modes 0 - 7 */
0, /* Video modes 8 - 15 */
0, /* Video modes 16 - 23 */
0, 0, 0, 0, /* reserved */
4, /* 400 lines */
1, /* Charset memory blocks available */
1, /* Charset memory blocks in use */
0x79, /* Bit 0: all modes on all displays
1: grayscale equivalents
2: user-definable charsets
3: user-definable palette
4: CGA cursor emulation
5: EGA palette
6: VGA color registers
7: color pages */
0x8, /* Bit 0: lightpen interface
1: save/load video status
2: toggle intensity/blink
3: DCC
4-7: reserved */
0, /* reserved */
0, /* Save Pointer functions available
Bit 0: 2 charsets
1: Palette Save Area
2: user-defined charset (text)
3: user-defined charset (graphics)
4: user-defined palette
5: DCC
6, 7: reserved */
0 /* reserved */
};