From e271343a59cfb8fd3afd1f011a3f9ff860057aba Mon Sep 17 00:00:00 2001 From: sparky4 Date: Mon, 26 Sep 2016 13:04:11 -0500 Subject: [PATCH] wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww massive work there is issue with structure --- DEBUG.16B | 8 +- DEBUG.16W | 16 +-- HEAP.16W | 52 ++++----- MMDUMP.16B | Bin 75 -> 50 bytes MMDUMP.16W | Bin 44 -> 66 bytes bcexmm.exe | Bin 83128 -> 84156 bytes bcexmm.prj | Bin 6566 -> 6810 bytes src/exmmtest.c | 8 +- src/lib/16_head.h | 3 +- src/lib/16_mm.c | 57 ++++++---- src/lib/16_mm.h | 5 +- src/lib/16_pm.c | 259 +++++++++++++++++++++++++++------------------ src/lib/16_pm.h | 5 +- src/lib/typdefst.h | 14 +-- 14 files changed, 246 insertions(+), 181 deletions(-) diff --git a/DEBUG.16B b/DEBUG.16B index f5605e85..d6ad70e7 100755 --- a/DEBUG.16B +++ b/DEBUG.16B @@ -1,9 +1,7 @@ -Seg:0 Size:3547 Owner:0x696c +Seg:0 Size:3552 Owner:0x6974 +++++++++++++++++++++++++++++++++++++++++++++0 -Seg:ddb Size:256 Owner:0xcf85 -++++ -Seg:edb Size:273 Owner:0xfde -++++0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Seg:de0 Size:256 Owner:0xcf79 +++++0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Seg:9fde Size:28706 Owner:0x0  Seg:9ffe Size:24577 Owner:0x0 diff --git a/DEBUG.16W b/DEBUG.16W index d8f8cf89..b3ed514b 100755 --- a/DEBUG.16W +++ b/DEBUG.16W @@ -1,12 +1,12 @@ -Seg:0 Size:8575 Owner:0x0 -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 -Seg:217f Size:256 Owner:0x5438 +Seg:0 Size:8558 Owner:0x1 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 +Seg:216e Size:256 Owner:0x5448 ++++++ +Seg:226e Size:273 Owner:0x94a0 ++++ -Seg:227f Size:273 Owner:0x9490 -++++ -Seg:27f2 Size:44 Owner:0x0 +Seg:27e0 Size:44 Owner:0x0 ++0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Seg:b81e Size:10210 Owner:0x0 -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Seg:b80c Size:10228 Owner:0x0 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Seg:e000 Size:8191 Owner:0x0 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \ No newline at end of file diff --git a/HEAP.16W b/HEAP.16W index ac2b7f9d..2b94206e 100755 --- a/HEAP.16W +++ b/HEAP.16W @@ -1,47 +1,47 @@ == default == - USED block at 28140016 of size 66 - USED block at 28140058 of size 66 - FREE block at 2814009a of size 18 - USED block at 281400ac of size 136 - USED block at 28140134 of size 20 - FREE block at 28140148 of size 7860 + USED block at 28020016 of size 66 + USED block at 28020058 of size 66 + FREE block at 2802009a of size 18 + USED block at 280200ac of size 136 + USED block at 28020134 of size 20 + FREE block at 28020148 of size 7860 OK - end of heap == near == - USED block at 181394c6 of size 12 - USED block at 181394d2 of size 332 - USED block at 1813961e of size 52 - USED block at 18139652 of size 20 - USED block at 18139666 of size 20 - USED block at 1813967a of size 20 - USED block at 1813968e of size 20 - USED block at 181396a2 of size 20 - USED block at 181396b6 of size 26950 + USED block at 180194d6 of size 12 + USED block at 180194e2 of size 332 + USED block at 1801962e of size 52 + USED block at 18019662 of size 20 + USED block at 18019676 of size 20 + USED block at 1801968a of size 20 + USED block at 1801969e of size 20 + USED block at 180196b2 of size 20 + USED block at 180196c6 of size 26934 OK - end of heap == far == - USED block at 28140016 of size 66 - USED block at 28140058 of size 66 - USED block at 2814009a of size 18 - USED block at 281400ac of size 136 - USED block at 28140134 of size 20 - USED block at 28140148 of size 7860 + USED block at 28020016 of size 66 + USED block at 28020058 of size 66 + USED block at 2802009a of size 18 + USED block at 280200ac of size 136 + USED block at 28020134 of size 20 + USED block at 28020148 of size 7860 OK - end of heap Memory Type Total Used Free ---------------- -------- -------- -------- Default 8166 288 7878 -Near 27446 496 26950 +Near 27430 496 26934 Far 8166 288 7878 ---------------- -------- -------- -------- -coreleft = 26948 -farcoreleft = 51056 +coreleft = 26932 +farcoreleft = 51040 GetFreeSize = 24128 -GetNearFreeSize = 26950 +GetNearFreeSize = 26934 GetFarFreeSize = 24128 -memavl = 26948 +memavl = 26932 stackavail = 11268 diff --git a/MMDUMP.16B b/MMDUMP.16B index b9dba4098a7462b56b9604a128c8017cdd85933e..253c86cf555207e1bebcea2a92837095340d24d0 100755 GIT binary patch literal 50 ucmXr0FfcH2wlcFcH&M{geW0met6*edY{tuF0F*Ftv2u1Zw**QsAS3`AiwZ9Q literal 75 zcmXr0FfcH3u`+OTaaGXJ71UI)RWPzNH09+o07{rRTbWs!IRhnbqe=jEIJ;Sx0wov_ F5&%-f4*UQB diff --git a/MMDUMP.16W b/MMDUMP.16W index 8420fa4cd09c2471e1733221766255fa2167ea53..2f5e7ecfa7fabedb4836a18f552f166b815237f7 100755 GIT binary patch literal 66 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 delta 36409 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 Z`}yO`I7oWWR&ajE197-CJUV0Z{{o4hb?E>A diff --git a/bcexmm.prj b/bcexmm.prj index 5778f27af5ee70778d5bcd6bce271860e0f6e144..2610441e4baa1739fd5034b7aa653470f1edff5b 100755 GIT binary patch delta 566 zcmaJ-J4gdT5S`oI)2OG>#KahXImJdHB4Ua|1dWlvKA!iQj3jZWoZ$xI`>A41HtC)?Ax7r@6GkZ-BB z97MFxtnf>d!dUhOlo*Dy o#CG_rZfT{DVoWgNrLGc;}yo8j7u1M7|R*s8QmBS z8D$uq7@QdXKPfiz3=VRR@$qzuF*J(@QhFXhQxzDP89-7jV3HL~vN4>{=5c3dI0+;< z7*0+$5=&+F0lIIssHBn{ScN>8{QsXp%43}y7g!-Thy>X(`KnkhNcm=0@iL~#qT>84 V90) + if(debugpm>0) { PM_Startup(&gvar); - PM_CheckMainMem(&gvar); + //PM_CheckMainMem(&gvar); PM_UnlockMainMem(&gvar); } CA_Startup(&gvar); @@ -151,7 +151,7 @@ for(w=0;w<2;w++) printf("bakapee1=%s\n", bakapee1); printf("bakapee2=%s\n", bakapee2); MM_FreePtr(&bigbuffer, &gvar); - if(pmdebug>0) + if(debugpm>0) PM_Shutdown(&gvar); CA_Shutdown(&gvar); MM_Shutdown(&gvar); diff --git a/src/lib/16_head.h b/src/lib/16_head.h index ec7db9f8..2d080d52 100755 --- a/src/lib/16_head.h +++ b/src/lib/16_head.h @@ -152,7 +152,8 @@ static word far* clockw= (word far*) 0x046C; /* 18.2hz clock */ extern int profilehandle,debughandle; //make it into game global #define __DEBUG__ -//0000#define __DEBUG_PM__ +#define __DEBUG_PM__ +//#define __DEBUG_MM__ #define nil ((void *)0) #ifdef __BORLANDC__ diff --git a/src/lib/16_mm.c b/src/lib/16_mm.c index db338fa1..859a5b4a 100755 --- a/src/lib/16_mm.c +++ b/src/lib/16_mm.c @@ -157,8 +157,8 @@ byte MML_SetupEMS(global_game_variables_t *gvar) unsigned int EMSVer = 0; //byte EMS_status; - unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle; - totalEMSpages = freeEMSpages = EMSpageframe = EMSpagesmapped = 0; + unsigned totalEMSpages,freeEMSpages,EMSPageFrame,EMSpagesmapped,EMSHandle; + totalEMSpages = freeEMSpages = EMSPageFrame = EMSpagesmapped = 0; __asm { mov ah,EMS_STATUS @@ -179,7 +179,7 @@ byte MML_SetupEMS(global_game_variables_t *gvar) int EMS_INT // find the page frame address or ah,ah jnz error - mov [EMSpageframe],bx + mov [EMSPageFrame],bx mov ah,EMS_GETPAGES int EMS_INT // find out how much EMS is there @@ -218,7 +218,7 @@ byte MML_SetupEMS(global_game_variables_t *gvar) int EMS_INT or ah,ah jnz error - mov [EMShandle],dx + mov [EMSHandle],dx jmp End #ifdef __BORLANDC__ } @@ -247,9 +247,9 @@ End: } gvar->mm.totalEMSpages=totalEMSpages; gvar->mm.freeEMSpages=freeEMSpages; - gvar->mm.EMSpageframe=EMSpageframe; + gvar->mm.EMSPageFrame=EMSPageFrame; gvar->mm.EMSpagesmapped=EMSpagesmapped; - gvar->mm.EMShandle=EMShandle; + gvar->mm.EMSHandle=EMSHandle; gvar->mm.EMSVer=EMSVer; return 0; } @@ -266,13 +266,13 @@ End: void MML_ShutdownEMS(global_game_variables_t *gvar) { boolean errorflag=false; - unsigned EMShandle=gvar->mm.EMShandle; + unsigned EMSHandle=gvar->mm.EMSHandle; - if(!EMShandle) + if(!EMSHandle) return; __asm { mov ah,EMS_FREEPAGES - mov dx,[EMShandle] + mov dx,[EMSHandle] int EMS_INT or ah,ah jz ok @@ -303,11 +303,11 @@ void MML_ShutdownEMS(global_game_variables_t *gvar) byte MM_MapEMS(global_game_variables_t *gvar) { byte str[160]; - unsigned EMShandle; + unsigned EMSHandle; byte err; boolean errorflag=false; int i; - EMShandle=gvar->mm.EMShandle; + EMSHandle=gvar->mm.EMSHandle; for (i=0;i<4/*MAPPAGES*/;i++) { @@ -315,7 +315,7 @@ byte MM_MapEMS(global_game_variables_t *gvar) mov ah,EMS_MAPPAGE mov bx,[i] // logical page mov al,bl // physical page - mov dx,[EMShandle] // handle + mov dx,[EMSHandle] // handle int EMS_INT or ah,ah jnz error @@ -375,10 +375,10 @@ byte MM_MapXEMS(global_game_variables_t *gvar) //END SUB byte str[160]; byte err; - word EMShandle; + word EMSHandle; boolean errorflag=false; int i; - EMShandle=gvar->mm.EMShandle; + EMSHandle=gvar->mm.EMSHandle; if(gvar->mm.EMSVer<0x40) return 5; @@ -389,7 +389,7 @@ byte MM_MapXEMS(global_game_variables_t *gvar) mov ah,EMS_MAPXPAGE mov cx,[i] // logical page mov al,bl // physical page - mov dx,[EMShandle] // handle + mov dx,[EMSHandle] // handle int EMS_INT or ah,ah jnz error @@ -836,7 +836,9 @@ void MM_Startup(global_game_variables_t *gvar) gvar->mmi.mainmem = gvar->mmi.nearheap + gvar->mmi.farheap; - if(!pmdebug) { +#ifdef __DEBUG__ + if(!debugpm) { +#endif // // detect EMS and allocate up to 64K at page frame // @@ -865,7 +867,7 @@ void MM_Startup(global_game_variables_t *gvar) { MML_SetupEMS(gvar); // allocate space //TODO: EMS4! AND EMS 3.2 MASSIVE DATA HANDLMENT! - MML_UseSpace(gvar->mm.EMSpageframe,(MAPPAGES)*0x4000lu, gvar); + MML_UseSpace(gvar->mm.EMSPageFrame,(MAPPAGES)*0x4000lu, gvar); //if(gvar->pm.emm.EMSVer<0x40) MM_MapEMS(gvar); // map in used pages //else @@ -901,7 +903,9 @@ goto xmsskip;//0000 { MML_SetupXMS(gvar); // allocate as many UMBs as possible } +#ifdef __DEBUG__ } +#endif // // allocate the misc buffer // @@ -935,10 +939,14 @@ void MM_Shutdown(global_game_variables_t *gvar) #ifdef __BORLANDC__ free(gvar->mm.nearheap);// printf(" near freed\n"); #endif - if(!pmdebug) { +#ifdef __DEBUG__ + if(!debugpm) { +#endif if(MML_CheckForEMS()){ MML_ShutdownEMS(gvar); }//printf(" EMS freed\n"); } if(MML_CheckForXMS(gvar)){ MML_ShutdownXMS(gvar); }//printf(" XMS freed\n"); } +#ifdef __DEBUG__ } +#endif } //========================================================================== @@ -966,10 +974,12 @@ void MM_GetPtr (memptr *baseptr, dword size, global_game_variables_t *gvar) gvar->mm.mmnew->length = needed; gvar->mm.mmnew->useptr = baseptr; //if(gvar->mm.mmnew->useptr==NULL){ -#ifdef __DEBUG__ - printf("baseptr=%04x ", baseptr); printf("useptr=%04x\n", gvar->mm.mmnew->useptr); - printf("*baseptr=%04x ", *baseptr); printf("*useptr=%04x\n", *(gvar->mm.mmnew->useptr)); - printf("*baseptr=%Fp ", *baseptr); printf("*useptr=%Fp\n", *(gvar->mm.mmnew->useptr)); +#ifdef __DEBUG_MM__ + printf("MM_GetPtr\n"); + //%04x + printf(" baseptr=%Fp ", baseptr); printf("useptr=%Fp\n", gvar->mm.mmnew->useptr); + printf(" *baseptr=%Fp ", *baseptr); printf("*useptr=%Fp\n", *(gvar->mm.mmnew->useptr)); + printf(" &baseptr=%Fp ", &baseptr); printf("&useptr=%Fp\n", &(gvar->mm.mmnew->useptr)); #endif //exit(-5); } gvar->mm.mmnew->attributes = BASEATTRIBUTES; @@ -1109,6 +1119,7 @@ void MM_FreePtr(memptr *baseptr, global_game_variables_t *gvar) ===================== */ + void MM_SetPurge(memptr *baseptr, int purge, global_game_variables_t *gvar) { //huge mmblocktype huge *start; @@ -1610,7 +1621,7 @@ void MM_Report_(global_game_variables_t *gvar) printf(" LIMEMS\n"); printf(" EMM v%x.%x available\n", gvar->mm.EMSVer>>4,gvar->mm.EMSVer&0x0F); printf(" totalEMSpages: %u ", gvar->mm.totalEMSpages); printf("freeEMSpages: %u\n", gvar->mm.freeEMSpages); - printf(" EMSpageframe: %x\n", gvar->mm.EMSpageframe); + printf(" EMSPageFrame: %x\n", gvar->mm.EMSPageFrame); } if(MML_CheckForXMS(gvar)) { diff --git a/src/lib/16_mm.h b/src/lib/16_mm.h index b04c56ab..d858c0f1 100755 --- a/src/lib/16_mm.h +++ b/src/lib/16_mm.h @@ -27,11 +27,10 @@ #include "src/lib/16_hc.h" #include "src/lib/16_lib.h" //++++mh #include "src/lib/16_in.h" -extern boolean pmdebug; - #ifdef __DEBUG__ // 1 == Debug/Dev ; 0 == Production/final #define OUT_OF_MEM_MSG "MM_GetPtr: Out of memory!\nYou were short :%lu bytes\n" +extern boolean debugpm; #else #define OUT_OF_MEM_MSG "\npee\n" #endif @@ -106,7 +105,7 @@ extern boolean pmdebug; extern void (* beforesort) (void); extern void (* aftersort) (void); -extern void (* XMSaddr) (void); // far pointer to XMS driver +extern void (* XMSaddr) (void); // far pointer to XMS driver //========================================================================== diff --git a/src/lib/16_pm.c b/src/lib/16_pm.c index b472e58b..030a47b6 100755 --- a/src/lib/16_pm.c +++ b/src/lib/16_pm.c @@ -29,23 +29,24 @@ #include "src/lib/16_pm.h" #pragma hdrstop -boolean pmdebug=0; +#ifdef __DEBUG__ +boolean debugpm=0; +#endif -/* // Main Mem specific variables - boolean MainPresent; +/* boolean MainPresent; memptr MainMemPages[PMMaxMainMem]; PMBlockAttr gvar->pm.mm.MainMemUsed[PMMaxMainMem]; int gvar->pm.mm.MainPagesAvail; // EMS specific variables - boolean gvar->pm.emm.EMSPresent; + 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]; // XMS specific variables - boolean gvar->pm.xmm.XMSPresent; + boolean XMSPresent; word gvar->pm.xmm.XMSAvail,gvar->pm.xmm.XMSPagesAvail,gvar->pm.xmm.XMSHandle;*/ word XMSDriver; /* int gvar->pm.xmm.XMSProtectPage = -1; @@ -68,6 +69,7 @@ boolean pmdebug=0; PageListStruct far *gvar->pm.PMPages, _seg *gvar->pm.PMSegPages; */ +boolean PMStarted, MainPresent, EMSPresent, XMSPresent; static char *ParmStrings[] = {"nomain","noems","noxms",nil}; ///////////////////////////////////////////////////////////////////////////// @@ -134,126 +136,157 @@ 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[160]; + byte err; - gvar->pm.emm.EMSPresent = false; // Assume that we'll fail + boolean errorflag=0; + static char emmname[] = "EMMXXXX0"; //fix by andrius4669 + unsigned int EMSVer = 0; + unsigned totalEMSpages,freeEMSpages,EMSPageFrame,EMSHandle,EMSAvail; + totalEMSpages = freeEMSpages = EMSPageFrame = 0; + 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; + 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; + } + } - _AX = 0x4407; - geninterrupt(0x21); // get status __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; - gvar->pm.emm.EMSPresent = true; // We have EMS + } + else + { + strcpy(str,"PML_StartupEMS: EMS error "); + MM_EMSerr(str, err); + printf("%s\n",str); + return(EMSPresent); + } -error: - return(gvar->pm.emm.EMSPresent); + 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; + + return(EMSPresent); } // @@ -265,7 +298,7 @@ PML_ShutdownEMS(global_game_variables_t *gvar) word EMSHandle; EMSHandle=gvar->pm.emm.EMSHandle; - if (gvar->pm.emm.EMSPresent) + if (EMSPresent) { __asm { mov ah,EMS_FREEPAGES @@ -295,7 +328,7 @@ PML_ShutdownEMS(global_game_variables_t *gvar) boolean PML_StartupXMS(global_game_variables_t *gvar) { - gvar->pm.xmm.XMSPresent = false; // Assume failure + XMSPresent = false; // Assume failure gvar->pm.xmm.XMSAvail = 0; _AX=0x4300; @@ -332,9 +365,9 @@ PML_StartupXMS(global_game_variables_t *gvar) gvar->mmi.XMSmem += gvar->pm.xmm.XMSAvail * 1024; - gvar->pm.xmm.XMSPresent = true; + XMSPresent = true; error: - return(gvar->pm.xmm.XMSPresent); + return(XMSPresent); } // @@ -414,7 +447,7 @@ PML_CopyFromXMS(byte far *target,int sourcepage,word length, global_game_variabl void PML_ShutdownXMS(global_game_variables_t *gvar) { - if (gvar->pm.xmm.XMSPresent) + if (XMSPresent) { _DX = gvar->pm.xmm.XMSHandle; XMS_CALL(XMS_FREE); @@ -442,15 +475,26 @@ PM_SetMainMemPurge(int level, global_game_variables_t *gvar) { int i; + if(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])); printf("& %Fp, %Fp\n", &gvar->pm.mm.MainMemPages[i], &(gvar->pm.mm.MainMemPages[i])); + //MM_ShowMemory(gvar); + //MM_DumpData(gvar); + //MM_Report_(gvar); #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 + { + printf("MainPresent IS NULL\n"); + printf("%x ", MainPresent); + exit(-4); } } @@ -476,7 +520,7 @@ PM_CheckMainMem(global_game_variables_t *gvar) PMBlockAttr *used; PageListStruct far *page; - if (!gvar->pm.mm.MainPresent) + if (!MainPresent) return; for (i = 0,page = gvar->pm.PMPages;i < gvar->pm.fi.ChunksInFile;i++,page++) @@ -543,7 +587,11 @@ PML_StartupMainMem(global_game_variables_t *gvar) memptr *p; gvar->pm.mm.MainPagesAvail = 0; + 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); @@ -561,7 +609,7 @@ PML_StartupMainMem(global_game_variables_t *gvar) Quit("PM_SetupMainMem: Not enough main memory"); //return; } - gvar->pm.mm.MainPresent = true; + MainPresent = true; } // @@ -853,7 +901,7 @@ PML_PutPageInXMS(int pagenum, global_game_variables_t *gvar) int usexms; PageListStruct far *page; - if (!gvar->pm.xmm.XMSPresent) + if (!XMSPresent) return; page = &gvar->pm.PMPages[pagenum]; @@ -982,7 +1030,7 @@ PML_GetPageFromXMS(int pagenum,boolean mainonly, global_game_variables_t *gvar) PageListStruct far *page; page = &gvar->pm.PMPages[pagenum]; - if (gvar->pm.xmm.XMSPresent && (page->xmsPage != -1)) + if (XMSPresent && (page->xmsPage != -1)) { gvar->pm.xmm.XMSProtectPage = pagenum; checkaddr = PML_GetAPageBuffer(pagenum,mainonly, gvar); @@ -1296,8 +1344,11 @@ PM_Startup(global_game_variables_t *gvar) boolean nomain,noems,noxms; int i; - if (gvar->pm.PMStarted) + if (PMStarted) + { + printf("pee\n"); return; + } strcat(&(gvar->pm.fi.PageFileName), "VSWAP."); @@ -1339,17 +1390,17 @@ PM_Startup(global_game_variables_t *gvar) if (!noxms) PML_StartupXMS(gvar); - if (nomain && !gvar->pm.emm.EMSPresent) + if (nomain && !EMSPresent) { Quit("PM_Startup: No main or EMS\n"); //return; } - else - PML_StartupMainMem(gvar); + printf("PML_StartupMainMem\n"); + PML_StartupMainMem(gvar); PM_Reset(gvar); - gvar->pm.PMStarted = true; + PMStarted = true; } // @@ -1361,7 +1412,7 @@ PM_Shutdown(global_game_variables_t *gvar) PML_ShutdownXMS(gvar); PML_ShutdownEMS(gvar); - if (!gvar->pm.PMStarted) + if (!PMStarted) return; PML_ClosePageFile(gvar); diff --git a/src/lib/16_pm.h b/src/lib/16_pm.h index a8510f17..2a9c368f 100755 --- a/src/lib/16_pm.h +++ b/src/lib/16_pm.h @@ -33,7 +33,9 @@ #include "src/lib/16_mm.h" #include -extern boolean pmdebug; +#ifdef __DEBUG__ +extern boolean debugpm; +#endif /*// NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024 #define EMSPageSize 16384 @@ -113,4 +115,5 @@ extern memptr PM_GetPageAddress(int pagenum, global_game_variables_t *gvar), PM_GetPage(int pagenum, global_game_variables_t *gvar); // Use this one to cache page void PM_SetMainMemPurge(int level, global_game_variables_t *gvar); +void PML_StartupMainMem(global_game_variables_t *gvar); #endif diff --git a/src/lib/typdefst.h b/src/lib/typdefst.h index d069b92f..b34d133d 100755 --- a/src/lib/typdefst.h +++ b/src/lib/typdefst.h @@ -155,6 +155,7 @@ typedef struct mmblockstruct typedef struct { dword nearheap,farheap,EMSmem,XMSmem,mainmem; +// boolean PMStarted, MainPresent, EMSPresent, XMSPresent; } mminfotype; typedef struct @@ -169,9 +170,9 @@ typedef struct #ifdef __WATCOMC__ void __near *nearheap; #endif - //byte EMS_status; + unsigned int EMSVer; word numUMBs,UMBbase[MAXUMBS]; - word totalEMSpages, freeEMSpages, EMSpagesmapped, EMShandle, EMSpageframe,EMSVer; + word totalEMSpages, freeEMSpages, EMSpagesmapped, EMSHandle, EMSPageFrame; //dword numUMBs,UMBbase[MAXUMBS]; //huge mmblocktype huge mmblocks[MAXBLOCKS],huge *mmhead,huge *mmfree,huge *mmrover,huge *mmnew; mmblocktype far mmblocks[MAXBLOCKS],far *mmhead,far *mmfree,far *mmrover,far *mmnew; @@ -235,7 +236,7 @@ typedef struct // Main Mem specific variables typedef struct { - boolean MainPresent; +// boolean MainPresent; memptr MainMemPages[PMMaxMainMem]; PMBlockAttr MainMemUsed[PMMaxMainMem]; int MainPagesAvail; @@ -244,9 +245,10 @@ typedef struct // EMS specific variables typedef struct { - boolean EMSPresent; +// boolean EMSPresent; + unsigned int EMSVer; word EMSAvail,EMSPagesAvail,EMSHandle, - EMSPageFrame,EMSPhysicalPage, EMSVer; + EMSPageFrame,EMSPhysicalPage; word totalEMSpages, freeEMSpages, EMSpagesmapped; EMSListStruct EMSList[EMSFrameCount]; } pm_emmi_t; @@ -254,7 +256,7 @@ typedef struct // XMS specific variables typedef struct { - boolean XMSPresent; +// boolean XMSPresent; word XMSAvail,XMSPagesAvail,XMSHandle; dword XMSDriver; //TODO: changed to word int XMSProtectPage;// = -1; -- 2.39.2