~ubuntu-branches/ubuntu/lucid/fceux/lucid

« back to all changes in this revision

Viewing changes to fceu/src/drivers/sdl/config.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Fabrice Coutadeur
  • Date: 2009-12-14 08:05:17 UTC
  • Revision ID: james.westby@ubuntu.com-20091214080517-abi5tj8avthfan7c
Tags: upstream-2.1.2+repack
ImportĀ upstreamĀ versionĀ 2.1.2+repack

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <unistd.h>
 
2
#include <sys/types.h>
 
3
#include <signal.h>
 
4
#include <sys/time.h>
 
5
#include <sys/stat.h>
 
6
#include <string.h>
 
7
#include <strings.h>
 
8
#include <errno.h>
 
9
#include <stdio.h>
 
10
#include <stdlib.h>
 
11
 
 
12
#include "main.h"
 
13
#include "throttle.h"
 
14
#include "config.h"
 
15
 
 
16
#include "../common/cheat.h"
 
17
 
 
18
#include "input.h"
 
19
#include "dface.h"
 
20
 
 
21
#include "sdl.h"
 
22
#include "sdl-video.h"
 
23
#include "unix-netplay.h"
 
24
 
 
25
#ifdef WIN32
 
26
#include <windows.h>
 
27
#endif
 
28
 
 
29
/**
 
30
 * Read a custom pallete from a file and load it into the core.
 
31
 */
 
32
static void
 
33
LoadCPalette(const std::string &file)
 
34
{
 
35
    uint8 tmpp[192];
 
36
    FILE *fp;
 
37
 
 
38
    if(!(fp = FCEUD_UTF8fopen(file.c_str(), "rb"))) {
 
39
        printf(" Error loading custom palette from file: %s\n", file.c_str());
 
40
        return;
 
41
    }
 
42
    fread(tmpp, 1, 192, fp);
 
43
    FCEUI_SetPaletteArray(tmpp);
 
44
    fclose(fp);
 
45
}
 
46
 
 
47
/**
 
48
 * Creates the subdirectories used for saving snapshots, movies, game
 
49
 * saves, etc.  Hopefully obsolete with new configuration system.
 
50
 */
 
51
static void
 
52
CreateDirs(const std::string &dir)
 
53
{
 
54
    char *subs[7]={"fcs","snaps","gameinfo","sav","cheats","movie"};
 
55
    std::string subdir;
 
56
    int x;
 
57
 
 
58
#ifdef WIN32
 
59
    mkdir(dir.c_str());
 
60
    for(x = 0; x < 6; x++) {
 
61
        subdir = dir + PSS + subs[x];
 
62
        mkdir(subdir.c_str());
 
63
    }
 
64
#else
 
65
    mkdir(dir.c_str(), S_IRWXU);
 
66
    for(x = 0; x < 6; x++) {
 
67
        subdir = dir + PSS + subs[x];
 
68
        mkdir(subdir.c_str(), S_IRWXU);
 
69
    }
 
70
#endif
 
71
}
 
72
 
 
73
/**
 
74
 * Attempts to locate FCEU's application directory.  This will
 
75
 * hopefully become obsolete once the new configuration system is in
 
76
 * place.
 
77
 */
 
78
static void
 
79
GetBaseDirectory(std::string &dir)
 
80
{
 
81
    char *home = getenv("HOME");
 
82
    if(home) {
 
83
        dir = std::string(home) + "/.fceux";
 
84
    } else {
 
85
#ifdef WIN32
 
86
        home = new char[MAX_PATH + 1];
 
87
        GetModuleFileName(NULL, home, MAX_PATH + 1);
 
88
 
 
89
        char *lastBS = strrchr(home,'\\');
 
90
        if(lastBS) {
 
91
            *lastBS = 0;
 
92
        }
 
93
 
 
94
        dir = std::string(home);
 
95
        delete[] home;
 
96
#else
 
97
        dir = "";
 
98
#endif
 
99
    }
 
100
}
 
101
 
 
102
 
 
103
Config *
 
104
InitConfig()
 
