]> 4ch.mooo.com Git - 16.git/blob - src/lib/16_pm.h
wwww
[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 "src/lib/16_ca.h"\r
35 #ifdef __WATCOMC__\r
36 #include "src/lib/16_dbg.h"\r
37 #endif\r
38 #include <dos.h>\r
39 \r
40 /*//    NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024\r
41 #define EMSPageSize             16384\r
42 #define EMSPageSizeSeg  (EMSPageSize >> 4)\r
43 #define EMSPageSizeKB   (EMSPageSize >> 10)\r
44 #define EMSFrameCount   4\r
45 #define PMPageSize              4096\r
46 #define PMPageSizeSeg   (PMPageSize >> 4)\r
47 #define PMPageSizeKB    (PMPageSize >> 10)\r
48 #define PMEMSSubPage    (EMSPageSize / PMPageSize)\r
49 \r
50 #define PMMinMainMem    10                      // Min acceptable # of pages from main\r
51 #define PMMaxMainMem    100                     // Max number of pages in main memory\r
52 \r
53 #define PMThrashThreshold       1       // Number of page thrashes before panic mode\r
54 #define PMUnThrashThreshold     5       // Number of non-thrashing frames before leaving panic mode\r
55 \r
56 typedef enum\r
57                 {\r
58                         pml_Unlocked,\r
59                         pml_Locked\r
60                 } PMLockType;\r
61 \r
62 typedef enum\r
63                 {\r
64                         pmba_Unused = 0,\r
65                         pmba_Used = 1,\r
66                         pmba_Allocated = 2\r
67                 } PMBlockAttr;\r
68 \r
69 typedef struct\r
70                 {\r
71                         dword   offset;         // Offset of chunk into file\r
72                         word            length;         // Length of the chunk\r
73 \r
74                         int                     xmsPage;        // If in XMS, (xmsPage * PMPageSize) gives offset into XMS handle\r
75 \r
76                         PMLockType      locked;         // If set, this page can't be purged\r
77                         int                     emsPage;        // If in EMS, logical page/offset into page\r
78                         int                     mainPage;       // If in Main, index into handle array\r
79 \r
80                         dword   lastHit;        // Last frame number of hit\r
81                 } PageListStruct;\r
82 \r
83 typedef struct\r
84                 {\r
85                         int                     baseEMSPage;    // Base EMS page for this phys frame\r
86                         dword   lastHit;                // Last frame number of hit\r
87                 } EMSListStruct;\r
88 \r
89 extern  boolean                 XMSPresent,EMSPresent;\r
90 extern  word                    XMSPagesAvail,EMSPagesAvail;\r
91 \r
92 extern  word                    ChunksInFile,\r
93                                                 PMSpriteStart,PMSoundStart;\r
94 extern  PageListStruct  far *PMPages;*///moved to src/lib/typdefst.h\r
95 \r
96 #define PM_GetSoundPage(v)      PM_GetPage(PMSoundStart + (v))\r
97 #define PM_GetSpritePage(v)     PM_GetPage(PMSpriteStart + (v))\r
98 \r
99 #define PM_LockMainMem(gvar)    PM_SetMainMemPurge(0, gvar)\r
100 #define PM_UnlockMainMem(gvar)  PM_SetMainMemPurge(3, gvar)\r
101 \r
102 \r
103 extern  char    PageFileName[13];\r
104 \r
105 \r
106 extern  void    PM_Startup(global_game_variables_t *gvar),\r
107                                 PM_Shutdown(global_game_variables_t *gvar),\r
108                                 PM_Reset(global_game_variables_t *gvar),\r
109                                 PM_Preload(boolean (*update)(word current,word total), global_game_variables_t *gvar),\r
110                                 PM_NextFrame(global_game_variables_t *gvar),\r
111                                 PM_SetPageLock(int pagenum,PMLockType lock, global_game_variables_t *gvar),\r
112                                 PM_SetMainPurge(int level),\r
113                                 PM_CheckMainMem(global_game_variables_t *gvar);\r
114 extern  memptr  PM_GetPageAddress(int pagenum, global_game_variables_t *gvar),\r
115                                 PM_GetPage(int pagenum, global_game_variables_t *gvar);         // Use this one to cache page\r
116 \r
117 void PM_SetMainMemPurge(int level, global_game_variables_t *gvar);\r
118 void PML_StartupMainMem(global_game_variables_t *gvar);\r
119 #endif\r