1 /*
2 Copyright (C) 2002 Rice1964
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13 
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17 
18 */
19 
20 #ifndef _RICE_CONFIG_H_
21 #define _RICE_CONFIG_H_
22 
23 #include <stdio.h>
24 
25 #include <boolean.h>
26 
27 #include "typedefs.h"
28 
29 #ifdef MSB_FIRST
30     #define BYTE_ADDR_XOR        0
31     #define WORD_ADDR_XOR        0
32     #define BYTE4_XOR_BE(a)     (a)
33 #else
34     #define BYTE_ADDR_XOR        3
35     #define WORD_ADDR_XOR        1
36     #define BYTE4_XOR_BE(a)     ((a) ^ 3)
37 #endif
38 
39 typedef enum
40 {
41     OGL_DEVICE,
42     OGL_1_1_DEVICE,
43     OGL_1_2_DEVICE,
44     OGL_1_3_DEVICE,
45     OGL_1_4_DEVICE,
46     OGL_1_4_V2_DEVICE,
47     OGL_TNT2_DEVICE,
48     NVIDIA_OGL_DEVICE,
49     OGL_FRAGMENT_PROGRAM,
50 
51     DIRECTX_DEVICE
52 } SupportedDeviceType;
53 
54 enum DirectXCombinerType
55 {
56     DX_DISABLE_COMBINER,
57     DX_BEST_FIT,
58     DX_LOW_END,
59     DX_HIGH_END,
60     DX_NVIDIA_TNT,
61     DX_2_STAGES,
62     DX_3_STAGES,
63     DX_4_STAGES,
64     DX_PIXEL_SHADER,
65     DX_SEMI_PIXEL_SHADER
66 };
67 
68 
69 typedef struct
70 {
71     const char* name;
72     SupportedDeviceType type;
73 } RenderEngineSetting;
74 
75 enum {
76     FRM_BUF_NONE,
77     FRM_BUF_IGNORE,
78     FRM_BUF_BASIC,
79     FRM_BUF_BASIC_AND_WRITEBACK,
80     FRM_BUF_WRITEBACK_AND_RELOAD,
81     FRM_BUF_COMPLETE,
82     FRM_BUF_WITH_EMULATOR,
83     FRM_BUF_BASIC_AND_WITH_EMULATOR,
84     FRM_BUF_WITH_EMULATOR_READ_ONLY,
85     FRM_BUF_WITH_EMULATOR_WRITE_ONLY
86 };
87 
88 enum {
89     FRM_BUF_WRITEBACK_NORMAL,
90     FRM_BUF_WRITEBACK_1_2,
91     FRM_BUF_WRITEBACK_1_3,
92     FRM_BUF_WRITEBACK_1_4,
93     FRM_BUF_WRITEBACK_1_5,
94     FRM_BUF_WRITEBACK_1_6,
95     FRM_BUF_WRITEBACK_1_7,
96     FRM_BUF_WRITEBACK_1_8
97 };
98 
99 enum {
100     TXT_BUF_NONE,
101     TXT_BUF_IGNORE,
102     TXT_BUF_NORMAL,
103     TXT_BUF_WRITE_BACK,
104     TXT_BUF_WRITE_BACK_AND_RELOAD
105 };
106 
107 enum {
108     TXT_QUALITY_DEFAULT,
109     TXT_QUALITY_32BIT,
110     TXT_QUALITY_16BIT
111 };
112 
113 enum {
114     FORCE_DEFAULT_FILTER,
115     FORCE_POINT_FILTER,
116     FORCE_LINEAR_FILTER
117 };
118 
119 enum {
120     TEXTURE_NO_MIPMAP = 0,
121     TEXTURE_NO_FILTER,
122     TEXTURE_BILINEAR_FILTER,
123     TEXTURE_TRILINEAR_FILTER
124 };
125 
126 enum {
127     TEXTURE_NO_ENHANCEMENT,
128     TEXTURE_2X_ENHANCEMENT,
129     TEXTURE_2XSAI_ENHANCEMENT,
130     TEXTURE_HQ2X_ENHANCEMENT,
131     TEXTURE_LQ2X_ENHANCEMENT,
132     TEXTURE_HQ4X_ENHANCEMENT,
133     TEXTURE_SHARPEN_ENHANCEMENT,
134     TEXTURE_SHARPEN_MORE_ENHANCEMENT,
135     TEXTURE_EXTERNAL,
136     TEXTURE_MIRRORED
137 };
138 
139 enum {
140     TEXTURE_ENHANCEMENT_NORMAL,
141     TEXTURE_ENHANCEMENT_WITH_SMOOTH_FILTER_1,
142     TEXTURE_ENHANCEMENT_WITH_SMOOTH_FILTER_2,
143     TEXTURE_ENHANCEMENT_WITH_SMOOTH_FILTER_3,
144     TEXTURE_ENHANCEMENT_WITH_SMOOTH_FILTER_4
145 };
146 
147 enum {
148     SCREEN_UPDATE_DEFAULT = 0,
149     SCREEN_UPDATE_AT_VI_UPDATE = 1,
150     SCREEN_UPDATE_AT_VI_CHANGE = 2,
151     SCREEN_UPDATE_AT_CI_CHANGE = 3,
152     SCREEN_UPDATE_AT_1ST_CI_CHANGE = 4,
153     SCREEN_UPDATE_AT_1ST_PRIMITIVE = 5,
154     SCREEN_UPDATE_BEFORE_SCREEN_CLEAR = 6,
155     SCREEN_UPDATE_AT_VI_UPDATE_AND_DRAWN = 7   // Update screen at VI origin is updated and the screen has been drawn
156 };
157 
158 enum {
159     ONSCREEN_DISPLAY_NOTHING = 0,
160     ONSCREEN_DISPLAY_DLIST_PER_SECOND,
161     ONSCREEN_DISPLAY_FRAME_PER_SECOND,
162     ONSCREEN_DISPLAY_DEBUG_INFORMATION_ONLY,
163     ONSCREEN_DISPLAY_TEXT_FROM_CORE_ONLY,
164     ONSCREEN_DISPLAY_DLIST_PER_SECOND_WITH_CORE_MSG,
165     ONSCREEN_DISPLAY_FRAME_PER_SECOND_WITH_CORE_MSG,
166     ONSCREEN_DISPLAY_DEBUG_INFORMATION_WITH_CORE_MSG
167 };
168 
169 enum HACK_FOR_GAMES
170 {
171     NO_HACK_FOR_GAME,
172     HACK_FOR_BANJO_TOOIE,
173     HACK_FOR_DR_MARIO,
174     HACK_FOR_ZELDA,
175     HACK_FOR_MARIO_TENNIS,
176     HACK_FOR_BANJO,
177     HACK_FOR_PD,
178     HACK_FOR_GE,
179     HACK_FOR_PILOT_WINGS,
180     HACK_FOR_YOSHI,
181     HACK_FOR_NITRO,
182     HACK_FOR_TONYHAWK,
183     HACK_FOR_NASCAR,
184     HACK_FOR_SUPER_BOWLING,
185     HACK_FOR_CONKER,
186     HACK_FOR_ALL_STAR_BASEBALL,
187     HACK_FOR_TIGER_HONEY_HUNT,
188     HACK_REVERSE_XY_COOR,
189     HACK_REVERSE_Y_COOR,
190     HACK_FOR_GOLDEN_EYE,
191     HACK_FOR_FZERO,
192     HACK_FOR_COMMANDCONQUER,
193     HACK_FOR_RUMBLE,
194     HACK_FOR_SOUTH_PARK_RALLY,
195     HACK_FOR_BUST_A_MOVE,
196     HACK_FOR_OGRE_BATTLE,
197     HACK_FOR_TWINE,
198     HACK_FOR_EXTREME_G2,
199     HACK_FOR_ROGUE_SQUADRON,
200     HACK_FOR_MARIO_GOLF,
201     HACK_FOR_MLB,
202     HACK_FOR_POLARISSNOCROSS,
203     HACK_FOR_TOPGEARRALLY,
204     HACK_FOR_DUKE_NUKEM,
205     HACK_FOR_ZELDA_MM,
206     HACK_FOR_MARIO_KART
207 };
208 
209 enum {
210     NOT_USE_CI_WIDTH_AND_RATIO,
211     USE_CI_WIDTH_AND_RATIO_FOR_NTSC,
212     USE_CI_WIDTH_AND_RATIO_FOR_PAL
213 };
214 
215 typedef struct {
216     bool    bEnableHacks;
217     bool    bWinFrameMode;
218     bool    bOGLVertexClipper;
219     bool    bSkipFrame;
220     bool    bFullTMEM;
221     bool    bUseFullTMEM;
222 
223     uint32_t  mipmapping;
224     uint32_t  fogMethod;
225     uint32_t  forceTextureFilter;
226     uint32_t  textureEnhancement;
227     uint32_t  textureEnhancementControl;
228     uint32_t  textureQuality;
229     uint32_t  anisotropicFiltering;
230     uint32_t  multiSampling;
231     bool    bTexRectOnly;
232     bool    bSmallTextureOnly;
233     bool    bDumpTexturesToFiles;
234     bool    bLoadHiResTextures;
235     bool    bLoadHiResCRCOnly;
236 
237     int     OpenglDepthBufferSetting;
238     int     OpenglRenderSetting;
239     uint32_t  colorQuality;
240 
241     HACK_FOR_GAMES  enableHackForGames;
242 } GlobalOptions;
243 
244 typedef struct {
245     bool    bUpdateCIInfo;
246 
247     bool    bCheckBackBufs;         // Check texture again against the recent backbuffer addresses
248     bool    bWriteBackBufToRDRAM;   // If a recent backbuffer is used, write its content back to RDRAM
249     bool    bLoadBackBufFromRDRAM;  // Load content from RDRAM and draw into backbuffer
250     bool    bIgnore;                // Ignore all rendering into texture buffers
251 
252     bool    bSupportRenderTextures;     // Support render-to-texture
253     bool    bCheckRenderTextures;           // Check texture again against the the last render_texture addresses
254     bool    bRenderTextureWriteBack;        // Write back render_texture into RDRAM
255     bool    bLoadRDRAMIntoRenderTexture;    // Load RDRAM content and render into render_texture
256 
257     bool    bAtEachFrameUpdate;     // Reload and write back at each frame buffer and CI update
258 
259     bool    bProcessCPUWrite;
260     bool    bProcessCPURead;
261 
262     bool    bFillRectNextTextureBuffer;
263     bool    bIgnoreRenderTextureIfHeightUnknown;
264     //bool  bFillColor;
265 } FrameBufferOptions;
266 
267 typedef struct {
268     uint32_t  N64FrameBufferEmuType;
269     uint32_t  N64FrameBufferWriteBackControl;
270     uint32_t  N64RenderToTextureEmuType;
271     uint32_t  screenUpdateSetting;
272     bool    bNormalCombiner;
273     bool    bNormalBlender;
274     bool    bFastTexCRC;
275     bool    bAccurateTextureMapping;
276     bool    bInN64Resolution;
277     bool    bDoubleSizeForSmallTxtrBuf;
278     bool    bSaveVRAM;
279 } RomOptions;
280 
281 typedef struct IniSection
282 {
283     bool    bOutput;
284     char    crccheck[50];
285     char    name[50];
286 
287     // Options with changeable default values
288     uint32_t  dwNormalCombiner;
289     uint32_t  dwNormalBlender;
290     uint32_t  dwFastTextureCRC;
291     uint32_t  dwAccurateTextureMapping;
292     uint32_t  dwFrameBufferOption;
293     uint32_t  dwRenderToTextureOption;
294     uint32_t  dwScreenUpdateSetting;
295 
296     // Options with FALSE as default values
297     bool    bDisableBlender;
298     bool    bForceScreenClear;
299     bool    bEmulateClear;
300     bool    bForceDepthBuffer;
301 
302     // Less useful options
303     bool    bDisableObjBG;
304     bool    bDisableTextureCRC;
305     bool    bIncTexRectEdge;
306     bool    bZHack;
307     bool    bTextureScaleHack;
308     bool    bFastLoadTile;
309     bool    bUseSmallerTexture;
310     bool    bPrimaryDepthHack;
311     bool    bTexture1Hack;
312     bool    bDisableCulling;
313 
314     int     VIWidth;
315     int     VIHeight;
316     uint32_t  UseCIWidthAndRatio;
317 
318     uint32_t  dwFullTMEM;
319     bool    bTxtSizeMethod2;
320     bool    bEnableTxtLOD;
321 } section;
322 
323 struct ROMHeader
324 {
325     uint8_t  x1, x2, x3, x4;
326     uint32_t dwClockRate;
327     uint32_t dwBootAddressOffset;
328     uint32_t dwRelease;
329     uint32_t dwCRC1;
330     uint32_t dwCRC2;
331     uint64_t   qwUnknown1;
332     char  szName[20];
333     uint32_t dwUnknown2;
334     uint16_t  wUnknown3;
335     uint8_t  nUnknown4;
336     uint8_t  nManufacturer;
337     uint16_t  wCartID;
338     int8_t    nCountryID;
339     uint8_t  nUnknown5;
340 };
341 
342 typedef struct
343 {
344     // Other info from the rom. This is for convenience
345     unsigned char   szGameName[50+1];
346     int8_t  nCountryID;
347 
348     // Copy of the ROM header
349     ROMHeader   romheader;
350 
351     // With changeable default values
352     uint32_t  dwNormalCombiner;
353     uint32_t  dwNormalBlender;
354     uint32_t  dwAccurateTextureMapping;
355     uint32_t  dwFastTextureCRC;
356     uint32_t  dwFrameBufferOption;
357     uint32_t  dwRenderToTextureOption;
358     uint32_t  dwScreenUpdateSetting;
359 
360     // With FALSE as its default values
361     bool    bForceScreenClear;
362     bool    bEmulateClear;
363     bool    bForceDepthBuffer;
364     bool    bDisableBlender;
365 
366     // Less useful options
367     bool    bDisableObjBG;
368     bool    bDisableTextureCRC;
369     bool    bIncTexRectEdge;
370     bool    bZHack;
371     bool    bTextureScaleHack;
372     bool    bFastLoadTile;
373     bool    bUseSmallerTexture;
374     bool    bPrimaryDepthHack;
375     bool    bTexture1Hack;
376     bool    bDisableCulling;
377     int     VIWidth;
378     int     VIHeight;
379     uint32_t  UseCIWidthAndRatio;
380 
381     uint32_t  dwFullTMEM;
382     bool    bTxtSizeMethod2;
383     bool    bEnableTxtLOD;
384 } GameSetting, *LPGAMESETTING;
385 
386 typedef struct
387 {
388     int8_t  nCountryID;
389     char* szName;
390     uint32_t nTvType;
391 } CountryIDInfo;
392 
393 #define TV_SYSTEM_NTSC      1
394 #define TV_SYSTEM_PAL       0
395 
396 extern GlobalOptions       options;
397 extern FrameBufferOptions  frameBufferOptions;
398 extern RomOptions          defaultRomOptions;
399 extern RomOptions          currentRomOptions;
400 extern const CountryIDInfo g_CountryCodeInfo[];
401 extern GameSetting         g_curRomInfo;
402 extern bool                bIniIsChanged;
403 extern char                szIniFileName[300];
404 
405 extern bool InitConfiguration(void);
406 extern bool LoadConfiguration(void);
407 extern void WriteIniFile();
408 extern bool ReadIniFile();
409 extern void OutputSectionDetails(uint32_t i, FILE * fh);
410 extern void GenerateCurrentRomOptions();
411 extern void Ini_GetRomOptions(LPGAMESETTING pGameSetting);
412 extern void Ini_StoreRomOptions(LPGAMESETTING pGameSetting);
413 extern uint32_t CountryCodeToTVSystem(uint32_t countryCode);
414 extern void ROM_GetRomNameFromHeader(unsigned char * szName, ROMHeader * pHdr);
415 
416 #endif
417 
418