From bee11e09842453ed5154248808d3d5acd67eab6f Mon Sep 17 00:00:00 2001 From: sparky4 Date: Wed, 1 Jul 2015 20:13:01 -0500 Subject: [PATCH] exmm lib done~ modified: exmmtest.exe modified: src/exmmtest.c modified: src/lib/16_mm.c modified: src/lib/16_mm.h --- exmmtest.exe | Bin 46571 -> 39425 bytes src/exmmtest.c | 11 +- src/lib/16_mm.c | 447 ++++++++++++++++++++++++++---------------------- src/lib/16_mm.h | 85 ++++----- 4 files changed, 294 insertions(+), 249 deletions(-) diff --git a/exmmtest.exe b/exmmtest.exe index 1f7b40979252316ab4c0463837f84752472b1515..cdfd0d19b164c98070cc582521f0d554acf1af70 100644 GIT binary patch delta 20068 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

w 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 YL1xH*MSG74cB36O9jVs{vDnoA7pFV|o&W#< delta 19321 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 diff --git a/src/exmmtest.c b/src/exmmtest.c index b950051b..24229f7d 100644 --- a/src/exmmtest.c +++ b/src/exmmtest.c @@ -27,13 +27,16 @@ void main(int argc, char *argv[]) { + mminfo_t mm; + mminfotype mmi; + mm.mmstarted=0; printf("start!\n"); - MM_Startup(); + MM_Startup(&mm, &mmi); printf("done!\n"); printf("&main()=%Fp\n", *argv[0]); - MM_ShowMemory(); - MM_Report(); + MM_ShowMemory(&mm); + MM_Report(&mm, &mmi); printf("stop!\n"); - MM_Shutdown(); + MM_Shutdown(&mm); printf("done!\n"); } diff --git a/src/lib/16_mm.c b/src/lib/16_mm.c index 111b696d..6cc35149 100644 --- a/src/lib/16_mm.c +++ b/src/lib/16_mm.c @@ -52,12 +52,13 @@ EMS / XMS unmanaged routines ============================================================================= */ -mminfotype mminfo; -memptr bufferseg; -boolean mmerror; +//mminfo_t mminfo; +//memptr bufferseg; +//boolean mmerror; void (* beforesort) (void); -void (* aftersort) (void); +void (* aftersort) (void); +void (* XMSaddr) (void); // far pointer to XMS driver /* ============================================================================= @@ -67,22 +68,21 @@ void (* aftersort) (void); ============================================================================= */ -boolean mmstarted; +//boolean mmstarted; -void far *farheap; -void *nearheap; +//void far *farheap; +//void *nearheap; -mmblocktype far mmblocks[MAXBLOCKS] - ,far *mmhead,far *mmfree,far *mmrover,far *mmnew; +//mmblocktype far mmblocks[MAXBLOCKS],far *mmhead,far *mmfree,far *mmrover,far *mmnew; -boolean bombonerror; +//boolean bombonerror; -unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle; -unsigned int EMSVer; +//unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle; +//unsigned int EMSVer; -void (* XMSaddr) (void); // far pointer to XMS driver +//void (* XMSaddr) (void); // far pointer to XMS driver -unsigned numUMBs,UMBbase[MAXUMBS]; +//unsigned numUMBs,UMBbase[MAXUMBS]; static char *ParmStringsexmm[] = {"noems","noxms",""}; @@ -96,7 +96,7 @@ static char *ParmStringsexmm[] = {"noems","noxms",""}; ======================= */ -boolean MML_CheckForEMS (void) +boolean MML_CheckForEMS(void) { boolean emmcfems; char emmname[] = "EMMXXXX0"; @@ -150,14 +150,15 @@ boolean MML_CheckForEMS (void) ======================= */ -unsigned MML_SetupEMS (void) +unsigned MML_SetupEMS(mminfo_t *mm) { char str[80],str2[10]; unsigned err; boolean errorflag=false; union REGS CPURegs; - EMSVer = 0; + unsigned int EMSVer = 0; + unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle; totalEMSpages = freeEMSpages = EMSpageframe = EMSpagesmapped = 0; __asm @@ -217,6 +218,12 @@ End: printf("%s\n",str); return err; } + mm->totalEMSpages=totalEMSpages; + mm->freeEMSpages=freeEMSpages; + mm->EMSpageframe=EMSpageframe; + mm->EMSpagesmapped=EMSpagesmapped; + mm->EMShandle=EMShandle; + mm->EMSVer=EMSVer; return 0; } @@ -229,10 +236,12 @@ End: ======================= */ -void MML_ShutdownEMS (void) +void MML_ShutdownEMS(mminfo_t *mm) { - boolean errorflag=false; - if (!EMShandle) + boolean errorflag=false; + unsigned EMShandle=mm->EMShandle; + + if(!EMShandle) return; __asm { @@ -259,15 +268,16 @@ void MML_ShutdownEMS (void) ==================== */ -unsigned MM_MapEMS (void) +unsigned MM_MapEMS(mminfo_t *mm) { char str[80],str2[10]; - unsigned err; + unsigned err, EMShandle; boolean errorflag=false; int i; - union REGS CPURegs; + union REGS CPURegs; + EMShandle=mm->EMShandle; - for (i=0;iEMSpagesmapped;i++) { __asm { @@ -308,10 +318,10 @@ unsigned MM_MapEMS (void) ======================= */ -boolean MML_CheckForXMS (void) +boolean MML_CheckForXMS(mminfo_t *mm) { boolean errorflag=false; - numUMBs = 0; + mm->numUMBs = 0; __asm { @@ -337,7 +347,7 @@ boolean MML_CheckForXMS (void) ======================= */ -void MML_SetupXMS (void) +void MML_SetupXMS(mminfo_t *mm, mminfotype *mmi) { unsigned base,size; @@ -370,11 +380,11 @@ gotone: mov [size],dx done: } - MML_UseSpace (base,size); - mminfo.XMSmem += size*16; - UMBbase[numUMBs] = base; - numUMBs++; - if (numUMBs < MAXUMBS) + MML_UseSpace(base,size, mm); + mmi->XMSmem += size*16; + mm->UMBbase[mm->numUMBs] = base; + mm->numUMBs++; + if(mm->numUMBs < MAXUMBS) goto getmemory; } @@ -387,14 +397,14 @@ done: ====================== */ -void MML_ShutdownXMS (void) +void MML_ShutdownXMS(mminfo_t *mm) { int i; - unsigned base; + unsigned base; - for (i=0;inumUMBs;i++) { - base = UMBbase[i]; + base = mm->UMBbase[i]; __asm { mov ah,XMS_FREEUMB @@ -418,19 +428,19 @@ void MML_ShutdownXMS (void) ====================== */ -void MML_UseSpace (unsigned segstart, unsigned seglength) +void MML_UseSpace(unsigned segstart, unsigned seglength, mminfo_t *mm) { mmblocktype far *scan,far *last; unsigned oldend; long extra; - scan = last = mmhead; - mmrover = mmhead; // reset rover to start of memory + scan = last = mm->mmhead; + mm->mmrover = mm->mmhead; // reset rover to start of memory // // search for the block that contains the range of segments // - while (scan->start+scan->length < segstart) + while(scan->start+scan->length < segstart) { last = scan; scan = scan->next; @@ -441,7 +451,7 @@ void MML_UseSpace (unsigned segstart, unsigned seglength) // oldend = scan->start + scan->length; extra = oldend - (segstart+seglength); - if (extra < 0) + if(extra < 0) { printf("MML_UseSpace: Segment spans two blocks!"); return; @@ -451,7 +461,7 @@ void MML_UseSpace (unsigned segstart, unsigned seglength) if (segstart == scan->start) { last->next = scan->next; // unlink block - FREEBLOCK(scan); + MM_FreeBlock(scan, mm); scan = last; } else @@ -459,12 +469,12 @@ void MML_UseSpace (unsigned segstart, unsigned seglength) if (extra > 0) { - GETNEWBLOCK; - mmnew->next = scan->next; - scan->next = mmnew; - mmnew->start = segstart+seglength; - mmnew->length = extra; - mmnew->attributes = LOCKBIT; + MM_GetNewBlock(mm); + mm->mmnew->next = scan->next; + scan->next = mm->mmnew; + mm->mmnew->start = segstart+seglength; + mm->mmnew->length = extra; + mm->mmnew->attributes = LOCKBIT; } } @@ -481,17 +491,17 @@ void MML_UseSpace (unsigned segstart, unsigned seglength) ==================== */ -void MML_ClearBlock (void) +void MML_ClearBlock(mminfo_t *mm) { mmblocktype far *scan,far *last; - scan = mmhead->next; + scan = mm->mmhead->next; - while (scan) + while(scan) { - if (!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS) ) + if(!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS)) { - MM_FreePtr(scan->useptr); + MM_FreePtr(scan->useptr, mm); return; } scan = scan->next; @@ -514,117 +524,121 @@ void MML_ClearBlock (void) =================== */ -void MM_Startup (void) +void MM_Startup(mminfo_t *mm, mminfotype *mmi) { int i; dword length; - void far *start; - unsigned segstart,seglength,endfree; - - if (mminfo.mmstarted) - MM_Shutdown (); + void far *start; + unsigned segstart,seglength,endfree; + if(mm->mmstarted) + MM_Shutdown(mm); - mminfo.mmstarted = true; - mminfo.bombonerror = true; + mm->mmstarted = true; + mm->bombonerror = true; // // set up the linked list (everything in the free list; // - mmhead = NULL; - mmfree = &mmblocks[0]; - for (i=0;immhead = NULL; + mm->mmfree = &(mm->mmblocks[0]); + for(i=0;immblocks[i].next = &(mm->mmblocks[i+1]); + } + mm->mmblocks[i].next = NULL; // // locked block of all memory until we punch out free space // - GETNEWBLOCK; - mmhead = mmnew; // this will allways be the first node - mmnew->start = 0; - mmnew->length = 0xffff; - mmnew->attributes = LOCKBIT; - mmnew->next = NULL; - mmrover = mmhead; + //GETNEWBLOCK; + MM_GetNewBlock(mm); + mm->mmhead = mm->mmnew; // this will allways be the first node + mm->mmnew->start = 0; + mm->mmnew->length = 0xffff; + mm->mmnew->attributes = LOCKBIT; + mm->mmnew->next = NULL; + mm->mmrover = mm->mmhead; // // get all available near conventional memory segments // -//---- length=coreleft(); +//---- length=coreleft(); _nheapgrow(); length=_memavl(); - start = (void far *)(nearheap = malloc(length)); + start = (void far *)(mm->nearheap = malloc(length)); length -= 16-(FP_OFF(start)&15); length -= SAVENEARHEAP; seglength = length / 16; // now in paragraphs segstart = FP_SEG(start)+(FP_OFF(start)+15)/16; - MML_UseSpace (segstart,seglength); - mminfo.nearheap = length; + MML_UseSpace(segstart,seglength, mm); + mmi->nearheap = length; // // get all available far conventional memory segments // -//---- length=farcoreleft(); +//---- length=farcoreleft(); _fheapgrow(); length=_memavl(); - start = farheap = _fmalloc(length); + start = mm->farheap = _fmalloc(length); length -= 16-(FP_OFF(start)&15); length -= SAVEFARHEAP; seglength = length / 16; // now in paragraphs segstart = FP_SEG(start)+(FP_OFF(start)+15)/16; - MML_UseSpace (segstart,seglength); - mminfo.farheap = length; - mminfo.mainmem = mminfo.nearheap + mminfo.farheap; + MML_UseSpace(segstart,seglength, mm); + mmi->farheap = length; + mmi->mainmem = mmi->nearheap + mmi->farheap; // // detect EMS and allocate up to 64K at page frame // - mminfo.EMSmem = 0; - for (i = 1;i < __argc;i++) + mmi->EMSmem = 0; + for(i = 1;i < __argc;i++) { - if ( US_CheckParm(__argv[i],ParmStringsexmm) == 0) + if(US_CheckParm(__argv[i],ParmStringsexmm) == 0) goto emsskip; // param NOEMS } - if (MML_CheckForEMS()) + if(MML_CheckForEMS()) { - //printf("EMS1\n"); - MML_SetupEMS(); // allocate space - //printf("EMS2\n"); - MML_UseSpace (EMSpageframe,EMSpagesmapped*0x400); - //printf("EMS3\n"); - MM_MapEMS(); // map in used pages - //printf("EMS4\n"); - mminfo.EMSmem = EMSpagesmapped*0x4000l; + printf("EMS1\n"); + MML_SetupEMS(mm); // allocate space + printf("EMS2\n"); +printf("segstart=%x\n", segstart); +printf("mm->EMSpageframe=%x\n", mm->EMSpageframe); + MML_UseSpace(mm->EMSpageframe,mm->EMSpagesmapped*0x400, mm); + printf("EMS3\n"); + MM_MapEMS(mm); // map in used pages + printf("EMS4\n"); + mmi->EMSmem = mm->EMSpagesmapped*0x4000l; } // // detect XMS and get upper memory blocks // emsskip: - mminfo.XMSmem = 0; - for (i = 1;i < __argc;i++) + mmi->XMSmem = 0; + for(i = 1;i < __argc;i++) { if ( US_CheckParm(__argv[i],ParmStringsexmm) == 0) goto xmsskip; // param NOXMS } - if (MML_CheckForXMS()) + if(MML_CheckForXMS(mm)) { // printf("XMS!\n"); -//++++ MML_SetupXMS(); // allocate as many UMBs as possible +//++++ MML_SetupXMS(mm, mmi); // allocate as many UMBs as possible } // // allocate the misc buffer // xmsskip: - mmrover = mmhead; // start looking for space after low block + mm->mmrover = mm->mmhead; // start looking for space after low block - MM_GetPtr (&bufferseg,BUFFERSIZE); + MM_GetPtr(&(mm->bufferseg),BUFFERSIZE, mm, mmi); } //========================================================================== @@ -639,21 +653,21 @@ xmsskip: ==================== */ -void MM_Shutdown (void) +void MM_Shutdown(mminfo_t *mm) { - if (!mminfo.mmstarted) - return; - - _ffree (farheap); - printf("far freed\n"); - free (nearheap); - printf("near freed\n"); - //hfree(hugeheap); - printf("huge freed\n"); - MML_ShutdownEMS (); - printf("EMS freed\n"); -//++++ MML_ShutdownXMS (); - printf("XMS freed\n"); + if(!(mm->mmstarted)) + return; + + _ffree(mm->farheap); + printf("far freed\n"); + free(mm->nearheap); + printf("near freed\n"); + //hfree(mm->hugeheap); + //printf("huge freed\n"); + MML_ShutdownEMS(mm); + printf("EMS freed\n"); +//++++ MML_ShutdownXMS(mm); +// printf("XMS freed\n"); } //========================================================================== @@ -668,7 +682,7 @@ void MM_Shutdown (void) ==================== */ -void MM_GetPtr (memptr *baseptr,dword size) +void MM_GetPtr(memptr *baseptr,dword size, mminfo_t *mm, mminfotype *mmi) { mmblocktype far *scan,far *lastscan,far *endscan ,far *purge,far *next; @@ -677,45 +691,45 @@ void MM_GetPtr (memptr *baseptr,dword size) needed = (size+15)/16; // convert size from bytes to paragraphs - GETNEWBLOCK; // fill in start and next after a spot is found - mmnew->length = needed; - mmnew->useptr = baseptr; - mmnew->attributes = BASEATTRIBUTES; + MM_GetNewBlock(mm); // fill in start and next after a spot is found + mm->mmnew->length = needed; + mm->mmnew->useptr = baseptr; + mm->mmnew->attributes = BASEATTRIBUTES; - for (search = 0; search<3; search++) + for(search = 0; search<3; search++) { // // first search: try to allocate right after the rover, then on up // second search: search from the head pointer up to the rover // third search: compress memory, then scan from start - if (search == 1 && mmrover == mmhead) + if(search == 1 && mm->mmrover == mm->mmhead) search++; - switch (search) + switch(search) { case 0: - lastscan = mmrover; - scan = mmrover->next; + lastscan = mm->mmrover; + scan = mm->mmrover->next; endscan = NULL; break; case 1: - lastscan = mmhead; - scan = mmhead->next; - endscan = mmrover; + lastscan = mm->mmhead; + scan = mm->mmhead->next; + endscan = mm->mmrover; break; case 2: - MM_SortMem (); - lastscan = mmhead; - scan = mmhead->next; + MM_SortMem(mm); + lastscan = mm->mmhead; + scan = mm->mmhead->next; endscan = NULL; break; } startseg = lastscan->start + lastscan->length; - while (scan != endscan) + while(scan != endscan) { - if (scan->start - startseg >= needed) + if(scan->start - startseg >= needed) { // // got enough space between the end of lastscan and @@ -723,23 +737,23 @@ void MM_GetPtr (memptr *baseptr,dword size) // and allocate the new block // purge = lastscan->next; - lastscan->next = mmnew; - mmnew->start = *(unsigned *)baseptr = startseg; - mmnew->next = scan; - while ( purge != scan) + lastscan->next = mm->mmnew; + mm->mmnew->start = *(unsigned *)baseptr = startseg; + mm->mmnew->next = scan; + while(purge != scan) { // free the purgable block next = purge->next; - FREEBLOCK(purge); + MM_FreeBlock(purge, mm); purge = next; // purge another if not at scan } - mmrover = mmnew; + mm->mmrover = mm->mmnew; return; // good allocation! } // // if this block is purge level zero or locked, skip past it // - if ( (scan->attributes & LOCKBIT) + if((scan->attributes & LOCKBIT) || !(scan->attributes & PURGEBITS) ) { lastscan = scan; @@ -751,10 +765,10 @@ void MM_GetPtr (memptr *baseptr,dword size) } } - if (mminfo.bombonerror) - printf(OUT_OF_MEM_MSG,(size-mminfo.nearheap)); + if (mm->bombonerror) + printf(OUT_OF_MEM_MSG,(size-mmi->nearheap)); else - mminfo.mmerror = true; + mm->mmerror = true; } //========================================================================== @@ -769,23 +783,23 @@ void MM_GetPtr (memptr *baseptr,dword size) ==================== */ -void MM_FreePtr (memptr *baseptr) +void MM_FreePtr(memptr *baseptr, mminfo_t *mm) { mmblocktype far *scan,far *last; - last = mmhead; + last = mm->mmhead; scan = last->next; - if (baseptr == mmrover->useptr) // removed the last allocated block - mmrover = mmhead; + if(baseptr == mm->mmrover->useptr) // removed the last allocated block + mm->mmrover = mm->mmhead; - while (scan->useptr != baseptr && scan) + while(scan->useptr != baseptr && scan) { last = scan; scan = scan->next; } - if (!scan) + if(!scan) { printf("MM_FreePtr: Block not found!"); return; @@ -793,7 +807,7 @@ void MM_FreePtr (memptr *baseptr) last->next = scan->next; - FREEBLOCK(scan); + MM_FreeBlock(scan, mm); } //========================================================================== @@ -807,31 +821,31 @@ void MM_FreePtr (memptr *baseptr) ===================== */ -void MM_SetPurge (memptr *baseptr, int purge) +void MM_SetPurge(memptr *baseptr, int purge, mminfo_t *mm) { mmblocktype far *start; - start = mmrover; + start = mm->mmrover; do { - if (mmrover->useptr == baseptr) + if(mm->mmrover->useptr == baseptr) break; - mmrover = mmrover->next; + mm->mmrover = mm->mmrover->next; - if (!mmrover) - mmrover = mmhead; - else if (mmrover == start) + if(!mm->mmrover) + mm->mmrover = mm->mmhead; + else if(mm->mmrover == start) { printf("MM_SetPurge: Block not found!"); return; } - } while (1); + } while(1); - mmrover->attributes &= ~PURGEBITS; - mmrover->attributes |= purge; + mm->mmrover->attributes &= ~PURGEBITS; + mm->mmrover->attributes |= purge; } //========================================================================== @@ -846,31 +860,31 @@ void MM_SetPurge (memptr *baseptr, int purge) ===================== */ -void MM_SetLock (memptr *baseptr, boolean locked) +void MM_SetLock(memptr *baseptr, boolean locked, mminfo_t *mm) { mmblocktype far *start; - start = mmrover; + start = mm->mmrover; do { - if (mmrover->useptr == baseptr) + if(mm->mmrover->useptr == baseptr) break; - mmrover = mmrover->next; + mm->mmrover = mm->mmrover->next; - if (!mmrover) - mmrover = mmhead; - else if (mmrover == start) + if(!mm->mmrover) + mm->mmrover = mm->mmhead; + else if(mm->mmrover == start) { printf("MM_SetLock: Block not found!"); return; } - } while (1); + } while(1); - mmrover->attributes &= ~LOCKBIT; - mmrover->attributes |= locked*LOCKBIT; + mm->mmrover->attributes &= ~LOCKBIT; + mm->mmrover->attributes |= locked*LOCKBIT; } //========================================================================== @@ -885,7 +899,7 @@ void MM_SetLock (memptr *baseptr, boolean locked) ===================== */ -void MM_SortMem (void) +void MM_SortMem(mminfo_t *mm) { mmblocktype far *scan,far *last,far *next; unsigned start,length,source,dest,oldborder; @@ -914,16 +928,16 @@ void MM_SortMem (void) // oldborder = bordercolor; // VW_ColorBorder (15); - if (beforesort) + if(beforesort) beforesort(); - scan = mmhead; + scan = mm->mmhead; last = NULL; // shut up compiler warning - while (scan) + while(scan) { - if (scan->attributes & LOCKBIT) + if(scan->attributes & LOCKBIT) { // // block is locked, so try to pile later blocks right after it @@ -932,13 +946,13 @@ void MM_SortMem (void) } else { - if (scan->attributes & PURGEBITS) + if(scan->attributes & PURGEBITS) { // // throw out the purgable block // next = scan->next; - FREEBLOCK(scan); + MM_FreeBlock(scan, mm); last->next = next; scan = next; continue; @@ -948,12 +962,12 @@ void MM_SortMem (void) // // push the non purgable block on top of the last moved block // - if (scan->start != start) + if(scan->start != start) { length = scan->length; source = scan->start; dest = start; - while (length > 0xf00) + while(length > 0xf00) { movedata(source,0,dest,0,0xf00*16); length -= 0xf00; @@ -973,9 +987,9 @@ void MM_SortMem (void) scan = scan->next; // go to next block } - mmrover = mmhead; + mm->mmrover = mm->mmhead; - if (aftersort) + if(aftersort) aftersort(); // VW_ColorBorder (oldborder); @@ -996,7 +1010,7 @@ void MM_SortMem (void) ===================== */ -void MM_ShowMemory (void) +void MM_ShowMemory(mminfo_t *mm) { mmblocktype far *scan; unsigned color,temp;//, i; @@ -1009,7 +1023,7 @@ void MM_ShowMemory (void) //++++mh bufferofs = 0; //**** VW_SetScreen (0,0); - scan = mmhead; + scan = mm->mmhead; end = -1; @@ -1021,9 +1035,9 @@ void MM_ShowMemory (void) color = 5; // dark purple = purgable else color = 9; // medium blue = non purgable - if (scan->attributes & LOCKBIT) + if(scan->attributes & LOCKBIT) color = 12; // red = locked - if (scan->start<=end) + if(scan->start<=end) { printf("MM_ShowMemory: Memory block order currupted!"); return; @@ -1031,7 +1045,7 @@ void MM_ShowMemory (void) end = scan->start+scan->length-1; //++++ VW_Hlin(scan->start,(unsigned)end,0,color); //++++ VW_Plot(scan->start,0,15); - if (scan->next->start > end+1) + if(scan->next->start > end+1) //++++ VW_Hlin(end+1,scan->next->start,0,0); // black = free //****#if 0 @@ -1073,15 +1087,15 @@ fprintf(stdout, "%s", scratch); ====================== */ -dword MM_UnusedMemory (void) +dword MM_UnusedMemory(mminfo_t *mm) { unsigned free; mmblocktype far *scan; free = 0; - scan = mmhead; + scan = mm->mmhead; - while (scan->next) + while(scan->next) { free += scan->next->start - (scan->start + scan->length); scan = scan->next; @@ -1104,17 +1118,17 @@ dword MM_UnusedMemory (void) ====================== */ -dword MM_TotalFree (void) +dword MM_TotalFree(mminfo_t *mm) { unsigned free; mmblocktype far *scan; free = 0; - scan = mmhead; + scan = mm->mmhead; - while (scan->next) + while(scan->next) { - if ((scan->attributes&PURGEBITS) && !(scan->attributes&LOCKBIT)) + if((scan->attributes&PURGEBITS) && !(scan->attributes&LOCKBIT)) free += scan->length; free += scan->next->start - (scan->start + scan->length); scan = scan->next; @@ -1134,19 +1148,19 @@ dword MM_TotalFree (void) ===================== */ -void MM_Report(void) +void MM_Report(mminfo_t *mm, mminfotype *mmi) { - printf("EMM %x available\n", EMSVer); - printf("totalEMSpages=%u\n", totalEMSpages); - printf("freeEMSpages=%u\n", freeEMSpages); - printf("EMSpageframe=%Fp\n", EMSpageframe); - printf("near=%lu\n", mminfo.nearheap); - printf("far=%lu\n", mminfo.farheap); - printf("EMSmem=%lu\n", mminfo.EMSmem); - printf("XMSmem=%lu\n", mminfo.XMSmem); - printf("mainmem=%lu\n", mminfo.mainmem); - printf("UnusedMemory=%lu\n", MM_UnusedMemory()); - printf("TotalFree=%lu\n", MM_TotalFree()); + printf("EMM %x available\n", mm->EMSVer); + printf("totalEMSpages=%u\n", mm->totalEMSpages); + printf("freeEMSpages=%u\n", mm->freeEMSpages); + printf("EMSpageframe=%Fp\n", mm->EMSpageframe); + printf("near=%lu\n", mmi->nearheap); + printf("far=%lu\n", mmi->farheap); + printf("EMSmem=%lu\n", mmi->EMSmem); + printf("XMSmem=%lu\n", mmi->XMSmem); + printf("mainmem=%lu\n", mmi->mainmem); + printf("UnusedMemory=%lu\n", MM_UnusedMemory(mm)); + printf("TotalFree=%lu\n", MM_TotalFree(mm)); // printf("\n"); // printf("UnusedMemory=%lu kb\n", MM_UnusedMemory()/10248); // printf("TotalFree=%lu kb\n", MM_TotalFree()/10248); @@ -1184,7 +1198,28 @@ int MM_EMSVer(void) ===================== */ -void MM_BombOnError (boolean bomb) +void MM_BombOnError(boolean bomb, mminfo_t *mm) { - mminfo.bombonerror = bomb; + mm->bombonerror = bomb; } + +void MM_GetNewBlock(mminfo_t *mm) +{ + if(!mm->mmfree) + MML_ClearBlock(mm); + mm->mmnew=mm->mmfree; + mm->mmfree=mm->mmfree->next; + /*if(!(mm->mmnew=mm->mmfree)) + { + printf("MM_GETNEWBLOCK: No free blocks!"); + return; + } + mm->mmfree=mm->mmfree->next;*/ +} + +void MM_FreeBlock(mmblocktype *x, mminfo_t *mm) +{ + x->useptr=NULL; + x->next=mm->mmfree; + mm->mmfree=x; +} diff --git a/src/lib/16_mm.h b/src/lib/16_mm.h index f16663bf..08a72dd2 100644 --- a/src/lib/16_mm.h +++ b/src/lib/16_mm.h @@ -85,18 +85,18 @@ typedef void __based(__self) * memptr; //__based(seg) * memptr; typedef struct { - dword nearheap,farheap,EMSmem,XMSmem,mainmem; - boolean mmstarted, bombonerror, mmerror; + dword nearheap,farheap/*,hugeheap*/,EMSmem,XMSmem,mainmem; } mminfotype; //========================================================================== /*extern mminfotype mminfo; extern memptr bufferseg; -extern boolean mmerror; +extern boolean mmerror;*/ extern void (* beforesort) (void); -extern void (* aftersort) (void);*/ +extern void (* aftersort) (void); +extern void (* XMSaddr) (void); // far pointer to XMS driver //========================================================================== @@ -124,9 +124,23 @@ typedef struct mmblockstruct } mmblocktype; +typedef struct +{ + memptr bufferseg; + boolean mmstarted, bombonerror, mmerror; + //void huge *hugeheap; + void huge/*far*/ *farheap; + void *nearheap; + unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle; + unsigned int EMSVer; + unsigned numUMBs,UMBbase[MAXUMBS]; + mmblocktype huge mmblocks[MAXBLOCKS],huge *mmhead,huge *mmfree,huge *mmrover,huge *mmnew; +} mminfo_t; + + //#define GETNEWBLOCK {if(!(mmnew=mmfree))Quit("MM_GETNEWBLOCK: No free blocks!");mmfree=mmfree->next;} -#define GETNEWBLOCK {if(!mmfree)MML_ClearBlock();mmnew=mmfree;mmfree=mmfree->next;} -#define FREEBLOCK(x) {*x->useptr=NULL;x->next=mmfree;mmfree=x;} +//#define GETNEWBLOCK {if(!mmfree)MML_ClearBlock();mmnew=mmfree;mmfree=mmfree->next;} +//#define FREEBLOCK(x) {*x->useptr=NULL;x->next=mmfree;mmfree=x;} /* ============================================================================= @@ -167,39 +181,32 @@ static unsigned numUMBs,UMBbase[MAXUMBS];*/ //========================================================================== -void MM_Startup (void); -void MM_Shutdown (void); - -void MM_GetPtr (memptr *baseptr,dword size); -void MM_FreePtr (memptr *baseptr); - -void MM_SetPurge (memptr *baseptr, int purge); -void MM_SetLock (memptr *baseptr, boolean locked); -void MM_SortMem (void); - -void MM_ShowMemory (void); - -dword MM_UnusedMemory (void); -dword MM_TotalFree (void); -void MM_Report(void); -//int MM_EMSVer(void); - -void MM_BombOnError (boolean bomb); - -//========================================================================== - -// -// local prototypes -// - -boolean MML_CheckForEMS (void); -unsigned MML_SetupEMS (void); -void MML_ShutdownEMS (void); -unsigned MM_MapEMS (void); -boolean MML_CheckForXMS (void); -void MML_ShutdownXMS (void); -void MML_UseSpace (unsigned segstart, unsigned seglength); -void MML_ClearBlock (void); +boolean MML_CheckForEMS(void); +unsigned MML_SetupEMS(mminfo_t *mm); +void MML_ShutdownEMS(mminfo_t *mm); +unsigned MM_MapEMS(mminfo_t *mm); +boolean MML_CheckForXMS(mminfo_t *mm); +void MML_SetupXMS(mminfo_t *mm, mminfotype *mmi); +void MML_ShutdownXMS(mminfo_t *mm); +void MML_UseSpace(unsigned segstart, unsigned seglength, mminfo_t *mm); +void MML_ClearBlock(mminfo_t *mm); + +void MM_Startup(mminfo_t *mm, mminfotype *mmi); +void MM_Shutdown(mminfo_t *mm); + +void MM_GetPtr(memptr *baseptr,dword size, mminfo_t *mm, mminfotype *mmi); +void MM_FreePtr(memptr *baseptr, mminfo_t *mm); +void MM_SetPurge(memptr *baseptr, int purge, mminfo_t *mm); +void MM_SetLock(memptr *baseptr, boolean locked, mminfo_t *mm); +void MM_SortMem(mminfo_t *mm); +void MM_ShowMemory(mminfo_t *mm); +dword MM_UnusedMemory(mminfo_t *mm); +dword MM_TotalFree(mminfo_t *mm); +void MM_Report(mminfo_t *mm, mminfotype *mmi); +int MM_EMSVer(void); +void MM_BombOnError(boolean bomb, mminfo_t *mm); +void MM_GetNewBlock(mminfo_t *mm); +void MM_FreeBlock(mmblocktype *x, mminfo_t *mm); //========================================================================== -- 2.39.2