OSDN Git Service

85135d91b4b2a28074be8469f8d8ce17ee6d639b
[proj16/16.git] / src / lib / 16_pm.h
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
3  *\r
4  * This file is part of Project 16.\r
5  *\r
6  * Project 16 is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Project 16 is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>, or\r
18  * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
19  * Fifth Floor, Boston, MA 02110-1301 USA.\r
20  *\r
21  */\r
22 \r
23 #ifndef __16_PM__\r
24 #define __16_PM__\r
25 \r
26 //\r
27 //      ID_PM.H\r
28 //      Header file for Id Engine's Page Manager\r
29 //\r
30 \r
31 #include "src/lib/16_head.h"\r
32 #include "src/lib/16_hc.h"\r
33 #include "src/lib/16_mm.h"\r
34 #include <dos.h>\r
35 \r
36 /*//    NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024\r
37 #define EMSPageSize             16384\r
38 #define EMSPageSizeSeg  (EMSPageSize >> 4)\r
39 #define EMSPageSizeKB   (EMSPageSize >> 10)\r
40 #define EMSFrameCount   4\r
41 #define PMPageSize              4096\r
42 #define PMPageSizeSeg   (PMPageSize >> 4)\r
43 #define PMPageSizeKB    (PMPageSize >> 10)\r
44 #define PMEMSSubPage    (EMSPageSize / PMPageSize)\r
45 \r
46 #define PMMinMainMem    10                      // Min acceptable # of pages from main\r
47 #define PMMaxMainMem    100                     // Max number of pages in main memory\r
48 \r
49 #define PMThrashThreshold       1       // Number of page thrashes before panic mode\r
50 #define PMUnThrashThreshold     5       // Number of non-thrashing frames before leaving panic mode\r
51 \r
52 typedef enum\r
53                 {\r
54                         pml_Unlocked,\r
55                         pml_Locked\r
56                 } PMLockType;\r
57 \r
58 typedef enum\r
59                 {\r
60                         pmba_Unused = 0,\r
61                         pmba_Used = 1,\r
62                         pmba_Allocated = 2\r
63                 } PMBlockAttr;\r
64 \r
65 typedef struct\r
66                 {\r
67                         dword   offset;         // Offset of chunk into file\r
68                         word            length;         // Length of the chunk\r
69 \r
70                         int                     xmsPage;        // If in XMS, (xmsPage * PMPageSize) gives offset into XMS handle\r
71 \r
72                         PMLockType      locked;         // If set, this page can't be purged\r
73                         int                     emsPage;        // If in EMS, logical page/offset into page\r
74                         int                     mainPage;       // If in Main, index into handle array\r
75 \r
76                         dword   lastHit;        // Last frame number of hit\r
77                 } PageListStruct;\r
78 \r
79 typedef struct\r
80                 {\r
81                         int                     baseEMSPage;    // Base EMS page for this phys frame\r
82                         dword   lastHit;                // Last frame number of hit\r
83                 } EMSListStruct;\r
84 \r
85 extern  boolean                 XMSPresent,EMSPresent;\r
86 extern  word                    XMSPagesAvail,EMSPagesAvail;\r
87 \r
88 extern  word                    ChunksInFile,\r
89                                                 PMSpriteStart,PMSoundStart;\r
90 extern  PageListStruct  far *PMPages;*///moved to src/lib/typdefst.h\r
91 \r
92 #define PM_GetSoundPage(v)      PM_GetPage(PMSoundStart + (v))\r
93 #define PM_GetSpritePage(v)     PM_GetPage(PMSpriteStart + (v))\r
94 \r
95 #define PM_LockMainMem(gvar)    PM_SetMainMemPurge(0, gvar)\r
96 #define PM_UnlockMainMem(gvar)  PM_SetMainMemPurge(3, gvar)\r
97 \r
98 \r
99 extern  char    PageFileName[13];\r
100 \r
101 \r
102 extern  void    PM_Startup(global_game_variables_t *gvar),\r
103                                 PM_Shutdown(global_game_variables_t *gvar),\r
104                                 PM_Reset(global_game_variables_t *gvar),\r
105                                 PM_Preload(boolean (*update)(word current,word total), global_game_variables_t *gvar),\r
106                                 PM_NextFrame(global_game_variables_t *gvar),\r
107                                 PM_SetPageLock(int pagenum,PMLockType lock, global_game_variables_t *gvar),\r
108                                 PM_SetMainPurge(int level),\r
109                                 PM_CheckMainMem(global_game_variables_t *gvar);\r
110 extern  memptr  PM_GetPageAddress(int pagenum, global_game_variables_t *gvar),\r
111                                 PM_GetPage(int pagenum, global_game_variables_t *gvar);         // Use this one to cache page\r
112 \r
113 void PM_SetMainMemPurge(int level, global_game_variables_t *gvar);\r
114 #endif\r