OSDN Git Service

[Draw][Agar][GL] Add GL Renderer.
[csp-qt/common_source_project-fm7.git] / source / src / config.cpp
1 /*\r
2         Skelton for retropc emulator\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2006.08.18 -\r
6 \r
7         [ config ]\r
8 */\r
9 #if defined(_USE_AGAR) || defined(_USE_SDL)\r
10 #include <SDL/SDL.h>\r
11 #include <agar/core.h>\r
12 #include <string>\r
13 #include <vector>\r
14 #include "fileio.h"\r
15 #include "agar_logger.h"\r
16 #else\r
17 #include <windows.h>\r
18 #endif\r
19 \r
20 #include <stdlib.h>\r
21 #include <stdio.h>\r
22 #include "common.h"\r
23 #include "config.h"\r
24 #include "fileio.h"\r
25 #if defined(_USE_AGAR) || defined(_USE_SDL)\r
26 #include "agar_main.h"\r
27 #endif\r
28 \r
29 config_t config;\r
30 \r
31 #ifndef CONFIG_NAME\r
32 #define CONFIG_NAME "conf"\r
33 #endif\r
34 \r
35 #if defined(_USE_AGAR)\r
36 \r
37 \r
38 \r
39 bool WritePrivateProfileString(char *lpAppName, char *lpKeyName, char *Value, FILEIO *lpFileName)\r
40 {\r
41    char s[129];\r
42    snprintf(s, 128, "%s.%s=%s\n", lpAppName, lpKeyName, Value);\r
43    //AG_WriteString(lpFileName, s);\r
44    lpFileName->Fwrite(s, strlen(s), 1);\r
45    return true;\r
46 }\r
47 \r
48 bool WritePrivateProfileInt(char *lpAppName, char *lpKeyName, int Value, FILEIO *lpFileName)\r
49 {\r
50    char s[129];\r
51    snprintf(s, 128, "%s.%s=%d\n", lpAppName, lpKeyName, Value);\r
52    //AG_WriteString(lpFileName, s);\r
53    lpFileName->Fwrite(s, strlen(s), 1);\r
54    return true;\r
55 }\r
56 \r
57 BOOL WritePrivateProfileBool(char *lpAppName, char *lpKeyName, bool Value, FILEIO *lpFileName)\r
58 {\r
59         char String[129];\r
60         snprintf(String, 128, "%s.%s=%d\n", lpAppName, lpKeyName, Value ? 1 : 0);\r
61         lpFileName->Fwrite(String, strlen(String), 1);\r
62         //AG_WriteString(lpFileName, String);\r
63         return true;\r
64 }\r
65  \r
66 \r
67 \r
68 std::string GetPrivateProfileStr(char *lpAppName, char *lpKeyName, FILEIO *lpFileName)\r
69 {\r
70    char key[256];\r
71    char ibuf[AG_PATHNAME_MAX + 102];\r
72    int i;\r
73    int c = '\0';\r
74    std::string::size_type  pos;\r
75    std::string key_str;\r
76    std::string got_str;\r
77   \r
78    snprintf(key, 255, "%s.%s", lpAppName, lpKeyName);\r
79    AGAR_DebugLog(AGAR_LOG_DEBUG, "Try App: %s Key: %s", lpAppName, lpKeyName);\r
80    lpFileName->Fseek(0, FILEIO_SEEK_SET);\r
81    do {\r
82       key_str = key;\r
83       ibuf[0] = '\0';\r
84       i = 0;\r
85       while(1) {\r
86         if(i > (AG_PATHNAME_MAX + 100)) break;\r
87         c = (char)lpFileName->Fgetc();\r
88         if(c == EOF) break;\r
89         if(c == '\n') break;\r
90         ibuf[i] = (char)c;\r
91         i++;\r
92       }\r
93       ibuf[i] = '\0';\r
94       got_str = ibuf;\r
95       //AGAR_DebugLog(AGAR_LOG_DEBUG, "Got: %s %d chars.\n", got_str.c_str(), i);\r
96       key_str = key_str + "=";\r
97       pos = got_str.find(key_str);\r
98       if(pos != std::string::npos) break;\r
99       if(c == EOF) return "";\r
100    } while(c != EOF);\r
101 \r
102    got_str.erase(0, pos + key_str.length());\r
103    //AGAR_DebugLog(AGAR_LOG_DEBUG, "Ok. Got %s = %s.\n", key, got_str.c_str());\r
104    return got_str;\r
105 }\r
106 \r
107 void GetPrivateProfileString(char *section, char *key, char *defaultstr, char *str, int max_len, FILEIO *p)\r
108 {\r
109    std::string sp = GetPrivateProfileStr(section, key, p);\r
110 //   printf("Got: %s\n", sp.c_str());\r
111    \r
112    if((!sp.empty()) && (max_len > 1)){\r
113         strncpy(str, sp.c_str(), max_len);\r
114    } else {\r
115         strncpy(str, defaultstr, max_len);\r
116    }\r
117    printf("Got: %s\n", str);\r
118  \r
119 }\r
120 \r
121 int GetPrivateProfileInt(char *lpAppName, char *lpKeyName, int nDefault, FILEIO *lpFileName)\r
122 {\r
123    int i;\r
124    std::string s = GetPrivateProfileStr(lpAppName,lpKeyName, lpFileName);\r
125 \r
126    if(s.empty()) {\r
127       i = nDefault;\r
128    } else {\r
129       i = strtol(s.c_str(), NULL, 10);\r
130    }\r
131    printf("Got: %d\n", i);\r
132    return i;\r
133 }\r
134 \r
135 \r
136 \r
137 bool GetPrivateProfileBool(char *lpAppName, char *lpKeyName, bool bDefault, FILEIO *lpFileName)\r
138 {\r
139    \r
140         return (GetPrivateProfileInt(lpAppName, lpKeyName, bDefault ? 1 : 0, lpFileName) != 0);\r
141 }\r
142    \r
143 #else\r
144 BOOL WritePrivateProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, int Value, LPCTSTR lpFileName)\r
145 {\r
146         _TCHAR String[32];\r
147         _stprintf(String, _T("%d"), Value);\r
148         return WritePrivateProfileString(lpAppName, lpKeyName, String, lpFileName);\r
149 }\r
150 \r
151 BOOL WritePrivateProfileBool(LPCTSTR lpAppName, LPCTSTR lpKeyName, bool Value, LPCTSTR lpFileName)\r
152 {\r
153         _TCHAR String[32];\r
154         _stprintf(String, _T("%d"), Value ? 1 : 0);\r
155         return WritePrivateProfileString(lpAppName, lpKeyName, String, lpFileName);\r
156 }\r
157 \r
158 bool GetPrivateProfileBool(LPCTSTR lpAppName, LPCTSTR lpKeyName, bool bDefault, LPCTSTR lpFileName)\r
159 {\r
160         return (GetPrivateProfileInt(lpAppName, lpKeyName, bDefault ? 1 : 0, lpFileName) != 0);\r
161 }\r
162 \r
163 #endif\r
164 void init_config()\r
165 {\r
166         // initial settings\r
167         memset(&config, 0, sizeof(config_t));\r
168         \r
169 #if !(defined(USE_BITMAP) || defined(USE_LED))\r
170         config.use_d3d9 = true;\r
171         config.stretch_type = 1;        // Stretch (Aspect)\r
172 #endif\r
173         config.sound_frequency = 6;     // 48KHz\r
174         config.sound_latency = 1;       // 100msec\r
175         \r
176 #if defined(USE_TAPE)\r
177         config.wave_shaper = true;\r
178         config.direct_load_mzt = true;\r
179 #endif\r
180 #if defined(USE_DIPSWITCH) && defined(DIPSWITCH_DEFAULT)\r
181         config.dipswitch = DIPSWITCH_DEFAULT;\r
182 #endif\r
183 #if defined(_HC80)\r
184         config.device_type = 2;         // Nonintelligent ram disk\r
185 #endif\r
186 #if defined(_PC8801MA)\r
187         config.boot_mode = 2;           // V2 mode, 4MHz\r
188         config.cpu_type = 1;\r
189 #endif\r
190 #if defined(_X1TURBO) || defined(_X1TURBOZ)\r
191         config.device_type = 1;         // Keyboard mode B\r
192 #endif\r
193 #if defined(_X1) || defined(_X1TWIN) || defined(_X1TURBO) || defined(_X1TURBOZ)\r
194         config.sound_device_type = 1;   // CZ-8BS1\r
195 #endif\r
196 }\r
197 \r
198 void load_config()\r
199 {\r
200    int drv, i;\r
201         // initial settings\r
202         init_config();\r
203         \r
204         // get config path\r
205 \r
206 #if defined(_USE_AGAR) || defined(_USE_SDL) \r
207         char app_path2[_MAX_PATH], *ptr;\r
208         char cfgpath[_MAX_PATH];\r
209         FILEIO *config_path = new FILEIO();\r
210    \r
211         app_path2[0] = '\0';\r
212         cfgpath[0] = '\0';\r
213         //GetFullPathName(config_path, _MAX_PATH, app_path, &ptr);\r
214         cpp_confdir.copy(app_path2, _MAX_PATH, 0);\r
215         strncat(app_path2, CONFIG_NAME, _MAX_PATH);\r
216         strncat(app_path2, ".ini", _MAX_PATH);\r
217 \r
218         AGAR_DebugLog(AGAR_LOG_INFO, "Try to read config: %s", app_path2);\r
219         if(!config_path->Fopen(app_path2, FILEIO_READ_ASCII)) return;\r
220         AGAR_DebugLog(AGAR_LOG_INFO, "OK.");\r
221 #else\r
222         _TCHAR app_path[_MAX_PATH], config_path[_MAX_PATH], *ptr;\r
223         GetModuleFileName(NULL, config_path, _MAX_PATH);\r
224         GetFullPathName(config_path, _MAX_PATH, app_path, &ptr);\r
225         *ptr = _T('\0');\r
226         _stprintf(config_path, _T("%s%s.ini"), app_path, _T(CONFIG_NAME));\r
227 #endif\r
228    \r
229         \r
230         // control\r
231 #ifdef USE_BOOT_MODE\r
232         config.boot_mode = GetPrivateProfileInt(_T("Control"), _T("BootMode"), config.boot_mode, config_path);\r
233 #endif\r
234 #ifdef USE_CPU_TYPE\r
235         config.cpu_type = GetPrivateProfileInt(_T("Control"), _T("CPUType"), config.cpu_type, config_path);\r
236 #endif\r
237 #ifdef USE_DIPSWITCH\r
238         config.dipswitch = GetPrivateProfileInt(_T("Control"), _T("DipSwitch"), config.dipswitch, config_path);\r
239 #endif\r
240 #ifdef USE_DEVICE_TYPE\r
241         config.device_type = GetPrivateProfileInt(_T("Control"), _T("DeviceType"), config.device_type, config_path);\r
242 #endif\r
243 #ifdef USE_FD1\r
244         config.ignore_crc = GetPrivateProfileBool(_T("Control"), _T("IgnoreCRC"), config.ignore_crc, config_path);\r
245 #endif\r
246 #ifdef USE_TAPE\r
247         config.wave_shaper = GetPrivateProfileBool(_T("Control"), _T("WaveShaper"), config.wave_shaper, config_path);\r
248         config.direct_load_mzt = GetPrivateProfileBool(_T("Control"), _T("DirectLoadMZT"), config.direct_load_mzt, config_path);\r
249 #endif\r
250         \r
251         // recent files\r
252 #ifdef USE_CART1\r
253         GetPrivateProfileString(_T("RecentFiles"), _T("InitialCartDir"), _T(""), config.initial_cart_dir, _MAX_PATH, config_path);\r
254         for(drv = 0; drv < MAX_CART; drv++) {\r
255                 for(i = 0; i < MAX_HISTORY; i++) {\r
256                         _TCHAR name[64];\r
257                         sprintf(name, _T("RecentCartPath%d_%d"), drv + 1, i + 1);\r
258                         GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_cart_path[drv][i], _MAX_PATH, config_path);\r
259                 }\r
260         }\r
261 #endif\r
262 #ifdef USE_FD1\r
263         GetPrivateProfileString(_T("RecentFiles"), _T("InitialDiskDir"), _T(""), config.initial_disk_dir, _MAX_PATH, config_path);\r
264         get_parent_dir(config.initial_disk_dir);\r
265         for(drv = 0; drv < MAX_FD; drv++) {\r
266                 for(i = 0; i < MAX_HISTORY; i++) {\r
267                         _TCHAR name[64];\r
268                         sprintf(name, _T("RecentDiskPath%d_%d"), drv + 1, i + 1);\r
269                         GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_disk_path[drv][i], _MAX_PATH, config_path);\r
270                 }\r
271         }\r
272 #endif\r
273 #ifdef USE_QD1\r
274         GetPrivateProfileString(_T("RecentFiles"), _T("InitialQuickDiskDir"), _T(""), config.initial_quickdisk_dir, _MAX_PATH, config_path);\r
275         for(drv = 0; drv < MAX_QD; drv++) {\r
276                 for(i = 0; i < MAX_HISTORY; i++) {\r
277                         _TCHAR name[64];\r
278                         sprintf(name, _T("RecentQuickDiskPath%d_%d"), drv + 1, i + 1);\r
279                         GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_quickdisk_path[drv][i], _MAX_PATH, config_path);\r
280                 }\r
281         }\r
282 #endif\r
283 #ifdef USE_TAPE\r
284         GetPrivateProfileString(_T("RecentFiles"), _T("InitialTapeDir"), _T(""), config.initial_tape_dir, _MAX_PATH, config_path);\r
285         for(i = 0; i < MAX_HISTORY; i++) {\r
286                 _TCHAR name[64];\r
287                 sprintf(name, _T("RecentTapePath1_%d"), i + 1);\r
288                 GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_tape_path[i], _MAX_PATH, config_path);\r
289         }\r
290 #endif\r
291 #ifdef USE_LASER_DISC\r
292         GetPrivateProfileString(_T("RecentFiles"), _T("InitialLaserDiscDir"), _T(""), config.initial_laser_disc_dir, _MAX_PATH, config_path);\r
293         for(int i = 0; i < MAX_HISTORY; i++) {\r
294                 _TCHAR name[64];\r
295                 sprintf(name, _T("RecentLaserDiscPath1_%d"), i + 1);\r
296                 GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_laser_disc_path[i], _MAX_PATH, config_path);\r
297         }\r
298 #endif\r
299 #ifdef USE_BINARY_FILE1\r
300         GetPrivateProfileString(_T("RecentFiles"), _T("InitialBinaryDir"), _T(""), config.initial_binary_dir, _MAX_PATH, config_path);\r
301         for(drv = 0; drv < MAX_BINARY; drv++) {\r
302                 for(i = 0; i < MAX_HISTORY; i++) {\r
303                         _TCHAR name[64];\r
304                         sprintf(name, _T("RecentBinaryPath%d_%d"), drv + 1, i + 1);\r
305                         GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_binary_path[drv][i], _MAX_PATH, config_path);\r
306                 }\r
307         }\r
308 #endif\r
309         \r
310         // screen\r
311 #if !(defined(USE_BITMAP) || defined(USE_LED))\r
312         config.window_mode = GetPrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);\r
313         config.use_d3d9 = GetPrivateProfileBool(_T("Screen"), _T("UseD3D9"), config.use_d3d9, config_path);\r
314         config.wait_vsync = GetPrivateProfileBool(_T("Screen"), _T("WaitVSync"), config.wait_vsync, config_path);\r
315         config.stretch_type = GetPrivateProfileInt(_T("Screen"), _T("StretchType"), config.stretch_type, config_path);\r
316 #endif\r
317 #ifdef USE_MONITOR_TYPE\r
318         config.monitor_type = GetPrivateProfileInt(_T("Screen"), _T("MonitorType"), config.monitor_type, config_path);\r
319 #endif\r
320 #ifdef USE_CRT_FILTER\r
321         config.crt_filter = GetPrivateProfileBool(_T("Screen"), _T("CRTFilter"), config.crt_filter, config_path);\r
322 #endif\r
323 #ifdef USE_SCANLINE\r
324         config.scan_line = GetPrivateProfileBool(_T("Screen"), _T("ScanLine"), config.scan_line, config_path);\r
325 #endif\r
326         \r
327         // sound\r
328         config.sound_frequency = GetPrivateProfileInt(_T("Sound"), _T("Frequency"), config.sound_frequency, config_path);\r
329         config.sound_latency = GetPrivateProfileInt(_T("Sound"), _T("Latency"), config.sound_latency, config_path);\r
330 #ifdef USE_SOUND_DEVICE_TYPE\r
331         config.sound_device_type = GetPrivateProfileInt(_T("Sound"), _T("DeviceType"), config.sound_device_type, config_path);\r
332 #endif\r
333         GetPrivateProfileString(_T("Sound"), _T("FMGenDll"), _T("mamefm.dll"), config.fmgen_dll_path, _MAX_PATH, config_path);\r
334 \r
335 #if defined(_USE_AGAR) || (_USE_SDL)\r
336      config_path->Fclose();\r
337      delete config_path;\r
338 #endif\r
339 }\r
340 \r
341 void save_config()\r
342 {\r
343    int drv, i;\r
344 \r
345         // get config path\r
346 #if defined(_USE_AGAR) || defined(_USE_SDL)\r
347         char app_path2[_MAX_PATH], *ptr;\r
348         char cfgpath[_MAX_PATH];\r
349         FILEIO *config_path = new FILEIO();\r
350    \r
351         app_path2[0] = '\0';\r
352         cfgpath[0] = '\0';\r
353         //GetFullPathName(config_path, _MAX_PATH, app_path, &ptr);\r
354         cpp_confdir.copy(app_path2, _MAX_PATH, 0);\r
355         \r
356         strncat(app_path2, CONFIG_NAME, _MAX_PATH);\r
357         strncat(app_path2, ".ini", _MAX_PATH);\r
358 \r
359 #if defined(_USE_AGAR) || defined(_USE_SDL)\r
360         AGAR_DebugLog(AGAR_LOG_INFO, "Try to write config: %s", app_path2);\r
361 #else\r
362         printf("Try to write config: %s\n", app_path2);\r
363 #endif\r
364 \r
365         if(config_path->Fopen(app_path2, FILEIO_WRITE_ASCII) != true) return;\r
366         AGAR_DebugLog(AGAR_LOG_INFO, "OK.");\r
367 \r
368 #else\r
369         _TCHAR app_path[_MAX_PATH], config_path[_MAX_PATH], *ptr;\r
370         GetModuleFileName(NULL, config_path, _MAX_PATH);\r
371         GetFullPathName(config_path, _MAX_PATH, app_path, &ptr);\r
372         *ptr = _T('\0');\r
373         _stprintf(config_path, _T("%s%s.ini"), app_path, _T(CONFIG_NAME));\r
374 #endif  \r
375         // control\r
376 \r
377 # ifdef USE_BOOT_MODE\r
378         WritePrivateProfileInt(_T("Control"), _T("BootMode"), config.boot_mode, config_path);\r
379 #endif\r
380 #ifdef USE_CPU_TYPE\r
381         WritePrivateProfileInt(_T("Control"), _T("CPUType"), config.cpu_type, config_path);\r
382 #endif\r
383 #ifdef USE_DIPSWITCH\r
384         WritePrivateProfileInt(_T("Control"), _T("DipSwitch"), config.dipswitch, config_path);\r
385 #endif\r
386 #ifdef USE_DEVICE_TYPE\r
387         WritePrivateProfileInt(_T("Control"), _T("DeviceType"), config.device_type, config_path);\r
388 #endif\r
389 #ifdef USE_FD1\r
390         WritePrivateProfileBool(_T("Control"), _T("IgnoreCRC"), config.ignore_crc, config_path);\r
391 #endif\r
392 #ifdef USE_TAPE\r
393         WritePrivateProfileBool(_T("Control"), _T("WaveShaper"), config.wave_shaper, config_path);\r
394         WritePrivateProfileBool(_T("Control"), _T("DirectLoadMZT"), config.direct_load_mzt, config_path);\r
395 #endif\r
396         \r
397         // recent files\r
398 #ifdef USE_CART1\r
399         WritePrivateProfileString(_T("RecentFiles"), _T("InitialCartDir"), config.initial_cart_dir, config_path);\r
400         for(drv = 0; drv < MAX_CART; drv++) {\r
401                 for(i = 0; i < MAX_HISTORY; i++) {\r
402                         _TCHAR name[64];\r
403                         sprintf(name, _T("RecentCartPath%d_%d"), drv + 1, i + 1);\r
404                         WritePrivateProfileString(_T("RecentFiles"), name, config.recent_cart_path[drv][i], config_path);\r
405                 }\r
406         }\r
407 #endif\r
408 #ifdef USE_FD1\r
409         WritePrivateProfileString(_T("RecentFiles"), _T("InitialDiskDir"), config.initial_disk_dir, config_path);\r
410         for(drv = 0; drv < MAX_FD; drv++) {\r
411                 for(i = 0; i < MAX_HISTORY; i++) {\r
412                         _TCHAR name[64];\r
413                         sprintf(name, _T("RecentDiskPath%d_%d"), drv + 1, i + 1);\r
414                         WritePrivateProfileString(_T("RecentFiles"), name, config.recent_disk_path[drv][i], config_path);\r
415                 }\r
416         }\r
417 #endif\r
418 #ifdef USE_QD1\r
419         WritePrivateProfileString(_T("RecentFiles"), _T("InitialQuickDiskDir"), config.initial_quickdisk_dir, config_path);\r
420         for(drv = 0; drv < MAX_QD; drv++) {\r
421                 for(i = 0; i < MAX_HISTORY; i++) {\r
422                         _TCHAR name[64];\r
423                         sprintf(name, _T("RecentQuickDiskPath%d_%d"), drv + 1, i + 1);\r
424                         WritePrivateProfileString(_T("RecentFiles"), name, config.recent_quickdisk_path[drv][i], config_path);\r
425                 }\r
426         }\r
427 #endif\r
428 #ifdef USE_TAPE\r
429         WritePrivateProfileString(_T("RecentFiles"), _T("InitialTapeDir"), config.initial_tape_dir, config_path);\r
430         for(i = 0; i < MAX_HISTORY; i++) {\r
431                 _TCHAR name[64];\r
432                 sprintf(name, _T("RecentTapePath1_%d"), i + 1);\r
433                 WritePrivateProfileString(_T("RecentFiles"), name, config.recent_tape_path[i], config_path);\r
434         }\r
435 #endif\r
436 #ifdef USE_LASER_DISC\r
437         WritePrivateProfileString(_T("RecentFiles"), _T("InitialLaserDiscDir"), config.initial_laser_disc_dir, config_path);\r
438         for(int i = 0; i < MAX_HISTORY; i++) {\r
439                 _TCHAR name[64];\r
440                 sprintf(name, _T("RecentLaserDiscPath1_%d"), i + 1);\r
441                 WritePrivateProfileString(_T("RecentFiles"), name, config.recent_laser_disc_path[i], config_path);\r
442         }\r
443 #endif\r
444 #ifdef USE_BINARY_FILE1\r
445         WritePrivateProfileString(_T("RecentFiles"), _T("InitialBinaryDir"), config.initial_binary_dir, config_path);\r
446         for(drv = 0; drv < MAX_BINARY; drv++) {\r
447                 for(i = 0; i < MAX_HISTORY; i++) {\r
448                         _TCHAR name[64];\r
449                         sprintf(name, _T("RecentBinaryPath%d_%d"), drv + 1, i + 1);\r
450                         WritePrivateProfileString(_T("RecentFiles"), name, config.recent_binary_path[drv][i], config_path);\r
451                 }\r
452         }\r
453 #endif\r
454         \r
455         // screen\r
456 #if !(defined(USE_BITMAP) || defined(USE_LED))\r
457         WritePrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);\r
458         WritePrivateProfileBool(_T("Screen"), _T("UseD3D9"), config.use_d3d9, config_path);\r
459         WritePrivateProfileBool(_T("Screen"), _T("WaitVSync"), config.wait_vsync, config_path);\r
460         WritePrivateProfileInt(_T("Screen"), _T("StretchType"), config.stretch_type, config_path);\r
461 #endif\r
462 #ifdef USE_MONITOR_TYPE\r
463         WritePrivateProfileInt(_T("Screen"), _T("MonitorType"), config.monitor_type, config_path);\r
464 #endif\r
465 #ifdef USE_CRT_FILTER\r
466         WritePrivateProfileBool(_T("Screen"), _T("CRTFilter"), config.crt_filter, config_path);\r
467 #endif\r
468 #ifdef USE_SCANLINE\r
469         WritePrivateProfileBool(_T("Screen"), _T("ScanLine"), config.scan_line, config_path);\r
470 #endif\r
471         \r
472         // sound\r
473         WritePrivateProfileInt(_T("Sound"), _T("Frequency"), config.sound_frequency, config_path);\r
474         WritePrivateProfileInt(_T("Sound"), _T("Latency"), config.sound_latency, config_path);\r
475 #ifdef USE_SOUND_DEVICE_TYPE\r
476         WritePrivateProfileInt(_T("Sound"), _T("DeviceType"), config.sound_device_type, config_path);\r
477 #endif\r
478 #if defined(_USE_AGAR) || (_USE_SDL)\r
479         config_path->Fclose();\r
480         delete config_path;\r
481 #endif\r
482 \r
483 }\r
484 \r
485 #define STATE_VERSION   1\r
486 \r
487 void save_config_state(void *f)\r
488 {\r
489         FILEIO *state_fio = (FILEIO *)f;\r
490         \r
491         state_fio->FputUint32(STATE_VERSION);\r
492         \r
493 #ifdef USE_BOOT_MODE\r
494         state_fio->FputInt32(config.boot_mode);\r
495 #endif\r
496 #ifdef USE_CPU_TYPE\r
497         state_fio->FputInt32(config.cpu_type);\r
498 #endif\r
499 #ifdef USE_DIPSWITCH\r
500         state_fio->FputUint32(config.dipswitch);\r
501 #endif\r
502 #ifdef USE_DEVICE_TYPE\r
503         state_fio->FputInt32(config.device_type);\r
504 #endif\r
505 #ifdef USE_FD1\r
506         state_fio->FputBool(config.ignore_crc);\r
507 #endif\r
508 #ifdef USE_MONITOR_TYPE\r
509         state_fio->FputInt32(config.monitor_type);\r
510 #endif\r
511 #ifdef USE_SOUND_DEVICE_TYPE\r
512         state_fio->FputInt32(config.sound_device_type);\r
513 #endif\r
514 }\r
515 \r
516 bool load_config_state(void *f)\r
517 {\r
518         FILEIO *state_fio = (FILEIO *)f;\r
519         \r
520         if(state_fio->FgetUint32() != STATE_VERSION) {\r
521                 return false;\r
522         }\r
523 #ifdef USE_BOOT_MODE\r
524         config.boot_mode = state_fio->FgetInt32();\r
525 #endif\r
526 #ifdef USE_CPU_TYPE\r
527         config.cpu_type = state_fio->FgetInt32();\r
528 #endif\r
529 #ifdef USE_DIPSWITCH\r
530         config.dipswitch = state_fio->FgetUint32();\r
531 #endif\r
532 #ifdef USE_DEVICE_TYPE\r
533         config.device_type = state_fio->FgetInt32();\r
534 #endif\r
535 #ifdef USE_FD1\r
536         config.ignore_crc = state_fio->FgetBool();\r
537 #endif\r
538 #ifdef USE_MONITOR_TYPE\r
539         config.monitor_type = state_fio->FgetInt32();\r
540 #endif\r
541 #ifdef USE_SOUND_DEVICE_TYPE\r
542         config.sound_device_type = state_fio->FgetInt32();\r
543 #endif\r
544         return true;\r
545 }\r
546 \r