105
{
 
106
    std::string dir, prefix;
 
107
    Config *config;
 
108
 
 
109
    GetBaseDirectory(dir);
 
110
 
 
111
    FCEUI_SetBaseDirectory(dir.c_str());
 
112
    CreateDirs(dir);
 
113
 
 
114
    config = new Config(dir);
 
115
 
 
116
    // sound options
 
117
    config->addOption('s', "sound", "SDL.Sound", 1);
 
118
    config->addOption("volume", "SDL.SoundVolume", 150);
 
119
    config->addOption("trianglevol", "SDL.TriangleVolume", 256);
 
120
    config->addOption("square1vol", "SDL.Square1Volume", 256);
 
121
    config->addOption("square2vol", "SDL.Square2Volume", 256);
 
122
    config->addOption("noisevol", "SDL.NoiseVolume", 256);
 
123
    config->addOption("pcmvol", "SDL.PCMVolume", 256);
 
124
    config->addOption("soundrate", "SDL.SoundRate", 11000);
 
125
    config->addOption("soundq", "SDL.SoundQuality", 1);
 
126
    config->addOption("soundrecord", "SDL.SoundRecordFile", "");
 
127
    config->addOption("soundbufsize", "SDL.SoundBufSize", 48);
 
128
 
 
129
    // old EOptions
 
130
    config->addOption('g', "gamegenie", "SDL.GameGenie", 0);
 
131
    config->addOption("lowpass", "SDL.LowPass", 0);
 
132
    config->addOption("pal", "SDL.PAL", 0);
 
133
    config->addOption("frameskip", "SDL.Frameskip", 0);
 
134
    config->addOption("clipsides", "SDL.ClipSides", 0);
 
135
    config->addOption("nospritelim", "SDL.DisableSpriteLimit", 1);
 
136
 
 
137
    // color control
 
138
    config->addOption('p', "palette", "SDL.Palette", "");
 
139
    config->addOption("tint", "SDL.Tint", 56);
 
140
    config->addOption("hue", "SDL.Hue", 72);
 
141
    config->addOption("ntsccolor", "SDL.Color", 0);
 
142
 
 
143
    // scanline settings
 
144
    config->addOption("slstart", "SDL.ScanLineStart", 0);
 
145
    config->addOption("slend", "SDL.ScanLineEnd", 239);
 
146
 
 
147
    // video controls
 
148
    config->addOption('x', "xres", "SDL.XResolution", 512);
 
149
    config->addOption('y', "yres", "SDL.YResolution", 448);
 
150
    config->addOption('f', "fullscreen", "SDL.Fullscreen", 0);
 
151
    config->addOption('b', "bpp", "SDL.BitsPerPixel", 32);
 
152
    config->addOption("doublebuf", "SDL.DoubleBuffering", 0);
 
153
    config->addOption("autoscale", "SDL.AutoScale", 1);
 
154
    config->addOption("keepratio", "SDL.KeepRatio", 1);
 
155
    config->addOption("xscale", "SDL.XScale", 1.0);
 
156
    config->addOption("yscale", "SDL.YScale", 1.0);
 
157
    config->addOption("xstretch", "SDL.XStretch", 0);
 
158
    config->addOption("ystretch", "SDL.YStretch", 0);
 
159
    config->addOption("noframe", "SDL.NoFrame", 0);
 
160
    config->addOption("special", "SDL.SpecialFilter", 0);
 
161
 
 
162
    // OpenGL options
 
163
    config->addOption("opengl", "SDL.OpenGL", 0);
 
164
    config->addOption("openglip", "SDL.OpenGLip", 0);
 
165
    config->addOption("SDL.SpecialFilter", 0);
 
166
    config->addOption("SDL.SpecialFX", 0);
 
167
 
 
168
    // network play options - netplay is broken
 
169
    /*
 
170
    config->addOption('n', "net", "SDL.NetworkServer", "");
 
171
    config->addOption('u', "user", "SDL.NetworkUsername", "");
 
172
    config->addOption('w', "pass", "SDL.NetworkPassword", "");
 
173
    config->addOption('k', "netkey", "SDL.NetworkGameKey", "");
 
174
    config->addOption( 0, "port", "SDL.NetworkPort", 4046);
 
175
    config->addOption('l', "players", "SDL.NetworkNumPlayers", 1);
 
176
    */ 
 
177
    // input configuration options
 
178
    config->addOption("input1", "SDL.Input.0", "GamePad.0");
 
179
    config->addOption("input2", "SDL.Input.1", "GamePad.1");
 
180
    config->addOption("input3", "SDL.Input.2", "Gamepad.2");
 
181
    config->addOption("input4", "SDL.Input.3", "Gamepad.3");
 
182
 
 
183
    // allow for input configuration
 
184
    config->addOption('i', "inputcfg", "SDL.InputCfg", InputCfg);
 
185
    
 
186
    // display input
 
187
    config->addOption("inputdisplay", "SDL.InputDisplay", 0);
 
188
    
 
189
    // pause movie playback at frame x
 
190
    config->addOption("pauseframe", "SDL.PauseFrame", 0);
 
191
    
 
192
    // overwrite the config file?
 
193
    config->addOption("no-config", "SDL.NoConfig", 0);
 
194
    
 
195
    // video playback
 
196
    config->addOption("playmov", "SDL.Movie", "");
 
197
    config->addOption("subtitles", "SDL.SubtitleDisplay", 1);
 
198
    
 
199
    #ifdef _S9XLUA_H
 
200
    // load lua script
 
201
    config->addOption("loadlua", "SDL.LuaScript", "");
 
202
    #endif
 
203
    
 
204
    #ifdef CREATE_AVI
 
205
    config->addOption("videolog",  "SDL.VideoLog",  "");
 
206
    config->addOption("mute", "SDL.MuteCapture", 0);
 
207
    #endif
 
208
    
 
209
    // fcm -> fm2 conversion
 
210
    config->addOption("fcmconvert", "SDL.FCMConvert", "");
 
211
    
 
212
    // fm2 -> srt conversion
 
213
    config->addOption("ripsubs", "SDL.RipSubs", "");
 
214
        
 
215
        // enable new PPU core
 
216
        config->addOption("newppu", "SDL.NewPPU", "0");
 
217
 
 
218
    // GamePad 0 - 3
 
219
    for(unsigned int i = 0; i < GAMEPAD_NUM_DEVICES; i++) {
 
220
        char buf[64];
 
221
        snprintf(buf, 20, "SDL.Input.GamePad.%d.", i);
 
222
        prefix = buf;
 
223
 
 
224
        config->addOption(prefix + "DeviceType", DefaultGamePadDevice[i]);
 
225
        config->addOption(prefix + "DeviceNum",  0);
 
226
        for(unsigned int j = 0; j < GAMEPAD_NUM_BUTTONS; j++) {
 
227
            config->addOption(prefix + GamePadNames[j], DefaultGamePad[i][j]);
 
228
        }
 
229
    }
 
230
 
 
231
    // PowerPad 0 - 1
 
232
    for(unsigned int i = 0; i < POWERPAD_NUM_DEVICES; i++) {
 
233
        char buf[64];
 
234
        snprintf(buf, 20, "SDL.Input.PowerPad.%d.", i);
 
235
        prefix = buf;
 
236
 
 
237
        config->addOption(prefix + "DeviceType", DefaultPowerPadDevice[i]);
 
238
        config->addOption(prefix + "DeviceNum",  0);
 
239
        for(unsigned int j = 0; j < POWERPAD_NUM_BUTTONS; j++) {
 
240
            config->addOption(prefix +PowerPadNames[j], DefaultPowerPad[i][j]);
 
241
        }
 
242
    }
 
243
 
 
244
    // QuizKing
 
245
    prefix = "SDL.Input.QuizKing.";
 
246
    config->addOption(prefix + "DeviceType", DefaultQuizKingDevice);
 
247
    config->addOption(prefix + "DeviceNum", 0);
 
248
    for(unsigned int j = 0; j < QUIZKING_NUM_BUTTONS; j++) {
 
249
        config->addOption(prefix + QuizKingNames[j], DefaultQuizKing[j]);
 
250
    }
 
251
 
 
252
    // HyperShot
 
253
    prefix = "SDL.Input.HyperShot.";
 
254
    config->addOption(prefix + "DeviceType", DefaultHyperShotDevice);
 
255
    config->addOption(prefix + "DeviceNum", 0);
 
256
    for(unsigned int j = 0; j < HYPERSHOT_NUM_BUTTONS; j++) {
 
257
        config->addOption(prefix + HyperShotNames[j], DefaultHyperShot[j]);
 
258
    }
 
259
 
 
260
    // Mahjong
 
261
    prefix = "SDL.Input.Mahjong.";
 
262
    config->addOption(prefix + "DeviceType", DefaultMahjongDevice);
 
263
    config->addOption(prefix + "DeviceNum", 0);
 
264
    for(unsigned int j = 0; j < MAHJONG_NUM_BUTTONS; j++) {
 
265
        config->addOption(prefix + MahjongNames[j], DefaultMahjong[j]);
 
266
    }
 
267
 
 
268
    // TopRider
 
269
    prefix = "SDL.Input.TopRider.";
 
270
    config->addOption(prefix + "DeviceType", DefaultTopRiderDevice);
 
271
    config->addOption(prefix + "DeviceNum", 0);
 
272
    for(unsigned int j = 0; j < TOPRIDER_NUM_BUTTONS; j++) {
 
273
        config->addOption(prefix + TopRiderNames[j], DefaultTopRider[j]);
 
274
    }
 
275
 
 
276
    // FTrainer
 
277
    prefix = "SDL.Input.FTrainer.";
 
278
    config->addOption(prefix + "DeviceType", DefaultFTrainerDevice);
 
279
    config->addOption(prefix + "DeviceNum", 0);
 
280
    for(unsigned int j = 0; j < FTRAINER_NUM_BUTTONS; j++) {
 
281
        config->addOption(prefix + FTrainerNames[j], DefaultFTrainer[j]);
 
282
    }
 
283
 
 
284
    // FamilyKeyBoard
 
285
    prefix = "SDL.Input.FamilyKeyBoard.";
 
286
    config->addOption(prefix + "DeviceType", DefaultFamilyKeyBoardDevice);
 
287
    config->addOption(prefix + "DeviceNum", 0);
 
288
    for(unsigned int j = 0; j < FAMILYKEYBOARD_NUM_BUTTONS; j++) {
 
289
        config->addOption(prefix + FamilyKeyBoardNames[j],
 
290
                          DefaultFamilyKeyBoard[j]);
 
291
    }
 
292
    
 
293
    // Hotkeys
 
294
    prefix = "SDL.Hotkeys.";
 
295
    config->addOption(prefix + "CheatMenu", SDLK_F1);
 
296
        config->addOption(prefix + "BindState", SDLK_F2);
 
297
    #ifdef _S9XLUA_H
 
298
    config->addOption(prefix + "LoadLua", SDLK_F3);
 
299
    #endif
 
300
    config->addOption(prefix + "RenderBG", SDLK_F4);
 
301
    config->addOption(prefix + "SaveState", SDLK_F5);
 
302
    config->addOption(prefix + "FrameAdvanceLagSkip", SDLK_F6);
 
303
    config->addOption(prefix + "LoadState", SDLK_F7);
 
304
    config->addOption(prefix + "LagCounterDisplay", SDLK_F8);
 
305
    config->addOption(prefix + "MovieToggleFrameDisplay", SDLK_F9);
 
306
    config->addOption(prefix + "SubtitleDisplay", SDLK_F10);
 
307
    config->addOption(prefix + "Reset", SDLK_F11);
 
308
    config->addOption(prefix + "Screenshot", SDLK_F12);
 
309
    config->addOption(prefix + "Pause", SDLK_PAUSE);
 
310
    config->addOption(prefix + "DecreaseSpeed", SDLK_MINUS);
 
311
    config->addOption(prefix + "IncreaseSpeed", SDLK_EQUALS);
 
312
    config->addOption(prefix + "FrameAdvance", SDLK_BACKSLASH);
 
313
    config->addOption(prefix + "InputDisplay", SDLK_i);
 
314
    config->addOption(prefix + "MovieToggleReadWrite", SDLK_q);
 
315
    #ifdef CREATE_AVI
 
316
    config->addOption(prefix + "MuteCapture", SDLK_DELETE);
 
317
    #endif
 
318
    config->addOption(prefix + "Quit", SDLK_ESCAPE);
 
319
    //config->addOption(prefix + "Power", 0);
 
320
    
 
321
    
 
322
    
 
323
    
 
324
        config->addOption(prefix + "SelectState0", SDLK_0);
 
325
        config->addOption(prefix + "SelectState1", SDLK_1);
 
326
        config->addOption(prefix + "SelectState2", SDLK_2);
 
327
        config->addOption(prefix + "SelectState3", SDLK_3);
 
328
        config->addOption(prefix + "SelectState4", SDLK_4);
 
329
        config->addOption(prefix + "SelectState5", SDLK_5);
 
330
        config->addOption(prefix + "SelectState6", SDLK_6);
 
331
        config->addOption(prefix + "SelectState7", SDLK_7);
 
332
        config->addOption(prefix + "SelectState8", SDLK_8);
 
333
        config->addOption(prefix + "SelectState9", SDLK_9);
 
334
        
 
335
    
 
336
 
 
337
    // All mouse devices
 
338
    config->addOption("SDL.OekaKids.0.DeviceType", "Mouse");
 
339
    config->addOption("SDL.OekaKids.0.DeviceNum", 0);
 
340
 
 
341
    config->addOption("SDL.Arkanoid.0.DeviceType", "Mouse");
 
342
    config->addOption("SDL.Arkanoid.0.DeviceNum", 0);
 
343
 
 
344
    config->addOption("SDL.Shadow.0.DeviceType", "Mouse");
 
345
    config->addOption("SDL.Shadow.0.DeviceNum", 0);
 
346
 
 
347
    config->addOption("SDL.Zapper.0.DeviceType", "Mouse");
 
348
    config->addOption("SDL.Zapper.0.DeviceNum", 0);
 
349
 
 
350
    return config;
 
351
}
 
