2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
11 #include <agar/core.h>
15 #include "agar_logger.h"
19 //# include <SDL/SDL.h>
23 #include "agar_logger.h"
34 #if defined(_USE_AGAR)
35 #include "agar_main.h"
41 #define CONFIG_NAME "conf"
44 #if defined(_USE_AGAR) || defined(_USE_QT)
45 bool WritePrivateProfileString(char *lpAppName, char *lpKeyName, char *Value, FILEIO *lpFileName)
51 s = s + lpKeyName + "=";
54 lpFileName->Fwrite((void *)s.c_str(), s.length(), 1);
58 bool WritePrivateProfileInt(char *lpAppName, char *lpKeyName, int Value, FILEIO *lpFileName)
63 memset(valuebuf, 0x00, 256);
65 l = snprintf(valuebuf, 254, "%d", Value);
66 if((l <= 0) || (l >= 253)) return false;
69 s = s + lpKeyName + "=";
70 s = s + valuebuf + "\n";
71 lpFileName->Fwrite((void *)s.c_str(), s.length(), 1);
76 BOOL WritePrivateProfileBool(char *lpAppName, char *lpKeyName, bool Value, FILEIO *lpFileName)
80 return WritePrivateProfileInt(lpAppName, lpKeyName, v, lpFileName);
85 std::string GetPrivateProfileStr(char *lpAppName, char *lpKeyName, FILEIO *lpFileName)
88 char ibuf[4096 + 102];
92 std::string::size_type pos;
98 key = key + lpKeyName;
99 AGAR_DebugLog(AGAR_LOG_DEBUG, "Try App: %s Key: %s", lpAppName, lpKeyName);
100 lpFileName->Fseek(0, FILEIO_SEEK_SET);
107 if(l_len > (4096 + 100)) { // Too long, read dummy.
108 c = (char)lpFileName->Fgetc();
109 if((c != EOF) && (c != '\n') && (c != '\0')) continue;
112 c = (char)lpFileName->Fgetc();
113 if((c == EOF) || (c == '\n') || (c == '\0')) break;
121 //AGAR_DebugLog(AGAR_LOG_DEBUG, "Got: %s %d chars.\n", got_str.c_str(), i);
122 key_str = key_str + "=";
123 pos = got_str.find(key_str);
124 if(pos != std::string::npos) break;
125 if(c == EOF) return "";
128 got_str.erase(0, pos + key_str.length());
129 //AGAR_DebugLog(AGAR_LOG_DEBUG, "Ok. Got %s = %s.\n", key, got_str.c_str());
133 void GetPrivateProfileString(char *section, char *key, char *defaultstr, char *str, int max_len, FILEIO *p)
135 std::string sp = GetPrivateProfileStr(section, key, p);
136 // printf("Got: %s\n", sp.c_str());
138 if((!sp.empty()) && (max_len > 1)){
139 strncpy(str, sp.c_str(), max_len);
141 strncpy(str, defaultstr, max_len);
143 printf("Got: %s\n", str);
147 int GetPrivateProfileInt(char *lpAppName, char *lpKeyName, int nDefault, FILEIO *lpFileName)
150 std::string s = GetPrivateProfileStr(lpAppName,lpKeyName, lpFileName);
155 i = strtol(s.c_str(), NULL, 10);
157 printf("Got: %d\n", i);
163 bool GetPrivateProfileBool(char *lpAppName, char *lpKeyName, bool bDefault, FILEIO *lpFileName)
166 return (GetPrivateProfileInt(lpAppName, lpKeyName, bDefault ? 1 : 0, lpFileName) != 0);
170 extern _TCHAR* get_parent_dir(_TCHAR* file);
171 BOOL WritePrivateProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, int Value, LPCTSTR lpFileName)
174 _stprintf_s(String, 32, _T("%d"), Value);
175 return WritePrivateProfileString(lpAppName, lpKeyName, String, lpFileName);
178 BOOL WritePrivateProfileBool(LPCTSTR lpAppName, LPCTSTR lpKeyName, bool Value, LPCTSTR lpFileName)
181 _stprintf_s(String, 32, _T("%d"), Value ? 1 : 0);
182 return WritePrivateProfileString(lpAppName, lpKeyName, String, lpFileName);
185 BOOL GetPrivateProfileBool(LPCTSTR lpAppName, LPCTSTR lpKeyName, bool bDefault, LPCTSTR lpFileName)
187 return (GetPrivateProfileInt(lpAppName, lpKeyName, bDefault ? 1 : 0, lpFileName) != 0);
195 memset(&config, 0, sizeof(config_t));
197 config.use_direct_input = true;
198 config.disable_dwm = false;
200 #if !(defined(USE_BITMAP) || defined(USE_LED))
201 config.use_d3d9 = true;
202 config.stretch_type = 1; // Stretch (Aspect)
204 config.sound_frequency = 6; // 48KHz
205 config.sound_latency = 1; // 100msec
207 #if defined(USE_TAPE)
208 config.wave_shaper = true;
209 config.direct_load_mzt = true;
210 config.baud_high = true;
212 #if defined(USE_BOOT_MODE) && defined(BOOT_MODE_DEFAULT)
213 config.boot_mode = BOOT_MODE_DEFAULT;
215 #if defined(USE_CPU_TYPE) && defined(CPU_TYPE_DEFAULT)
216 config.cpu_type = CPU_TYPE_DEFAULT;
218 #if defined(USE_DIPSWITCH) && defined(DIPSWITCH_DEFAULT)
219 config.dipswitch = DIPSWITCH_DEFAULT;
221 #if defined(USE_DEVICE_TYPE) && defined(DEVICE_TYPE_DEFAULT)
222 config.device_type = DEVICE_TYPE_DEFAULT;
225 # if defined(IGNORE_CRC_DEFAULT)
226 for(i = 0; i < 8; i++) config.ignore_crc[i] = IGNORE_CRC_DEFAULT;
228 for(i = 0; i < 8; i++) config.ignore_crc[i] = false;
231 #if defined(USE_SOUND_DEVICE_TYPE) && defined(SOUND_DEVICE_TYPE_DEFAULT)
232 config.sound_device_type = SOUND_DEVICE_TYPE_DEFAULT;
238 // 3 = WHG + OPN (+PSG)
240 // 5 = THG + OPN (+PSG)
241 // 6 = THG + WHG (+PSG)
242 // 7 = THG + WHG + OPN (+PSG)
244 config.sound_device_type = 0; // WITHOUT PSG?
245 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77) || defined(_FM77L4) || defined(_FM77L2)
246 config.sound_device_type = 0; // PSG ONLY
247 #elif defined(_FM77AV) || defined(_FM77AV20) || defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
248 config.sound_device_type = 1; // OPN
250 config.multiple_speakers = false;
251 config.general_sound_level = 0;
254 config.use_opengl_scanline = false;
255 config.opengl_scanline_vert = false;
256 config.opengl_scanline_horiz = false;
257 config.use_opengl_filters = false;
258 config.opengl_filter_num = 0;
260 #ifdef USE_MULTIPLE_SOUNDCARDS
263 for(ii = 0; ii < USE_MULTIPLE_SOUNDCARDS; ii++) {
264 config.sound_device_level[ii] = 0;
278 #if defined(_USE_AGAR) || defined(_USE_QT)
279 char app_path2[_MAX_PATH], *ptr;
280 FILEIO *config_path = new FILEIO();
282 memset(app_path2, 0x00, _MAX_PATH);
283 cpp_confdir.copy(app_path2, _MAX_PATH, 0);
285 strncat(app_path2, CONFIG_NAME, _MAX_PATH);
286 strncat(app_path2, ".ini", _MAX_PATH);
288 AGAR_DebugLog(AGAR_LOG_INFO, "Try to read config: %s", app_path2);
289 if(!config_path->Fopen(app_path2, FILEIO_READ_ASCII)) return;
291 _TCHAR app_path[_MAX_PATH], config_path[_MAX_PATH], *ptr;
292 memset(config_path, 0x00, _MAX_PATH);
293 GetModuleFileName(NULL, config_path, _MAX_PATH);
294 GetFullPathName(config_path, _MAX_PATH, app_path, &ptr);
296 _stprintf_s(config_path, _MAX_PATH, _T("%s%s.ini"), app_path, _T(CONFIG_NAME));
301 config.use_direct_input = GetPrivateProfileBool(_T("Control"), _T("UseDirectInput"), config.use_direct_input, config_path);
302 config.disable_dwm = GetPrivateProfileBool(_T("Control"), _T("DisableDwm"), config.disable_dwm, config_path);
305 config.boot_mode = GetPrivateProfileInt(_T("Control"), _T("BootMode"), config.boot_mode, config_path);
308 config.cpu_type = GetPrivateProfileInt(_T("Control"), _T("CPUType"), config.cpu_type, config_path);
311 config.dipswitch = GetPrivateProfileInt(_T("Control"), _T("DipSwitch"), config.dipswitch, config_path);
313 #ifdef USE_DEVICE_TYPE
314 config.device_type = GetPrivateProfileInt(_T("Control"), _T("DeviceType"), config.device_type, config_path);
316 #ifdef USE_DRIVE_TYPE
317 config.drive_type = GetPrivateProfileInt(_T("Control"), _T("DriveType"), config.drive_type, config_path);
322 for(drv = 0; drv < 8; drv++) {
323 memset(_tag, 0x00, sizeof(_tag));
324 _stprintf_s(_tag, 64, _T("IgnoreCRC_%d"), drv + 1);
325 config.ignore_crc[drv] = GetPrivateProfileBool(_T("Control"), _tag, config.ignore_crc[drv], config_path);
330 config.tape_sound = GetPrivateProfileBool(_T("Control"), _T("TapeSound"), config.tape_sound, config_path);
331 config.wave_shaper = GetPrivateProfileBool(_T("Control"), _T("WaveShaper"), config.wave_shaper, config_path);
332 config.direct_load_mzt = GetPrivateProfileBool(_T("Control"), _T("DirectLoadMZT"), config.direct_load_mzt, config_path);
333 config.baud_high = GetPrivateProfileBool(_T("Control"), _T("BaudHigh"), config.baud_high, config_path);
338 GetPrivateProfileString(_T("RecentFiles"), _T("InitialCartDir"), _T(""), config.initial_cart_dir, _MAX_PATH, config_path);
339 for(drv = 0; drv < MAX_CART; drv++) {
340 for(i = 0; i < MAX_HISTORY; i++) {
342 _stprintf_s(name, 64, _T("RecentCartPath%d_%d"), drv + 1, i + 1);
343 // sprintf(name, _T("RecentCartPath%d_%d"), drv + 1, i + 1);
344 GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_cart_path[drv][i], _MAX_PATH, config_path);
349 GetPrivateProfileString(_T("RecentFiles"), _T("InitialDiskDir"), _T(""), config.initial_disk_dir, _MAX_PATH, config_path);
350 get_parent_dir(config.initial_disk_dir);
351 for(drv = 0; drv < MAX_FD; drv++) {
352 for(i = 0; i < MAX_HISTORY; i++) {
354 // sprintf(name, _T("RecentDiskPath%d_%d"), drv + 1, i + 1);
355 _stprintf_s(name, 64, _T("RecentDiskPath%d_%d"), drv + 1, i + 1);
356 GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_disk_path[drv][i], _MAX_PATH, config_path);
361 GetPrivateProfileString(_T("RecentFiles"), _T("InitialQuickDiskDir"), _T(""), config.initial_quickdisk_dir, _MAX_PATH, config_path);
362 for(drv = 0; drv < MAX_QD; drv++) {
363 for(i = 0; i < MAX_HISTORY; i++) {
365 // sprintf(name, _T("RecentQuickDiskPath%d_%d"), drv + 1, i + 1);
366 _stprintf_s(name, 64, _T("RecentQuickDiskPath%d_%d"), drv + 1, i + 1);
367 GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_quickdisk_path[drv][i], _MAX_PATH, config_path);
372 GetPrivateProfileString(_T("RecentFiles"), _T("InitialTapeDir"), _T(""), config.initial_tape_dir, _MAX_PATH, config_path);
373 for(i = 0; i < MAX_HISTORY; i++) {
375 // sprintf(name, _T("RecentTapePath1_%d"), i + 1);
376 _stprintf_s(name, 64, _T("RecentTapePath1_%d"), i + 1);
377 GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_tape_path[i], _MAX_PATH, config_path);
380 #ifdef USE_LASER_DISC
381 GetPrivateProfileString(_T("RecentFiles"), _T("InitialLaserDiscDir"), _T(""), config.initial_laser_disc_dir, _MAX_PATH, config_path);
382 for(int i = 0; i < MAX_HISTORY; i++) {
384 // sprintf(name, _T("RecentLaserDiscPath1_%d"), i + 1);
385 _stprintf_s(name, 64, _T("RecentLaserDiscPath1_%d"), i + 1);
386 GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_laser_disc_path[i], _MAX_PATH, config_path);
389 #ifdef USE_BINARY_FILE1
390 GetPrivateProfileString(_T("RecentFiles"), _T("InitialBinaryDir"), _T(""), config.initial_binary_dir, _MAX_PATH, config_path);
391 for(drv = 0; drv < MAX_BINARY; drv++) {
392 for(i = 0; i < MAX_HISTORY; i++) {
394 // sprintf(name, _T("RecentBinaryPath%d_%d"), drv + 1, i + 1);
395 _stprintf_s(name, 64, _T("RecentBinaryPath%d_%d"), drv + 1, i + 1);
396 GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_binary_path[drv][i], _MAX_PATH, config_path);
402 #if !(defined(USE_BITMAP) || defined(USE_LED))
403 config.window_mode = GetPrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);
404 config.use_d3d9 = GetPrivateProfileBool(_T("Screen"), _T("UseD3D9"), config.use_d3d9, config_path);
405 config.wait_vsync = GetPrivateProfileBool(_T("Screen"), _T("WaitVSync"), config.wait_vsync, config_path);
406 config.stretch_type = GetPrivateProfileInt(_T("Screen"), _T("StretchType"), config.stretch_type, config_path);
408 config.window_mode = GetPrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);
410 #ifdef USE_MONITOR_TYPE
411 config.monitor_type = GetPrivateProfileInt(_T("Screen"), _T("MonitorType"), config.monitor_type, config_path);
413 #ifdef USE_CRT_FILTER
414 config.crt_filter = GetPrivateProfileBool(_T("Screen"), _T("CRTFilter"), config.crt_filter, config_path);
417 config.scan_line = GetPrivateProfileBool(_T("Screen"), _T("ScanLine"), config.scan_line, config_path);
420 #ifdef USE_SCREEN_ROTATE
421 config.rotate_type = GetPrivateProfileBool(_T("Screen"), _T("RotateType"), config.rotate_type, config_path);
424 config.use_opengl_scanline = GetPrivateProfileBool(_T("Screen"), _T("UseOpenGLScanLine"),
425 config.use_opengl_scanline, config_path);
426 config.opengl_scanline_vert = GetPrivateProfileBool(_T("Screen"), _T("OpenGLScanLineVert"),
427 config.opengl_scanline_vert, config_path);;
428 config.opengl_scanline_horiz = GetPrivateProfileBool(_T("Screen"), _T("OpenGLScanLineHoriz"),
429 config.opengl_scanline_horiz, config_path);;
430 config.use_opengl_filters = GetPrivateProfileBool(_T("Screen"), _T("UseOpenGLFilters"),
431 config.use_opengl_filters, config_path);
432 config.opengl_filter_num = GetPrivateProfileInt(_T("Screen"), _T("OpenGlFilterNum"),
433 config.opengl_filter_num, config_path);
436 config.sound_frequency = GetPrivateProfileInt(_T("Sound"), _T("Frequency"), config.sound_frequency, config_path);
437 config.sound_latency = GetPrivateProfileInt(_T("Sound"), _T("Latency"), config.sound_latency, config_path);
438 #ifdef USE_SOUND_DEVICE_TYPE
439 config.sound_device_type = GetPrivateProfileInt(_T("Sound"), _T("DeviceType"), config.sound_device_type, config_path);
441 config.multiple_speakers = GetPrivateProfileBool(_T("Sound"), _T("MultipleSpeakers"),
442 config.multiple_speakers, config_path);
443 config.general_sound_level = GetPrivateProfileInt(_T("Sound"), _T("GeneralSoundLevel"),
444 config.general_sound_level, config_path);
445 #ifdef USE_MULTIPLE_SOUNDCARDS
449 for(ii = 0; ii < USE_MULTIPLE_SOUNDCARDS; ii++) {
450 memset(_tag, 0x00, sizeof(_tag));
451 _stprintf_s(_tag, 64, _T("DeviceVolumeLevel_%d"), ii + 1);
452 config.sound_device_level[ii] = GetPrivateProfileBool(_T("Sound"), _tag, config.sound_device_level[ii], config_path);
456 #if defined(_USE_AGAR) || defined(_USE_QT)
457 config_path->Fclose();
459 AGAR_DebugLog(AGAR_LOG_INFO, "Read Done.");
467 #if defined(_USE_AGAR) || defined(_USE_QT)
468 char app_path2[_MAX_PATH], *ptr;
469 FILEIO *config_path = new FILEIO();
472 //GetFullPathName(config_path, _MAX_PATH, app_path, &ptr);
473 memset(app_path2, 0x00, _MAX_PATH);
474 cpp_confdir.copy(app_path2, _MAX_PATH, 0);
476 strncat(app_path2, CONFIG_NAME, _MAX_PATH);
477 strncat(app_path2, ".ini", _MAX_PATH);
479 AGAR_DebugLog(AGAR_LOG_INFO, "Try to write config: %s", app_path2);
480 if(config_path->Fopen(app_path2, FILEIO_WRITE_ASCII) != true) return;
482 _TCHAR app_path[_MAX_PATH], config_path[_MAX_PATH], *ptr;
483 memset(config_path, 0x00, _MAX_PATH);
484 GetModuleFileName(NULL, config_path, _MAX_PATH);
485 GetFullPathName(config_path, _MAX_PATH, app_path, &ptr);
487 _stprintf_s(config_path, _MAX_PATH, _T("%s%s.ini"), app_path, _T(CONFIG_NAME));
490 WritePrivateProfileBool(_T("Control"), _T("UseDirectInput"), config.use_direct_input, config_path);
491 WritePrivateProfileBool(_T("Control"), _T("DisableDwm"), config.disable_dwm, config_path);
493 # ifdef USE_BOOT_MODE
494 WritePrivateProfileInt(_T("Control"), _T("BootMode"), config.boot_mode, config_path);
497 WritePrivateProfileInt(_T("Control"), _T("CPUType"), config.cpu_type, config_path);
500 WritePrivateProfileInt(_T("Control"), _T("DipSwitch"), config.dipswitch, config_path);
502 #ifdef USE_DEVICE_TYPE
503 WritePrivateProfileInt(_T("Control"), _T("DeviceType"), config.device_type, config_path);
505 #ifdef USE_DRIVE_TYPE
506 WritePrivateProfileInt(_T("Control"), _T("DriveType"), config.drive_type, config_path);
511 for(drv = 0; drv < 8; drv++) {
512 memset(_tag, 0x00, sizeof(_tag));
513 _stprintf_s(_tag, 64, _T("IgnoreCRC_%d"), drv + 1);
514 WritePrivateProfileBool(_T("Control"), _tag, config.ignore_crc[drv], config_path);
520 WritePrivateProfileBool(_T("Control"), _T("TapeSound"), config.tape_sound, config_path);
521 WritePrivateProfileBool(_T("Control"), _T("WaveShaper"), config.wave_shaper, config_path);
522 WritePrivateProfileBool(_T("Control"), _T("DirectLoadMZT"), config.direct_load_mzt, config_path);
523 WritePrivateProfileBool(_T("Control"), _T("BaudHigh"), config.baud_high, config_path);
528 WritePrivateProfileString(_T("RecentFiles"), _T("InitialCartDir"), config.initial_cart_dir, config_path);
529 for(drv = 0; drv < MAX_CART; drv++) {
530 for(i = 0; i < MAX_HISTORY; i++) {
532 _stprintf_s(name, 64, _T("RecentCartPath%d_%d"), drv + 1, i + 1);
533 // sprintf(name, _T("RecentCartPath%d_%d"), drv + 1, i + 1);
534 WritePrivateProfileString(_T("RecentFiles"), name, config.recent_cart_path[drv][i], config_path);
539 WritePrivateProfileString(_T("RecentFiles"), _T("InitialDiskDir"), config.initial_disk_dir, config_path);
540 for(drv = 0; drv < MAX_FD; drv++) {
541 for(i = 0; i < MAX_HISTORY; i++) {
543 // sprintf(name, _T("RecentDiskPath%d_%d"), drv + 1, i + 1);
544 _stprintf_s(name, 64, _T("RecentDiskPath%d_%d"), drv + 1, i + 1);
545 WritePrivateProfileString(_T("RecentFiles"), name, config.recent_disk_path[drv][i], config_path);
550 WritePrivateProfileString(_T("RecentFiles"), _T("InitialQuickDiskDir"), config.initial_quickdisk_dir, config_path);
551 for(drv = 0; drv < MAX_QD; drv++) {
552 for(i = 0; i < MAX_HISTORY; i++) {
554 _stprintf_s(name, 64, _T("RecentQuickDiskPath%d_%d"), drv + 1, i + 1);
555 // sprintf(name, _T("RecentQuickDiskPath%d_%d"), drv + 1, i + 1);
556 WritePrivateProfileString(_T("RecentFiles"), name, config.recent_quickdisk_path[drv][i], config_path);
561 WritePrivateProfileString(_T("RecentFiles"), _T("InitialTapeDir"), config.initial_tape_dir, config_path);
562 for(i = 0; i < MAX_HISTORY; i++) {
564 // sprintf(name, _T("RecentTapePath1_%d"), i + 1);
565 _stprintf_s(name, 64, _T("RecentTapePath1_%d"), i + 1);
566 WritePrivateProfileString(_T("RecentFiles"), name, config.recent_tape_path[i], config_path);
569 #ifdef USE_LASER_DISC
570 WritePrivateProfileString(_T("RecentFiles"), _T("InitialLaserDiscDir"), config.initial_laser_disc_dir, config_path);
571 for(int i = 0; i < MAX_HISTORY; i++) {
573 // sprintf(name, _T("RecentLaserDiscPath1_%d"), i + 1);
574 _stprintf_s(name, 64, _T("RecentLaserDiscPath1_%d"), i + 1);
575 WritePrivateProfileString(_T("RecentFiles"), name, config.recent_laser_disc_path[i], config_path);
578 #ifdef USE_BINARY_FILE1
579 WritePrivateProfileString(_T("RecentFiles"), _T("InitialBinaryDir"), config.initial_binary_dir, config_path);
580 for(drv = 0; drv < MAX_BINARY; drv++) {
581 for(i = 0; i < MAX_HISTORY; i++) {
583 // sprintf(name, _T("RecentBinaryPath%d_%d"), drv + 1, i + 1);
584 _stprintf_s(name, 64, _T("RecentBinaryPath%d_%d"), drv + 1, i + 1);
585 WritePrivateProfileString(_T("RecentFiles"), name, config.recent_binary_path[drv][i], config_path);
591 #if !(defined(USE_BITMAP) || defined(USE_LED))
592 WritePrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);
593 WritePrivateProfileBool(_T("Screen"), _T("UseD3D9"), config.use_d3d9, config_path);
594 WritePrivateProfileBool(_T("Screen"), _T("WaitVSync"), config.wait_vsync, config_path);
595 WritePrivateProfileInt(_T("Screen"), _T("StretchType"), config.stretch_type, config_path);
597 WritePrivateProfileInt(_T("Screen"), _T("WindowMode"), config.window_mode, config_path);
599 #ifdef USE_MONITOR_TYPE
600 WritePrivateProfileInt(_T("Screen"), _T("MonitorType"), config.monitor_type, config_path);
602 #ifdef USE_CRT_FILTER
603 WritePrivateProfileBool(_T("Screen"), _T("CRTFilter"), config.crt_filter, config_path);
606 WritePrivateProfileBool(_T("Screen"), _T("ScanLine"), config.scan_line, config_path);
608 #ifdef USE_SCREEN_ROTATE
609 WritePrivateProfileBool(_T("Screen"), _T("RotateType"), config.rotate_type, config_path);
612 WritePrivateProfileBool(_T("Screen"), _T("UseOpenGLScanLine"),
613 config.use_opengl_scanline, config_path);
614 WritePrivateProfileBool(_T("Screen"), _T("OpenGLScanLineVert"),
615 config.opengl_scanline_vert, config_path);;
616 WritePrivateProfileBool(_T("Screen"), _T("OpenGLScanLineHoriz"),
617 config.opengl_scanline_horiz, config_path);;
618 WritePrivateProfileBool(_T("Screen"), _T("UseOpenGLFilters"),
619 config.use_opengl_filters, config_path);
620 WritePrivateProfileInt(_T("Screen"), _T("OpenGlFilterNum"),
621 config.opengl_filter_num, config_path);
625 WritePrivateProfileInt(_T("Sound"), _T("Frequency"), config.sound_frequency, config_path);
626 WritePrivateProfileInt(_T("Sound"), _T("Latency"), config.sound_latency, config_path);
627 #ifdef USE_SOUND_DEVICE_TYPE
628 WritePrivateProfileInt(_T("Sound"), _T("DeviceType"), config.sound_device_type, config_path);
630 WritePrivateProfileBool(_T("Sound"), _T("MultipleSpeakers"),
631 config.multiple_speakers, config_path);
632 WritePrivateProfileInt(_T("Sound"), _T("GeneralSoundLevel"),
633 config.general_sound_level, config_path);
634 #ifdef USE_MULTIPLE_SOUNDCARDS
638 for(ii = 0; ii < USE_MULTIPLE_SOUNDCARDS; ii++) {
639 memset(_tag, 0x00, sizeof(_tag));
640 _stprintf_s(_tag, 64, _T("DeviceVolumeLevel_%d"), ii + 1);
641 WritePrivateProfileBool(_T("Sound"), _tag, config.sound_device_level[ii], config_path);
645 #if defined(_USE_AGAR) || defined(_USE_QT)
646 config_path->Fclose();
648 AGAR_DebugLog(AGAR_LOG_INFO, "Write done.");
653 #define STATE_VERSION 1
655 void save_config_state(void *f)
657 FILEIO *state_fio = (FILEIO *)f;
660 state_fio->FputUint32(STATE_VERSION);
663 state_fio->FputInt32(config.boot_mode);
666 state_fio->FputInt32(config.cpu_type);
669 state_fio->FputUint32(config.dipswitch);
671 #ifdef USE_DEVICE_TYPE
672 state_fio->FputInt32(config.device_type);
674 #ifdef USE_DRIVE_TYPE
675 state_fio->FputInt32(config.drive_type);
678 for(drv = 0; drv < 8; drv++) state_fio->FputBool(config.ignore_crc[drv]);
680 #ifdef USE_MONITOR_TYPE
681 state_fio->FputInt32(config.monitor_type);
683 #ifdef USE_SOUND_DEVICE_TYPE
684 state_fio->FputInt32(config.sound_device_type);
688 bool load_config_state(void *f)
690 FILEIO *state_fio = (FILEIO *)f;
693 if(state_fio->FgetUint32() != STATE_VERSION) {
697 config.boot_mode = state_fio->FgetInt32();
700 config.cpu_type = state_fio->FgetInt32();
703 config.dipswitch = state_fio->FgetUint32();
705 #ifdef USE_DEVICE_TYPE
706 config.device_type = state_fio->FgetInt32();
708 #ifdef USE_DRIVE_TYPE
709 config.drive_type = state_fio->FgetInt32();
712 for(drv = 0; drv < 8; drv++) config.ignore_crc[drv] = state_fio->FgetBool();
714 #ifdef USE_MONITOR_TYPE
715 config.monitor_type = state_fio->FgetInt32();
717 #ifdef USE_SOUND_DEVICE_TYPE
718 config.sound_device_type = state_fio->FgetInt32();