#include #include #include "registers.h" #include "wine.h" #include "stddebug.h" /* #define DEBUG_INT */ /* #undef DEBUG_INT */ #include "debug.h" typedef struct { WORD accessed : 1; WORD read_write : 1; WORD conf_exp : 1; WORD code : 1; WORD xsystem : 1; WORD dpl : 2; WORD present : 1; WORD dummy : 8; } ACCESS; typedef ACCESS *LPACCESS; typedef struct { WORD Limit; WORD addr_lo; BYTE addr_hi; ACCESS access; WORD reserved; } DESCRIPTOR; typedef DESCRIPTOR *LPDESCRIPTOR; HANDLE DPMI_GetNewSelector(WORD selcount); BOOL DPMI_FreeSelector(HANDLE pmSel); BOOL DPMI_SetDescriptor(HANDLE pmSel, LPDESCRIPTOR lpDesc); /*************************************************************************/ int do_int31(struct sigcontext_struct *context) { LPDESCRIPTOR lpDesc; dprintf_int(stddeb,"do_int31 // context->sc_eax=%04X\n", context->sc_eax); switch(context->sc_eax) { case 0x0000: context->sc_eax = DPMI_GetNewSelector(context->sc_ecx); break; case 0x0001: context->sc_eax = DPMI_FreeSelector(context->sc_ebx); break; case 0x000C: lpDesc = MAKELONG(context->sc_edi, context->sc_es); context->sc_eax = DPMI_SetDescriptor(context->sc_ebx, lpDesc); break; default: IntBarf(0x31, context); }; return 1; } /*************************************************************************/ HANDLE DPMI_GetNewSelector(WORD selcount) { LPSTR ptr; HANDLE pmSel; dprintf_int(stddeb,"DPMI_GetNewSelector(%d); !\n", selcount); pmSel = GlobalAlloc(GMEM_FIXED, 4096); ptr = GlobalLock(pmSel); dprintf_int(stddeb,"DPMI_GetNewSelector() return %04X !\n", pmSel); return pmSel; } BOOL DPMI_FreeSelector(HANDLE pmSel) { dprintf_int(stddeb,"DPMI_FreeSelector(%04X); !\n", pmSel); GlobalFree(pmSel); return 0; } BOOL DPMI_SetDescriptor(HANDLE pmSel, LPDESCRIPTOR lpDesc) { dprintf_int(stdnimp,"DPMI_SetDescriptor(%04X, %08X); !\n", pmSel, lpDesc); dprintf_int(stdnimp,"DPMI lpDesc->Limit=%u \n", lpDesc->Limit); dprintf_int(stdnimp,"DPMI lpDesc->addr_lo=%04X \n", lpDesc->addr_lo); dprintf_int(stdnimp,"DPMI lpDesc->addr_hi=%02X \n", lpDesc->addr_hi); dprintf_int(stdnimp,"DPMI lpDesc->access.accessed=%u \n", lpDesc->access.accessed); dprintf_int(stdnimp,"DPMI lpDesc->access.read_write=%u \n", lpDesc->access.read_write); dprintf_int(stdnimp,"DPMI lpDesc->access.conf_exp=%u \n", lpDesc->access.conf_exp); dprintf_int(stdnimp,"DPMI lpDesc->access.code=%u \n", lpDesc->access.code); dprintf_int(stdnimp,"DPMI lpDesc->access.xsystem=%u \n", lpDesc->access.xsystem); dprintf_int(stdnimp,"DPMI lpDesc->access.dpl=%u \n", lpDesc->access.dpl); dprintf_int(stdnimp,"DPMI lpDesc->access.present=%u \n", lpDesc->access.present); dprintf_int(stdnimp,"DPMI lpDesc->reserved=%04X \n", lpDesc->reserved); return FALSE; }