diff options
author | dyson <dyson@FreeBSD.org> | 1997-08-09 01:43:15 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1997-08-09 01:43:15 +0000 |
commit | 305573cb2990c5d329d149cef5a3b5533b1e8fd9 (patch) | |
tree | df06304b637358dbe8a006fdb7a6ea5955fee179 /usr.bin/doscmd/int10.c | |
parent | dede28832bba6a9de7a428ff58df92439bddbc9c (diff) | |
download | FreeBSD-src-305573cb2990c5d329d149cef5a3b5533b1e8fd9.zip FreeBSD-src-305573cb2990c5d329d149cef5a3b5533b1e8fd9.tar.gz |
Add our doscmd to the tree. This is a result of work from BSDI, and
a group of dos emulator developers.
Submitted by: Jonathan Lemon <jlemon@americantv.com>
Obtained from: BSDI
Diffstat (limited to 'usr.bin/doscmd/int10.c')
-rw-r--r-- | usr.bin/doscmd/int10.c | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/usr.bin/doscmd/int10.c b/usr.bin/doscmd/int10.c new file mode 100644 index 0000000..0f02cbd --- /dev/null +++ b/usr.bin/doscmd/int10.c @@ -0,0 +1,277 @@ +/* + * 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; + } +} |