+//from 16_mm\r
+//==========================================================================\r
+\r
+#define MAXBLOCKS 1024\r
+#define MAXUMBS 12\r
+\r
+typedef struct mmblockstruct\r
+{\r
+ word start,length;\r
+ //word start; dword length;\r
+ word blob; //for data larger than 64k\r
+ unsigned attributes;\r
+ memptr *useptr; // pointer to the segment start\r
+ //huge struct mmblockstruct huge *next;\r
+ struct mmblockstruct far *next;\r
+} mmblocktype;\r
+\r
+typedef struct\r
+{\r
+ dword nearheap,farheap,EMSmem,XMSmem,mainmem;\r
+// boolean PMStarted, MainPresent, EMSPresent, XMSPresent;\r
+} mminfotype;\r
+\r
+typedef struct\r
+{\r
+ memptr bufferseg;\r
+ boolean mmstarted, bombonerror, mmerror;\r
+ //huge void huge *farheap;\r
+ void far *farheap;\r
+#ifdef __BORLANDC__\r
+ void *nearheap;\r
+#endif\r
+#ifdef __WATCOMC__\r
+ void __near *nearheap;\r
+#endif\r
+ unsigned int EMSVer;\r
+ word numUMBs,UMBbase[MAXUMBS];\r
+ word totalEMSpages, freeEMSpages, EMSpagesmapped, EMSHandle, EMSPageFrame;\r
+ //dword numUMBs,UMBbase[MAXUMBS];\r
+ //huge mmblocktype huge mmblocks[MAXBLOCKS],huge *mmhead,huge *mmfree,huge *mmrover,huge *mmnew;\r
+ mmblocktype far mmblocks[MAXBLOCKS],far *mmhead,far *mmfree,far *mmrover,far *mmnew;\r
+} mminfo_t;\r
+\r
+//==========================================================================\r
+\r
+\r
+//from 16_pm\r
+//==========================================================================\r
+\r
+// NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024\r
+#define EMSPageSize 16384\r
+#define EMSPageSizeSeg (EMSPageSize >> 4)\r
+#define EMSPageSizeKB (EMSPageSize >> 10)\r
+#define EMSFrameCount 4\r
+#define PMPageSize 4096\r
+#define PMPageSizeSeg (PMPageSize >> 4)\r
+#define PMPageSizeKB (PMPageSize >> 10)\r
+#define PMEMSSubPage (EMSPageSize / PMPageSize)\r
+\r
+#define PMMinMainMem 10 // Min acceptable # of pages from main\r
+#define PMMaxMainMem 100 // Max number of pages in main memory\r
+\r
+#define PMThrashThreshold 1 // Number of page thrashes before panic mode\r
+#define PMUnThrashThreshold 5 // Number of non-thrashing frames before leaving panic mode\r
+\r
+typedef enum\r
+ {\r
+ pml_Unlocked,\r
+ pml_Locked\r
+ } PMLockType;\r
+\r
+typedef enum\r
+ {\r
+ pmba_Unused = 0,\r
+ pmba_Used = 1,\r
+ pmba_Allocated = 2\r
+ } PMBlockAttr;\r
+\r
+typedef struct\r
+ {\r
+ dword offset; // Offset of chunk into file\r
+ word length; // Length of the chunk\r
+\r
+ int xmsPage; // If in XMS, (xmsPage * PMPageSize) gives offset into XMS handle\r
+\r
+ PMLockType locked; // If set, this page can't be purged\r
+ int emsPage; // If in EMS, logical page/offset into page\r
+ int mainPage; // If in Main, index into handle array\r
+\r
+ dword lastHit; // Last frame number of hit\r
+ } PageListStruct;\r
+\r
+typedef struct\r
+ {\r
+ int baseEMSPage; // Base EMS page for this phys frame\r
+ dword lastHit; // Last frame number of hit\r
+ } EMSListStruct;\r
+\r
+// Main Mem specific variables\r