// XMS specific variables\r
//boolean XMSPresent;\r
//word gvar->pm.xmm.XMSAvail,gvar->pm.xmm.XMSPagesAvail,gvar->pm.xmm.XMSHandle;\r
- dword XMSDriver;\r
+ dword XMSDriver; //hard to put in gvar\r
+ word XMSVer; //hard to put in gvar\r
/* int gvar->pm.xmm.XMSProtectPage = -1;\r
\r
// File specific variables\r
__asm {\r
mov dx,OFFSET emmname //fix by andrius4669\r
mov ax,0x3d00\r
- int EMS_INT // try to open EMMXXXX0 device\r
+ int EMM_INT // try to open EMMXXXX0 device\r
jc error1\r
\r
mov bx,ax\r
mov ax,0x4400\r
\r
- int EMS_INT // get device info\r
+ int EMM_INT // get device info\r
jc error1\r
\r
and dx,0x80\r
\r
mov ax,0x4407\r
\r
- int EMS_INT // get status\r
+ int EMM_INT // get status\r
jc error1\r
or al,al\r
jz error1\r
\r
mov ah,0x3e\r
- int EMS_INT // close handle\r
+ int EMM_INT // close handle\r
jc error1\r
\r
mov ah,EMS_STATUS\r
boolean\r
PML_StartupXMS(global_game_variables_t *gvar)\r
{\r
- boolean errorflag;\r
+//TODO: translate the _REG into working assembly\r
+//#define STARTUPXMSASM\r
byte err;\r
- word /*XMSAvail,*/ XMSHandle;\r
-\r
- word XMSAvail1, XMSAvail2, XMSAvail3, XMSAvail4;\r
-\r
+ word XMSAvail, XMSHandle;//, XMSVer;\r
+ boolean errorflag=false;\r
word e=0;\r
- errorflag=gvar->pm.xmm.XMSPresent = false; // Assume failure\r
- gvar->pm.xmm.XMSAvail = gvar->mmi.XMSmem = 0;\r
+ gvar->pm.xmm.XMSPresent = false; // Assume failure\r
+ XMSAvail = gvar->mmi.XMSmem = 0;\r
\r
__asm {\r
mov ax,0x4300\r
int XMS_INT // Get address of XMS driver\r
mov [WORD PTR XMSDriver],bx\r
mov [WORD PTR XMSDriver+2],es // function pointer to XMS driver\r
+\r
+ mov ah,XMS_VERSION\r
+ call [DWORD PTR XMSDriver] //; Get XMS Version Number\r
+ mov [XMSVer],ax\r
mov e,2\r
\r
- //XMS_CALL(XMS_QUERYFREE); // Find out how much XMS is available\r
+#ifdef STARTUPXMSASM\r
mov ah,XMS_QUERYFREE // Find out how much XMS is available\r
call [DWORD PTR XMSDriver]\r
- //mov [XMSAvail],ax\r
- //mov XMSAvail1,ax\r
- //mov ax,XMSAvail2\r
- //mov [XMSAvail3],ax\r
- mov ax,[XMSAvail4]\r
- mov err,bl\r
- cmp ax,0 // AJR: bugfix 10/8/92\r
- je error1\r
+ mov XMSAvail,ax\r
+ or ax,ax // AJR: bugfix 10/8/92\r
+ jz error1\r
mov e,3\r
+#endif\r
jmp End1\r
#ifdef __BORLANDC__\r
}\r
#ifdef __WATCOMC__\r
}\r
#endif\r
-\r
-// XMS_CALL(XMS_QUERYFREE); // Find out how much XMS is available\r
-// XMSAvail = _AX;\r
-// if (!_AX) // AJR: bugfix 10/8/92\r
-// goto error;\r
-\r
- printf(" XMSAvail=%u e=%u\n", XMSAvail4, e);\r
- //printf(" %u %u %u %u\n", XMSAvail1, XMSAvail2, XMSAvail3, XMSAvail4);\r
- XMSAvail4 &= ~(PMPageSizeKB - 1); // Round off to nearest page size\r
- if (XMSAvail4 < (PMPageSizeKB * 2)){ // Need at least 2 pages\r
- printf("PISS! %u\n", XMSAvail4);\r
+ if(errorflag==true) goto error;\r
+#ifndef STARTUPXMSASM\r
+ XMS_CALL(XMS_QUERYFREE); // Find out how much XMS is available\r
+ XMSAvail = _AX;\r
+ if (!_AX) // AJR: bugfix 10/8/92\r
+ {\r
+ errorflag = true;\r
+ err = _BL;\r
goto error;\r
}\r
+ e++;\r
+#endif\r
\r
+#ifdef __DEBUG_PM__\r
+ printf("XMSVer=%02X ", XMSVer);\r
+ printf("XMSAvail=%u\n", XMSAvail);\r
+ getch();\r
+#endif\r
+ XMSAvail &= ~(PMPageSizeKB - 1); // Round off to nearest page size\r
+ if (XMSAvail < (PMPageSizeKB * 2)) // Need at least 2 pages\r
+ {\r
+ errorflag=true;\r
+ goto error;\r
+ }\r
+#ifdef STARTUPXMSASM\r
__asm {\r
- mov dx,XMSAvail4\r
- //XMS_CALL(XMS_ALLOC); // And do the allocation\r
- mov ah,XMS_ALLOC\r
+ mov dx,XMSAvail\r
+ mov ah,XMS_ALLOC // And do the allocation\r
call [DWORD PTR XMSDriver]\r
mov XMSHandle,dx\r
or ax,ax // AJR: bugfix 10/8/92\r
#ifdef __WATCOMC__\r
}\r
#endif\r
-\r
- if(errorflag==false)\r
- {\r
- gvar->mmi.XMSmem = XMSAvail4 * (dword)1024;\r
- gvar->pm.xmm.XMSAvail = XMSAvail4;\r
- gvar->pm.xmm.XMSHandle = XMSHandle;\r
-\r
- gvar->pm.xmm.XMSPresent = true;\r
- printf(" %u %u %u\n", gvar->mmi.XMSmem, gvar->pm.xmm.XMSAvail, XMSAvail4);\r
- getch();\r
- }else printf(" %u errorflag=%02X\n", XMSAvail4, err);\r
-error:\r
- return(gvar->pm.xmm.XMSPresent);\r
-/*\r
- gvar->pm.xmm.XMSPresent = false; // Assume failure\r
- gvar->pm.xmm.XMSAvail = 0;\r
-\r
-__asm mov ax,0x4300\r
-__asm int XMS_INT // Check for presence of XMS driver\r
- if (_AL != 0x80)\r
- goto error;\r
-\r
-\r
-__asm mov ax,0x4310\r
-__asm int XMS_INT // Get address of XMS driver\r
-__asm mov [WORD PTR XMSDriver],bx\r
-__asm mov [WORD PTR XMSDriver+2],es // function pointer to XMS driver\r
-\r
- XMS_CALL(XMS_QUERYFREE); // Find out how much XMS is available\r
- gvar->pm.xmm.XMSAvail = _AX;\r
- if (!_AX) // AJR: bugfix 10/8/92\r
- goto error;\r
-\r
- gvar->pm.xmm.XMSAvail &= ~(PMPageSizeKB - 1); // Round off to nearest page size\r
- if (gvar->pm.xmm.XMSAvail < (PMPageSizeKB * 2)) // Need at least 2 pages\r
- goto error;\r
-\r
- _DX = gvar->pm.xmm.XMSAvail;\r
+#else\r
+ _DX = XMSAvail;\r
XMS_CALL(XMS_ALLOC); // And do the allocation\r
- gvar->pm.xmm.XMSHandle = _DX;\r
-\r
+ XMSHandle = _DX;\r
if (!_AX) // AJR: bugfix 10/8/92\r
{\r
- gvar->pm.xmm.XMSAvail = 0;\r
+ errorflag=true;\r
+ err = _BL;\r
goto error;\r
}\r
-\r
- gvar->mmi.XMSmem = gvar->pm.xmm.XMSAvail * 1024;\r
-\r
- gvar->pm.xmm.XMSPresent = true;\r
+ e++;\r
+#endif\r
error:\r
- printf("XMSstart %u %u\n", gvar->mmi.XMSmem, gvar->pm.xmm.XMSAvail);\r
- return(gvar->pm.xmm.XMSPresent);*/\r
+ if(errorflag==false)\r
+ {\r
+ gvar->mmi.XMSmem = (dword)(XMSAvail) * 1024;\r
+ gvar->pm.xmm.XMSAvail = XMSAvail;\r
+ gvar->pm.xmm.XMSHandle = XMSHandle;\r
+ //gvar->pm.xmm.XMSVer = XMSVer;\r
+ gvar->pm.xmm.XMSPresent = true;\r
+#ifdef __DEBUG_PM__\r
+ printf(" XMSmem=%lu XMSAvail=%u\n", gvar->mmi.XMSmem, XMSAvail);\r
+#endif\r
+ }\r
+ else\r
+ {\r
+#ifdef __DEBUG_PM__\r
+ //printf("XMSHandle\n");\r
+ //printf(" 1=%u 2=%u 3=%u 4=%u\n", XMSHandle1, XMSHandle2, XMSHandle3, XMSHandle4);\r
+ //printf(" 2=%u ", XMSHandle);\r
+ //printf(" %u", gvar->pm.xmm.XMSHandle);\r
+ printf(" err=%02X e=%u\n", err, e);\r
+#endif\r
+ }\r
+ return(gvar->pm.xmm.XMSPresent);\r
}\r
\r
//\r
PML_StartupEMS(gvar);\r
if (!noxms && MML_CheckForXMS())\r
PML_StartupXMS(gvar);\r
+ if(!nomain)\r
+ PML_StartupMainMem(gvar);\r
\r
- if (!nomain && !gvar->pm.emm.EMSPresent)\r
+ if (!gvar->pm.mm.MainPresent && !gvar->pm.emm.EMSPresent && !gvar->pm.xmm.XMSPresent)\r
{\r
- printf("PM_Startup: No main or EMS\n");\r
- exit(-5);\r
+ Quit("PM_Startup: No main or EMS\n");\r
//return;\r
}\r
- PML_StartupMainMem(gvar);\r
\r
PM_Reset(gvar);\r
\r
if (!gvar->pm.PMStarted)\r
return;\r
\r
- PML_ClosePageFile(gvar);\r
+ //PML_ClosePageFile(gvar);\r
\r
PML_ShutdownMainMem(gvar);\r
}\r