Separated the MZ loader and core DOS VM into dlls/winedos.

This commit is contained in:
Ove Kaaven 2000-12-26 00:22:45 +00:00 committed by Alexandre Julliard
parent 45437038b6
commit e5557b357a
23 changed files with 172 additions and 75 deletions

View File

@ -152,6 +152,7 @@ DLLS = \
user32 \ user32 \
version \ version \
w32skrnl \ w32skrnl \
winedos \
wineoss.drv \ wineoss.drv \
wineps \ wineps \
wininet \ wininet \

2
configure vendored
View File

@ -6752,6 +6752,7 @@ dlls/user/Makefile
dlls/version/Makefile dlls/version/Makefile
dlls/win32s/Makefile dlls/win32s/Makefile
dlls/winaspi/Makefile dlls/winaspi/Makefile
dlls/winedos/Makefile
dlls/wineps/Makefile dlls/wineps/Makefile
dlls/wininet/Makefile dlls/wininet/Makefile
dlls/winmm/Makefile dlls/winmm/Makefile
@ -6994,6 +6995,7 @@ dlls/user/Makefile
dlls/version/Makefile dlls/version/Makefile
dlls/win32s/Makefile dlls/win32s/Makefile
dlls/winaspi/Makefile dlls/winaspi/Makefile
dlls/winedos/Makefile
dlls/wineps/Makefile dlls/wineps/Makefile
dlls/wininet/Makefile dlls/wininet/Makefile
dlls/winmm/Makefile dlls/winmm/Makefile

View File

@ -1196,6 +1196,7 @@ dlls/user/Makefile
dlls/version/Makefile dlls/version/Makefile
dlls/win32s/Makefile dlls/win32s/Makefile
dlls/winaspi/Makefile dlls/winaspi/Makefile
dlls/winedos/Makefile
dlls/wineps/Makefile dlls/wineps/Makefile
dlls/wininet/Makefile dlls/wininet/Makefile
dlls/winmm/Makefile dlls/winmm/Makefile

View File

@ -57,6 +57,7 @@ DLLFILES = \
version/libversion.@LIBEXT@ \ version/libversion.@LIBEXT@ \
win32s/libw32skrnl.@LIBEXT@ \ win32s/libw32skrnl.@LIBEXT@ \
winaspi/libwnaspi32.@LIBEXT@ \ winaspi/libwnaspi32.@LIBEXT@ \
winedos/libwinedos.@LIBEXT@ \
wineps/libwineps.@LIBEXT@ \ wineps/libwineps.@LIBEXT@ \
wininet/libwininet.@LIBEXT@ \ wininet/libwininet.@LIBEXT@ \
winmm/joystick/libjoystick.drv.@LIBEXT@ \ winmm/joystick/libjoystick.drv.@LIBEXT@ \
@ -170,6 +171,7 @@ SUBDIRS = \
version \ version \
win32s \ win32s \
winaspi \ winaspi \
winedos \
wineps \ wineps \
wininet \ wininet \
winmm \ winmm \
@ -358,6 +360,9 @@ libversion.@LIBEXT@ libver.@LIBEXT@: version/libversion.@LIBEXT@
libw32skrnl.@LIBEXT@ libw32sys.@LIBEXT@ libwin32s16.@LIBEXT@: win32s/libw32skrnl.@LIBEXT@ libw32skrnl.@LIBEXT@ libw32sys.@LIBEXT@ libwin32s16.@LIBEXT@: win32s/libw32skrnl.@LIBEXT@
$(RM) $@ && $(LN_S) win32s/libw32skrnl.@LIBEXT@ $@ $(RM) $@ && $(LN_S) win32s/libw32skrnl.@LIBEXT@ $@
libwinedos.@LIBEXT@: winedos/libwinedos.@LIBEXT@
$(RM) $@ && $(LN_S) winedos/libwinedos.@LIBEXT@ $@
libwineoss.drv.@LIBEXT@: winmm/wineoss/libwineoss.drv.@LIBEXT@ libwineoss.drv.@LIBEXT@: winmm/wineoss/libwineoss.drv.@LIBEXT@
$(RM) $@ && $(LN_S) winmm/wineoss/libwineoss.drv.@LIBEXT@ $@ $(RM) $@ && $(LN_S) winmm/wineoss/libwineoss.drv.@LIBEXT@ $@
@ -438,6 +443,7 @@ user/libuser32.@LIBEXT@: libgdi32.@LIBEXT@ libadvapi32.@LIBEXT@ libkernel32.@LIB
version/libversion.@LIBEXT@: liblz32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@ version/libversion.@LIBEXT@: liblz32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
win32s/libw32skrnl.@LIBEXT@: libkernel32.@LIBEXT@ libntdll.@LIBEXT@ win32s/libw32skrnl.@LIBEXT@: libkernel32.@LIBEXT@ libntdll.@LIBEXT@
winaspi/libwnaspi32.@LIBEXT@: libadvapi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@ winaspi/libwnaspi32.@LIBEXT@: libadvapi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
winedos/libwinedos.@LIBEXT@: libuser32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
wineps/libwineps.@LIBEXT@: libuser32.@LIBEXT@ libgdi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@ wineps/libwineps.@LIBEXT@: libuser32.@LIBEXT@ libgdi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
wininet/libwininet.@LIBEXT@: libuser32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@ wininet/libwininet.@LIBEXT@: libuser32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
winmm/joystick/libjoystick.drv.@LIBEXT@: libwinmm.@LIBEXT@ libuser32.@LIBEXT@ libntdll.@LIBEXT@ winmm/joystick/libjoystick.drv.@LIBEXT@: libwinmm.@LIBEXT@ libuser32.@LIBEXT@ libntdll.@LIBEXT@

