X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2F16_pm.c;h=10ee7b6ddee6969f88ae45e9cf92790ecaf8325e;hb=5965823c934f177a5ef1cd30ae9ee5dda2a95154;hp=ea11ac488cca2b2dbc659ed4470f883268dd0763;hpb=4423bda56aab2192f037bec035a3412153b2b3a7;p=16.git diff --git a/src/lib/16_pm.c b/src/lib/16_pm.c index ea11ac48..10ee7b6d 100755 --- a/src/lib/16_pm.c +++ b/src/lib/16_pm.c @@ -29,33 +29,36 @@ #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; - dword XMSDriver; - int gvar->pm.xmm.XMSProtectPage = -1; + //boolean XMSPresent; + //word gvar->pm.xmm.XMSAvail,gvar->pm.xmm.XMSPagesAvail,gvar->pm.xmm.XMSHandle; + word XMSDriver; +/* int gvar->pm.xmm.XMSProtectPage = -1; // File specific variables 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}; ///////////////////////////////////////////////////////////////////////////// @@ -95,7 +98,7 @@ PML_MapEMS(word logical, byte physical, global_game_variables_t *gvar) int EMS_INT or ah,ah jnz error - jmp End + jmp End #ifdef __BORLANDC__ } #endif @@ -132,110 +135,160 @@ 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; + gvar->mmi.EMSmem = 0; - _DX = (word)EMMDriverName; - _AX = 0x3d00; - geninterrupt(0x21); // try to open EMMXXXX0 device __asm { - jnc gothandle - mov errorflag,1 - gothandle: - } - if(errorflag) - goto error; + mov dx,OFFSET emmname //fix by andrius4669 + mov ax,0x3d00 + int EMS_INT // try to open EMMXXXX0 device + jc erroreu -//gothandle: - _BX = _AX; - _AX = 0x4400; - geninterrupt(0x21); // get device info - __asm { - jnc gotinfo - mov errorflag,1 - gotinfo: - } - if(errorflag) - goto error; + mov bx,ax + mov ax,0x4400 -//gotinfo: -__asm and dx,0x80 - if (!_DX) - goto error; + int EMS_INT // get device info + jc erroreu - _AX = 0x4407; - geninterrupt(0x21); // get status - __asm { - jc error - jmp end - error: - mov errorflag,1 - end: - } - if (!_AL) - goto error; + and dx,0x80 + jz erroreu - _AH = 0x3e; - geninterrupt(0x21); // close handle + mov ax,0x4407 - _AH = EMS_STATUS; - geninterrupt(EMS_INT); - if (_AH) - goto error; // make sure EMS hardware is present + int EMS_INT // get status + jc erroreu + or al,al + jz erroreu - _AH = EMS_VERSION; - geninterrupt(EMS_INT); - if (_AH || (_AL < 0x32)) // only work on EMS 3.2 or greater (silly, but...) - goto error; + mov ah,0x3e + int EMS_INT // close handle + jc erroreu - _AH = EMS_GETFRAME; - geninterrupt(EMS_INT); - if (_AH) - goto error; // find the page frame address - gvar->pm.emm.EMSPageFrame = _BX; + mov ah,EMS_STATUS + int EMS_INT + jc erroreu // make sure EMS hardware is present - _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; + mov ah,EMS_VERSION + int EMS_INT // only work on EMS 3.2 or greater (silly, but...) + or ah,ah + jnz erroreu + mov [EMSVer],ax // set EMSVer + cmp al,0x32 // only work on ems 3.2 or greater + jb erroreu - // Don't hog all available EMS - size = gvar->pm.emm.EMSAvail * (long)EMSPageSize; - if (size - (EMSPageSize * 2) > (gvar->pm.fi.ChunksInFile * (long)PMPageSize)) + mov ah,EMS_GETFRAME + int EMS_INT // find the page frame address + or ah,ah + jnz erroreu + mov [EMSPageFrame],bx + + mov ah,EMS_GETPAGES + int EMS_INT // find out how much EMS is there + or ah,ah + jnz erroreu + 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 Endeu +#ifdef __BORLANDC__ + } +#endif + erroreu: +#ifdef __BORLANDC__ + __asm { +#endif + mov err,ah + mov errorflag,1 + jmp Endeu +#ifdef __BORLANDC__ + } +#endif + noEMS: + Endeu: +#ifdef __WATCOMC__ + } +#endif +/* + if(errorflag==false) { - size = (gvar->pm.fi.ChunksInFile * (long)PMPageSize) + EMSPageSize; - gvar->pm.emm.EMSAvail = size / EMSPageSize; + // 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 { + mov ah,EMS_ALLOCPAGES + mov bx,[EMSAvail]; + int EMS_INT + or ah,ah + jnz erroreuu + mov [EMSHandle],dx + jmp Endeuu +#ifdef __BORLANDC__ + } +#endif + erroreuu: +#ifdef __BORLANDC__ + __asm { +#endif + mov err,ah + mov errorflag,1 + jmp Endeuu +#ifdef __BORLANDC__ + } +#endif + Endeuu: +#ifdef __WATCOMC__ + } +#endif - _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; + if(errorflag==false) + { + gvar->pm.emm.EMSAvail = EMSAvail; + gvar->mmi.EMSmem = gvar->pm.emm.EMSAvail * (dword)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.EMSVer = EMSVer; + gvar->pm.emm.EMSHandle = EMSHandle; + gvar->pm.emm.freeEMSpages = freeEMSpages; + gvar->pm.emm.totalEMSpages = totalEMSpages; -error: return(gvar->pm.emm.EMSPresent); } @@ -246,6 +299,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) @@ -254,9 +311,30 @@ PML_ShutdownEMS(global_game_variables_t *gvar) mov ah,EMS_FREEPAGES mov dx,[EMSHandle] int EMS_INT + jc errores + jmp Endes +#ifdef __BORLANDC__ + } +#endif + errores: +#ifdef __BORLANDC__ + __asm { +#endif + mov err,ah + mov errorflag,1 + jmp Endes +#ifdef __BORLANDC__ } - if (_AH) +#endif + Endes: +#ifdef __WATCOMC__ + } +#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; } @@ -278,45 +356,86 @@ PML_ShutdownEMS(global_game_variables_t *gvar) boolean PML_StartupXMS(global_game_variables_t *gvar) { - XMSD; - gvar->pm.xmm.XMSPresent = false; // Assume failure - gvar->pm.xmm.XMSAvail = 0; - - _AX=0x4300; - geninterrupt(XMS_INT); // Check for presence of XMS driver - if (_AL != 0x80) - goto error; - + boolean errorflag; + word XMSAvail, XMSHandle; + errorflag=gvar->pm.xmm.XMSPresent = false; // Assume failure + XMSAvail = gvar->pm.xmm.XMSAvail = 0; __asm { + mov ax,0x4300 + int XMS_INT // Check for presence of XMS driver + cmp al,0x80 + jne errorxu + mov ax,0x4310 int XMS_INT // Get address of XMS driver mov [WORD PTR XMSDriver],bx mov [WORD PTR XMSDriver+2],es // function pointer to XMS driver - } - - XMS_CALL(XMS_QUERYFREE, gvar); // Find out how much XMS is available - gvar->pm.xmm.XMSAvail = _AX; - if (!_AX) // AJR: bugfix 10/8/92 - goto error; + //XMS_CALL(XMS_QUERYFREE); // Find out how much XMS is available + mov ah,XMS_QUERYFREE + call [WORD PTR XMSDriver] + mov [XMSAvail],ax + or ax,ax // AJR: bugfix 10/8/92 + jz errorxu + jmp Endxu +#ifdef __BORLANDC__ + } +#endif + errorxu: +#ifdef __BORLANDC__ + __asm { +#endif + //mov err,ah + mov errorflag,1 + jmp Endxu +#ifdef __BORLANDC__ + } +#endif + Endxu: +#ifdef __WATCOMC__ + } +#endif gvar->pm.xmm.XMSAvail &= ~(PMPageSizeKB - 1); // Round off to nearest page size if (gvar->pm.xmm.XMSAvail < (PMPageSizeKB * 2)) // Need at least 2 pages goto error; - _DX = gvar->pm.xmm.XMSAvail; - XMS_CALL(XMS_ALLOC, gvar); // And do the allocation - gvar->pm.xmm.XMSHandle = _DX; - - if (!_AX) // AJR: bugfix 10/8/92 - { - gvar->pm.xmm.XMSAvail = 0; - goto error; + __asm { + mov dx,[XMSAvail] + //XMS_CALL(XMS_ALLOC); // And do the allocation + mov ah,XMS_ALLOC + call [WORD PTR XMSDriver] + mov [XMSHandle],dx + or ax,ax // AJR: bugfix 10/8/92 + jz errorxuu + jmp Endxuu +#ifdef __BORLANDC__ + } +#endif + errorxuu: +#ifdef __BORLANDC__ + __asm { +#endif + //mov err,ah + mov [XMSAvail],0 + mov errorflag,1 + jmp Endxuu +#ifdef __BORLANDC__ + } +#endif + Endxuu: +#ifdef __WATCOMC__ } +#endif - gvar->mmi.XMSmem += gvar->pm.xmm.XMSAvail * 1024; + if(errorflag==false) + { + gvar->pm.xmm.XMSAvail = XMSAvail; + gvar->mmi.XMSmem += gvar->pm.xmm.XMSAvail * 1024; + gvar->pm.xmm.XMSHandle = XMSHandle; - gvar->pm.xmm.XMSPresent = true; + gvar->pm.xmm.XMSPresent = true; + } error: return(gvar->pm.xmm.XMSPresent); } @@ -328,7 +447,6 @@ error: void PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length, global_game_variables_t *gvar) { - XMSD; dword xoffset; struct { @@ -357,7 +475,7 @@ PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length, global_game_v push si } _SI = (word)© - XMS_CALL(XMS_MOVE, gvar); + XMS_CALL(XMS_MOVE); __asm { pop si } @@ -399,12 +517,36 @@ PML_CopyFromXMS(byte far *target,int sourcepage,word length, global_game_variabl void PML_ShutdownXMS(global_game_variables_t *gvar) { - XMSD; + boolean errorflag=false; + word XMSHandle = gvar->pm.xmm.XMSHandle; if (gvar->pm.xmm.XMSPresent) { - _DX = gvar->pm.xmm.XMSHandle; - XMS_CALL(XMS_FREE, gvar); - if (_BL) + __asm { + mov dx,[XMSHandle] + //XMS_CALL(XMS_FREE); + mov ah,XMS_FREE + call [WORD PTR XMSDriver] + or bl,bl + jz errorxs + jmp Endxs +#ifdef __BORLANDC__ + } +#endif + errorxs: +#ifdef __BORLANDC__ + __asm { +#endif + //mov err,ah + mov errorflag,1 + jmp Endxs +#ifdef __BORLANDC__ + } +#endif + Endxs: +#ifdef __WATCOMC__ + } +#endif + if(errorflag==true) { Quit("PML_ShutdownXMS: Error freeing XMS"); //return; @@ -428,15 +570,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"); } } @@ -529,6 +676,7 @@ PML_StartupMainMem(global_game_variables_t *gvar) memptr *p; gvar->pm.mm.MainPagesAvail = 0; + gvar->pm.mm.MainPresent = false; MM_BombOnError(false, gvar); for (i = 0,p = gvar->pm.mm.MainMemPages;i < PMMaxMainMem;i++,p++) { @@ -804,7 +952,7 @@ PML_GiveLRUPage(boolean mainonly, global_game_variables_t *gvar) // // PML_GiveLRUXMSPage() - Returns the page # of the least recently used // (and present) XMS page. -// This routine won't return the XMS page protected (by gvar->pm.xmm.XMSProtectPage) +// This routine won't return the XMS page protected (by XMSProtectPage) // int PML_GiveLRUXMSPage(global_game_variables_t *gvar) @@ -1260,6 +1408,9 @@ PM_Reset(global_game_variables_t *gvar) gvar->pm.PMPanicMode = false; + gvar->pm.fi.PageFile = -1; + gvar->pm.xmm.XMSProtectPage = -1; + // Initialize page list for (i = 0,page = gvar->pm.PMPages;i < gvar->pm.PMNumBlocks;i++,page++) { @@ -1282,9 +1433,7 @@ PM_Startup(global_game_variables_t *gvar) if (gvar->pm.PMStarted) return; - strcat(&(gvar->pm.fi.PageFileName), "VSWAP."); - gvar->pm.fi.PageFile = -1; - gvar->pm.xmm.XMSProtectPage = -1; + //strcpy(&(gvar->pm.fi.PageFileName), "VSWAP."); nomain = noems = noxms = false; for (i = 1;i < @@ -1317,20 +1466,24 @@ PM_Startup(global_game_variables_t *gvar) } } - PML_OpenPageFile(gvar); + //0000+=+=PML_OpenPageFile(gvar); if (!noems) PML_StartupEMS(gvar); - if (!noxms) - PML_StartupXMS(gvar); + /*if (!noxms) + { + //++++ + printf("PML_StartupXMS "); + PML_StartupXMS(gvar); //TODO: convert + printf("ok!\n"); + }*/ - 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);