Fixed DPMI_CallRMProc (I think).

This commit is contained in:
Ove Kaaven 1998-12-07 16:10:11 +00:00 committed by Alexandre Julliard
parent c0fbd7e2a7
commit 373bd357ae
2 changed files with 32 additions and 3 deletions

View File

@ -66,6 +66,33 @@ static void MZ_InitPSP( LPVOID lpPSP, LPCSTR cmdline, WORD env )
/* FIXME: integrate the PDB stuff from Wine (loader/task.c) */
}
static char int08[]={
0xCD,0x1C, /* int $0x1c */
0x50, /* pushw %ax */
0x1E, /* pushw %ds */
0xB8,0x40,0x00, /* movw $0x40,%ax */
0x8E,0xD8, /* movw %ax,%ds */
#if 0
0x83,0x06,0x6C,0x00,0x01, /* addw $1,(0x6c) */
0x83,0x16,0x6E,0x00,0x00, /* adcw $0,(0x6e) */
#else
0x66,0xFF,0x06,0x6C,0x00, /* incl (0x6c) */
#endif
0xB0,0x20, /* movb $0x20,%al */
0xE6,0x20, /* outb %al,$0x20 */
0x1F, /* popw %ax */
0x58, /* popw %ax */
0xCF /* iret */
};
static void MZ_InitHandlers( LPDOSTASK lpDosTask )
{
WORD seg;
LPBYTE start=DOSMEM_GetBlock(lpDosTask->hModule,sizeof(int08),&seg);
memcpy(start,int08,sizeof(int08));
((SEGPTR*)(lpDosTask->img))[0x08]=PTR_SEG_OFF_TO_SEGPTR(seg,0);
}
static char enter_xms[]={
/* XMS hookable entry point */
0xEB,0x03, /* jmp entry */
@ -121,6 +148,7 @@ static void MZ_InitDPMI( LPDOSTASK lpDosTask )
lpDosTask->call_ofs = size-1;
memcpy(start,enter_pm,sizeof(enter_pm));
memcpy(start+sizeof(enter_pm),wrap_rm,sizeof(wrap_rm));
}
static WORD MZ_InitEnvironment( LPDOSTASK lpDosTask, LPCSTR env, LPCSTR name )

View File

@ -205,7 +205,7 @@ int DPMI_CallRMProc( CONTEXT *context, LPWORD stack, int args, int iret )
CS_reg(context), IP_reg(context), args );
#ifdef MZ_SUPPORTED
FIXME(int31,"DPMI real-mode call using DOS VM task system, untested!\n");
FIXME(int31,"DPMI real-mode call using DOS VM task system, not fully tested\n");
if (!pModule->lpDosTask) {
TRACE(int31,"creating VM86 task\n");
if (MZ_InitTask( MZ_AllocDPMITask( pModule->self ) ) < 32) {
@ -217,7 +217,8 @@ int DPMI_CallRMProc( CONTEXT *context, LPWORD stack, int args, int iret )
alloc = 1; /* allocate default stack */
stack16 = addr = DOSMEM_GetBlock( pModule->self, 64, &(SS_reg(context)) );
SP_reg(context) = 64-2;
if (!stack16) {
stack16 += 32-1;
if (!addr) {
ERR(int31,"could not allocate default stack\n");
return 1;
}
@ -225,7 +226,7 @@ int DPMI_CallRMProc( CONTEXT *context, LPWORD stack, int args, int iret )
stack16 = CTX_SEG_OFF_TO_LIN(context, SS_reg(context), ESP_reg(context));
addr = NULL; /* avoid gcc warning */
}
SP_reg(context) -= args*sizeof(WORD) + (iret?1:0);
SP_reg(context) -= (args + (iret?1:0)) * sizeof(WORD);
#else
stack16 = THREAD_STACK16(thdb);
#endif