View File

@ -33,7 +33,6 @@ EXTRA_OBJS = \
$(TOPOBJDIR)/if1632/if1632.o \ $(TOPOBJDIR)/if1632/if1632.o \
$(TOPOBJDIR)/loader/loader.o \ $(TOPOBJDIR)/loader/loader.o \
$(TOPOBJDIR)/loader/ne/ne.o \ $(TOPOBJDIR)/loader/ne/ne.o \
$(TOPOBJDIR)/loader/dos/dos.o \
$(TOPOBJDIR)/memory/memory.o \ $(TOPOBJDIR)/memory/memory.o \
$(TOPOBJDIR)/misc/misc.o \ $(TOPOBJDIR)/misc/misc.o \
$(TOPOBJDIR)/msdos/msdos.o \ $(TOPOBJDIR)/msdos/msdos.o \

2
dlls/winedos/.cvsignore Normal file
View File

@ -0,0 +1,2 @@
Makefile
winedos.spec.c

15
dlls/winedos/Makefile.in Normal file
View File

@ -0,0 +1,15 @@
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = winedos
SOVERSION = 1.0
IMPORTS = user32 kernel32 ntdll
C_SRCS = \
dosvm.c \
module.c
@MAKE_DLL_RULES@
### Dependencies:

View File

@ -33,7 +33,7 @@
#include "file.h" #include "file.h"
#include "miscemu.h" #include "miscemu.h"
#include "dosexe.h" #include "dosexe.h"
#include "dosmod.h" #include "../../loader/dos/dosmod.h"
#include "stackframe.h" #include "stackframe.h"
#include "debugtools.h" #include "debugtools.h"
@ -212,7 +212,7 @@ static void DOSVM_SendQueuedEvents(CONTEXT86 *context)
DOSVM_SendQueuedEvent(context); DOSVM_SendQueuedEvent(context);
} }
void DOSVM_QueueEvent( int irq, int priority, void (*relay)(CONTEXT86*,void*), void *data) void WINAPI DOSVM_QueueEvent( int irq, int priority, void (*relay)(CONTEXT86*,void*), void *data)
{ {
LPDOSEVENT event, cur, prev; LPDOSEVENT event, cur, prev;
@ -407,7 +407,7 @@ static void DOSVM_ProcessMessage(MSG *msg)
} }
} }
void DOSVM_Wait( int read_pipe, HANDLE hObject ) void WINAPI DOSVM_Wait( int read_pipe, HANDLE hObject )
{ {
MSG msg; MSG msg;
DWORD waitret; DWORD waitret;
@ -468,7 +468,7 @@ void DOSVM_Wait( int read_pipe, HANDLE hObject )
} while (TRUE); } while (TRUE);
} }
int DOSVM_Enter( CONTEXT86 *context ) int WINAPI DOSVM_Enter( CONTEXT86 *context )
{ {
struct vm86plus_struct VM86; struct vm86plus_struct VM86;
int stat,len,sig; int stat,len,sig;
@ -541,7 +541,7 @@ int DOSVM_Enter( CONTEXT86 *context )
return 0; return 0;
} }
void DOSVM_PIC_ioport_out( WORD port, BYTE val) void WINAPI DOSVM_PIC_ioport_out( WORD port, BYTE val)
{ {
LPDOSEVENT event; LPDOSEVENT event;
@ -571,7 +571,7 @@ void DOSVM_PIC_ioport_out( WORD port, BYTE val)
} }
} }
void DOSVM_SetTimer( unsigned ticks ) void WINAPI DOSVM_SetTimer( unsigned ticks )
{ {
int stat=DOSMOD_SET_TIMER; int stat=DOSMOD_SET_TIMER;
struct timeval tim; struct timeval tim;
@ -595,7 +595,7 @@ void DOSVM_SetTimer( unsigned ticks )
} }
} }
unsigned DOSVM_GetTimer( void ) unsigned WINAPI DOSVM_GetTimer( void )
{ {
int stat=DOSMOD_GET_TIMER; int stat=DOSMOD_GET_TIMER;
struct timeval tim; struct timeval tim;
@ -619,17 +619,17 @@ unsigned DOSVM_GetTimer( void )
#else /* !MZ_SUPPORTED */ #else /* !MZ_SUPPORTED */
int DOSVM_Enter( CONTEXT86 *context ) int WINAPI DOSVM_Enter( CONTEXT86 *context )
{ {
ERR_(module)("DOS realmode not supported on this architecture!\n"); ERR_(module)("DOS realmode not supported on this architecture!\n");
return -1; return -1;
} }
void DOSVM_Wait( int read_pipe, HANDLE hObject) {} void WINAPI DOSVM_Wait( int read_pipe, HANDLE hObject) {}
void DOSVM_PIC_ioport_out( WORD port, BYTE val) {} void WINAPI DOSVM_PIC_ioport_out( WORD port, BYTE val) {}
void DOSVM_SetTimer( unsigned ticks ) {} void WINAPI DOSVM_SetTimer( unsigned ticks ) {}
unsigned DOSVM_GetTimer( void ) { return 0; } unsigned WINAPI DOSVM_GetTimer( void ) { return 0; }
void DOSVM_QueueEvent( int irq, int priority, void (*relay)(CONTEXT86*,void*), void *data) void WINAPI DOSVM_QueueEvent( int irq, int priority, void (*relay)(CONTEXT86*,void*), void *data)
{ {
if (irq<0) { if (irq<0) {
/* callback event, perform it with dummy context */ /* callback event, perform it with dummy context */

View File

@ -27,7 +27,7 @@
#include "miscemu.h" #include "miscemu.h"
#include "debugtools.h" #include "debugtools.h"
#include "dosexe.h" #include "dosexe.h"
#include "dosmod.h" #include "../../loader/dos/dosmod.h"
#include "options.h" #include "options.h"
#include "vga.h" #include "vga.h"
@ -199,7 +199,7 @@ static BOOL MZ_InitMemory(void)
return TRUE; return TRUE;
} }
BOOL MZ_DoLoadImage( HANDLE hFile, LPCSTR filename, OverlayBlock *oblk ) static BOOL MZ_DoLoadImage( HANDLE hFile, LPCSTR filename, OverlayBlock *oblk )
{ {
LPDOSTASK lpDosTask = dos_current; LPDOSTASK lpDosTask = dos_current;
IMAGE_DOS_HEADER mz_header; IMAGE_DOS_HEADER mz_header;
@ -333,7 +333,7 @@ load_error:
return FALSE; return FALSE;
} }
BOOL MZ_LoadImage( LPCSTR cmdline ) BOOL WINAPI MZ_LoadImage( LPCSTR cmdline )
{ {
HFILE hFile; HFILE hFile;
char *name, buffer[MAX_PATH]; char *name, buffer[MAX_PATH];
@ -362,7 +362,7 @@ BOOL MZ_LoadImage( LPCSTR cmdline )
return FALSE; return FALSE;
} }
BOOL MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk ) BOOL WINAPI MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk )
{ {
/* this may only be called from existing DOS processes /* this may only be called from existing DOS processes
* (i.e. one DOS app spawning another) */ * (i.e. one DOS app spawning another) */
@ -424,7 +424,7 @@ BOOL MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk )
return ret; return ret;
} }
LPDOSTASK MZ_AllocDPMITask( void ) LPDOSTASK WINAPI MZ_AllocDPMITask( void )
{ {
LPDOSTASK lpDosTask = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DOSTASK)); LPDOSTASK lpDosTask = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DOSTASK));
@ -569,7 +569,7 @@ static void MZ_KillTask(void)
kill(dosmod_pid,SIGTERM); kill(dosmod_pid,SIGTERM);
} }
void MZ_Exit( CONTEXT86 *context, BOOL cs_psp, WORD retval ) void WINAPI MZ_Exit( CONTEXT86 *context, BOOL cs_psp, WORD retval )
{ {
LPDOSTASK lpDosTask = MZ_Current(); LPDOSTASK lpDosTask = MZ_Current();
if (lpDosTask) { if (lpDosTask) {
@ -608,34 +608,34 @@ void MZ_Exit( CONTEXT86 *context, BOOL cs_psp, WORD retval )
#else /* !MZ_SUPPORTED */ #else /* !MZ_SUPPORTED */
BOOL MZ_LoadImage( LPCSTR cmdline ) BOOL WINAPI MZ_LoadImage( LPCSTR cmdline )
{ {
WARN("DOS executables not supported on this platform\n"); WARN("DOS executables not supported on this platform\n");
SetLastError(ERROR_BAD_FORMAT); SetLastError(ERROR_BAD_FORMAT);
return FALSE; return FALSE;
} }
BOOL MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk ) BOOL WINAPI MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk )
{ {
/* can't happen */ /* can't happen */
SetLastError(ERROR_BAD_FORMAT); SetLastError(ERROR_BAD_FORMAT);
return FALSE; return FALSE;
} }
LPDOSTASK MZ_AllocDPMITask( void ) LPDOSTASK WINAPI MZ_AllocDPMITask( void )
{ {
ERR("Actual real-mode calls not supported on this platform!\n"); ERR("Actual real-mode calls not supported on this platform!\n");
return NULL; return NULL;
} }
void MZ_Exit( CONTEXT86 *context, BOOL cs_psp, WORD retval ) void WINAPI MZ_Exit( CONTEXT86 *context, BOOL cs_psp, WORD retval )
{ {
ExitThread( retval ); ExitThread( retval );
} }
#endif /* !MZ_SUPPORTED */ #endif /* !MZ_SUPPORTED */
LPDOSTASK MZ_Current( void ) LPDOSTASK WINAPI MZ_Current( void )
{ {
return dos_current; return dos_current;
} }

19
dlls/winedos/winedos.spec Normal file
View File

@ -0,0 +1,19 @@
name winedos
type win32
import user32.dll
import kernel32.dll
import ntdll.dll
@ stdcall GetCurrent() MZ_Current
@ stdcall LoadDPMI() MZ_AllocDPMITask
@ stdcall LoadDosExe(str) MZ_LoadImage
@ stdcall Exec(ptr str long ptr) MZ_Exec
@ stdcall Exit(ptr long long) MZ_Exit
@ stdcall Enter(ptr) DOSVM_Enter
@ stdcall Wait(long long) DOSVM_Wait
@ stdcall QueueEvent(long long ptr ptr) DOSVM_QueueEvent
@ stdcall OutPIC(long long) DOSVM_PIC_ioport_out
@ stdcall SetTimer(long) DOSVM_SetTimer
@ stdcall GetTimer() DOSVM_GetTimer

View File

@ -48,6 +48,24 @@ typedef struct
extern CALLOUT_TABLE Callout; extern CALLOUT_TABLE Callout;
typedef struct {
struct _DOSTASK* WINAPI (*Current)( void );
struct _DOSTASK* WINAPI (*LoadDPMI)( void );
BOOL WINAPI (*LoadDosExe)( LPCSTR cmdline );
BOOL WINAPI (*Exec)( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk );
void WINAPI (*Exit)( CONTEXT86 *context, BOOL cs_psp, WORD retval );
int WINAPI (*Enter)( CONTEXT86 *context );
void WINAPI (*Wait)( int read_pipe, HANDLE hObject );
void WINAPI (*QueueEvent)( int irq, int priority, void (*relay)(CONTEXT86*,void*), void *data );
void WINAPI (*OutPIC)( WORD port, BYTE val );
void WINAPI (*SetTimer)( unsigned ticks );
unsigned WINAPI (*GetTimer)( void );
} DOSVM_TABLE;
extern DOSVM_TABLE Dosvm;
#include "pshpack1.h" #include "pshpack1.h"
typedef struct tagTHUNK typedef struct tagTHUNK

View File

@ -30,16 +30,16 @@ typedef struct _DOSTASK {
#define V86_FLAG 0x00020000 #define V86_FLAG 0x00020000
extern BOOL MZ_LoadImage( LPCSTR cmdline ); extern BOOL WINAPI MZ_LoadImage( LPCSTR cmdline );
extern BOOL MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk ); extern BOOL WINAPI MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk );
extern void MZ_Exit( CONTEXT86 *context, BOOL cs_psp, WORD retval ); extern void WINAPI MZ_Exit( CONTEXT86 *context, BOOL cs_psp, WORD retval );
extern LPDOSTASK MZ_Current( void ); extern LPDOSTASK WINAPI MZ_Current( void );
extern LPDOSTASK MZ_AllocDPMITask( void ); extern LPDOSTASK WINAPI MZ_AllocDPMITask( void );
extern int DOSVM_Enter( CONTEXT86 *context ); extern int WINAPI DOSVM_Enter( CONTEXT86 *context );
extern void DOSVM_Wait( int read_pipe, HANDLE hObject ); extern void WINAPI DOSVM_Wait( int read_pipe, HANDLE hObject );
extern void DOSVM_QueueEvent( int irq, int priority, void (*relay)(CONTEXT86*,void*), void *data ); extern void WINAPI DOSVM_QueueEvent( int irq, int priority, void (*relay)(CONTEXT86*,void*), void *data );
extern void DOSVM_PIC_ioport_out( WORD port, BYTE val ); extern void WINAPI DOSVM_PIC_ioport_out( WORD port, BYTE val );
extern void DOSVM_SetTimer( unsigned ticks ); extern void WINAPI DOSVM_SetTimer( unsigned ticks );
extern unsigned DOSVM_GetTimer( void ); extern unsigned WINAPI DOSVM_GetTimer( void );
#endif /* __WINE_DOSEXE_H */ #endif /* __WINE_DOSEXE_H */

View File

@ -238,6 +238,7 @@ extern void WINAPI INT_Int33Message(UINT,WPARAM,LPARAM);
/* msdos/dpmi.c */ /* msdos/dpmi.c */
typedef void WINAPI (*RMCBPROC)(CONTEXT86*); typedef void WINAPI (*RMCBPROC)(CONTEXT86*);
extern void WINAPI INT_Int31Handler(CONTEXT86*); extern void WINAPI INT_Int31Handler(CONTEXT86*);
extern BOOL DPMI_LoadDosSystem(void);
extern FARPROC16 WINAPI DPMI_AllocInternalRMCB(RMCBPROC); extern FARPROC16 WINAPI DPMI_AllocInternalRMCB(RMCBPROC);
extern void WINAPI DPMI_FreeInternalRMCB(FARPROC16); extern void WINAPI DPMI_FreeInternalRMCB(FARPROC16);
extern int DPMI_CallRMProc(CONTEXT86*,LPWORD,int,int); extern int DPMI_CallRMProc(CONTEXT86*,LPWORD,int,int);

View File

@ -3,22 +3,16 @@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../.. TOPOBJDIR = ../..
SRCDIR = @srcdir@ SRCDIR = @srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
MODULE = dos
C_SRCS = \ C_SRCS = dosmod.c
module.c \
dosvm.c
PROGRAMS = dosmod PROGRAMS = dosmod
all: $(MODULE).o $(PROGRAMS) all: $(PROGRAMS)
dosmod: dosmod.c dosmod: dosmod.c
$(CC) $(ALLCFLAGS) -o dosmod $(SRCDIR)/dosmod.c $(CC) $(ALLCFLAGS) -o dosmod $(SRCDIR)/dosmod.c
@MAKE_RULES@ @MAKE_RULES@
$(MODULE).o: $(OBJS) Makefile.in $(TOPSRCDIR)/Make.rules.in
$(LDCOMBINE) $(OBJS) -o $@
### Dependencies: ### Dependencies:

View File

@ -8,6 +8,7 @@
#include "wingdi.h" #include "wingdi.h"
#include "winuser.h" #include "winuser.h"
#include "miscemu.h"
#include "callback.h" #include "callback.h"
#include "options.h" #include "options.h"
#include "dosexe.h" #include "dosexe.h"
@ -34,7 +35,8 @@ int WINAPI wine_initial_task( HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, INT
{ {
if (instance == 11) /* try DOS format */ if (instance == 11) /* try DOS format */
{ {
MZ_LoadImage( GetCommandLineA() ); if (DPMI_LoadDosSystem())
Dosvm.LoadDosExe( GetCommandLineA() );
/* if we get back here it failed */ /* if we get back here it failed */
instance = GetLastError(); instance = GetLastError();
} }

View File

@ -10,6 +10,7 @@
#include "msdos.h" #include "msdos.h"
#include "miscemu.h" #include "miscemu.h"
#include "dosexe.h" #include "dosexe.h"
#include "callback.h"
#include "debugtools.h" #include "debugtools.h"
#include "pshpack1.h" #include "pshpack1.h"
@ -264,7 +265,7 @@ static void WINAPI con_interrupt(CONTEXT86*ctx)
/* check for new keyboard input */ /* check for new keyboard input */
while (CurOfs == bios->FirstKbdCharPtr) { while (CurOfs == bios->FirstKbdCharPtr) {
/* no input available yet, so wait... */ /* no input available yet, so wait... */
DOSVM_Wait( -1, 0 ); Dosvm.Wait( -1, 0 );
} }
/* read from keyboard queue (call int16?) */ /* read from keyboard queue (call int16?) */
data = ((WORD*)bios)[CurOfs]; data = ((WORD*)bios)[CurOfs];
@ -283,7 +284,7 @@ static void WINAPI con_interrupt(CONTEXT86*ctx)
/* check for new keyboard input */ /* check for new keyboard input */
while (CurOfs == bios->FirstKbdCharPtr) { while (CurOfs == bios->FirstKbdCharPtr) {
/* no input available yet, so wait... */ /* no input available yet, so wait... */
DOSVM_Wait( -1, 0 ); Dosvm.Wait( -1, 0 );
} }
/* read from keyboard queue (call int16?) */ /* read from keyboard queue (call int16?) */
data = ((WORD*)bios)[CurOfs]; data = ((WORD*)bios)[CurOfs];

View File

@ -63,6 +63,36 @@ typedef struct tagRMCB {
static RMCB *FirstRMCB = NULL; static RMCB *FirstRMCB = NULL;
static LPDOSTASK WINAPI DPMI_NoCurrent(void) { return NULL; }
DOSVM_TABLE Dosvm = { DPMI_NoCurrent };
static HMODULE DosModule;
/**********************************************************************
* DPMI_LoadDosSystem
*/
BOOL DPMI_LoadDosSystem(void)
{
if (DosModule) return TRUE;
DosModule = LoadLibraryA( "winedos.dll" );
if (!DosModule) {
ERR("could not load winedos.dll, DOS subsystem unavailable\n");
return FALSE;
}
Dosvm.Current = (void *)GetProcAddress(DosModule, "GetCurrent");
Dosvm.LoadDPMI = (void *)GetProcAddress(DosModule, "LoadDPMI");
Dosvm.LoadDosExe = (void *)GetProcAddress(DosModule, "LoadDosExe");
Dosvm.Exec = (void *)GetProcAddress(DosModule, "Exec");
Dosvm.Exit = (void *)GetProcAddress(DosModule, "Exit");
Dosvm.Enter = (void *)GetProcAddress(DosModule, "Enter");
Dosvm.Wait = (void *)GetProcAddress(DosModule, "Wait");
Dosvm.QueueEvent = (void *)GetProcAddress(DosModule, "QueueEvent");
Dosvm.OutPIC = (void *)GetProcAddress(DosModule, "OutPIC");
Dosvm.SetTimer = (void *)GetProcAddress(DosModule, "SetTimer");
Dosvm.GetTimer = (void *)GetProcAddress(DosModule, "GetTimer");
return TRUE;
}
/********************************************************************** /**********************************************************************
* DPMI_xalloc * DPMI_xalloc
* special virtualalloc, allocates lineary monoton growing memory. * special virtualalloc, allocates lineary monoton growing memory.
@ -307,13 +337,11 @@ int DPMI_CallRMProc( CONTEXT86 *context, LPWORD stack, int args, int iret )
{ {
LPWORD stack16; LPWORD stack16;
LPVOID addr = NULL; /* avoid gcc warning */ LPVOID addr = NULL; /* avoid gcc warning */
LPDOSTASK lpDosTask = MZ_Current(); LPDOSTASK lpDosTask = Dosvm.Current();
RMCB *CurrRMCB; RMCB *CurrRMCB;
int alloc = 0, already = 0; int alloc = 0, already = 0;
BYTE *code; BYTE *code;
GlobalUnlock16( GetCurrentTask() );
TRACE("EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n", TRACE("EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n",
context->Eax, context->Ebx, context->Ecx, context->Edx ); context->Eax, context->Ebx, context->Ecx, context->Edx );
TRACE("ESI=%08lx EDI=%08lx ES=%04lx DS=%04lx CS:IP=%04lx:%04x, %d WORD arguments, %s\n", TRACE("ESI=%08lx EDI=%08lx ES=%04lx DS=%04lx CS:IP=%04lx:%04x, %d WORD arguments, %s\n",
@ -355,7 +383,7 @@ callrmproc_again:
if (!(CurrRMCB || lpDosTask)) { if (!(CurrRMCB || lpDosTask)) {
FIXME("DPMI real-mode call using DOS VM task system, not fully tested!\n"); FIXME("DPMI real-mode call using DOS VM task system, not fully tested!\n");
TRACE("creating VM86 task\n"); TRACE("creating VM86 task\n");
if (!(lpDosTask = MZ_AllocDPMITask() )) { if ((!DPMI_LoadDosSystem()) || !(lpDosTask = Dosvm.LoadDPMI() )) {
ERR("could not setup VM86 task\n"); ERR("could not setup VM86 task\n");
return 1; return 1;
} }
@ -401,7 +429,7 @@ callrmproc_again:
} }
} else { } else {
TRACE("entering real mode...\n"); TRACE("entering real mode...\n");
DOSVM_Enter( context ); Dosvm.Enter( context );
TRACE("returned from real-mode call\n"); TRACE("returned from real-mode call\n");
} }
if (alloc) DOSMEM_FreeBlock( addr ); if (alloc) DOSMEM_FreeBlock( addr );
@ -630,7 +658,7 @@ static void StartPM( CONTEXT86 *context, LPDOSTASK lpDosTask )
#if 0 #if 0
void WINAPI DPMI_RawModeSwitch( SIGCONTEXT *context ) void WINAPI DPMI_RawModeSwitch( SIGCONTEXT *context )
{ {
LPDOSTASK lpDosTask = MZ_Current(); LPDOSTASK lpDosTask = Dosvm.Current();
CONTEXT86 rm_ctx; CONTEXT86 rm_ctx;
int ret; int ret;
@ -655,9 +683,9 @@ void WINAPI DPMI_RawModeSwitch( SIGCONTEXT *context )
/* enter real mode again */ /* enter real mode again */
TRACE("re-entering real mode at %04lx:%04lx\n",rm_ctx.SegCs,rm_ctx.Eip); TRACE("re-entering real mode at %04lx:%04lx\n",rm_ctx.SegCs,rm_ctx.Eip);
ret = DOSVM_Enter( &rm_ctx ); ret = Dosvm.Enter( &rm_ctx );
/* when the real-mode stuff call its mode switch address, /* when the real-mode stuff call its mode switch address,
DOSVM_Enter will return and we will continue here */ Dosvm.Enter will return and we will continue here */
if (ret<0) { if (ret<0) {
/* if the sync was lost, there's no way to recover */ /* if the sync was lost, there's no way to recover */
@ -698,7 +726,7 @@ void WINAPI INT_Int31Handler( CONTEXT86 *context )
DWORD dw; DWORD dw;
BYTE *ptr; BYTE *ptr;
LPDOSTASK lpDosTask = MZ_Current(); LPDOSTASK lpDosTask = Dosvm.Current();
if (ISV86(context) && lpDosTask) { if (ISV86(context) && lpDosTask) {
/* Called from real mode, check if it's our wrapper */ /* Called from real mode, check if it's our wrapper */

View File

@ -11,6 +11,7 @@
#include "winuser.h" #include "winuser.h"
#include "miscemu.h" #include "miscemu.h"
#include "debugtools.h" #include "debugtools.h"
#include "callback.h"
#include "dosexe.h" #include "dosexe.h"
DEFAULT_DEBUG_CHANNEL(int); DEFAULT_DEBUG_CHANNEL(int);
@ -59,13 +60,13 @@ void WINAPI INT_Int09Handler( CONTEXT86 *context )
INT_Int16AddChar(0, scan); INT_Int16AddChar(0, scan);
} }
} }
DOSVM_PIC_ioport_out(0x20, 0x20); /* send EOI */ Dosvm.OutPIC(0x20, 0x20); /* send EOI */
} }
static void KbdRelay( CONTEXT86 *context, void *data ) static void KbdRelay( CONTEXT86 *context, void *data )
{ {
if (kbdinfo.queuelen) { if (kbdinfo.queuelen) {
/* cleanup operation, called from DOSVM_PIC_ioport_out: /* cleanup operation, called from Dosvm.OutPIC:
* we'll remove current scancode from keyboard buffer here, * we'll remove current scancode from keyboard buffer here,
* rather than in ReadScan, because some DOS apps depend on * rather than in ReadScan, because some DOS apps depend on
* the scancode being available for reading multiple times... */ * the scancode being available for reading multiple times... */
@ -86,7 +87,7 @@ void WINAPI INT_Int09SendScan( BYTE scan, BYTE ascii )
kbdinfo.queue[kbdinfo.queuelen] = scan; kbdinfo.queue[kbdinfo.queuelen] = scan;
kbdinfo.ascii[kbdinfo.queuelen++] = ascii; kbdinfo.ascii[kbdinfo.queuelen++] = ascii;
/* tell app to read it by triggering IRQ 1 (int 09) */ /* tell app to read it by triggering IRQ 1 (int 09) */
DOSVM_QueueEvent(1,DOS_PRIORITY_KEYBOARD,KbdRelay,NULL); Dosvm.QueueEvent(1,DOS_PRIORITY_KEYBOARD,KbdRelay,NULL);
} }
BYTE WINAPI INT_Int09ReadScan( BYTE*ascii ) BYTE WINAPI INT_Int09ReadScan( BYTE*ascii )

View File

@ -8,6 +8,7 @@
#include "config.h" #include "config.h"
#include "module.h" #include "module.h"
#include "callback.h"
#include "dosexe.h" #include "dosexe.h"
#include "wincon.h" #include "wincon.h"
#include "debugtools.h" #include "debugtools.h"
@ -139,7 +140,7 @@ int WINAPI INT_Int16ReadChar(BYTE*ascii,BYTE*scan,BOOL peek)
} else { } else {
while (CurOfs == data->FirstKbdCharPtr) { while (CurOfs == data->FirstKbdCharPtr) {
/* no input available yet, so wait... */ /* no input available yet, so wait... */
DOSVM_Wait( -1, 0 ); Dosvm.Wait( -1, 0 );
} }
} }
/* read from keyboard queue */ /* read from keyboard queue */

View File

@ -8,7 +8,7 @@
/* #define DEBUG_INT */ /* #define DEBUG_INT */
#include "debugtools.h" #include "debugtools.h"
#include "task.h" #include "task.h"
#include "dosexe.h" #include "callback.h"
/********************************************************************** /**********************************************************************
* INT_Int20Handler * INT_Int20Handler
@ -17,5 +17,6 @@
*/ */
void WINAPI INT_Int20Handler( CONTEXT86 *context ) void WINAPI INT_Int20Handler( CONTEXT86 *context )
{ {
MZ_Exit( context, TRUE, 0 ); if (Dosvm.Exit) Dosvm.Exit( context, TRUE, 0 );
else ExitThread( 0 );
} }

View File

@ -32,7 +32,8 @@
#include "options.h" #include "options.h"
#include "miscemu.h" #include "miscemu.h"
#include "task.h" #include "task.h"
#include "dosexe.h" /* for the MZ_SUPPORTED define */ #include "dosexe.h"
#include "callback.h"
#include "debugtools.h" #include "debugtools.h"
#include "console.h" #include "console.h"
@ -946,7 +947,7 @@ INT21_networkfunc (CONTEXT86 *context)
static void INT21_SetCurrentPSP(WORD psp) static void INT21_SetCurrentPSP(WORD psp)
{ {
LPDOSTASK lpDosTask = MZ_Current(); LPDOSTASK lpDosTask = Dosvm.Current();
if (lpDosTask) if (lpDosTask)
lpDosTask->psp_seg = psp; lpDosTask->psp_seg = psp;
else else
@ -955,7 +956,7 @@ static void INT21_SetCurrentPSP(WORD psp)
static WORD INT21_GetCurrentPSP(void) static WORD INT21_GetCurrentPSP(void)
{ {
LPDOSTASK lpDosTask = MZ_Current(); LPDOSTASK lpDosTask = Dosvm.Current();
if (lpDosTask) if (lpDosTask)
return lpDosTask->psp_seg; return lpDosTask->psp_seg;
else else
@ -964,7 +965,7 @@ static WORD INT21_GetCurrentPSP(void)
static WORD INT21_GetReturnCode(void) static WORD INT21_GetReturnCode(void)
{ {
LPDOSTASK lpDosTask = MZ_Current(); LPDOSTASK lpDosTask = Dosvm.Current();
if (lpDosTask) { if (lpDosTask) {
WORD ret = lpDosTask->retval; WORD ret = lpDosTask->retval;
lpDosTask->retval = 0; lpDosTask->retval = 0;
@ -1144,7 +1145,8 @@ void WINAPI DOS3Call( CONTEXT86 *context )
case 0x00: /* TERMINATE PROGRAM */ case 0x00: /* TERMINATE PROGRAM */
TRACE("TERMINATE PROGRAM\n"); TRACE("TERMINATE PROGRAM\n");
MZ_Exit( context, FALSE, 0 ); if (Dosvm.Exit) Dosvm.Exit( context, FALSE, 0 );
else ExitThread( 0 );
break; break;
case 0x01: /* READ CHARACTER FROM STANDARD INPUT, WITH ECHO */ case 0x01: /* READ CHARACTER FROM STANDARD INPUT, WITH ECHO */
@ -1843,7 +1845,7 @@ void WINAPI DOS3Call( CONTEXT86 *context )
TRACE("EXEC %s\n", TRACE("EXEC %s\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx )); (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx ));
if (ISV86(context)) { if (ISV86(context)) {
if (!MZ_Exec( context, CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx), if (!Dosvm.Exec( context, CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx),
AL_reg(context), CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Ebx) )) AL_reg(context), CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Ebx) ))
bSetDOSExtendedError = TRUE; bSetDOSExtendedError = TRUE;
} else { } else {
@ -1856,7 +1858,8 @@ void WINAPI DOS3Call( CONTEXT86 *context )
case 0x4c: /* "EXIT" - TERMINATE WITH RETURN CODE */ case 0x4c: /* "EXIT" - TERMINATE WITH RETURN CODE */
TRACE("EXIT with return code %d\n",AL_reg(context)); TRACE("EXIT with return code %d\n",AL_reg(context));
MZ_Exit( context, FALSE, AL_reg(context) ); if (Dosvm.Exit) Dosvm.Exit( context, FALSE, AL_reg(context) );
else ExitThread( AL_reg(context) );
break; break;
case 0x4d: /* GET RETURN CODE */ case 0x4d: /* GET RETURN CODE */

View File

@ -9,6 +9,7 @@
#include "wingdi.h" #include "wingdi.h"
#include "winuser.h" #include "winuser.h"
#include "miscemu.h" #include "miscemu.h"
#include "callback.h"
#include "dosexe.h" #include "dosexe.h"
#include "vga.h" #include "vga.h"
#include "debugtools.h" #include "debugtools.h"
@ -150,6 +151,6 @@ void WINAPI INT_Int33Message(UINT message,WPARAM wParam,LPARAM lParam)
data->but = mouse_info.but; data->but = mouse_info.but;
data->x = mouse_info.x; data->x = mouse_info.x;
data->y = mouse_info.y; data->y = mouse_info.y;
DOSVM_QueueEvent(-1, DOS_PRIORITY_MOUSE, MouseRelay, data); Dosvm.QueueEvent(-1, DOS_PRIORITY_MOUSE, MouseRelay, data);
} }
} }

View File

@ -19,6 +19,7 @@
#include <unistd.h> #include <unistd.h>
#include "windef.h" #include "windef.h"
#include "vga.h" #include "vga.h"
#include "callback.h"
#include "dosexe.h" #include "dosexe.h"
#include "options.h" #include "options.h"
#include "miscemu.h" #include "miscemu.h"
@ -91,7 +92,7 @@ static void set_timer_maxval(unsigned timer, unsigned maxval)
{ {
switch (timer) { switch (timer) {
case 0: /* System timer counter divisor */ case 0: /* System timer counter divisor */
DOSVM_SetTimer(maxval); Dosvm.SetTimer(maxval);
break; break;
case 1: /* RAM refresh */ case 1: /* RAM refresh */
FIXME("RAM refresh counter handling not implemented !"); FIXME("RAM refresh counter handling not implemented !");
@ -292,8 +293,8 @@ DWORD IO_inport( int port, int size )
dummy_ctr -= 1 + (int)(10.0 * rand() / (RAND_MAX + 1.0)); dummy_ctr -= 1 + (int)(10.0 * rand() / (RAND_MAX + 1.0));
if (chan == 0) /* System timer counter divisor */ if (chan == 0) /* System timer counter divisor */
{ {
/* FIXME: DOSVM_GetTimer() returns quite rigid values */ /* FIXME: Dosvm.GetTimer() returns quite rigid values */
tempval = dummy_ctr + (WORD)DOSVM_GetTimer(); tempval = dummy_ctr + (WORD)Dosvm.GetTimer();
} }
else else
{ {
@ -393,7 +394,7 @@ void IO_outport( int port, int size, DWORD value )
switch (port) switch (port)
{ {
case 0x20: case 0x20:
DOSVM_PIC_ioport_out( port, (BYTE)value ); Dosvm.OutPIC( port, (BYTE)value );
break; break;
case 0x40: case 0x40:
case 0x41: case 0x41:
@ -450,7 +451,7 @@ void IO_outport( int port, int size, DWORD value )
tmr_8253[chan].latched = TRUE; tmr_8253[chan].latched = TRUE;
dummy_ctr -= 1 + (int)(10.0 * rand() / (RAND_MAX + 1.0)); dummy_ctr -= 1 + (int)(10.0 * rand() / (RAND_MAX + 1.0));
if (chan == 0) /* System timer divisor */ if (chan == 0) /* System timer divisor */
tmr_8253[chan].latch = dummy_ctr + (WORD)DOSVM_GetTimer(); tmr_8253[chan].latch = dummy_ctr + (WORD)Dosvm.GetTimer();
else else
{ {
/* FIXME: intelligent hardware timer emulation needed */ /* FIXME: intelligent hardware timer emulation needed */