X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_pm.c;h=848af9c824b4276790bf01d9e9ced475351ca4fa;hb=fb309399331ebb5cf52a892b37d847d60985a7e7;hp=9e4d608afd777e52f12bef049104d87a31020145;hpb=8ebac0453b3e0ed95f301a8b06985aa2e7448e8f;p=16.git diff --git a/src/lib/16_pm.c b/src/lib/16_pm.c index 9e4d608a..848af9c8 100755 --- a/src/lib/16_pm.c +++ b/src/lib/16_pm.c @@ -29,22 +29,25 @@ #include "src/lib/16_pm.h" #pragma hdrstop -/* +#ifdef __DEBUG__ +boolean debugpm=0; +#endif + // Main Mem specific variables - boolean MainPresent; - memptr MainMemPages[PMMaxMainMem]; + //boolean MainPresent; +/* memptr MainMemPages[PMMaxMainMem]; PMBlockAttr gvar->pm.mm.MainMemUsed[PMMaxMainMem]; - int gvar->pm.mm.MainPagesAvail; + int gvar->pm.mm.MainPagesAvail;*/ // EMS specific variables - boolean gvar->pm.emm.EMSPresent; - word gvar->pm.emm.EMSAvail,gvar->pm.emm.EMSPagesAvail,gvar->pm.emm.EMSHandle, + //boolean EMSPresent; +/* word gvar->pm.emm.EMSAvail,gvar->pm.emm.EMSPagesAvail,gvar->pm.emm.EMSHandle, gvar->pm.emm.EMSPageFrame,gvar->pm.emm.EMSPhysicalPage; - gvar->pm.emm.EMSListStruct gvar->pm.emm.EMSList[EMSFrameCount]; + gvar->pm.emm.EMSListStruct gvar->pm.emm.EMSList[EMSFrameCount];*/ // XMS specific variables - boolean gvar->pm.xmm.XMSPresent; - word gvar->pm.xmm.XMSAvail,gvar->pm.xmm.XMSPagesAvail,gvar->pm.xmm.XMSHandle;*/ + //boolean XMSPresent; + //word gvar->pm.xmm.XMSAvail,gvar->pm.xmm.XMSPagesAvail,gvar->pm.xmm.XMSHandle; word XMSDriver; /* int gvar->pm.xmm.XMSProtectPage = -1; @@ -52,10 +55,10 @@ char gvar->pm.fi.PageFileName[13] = {"VSWAP."}; int PageFile = -1; word gvar->pm.fi.ChunksInFile; - word PMSpriteStart,PMSoundStart; + word PMSpriteStart,PMSoundStart;*/ // General usage variables - boolean PMStarted, +/* boolean PMStarted, gvar->pm.PMPanicMode, gvar->pm.PMThrashing; word gvar->pm.XMSPagesUsed, @@ -64,8 +67,8 @@ gvar->pm.PMNumBlocks; long PMFrameCount; PageListStruct far *gvar->pm.PMPages, - _seg *gvar->pm.PMSegPages; -*/ + _seg *gvar->pm.PMSegPages;*/ + static char *ParmStrings[] = {"nomain","noems","noxms",nil}; ///////////////////////////////////////////////////////////////////////////// @@ -132,125 +135,159 @@ PML_MapEMS(word logical, byte physical, global_game_variables_t *gvar) // to the maximum we need) // - char EMMDriverName[9] = "EMMXXXX0"; - boolean PML_StartupEMS(global_game_variables_t *gvar) { int i; long size; - boolean errorflag; + byte str[64]; + byte err; + boolean errorflag=0; + static char emmname[] = "EMMXXXX0"; //fix by andrius4669 + unsigned int EMSVer = 0; + unsigned totalEMSpages,freeEMSpages,EMSPageFrame,EMSHandle,EMSAvail; + totalEMSpages = freeEMSpages = EMSPageFrame = 0; gvar->pm.emm.EMSPresent = false; // Assume that we'll fail gvar->pm.emm.EMSAvail = 0; - errorflag=0; - _DX = (word)EMMDriverName; - _AX = 0x3d00; - geninterrupt(0x21); // try to open EMMXXXX0 device __asm { - jnc gothandle - mov errorflag,1 + mov dx,OFFSET emmname //fix by andrius4669 + mov ax,0x3d00 + int EMS_INT // try to open EMMXXXX0 device + jc error1 + + mov bx,ax + mov ax,0x4400 + + int EMS_INT // get device info + jc error1 + + and dx,0x80 + jz error1 + + mov ax,0x4407 + + int EMS_INT // get status + jc error1 + or al,al + jz error1 + + mov ah,0x3e + int EMS_INT // close handle + jc error1 + + mov ah,EMS_STATUS + int EMS_INT + jc error1 // make sure EMS hardware is present + + mov ah,EMS_VERSION + int EMS_INT // only work on EMS 3.2 or greater (silly, but...) + or ah,ah + jnz error1 + mov [EMSVer],ax // set EMSVer + cmp al,0x32 // only work on ems 3.2 or greater + jb error1 + + mov ah,EMS_GETFRAME + int EMS_INT // find the page frame address + or ah,ah + jnz error1 + mov [EMSPageFrame],bx + + mov ah,EMS_GETPAGES + int EMS_INT // find out how much EMS is there + or ah,ah + jnz error1 + or bx,bx + jz noEMS // no EMS at all to allocate + cmp bx,2 + jl noEMS // Require at least 2 pages (32k) + mov [totalEMSpages],dx + mov [freeEMSpages],bx + mov [EMSAvail],bx + jmp End1 #ifdef __BORLANDC__ } #endif - gothandle: -#ifdef __WATCOMC__ - } -#endif - if(errorflag) - goto error; - -//gothandle: - _BX = _AX; - _AX = 0x4400; - geninterrupt(0x21); // get device info + error1: +#ifdef __BORLANDC__ __asm { - jnc gotinfo +#endif + mov err,ah mov errorflag,1 + jmp End1 #ifdef __BORLANDC__ } #endif - gotinfo: +noEMS: +End1: #ifdef __WATCOMC__ } #endif - if(errorflag) - goto error; - -//gotinfo: -__asm and dx,0x80 - if (!_DX) - goto error; - - _AX = 0x4407; - geninterrupt(0x21); // get status +/* + if(errorflag==false) + { + // Don't hog all available EMS + size = gvar->pm.emm.EMSAvail * (long)EMSPageSize; + if (size - (EMSPageSize * 2) > (gvar->pm.fi.ChunksInFile * (long)PMPageSize)) + { + size = (gvar->pm.fi.ChunksInFile * (long)PMPageSize) + EMSPageSize; + gvar->pm.emm.EMSAvail = size / EMSPageSize; + } + } +*/ __asm { - jc error - jmp end - error: + mov ah,EMS_ALLOCPAGES + mov bx,[EMSAvail]; + int EMS_INT + or ah,ah + jnz error2 + mov [EMSHandle],dx + jmp End2 +#ifdef __BORLANDC__ + } +#endif + error2: +#ifdef __BORLANDC__ + __asm { +#endif + mov err,ah mov errorflag,1 + jmp End2 #ifdef __BORLANDC__ } #endif - end: +End2: #ifdef __WATCOMC__ } #endif - if (!_AL) - goto error; - - _AH = 0x3e; - geninterrupt(0x21); // close handle - - _AH = EMS_STATUS; - geninterrupt(EMS_INT); - if (_AH) - goto error; // make sure EMS hardware is present - - _AH = EMS_VERSION; - geninterrupt(EMS_INT); - if (_AH || (_AL < 0x32)) // only work on EMS 3.2 or greater (silly, but...) - goto error; - _AH = EMS_GETFRAME; - geninterrupt(EMS_INT); - if (_AH) - goto error; // find the page frame address - gvar->pm.emm.EMSPageFrame = _BX; - - _AH = EMS_GETPAGES; - geninterrupt(EMS_INT); - if (_AH) - goto error; - if (_BX < 2) - goto error; // Require at least 2 pages (32k) - gvar->pm.emm.EMSAvail = _BX; - - // Don't hog all available EMS - size = gvar->pm.emm.EMSAvail * (long)EMSPageSize; - if (size - (EMSPageSize * 2) > (gvar->pm.fi.ChunksInFile * (long)PMPageSize)) + if(errorflag==false) { - size = (gvar->pm.fi.ChunksInFile * (long)PMPageSize) + EMSPageSize; - gvar->pm.emm.EMSAvail = size / EMSPageSize; - } - - _AH = EMS_ALLOCPAGES; - _BX = gvar->pm.emm.EMSAvail; - geninterrupt(EMS_INT); - if (_AH) - goto error; - gvar->pm.emm.EMSHandle = _DX; - gvar->mmi.EMSmem += gvar->pm.emm.EMSAvail * (long)EMSPageSize; // Initialize EMS mapping cache for (i = 0;i < EMSFrameCount;i++) gvar->pm.emm.EMSList[i].baseEMSPage = -1; + } + else + { + strcpy(str,"PML_StartupEMS: EMS error "); + MM_EMSerr(str, err); + printf("%s\n",str); + return(gvar->pm.emm.EMSPresent); + } + gvar->pm.emm.EMSPresent = true; // We have EMS + gvar->pm.emm.EMSPageFrame = EMSPageFrame; + gvar->pm.emm.EMSAvail = EMSAvail; + gvar->pm.emm.EMSVer = EMSVer; + gvar->pm.emm.EMSHandle = EMSHandle; + gvar->pm.emm.freeEMSpages = freeEMSpages; + gvar->pm.emm.totalEMSpages = totalEMSpages; -error: return(gvar->pm.emm.EMSPresent); } @@ -261,6 +298,10 @@ void PML_ShutdownEMS(global_game_variables_t *gvar) { word EMSHandle; + byte err; + byte str[64]; + boolean errorflag=false; + EMSHandle=gvar->pm.emm.EMSHandle; if (gvar->pm.emm.EMSPresent) @@ -269,9 +310,30 @@ PML_ShutdownEMS(global_game_variables_t *gvar) mov ah,EMS_FREEPAGES mov dx,[EMSHandle] int EMS_INT + jc errors + jmp Ends +#ifdef __BORLANDC__ + } +#endif + errors: +#ifdef __BORLANDC__ + __asm { +#endif + mov err,ah + mov errorflag,1 + jmp Ends +#ifdef __BORLANDC__ + } +#endif + Ends: +#ifdef __WATCOMC__ } - if (_AH) +#endif + if(errorflag==true) { + strcpy(str,"PML_ShutdownEMS: Error freeing EMS "); + MM_EMSerr(str, err); + printf("%s\n",str); Quit("PML_ShutdownEMS: Error freeing EMS\n"); //return; } @@ -440,15 +502,20 @@ PM_SetMainMemPurge(int level, global_game_variables_t *gvar) { int i; + if(gvar->pm.mm.MainPresent) for (i = 0;i < PMMaxMainMem;i++) { #ifdef __DEBUG_PM__ printf("PM_SetMainMemPurge() info of gvar->pm.mm.MainMemPages[i]\n"); - printf(" %Fp, %Fp\n", gvar->pm.mm.MainMemPages[i], (gvar->pm.mm.MainMemPages[i])); printf("& %Fp, %Fp\n", &gvar->pm.mm.MainMemPages[i], &(gvar->pm.mm.MainMemPages[i])); #endif if (gvar->pm.mm.MainMemPages[i]) - MM_SetPurge((gvar->pm.mm.MainMemPages[i]),level, gvar); + MM_SetPurge(&(gvar->pm.mm.MainMemPages[i]),level, gvar); + } + + else + { + Quit("MainPresent IS NULL\n"); } } @@ -541,7 +608,11 @@ PML_StartupMainMem(global_game_variables_t *gvar) memptr *p; gvar->pm.mm.MainPagesAvail = 0; + gvar->pm.mm.MainPresent = false; MM_BombOnError(false, gvar); + printf("PML_StartupMainMem()\n"); + printf(" p=%04x MainMemPages=%04x\n", p, gvar->pm.mm.MainMemPages); + printf(" p=%Fp MainMemPages=%Fp\n", p, gvar->pm.mm.MainMemPages); for (i = 0,p = gvar->pm.mm.MainMemPages;i < PMMaxMainMem;i++,p++) { MM_GetPtr(p,PMPageSize, gvar); @@ -1297,7 +1368,7 @@ PM_Startup(global_game_variables_t *gvar) if (gvar->pm.PMStarted) return; - strcat(&(gvar->pm.fi.PageFileName), "VSWAP."); + //strcpy(&(gvar->pm.fi.PageFileName), "VSWAP."); nomain = noems = noxms = false; for (i = 1;i < @@ -1330,20 +1401,19 @@ PM_Startup(global_game_variables_t *gvar) } } - PML_OpenPageFile(gvar); + //0000++++PML_OpenPageFile(gvar); if (!noems) PML_StartupEMS(gvar); if (!noxms) - PML_StartupXMS(gvar); + //++++PML_StartupXMS(gvar); //TODO: convert - if (nomain && !gvar->pm.emm.EMSPresent) + if (!nomain && !gvar->pm.emm.EMSPresent) { Quit("PM_Startup: No main or EMS\n"); //return; } - else - PML_StartupMainMem(gvar); + PML_StartupMainMem(gvar); PM_Reset(gvar);