]> 4ch.mooo.com Git - 16.git/commitdiff
exmm lib done~
authorsparky4 <sparky4@cock.li>
Thu, 2 Jul 2015 01:13:01 +0000 (20:13 -0500)
committersparky4 <sparky4@cock.li>
Thu, 2 Jul 2015 01:13:01 +0000 (20:13 -0500)
modified:   exmmtest.exe
modified:   src/exmmtest.c
modified:   src/lib/16_mm.c
modified:   src/lib/16_mm.h

exmmtest.exe
src/exmmtest.c
src/lib/16_mm.c
src/lib/16_mm.h

index 1f7b40979252316ab4c0463837f84752472b1515..cdfd0d19b164c98070cc582521f0d554acf1af70 100644 (file)
Binary files a/exmmtest.exe and b/exmmtest.exe differ
index b950051b119286d5a6f553857d4a81fed4dda77b..24229f7d3f8e6cc59679c0c88950ebed7e702824 100644 (file)
 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");
 }
index 111b696de77ef4715f84b59ae84e3f93d2253bc5..6cc35149706caff9a89ab4343841abbc449f9dff 100644 (file)
@@ -52,12 +52,13 @@ EMS / XMS unmanaged routines
 =============================================================================\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
@@ -67,22 +68,21 @@ void                (* aftersort) (void);
 =============================================================================\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
@@ -96,7 +96,7 @@ static        char *ParmStringsexmm[] = {"noems","noxms",""};
 =======================\r
 */\r
 \r
-boolean MML_CheckForEMS (void)\r
+boolean MML_CheckForEMS(void)\r
 {\r
        boolean emmcfems;\r
        char    emmname[] = "EMMXXXX0";\r
@@ -150,14 +150,15 @@ boolean MML_CheckForEMS (void)
 =======================\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
@@ -217,6 +218,12 @@ End:
                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
@@ -229,10 +236,12 @@ End:
 =======================\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
@@ -259,15 +268,16 @@ void MML_ShutdownEMS (void)
 ====================\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
@@ -308,10 +318,10 @@ unsigned MM_MapEMS (void)
 =======================\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
@@ -337,7 +347,7 @@ boolean MML_CheckForXMS (void)
 =======================\r
 */\r
 \r
-void MML_SetupXMS (void)\r
+void MML_SetupXMS(mminfo_t *mm, mminfotype *mmi)\r
 {\r
        unsigned        base,size;\r
 \r
@@ -370,11 +380,11 @@ gotone:
                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
@@ -387,14 +397,14 @@ done:
 ======================\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
@@ -418,19 +428,19 @@ void MML_ShutdownXMS (void)
 ======================\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
@@ -441,7 +451,7 @@ void MML_UseSpace (unsigned segstart, unsigned seglength)
 //\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
@@ -451,7 +461,7 @@ void MML_UseSpace (unsigned segstart, unsigned seglength)
        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
@@ -459,12 +469,12 @@ void MML_UseSpace (unsigned segstart, unsigned seglength)
 \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
@@ -481,17 +491,17 @@ void MML_UseSpace (unsigned segstart, unsigned seglength)
 ====================\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
@@ -514,117 +524,121 @@ void MML_ClearBlock (void)
 ===================\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
@@ -639,21 +653,21 @@ xmsskip:
 ====================\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
@@ -668,7 +682,7 @@ void MM_Shutdown (void)
 ====================\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
@@ -677,45 +691,45 @@ void MM_GetPtr (memptr *baseptr,dword size)
 \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
@@ -723,23 +737,23 @@ void MM_GetPtr (memptr *baseptr,dword size)
                        // 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
@@ -751,10 +765,10 @@ void MM_GetPtr (memptr *baseptr,dword size)
                }\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
@@ -769,23 +783,23 @@ void MM_GetPtr (memptr *baseptr,dword size)
 ====================\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
@@ -793,7 +807,7 @@ void MM_FreePtr (memptr *baseptr)
 \r
        last->next = scan->next;\r
 \r
-       FREEBLOCK(scan);\r
+       MM_FreeBlock(scan, mm);\r
 }\r
 //==========================================================================\r
 \r
