=============================================================================\r
*/\r
\r
-mminfotype mminfo;\r
-memptr bufferseg;\r
-boolean mmerror;\r
+//mminfo_t mminfo;\r
+//memptr bufferseg;\r
+//boolean mmerror;\r
\r
void (* beforesort) (void);\r
-void (* aftersort) (void);\r
+void (* aftersort) (void);
+void (* XMSaddr) (void); // far pointer to XMS driver\r
\r
/*\r
=============================================================================\r
=============================================================================\r
*/\r
\r
-boolean mmstarted;\r
+//boolean mmstarted;\r
\r
-void far *farheap;\r
-void *nearheap;\r
+//void far *farheap;\r
+//void *nearheap;\r
\r
-mmblocktype far mmblocks[MAXBLOCKS]\r
- ,far *mmhead,far *mmfree,far *mmrover,far *mmnew;\r
+//mmblocktype far mmblocks[MAXBLOCKS],far *mmhead,far *mmfree,far *mmrover,far *mmnew;\r
\r
-boolean bombonerror;\r
+//boolean bombonerror;\r
\r
-unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle;
-unsigned int EMSVer;\r
+//unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle;
+//unsigned int EMSVer;\r
\r
-void (* XMSaddr) (void); // far pointer to XMS driver\r
+//void (* XMSaddr) (void); // far pointer to XMS driver\r
\r
-unsigned numUMBs,UMBbase[MAXUMBS];
+//unsigned numUMBs,UMBbase[MAXUMBS];
static char *ParmStringsexmm[] = {"noems","noxms",""};
\r
=======================\r
*/\r
\r
-boolean MML_CheckForEMS (void)\r
+boolean MML_CheckForEMS(void)\r
{\r
boolean emmcfems;\r
char emmname[] = "EMMXXXX0";\r
=======================\r
*/\r
\r
-unsigned MML_SetupEMS (void)\r
+unsigned MML_SetupEMS(mminfo_t *mm)\r
{\r
char str[80],str2[10];\r
unsigned err;\r
boolean errorflag=false;\r
union REGS CPURegs;\r
\r
- EMSVer = 0;\r
+ unsigned int EMSVer = 0;
+ unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle;\r
totalEMSpages = freeEMSpages = EMSpageframe = EMSpagesmapped = 0;\r
\r
__asm\r
printf("%s\n",str);
return err;\r
}
+ mm->totalEMSpages=totalEMSpages;
+ mm->freeEMSpages=freeEMSpages;
+ mm->EMSpageframe=EMSpageframe;
+ mm->EMSpagesmapped=EMSpagesmapped;
+ mm->EMShandle=EMShandle;
+ mm->EMSVer=EMSVer;
return 0;\r
}\r
\r
=======================\r
*/\r
\r
-void MML_ShutdownEMS (void)\r
+void MML_ShutdownEMS(mminfo_t *mm)\r
{\r
- boolean errorflag=false;\r
- if (!EMShandle)\r
+ boolean errorflag=false;
+ unsigned EMShandle=mm->EMShandle;
+
+ if(!EMShandle)\r
return;\r
__asm\r
{\r
====================\r
*/\r
\r
-unsigned MM_MapEMS (void)\r
+unsigned MM_MapEMS(mminfo_t *mm)\r
{\r
char str[80],str2[10];\r
- unsigned err;\r
+ unsigned err, EMShandle;\r
boolean errorflag=false;\r
int i;\r
- union REGS CPURegs;\r
+ union REGS CPURegs;
+ EMShandle=mm->EMShandle;\r
\r
- for (i=0;i<EMSpagesmapped;i++)\r
+ for (i=0;i<mm->EMSpagesmapped;i++)\r
{\r
__asm\r
{\r
=======================\r
*/\r
\r
-boolean MML_CheckForXMS (void)\r
+boolean MML_CheckForXMS(mminfo_t *mm)\r
{\r
boolean errorflag=false;\r
- numUMBs = 0;\r
+ mm->numUMBs = 0;\r
\r
__asm\r
{\r
=======================\r
*/\r
\r
-void MML_SetupXMS (void)\r
+void MML_SetupXMS(mminfo_t *mm, mminfotype *mmi)\r
{\r
unsigned base,size;\r
\r
mov [size],dx\r
done:\r
}\r
- MML_UseSpace (base,size);\r
- mminfo.XMSmem += size*16;\r
- UMBbase[numUMBs] = base;\r
- numUMBs++;\r
- if (numUMBs < MAXUMBS)\r
+ MML_UseSpace(base,size, mm);\r
+ mmi->XMSmem += size*16;\r
+ mm->UMBbase[mm->numUMBs] = base;\r
+ mm->numUMBs++;\r
+ if(mm->numUMBs < MAXUMBS)\r
goto getmemory;\r
}\r
\r
======================\r
*/\r
\r
-void MML_ShutdownXMS (void)\r
+void MML_ShutdownXMS(mminfo_t *mm)\r
{\r
int i;\r
- unsigned base;\r
+ unsigned base;
\r
- for (i=0;i<numUMBs;i++)\r
+ for (i=0;i<mm->numUMBs;i++)\r
{\r
- base = UMBbase[i];\r
+ base = mm->UMBbase[i];\r
__asm\r
{\r
mov ah,XMS_FREEUMB\r
======================\r
*/\r
\r
-void MML_UseSpace (unsigned segstart, unsigned seglength)\r
+void MML_UseSpace(unsigned segstart, unsigned seglength, mminfo_t *mm)\r
{\r
mmblocktype far *scan,far *last;\r
unsigned oldend;\r
long extra;\r
\r
- scan = last = mmhead;\r
- mmrover = mmhead; // reset rover to start of memory\r
+ scan = last = mm->mmhead;\r
+ mm->mmrover = mm->mmhead; // reset rover to start of memory\r
\r
//\r
// search for the block that contains the range of segments\r
//\r
- while (scan->start+scan->length < segstart)\r
+ while(scan->start+scan->length < segstart)\r
{\r
last = scan;\r
scan = scan->next;\r
//\r
oldend = scan->start + scan->length;\r
extra = oldend - (segstart+seglength);\r
- if (extra < 0)\r
+ if(extra < 0)\r
{\r
printf("MML_UseSpace: Segment spans two blocks!");\r
return;\r
if (segstart == scan->start)\r
{\r
last->next = scan->next; // unlink block\r
- FREEBLOCK(scan);\r
+ MM_FreeBlock(scan, mm);\r
scan = last;\r
}\r
else\r
\r
if (extra > 0)\r
{\r
- GETNEWBLOCK;\r
- mmnew->next = scan->next;\r
- scan->next = mmnew;\r
- mmnew->start = segstart+seglength;\r
- mmnew->length = extra;\r
- mmnew->attributes = LOCKBIT;\r
+ MM_GetNewBlock(mm);\r
+ mm->mmnew->next = scan->next;\r
+ scan->next = mm->mmnew;\r
+ mm->mmnew->start = segstart+seglength;\r
+ mm->mmnew->length = extra;\r
+ mm->mmnew->attributes = LOCKBIT;\r
}\r
\r
}\r
====================\r
*/\r
\r
-void MML_ClearBlock (void)\r
+void MML_ClearBlock(mminfo_t *mm)\r
{\r
mmblocktype far *scan,far *last;\r
\r
- scan = mmhead->next;\r
+ scan = mm->mmhead->next;\r
\r
- while (scan)\r
+ while(scan)\r
{\r
- if (!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS) )\r
+ if(!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS))\r
{\r
- MM_FreePtr(scan->useptr);\r
+ MM_FreePtr(scan->useptr, mm);\r
return;\r
}\r
scan = scan->next;\r
===================\r
*/\r
\r
-void MM_Startup (void)\r
+void MM_Startup(mminfo_t *mm, mminfotype *mmi)\r
{\r
int i;\r
dword length;\r
- void far *start;\r
- unsigned segstart,seglength,endfree;\r
-\r
- if (mminfo.mmstarted)\r
- MM_Shutdown ();\r
+ void far *start;\r
+ unsigned segstart,seglength,endfree;\r
\r
+ if(mm->mmstarted)\r
+ MM_Shutdown(mm);\r
\r
- mminfo.mmstarted = true;\r
- mminfo.bombonerror = true;\r
+ mm->mmstarted = true;\r
+ mm->bombonerror = true;\r
//\r
// set up the linked list (everything in the free list;\r
//\r
- mmhead = NULL;\r
- mmfree = &mmblocks[0];\r
- for (i=0;i<MAXBLOCKS-1;i++)\r
- mmblocks[i].next = &mmblocks[i+1];\r
- mmblocks[i].next = NULL;\r
+ mm->mmhead = NULL;\r
+ mm->mmfree = &(mm->mmblocks[0]);\r
+ for(i=0;i<MAXBLOCKS-1;i++)
+ {
+ mm->mmblocks[i].next = &(mm->mmblocks[i+1]);
+ }\r
+ mm->mmblocks[i].next = NULL;\r
\r
//\r
// locked block of all memory until we punch out free space\r
//\r
- GETNEWBLOCK;\r
- mmhead = mmnew; // this will allways be the first node\r
- mmnew->start = 0;\r
- mmnew->length = 0xffff;\r
- mmnew->attributes = LOCKBIT;\r
- mmnew->next = NULL;\r
- mmrover = mmhead;\r
+ //GETNEWBLOCK;
+ MM_GetNewBlock(mm);\r
+ mm->mmhead = mm->mmnew; // this will allways be the first node\r
+ mm->mmnew->start = 0;\r
+ mm->mmnew->length = 0xffff;\r
+ mm->mmnew->attributes = LOCKBIT;\r
+ mm->mmnew->next = NULL;\r
+ mm->mmrover = mm->mmhead;\r
\r
\r
//\r
// get all available near conventional memory segments\r
//\r
-//---- length=coreleft();\r
+//---- length=coreleft();
_nheapgrow();\r
length=_memavl();\r
- start = (void far *)(nearheap = malloc(length));\r
+ start = (void far *)(mm->nearheap = malloc(length));\r
\r
length -= 16-(FP_OFF(start)&15);\r
length -= SAVENEARHEAP;\r
seglength = length / 16; // now in paragraphs\r
segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;\r
- MML_UseSpace (segstart,seglength);\r
- mminfo.nearheap = length;\r
+ MML_UseSpace(segstart,seglength, mm);\r
+ mmi->nearheap = length;\r
\r
//\r
// get all available far conventional memory segments\r
//\r
-//---- length=farcoreleft();\r
+//---- length=farcoreleft();
_fheapgrow();\r
length=_memavl();\r
- start = farheap = _fmalloc(length);\r
+ start = mm->farheap = _fmalloc(length);\r
length -= 16-(FP_OFF(start)&15);\r
length -= SAVEFARHEAP;\r
seglength = length / 16; // now in paragraphs\r
segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;\r
- MML_UseSpace (segstart,seglength);\r
- mminfo.farheap = length;\r
- mminfo.mainmem = mminfo.nearheap + mminfo.farheap;\r
+ MML_UseSpace(segstart,seglength, mm);\r
+ mmi->farheap = length;\r
+ mmi->mainmem = mmi->nearheap + mmi->farheap;\r
\r
\r
//\r
// detect EMS and allocate up to 64K at page frame\r
//\r
- mminfo.EMSmem = 0;\r
- for (i = 1;i < __argc;i++)\r
+ mmi->EMSmem = 0;\r
+ for(i = 1;i < __argc;i++)\r
{\r
- if ( US_CheckParm(__argv[i],ParmStringsexmm) == 0)\r
+ if(US_CheckParm(__argv[i],ParmStringsexmm) == 0)\r
goto emsskip; // param NOEMS\r
}\r
\r
- if (MML_CheckForEMS())\r
+ if(MML_CheckForEMS())\r
{\r
- //printf("EMS1\n");\r
- MML_SetupEMS(); // allocate space\r
- //printf("EMS2\n");\r
- MML_UseSpace (EMSpageframe,EMSpagesmapped*0x400);\r
- //printf("EMS3\n");\r
- MM_MapEMS(); // map in used pages\r
- //printf("EMS4\n");\r
- mminfo.EMSmem = EMSpagesmapped*0x4000l;\r
+ printf("EMS1\n");\r
+ MML_SetupEMS(mm); // allocate space\r
+ printf("EMS2\n");
+printf("segstart=%x\n", segstart);
+printf("mm->EMSpageframe=%x\n", mm->EMSpageframe);
+ MML_UseSpace(mm->EMSpageframe,mm->EMSpagesmapped*0x400, mm);\r
+ printf("EMS3\n");\r
+ MM_MapEMS(mm); // map in used pages\r
+ printf("EMS4\n");\r
+ mmi->EMSmem = mm->EMSpagesmapped*0x4000l;\r
}\r
\r
//\r
// detect XMS and get upper memory blocks\r
//\r
emsskip:\r
- mminfo.XMSmem = 0;\r
- for (i = 1;i < __argc;i++)\r
+ mmi->XMSmem = 0;\r
+ for(i = 1;i < __argc;i++)\r
{\r
if ( US_CheckParm(__argv[i],ParmStringsexmm) == 0)\r
goto xmsskip; // param NOXMS\r
}\r
\r
- if (MML_CheckForXMS())\r
+ if(MML_CheckForXMS(mm))\r
{\r
// printf("XMS!\n");\r
-//++++ MML_SetupXMS(); // allocate as many UMBs as possible\r
+//++++ MML_SetupXMS(mm, mmi); // allocate as many UMBs as possible\r
}\r
\r
//\r
// allocate the misc buffer\r
//\r
xmsskip:\r
- mmrover = mmhead; // start looking for space after low block\r
+ mm->mmrover = mm->mmhead; // start looking for space after low block\r
\r
- MM_GetPtr (&bufferseg,BUFFERSIZE);\r
+ MM_GetPtr(&(mm->bufferseg),BUFFERSIZE, mm, mmi);\r
}\r
\r
//==========================================================================\r
====================\r
*/\r
\r
-void MM_Shutdown (void)\r
+void MM_Shutdown(mminfo_t *mm)\r
{\r
- if (!mminfo.mmstarted)\r
- return;\r
-\r
- _ffree (farheap);
- printf("far freed\n");\r
- free (nearheap);
- printf("near freed\n");\r
- //hfree(hugeheap);
- printf("huge freed\n");\r
- MML_ShutdownEMS ();
- printf("EMS freed\n");\r
-//++++ MML_ShutdownXMS ();
- printf("XMS freed\n");\r
+ if(!(mm->mmstarted))\r
+ return;\r
+\r
+ _ffree(mm->farheap);
+ printf("far freed\n");\r
+ free(mm->nearheap);
+ printf("near freed\n");\r
+ //hfree(mm->hugeheap);
+ //printf("huge freed\n");\r
+ MML_ShutdownEMS(mm);
+ printf("EMS freed\n");\r
+//++++ MML_ShutdownXMS(mm);
+// printf("XMS freed\n");\r
}\r
\r
//==========================================================================\r
====================\r
*/\r
\r
-void MM_GetPtr (memptr *baseptr,dword size)\r
+void MM_GetPtr(memptr *baseptr,dword size, mminfo_t *mm, mminfotype *mmi)\r
{\r
mmblocktype far *scan,far *lastscan,far *endscan\r
,far *purge,far *next;\r
\r
needed = (size+15)/16; // convert size from bytes to paragraphs\r
\r
- GETNEWBLOCK; // fill in start and next after a spot is found\r
- mmnew->length = needed;\r
- mmnew->useptr = baseptr;\r
- mmnew->attributes = BASEATTRIBUTES;\r
+ MM_GetNewBlock(mm); // fill in start and next after a spot is found\r
+ mm->mmnew->length = needed;\r
+ mm->mmnew->useptr = baseptr;\r
+ mm->mmnew->attributes = BASEATTRIBUTES;\r
\r
- for (search = 0; search<3; search++)\r
+ for(search = 0; search<3; search++)\r
{\r
//\r
// first search: try to allocate right after the rover, then on up\r
// second search: search from the head pointer up to the rover\r
// third search: compress memory, then scan from start\r
- if (search == 1 && mmrover == mmhead)\r
+ if(search == 1 && mm->mmrover == mm->mmhead)\r
search++;\r
\r
- switch (search)\r
+ switch(search)\r
{\r
case 0:\r
- lastscan = mmrover;\r
- scan = mmrover->next;\r
+ lastscan = mm->mmrover;\r
+ scan = mm->mmrover->next;\r
endscan = NULL;\r
break;\r
case 1:\r
- lastscan = mmhead;\r
- scan = mmhead->next;\r
- endscan = mmrover;\r
+ lastscan = mm->mmhead;\r
+ scan = mm->mmhead->next;\r
+ endscan = mm->mmrover;\r
break;\r
case 2:\r
- MM_SortMem ();\r
- lastscan = mmhead;\r
- scan = mmhead->next;\r
+ MM_SortMem(mm);\r
+ lastscan = mm->mmhead;\r
+ scan = mm->mmhead->next;\r
endscan = NULL;\r
break;\r
}\r
\r
startseg = lastscan->start + lastscan->length;\r
\r
- while (scan != endscan)\r
+ while(scan != endscan)\r
{\r
- if (scan->start - startseg >= needed)\r
+ if(scan->start - startseg >= needed)\r
{\r
//\r
// got enough space between the end of lastscan and\r
// and allocate the new block\r
//\r
purge = lastscan->next;\r
- lastscan->next = mmnew;\r
- mmnew->start = *(unsigned *)baseptr = startseg;\r
- mmnew->next = scan;\r
- while ( purge != scan)\r
+ lastscan->next = mm->mmnew;\r
+ mm->mmnew->start = *(unsigned *)baseptr = startseg;\r
+ mm->mmnew->next = scan;\r
+ while(purge != scan)\r
{ // free the purgable block\r
next = purge->next;\r
- FREEBLOCK(purge);\r
+ MM_FreeBlock(purge, mm);\r
purge = next; // purge another if not at scan\r
}\r
- mmrover = mmnew;\r
+ mm->mmrover = mm->mmnew;\r
return; // good allocation!\r
}\r
\r
//\r
// if this block is purge level zero or locked, skip past it\r
//\r
- if ( (scan->attributes & LOCKBIT)\r
+ if((scan->attributes & LOCKBIT)\r
|| !(scan->attributes & PURGEBITS) )\r
{\r
lastscan = scan;\r
}\r
}\r
\r
- if (mminfo.bombonerror)\r
- printf(OUT_OF_MEM_MSG,(size-mminfo.nearheap));\r
+ if (mm->bombonerror)\r
+ printf(OUT_OF_MEM_MSG,(size-mmi->nearheap));\r
else\r
- mminfo.mmerror = true;\r
+ mm->mmerror = true;\r
}\r
\r
//==========================================================================\r
====================\r
*/\r
\r
-void MM_FreePtr (memptr *baseptr)\r
+void MM_FreePtr(memptr *baseptr, mminfo_t *mm)\r
{\r
mmblocktype far *scan,far *last;\r
\r
- last = mmhead;\r
+ last = mm->mmhead;\r
scan = last->next;\r
\r
- if (baseptr == mmrover->useptr) // removed the last allocated block\r
- mmrover = mmhead;\r
+ if(baseptr == mm->mmrover->useptr) // removed the last allocated block\r
+ mm->mmrover = mm->mmhead;\r
\r
- while (scan->useptr != baseptr && scan)\r
+ while(scan->useptr != baseptr && scan)\r
{\r
last = scan;\r
scan = scan->next;\r
}\r
\r
- if (!scan)\r
+ if(!scan)\r
{\r
printf("MM_FreePtr: Block not found!");\r
return;\r
\r
last->next = scan->next;\r
\r
- FREEBLOCK(scan);\r
+ MM_FreeBlock(scan, mm);\r
}\r
//==========================================================================\r
\r
=====================\r
*/\r
\r
-void MM_SetPurge (memptr *baseptr, int purge)\r
+void MM_SetPurge(memptr *baseptr, int purge, mminfo_t *mm)\r
{\r
mmblocktype far *start;\r
\r
- start = mmrover;\r
+ start = mm->mmrover;\r
\r
do\r
{\r
- if (mmrover->useptr == baseptr)\r
+ if(mm->mmrover->useptr == baseptr)\r
break;\r
\r
- mmrover = mmrover->next;\r
+ mm->mmrover = mm->mmrover->next;\r
\r
- if (!mmrover)\r
- mmrover = mmhead;\r
- else if (mmrover == start)\r
+ if(!mm->mmrover)\r
+ mm->mmrover = mm->mmhead;\r
+ else if(mm->mmrover == start)\r
{\r
printf("MM_SetPurge: Block not found!");\r
return;\r
}\r
\r
- } while (1);\r
+ } while(1);\r
\r
- mmrover->attributes &= ~PURGEBITS;\r
- mmrover->attributes |= purge;\r
+ mm->mmrover->attributes &= ~PURGEBITS;\r
+ mm->mmrover->attributes |= purge;\r
}\r
\r
//==========================================================================\r
=====================\r
*/\r
\r
-void MM_SetLock (memptr *baseptr, boolean locked)\r
+void MM_SetLock(memptr *baseptr, boolean locked, mminfo_t *mm)\r
{\r
mmblocktype far *start;\r
\r
- start = mmrover;\r
+ start = mm->mmrover;\r
\r
do\r
{\r
- if (mmrover->useptr == baseptr)\r
+ if(mm->mmrover->useptr == baseptr)\r
break;\r
\r
- mmrover = mmrover->next;\r
+ mm->mmrover = mm->mmrover->next;\r
\r
- if (!mmrover)\r
- mmrover = mmhead;\r
- else if (mmrover == start)\r
+ if(!mm->mmrover)\r
+ mm->mmrover = mm->mmhead;\r
+ else if(mm->mmrover == start)\r
{\r
printf("MM_SetLock: Block not found!");\r
return;\r
}\r
\r
- } while (1);\r
+ } while(1);\r
\r
- mmrover->attributes &= ~LOCKBIT;\r
- mmrover->attributes |= locked*LOCKBIT;\r
+ mm->mmrover->attributes &= ~LOCKBIT;\r
+ mm->mmrover->attributes |= locked*LOCKBIT;\r
}\r
\r
//==========================================================================\r
=====================\r
*/\r
\r
-void MM_SortMem (void)\r
+void MM_SortMem(mminfo_t *mm)\r
{\r
mmblocktype far *scan,far *last,far *next;\r
unsigned start,length,source,dest,oldborder;\r
// oldborder = bordercolor;\r
// VW_ColorBorder (15);\r
\r
- if (beforesort)\r
+ if(beforesort)\r
beforesort();\r
\r
- scan = mmhead;\r
+ scan = mm->mmhead;\r
\r
last = NULL; // shut up compiler warning\r
\r
- while (scan)\r
+ while(scan)\r
{\r
- if (scan->attributes & LOCKBIT)\r
+ if(scan->attributes & LOCKBIT)\r
{\r
//\r
// block is locked, so try to pile later blocks right after it\r
}\r
else\r
{\r
- if (scan->attributes & PURGEBITS)\r
+ if(scan->attributes & PURGEBITS)\r
{\r
//\r
// throw out the purgable block\r
//\r
next = scan->next;\r
- FREEBLOCK(scan);\r
+ MM_FreeBlock(scan, mm);\r
last->next = next;\r
scan = next;\r
continue;\r
//\r
// push the non purgable block on top of the last moved block\r
//\r
- if (scan->start != start)\r
+ if(scan->start != start)\r
{\r
length = scan->length;\r
source = scan->start;\r
dest = start;\r
- while (length > 0xf00)\r
+ while(length > 0xf00)\r
{\r
movedata(source,0,dest,0,0xf00*16);\r
length -= 0xf00;\r
scan = scan->next; // go to next block\r
}\r
\r
- mmrover = mmhead;\r
+ mm->mmrover = mm->mmhead;\r
\r
- if (aftersort)\r
+ if(aftersort)\r
aftersort();\r
\r
// VW_ColorBorder (oldborder);\r
=====================\r
*/\r
\r
-void MM_ShowMemory (void)\r
+void MM_ShowMemory(mminfo_t *mm)\r
{\r
mmblocktype far *scan;\r
unsigned color,temp;//, i;\r
//++++mh bufferofs = 0;\r
//**** VW_SetScreen (0,0);\r
\r
- scan = mmhead;\r
+ scan = mm->mmhead;\r
\r
end = -1;\r
\r
color = 5; // dark purple = purgable\r
else\r
color = 9; // medium blue = non purgable\r
- if (scan->attributes & LOCKBIT)\r
+ if(scan->attributes & LOCKBIT)\r
color = 12; // red = locked\r
- if (scan->start<=end)\r
+ if(scan->start<=end)\r
{\r
printf("MM_ShowMemory: Memory block order currupted!");\r
return;\r
end = scan->start+scan->length-1;\r
//++++ VW_Hlin(scan->start,(unsigned)end,0,color);\r
//++++ VW_Plot(scan->start,0,15);\r
- if (scan->next->start > end+1)\r
+ if(scan->next->start > end+1)\r
//++++ VW_Hlin(end+1,scan->next->start,0,0); // black = free\r
\r
//****#if 0\r
======================\r
*/\r
\r
-dword MM_UnusedMemory (void)\r
+dword MM_UnusedMemory(mminfo_t *mm)\r
{\r
unsigned free;\r
mmblocktype far *scan;\r
\r
free = 0;\r
- scan = mmhead;\r
+ scan = mm->mmhead;\r
\r
- while (scan->next)\r
+ while(scan->next)\r
{\r
free += scan->next->start - (scan->start + scan->length);\r
scan = scan->next;\r
======================\r
*/\r
\r
-dword MM_TotalFree (void)\r
+dword MM_TotalFree(mminfo_t *mm)\r
{\r
unsigned free;\r
mmblocktype far *scan;\r
\r
free = 0;\r
- scan = mmhead;\r
+ scan = mm->mmhead;\r
\r
- while (scan->next)\r
+ while(scan->next)\r
{\r
- if ((scan->attributes&PURGEBITS) && !(scan->attributes&LOCKBIT))\r
+ if((scan->attributes&PURGEBITS) && !(scan->attributes&LOCKBIT))\r
free += scan->length;\r
free += scan->next->start - (scan->start + scan->length);\r
scan = scan->next;\r
=====================\r
*/\r
\r
-void MM_Report(void)\r
+void MM_Report(mminfo_t *mm, mminfotype *mmi)\r
{\r
- printf("EMM %x available\n", EMSVer);\r
- printf("totalEMSpages=%u\n", totalEMSpages);\r
- printf("freeEMSpages=%u\n", freeEMSpages);\r
- printf("EMSpageframe=%Fp\n", EMSpageframe);\r
- printf("near=%lu\n", mminfo.nearheap);\r
- printf("far=%lu\n", mminfo.farheap);\r
- printf("EMSmem=%lu\n", mminfo.EMSmem);\r
- printf("XMSmem=%lu\n", mminfo.XMSmem);\r
- printf("mainmem=%lu\n", mminfo.mainmem);\r
- printf("UnusedMemory=%lu\n", MM_UnusedMemory());\r
- printf("TotalFree=%lu\n", MM_TotalFree());\r
+ printf("EMM %x available\n", mm->EMSVer);\r
+ printf("totalEMSpages=%u\n", mm->totalEMSpages);\r
+ printf("freeEMSpages=%u\n", mm->freeEMSpages);\r
+ printf("EMSpageframe=%Fp\n", mm->EMSpageframe);\r
+ printf("near=%lu\n", mmi->nearheap);\r
+ printf("far=%lu\n", mmi->farheap);\r
+ printf("EMSmem=%lu\n", mmi->EMSmem);\r
+ printf("XMSmem=%lu\n", mmi->XMSmem);\r
+ printf("mainmem=%lu\n", mmi->mainmem);\r
+ printf("UnusedMemory=%lu\n", MM_UnusedMemory(mm));\r
+ printf("TotalFree=%lu\n", MM_TotalFree(mm));\r
// printf("\n");\r
// printf("UnusedMemory=%lu kb\n", MM_UnusedMemory()/10248);\r
// printf("TotalFree=%lu kb\n", MM_TotalFree()/10248);\r
=====================\r
*/\r
\r
-void MM_BombOnError (boolean bomb)\r
+void MM_BombOnError(boolean bomb, mminfo_t *mm)\r
{\r
- mminfo.bombonerror = bomb;\r
+ mm->bombonerror = bomb;\r
}\r
+
+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;
+}