mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-29 12:03:03 +00:00
90c38ed200
a group of dos emulator developers. Submitted by: Jonathan Lemon <jlemon@americantv.com> Obtained from: BSDI
278 lines
8.1 KiB
C
278 lines
8.1 KiB
C
/*
|
|
* 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 int10.c,v 2.3 1996/04/08 19:32:40 bostic Exp
|
|
*
|
|
* $Id: int10.c,v 1.2 1996/09/22 05:53:00 miff Exp $
|
|
*/
|
|
|
|
#include "doscmd.h"
|
|
#include "mouse.h"
|
|
|
|
/*
|
|
* 0040:0060 contains the start and end of the cursor
|
|
*/
|
|
#define curs_end BIOSDATA[0x60]
|
|
#define curs_start BIOSDATA[0x61]
|
|
|
|
void
|
|
int10(REGISTERS)
|
|
{
|
|
char *addr;
|
|
int i, j;
|
|
int saved_row, saved_col;
|
|
|
|
/*
|
|
* Any call to the video BIOS is enough to reset the poll
|
|
* count on the keyboard.
|
|
*/
|
|
reset_poll();
|
|
|
|
switch (GET8H(sc->sc_eax)) {
|
|
case 0x00: /* Set display mode */
|
|
debug(D_HALF, "Set video mode to %02x\n", GET8L(sc->sc_eax));
|
|
break;
|
|
case 0x01: /* Define cursor */
|
|
curs_start = GET8H(sc->sc_ecx);
|
|
curs_end = GET8L(sc->sc_ecx);
|
|
break;
|
|
case 0x02: /* Position cursor */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
tty_move(GET8H(sc->sc_edx), GET8L(sc->sc_edx));
|
|
break;
|
|
case 0x03: /* Read cursor position */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
tty_report(&i, &j);
|
|
SET8H(sc->sc_edx, i);
|
|
SET8L(sc->sc_edx, j);
|
|
SET8H(sc->sc_ecx, curs_start);
|
|
SET8L(sc->sc_ecx, curs_end);
|
|
break;
|
|
case 0x05:
|
|
debug(D_HALF, "Select current display page %d\n", GET8L(sc->sc_eax));
|
|
break;
|
|
case 0x06: /* initialize window/scroll text upward */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
tty_scroll(GET8H(sc->sc_ecx), GET8L(sc->sc_ecx),
|
|
GET8H(sc->sc_edx), GET8L(sc->sc_edx),
|
|
GET8L(sc->sc_eax), GET8H(sc->sc_ebx) << 8);
|
|
break;
|
|
case 0x07: /* initialize window/scroll text downward */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
tty_rscroll(GET8H(sc->sc_ecx), GET8L(sc->sc_ecx),
|
|
GET8H(sc->sc_edx), GET8L(sc->sc_edx),
|
|
GET8L(sc->sc_eax), GET8H(sc->sc_ebx) << 8);
|
|
break;
|
|
case 0x08: /* read character/attribute */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
i = tty_char(-1, -1);
|
|
SET16(sc->sc_eax, i);
|
|
break;
|
|
case 0x09: /* write character/attribute */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
tty_rwrite(GET16(sc->sc_ecx), GET8L(sc->sc_eax), GET8L(sc->sc_ebx) << 8);
|
|
break;
|
|
case 0x0a: /* write character */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
tty_rwrite(GET16(sc->sc_ecx), GET8L(sc->sc_eax), -1);
|
|
break;
|
|
case 0x0b: /* set border color */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
video_setborder(GET8L(sc->sc_ebx));
|
|
break;
|
|
case 0x0e: /* write character */
|
|
tty_write(GET8L(sc->sc_eax), -1);
|
|
break;
|
|
case 0x0f: /* get display mode */
|
|
SET8H(sc->sc_eax, 80); /* number of columns */
|
|
SET8L(sc->sc_eax, 3); /* color */
|
|
SET8H(sc->sc_ebx, 0); /* display page */
|
|
break;
|
|
case 0x10:
|
|
switch (GET8L(sc->sc_eax)) {
|
|
case 0x01:
|
|
video_setborder(GET8H(sc->sc_ebx) & 0x0f);
|
|
break;
|
|
case 0x02: /* Set pallete registers */
|
|
debug(D_HALF, "INT 10 10:02 Set all palette registers\n");
|
|
break;
|
|
case 0x03: /* Enable/Disable blinking mode */
|
|
video_blink(GET8L(sc->sc_ebx) ? 1 : 0);
|
|
break;
|
|
case 0x13:
|
|
debug(D_HALF,
|
|
"INT 10 10:13 Select color or DAC (%02x, %02x)\n",
|
|
GET8L(sc->sc_ebx), GET8H(sc->sc_ebx));
|
|
break;
|
|
case 0x1a: /* get video dac color-page state */
|
|
SET8H(sc->sc_ebx, 0); /* Current page */
|
|
SET8L(sc->sc_ebx, 0); /* four pages of 64... */
|
|
break;
|
|
default:
|
|
unknown_int3(0x10, 0x10, GET8L(sc->sc_eax), sc);
|
|
break;
|
|
}
|
|
break;
|
|
#if 1
|
|
case 0x11:
|
|
switch (GET8L(sc->sc_eax)) {
|
|
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 0x30:
|
|
SET16(sc->sc_ecx, 14);
|
|
SET8L(sc->sc_edx, 24);
|
|
switch(GET8H(sc->sc_ebx)) {
|
|
case 0:
|
|
PUTVEC(sc->sc_es, sc->sc_ebp, ivec[0x1f]);
|
|
break;
|
|
case 1:
|
|
PUTVEC(sc->sc_es, sc->sc_ebp, ivec[0x43]);
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
SET16(sc->sc_es, 0);
|
|
SET16(sc->sc_ebp, 0);
|
|
debug(D_HALF,
|
|
"INT 10 11:30 Request font address %02x",
|
|
GET8H(sc->sc_ebx));
|
|
break;
|
|
default:
|
|
unknown_int4(0x10, 0x11, 0x30, GET8H(sc->sc_ebx), sc);
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
unknown_int3(0x10, 0x11, GET8L(sc->sc_eax), sc);
|
|
break;
|
|
}
|
|
break;
|
|
#endif
|
|
case 0x12: /* Load multiple DAC color register */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
switch (GET8L(sc->sc_ebx)) {
|
|
case 0x10: /* Read EGA/VGA config */
|
|
SET8H(sc->sc_ebx, 0); /* Color */
|
|
SET8L(sc->sc_ebx, 0); /* 64K */
|
|
break;
|
|
default:
|
|
unknown_int3(0x10, 0x12, GET8L(sc->sc_ebx), sc);
|
|
break;
|
|
}
|
|
break;
|
|
case 0x13: /* write character string */
|
|
if (!xmode)
|
|
goto unsupported;
|
|
addr = (char *)GETPTR(sc->sc_es, sc->sc_ebp);
|
|
switch (GET8L(sc->sc_eax) & 0x03) {
|
|
case 0:
|
|
tty_report(&saved_row, &saved_col);
|
|
tty_move(GET8H(sc->sc_edx), GET8L(sc->sc_edx));
|
|
for (i = 0; i < GET16(sc->sc_ecx); ++i)
|
|
tty_write(*addr++, GET8L(sc->sc_ebx) << 8);
|
|
tty_move(saved_row, saved_col);
|
|
break;
|
|
case 1:
|
|
tty_move(GET8H(sc->sc_edx), GET8L(sc->sc_edx));
|
|
for (i = 0; i < GET16(sc->sc_ecx); ++i)
|
|
tty_write(*addr++, GET8L(sc->sc_ebx) << 8);
|
|
break;
|
|
case 2:
|
|
tty_report(&saved_row, &saved_col);
|
|
tty_move(GET8H(sc->sc_edx), GET8L(sc->sc_edx));
|
|
for (i = 0; i < GET16(sc->sc_ecx); ++i) {
|
|
tty_write(addr[0], addr[1]);
|
|
addr += 2;
|
|
}
|
|
tty_move(saved_row, saved_col);
|
|
break;
|
|
case 3:
|
|
tty_move(GET8H(sc->sc_edx), GET8L(sc->sc_edx));
|
|
for (i = 0; i < GET16(sc->sc_ecx); ++i) {
|
|
tty_write(addr[0], addr[1]);
|
|
addr += 2;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 0x1a:
|
|
if (!xmode)
|
|
goto unsupported;
|
|
SET8L(sc->sc_eax, 0x1a); /* I am VGA */
|
|
SET8L(sc->sc_ebx, 8); /* Color VGA */
|
|
SET8H(sc->sc_ebx, 0); /* No other card */
|
|
break;
|
|
|
|
case 0x4f: /* get VESA information */
|
|
SET8H(sc->sc_eax, 0x01); /* no VESA support */
|
|
break;
|
|
|
|
case 0x1b: /* Functionality state information */
|
|
case 0xef:
|
|
case 0xfe: /* Get video buffer */
|
|
break;
|
|
case 0xfa: /* Interrogate mouse driver */
|
|
if (xmode)
|
|
PUTPTR(sc->sc_es, sc->sc_ebx, (long)mouse_area);
|
|
break;
|
|
case 0xff: /* Update real screen from video buffer */
|
|
/* XXX - we should allow secondary buffer here and then
|
|
update it as the user requests. */
|
|
break;
|
|
|
|
unsupported:
|
|
if (vflag) dump_regs(sc);
|
|
fatal ("int10 function 0x%02x:%02x only available in X mode\n",
|
|
GET8H(sc->sc_eax), GET8L(sc->sc_eax));
|
|
unknown:
|
|
default:
|
|
unknown_int2(0x10, GET8H(sc->sc_eax), sc);
|
|
break;
|
|
}
|
|
}
|