@@ -807,31 +821,31 @@ void MM_FreePtr (memptr *baseptr)
 =====================\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
@@ -846,31 +860,31 @@ void MM_SetPurge (memptr *baseptr, int purge)
 =====================\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
@@ -885,7 +899,7 @@ void MM_SetLock (memptr *baseptr, boolean locked)
 =====================\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
@@ -914,16 +928,16 @@ void MM_SortMem (void)
 //     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
@@ -932,13 +946,13 @@ void MM_SortMem (void)
                }\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
@@ -948,12 +962,12 @@ void MM_SortMem (void)
                        //\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
@@ -973,9 +987,9 @@ void MM_SortMem (void)
                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
@@ -996,7 +1010,7 @@ void MM_SortMem (void)
 =====================\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
@@ -1009,7 +1023,7 @@ void MM_ShowMemory (void)
 //++++mh       bufferofs = 0;\r
 //**** VW_SetScreen (0,0);\r
 \r
-       scan = mmhead;\r
+       scan = mm->mmhead;\r
 \r
        end = -1;\r
 \r
@@ -1021,9 +1035,9 @@ void MM_ShowMemory (void)
                        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
@@ -1031,7 +1045,7 @@ void MM_ShowMemory (void)
                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
@@ -1073,15 +1087,15 @@ fprintf(stdout, "%s", scratch);
 ======================\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
@@ -1104,17 +1118,17 @@ dword MM_UnusedMemory (void)
 ======================\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
@@ -1134,19 +1148,19 @@ dword MM_TotalFree (void)
 =====================\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
@@ -1184,7 +1198,28 @@ int MM_EMSVer(void)
 =====================\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;
+}
index f16663bf06d329106cb03b8a34bdaa21db5f3bac..08a72dd216a00413490b78c04083c1958b60f1f7 100644 (file)
@@ -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;\r
+       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);\r
+unsigned MML_SetupEMS(mminfo_t *mm);\r
+void MML_ShutdownEMS(mminfo_t *mm);\r
+unsigned MM_MapEMS(mminfo_t *mm);\r
+boolean MML_CheckForXMS(mminfo_t *mm);\r
+void MML_SetupXMS(mminfo_t *mm, mminfotype *mmi);
+void MML_ShutdownXMS(mminfo_t *mm);\r
+void MML_UseSpace(unsigned segstart, unsigned seglength, mminfo_t *mm);\r
+void MML_ClearBlock(mminfo_t *mm);
+\r
+void MM_Startup(mminfo_t *mm, mminfotype *mmi);\r
+void MM_Shutdown(mminfo_t *mm);
+\r
+void MM_GetPtr(memptr *baseptr,dword size, mminfo_t *mm, mminfotype *mmi);\r
+void MM_FreePtr(memptr *baseptr, mminfo_t *mm);\r
+void MM_SetPurge(memptr *baseptr, int purge, mminfo_t *mm);\r
+void MM_SetLock(memptr *baseptr, boolean locked, mminfo_t *mm);\r
+void MM_SortMem(mminfo_t *mm);\r
+void MM_ShowMemory(mminfo_t *mm);\r
+dword MM_UnusedMemory(mminfo_t *mm);\r
+dword MM_TotalFree(mminfo_t *mm);\r
+void MM_Report(mminfo_t *mm, mminfotype *mmi);\r
+int MM_EMSVer(void);\r
+void MM_BombOnError(boolean bomb, mminfo_t *mm);
+void MM_GetNewBlock(mminfo_t *mm);
+void MM_FreeBlock(mmblocktype *x, mminfo_t *mm);
 
 //==========================================================================