+\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
+typedef struct\r
+{\r
+ boolean MainPresent;\r
+ memptr MainMemPages[PMMaxMainMem];\r
+ PMBlockAttr MainMemUsed[PMMaxMainMem];\r
+ int MainPagesAvail;\r
+} pm_mmi_t;\r
+\r
+// EMS specific variables\r
+typedef struct\r
+{\r
+ boolean EMSPresent;\r
+ unsigned int EMSVer;\r
+ word EMSAvail,EMSPagesAvail,EMSHandle,\r
+ EMSPageFrame,EMSPhysicalPage;\r
+ word totalEMSpages, freeEMSpages, EMSpagesmapped;\r
+ EMSListStruct EMSList[EMSFrameCount];\r
+} pm_emmi_t;\r
+\r
+// XMS specific variables\r
+typedef struct\r
+{\r
+ boolean XMSPresent;\r
+ word XMSAvail,XMSPagesAvail,XMSHandle;//,XMSVer;\r
+ dword XMSDriver;\r
+ int XMSProtectPage;// = -1;\r
+} pm_xmmi_t;\r
+\r
+// File specific variables\r
+typedef struct\r
+{\r
+ char PageFileName[13];// = {"VSWAP."};\r
+ int PageFile;// = -1;\r
+ word ChunksInFile;\r
+ word PMSpriteStart,PMSoundStart;\r
+} pm_fi_t;\r
+\r
+// General usage variables\r
+typedef struct\r
+{\r
+ boolean PMStarted,\r
+ PMPanicMode,\r
+ PMThrashing;\r
+ word XMSPagesUsed,\r
+ EMSPagesUsed,\r
+ MainPagesUsed,\r
+ PMNumBlocks;\r
+ long PMFrameCount;\r
+ PageListStruct far *PMPages;\r
+ __SEGA *PMSegPages;\r
+ pm_mmi_t mm;\r
+ pm_emmi_t emm;\r
+ pm_xmmi_t xmm;\r
+ pm_fi_t fi;\r
+} pm_t;\r
+\r
+//==========================================================================\r
+\r