176 lines
4.6 KiB
C
176 lines
4.6 KiB
C
|
|
||
|
//
|
||
|
// 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 <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <conio.h>
|
||
|
#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;
|
||
|
}
|