// // Fake video rom support // // This file provides interrim support for video rom bios services. // It is only intended for use until Insignia produces proper rom support // for NTVDM // // Note: portions of this code were lifted from the following source. /* x86 v1.0 * * XBIOSVID.C * Guest ROM BIOS video emulation * * History * Created 20-Oct-90 by Jeff Parsons * * COPYRIGHT NOTICE * This source file may not be distributed, modified or incorporated into * another product without prior approval from the author, Jeff Parsons. * This file may be copied to designated servers and machines authorized to * access those servers, but that does not imply any form of approval. */ #include #include #include #include #include "softpc.h" #include "bop.h" #include "xbios.h" #include "xbiosvid.h" #include "xwincon.h" #include "fun.h" #include "cmdsvc.h" static BYTE ServiceRoutine[] = { 0xC4, 0xC4, BOP_VIDEO, 0x50, 0x55, 0x8B, 0xEC, 0x9C, 0x58, 0x89, 0x46, 0x08, 0x5d, 0x58, 0xCF }; #define SERVICE_LENGTH sizeof(ServiceRoutine) extern HANDLE OutputHandle; extern HANDLE InputHandle; /* BiosVidInit - Initialize ROM BIOS video support * * ENTRY * argc - # of command-line options * argv - pointer to first option pointer * ServicAddress - pointer to linear address to put interrupt service * routine at * * EXIT * TRUE if successful, FALSE if not */ BOOL BiosVidInit(int argc, char *argv[], PVOID *ServiceAddress) { USHORT usEquip; static BYTE abVidInit[] = {VIDMODE_MONO, // VIDDATA_CRT_MODE 0x80, 0, // VIDDATA_CRT_COLS 00, 0x10, // VIDDATA_CRT_LEN 0, 0, // VIDDATA_CRT_START 0,0,0,0,0,0,0,0, // VIDDATA_CURSOR_POSN 0,0,0,0,0,0,0,0, // 7, 6, // VIDDATA_CURSOR_MODE 0, // VIDDATA_ACTIVE_PAGE 0xD4, 0x03, // VIDDATA_ADDR_6845 0, // VIDDATA_CRT_MODE_SET 0, // VIDDATA_CRT_PALETTE }; PVOID Address; argv, argc; memcpy(*ServiceAddress, ServiceRoutine, SERVICE_LENGTH); Address = (PVOID)(BIOSINT_VID * 4); *((PWORD)Address) = RMOFF(*ServiceAddress); *(((PWORD)Address) + 1) = RMSEG(*ServiceAddress); (PCHAR)*ServiceAddress += SERVICE_LENGTH; usEquip = *(PWORD)RMSEGOFFTOLIN(BIOSDATA_SEG, BIOSDATA_EQUIP_FLAG); usEquip |= BIOSEQUIP_MONOVIDEO; *(PWORD)RMSEGOFFTOLIN(BIOSDATA_SEG, BIOSDATA_EQUIP_FLAG) = usEquip; // Initialize ROM BIOS video data to defaults Address = RMSEGOFFTOLIN(BIOSDATA_SEG, VIDDATA_CRT_MODE); memcpy(Address, abVidInit, sizeof(abVidInit)); #if 0 #ifdef WIN clearconsole(hwndGuest); #endif #endif return TRUE; } /* BiosVid - Emulate ROM BIOS video functions * * ENTRY * None (x86 registers contain parameters) * * EXIT * None (x86 registers/memory updated appropriately) * * This function receives control on INT 10h, routes control to the * appropriate subfunction based on the function # in AH, and * then simulates an IRET and returns back to the instruction emulator. */ VOID BiosVid() { COORD coord; CHAR ch; if (fEnableInt10 == FALSE) return; switch(getAH()) { case VIDFUNC_SETCURSORPOS: coord.X = getDL(); coord.Y = getDH(); if(SetConsoleCursorPosition(OutputHandle, coord) == FALSE) VDprint( VDP_LEVEL_WARNING, ("SetCursorPosition Failed X=%d Y=%d\n", coord.X,coord.Y) ); break; case VIDFUNC_QUERYCURSORPOS: VDprint( VDP_LEVEL_WARNING, ("Query Cursor Position Not Yet Implemented\n") ); break; case VIDFUNC_SCROLLUP: VDprint( VDP_LEVEL_WARNING, ("ScrollUp Not Yet Implemented\n") ); break; case VIDFUNC_WRITECHARATTR: VDprint( VDP_LEVEL_WARNING, ("WRITECHARATTR Not Yet Implemented\n") ); break; case VIDFUNC_WRITETTY: ch = getAL(); putch(ch); break; case VIDFUNC_QUERYMODE: setAX(*(PWORD)RMSEGOFFTOLIN(BIOSDATA_SEG, VIDDATA_CRT_MODE)); setBX(*(PWORD)RMSEGOFFTOLIN(BIOSDATA_SEG, VIDDATA_ACTIVE_PAGE)); break; default: VDprint( VDP_LEVEL_WARNING, ("SoftPC Video Support: Unimplemented function %x\n", getAX()) ); } } INT tputch(INT i) { putch((CHAR)i); return i; }