mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
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:
parent
55fd28c86b
commit
040395f4dd
16 changed files with 3145 additions and 1592 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
113
usr.bin/doscmd/cp437-8x14.pcf.gz.uu
Normal file
113
usr.bin/doscmd/cp437-8x14.pcf.gz.uu
Normal 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
|
||||
104
usr.bin/doscmd/cp437-8x8.pcf.gz.uu
Normal file
104
usr.bin/doscmd/cp437-8x8.pcf.gz.uu
Normal 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
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
.\"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(®S->sc);
|
||||
int2f((regcontext_t *)®S->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(®S->sc);
|
||||
video_update((regcontext_t *)®S->sc);
|
||||
hardint(0x08);
|
||||
/* debug(D_ALWAYS,"\n"); */
|
||||
|
||||
|
|
|
|||
1209
usr.bin/doscmd/tty.c
1209
usr.bin/doscmd/tty.c
File diff suppressed because it is too large
Load diff
68
usr.bin/doscmd/tty.h
Normal file
68
usr.bin/doscmd/tty.h
Normal 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
713
usr.bin/doscmd/video.c
Normal 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;
|
||||
}
|
||||
|
|
@ -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 *);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue