// If there's more than our minimum (2 pages) available, allocate it (up\r
// to the maximum we need)\r
//\r
+// Please call MML_CheckForEMS() before calling this function.\r
+// MML_CheckForEMS is not local despite the name wwww.\r
+//\r
\r
boolean\r
PML_StartupEMS(global_game_variables_t *gvar)\r
{\r
int i;\r
+#ifdef __PM__NOHOGEMS__\r
long size;\r
+#endif\r
byte err=0, str[64];\r
\r
boolean errorflag=false;\r
- static char emmname[] = "EMMXXXX0"; //fix by andrius4669\r
- unsigned int EMSVer = 0;\r
- unsigned totalEMSpages,freeEMSpages,EMSPageFrame,EMSHandle=0,EMSAvail=0;\r
- totalEMSpages = freeEMSpages = EMSPageFrame = 0;\r
+ unsigned EMSVer;\r
+ unsigned totalEMSpages,freeEMSpages,EMSPageFrame,EMSHandle,EMSAvail;\r
+ totalEMSpages = freeEMSpages = EMSPageFrame = EMSHandle = EMSAvail = EMSVer = 0; // set all to 0~\r
gvar->pm.emm.EMSPresent = false; // Assume that we'll fail\r
- gvar->pm.emm.EMSAvail = 0;\r
- gvar->mmi.EMSmem = 0;\r
+ gvar->pm.emm.EMSAvail = gvar->mmi.EMSmem = 0;\r
\r
__asm {\r
- mov dx,OFFSET emmname //fix by andrius4669\r
- mov ax,0x3d00\r
- int EMM_INT // try to open EMMXXXX0 device\r
- jc error1\r
-\r
- mov bx,ax\r
- mov ax,0x4400\r
-\r
- int EMM_INT // get device info\r
- jc error1\r
-\r
- and dx,0x80\r
- jz error1\r
-\r
- mov ax,0x4407\r
-\r
- int EMM_INT // get status\r
- jc error1\r
- or al,al\r
- jz error1\r
-\r
- mov ah,0x3e\r
- int EMM_INT // close handle\r
- jc error1\r
-\r
+ //MML_CheckForEMS() takes care of what the code did here\r
mov ah,EMS_STATUS\r
int EMS_INT\r
jc error1 // make sure EMS hardware is present\r
int EMS_INT // only work on EMS 3.2 or greater (silly, but...)\r
or ah,ah\r
jnz error1\r
- mov [EMSVer],ax // set EMSVer\r
+ mov [EMSVer],ax // set EMSVer\r
cmp al,0x32 // only work on ems 3.2 or greater\r
jb error1\r
\r
mov [totalEMSpages],dx\r
mov [freeEMSpages],bx\r
mov [EMSAvail],bx\r
- jmp End1\r
+ jmp End1\r
#ifdef __BORLANDC__\r
}\r
#endif\r
#endif\r
mov err,ah\r
mov errorflag,1\r
- jmp End1\r
+ jmp End1\r
#ifdef __BORLANDC__\r
}\r
#endif\r
#ifdef __WATCOMC__\r
}\r
#endif\r
-//*\r
+#ifdef __PM__NOHOGEMS__\r
if(errorflag==false)\r
{\r
// Don't hog all available EMS\r
gvar->pm.emm.EMSAvail = size / EMSPageSize;\r
}\r
}\r
-//*/\r
+#endif\r
__asm {\r
mov ah,EMS_ALLOCPAGES\r
mov bx,[EMSAvail];\r
#endif\r
mov err,ah\r
mov errorflag,1\r
- jmp End2\r
+ jmp End2\r
#ifdef __BORLANDC__\r
- }\r
+ }//end of assembly\r
#endif\r
End2:\r
#ifdef __WATCOMC__\r
- }\r
+ }//end of assembly\r
#endif\r
-\r
- if(errorflag==false)\r
- {\r
- gvar->mmi.EMSmem = EMSAvail * (dword)EMSPageSize;\r
-\r
- // Initialize EMS mapping cache\r
- for (i = 0;i < EMSFrameCount;i++)\r
- gvar->pm.emm.EMSList[i].baseEMSPage = -1;\r
-\r
- }\r
- else\r
+ if(errorflag==true)\r
{\r
strcpy(str,"PML_StartupEMS: EMS error ");\r
MM_EMSerr(str, err);\r
printf("%s\n",str);\r
return(gvar->pm.emm.EMSPresent);\r
}\r
+ gvar->mmi.EMSmem = EMSAvail * (dword)EMSPageSize;\r
+\r
+ // Initialize EMS mapping cache\r
+ for (i = 0;i < EMSFrameCount;i++)\r
+ gvar->pm.emm.EMSList[i].baseEMSPage = -1;\r
\r
gvar->pm.emm.EMSPresent = true; // We have EMS\r
gvar->pm.emm.EMSPageFrame = EMSPageFrame;\r
{\r
int i;\r
long size;\r
- //__SEGA buf;\r
- memptr buf;\r
+ void _seg *buf;\r
dword far *offsetptr;\r
word far *lengthptr;\r
PageListStruct far *page;\r
\r
// Allocate and clear the page list\r
gvar->pm.PMNumBlocks = gvar->pm.fi.ChunksInFile;\r
- MM_GetPtr((memptr *)gvar->pm.PMSegPages, sizeof(PageListStruct) * (gvar->pm.PMNumBlocks), gvar);\r
- MM_SetLock((memptr *)gvar->pm.PMSegPages,true, gvar);\r
+ MM_GetPtr((memptr *)&gvar->pm.PMSegPages, sizeof(PageListStruct) * (gvar->pm.PMNumBlocks), gvar);\r
+ MM_SetLock((memptr *)&gvar->pm.PMSegPages,true, gvar);\r
gvar->pm.PMPages = (PageListStruct far *)gvar->pm.PMSegPages;\r
_fmemset(gvar->pm.PMPages,0,sizeof(PageListStruct) * gvar->pm.PMNumBlocks);\r
\r
// Read in the chunk offsets\r
size = sizeof(dword) * gvar->pm.fi.ChunksInFile;\r
- MM_GetPtr(&buf, size, gvar);\r
+ MM_GetPtr((memptr *)&buf, size, gvar);\r
if (!CA_FarRead(gvar->pm.fi.PageFile,(byte far *)buf,size, gvar))\r
{\r
Quit (gvar, "PML_OpenPageFile: Offset read failed");\r
offsetptr = (dword far *)buf;\r
for (i = 0,page = gvar->pm.PMPages;i < gvar->pm.fi.ChunksInFile;i++,page++)\r
page->offset = *offsetptr++;\r
- MM_FreePtr(&buf, gvar);\r
+ MM_FreePtr((memptr *)&buf, gvar);\r
\r
// Read in the chunk lengths\r
size = sizeof(word) * gvar->pm.fi.ChunksInFile;\r
lengthptr = (word far *)buf;\r
for (i = 0,page = gvar->pm.PMPages;i < gvar->pm.fi.ChunksInFile;i++,page++)\r
page->length = *lengthptr++;\r
- MM_FreePtr(&buf, gvar);\r
+ MM_FreePtr((memptr *)&buf, gvar);\r
}\r
\r
//\r
close(gvar->pm.fi.PageFile);\r
if (gvar->pm.PMSegPages)\r
{\r
- MM_SetLock((memptr)gvar->pm.PMSegPages,false, gvar);\r
- MM_FreePtr((memptr)gvar->pm.PMSegPages, gvar);\r
+ MM_SetLock((memptr *)&gvar->pm.PMSegPages,false, gvar);\r
+ MM_FreePtr((void _seg *)&gvar->pm.PMSegPages, gvar);\r
}\r
}\r
\r
if (!gvar->pm.PMStarted)\r
return;\r
\r
- //PML_ClosePageFile(gvar);\r
+ //0000+=+=PML_ClosePageFile(gvar);\r
\r
PML_ShutdownMainMem(gvar);\r
}\r