aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <emulator@emulace.cz>2023-07-07 12:33:35 +0200
committerJaroslav Hensl <emulator@emulace.cz>2023-07-07 12:33:35 +0200
commit12c9ac987f950e36f70c10769d9f37c2a26dbf4c (patch)
tree454f1d80dc245663b87944e4b7d2a0b9cbed55ae
parentd53f427dc984abe25616287fded56d7a02a85809 (diff)
downloadvmdisp9x-12c9ac987f950e36f70c10769d9f37c2a26dbf4c.tar.gz
added QEMU STD support - originally by Philip Kelley (https://github.com/phkelley/boxv9x)
-rw-r--r--boxv.c19
-rw-r--r--boxv_qemu.c2
-rw-r--r--boxvint.h5
-rw-r--r--ddk/configmg.h35
-rw-r--r--init.c165
-rw-r--r--init_qemu.c2
-rw-r--r--io.h2
-rw-r--r--makefile84
-rw-r--r--minidrv.h7
-rw-r--r--modes.c9
-rw-r--r--modes_qemu.c2
-rw-r--r--res/qemumini.rc19
-rw-r--r--vmdisp9x.inf19
13 files changed, 359 insertions, 11 deletions
diff --git a/boxv.c b/boxv.c
index 5d63947..1f2387f 100644
--- a/boxv.c
+++ b/boxv.c
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 2012-2022 Michal Necasek
+ 2023 Philip Kelley
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -83,7 +84,11 @@ int BOXV_ext_mode_set( void *cx, int xres, int yres, int bpp, int v_xres, int v_
vid_outw( cx, VBE_DISPI_IOPORT_DATA, 0 );
/* Enable the extended display registers. */
vid_outw( cx, VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_ENABLE );
+#ifdef QEMU
+ vid_outw( cx, VBE_DISPI_IOPORT_DATA, VBE_DISPI_ENABLED | VBE_DISPI_8BIT_DAC | VBE_DISPI_LFB_ENABLED );
+#else
vid_outw( cx, VBE_DISPI_IOPORT_DATA, VBE_DISPI_ENABLED | VBE_DISPI_8BIT_DAC );
+#endif
/* Re-enable the sequencer. */
vid_wridx( cx, VGA_SEQUENCER, VGA_SR_RESET, VGA_SR0_NORESET );
@@ -127,14 +132,28 @@ int BOXV_detect( void *cx, unsigned long *vram_size )
v_word boxv_id;
vid_outw( cx, VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_ID );
+
boxv_id = vid_inw( cx, VBE_DISPI_IOPORT_DATA );
+#ifdef QEMU
+ if( boxv_id < VBE_DISPI_ID0 || boxv_id > VBE_DISPI_ID6 )
+ return( 0 );
+
+ if( vram_size ) {
+ vid_outw( cx, VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_VIDEO_MEMORY_64K );
+ *vram_size = (unsigned long)vid_inw( cx, VBE_DISPI_IOPORT_DATA ) << 16;
+ }
+
+ return( boxv_id );
+#else
if( vram_size ) {
*vram_size = vid_ind( cx, VBE_DISPI_IOPORT_DATA );
}
+
if( boxv_id >= VBE_DISPI_ID0 && boxv_id <= VBE_DISPI_ID4 )
return( boxv_id );
else
return( 0 );
+#endif
}
/* Disable extended mode and place the hardware into a VGA compatible state.
diff --git a/boxv_qemu.c b/boxv_qemu.c
new file mode 100644
index 0000000..9307863
--- /dev/null
+++ b/boxv_qemu.c
@@ -0,0 +1,2 @@
+#define QEMU
+#include "boxv.c"
diff --git a/boxvint.h b/boxvint.h
index 6ec2bf3..fc0a3a9 100644
--- a/boxvint.h
+++ b/boxvint.h
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 2012-2022 Michal Necasek
+ 2023 Philip Kelley
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -104,7 +105,7 @@ THE SOFTWARE.
#define VBE_DISPI_INDEX_VIRT_HEIGHT 0x7
#define VBE_DISPI_INDEX_X_OFFSET 0x8
#define VBE_DISPI_INDEX_Y_OFFSET 0x9
-#define VBE_DISPI_INDEX_VBOX_VIDEO 0xa
+#define VBE_DISPI_INDEX_VIDEO_MEMORY_64K 0xa
#define VBE_DISPI_INDEX_FB_BASE_HI 0xb
#define VBE_DISPI_ID0 0xB0C0
@@ -112,6 +113,8 @@ THE SOFTWARE.
#define VBE_DISPI_ID2 0xB0C2
#define VBE_DISPI_ID3 0xB0C3
#define VBE_DISPI_ID4 0xB0C4
+#define VBE_DISPI_ID5 0xB0C5
+#define VBE_DISPI_ID6 0xB0C6
#define VBE_DISPI_DISABLED 0x00
#define VBE_DISPI_ENABLED 0x01
diff --git a/ddk/configmg.h b/ddk/configmg.h
new file mode 100644
index 0000000..8dc3112
--- /dev/null
+++ b/ddk/configmg.h
@@ -0,0 +1,35 @@
+#ifndef __CONFIGMG_H__INCLUDED__
+#define __CONFIGMG_H__INCLUDED__
+/* Definitions for the configuration manager. */
+
+typedef DWORD CONFIGRET; /* Standardized return value. */
+
+typedef DWORD LOG_CONF; /* Logical configuration. */
+typedef LOG_CONF FAR *PLOG_CONF; /* Far pointer to logical configuration. */
+
+typedef DWORD RES_DES; /* Resource descriptor. */
+typedef RES_DES FAR *PRES_DES; /* Far pointer to resource descriptor. */
+
+typedef DWORD DEVNODE; /* Devnode. */
+
+typedef DWORD ULONG;
+
+typedef void FAR *PFARVOID;
+
+typedef ULONG RESOURCEID; /* Resource type ID. */
+typedef RESOURCEID FAR *PRESOURCEID; /* Far pointer to resource type ID. */
+
+typedef struct {
+ WORD MD_Count;
+ WORD MD_Type;
+ ULONG MD_Alloc_Base;
+ ULONG MD_Alloc_End;
+ WORD MD_Flags;
+ WORD MD_Reserved;
+} MEM_DES, *PMEM_DES;
+
+#define CR_SUCCESS 0
+#define ALLOC_LOG_CONF 2
+#define ResType_Mem 1
+
+#endif /* __CONFIGMG_H__INCLUDED__ */
diff --git a/init.c b/init.c
index 0f961dd..562f734 100644
--- a/init.c
+++ b/init.c
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 2022 Michal Necasek
+ 2023 Philip Kelley
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -29,7 +30,7 @@ THE SOFTWARE.
#include <dibeng.h>
#include <minivdd.h>
#include "minidrv.h"
-
+#include <configmg.h>
/* GlobalSmartPageLock is a semi-undocumented function. Not officially
* documented but described in KB Article Q180586. */
@@ -43,6 +44,10 @@ WORD wPalettized = 0; /* Non-zero if palettized. */
WORD OurVMHandle = 0; /* The current VM's ID. */
DWORD VDDEntryPoint = 0; /* The VDD entry point. */
+#ifdef QEMU
+DWORD ConfigMGEntryPoint = 0; /* The configuration manager entry point. */
+DWORD LfbBase = 0; /* The physical base address of the linear framebuffer. */
+#endif
/* On Entry:
* EAX = Function code (VDD_GET_DISPLAY_CONFIG)
@@ -65,18 +70,81 @@ extern DWORD CallVDDGetDispConf( WORD Function, WORD wDInfSize, LPVOID pDInf );
"call dword ptr VDDEntryPoint"\
"mov edx, eax" \
"shr edx, 16" \
- parm [ax] [cx] [es di];
-
+ parm [ax] [cx] [es di] modify [bx];
+/* phkelley: ^^^^^^^^^^^
+ * This was a bug in the upstream driver where bx was being trashed.
+ */
#pragma code_seg( _INIT )
+#ifdef QEMU
+/* Get the first logical configuration for a devnode.
+ */
+CONFIGRET static _near _cdecl CM_Get_First_Log_Conf(
+ PLOG_CONF plcLogConf,
+ DEVNODE dnDevNode,
+ ULONG ulFlags)
+{
+ WORD wRc = 0;
+
+ _asm { mov eax, 01Ah }; /* CM_GET_FIRST_LOG_CONF */
+ _asm { call ConfigMGEntryPoint };
+ _asm { mov wRc, ax };
+
+ return( wRc );
+}
+
+/* Get the next resource descriptor of a given type.
+ */
+CONFIGRET static _near _cdecl CM_Get_Next_Res_Des(
+ PRES_DES prdResDes,
+ RES_DES CurrentResDesOrLogConf,
+ RESOURCEID ForResource,
+ PRESOURCEID pResourceID,
+ ULONG ulFlags)
+{
+ WORD wRc = 0;
+
+ _asm { mov eax, 01Fh }; /* CM_GET_NEXT_RES_DES */
+ _asm { call ConfigMGEntryPoint };
+ _asm { mov wRc, ax };
+
+ return( wRc );
+}
+
+/* Get the data for a resource descriptor.
+*/
+CONFIGRET static _near _cdecl CM_Get_Res_Des_Data(
+ RES_DES rdResDes,
+ PFARVOID Buffer,
+ ULONG BufferLen,
+ ULONG ulFlags)
+{
+ WORD wRc = 0;
+
+ _asm { mov eax, 022h }; /* CM_GET_RES_DES_DATA */
+ _asm { call ConfigMGEntryPoint };
+ _asm { mov wRc, ax };
+
+ return( wRc );
+}
+#endif
/* Read the display settings from SYSTEM.INI or Registry.
*/
+#ifdef QEMU
+DEVNODE ReadDisplayConfig( void )
+#else
void ReadDisplayConfig( void )
+#endif
{
WORD wX, wY;
UINT bIgnoreRegistry;
MODEDESC mode;
+#ifdef QEMU
+ DEVNODE devNode;
+ DISPLAYINFO DispInfo;
+ DWORD dwRc;
+#endif
/* Get the DPI, default to 96. */
wDpi = GetPrivateProfileInt( "display", "dpi", 96, "system.ini" );
@@ -90,8 +158,32 @@ void ReadDisplayConfig( void )
dbg_printf( "SYSTEM.INI: %ux%u %ubpp %udpi\n", wX, wY, wBpp, wDpi );
+
bIgnoreRegistry = GetPrivateProfileInt( "display", "IgnoreRegistry", 0, "system.ini" );
+#ifdef QEMU
+ dwRc = CallVDDGetDispConf( VDD_GET_DISPLAY_CONFIG, sizeof( DispInfo ), &DispInfo );
+ if( (dwRc != VDD_GET_DISPLAY_CONFIG) && !dwRc ) {
+ devNode = (DEVNODE)DispInfo.diDevNodeHandle;
+
+ /* Call succeeded, use the data. */
+ if (!bIgnoreRegistry)
+ {
+ wScrX = DispInfo.diXRes;
+ wScrY = DispInfo.diYRes;
+ wBpp = DispInfo.diBpp;
+
+ dbg_printf( "Registry: %ux%u %ubpp %udpi\n", DispInfo.diXRes, DispInfo.diYRes, DispInfo.diBpp, DispInfo.diDPI );
+
+ /* DPI might not be set, careful. */
+ if( DispInfo.diDPI )
+ wDpi = DispInfo.diDPI;
+ }
+ } else {
+ dbg_printf( "VDD_GET_DISPLAY_CONFIG failed, dwRc=%lX\n",dwRc );
+ devNode = 0;
+ }
+#else
if( !bIgnoreRegistry ) {
DISPLAYINFO DispInfo;
DWORD dwRc;
@@ -112,6 +204,7 @@ void ReadDisplayConfig( void )
dbg_printf( "VDD_GET_DISPLAY_CONFIG failed, dwRc=%lX\n",dwRc );
}
}
+#endif
mode.xRes = wScrX;
mode.yRes = wScrY;
@@ -133,9 +226,14 @@ void ReadDisplayConfig( void )
wPalettized = GetPrivateProfileInt( "display", "palettized", 1, "system.ini" );
else
wPalettized = 0;
+
+#ifdef QEMU
+ return( devNode );
+#endif
}
#define VDD_ID 10 /* Virtual Display Driver ID. */
+#define CONFIGMG_ID 51 /* Configuration Manager Driver ID. */
/* Get Device API Entry Point. */
void __far *int_2F_GetEP( unsigned ax, unsigned bx );
@@ -155,7 +253,67 @@ extern char __based( __segname( "_TEXT" ) ) *pText;
/* This is a standard DLL entry point. Note that DS is already set
* to point to this DLL's data segment on entry.
*/
+
#pragma aux DriverInit parm [cx] [di] [es si]
+
+#ifdef QEMU
+UINT FAR DriverInit( UINT cbHeap, UINT hModule, LPSTR lpCmdLine )
+{
+ DEVNODE devNode;
+
+ /* Lock the code segment. */
+ GlobalSmartPageLock( (__segment)pText );
+
+ /* Query the entry point of the Virtual Display Device. */
+ VDDEntryPoint = (DWORD)int_2F_GetEP( 0x1684, VDD_ID );
+
+ /* Obtain the "magic number" needed for VDD calls. */
+ OurVMHandle = int_2F_GetVMID( 0x1683 );
+
+ dbg_printf( "DriverInit: VDDEntryPoint=%WP, OurVMHandle=%x\n", VDDEntryPoint, OurVMHandle );
+
+ /* Read the display configuration before doing anything else. */
+ LfbBase = 0;
+ devNode = ReadDisplayConfig();
+
+ /* Use the Configuration Manager to locate the base address of the linear framebuffer. */
+ if( devNode ) {
+ RES_DES rd;
+
+ ConfigMGEntryPoint = (DWORD)int_2F_GetEP( 0x1684, CONFIGMG_ID );
+
+ if( CM_Get_First_Log_Conf( &rd, devNode, ALLOC_LOG_CONF ) == CR_SUCCESS ) {
+ ULONG cbAllocMax = 0;
+
+ /* Take the largest physical memory range in use by this device
+ * and store it into LfbBase. */
+ while( CM_Get_Next_Res_Des( &rd, rd, ResType_Mem, NULL, 0 ) == CR_SUCCESS ) {
+
+ /* Experimentally, no MEM_RES was found to be larger than 0x28 bytes
+ * with the QEMU VGA adapter, so this buffer is static, but it would
+ * be better to query the size (with CM_Get_Res_Des_Data_Size) and
+ * then use alloca here. */
+ char memRes[0x28];
+
+ if( CM_Get_Res_Des_Data( rd, memRes, sizeof(memRes), 0 ) == CR_SUCCESS ) {
+ PMEM_DES pMemDes = (PMEM_DES)memRes;
+ ULONG cbAlloc = pMemDes->MD_Alloc_End - pMemDes->MD_Alloc_Base + 1;
+
+ if( cbAlloc > cbAllocMax ) {
+ cbAllocMax = cbAlloc;
+ LfbBase = pMemDes->MD_Alloc_Base;
+ }
+ }
+ }
+ }
+ }
+
+ dbg_printf("DriverInit: LfbBase is %lX\n", LfbBase);
+
+ /* Return 1 (success) iff we located the physical address of the linear framebuffer. */
+ return ( !!LfbBase );
+}
+#else
UINT FAR DriverInit( UINT cbHeap, UINT hModule, LPSTR lpCmdLine )
{
/* Lock the code segment. */
@@ -174,3 +332,4 @@ UINT FAR DriverInit( UINT cbHeap, UINT hModule, LPSTR lpCmdLine )
return( 1 ); /* Success. */
}
+#endif
diff --git a/init_qemu.c b/init_qemu.c
new file mode 100644
index 0000000..8b4a983
--- /dev/null
+++ b/init_qemu.c
@@ -0,0 +1,2 @@
+#define QEMU
+#include "init.c"
diff --git a/io.h b/io.h
index ae25f33..2f28520 100644
--- a/io.h
+++ b/io.h
@@ -74,10 +74,12 @@ static unsigned vid_inw( void *cx, unsigned port )
return( inpw( port ) );
}
+#ifndef QEMU
static unsigned long vid_ind( void *cx, unsigned port )
{
return( inpd_asm( port ) );
}
+#endif
#else
diff --git a/makefile b/makefile
index 4e469f2..6d8e5e9 100644
--- a/makefile
+++ b/makefile
@@ -3,7 +3,8 @@ OBJS = dibthunk.obj dibcall.obj enable.obj init.obj palette.obj &
drvlib.obj control_vxd.obj minivdd_svga.obj vmwsvxd.obj &
scrsw_svga.obj control_svga.obj modes_svga.obj palette_svga.obj &
pci.obj svga.obj svga3d.obj svga32.obj pci32.obj dddrv.obj &
- enable_svga.obj dibcall_svga.obj
+ enable_svga.obj dibcall_svga.obj boxv_qemu.obj modes_qemu.obj &
+ init_qemu.obj
INCS = -I$(%WATCOM)\h\win -Iddk -Ivmware
@@ -39,7 +40,7 @@ CC32 = wcc386
CFLAGS32 += -DCOM2
!endif
-all : boxvmini.drv vmwsmini.drv vmwsmini.vxd
+all : boxvmini.drv vmwsmini.drv qemumini.drv vmwsmini.vxd
# Object files
drvlib.obj : drvlib.c .autodepend
@@ -47,6 +48,9 @@ drvlib.obj : drvlib.c .autodepend
boxv.obj : boxv.c .autodepend
$(CC) $(CFLAGS) -zW $(INCS) $(FLAGS) $<
+
+boxv_qemu.obj : boxv_qemu.c .autodepend
+ $(CC) $(CFLAGS) -zW $(INCS) $(FLAGS) $<
pci.obj : vmware/pci.c .autodepend
$(CC) $(CFLAGS) -zW $(INCS) $(FLAGS) $<
@@ -86,6 +90,9 @@ enable_svga.obj : enable_svga.c .autodepend
init.obj : init.c .autodepend
$(CC) $(CFLAGS) -zW $(INCS) $(FLAGS) $<
+
+init_qemu.obj : init_qemu.c .autodepend
+ $(CC) $(CFLAGS) -zW $(INCS) $(FLAGS) $<
control.obj : control.c .autodepend
$(CC) $(CFLAGS) -zW $(INCS) $(FLAGS) $<
@@ -111,6 +118,9 @@ modes.obj : modes.c .autodepend
modes_svga.obj : modes_svga.c .autodepend
$(CC) $(CFLAGS) -zW $(INCS) $(FLAGS) $<
+modes_qemu.obj : modes_qemu.c .autodepend
+ $(CC) $(CFLAGS) -zW $(INCS) $(FLAGS) $<
+
scrsw.obj : scrsw.c .autodepend
$(CC) $(CFLAGS) -zW $(INCS) $(FLAGS) $<
@@ -133,6 +143,9 @@ boxvmini.res : res/boxvmini.rc res/colortab.bin res/config.bin res/fonts.bin res
vmwsmini.res : res/vmwsmini.rc res/colortab.bin res/config.bin res/fonts.bin res/fonts120.bin .autodepend
wrc -q -r -ad -bt=windows -fo=$@ -Ires -I$(%WATCOM)/h/win $(FLAGS) res/vmwsmini.rc
+qemumini.res : res/qemumini.rc res/colortab.bin res/config.bin res/fonts.bin res/fonts120.bin .autodepend
+ wrc -q -r -ad -bt=windows -fo=$@ -Ires -I$(%WATCOM)/h/win $(FLAGS) res/qemumini.rc
+
vmws_vxd.res : res/vmws_vxd.rc .autodepend
wrc -q -r -ad -bt=nt -fo=$@ -Ires -I$(%WATCOM)/h/win $(FLAGS) res/vmws_vxd.rc
@@ -293,6 +306,73 @@ import GlobalSmartPageLock KERNEL.230
<<
wrc -q vmwsmini.res $@
+qemumini.drv : $(OBJS) qemumini.res dibeng.lib
+ wlink op quiet, start=DriverInit_ disable 2055 $(DBGFILE) @<<boxvmini.lnk
+system windows dll initglobal
+file dibthunk.obj
+file dibcall.obj
+file drvlib.obj
+file enable.obj
+file init_qemu.obj
+file palette.obj
+file scrsw.obj
+file sswhook.obj
+file modes_qemu.obj
+file boxv_qemu.obj
+file control.obj
+file dddrv.obj
+name qemumini.drv
+option map=qemumini.map
+library dibeng.lib
+library clibs.lib
+option modname=DISPLAY
+option description 'DISPLAY : 100, 96, 96 : DIB Engine based Mini display driver.'
+option oneautodata
+segment type data preload fixed
+segment '_TEXT' preload shared
+segment '_INIT' preload moveable
+export BitBlt.1
+export ColorInfo.2
+export Control.3
+export Disable.4
+export Enable.5
+export EnumDFonts.6
+export EnumObj.7
+export Output.8
+export Pixel.9
+export RealizeObject.10
+export StrBlt.11
+export ScanLR.12
+export DeviceMode.13
+export ExtTextOut.14
+export GetCharWidth.15
+export DeviceBitmap.16
+export FastBorder.17
+export SetAttribute.18
+export DibBlt.19
+export CreateDIBitmap.20
+export DibToDevice.21
+export SetPalette.22
+export GetPalette.23
+export SetPaletteTranslate.24
+export GetPaletteTranslate.25
+export UpdateColors.26
+export StretchBlt.27
+export StretchDIBits.28
+export SelectBitmap.29
+export BitmapBits.30
+export ReEnable.31
+export Inquire.101
+export SetCursor.102
+export MoveCursor.103
+export CheckCursor.104
+export GetDriverResourceID.450
+export UserRepaintDisable.500
+export ValidateMode.700
+import GlobalSmartPageLock KERNEL.230
+<<
+ wrc -q qemumini.res $@
+
vmwsmini.vxd : $(OBJS) vmws_vxd.res
wlink op quiet $(DBGFILE32) @<<vmwsmini.lnk
system win_vxd dynamic
diff --git a/minidrv.h b/minidrv.h
index e79df26..a122cf6 100644
--- a/minidrv.h
+++ b/minidrv.h
@@ -48,7 +48,11 @@ extern WORD FixModeInfo( LPMODEDESC lpMode );
extern int PhysicalEnable( void );
extern void PhysicalDisable( void );
extern void FAR SetRAMDAC_far( UINT bStart, UINT bCount, RGBQUAD FAR *lpPal );
+#ifdef QEMU
+extern DWORD ReadDisplayConfig( void );
+#else
extern void ReadDisplayConfig( void );
+#endif
extern void FAR RestoreDesktopMode( void );
extern FARPROC RepaintFunc;
extern void HookInt2Fh( void );
@@ -81,6 +85,9 @@ extern DWORD dwVideoMemorySize; /* Installed VRAM in bytes. */
extern DWORD VDDEntryPoint;
extern WORD OurVMHandle;
+#ifdef QEMU
+extern DWORD LfbBase;
+#endif
extern WORD wMesa3DEnabled; /* Is possible to accelerate though Mesa3D SVGA */
diff --git a/modes.c b/modes.c
index 61b8e67..57c69dd 100644
--- a/modes.c
+++ b/modes.c
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 2022 Michal Necasek
+ 2023 Philip Kelley
2023 Jaroslav Hensl
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -467,7 +468,11 @@ int PhysicalEnable( void )
if( !iChipID ) {
return( 0 );
}
+# ifdef QEMU
+ dwPhysVRAM = LfbBase;
+# else
dwPhysVRAM = BOXV_get_lfb_base( 0 );
+# endif
#endif
dbg_printf( "PhysicalEnable: Hardware detected, dwVideoMemorySize=%lX dwPhysVRAM=%lX\n", dwVideoMemorySize, dwPhysVRAM );
}
@@ -584,7 +589,11 @@ UINT WINAPI __loadds ValidateMode( DISPVALMODE FAR *lpValMode )
rc = VALMODE_NO_WRONGDRV;
break;
}
+# ifdef QEMU
+ dwPhysVRAM = LfbBase;
+# else
dwPhysVRAM = BOXV_get_lfb_base( 0 );
+# endif
#endif
dbg_printf( "ValidateMode: Hardware detected, dwVideoMemorySize=%lX dwPhysVRAM=%lX\n", dwVideoMemorySize, dwPhysVRAM );
}
diff --git a/modes_qemu.c b/modes_qemu.c
new file mode 100644
index 0000000..3a1ff0b
--- /dev/null
+++ b/modes_qemu.c
@@ -0,0 +1,2 @@
+#define QEMU
+#include "modes.c"
diff --git a/res/qemumini.rc b/res/qemumini.rc
new file mode 100644
index 0000000..088fcbf
--- /dev/null
+++ b/res/qemumini.rc
@@ -0,0 +1,19 @@
+/*
+ * Windows 9x minidriver resource file.
+ * Most of the contents is defined by backward compatibility
+ * requirements. Much of the detail is explained in the Windows 3.x
+ * and 2.x DDKs.
+ */
+
+#include "windows.h"
+
+#define VER_ORIGINALFILENAME_STR "qemumini.drv"
+
+#include "display.rcv"
+
+1 oembin PRELOAD config.bin
+2 oembin colortab.bin
+3 oembin PRELOAD fonts.bin
+fonts oembin fonts.bin
+
+2003 oembin PRELOAD fonts120.bin
diff --git a/vmdisp9x.inf b/vmdisp9x.inf
index 967a3d1..18982c0 100644
--- a/vmdisp9x.inf
+++ b/vmdisp9x.inf
@@ -50,18 +50,17 @@ vmwsmini.vxd=1
%VBoxVideoVGA.DeviceDesc%=VBox, PCI\VEN_80EE&DEV_BEEF&SUBSYS_00000000
%VBoxVideoSVGA.DeviceDesc%=VBoxSvga, PCI\VEN_80EE&DEV_BEEF&SUBSYS_040515AD
%VBoxVideoVM.DeviceDesc%=VMSvga, PCI\VEN_15AD&DEV_0405&SUBSYS_040515AD
-;Line for QEMU STD, but driver not working now
-;%QemuStd.DeviceDesc%=QemuSTD, PCI\VEN_1234&DEV_1111
+%QemuStd.DeviceDesc%=Qemu, PCI\VEN_1234&DEV_1111
[VBox]
CopyFiles=VBox.Copy,Dx.Copy,DX.CopyBackup,Voodoo.Copy
DelReg=VM.DelReg
AddReg=VBox.AddReg,VM.AddReg,DX.addReg
-[QemuStd]
-CopyFiles=VBox.Copy,Dx.Copy,DX.CopyBackup,Voodoo.Copy
+[Qemu]
+CopyFiles=Qemu.Copy,Dx.Copy,DX.CopyBackup,Voodoo.Copy
DelReg=VM.DelReg
-AddReg=VBox.AddReg,VM.AddReg,DX.addReg
+AddReg=Qemu.AddReg,VM.AddReg,DX.addReg
[VBoxSvga]
CopyFiles=VMSvga.Copy,Dx.Copy,DX.CopyBackup,Voodoo.Copy
@@ -78,6 +77,11 @@ boxvmini.drv,,,0x00000004
;mesa:mesa3d.dll,,,0x00000004
;bridge:bridge99.dll,,,0x00000004
+[Qemu.Copy]
+qemumini.drv,,,0x00000004
+;mesa:mesa3d.dll,,,0x00000004
+;bridge:bridge99.dll,,,0x00000004
+
[VMSvga.Copy]
vmwsmini.drv,,,0x00000004
vmwsmini.vxd,,,0x00000004
@@ -106,6 +110,11 @@ vmwsmini.vxd,,,0x00000004
;wined3d:d3d8.dll,,,0x00000004
;wined3d:d3d9.dll,,,0x00000004
+[Qemu.AddReg]
+HKR,DEFAULT,drv,,qemumini.drv
+;HKR,DEFAULT,minivdd,,qemumini.vxd
+HKR,DEFAULT,Mode,,"8,640,480"
+
[VBox.AddReg]
HKR,DEFAULT,drv,,boxvmini.drv
;HKR,DEFAULT,minivdd,,boxvmini.vxd