352
 
 
353
void
 
354
UpdateEMUCore(Config *config)
 
355
{
 
356
    int ntsccol, ntsctint, ntschue, flag, start, end;
 
357
    std::string cpalette;
 
358
 
 
359
    config->getOption("SDL.Color", &ntsccol);
 
360
    config->getOption("SDL.Tint", &ntsctint);
 
361
    config->getOption("SDL.Hue", &ntschue);
 
362
    FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue);
 
363
 
 
364
    config->getOption("SDL.Palette", &cpalette);
 
365
    if(cpalette.size()) {
 
366
        LoadCPalette(cpalette);
 
367
    }
 
368
 
 
369
    config->getOption("SDL.PAL", &flag);
 
370
    FCEUI_SetVidSystem(flag ? 1 : 0);
 
371
 
 
372
    config->getOption("SDL.GameGenie", &flag);
 
373
    FCEUI_SetGameGenie(flag ? 1 : 0);
 
374
 
 
375
    config->getOption("SDL.LowPass", &flag);
 
376
    FCEUI_SetLowPass(flag ? 1 : 0);
 
377
 
 
378
    config->getOption("SDL.DisableSpriteLimit", &flag);
 
379
    FCEUI_DisableSpriteLimitation(flag ? 1 : 0);
 
380
 
 
381
    //Not used anymore.
 
382
    //config->getOption("SDL.SnapName", &flag);
 
383
    //FCEUI_SetSnapName(flag ? true : false);
 
384
 
 
385
    config->getOption("SDL.ScanLineStart", &start);
 
386
    config->getOption("SDL.ScanLineEnd", &end);
 
387
 
 
388
#if DOING_SCANLINE_CHECKS
 
389
    for(int i = 0; i < 2; x++) {
 
390
        if(srendlinev[x]<0 || srendlinev[x]>239) srendlinev[x]=0;
 
391
        if(erendlinev[x]<srendlinev[x] || erendlinev[x]>239) erendlinev[x]=239;
 
392
    }
 
393
#endif
 
394
 
 
395
    FCEUI_SetRenderedLines(start + 8, end - 8, start, end);
 
396
}