OSDN Git Service

[UI][Qt][SDL] Plug'n playable Joysticks.
[csp-qt/common_source_project-fm7.git] / source / src / config.cpp
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2006.08.18 -
6
7         [ config ]
8 */
9 #if defined(_USE_AGAR)
10 #include <SDL/SDL.h>
11 #include <agar/core.h>
12 #include <string>
13 #include <vector>
14 #include "fileio.h"
15 #include "agar_logger.h"
16 #endif
17
18 #if defined(_USE_QT)
19 #include <string>
20 #include <vector>
21 #include "fileio.h"
22 #include "agar_logger.h"
23 #include "qt_main.h"
24 # if defined(Q_OS_WIN)
25 # include <windows.h>
26 # endif
27 #endif
28
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include "common.h"
32 #include "config.h"
33 #include "fileio.h"
34 #if defined(_USE_AGAR)
35 #include "agar_main.h"
36 #endif
37
38 config_t config;
39
40 #ifndef CONFIG_NAME
41 #define CONFIG_NAME "conf"
42 #endif
43
44 //extern _TCHAR* get_parent_dir(_TCHAR* file);
45 BOOL MyWritePrivateProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, int Value, LPCTSTR lpFileName)
46 {
47         _TCHAR String[32];
48         my_stprintf_s(String, 32, _T("%d"), Value);
49         return MyWritePrivateProfileString(lpAppName, lpKeyName, String, lpFileName);
50 }
51  
52 BOOL MyWritePrivateProfileBool(LPCTSTR lpAppName, LPCTSTR lpKeyName, bool Value, LPCTSTR lpFileName)
53 {
54         _TCHAR String[32];
55         my_stprintf_s(String, 32, _T("%d"), Value ? 1 : 0);
56         return MyWritePrivateProfileString(lpAppName, lpKeyName, String, lpFileName);
57 }
58  
59 bool MyGetPrivateProfileBool(LPCTSTR lpAppName, LPCTSTR lpKeyName, bool bDefault, LPCTSTR lpFileName)
60 {
61         return (MyGetPrivateProfileInt(lpAppName, lpKeyName, bDefault ? 1 : 0, lpFileName) != 0);
62 }
63
64 void init_config()
65 {
66         int i;
67         // initial settings
68         memset(&config, 0, sizeof(config_t));
69         config.window_mode = 1; 
70 #ifdef _WIN32
71         config.use_direct_input = true;
72         config.disable_dwm = false;
73 #endif
74         config.swap_joy_buttons = false;
75         
76 #ifndef ONE_BOARD_MICRO_COMPUTER
77 #ifdef _WIN32
78         config.use_d3d9 = true;
79 #endif
80         config.stretch_type = 1;        // Stretch (Aspect)
81 #endif
82         config.sound_frequency = 6;     // 48KHz
83         config.sound_latency = 1;       // 100msec
84         
85 #if defined(USE_TAPE)
86         config.wave_shaper = true;
87         config.direct_load_mzt = true;
88         config.baud_high = true;
89 #endif
90 #if defined(USE_BOOT_MODE) && defined(BOOT_MODE_DEFAULT)
91         config.boot_mode = BOOT_MODE_DEFAULT;
92 #endif
93 #if defined(USE_CPU_TYPE) && defined(CPU_TYPE_DEFAULT)
94         config.cpu_type = CPU_TYPE_DEFAULT;
95 #endif
96 #if defined(USE_DIPSWITCH) && defined(DIPSWITCH_DEFAULT)
97         config.dipswitch = DIPSWITCH_DEFAULT;
98 #endif
99 #if defined(USE_DEVICE_TYPE) && defined(DEVICE_TYPE_DEFAULT)
100         config.device_type = DEVICE_TYPE_DEFAULT;
101 #endif
102 #if defined(USE_FD1)
103         for(int drv = 0; drv < MAX_FD; drv++) {
104 #if defined(CORRECT_DISK_TIMING_DEFAULT)
105                 config.correct_disk_timing[drv] = CORRECT_DISK_TIMING_DEFAULT;
106 #else
107                 config.correct_disk_timing[drv] = true;
108 #endif
109 #if defined(IGNORE_DISK_CRC_DEFAULT)
110                 config.ignore_disk_crc[drv] = IGNORE_DISK_CRC_DEFAULT;
111 #endif
112         }
113 #elif defined(USE_FD1)
114         for(int drv = 0; drv < MAX_FD; drv++) {
115                 config.ignore_disk_crc[drv] = false;
116         }
117 #endif  
118 #if defined(USE_SOUND_DEVICE_TYPE) && defined(SOUND_DEVICE_TYPE_DEFAULT)
119         config.sound_device_type = SOUND_DEVICE_TYPE_DEFAULT;
120 #endif
121 #if defined(USE_PRINTER) && defined(PRINTER_DEVICE_TYPE_DEFAULT)
122         config.printer_device_type = PRINTER_DEVICE_TYPE_DEFAULT;
123 #endif
124         // FM7 Series:
125         // 0 = PSG or NONE
126         // 1 = OPN (+PSG)
127         // 2 = WHG (+PSG)
128         // 3 = WHG + OPN (+PSG)
129         // 4 = THG  (+PSG)
130         // 5 = THG + OPN (+PSG)
131         // 6 = THG + WHG (+PSG)
132         // 7 = THG + WHG + OPN (+PSG)
133 #if defined(_FM8)
134         config.sound_device_type = 0;   // WITHOUT PSG?
135 #elif  defined(_FM7) || defined(_FMNEW7) || defined(_FM77) || defined(_FM77L4) || defined(_FM77L2)
136         config.sound_device_type = 0;   // PSG ONLY      
137 #elif  defined(_FM77AV) || defined(_FM77AV20) || defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
138         config.sound_device_type = 1;   // OPN      
139 #endif       
140         config.multiple_speakers = false;
141         config.general_sound_level = 0;
142
143 #if defined(_USE_QT)
144         config.use_opengl_scanline = false;
145         config.opengl_scanline_vert = false;
146         config.opengl_scanline_horiz = false;
147         config.use_opengl_filters = false;
148         config.opengl_filter_num = 0;
149 #endif  
150 #ifdef USE_MULTIPLE_SOUNDCARDS
151         {
152                 int ii;
153                 for(ii = 0; ii < USE_MULTIPLE_SOUNDCARDS; ii++) {
154                         config.sound_device_level[ii] = 0;
155                 }
156         }
157 #endif
158 }
159
160 void load_config(const _TCHAR *config_path)
161 {
162         int drv, i;
163         // initial settings
164         init_config();
165
166         // control
167 #ifdef USE_BOOT_MODE
168         config.boot_mode = MyGetPrivateProfileInt(_T("Control"), _T("BootMode"), config.boot_mode, config_path);
169 #endif
170 #ifdef USE_CPU_TYPE
171         config.cpu_type = MyGetPrivateProfileInt(_T("Control"), _T("CPUType"), config.cpu_type, config_path);
172 #endif
173 #ifdef USE_DIPSWITCH
174         config.dipswitch = MyGetPrivateProfileInt(_T("Control"), _T("DipSwitch"), config.dipswitch, config_path);
175 #endif
176 #ifdef USE_DEVICE_TYPE
177         config.device_type = MyGetPrivateProfileInt(_T("Control"), _T("DeviceType"), config.device_type, config_path);
178 #endif
179 #ifdef USE_DRIVE_TYPE
180         config.drive_type = MyGetPrivateProfileInt(_T("Control"), _T("DriveType"), config.drive_type, config_path);
181 #endif
182 #ifdef USE_FD1
183         {
184                 _TCHAR name[64];
185                 for(drv = 0; drv < MAX_FD; drv++) {
186                         memset(name, 0x00, sizeof(name));
187                         my_stprintf_s(name, 64, _T("CorrectDiskTiming%d"), drv + 1);
188                         config.correct_disk_timing[drv] = MyGetPrivateProfileBool(_T("Control"), (const _TCHAR *)name,
189                                                                                                                                         config.correct_disk_timing[drv], config_path);
190                         my_stprintf_s(name, 64, _T("IgnoreDiskCRC%d"), drv + 1);
191                         config.ignore_disk_crc[drv] = MyGetPrivateProfileBool(_T("Control"), (const _TCHAR *)name,
192                                                                                                                                 config.ignore_disk_crc[drv], config_path);
193                 }
194         }
195 #endif
196
197 #ifdef USE_TAPE
198         config.tape_sound = MyGetPrivateProfileBool(_T("Control"), _T("TapeSound"), config.tape_sound, config_path);
199         config.wave_shaper = MyGetPrivateProfileBool(_T("Control"), _T("WaveShaper"), config.wave_shaper, config_path);
200         config.direct_load_mzt = MyGetPrivateProfileBool(_T("Control"), _T("DirectLoadMZT"), config.direct_load_mzt, config_path);
201         config.baud_high = MyGetPrivateProfileBool(_T("Control"), _T("BaudHigh"), config.baud_high, config_path);
202 #endif
203         
204         // recent files
205 #ifdef USE_CART1
206         MyGetPrivateProfileString(_T("RecentFiles"), _T("InitialCartDir"), _T(""), config.initial_cart_dir, _MAX_PATH, config_path);
207         for(drv = 0; drv < MAX_CART; drv++) {
208                 for(i = 0; i < MAX_HISTORY; i++) {
209                         _TCHAR name[64];
210                         my_stprintf_s(name, 64, _T("RecentCartPath%d_%d"), drv + 1, i + 1);
211                         MyGetPrivateProfileString(_T("RecentFiles"), name, _T(""),
212                                                                         config.recent_cart_path[drv][i], _MAX_PATH, config_path);
213                 }
214         }
215 #endif
216 #ifdef USE_FD1
217         MyGetPrivateProfileString(_T("RecentFiles"), _T("InitialDiskDir"), _T(""),
218                                                         config.initial_disk_dir, _MAX_PATH, config_path);
219     //    get_parent_dir(config.initial_disk_dir);
220         for(drv = 0; drv < MAX_FD; drv++) {
221                 for(i = 0; i < MAX_HISTORY; i++) {
222                         _TCHAR name[64];
223                         my_stprintf_s(name, 64, _T("RecentDiskPath%d_%d"), drv + 1, i + 1);
224                         MyGetPrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name,
225                                                                         _T(""), config.recent_disk_path[drv][i], _MAX_PATH, config_path);
226                 }
227         }
228 #endif
229 #ifdef USE_QD1
230         MyGetPrivateProfileString(_T("RecentFiles"), _T("InitialQuickDiskDir"),
231                                                         _T(""), config.initial_quickdisk_dir, _MAX_PATH, config_path);
232         for(drv = 0; drv < MAX_QD; drv++) {
233                 for(i = 0; i < MAX_HISTORY; i++) {
234                         _TCHAR name[64];
235                         my_stprintf_s(name, 64, _T("RecentQuickDiskPath%d_%d"), drv + 1, i + 1);
236                         MyGetPrivateProfileString(_T("RecentFiles"), name, _T(""),
237                                                                         config.recent_quickdisk_path[drv][i], _MAX_PATH, config_path);
238                 }
239         }
240 #endif
241
242 #ifdef USE_TAPE
243         MyGetPrivateProfileString(_T("RecentFiles"), _T("InitialTapeDir"), _T(""),
244                                                         config.initial_tape_dir, _MAX_PATH, config_path);
245         for(i = 0; i < MAX_HISTORY; i++) {
246                 _TCHAR name[64];
247                 my_stprintf_s(name, 64, _T("RecentTapePath1_%d"), i + 1);
248                 MyGetPrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name, _T(""),
249                                                                 config.recent_tape_path[i], _MAX_PATH, config_path);
250         }
251 #endif
252
253 #ifdef USE_LASER_DISC
254         MyGetPrivateProfileString(_T("RecentFiles"), _T("InitialLaserDiscDir"), _T(""),
255                                                         config.initial_laser_disc_dir, _MAX_PATH, config_path);
256         for(int i = 0; i < MAX_HISTORY; i++) {
257                 _TCHAR name[64];
258                 my_stprintf_s(name, 64, _T("RecentLaserDiscPath1_%d"), i + 1);
259                 MyGetPrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name, _T(""),
260                                                                 config.recent_laser_disc_path[i], _MAX_PATH, config_path);
261         }
262 #endif
263 #ifdef USE_BINARY_FILE1
264         MyGetPrivateProfileString(_T("RecentFiles"), _T("InitialBinaryDir"), _T(""),
265                                                         config.initial_binary_dir, _MAX_PATH, config_path);
266         for(drv = 0; drv < MAX_BINARY; drv++) {
267                 for(i = 0; i < MAX_HISTORY; i++) {
268                         _TCHAR name[64];
269                         my_stprintf_s(name, 64, _T("RecentBinaryPath%d_%d"), drv + 1, i + 1);
270                         MyGetPrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name, _T(""),
271                                                                         config.recent_binary_path[drv][i], _MAX_PATH, config_path);
272                 }
273         }
274 #endif
275         
276         // screen
277 #ifndef ONE_BOARD_MICRO_COMPUTER
278         config.window_mode = MyGetPrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);
279 #ifdef _WIN32
280         config.use_d3d9 = MyGetPrivateProfileBool(_T("Screen"), _T("UseD3D9"), config.use_d3d9, config_path);
281         config.wait_vsync = MyGetPrivateProfileBool(_T("Screen"), _T("WaitVSync"), config.wait_vsync, config_path);
282 #endif
283         config.stretch_type = MyGetPrivateProfileInt(_T("Screen"), _T("StretchType"), config.stretch_type, config_path);
284 #else
285         config.window_mode = MyGetPrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);
286 #endif
287 #ifdef USE_MONITOR_TYPE
288         config.monitor_type = MyGetPrivateProfileInt(_T("Screen"), _T("MonitorType"), config.monitor_type, config_path);
289 #endif
290 #ifdef USE_CRT_FILTER
291         config.crt_filter = MyGetPrivateProfileBool(_T("Screen"), _T("CRTFilter"), config.crt_filter, config_path);
292 #endif
293 #ifdef USE_SCANLINE
294         config.scan_line = MyGetPrivateProfileBool(_T("Screen"), _T("ScanLine"), config.scan_line, config_path);
295 #endif
296
297 #ifdef USE_SCREEN_ROTATE
298         config.rotate_type = MyGetPrivateProfileInt(_T("Screen"), _T("RotateType"), config.rotate_type, config_path);
299 #endif
300 #if defined(_USE_QT)
301         config.use_opengl_scanline = MyGetPrivateProfileBool(_T("Screen"), _T("UseOpenGLScanLine"),
302                                                                                                            config.use_opengl_scanline, config_path);
303         config.opengl_scanline_vert = MyGetPrivateProfileBool(_T("Screen"), _T("OpenGLScanLineVert"),
304                                                                                                            config.opengl_scanline_vert, config_path);;
305         config.opengl_scanline_horiz = MyGetPrivateProfileBool(_T("Screen"), _T("OpenGLScanLineHoriz"),
306                                                                                                            config.opengl_scanline_horiz, config_path);;
307         config.use_opengl_filters = MyGetPrivateProfileBool(_T("Screen"), _T("UseOpenGLFilters"),
308                                                                                                            config.use_opengl_filters, config_path);
309         config.opengl_filter_num =      MyGetPrivateProfileInt(_T("Screen"), _T("OpenGLFilterNum"),
310                                                                                                          config.opengl_filter_num, config_path);
311 #endif  
312         // sound
313         config.sound_frequency = MyGetPrivateProfileInt(_T("Sound"), _T("Frequency"), config.sound_frequency, config_path);
314         config.sound_latency = MyGetPrivateProfileInt(_T("Sound"), _T("Latency"), config.sound_latency, config_path);
315 #ifdef USE_SOUND_DEVICE_TYPE
316         config.sound_device_type = MyGetPrivateProfileInt(_T("Sound"), _T("DeviceType"), config.sound_device_type, config_path);
317 #endif
318 #if !defined(_USE_QT)
319         MyGetPrivateProfileString(_T("Sound"), _T("FMGenDll"), _T("mamefm.dll"), config.fmgen_dll_path, _MAX_PATH, config_path);
320 #endif  
321         // input
322         config.multiple_speakers = MyGetPrivateProfileBool(_T("Sound"), _T("MultipleSpeakers"),
323                                                                                                          config.multiple_speakers, config_path);
324         config.general_sound_level = MyGetPrivateProfileInt(_T("Sound"), _T("GeneralSoundLevel"),
325                                                                                                           config.general_sound_level, config_path);
326 #ifdef USE_MULTIPLE_SOUNDCARDS
327         {
328                 _TCHAR _tag[128];
329                 int ii;
330                 for(ii = 0; ii < USE_MULTIPLE_SOUNDCARDS; ii++) {
331                         memset(_tag, 0x00, sizeof(_tag));
332                         my_stprintf_s(_tag, 64, _T("DeviceVolumeLevel_%d"), ii + 1);
333                         config.sound_device_level[ii] = MyGetPrivateProfileInt(_T("Sound"), (const _TCHAR *)_tag, config.sound_device_level[ii], config_path);
334                 }
335         }
336 #endif
337 #ifdef _WIN32
338         config.use_direct_input = MyGetPrivateProfileBool(_T("Input"), _T("UseDirectInput"), config.use_direct_input, config_path);
339         config.disable_dwm = MyGetPrivateProfileBool(_T("Input"), _T("DisableDwm"), config.disable_dwm, config_path);
340 #endif
341         config.swap_joy_buttons = MyGetPrivateProfileBool(_T("Input"), _T("SwapJoyButtons"), config.swap_joy_buttons, config_path);
342 #if defined(_USE_QT)
343         for(i = 0; i < 16; i++) {
344                 _TCHAR name[256];
345                 my_stprintf_s(name, 256, _T("AssignedJoystick"), i + 1);
346                 MyGetPrivateProfileString(_T("Input"), (const _TCHAR *)name, _T(""),
347                                                                   config.assigned_joystick_name[i], 256, config_path);
348         }
349 #endif  
350         
351         // printer
352 #ifdef USE_PRINTER
353         config.printer_device_type = MyGetPrivateProfileInt(_T("Printer"), _T("DeviceType"), config.printer_device_type, config_path);
354         MyGetPrivateProfileString(_T("Printer"), _T("PrinterDll"), _T("printer.dll"), config.printer_dll_path, _MAX_PATH, config_path);
355 #endif
356 #if defined(_USE_QT) && !defined(Q_OS_WIN)
357         AGAR_DebugLog(AGAR_LOG_INFO, "Read Done.");
358 #endif
359 }
360
361 void save_config(const _TCHAR *config_path)
362 {
363         int drv, i;
364 #if !defined(_MSC_VER)
365         {
366                 FILEIO *pt = new FILEIO;
367                 if(pt->Fopen(config_path, FILEIO_WRITE_ASCII) != true) {
368                         delete pt;
369                         return;
370                 }
371                 pt->Fclose();
372                 delete pt;
373         }
374         
375 #endif  
376         // control
377 # ifdef USE_BOOT_MODE
378         MyWritePrivateProfileInt(_T("Control"), _T("BootMode"), config.boot_mode, config_path);
379 #endif
380 #ifdef USE_CPU_TYPE
381         MyWritePrivateProfileInt(_T("Control"), _T("CPUType"), config.cpu_type, config_path);
382 #endif
383 #ifdef USE_DIPSWITCH
384         MyWritePrivateProfileInt(_T("Control"), _T("DipSwitch"), config.dipswitch, config_path);
385 #endif
386 #ifdef USE_DEVICE_TYPE
387         MyWritePrivateProfileInt(_T("Control"), _T("DeviceType"), config.device_type, config_path);
388 #endif
389 #ifdef USE_DRIVE_TYPE
390         MyWritePrivateProfileInt(_T("Control"), _T("DriveType"), config.drive_type, config_path);
391 #endif
392 #ifdef USE_FD1
393         {
394                 _TCHAR name[64];
395                 for(drv = 0; drv < MAX_FD; drv++) {
396                         memset(name, 0x00, sizeof(name));
397                         my_stprintf_s(name, 64, _T("CorrectDiskTiming%d"), drv + 1);
398                         MyWritePrivateProfileBool(_T("Control"), (const _TCHAR *)name, config.correct_disk_timing[drv], config_path);
399                         my_stprintf_s(name, 64, _T("IgnoreDiskCRC%d"), drv + 1);
400                         MyWritePrivateProfileBool(_T("Control"), (const _TCHAR *)name, config.ignore_disk_crc[drv], config_path);
401                 }
402         }
403
404 #endif
405 #ifdef USE_TAPE
406         MyWritePrivateProfileBool(_T("Control"), _T("TapeSound"), config.tape_sound, config_path);
407         MyWritePrivateProfileBool(_T("Control"), _T("WaveShaper"), config.wave_shaper, config_path);
408         MyWritePrivateProfileBool(_T("Control"), _T("DirectLoadMZT"), config.direct_load_mzt, config_path);
409         MyWritePrivateProfileBool(_T("Control"), _T("BaudHigh"), config.baud_high, config_path);
410 #endif
411         
412         // recent files
413 #ifdef USE_CART1
414         MyWritePrivateProfileString(_T("RecentFiles"), _T("InitialCartDir"), config.initial_cart_dir, config_path);
415         for(drv = 0; drv < MAX_CART; drv++) {
416                 for(i = 0; i < MAX_HISTORY; i++) {
417                         _TCHAR name[64];
418                         my_stprintf_s(name, 64, _T("RecentCartPath%d_%d"), drv + 1, i + 1);
419                         MyWritePrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name, config.recent_cart_path[drv][i], config_path);
420                 }
421         }
422 #endif
423 #ifdef USE_FD1
424         MyWritePrivateProfileString(_T("RecentFiles"), _T("InitialDiskDir"), config.initial_disk_dir, config_path);
425         for(drv = 0; drv < MAX_FD; drv++) {
426                 for(i = 0; i < MAX_HISTORY; i++) {
427                         _TCHAR name[64];
428                         my_stprintf_s(name, 64, _T("RecentDiskPath%d_%d"), drv + 1, i + 1);
429                         MyWritePrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name,
430                                                                           config.recent_disk_path[drv][i], config_path);
431                 }
432         }
433 #endif
434 #ifdef USE_QD1
435         MyWritePrivateProfileString(_T("RecentFiles"), _T("InitialQuickDiskDir"),
436                                                           config.initial_quickdisk_dir, config_path);
437         for(drv = 0; drv < MAX_QD; drv++) {
438                 for(i = 0; i < MAX_HISTORY; i++) {
439                         _TCHAR name[64];
440                         my_stprintf_s(name, 64, _T("RecentQuickDiskPath%d_%d"), drv + 1, i + 1);
441                         MyWritePrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name,
442                                                                           config.recent_quickdisk_path[drv][i], config_path);
443                 }
444         }
445 #endif
446 #ifdef USE_TAPE
447         MyWritePrivateProfileString(_T("RecentFiles"), _T("InitialTapeDir"), config.initial_tape_dir, config_path);
448         for(i = 0; i < MAX_HISTORY; i++) {
449                 _TCHAR name[64];
450                 my_stprintf_s(name, 64, _T("RecentTapePath1_%d"), i + 1);
451                 MyWritePrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name,
452                                                                   config.recent_tape_path[i], config_path);
453         }
454 #endif
455 #ifdef USE_LASER_DISC
456         MyWritePrivateProfileString(_T("RecentFiles"), _T("InitialLaserDiscDir"), config.initial_laser_disc_dir, config_path);
457         for(int i = 0; i < MAX_HISTORY; i++) {
458                 _TCHAR name[64];
459                 my_stprintf_s(name, 64, _T("RecentLaserDiscPath1_%d"), i + 1);
460                 MyWritePrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name,
461                                                                   config.recent_laser_disc_path[i], config_path);
462         }
463 #endif
464 #ifdef USE_BINARY_FILE1
465         MyWritePrivateProfileString(_T("RecentFiles"), _T("InitialBinaryDir"), config.initial_binary_dir, config_path);
466         for(drv = 0; drv < MAX_BINARY; drv++) {
467                 for(i = 0; i < MAX_HISTORY; i++) {
468                         _TCHAR name[64];
469                         my_stprintf_s(name, 64, _T("RecentBinaryPath%d_%d"), drv + 1, i + 1);
470                         MyWritePrivateProfileString(_T("RecentFiles"), (const _TCHAR *)name,
471                                                                           config.recent_binary_path[drv][i], config_path);
472                 }
473         }
474 #endif
475         
476         // screen
477 #ifndef ONE_BOARD_MICRO_COMPUTER
478         MyWritePrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);
479 #ifdef _WIN32
480         MyWritePrivateProfileBool(_T("Screen"), _T("UseD3D9"), config.use_d3d9, config_path);
481         MyWritePrivateProfileBool(_T("Screen"), _T("WaitVSync"), config.wait_vsync, config_path);
482 #endif
483         MyWritePrivateProfileInt(_T("Screen"), _T("StretchType"), config.stretch_type, config_path);
484 #else
485         MyWritePrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);
486 #endif
487 #ifdef USE_MONITOR_TYPE
488         MyWritePrivateProfileInt(_T("Screen"), _T("MonitorType"), config.monitor_type, config_path);
489 #endif
490 #ifdef USE_CRT_FILTER
491         MyWritePrivateProfileBool(_T("Screen"), _T("CRTFilter"), config.crt_filter, config_path);
492 #endif
493 #ifdef USE_SCANLINE
494         MyWritePrivateProfileBool(_T("Screen"), _T("ScanLine"), config.scan_line, config_path);
495 #endif
496 #ifdef USE_SCREEN_ROTATE
497         MyWritePrivateProfileInt(_T("Screen"), _T("RotateType"), config.rotate_type, config_path);
498 #endif
499 #if defined(_USE_QT)
500         MyWritePrivateProfileBool(_T("Screen"), _T("UseOpenGLScanLine"),
501                                                         config.use_opengl_scanline, config_path);
502         MyWritePrivateProfileBool(_T("Screen"), _T("OpenGLScanLineVert"),
503                                                         config.opengl_scanline_vert, config_path);;
504         MyWritePrivateProfileBool(_T("Screen"), _T("OpenGLScanLineHoriz"),
505                                                         config.opengl_scanline_horiz, config_path);;
506         MyWritePrivateProfileBool(_T("Screen"), _T("UseOpenGLFilters"),
507                                                         config.use_opengl_filters, config_path);
508         MyWritePrivateProfileInt(_T("Screen"), _T("OpenGLFilterNum"),
509                                                    config.opengl_filter_num, config_path);
510 #endif  
511         
512         // sound
513         MyWritePrivateProfileInt(_T("Sound"), _T("Frequency"), config.sound_frequency, config_path);
514         MyWritePrivateProfileInt(_T("Sound"), _T("Latency"), config.sound_latency, config_path);
515 #ifdef USE_SOUND_DEVICE_TYPE
516         MyWritePrivateProfileInt(_T("Sound"), _T("DeviceType"), config.sound_device_type, config_path);
517 #endif
518 #if !defined(_USE_QT)
519         MyWritePrivateProfileString(_T("Sound"), _T("FMGenDll"), config.fmgen_dll_path, config_path);
520 #endif  
521         MyWritePrivateProfileBool(_T("Sound"), _T("MultipleSpeakers"),
522                                                         config.multiple_speakers, config_path);
523         MyWritePrivateProfileInt(_T("Sound"), _T("GeneralSoundLevel"),
524                                                    config.general_sound_level, config_path);
525 #ifdef USE_MULTIPLE_SOUNDCARDS
526         {
527                 _TCHAR _tag[128];
528                 int ii;
529                 for(ii = 0; ii < USE_MULTIPLE_SOUNDCARDS; ii++) {
530                         memset(_tag, 0x00, sizeof(_tag));
531                         my_stprintf_s(_tag, 64, _T("DeviceVolumeLevel_%d"), ii + 1);
532                         MyWritePrivateProfileInt(_T("Sound"), (const _TCHAR *)_tag, config.sound_device_level[ii], config_path);
533                 }
534         }
535 #endif
536         // input
537 #ifdef _WIN32
538         MyWritePrivateProfileBool(_T("Input"), _T("UseDirectInput"), config.use_direct_input, config_path);
539         MyWritePrivateProfileBool(_T("Input"), _T("DisableDwm"), config.disable_dwm, config_path);
540 #endif
541         MyWritePrivateProfileBool(_T("Input"), _T("SwapJoyButtons"), config.swap_joy_buttons, config_path);
542 #if defined(_USE_QT)
543         for(i = 0; i < 16; i++) {
544                 _TCHAR name[256];
545                 my_stprintf_s(name, 256, _T("AssignedJoystick%d"), i + 1);
546                 MyWritePrivateProfileString(_T("Input"), (const _TCHAR *)name, 
547                                                                         config.assigned_joystick_name[i], config_path);
548         }
549 #endif  
550         
551         // printer
552 #ifdef USE_PRINTER
553         MyWritePrivateProfileInt(_T("Printer"), _T("DeviceType"), config.printer_device_type, config_path);
554 #endif
555 #if defined(_USE_QT) && !defined(Q_OS_WIN)
556         AGAR_DebugLog(AGAR_LOG_INFO, "Write done.");
557 #endif
558 }
559
560 #define STATE_VERSION   4
561
562 void save_config_state(void *f)
563 {
564         FILEIO *state_fio = (FILEIO *)f;
565         int drv;
566         
567         state_fio->FputUint32(STATE_VERSION);
568         
569 #ifdef USE_BOOT_MODE
570         state_fio->FputInt32(config.boot_mode);
571 #endif
572 #ifdef USE_CPU_TYPE
573         state_fio->FputInt32(config.cpu_type);
574 #endif
575 #ifdef USE_DIPSWITCH
576         state_fio->FputUint32(config.dipswitch);
577 #endif
578 #ifdef USE_DEVICE_TYPE
579         state_fio->FputInt32(config.device_type);
580 #endif
581 #ifdef USE_DRIVE_TYPE
582         state_fio->FputInt32(config.drive_type);
583 #endif
584 #ifdef USE_FD1
585         for(int drv = 0; drv < MAX_FD; drv++) {
586                 state_fio->FputBool(config.correct_disk_timing[drv]);
587                 state_fio->FputBool(config.ignore_disk_crc[drv]);
588         }
589 //      for(int drv = 0; drv < MAX_FD; drv++) {
590 //              state_fio->FputBool(config.fdd_hack_fast_transfer[drv]);
591 //      }
592 #endif
593 #ifdef USE_MONITOR_TYPE
594         state_fio->FputInt32(config.monitor_type);
595 #endif
596 #ifdef USE_SOUND_DEVICE_TYPE
597         state_fio->FputInt32(config.sound_device_type);
598 #endif
599 #ifdef USE_PRINTER
600         state_fio->FputInt32(config.printer_device_type);
601 #endif
602         
603 }
604
605 bool load_config_state(void *f)
606 {
607         FILEIO *state_fio = (FILEIO *)f;
608         
609         if(state_fio->FgetUint32() != STATE_VERSION) {
610                 return false;
611         }
612 #ifdef USE_BOOT_MODE
613         config.boot_mode = state_fio->FgetInt32();
614 #endif
615 #ifdef USE_CPU_TYPE
616         config.cpu_type = state_fio->FgetInt32();
617 #endif
618 #ifdef USE_DIPSWITCH
619         config.dipswitch = state_fio->FgetUint32();
620 #endif
621 #ifdef USE_DEVICE_TYPE
622         config.device_type = state_fio->FgetInt32();
623 #endif
624 #ifdef USE_DRIVE_TYPE
625         config.drive_type = state_fio->FgetInt32();
626 #endif
627 #ifdef USE_FD1
628         for(int drv = 0; drv < MAX_FD; drv++) {
629                 config.correct_disk_timing[drv] = state_fio->FgetBool();
630                 config.ignore_disk_crc[drv] = state_fio->FgetBool();
631         }
632 //      for(int drv = 0; drv < MAX_FD; drv++) {
633 //              config.fdd_hack_fast_transfer[drv] = state_fio->FgetBool();
634 //      }
635 #endif
636 #ifdef USE_MONITOR_TYPE
637         config.monitor_type = state_fio->FgetInt32();
638 #endif
639 #ifdef USE_SOUND_DEVICE_TYPE
640         config.sound_device_type = state_fio->FgetInt32();
641 #endif
642 #ifdef USE_PRINTER
643         config.printer_device_type = state_fio->FgetInt32();
644 #endif
645         return true;
646 }
647