--- /dev/null
+//\r
+// ID_PM.H\r
+// Header file for Id Engine's Page Manager\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
+ longword 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
+ longword lastHit; // Last frame number of hit\r
+ } PageListStruct;\r
+\r
+typedef struct\r
+ {\r
+ int baseEMSPage; // Base EMS page for this phys frame\r
+ longword lastHit; // Last frame number of hit\r
+ } EMSListStruct;\r
+\r
+extern boolean XMSPresent,EMSPresent;\r
+extern word XMSPagesAvail,EMSPagesAvail;\r
+\r
+extern word ChunksInFile,\r
+ PMSpriteStart,PMSoundStart;\r
+extern PageListStruct far *PMPages;\r
+\r
+#define PM_GetSoundPage(v) PM_GetPage(PMSoundStart + (v))\r
+#define PM_GetSpritePage(v) PM_GetPage(PMSpriteStart + (v))\r
+\r
+#define PM_LockMainMem() PM_SetMainMemPurge(0)\r
+#define PM_UnlockMainMem() PM_SetMainMemPurge(3)\r
+\r
+\r
+extern char PageFileName[13];\r
+\r
+\r
+extern void PM_Startup(void),\r
+ PM_Shutdown(void),\r
+ PM_Reset(void),\r
+ PM_Preload(boolean (*update)(word current,word total)),\r
+ PM_NextFrame(void),\r
+ PM_SetPageLock(int pagenum,PMLockType lock),\r
+ PM_SetMainPurge(int level),\r
+ PM_CheckMainMem(void);\r
+extern memptr PM_GetPageAddress(int pagenum),\r
+ PM_GetPage(int pagenum); // Use this one to cache page\r
+\r
+void PM_SetMainMemPurge(int level);\r