Annotation of previous/src/configuration.c, revision 1.1

1.1     ! root        1: /*
        !             2:   Hatari - configuration.c
        !             3: 
        !             4:   This file is distributed under the GNU Public License, version 2 or at
        !             5:   your option any later version. Read the file gpl.txt for details.
        !             6: 
        !             7:   Configuration File
        !             8: 
        !             9:   The configuration file is now stored in an ASCII format to allow the user
        !            10:   to edit the file manually.
        !            11: */
        !            12: const char Configuration_fileid[] = "Hatari configuration.c : " __DATE__ " " __TIME__;
        !            13: 
        !            14: #include <SDL_keysym.h>
        !            15: 
        !            16: #include "main.h"
        !            17: #include "configuration.h"
        !            18: #include "cfgopts.h"
        !            19: #include "file.h"
        !            20: #include "log.h"
        !            21: #include "m68000.h"
        !            22: #include "memorySnapShot.h"
        !            23: #include "paths.h"
        !            24: #include "screen.h"
        !            25: #include "video.h"
        !            26: 
        !            27: 
        !            28: CNF_PARAMS ConfigureParams;                 /* List of configuration for the emulator */
        !            29: char sConfigFileName[FILENAME_MAX];         /* Stores the name of the configuration file */
        !            30: 
        !            31: 
        !            32: /* Used to load/save logging options */
        !            33: static const struct Config_Tag configs_Log[] =
        !            34: {
        !            35:        { "sLogFileName", String_Tag, ConfigureParams.Log.sLogFileName },
        !            36:        { "sTraceFileName", String_Tag, ConfigureParams.Log.sTraceFileName },
        !            37:        { "nTextLogLevel", Int_Tag, &ConfigureParams.Log.nTextLogLevel },
        !            38:        { "nAlertDlgLogLevel", Int_Tag, &ConfigureParams.Log.nAlertDlgLogLevel },
        !            39:        { "bConfirmQuit", Bool_Tag, &ConfigureParams.Log.bConfirmQuit },
        !            40:        { NULL , Error_Tag, NULL }
        !            41: };
        !            42: 
        !            43: /* Used to load/save debugger options */
        !            44: static const struct Config_Tag configs_Debugger[] =
        !            45: {
        !            46:        { "nNumberBase", Int_Tag, &ConfigureParams.Debugger.nNumberBase },
        !            47:        { "nDisasmLines", Int_Tag, &ConfigureParams.Debugger.nDisasmLines },
        !            48:        { "nMemdumpLines", Int_Tag, &ConfigureParams.Debugger.nMemdumpLines },
        !            49:        { NULL , Error_Tag, NULL }
        !            50: };
        !            51: 
        !            52: /* Used to load/save screen options */
        !            53: static const struct Config_Tag configs_Screen[] =
        !            54: {
        !            55:        { "nMonitorType", Int_Tag, &ConfigureParams.Screen.nMonitorType },
        !            56:        { "nFrameSkips", Int_Tag, &ConfigureParams.Screen.nFrameSkips },
        !            57:        { "bFullScreen", Bool_Tag, &ConfigureParams.Screen.bFullScreen },
        !            58:        { "bAllowOverscan", Bool_Tag, &ConfigureParams.Screen.bAllowOverscan },
        !            59:        { "nSpec512Threshold", Int_Tag, &ConfigureParams.Screen.nSpec512Threshold },
        !            60:        { "nForceBpp", Int_Tag, &ConfigureParams.Screen.nForceBpp },
        !            61:        { "bAspectCorrect", Bool_Tag, &ConfigureParams.Screen.bAspectCorrect },
        !            62:        { "bUseExtVdiResolutions", Bool_Tag, &ConfigureParams.Screen.bUseExtVdiResolutions },
        !            63:        { "nVdiWidth", Int_Tag, &ConfigureParams.Screen.nVdiWidth },
        !            64:        { "nVdiHeight", Int_Tag, &ConfigureParams.Screen.nVdiHeight },
        !            65:        { "nVdiColors", Int_Tag, &ConfigureParams.Screen.nVdiColors },
        !            66:        { "bShowStatusbar", Bool_Tag, &ConfigureParams.Screen.bShowStatusbar },
        !            67:        { "bShowDriveLed", Bool_Tag, &ConfigureParams.Screen.bShowDriveLed },
        !            68:        { "bCaptureChange", Bool_Tag, &ConfigureParams.Screen.bCaptureChange },
        !            69:        { "nMaxWidth", Int_Tag, &ConfigureParams.Screen.nMaxWidth },
        !            70:        { "nMaxHeight", Int_Tag, &ConfigureParams.Screen.nMaxHeight },
        !            71:        { NULL , Error_Tag, NULL }
        !            72: };
        !            73: 
        !            74: /* Used to load/save joystick 0 options */
        !            75: static const struct Config_Tag configs_Joystick0[] =
        !            76: {
        !            77:        { "nJoystickMode", Int_Tag, &ConfigureParams.Joysticks.Joy[0].nJoystickMode },
        !            78:        { "bEnableAutoFire", Bool_Tag, &ConfigureParams.Joysticks.Joy[0].bEnableAutoFire },
        !            79:        { "bEnableJumpOnFire2", Bool_Tag, &ConfigureParams.Joysticks.Joy[0].bEnableJumpOnFire2 },
        !            80:        { "nJoyId", Int_Tag, &ConfigureParams.Joysticks.Joy[0].nJoyId },
        !            81:        { "nKeyCodeUp", Int_Tag, &ConfigureParams.Joysticks.Joy[0].nKeyCodeUp },
        !            82:        { "nKeyCodeDown", Int_Tag, &ConfigureParams.Joysticks.Joy[0].nKeyCodeDown },
        !            83:        { "nKeyCodeLeft", Int_Tag, &ConfigureParams.Joysticks.Joy[0].nKeyCodeLeft },
        !            84:        { "nKeyCodeRight", Int_Tag, &ConfigureParams.Joysticks.Joy[0].nKeyCodeRight },
        !            85:        { "nKeyCodeFire", Int_Tag, &ConfigureParams.Joysticks.Joy[0].nKeyCodeFire },
        !            86:        { NULL , Error_Tag, NULL }
        !            87: };
        !            88: 
        !            89: /* Used to load/save joystick 1 options */
        !            90: static const struct Config_Tag configs_Joystick1[] =
        !            91: {
        !            92:        { "nJoystickMode", Int_Tag, &ConfigureParams.Joysticks.Joy[1].nJoystickMode },
        !            93:        { "bEnableAutoFire", Bool_Tag, &ConfigureParams.Joysticks.Joy[1].bEnableAutoFire },
        !            94:        { "bEnableJumpOnFire2", Bool_Tag, &ConfigureParams.Joysticks.Joy[1].bEnableJumpOnFire2 },
        !            95:        { "nJoyId", Int_Tag, &ConfigureParams.Joysticks.Joy[1].nJoyId },
        !            96:        { "nKeyCodeUp", Int_Tag, &ConfigureParams.Joysticks.Joy[1].nKeyCodeUp },
        !            97:        { "nKeyCodeDown", Int_Tag, &ConfigureParams.Joysticks.Joy[1].nKeyCodeDown },
        !            98:        { "nKeyCodeLeft", Int_Tag, &ConfigureParams.Joysticks.Joy[1].nKeyCodeLeft },
        !            99:        { "nKeyCodeRight", Int_Tag, &ConfigureParams.Joysticks.Joy[1].nKeyCodeRight },
        !           100:        { "nKeyCodeFire", Int_Tag, &ConfigureParams.Joysticks.Joy[1].nKeyCodeFire },
        !           101:        { NULL , Error_Tag, NULL }
        !           102: };
        !           103: 
        !           104: /* Used to load/save joystick 2 options */
        !           105: static const struct Config_Tag configs_Joystick2[] =
        !           106: {
        !           107:        { "nJoystickMode", Int_Tag, &ConfigureParams.Joysticks.Joy[2].nJoystickMode },
        !           108:        { "bEnableAutoFire", Bool_Tag, &ConfigureParams.Joysticks.Joy[2].bEnableAutoFire },
        !           109:        { "bEnableJumpOnFire2", Bool_Tag, &ConfigureParams.Joysticks.Joy[2].bEnableJumpOnFire2 },
        !           110:        { "nJoyId", Int_Tag, &ConfigureParams.Joysticks.Joy[2].nJoyId },
        !           111:        { "nKeyCodeUp", Int_Tag, &ConfigureParams.Joysticks.Joy[2].nKeyCodeUp },
        !           112:        { "nKeyCodeDown", Int_Tag, &ConfigureParams.Joysticks.Joy[2].nKeyCodeDown },
        !           113:        { "nKeyCodeLeft", Int_Tag, &ConfigureParams.Joysticks.Joy[2].nKeyCodeLeft },
        !           114:        { "nKeyCodeRight", Int_Tag, &ConfigureParams.Joysticks.Joy[2].nKeyCodeRight },
        !           115:        { "nKeyCodeFire", Int_Tag, &ConfigureParams.Joysticks.Joy[2].nKeyCodeFire },
        !           116:        { NULL , Error_Tag, NULL }
        !           117: };
        !           118: 
        !           119: /* Used to load/save joystick 3 options */
        !           120: static const struct Config_Tag configs_Joystick3[] =
        !           121: {
        !           122:        { "nJoystickMode", Int_Tag, &ConfigureParams.Joysticks.Joy[3].nJoystickMode },
        !           123:        { "bEnableAutoFire", Bool_Tag, &ConfigureParams.Joysticks.Joy[3].bEnableAutoFire },
        !           124:        { "bEnableJumpOnFire2", Bool_Tag, &ConfigureParams.Joysticks.Joy[3].bEnableJumpOnFire2 },
        !           125:        { "nJoyId", Int_Tag, &ConfigureParams.Joysticks.Joy[3].nJoyId },
        !           126:        { "nKeyCodeUp", Int_Tag, &ConfigureParams.Joysticks.Joy[3].nKeyCodeUp },
        !           127:        { "nKeyCodeDown", Int_Tag, &ConfigureParams.Joysticks.Joy[3].nKeyCodeDown },
        !           128:        { "nKeyCodeLeft", Int_Tag, &ConfigureParams.Joysticks.Joy[3].nKeyCodeLeft },
        !           129:        { "nKeyCodeRight", Int_Tag, &ConfigureParams.Joysticks.Joy[3].nKeyCodeRight },
        !           130:        { "nKeyCodeFire", Int_Tag, &ConfigureParams.Joysticks.Joy[3].nKeyCodeFire },
        !           131:        { NULL , Error_Tag, NULL }
        !           132: };
        !           133: 
        !           134: /* Used to load/save joystick 4 options */
        !           135: static const struct Config_Tag configs_Joystick4[] =
        !           136: {
        !           137:        { "nJoystickMode", Int_Tag, &ConfigureParams.Joysticks.Joy[4].nJoystickMode },
        !           138:        { "bEnableAutoFire", Bool_Tag, &ConfigureParams.Joysticks.Joy[4].bEnableAutoFire },
        !           139:        { "bEnableJumpOnFire2", Bool_Tag, &ConfigureParams.Joysticks.Joy[4].bEnableJumpOnFire2 },
        !           140:        { "nJoyId", Int_Tag, &ConfigureParams.Joysticks.Joy[4].nJoyId },
        !           141:        { "nKeyCodeUp", Int_Tag, &ConfigureParams.Joysticks.Joy[4].nKeyCodeUp },
        !           142:        { "nKeyCodeDown", Int_Tag, &ConfigureParams.Joysticks.Joy[4].nKeyCodeDown },
        !           143:        { "nKeyCodeLeft", Int_Tag, &ConfigureParams.Joysticks.Joy[4].nKeyCodeLeft },
        !           144:        { "nKeyCodeRight", Int_Tag, &ConfigureParams.Joysticks.Joy[4].nKeyCodeRight },
        !           145:        { "nKeyCodeFire", Int_Tag, &ConfigureParams.Joysticks.Joy[4].nKeyCodeFire },
        !           146:        { NULL , Error_Tag, NULL }
        !           147: };
        !           148: 
        !           149: /* Used to load/save joystick 5 options */
        !           150: static const struct Config_Tag configs_Joystick5[] =
        !           151: {
        !           152:        { "nJoystickMode", Int_Tag, &ConfigureParams.Joysticks.Joy[5].nJoystickMode },
        !           153:        { "bEnableAutoFire", Bool_Tag, &ConfigureParams.Joysticks.Joy[5].bEnableAutoFire },
        !           154:        { "bEnableJumpOnFire2", Bool_Tag, &ConfigureParams.Joysticks.Joy[5].bEnableJumpOnFire2 },
        !           155:        { "nJoyId", Int_Tag, &ConfigureParams.Joysticks.Joy[5].nJoyId },
        !           156:        { "nKeyCodeUp", Int_Tag, &ConfigureParams.Joysticks.Joy[5].nKeyCodeUp },
        !           157:        { "nKeyCodeDown", Int_Tag, &ConfigureParams.Joysticks.Joy[5].nKeyCodeDown },
        !           158:        { "nKeyCodeLeft", Int_Tag, &ConfigureParams.Joysticks.Joy[5].nKeyCodeLeft },
        !           159:        { "nKeyCodeRight", Int_Tag, &ConfigureParams.Joysticks.Joy[5].nKeyCodeRight },
        !           160:        { "nKeyCodeFire", Int_Tag, &ConfigureParams.Joysticks.Joy[5].nKeyCodeFire },
        !           161:        { NULL , Error_Tag, NULL }
        !           162: };
        !           163: 
        !           164: /* Used to load/save keyboard options */
        !           165: static const struct Config_Tag configs_Keyboard[] =
        !           166: {
        !           167:        { "bDisableKeyRepeat", Bool_Tag, &ConfigureParams.Keyboard.bDisableKeyRepeat },
        !           168:        { "nKeymapType", Int_Tag, &ConfigureParams.Keyboard.nKeymapType },
        !           169:        { "szMappingFileName", String_Tag, ConfigureParams.Keyboard.szMappingFileName },
        !           170:        { NULL , Error_Tag, NULL }
        !           171: };
        !           172: 
        !           173: /* Used to load/save shortcut key bindings with modifiers options */
        !           174: static const struct Config_Tag configs_ShortCutWithMod[] =
        !           175: {
        !           176:        { "keyOptions",    Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_OPTIONS] },
        !           177:        { "keyFullScreen", Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_FULLSCREEN] },
        !           178:        { "keyMouseMode",  Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_MOUSEGRAB] },
        !           179:        { "keyColdReset",  Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_COLDRESET] },
        !           180:        { "keyWarmReset",  Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_WARMRESET] },
        !           181:        { "keyScreenShot", Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_SCREENSHOT] },
        !           182:        { "keyBossKey",    Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_BOSSKEY] },
        !           183:        { "keyCursorEmu",  Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_CURSOREMU] },
        !           184:        { "keyFastForward",Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_FASTFORWARD] },
        !           185:        { "keyRecAnim",    Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_RECANIM] },
        !           186:        { "keyRecSound",   Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_RECSOUND] },
        !           187:        { "keySound",      Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_SOUND] },
        !           188:        { "keyPause",      Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_PAUSE] },
        !           189:        { "keyDebugger",   Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_DEBUG] },
        !           190:        { "keyQuit",       Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_QUIT] },
        !           191:        { "keyLoadMem",    Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_LOADMEM] },
        !           192:        { "keySaveMem",    Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_SAVEMEM] },
        !           193:        { "keyInsertDiskA",Int_Tag, &ConfigureParams.Shortcut.withModifier[SHORTCUT_INSERTDISKA] },
        !           194:        { NULL , Error_Tag, NULL }
        !           195: };
        !           196: 
        !           197: /* Used to load/save shortcut key bindings without modifiers options */
        !           198: static const struct Config_Tag configs_ShortCutWithoutMod[] =
        !           199: {
        !           200:        { "keyOptions",    Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_OPTIONS] },
        !           201:        { "keyFullScreen", Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_FULLSCREEN] },
        !           202:        { "keyMouseMode",  Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_MOUSEGRAB] },
        !           203:        { "keyColdReset",  Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_COLDRESET] },
        !           204:        { "keyWarmReset",  Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_WARMRESET] },
        !           205:        { "keyScreenShot", Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_SCREENSHOT] },
        !           206:        { "keyBossKey",    Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_BOSSKEY] },
        !           207:        { "keyCursorEmu",  Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_CURSOREMU] },
        !           208:        { "keyFastForward",Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_FASTFORWARD] },
        !           209:        { "keyRecAnim",    Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_RECANIM] },
        !           210:        { "keyRecSound",   Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_RECSOUND] },
        !           211:        { "keySound",      Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_SOUND] },
        !           212:        { "keyPause",      Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_PAUSE] },
        !           213:        { "keyDebugger",   Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_DEBUG] },
        !           214:        { "keyQuit",       Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_QUIT] },
        !           215:        { "keyLoadMem",    Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_LOADMEM] },
        !           216:        { "keySaveMem",    Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_SAVEMEM] },
        !           217:        { "keyInsertDiskA",Int_Tag, &ConfigureParams.Shortcut.withoutModifier[SHORTCUT_INSERTDISKA] },
        !           218:        { NULL , Error_Tag, NULL }
        !           219: };
        !           220: 
        !           221: 
        !           222: /* Used to load/save sound options */
        !           223: static const struct Config_Tag configs_Sound[] =
        !           224: {
        !           225:        { "bEnableSound", Bool_Tag, &ConfigureParams.Sound.bEnableSound },
        !           226:        { "nPlaybackFreq", Int_Tag, &ConfigureParams.Sound.nPlaybackFreq },
        !           227:        { "szYMCaptureFileName", String_Tag, ConfigureParams.Sound.szYMCaptureFileName },
        !           228:        { "nSdlAudioBufferSize", Int_Tag, &ConfigureParams.Sound.SdlAudioBufferSize },
        !           229:        { NULL , Error_Tag, NULL }
        !           230: };
        !           231: 
        !           232: /* Used to load/save memory options */
        !           233: static const struct Config_Tag configs_Memory[] =
        !           234: {
        !           235:        { "nMemorySize", Int_Tag, &ConfigureParams.Memory.nMemorySize },
        !           236:        { "bAutoSave", Bool_Tag, &ConfigureParams.Memory.bAutoSave },
        !           237:        { "szMemoryCaptureFileName", String_Tag, ConfigureParams.Memory.szMemoryCaptureFileName },
        !           238:        { "szAutoSaveFileName", String_Tag, ConfigureParams.Memory.szAutoSaveFileName },
        !           239:        { NULL , Error_Tag, NULL }
        !           240: };
        !           241: 
        !           242: 
        !           243: /* Used to load/save floppy options */
        !           244: static const struct Config_Tag configs_Floppy[] =
        !           245: {
        !           246:        { "bAutoInsertDiskB", Bool_Tag, &ConfigureParams.DiskImage.bAutoInsertDiskB },
        !           247:        { "bSlowFloppy", Bool_Tag, &ConfigureParams.DiskImage.bSlowFloppy },
        !           248:        { "nWriteProtection", Int_Tag, &ConfigureParams.DiskImage.nWriteProtection },
        !           249:        { "szDiskAZipPath", String_Tag, ConfigureParams.DiskImage.szDiskZipPath[0] },
        !           250:        { "szDiskAFileName", String_Tag, ConfigureParams.DiskImage.szDiskFileName[0] },
        !           251:        { "szDiskBZipPath", String_Tag, ConfigureParams.DiskImage.szDiskZipPath[1] },
        !           252:        { "szDiskBFileName", String_Tag, ConfigureParams.DiskImage.szDiskFileName[1] },
        !           253:        { "szDiskImageDirectory", String_Tag, ConfigureParams.DiskImage.szDiskImageDirectory },
        !           254:        { NULL , Error_Tag, NULL }
        !           255: };
        !           256: 
        !           257: /* Used to load/save HD options */
        !           258: static const struct Config_Tag configs_HardDisk[] =
        !           259: {
        !           260:        { "bBootFromHardDisk", Bool_Tag, &ConfigureParams.HardDisk.bBootFromHardDisk },
        !           261:        { "bUseHardDiskDirectory", Bool_Tag, &ConfigureParams.HardDisk.bUseHardDiskDirectories },
        !           262:        { "szHardDiskDirectory", String_Tag, ConfigureParams.HardDisk.szHardDiskDirectories[DRIVE_C] },
        !           263:        { "nWriteProtection", Int_Tag, &ConfigureParams.HardDisk.nWriteProtection },
        !           264:        { "bUseHardDiskImage", Bool_Tag, &ConfigureParams.HardDisk.bUseHardDiskImage },
        !           265:        { "szHardDiskImage", String_Tag, ConfigureParams.HardDisk.szHardDiskImage },
        !           266:        { "bUseIdeMasterHardDiskImage", Bool_Tag, &ConfigureParams.HardDisk.bUseIdeMasterHardDiskImage },
        !           267:        { "bUseIdeSlaveHardDiskImage", Bool_Tag, &ConfigureParams.HardDisk.bUseIdeSlaveHardDiskImage },
        !           268:        { "szIdeMasterHardDiskImage", String_Tag, ConfigureParams.HardDisk.szIdeMasterHardDiskImage },
        !           269:        { "szIdeSlaveHardDiskImage", String_Tag, ConfigureParams.HardDisk.szIdeSlaveHardDiskImage },
        !           270:        { NULL , Error_Tag, NULL }
        !           271: };
        !           272: 
        !           273: /* Used to load/save ROM options */
        !           274: static const struct Config_Tag configs_Rom[] =
        !           275: {
        !           276:        { "szTosImageFileName", String_Tag, ConfigureParams.Rom.szTosImageFileName },
        !           277:        { "szCartridgeImageFileName", String_Tag, ConfigureParams.Rom.szCartridgeImageFileName },
        !           278:        { NULL , Error_Tag, NULL }
        !           279: };
        !           280: 
        !           281: /* Used to load/save RS232 options */
        !           282: static const struct Config_Tag configs_Rs232[] =
        !           283: {
        !           284:        { "bEnableRS232", Bool_Tag, &ConfigureParams.RS232.bEnableRS232 },
        !           285:        { "szOutFileName", String_Tag, ConfigureParams.RS232.szOutFileName },
        !           286:        { "szInFileName", String_Tag, ConfigureParams.RS232.szInFileName },
        !           287:        { NULL , Error_Tag, NULL }
        !           288: };
        !           289: 
        !           290: /* Used to load/save printer options */
        !           291: static const struct Config_Tag configs_Printer[] =
        !           292: {
        !           293:        { "bEnablePrinting", Bool_Tag, &ConfigureParams.Printer.bEnablePrinting },
        !           294:        { "bPrintToFile", Bool_Tag, &ConfigureParams.Printer.bPrintToFile },
        !           295:        { "szPrintToFileName", String_Tag, ConfigureParams.Printer.szPrintToFileName },
        !           296:        { NULL , Error_Tag, NULL }
        !           297: };
        !           298: 
        !           299: /* Used to load/save MIDI options */
        !           300: static const struct Config_Tag configs_Midi[] =
        !           301: {
        !           302:        { "bEnableMidi", Bool_Tag, &ConfigureParams.Midi.bEnableMidi },
        !           303:        { "sMidiInFileName", String_Tag, ConfigureParams.Midi.sMidiInFileName },
        !           304:        { "sMidiOutFileName", String_Tag, ConfigureParams.Midi.sMidiOutFileName },
        !           305:        { NULL , Error_Tag, NULL }
        !           306: };
        !           307: 
        !           308: /* Used to load/save system options */
        !           309: static const struct Config_Tag configs_System[] =
        !           310: {
        !           311:        { "nCpuLevel", Int_Tag, &ConfigureParams.System.nCpuLevel },
        !           312:        { "nCpuFreq", Int_Tag, &ConfigureParams.System.nCpuFreq },
        !           313:        { "bCompatibleCpu", Bool_Tag, &ConfigureParams.System.bCompatibleCpu },
        !           314:        { "nMachineType", Int_Tag, &ConfigureParams.System.nMachineType },
        !           315:        { "bBlitter", Bool_Tag, &ConfigureParams.System.bBlitter },
        !           316:        { "nDSPType", Int_Tag, &ConfigureParams.System.nDSPType },
        !           317:        { "bRealTimeClock", Bool_Tag, &ConfigureParams.System.bRealTimeClock },
        !           318:        { "bPatchTimerD", Bool_Tag, &ConfigureParams.System.bPatchTimerD },
        !           319:        { "bFastForward", Bool_Tag, &ConfigureParams.System.bFastForward },
        !           320:        { NULL , Error_Tag, NULL }
        !           321: };
        !           322: 
        !           323: 
        !           324: /*-----------------------------------------------------------------------*/
        !           325: /**
        !           326:  * Set default configuration values.
        !           327:  */
        !           328: void Configuration_SetDefault(void)
        !           329: {
        !           330:        int i;
        !           331:        const char *psHomeDir;
        !           332:        const char *psWorkingDir;
        !           333: 
        !           334:        psHomeDir = Paths_GetHatariHome();
        !           335:        psWorkingDir = Paths_GetWorkingDir();
        !           336: 
        !           337:        /* Clear parameters */
        !           338:        memset(&ConfigureParams, 0, sizeof(CNF_PARAMS));
        !           339: 
        !           340:        /* Set defaults for logging and tracing */
        !           341:        strcpy(ConfigureParams.Log.sLogFileName, "stderr");
        !           342:        strcpy(ConfigureParams.Log.sTraceFileName, "stderr");
        !           343:        ConfigureParams.Log.nTextLogLevel = LOG_TODO;
        !           344:        ConfigureParams.Log.nAlertDlgLogLevel = LOG_ERROR;
        !           345:        ConfigureParams.Log.bConfirmQuit = true;
        !           346: 
        !           347:        /* Set defaults for debugger */
        !           348:        ConfigureParams.Debugger.nNumberBase = 10;
        !           349:        ConfigureParams.Debugger.nDisasmLines = 8;
        !           350:        ConfigureParams.Debugger.nMemdumpLines = 8;
        !           351: 
        !           352:        /* Set defaults for floppy disk images */
        !           353:        ConfigureParams.DiskImage.bAutoInsertDiskB = true;
        !           354:        ConfigureParams.DiskImage.bSlowFloppy = false;
        !           355:        ConfigureParams.DiskImage.nWriteProtection = WRITEPROT_OFF;
        !           356:        for (i = 0; i < 2; i++)
        !           357:        {
        !           358:                ConfigureParams.DiskImage.szDiskZipPath[i][0] = '\0';
        !           359:                ConfigureParams.DiskImage.szDiskFileName[i][0] = '\0';
        !           360:        }
        !           361:        strcpy(ConfigureParams.DiskImage.szDiskImageDirectory, psWorkingDir);
        !           362:        File_AddSlashToEndFileName(ConfigureParams.DiskImage.szDiskImageDirectory);
        !           363: 
        !           364:        /* Set defaults for hard disks */
        !           365:        ConfigureParams.HardDisk.bBootFromHardDisk = false;
        !           366:        ConfigureParams.HardDisk.nWriteProtection = WRITEPROT_OFF;
        !           367:        ConfigureParams.HardDisk.nHardDiskDir = DRIVE_C;
        !           368:        ConfigureParams.HardDisk.bUseHardDiskDirectories = false;
        !           369:        for (i = 0; i < MAX_HARDDRIVES; i++)
        !           370:        {
        !           371:                strcpy(ConfigureParams.HardDisk.szHardDiskDirectories[i], psWorkingDir);
        !           372:                File_CleanFileName(ConfigureParams.HardDisk.szHardDiskDirectories[i]);
        !           373:        }
        !           374:        ConfigureParams.HardDisk.bUseHardDiskImage = false;
        !           375:        strcpy(ConfigureParams.HardDisk.szHardDiskImage, psWorkingDir);
        !           376:        ConfigureParams.HardDisk.bUseIdeMasterHardDiskImage = false;
        !           377:        strcpy(ConfigureParams.HardDisk.szIdeMasterHardDiskImage, psWorkingDir);
        !           378:        ConfigureParams.HardDisk.bUseIdeSlaveHardDiskImage = false;
        !           379:        strcpy(ConfigureParams.HardDisk.szIdeSlaveHardDiskImage, psWorkingDir);
        !           380: 
        !           381:        /* Set defaults for Joysticks */
        !           382:        for (i = 0; i < JOYSTICK_COUNT; i++)
        !           383:        {
        !           384:                ConfigureParams.Joysticks.Joy[i].nJoystickMode = JOYSTICK_DISABLED;
        !           385:                ConfigureParams.Joysticks.Joy[i].bEnableAutoFire = false;
        !           386:                ConfigureParams.Joysticks.Joy[i].bEnableJumpOnFire2 = false;
        !           387:                ConfigureParams.Joysticks.Joy[i].nJoyId = i;
        !           388:                ConfigureParams.Joysticks.Joy[i].nKeyCodeUp = SDLK_UP;
        !           389:                ConfigureParams.Joysticks.Joy[i].nKeyCodeDown = SDLK_DOWN;
        !           390:                ConfigureParams.Joysticks.Joy[i].nKeyCodeLeft = SDLK_LEFT;
        !           391:                ConfigureParams.Joysticks.Joy[i].nKeyCodeRight = SDLK_RIGHT;
        !           392:                ConfigureParams.Joysticks.Joy[i].nKeyCodeFire = SDLK_RCTRL;
        !           393:        }
        !           394:        ConfigureParams.Joysticks.Joy[1].nJoyId = 0;    /* ST Joystick #1 is default joystick */
        !           395:        ConfigureParams.Joysticks.Joy[0].nJoyId = 1;
        !           396:        ConfigureParams.Joysticks.Joy[1].nJoystickMode = JOYSTICK_REALSTICK;
        !           397: 
        !           398:        /* Set defaults for Keyboard */
        !           399:        ConfigureParams.Keyboard.bDisableKeyRepeat = false;
        !           400:        ConfigureParams.Keyboard.nKeymapType = KEYMAP_SYMBOLIC;
        !           401:        strcpy(ConfigureParams.Keyboard.szMappingFileName, "");
        !           402:   
        !           403:        /* Set defaults for Shortcuts */
        !           404:        ConfigureParams.Shortcut.withoutModifier[SHORTCUT_OPTIONS] = SDLK_F12;
        !           405:        ConfigureParams.Shortcut.withoutModifier[SHORTCUT_FULLSCREEN] = SDLK_F11;
        !           406:        ConfigureParams.Shortcut.withoutModifier[SHORTCUT_PAUSE] = SDLK_PAUSE;
        !           407:   
        !           408:        ConfigureParams.Shortcut.withModifier[SHORTCUT_DEBUG] = SDLK_PAUSE;
        !           409:        ConfigureParams.Shortcut.withModifier[SHORTCUT_OPTIONS] = SDLK_o;
        !           410:        ConfigureParams.Shortcut.withModifier[SHORTCUT_FULLSCREEN] = SDLK_f;
        !           411:        ConfigureParams.Shortcut.withModifier[SHORTCUT_MOUSEGRAB] = SDLK_m;
        !           412:        ConfigureParams.Shortcut.withModifier[SHORTCUT_COLDRESET] = SDLK_c;
        !           413:        ConfigureParams.Shortcut.withModifier[SHORTCUT_WARMRESET] = SDLK_r;
        !           414:        ConfigureParams.Shortcut.withModifier[SHORTCUT_SCREENSHOT] = SDLK_g;
        !           415:        ConfigureParams.Shortcut.withModifier[SHORTCUT_BOSSKEY] = SDLK_i;
        !           416:        ConfigureParams.Shortcut.withModifier[SHORTCUT_CURSOREMU] = SDLK_j;
        !           417:        ConfigureParams.Shortcut.withModifier[SHORTCUT_FASTFORWARD] = SDLK_x;
        !           418:        ConfigureParams.Shortcut.withModifier[SHORTCUT_RECANIM] = SDLK_a;
        !           419:        ConfigureParams.Shortcut.withModifier[SHORTCUT_RECSOUND] = SDLK_y;
        !           420:        ConfigureParams.Shortcut.withModifier[SHORTCUT_SOUND] = SDLK_s;
        !           421:        ConfigureParams.Shortcut.withModifier[SHORTCUT_QUIT] = SDLK_q;
        !           422:        ConfigureParams.Shortcut.withModifier[SHORTCUT_LOADMEM] = SDLK_l;
        !           423:        ConfigureParams.Shortcut.withModifier[SHORTCUT_SAVEMEM] = SDLK_k;
        !           424:        ConfigureParams.Shortcut.withModifier[SHORTCUT_INSERTDISKA] = SDLK_d;
        !           425: 
        !           426:        /* Set defaults for Memory */
        !           427:        ConfigureParams.Memory.nMemorySize = 1;     /* 1 MiB */
        !           428:        ConfigureParams.Memory.bAutoSave = false;
        !           429:        sprintf(ConfigureParams.Memory.szMemoryCaptureFileName, "%s%chatari.sav",
        !           430:                psHomeDir, PATHSEP);
        !           431:        sprintf(ConfigureParams.Memory.szAutoSaveFileName, "%s%cauto.sav",
        !           432:                psHomeDir, PATHSEP);
        !           433: 
        !           434:        /* Set defaults for Printer */
        !           435:        ConfigureParams.Printer.bEnablePrinting = false;
        !           436:        ConfigureParams.Printer.bPrintToFile = true;
        !           437:        sprintf(ConfigureParams.Printer.szPrintToFileName, "%s%chatari.prn",
        !           438:                psHomeDir, PATHSEP);
        !           439: 
        !           440:        /* Set defaults for RS232 */
        !           441:        ConfigureParams.RS232.bEnableRS232 = false;
        !           442:        strcpy(ConfigureParams.RS232.szOutFileName, "/dev/modem");
        !           443:        strcpy(ConfigureParams.RS232.szInFileName, "/dev/modem");
        !           444: 
        !           445:        /* Set defaults for MIDI */
        !           446:        ConfigureParams.Midi.bEnableMidi = false;
        !           447:        strcpy(ConfigureParams.Midi.sMidiInFileName, "/dev/snd/midiC1D0");
        !           448:        strcpy(ConfigureParams.Midi.sMidiOutFileName, "/dev/snd/midiC1D0");
        !           449: 
        !           450:        /* Set defaults for Screen */
        !           451:        ConfigureParams.Screen.bFullScreen = false;
        !           452:        ConfigureParams.Screen.nFrameSkips = AUTO_FRAMESKIP_LIMIT;
        !           453:        ConfigureParams.Screen.bAllowOverscan = true;
        !           454:        ConfigureParams.Screen.nSpec512Threshold = 16;
        !           455:        ConfigureParams.Screen.nForceBpp = 0;
        !           456:        ConfigureParams.Screen.bAspectCorrect = true;
        !           457:        ConfigureParams.Screen.nMonitorType = MONITOR_TYPE_RGB;
        !           458:        ConfigureParams.Screen.bUseExtVdiResolutions = false;
        !           459:        ConfigureParams.Screen.bShowStatusbar = true;
        !           460:        ConfigureParams.Screen.bShowDriveLed = true;
        !           461:        ConfigureParams.Screen.bCaptureChange = false;
        !           462:        /* target 800x600 screen with statusbar out of screen */
        !           463:        ConfigureParams.Screen.nMaxWidth = 1024;
        !           464:        ConfigureParams.Screen.nMaxHeight = 768;
        !           465: 
        !           466:        /* Set defaults for Sound */
        !           467:        ConfigureParams.Sound.bEnableSound = true;
        !           468:        ConfigureParams.Sound.nPlaybackFreq = 44100;
        !           469:        sprintf(ConfigureParams.Sound.szYMCaptureFileName, "%s%chatari.wav",
        !           470:                psWorkingDir, PATHSEP);
        !           471:        ConfigureParams.Sound.SdlAudioBufferSize = 0;
        !           472: 
        !           473:        /* Set defaults for Rom */
        !           474:        sprintf(ConfigureParams.Rom.szTosImageFileName, "%s%ctos.img",
        !           475:                Paths_GetDataDir(), PATHSEP);
        !           476:        strcpy(ConfigureParams.Rom.szCartridgeImageFileName, "");
        !           477: 
        !           478:        /* Set defaults for System */
        !           479:        ConfigureParams.System.nCpuLevel = 4;
        !           480:        ConfigureParams.System.nCpuFreq = 8;
        !           481:        ConfigureParams.System.bCompatibleCpu = true;
        !           482:        /*ConfigureParams.System.bAddressSpace24 = true;*/
        !           483:        ConfigureParams.System.nMachineType = MACHINE_ST;
        !           484:        ConfigureParams.System.bBlitter = false;
        !           485:        ConfigureParams.System.nDSPType = DSP_TYPE_NONE;
        !           486:        ConfigureParams.System.bPatchTimerD = true;
        !           487:        ConfigureParams.System.bRealTimeClock = true;
        !           488:        ConfigureParams.System.bFastForward = false;
        !           489: 
        !           490:        /* Initialize the configuration file name */
        !           491:        if (strlen(psHomeDir) < sizeof(sConfigFileName)-13)
        !           492:                sprintf(sConfigFileName, "%s%chatari.cfg", psHomeDir, PATHSEP);
        !           493:        else
        !           494:                strcpy(sConfigFileName, "hatari.cfg");
        !           495: 
        !           496: #if defined(__AMIGAOS4__)
        !           497:        /* Fix default path names on Amiga OS */
        !           498:        sprintf(ConfigureParams.Rom.szTosImageFileName, "%stos.img", Paths_GetDataDir());
        !           499: #endif
        !           500: }
        !           501: 
        !           502: 
        !           503: /*-----------------------------------------------------------------------*/
        !           504: /**
        !           505:  * Copy details from configuration structure into global variables for system,
        !           506:  * clean file names, etc...  Called from main.c and dialog.c files.
        !           507:  */
        !           508: void Configuration_Apply(bool bReset)
        !           509: {
        !           510:        if (bReset)
        !           511:        {
        !           512:                /* Set resolution change */
        !           513:        }
        !           514:        if (ConfigureParams.Screen.nFrameSkips < AUTO_FRAMESKIP_LIMIT)
        !           515:        {
        !           516: //             nFrameSkips = ConfigureParams.Screen.nFrameSkips;
        !           517:        }
        !           518: 
        !           519:        /* Sound settings */
        !           520:        /* SDL sound buffer in ms */
        !           521: //     SdlAudioBufferSize = ConfigureParams.Sound.SdlAudioBufferSize;
        !           522: //     if ( SdlAudioBufferSize == 0 )                  /* use default setting for SDL */
        !           523: //             ;
        !           524: //     else if ( SdlAudioBufferSize < 10 )             /* min of 10 ms */
        !           525: //             SdlAudioBufferSize = 10;
        !           526: //     else if ( SdlAudioBufferSize > 100 )            /* max of 100 ms */
        !           527: //             SdlAudioBufferSize = 100;
        !           528: 
        !           529:        /* Set playback frequency */
        !           530: //     Audio_SetOutputAudioFreq(ConfigureParams.Sound.nPlaybackFreq);
        !           531: 
        !           532:        /* CPU settings */
        !           533:        if (ConfigureParams.System.nCpuFreq < 12)
        !           534:        {
        !           535:                ConfigureParams.System.nCpuFreq = 8;
        !           536:                nCpuFreqShift = 0;
        !           537:        }
        !           538:        else if (ConfigureParams.System.nCpuFreq > 26)
        !           539:        {
        !           540:                ConfigureParams.System.nCpuFreq = 32;
        !           541:                nCpuFreqShift = 2;
        !           542:        }
        !           543:        else
        !           544:        {
        !           545:                ConfigureParams.System.nCpuFreq = 16;
        !           546:                nCpuFreqShift = 1;
        !           547:        }
        !           548:        /* Change UAE cpu_level and cpu_compatible accordingly */
        !           549:        M68000_CheckCpuLevel();
        !           550: 
        !           551:        /* Clean file and directory names */
        !           552:        File_MakeAbsoluteName(ConfigureParams.Rom.szTosImageFileName);
        !           553:        if (strlen(ConfigureParams.Rom.szCartridgeImageFileName) > 0)
        !           554:                File_MakeAbsoluteName(ConfigureParams.Rom.szCartridgeImageFileName);
        !           555:        File_MakeAbsoluteName(ConfigureParams.HardDisk.szHardDiskImage);
        !           556:        File_CleanFileName(ConfigureParams.HardDisk.szHardDiskDirectories[0]);
        !           557:        File_MakeAbsoluteName(ConfigureParams.HardDisk.szHardDiskDirectories[0]);
        !           558:        File_MakeAbsoluteName(ConfigureParams.Memory.szMemoryCaptureFileName);
        !           559:        File_MakeAbsoluteName(ConfigureParams.Sound.szYMCaptureFileName);
        !           560:        if (strlen(ConfigureParams.Keyboard.szMappingFileName) > 0)
        !           561:                File_MakeAbsoluteName(ConfigureParams.Keyboard.szMappingFileName);
        !           562:        
        !           563:        /* make path names absolute, but handle special file names */
        !           564:        File_MakeAbsoluteSpecialName(ConfigureParams.Log.sLogFileName);
        !           565:        File_MakeAbsoluteSpecialName(ConfigureParams.Log.sTraceFileName);
        !           566:        File_MakeAbsoluteSpecialName(ConfigureParams.RS232.szInFileName);
        !           567:        File_MakeAbsoluteSpecialName(ConfigureParams.RS232.szOutFileName);
        !           568:        File_MakeAbsoluteSpecialName(ConfigureParams.Midi.sMidiInFileName);
        !           569:        File_MakeAbsoluteSpecialName(ConfigureParams.Midi.sMidiOutFileName);
        !           570:        File_MakeAbsoluteSpecialName(ConfigureParams.Printer.szPrintToFileName);
        !           571: }
        !           572: 
        !           573: 
        !           574: /*-----------------------------------------------------------------------*/
        !           575: /**
        !           576:  * Load a settings section from the configuration file.
        !           577:  */
        !           578: static int Configuration_LoadSection(const char *pFilename, const struct Config_Tag configs[], const char *pSection)
        !           579: {
        !           580:        int ret;
        !           581: 
        !           582:        ret = input_config(pFilename, configs, pSection);
        !           583: 
        !           584:        if (ret < 0)
        !           585:                fprintf(stderr, "Can not load configuration file %s (section %s).\n",
        !           586:                        pFilename, pSection);
        !           587: 
        !           588:        return ret;
        !           589: }
        !           590: 
        !           591: 
        !           592: /*-----------------------------------------------------------------------*/
        !           593: /**
        !           594:  * Load program setting from configuration file. If psFileName is NULL, use
        !           595:  * the configuration file given in configuration / last selected by user.
        !           596:  */
        !           597: void Configuration_Load(const char *psFileName)
        !           598: {
        !           599:        if (psFileName == NULL)
        !           600:                psFileName = sConfigFileName;
        !           601: 
        !           602:        if (!File_Exists(psFileName))
        !           603:        {
        !           604:                fprintf(stderr, "Configuration file %s not found.\n", psFileName);
        !           605:                return;
        !           606:        }
        !           607: 
        !           608:        Configuration_LoadSection(psFileName, configs_Log, "[Log]");
        !           609:        Configuration_LoadSection(psFileName, configs_Debugger, "[Debugger]");
        !           610:        Configuration_LoadSection(psFileName, configs_Screen, "[Screen]");
        !           611:        Configuration_LoadSection(psFileName, configs_Joystick0, "[Joystick0]");
        !           612:        Configuration_LoadSection(psFileName, configs_Joystick1, "[Joystick1]");
        !           613:        Configuration_LoadSection(psFileName, configs_Joystick2, "[Joystick2]");
        !           614:        Configuration_LoadSection(psFileName, configs_Joystick3, "[Joystick3]");
        !           615:        Configuration_LoadSection(psFileName, configs_Joystick4, "[Joystick4]");
        !           616:        Configuration_LoadSection(psFileName, configs_Joystick5, "[Joystick5]");
        !           617:        Configuration_LoadSection(psFileName, configs_Keyboard, "[Keyboard]");
        !           618:        Configuration_LoadSection(psFileName, configs_ShortCutWithMod, "[ShortcutsWithModifiers]");
        !           619:        Configuration_LoadSection(psFileName, configs_ShortCutWithoutMod, "[ShortcutsWithoutModifiers]");
        !           620:        Configuration_LoadSection(psFileName, configs_Sound, "[Sound]");
        !           621:        Configuration_LoadSection(psFileName, configs_Memory, "[Memory]");
        !           622:        Configuration_LoadSection(psFileName, configs_Floppy, "[Floppy]");
        !           623:        Configuration_LoadSection(psFileName, configs_HardDisk, "[HardDisk]");
        !           624:        Configuration_LoadSection(psFileName, configs_Rom, "[ROM]");
        !           625:        Configuration_LoadSection(psFileName, configs_Rs232, "[RS232]");
        !           626:        Configuration_LoadSection(psFileName, configs_Printer, "[Printer]");
        !           627:        Configuration_LoadSection(psFileName, configs_Midi, "[Midi]");
        !           628:        Configuration_LoadSection(psFileName, configs_System, "[System]");
        !           629: }
        !           630: 
        !           631: 
        !           632: /*-----------------------------------------------------------------------*/
        !           633: /**
        !           634:  * Save a settings section to configuration file
        !           635:  */
        !           636: static int Configuration_SaveSection(const char *pFilename, const struct Config_Tag configs[], const char *pSection)
        !           637: {
        !           638:        int ret;
        !           639: 
        !           640:        ret = update_config(pFilename, configs, pSection);
        !           641: 
        !           642:        if (ret < 0)
        !           643:                fprintf(stderr, "Error while updating section %s in %s\n", pSection, pFilename);
        !           644: 
        !           645:        return ret;
        !           646: }
        !           647: 
        !           648: 
        !           649: /*-----------------------------------------------------------------------*/
        !           650: /**
        !           651:  * Save program setting to configuration file
        !           652:  */
        !           653: void Configuration_Save(void)
        !           654: {
        !           655:        if (Configuration_SaveSection(sConfigFileName, configs_Log, "[Log]") < 0)
        !           656:        {
        !           657:                Log_AlertDlg(LOG_ERROR, "Error saving config file.");
        !           658:                return;
        !           659:        }
        !           660:        Configuration_SaveSection(sConfigFileName, configs_Debugger, "[Debugger]");
        !           661:        Configuration_SaveSection(sConfigFileName, configs_Screen, "[Screen]");
        !           662:        Configuration_SaveSection(sConfigFileName, configs_Joystick0, "[Joystick0]");
        !           663:        Configuration_SaveSection(sConfigFileName, configs_Joystick1, "[Joystick1]");
        !           664:        Configuration_SaveSection(sConfigFileName, configs_Joystick2, "[Joystick2]");
        !           665:        Configuration_SaveSection(sConfigFileName, configs_Joystick3, "[Joystick3]");
        !           666:        Configuration_SaveSection(sConfigFileName, configs_Joystick4, "[Joystick4]");
        !           667:        Configuration_SaveSection(sConfigFileName, configs_Joystick5, "[Joystick5]");
        !           668:        Configuration_SaveSection(sConfigFileName, configs_Keyboard, "[Keyboard]");
        !           669:        Configuration_SaveSection(sConfigFileName, configs_ShortCutWithMod, "[ShortcutsWithModifiers]");
        !           670:        Configuration_SaveSection(sConfigFileName, configs_ShortCutWithoutMod, "[ShortcutsWithoutModifiers]");
        !           671:        Configuration_SaveSection(sConfigFileName, configs_Sound, "[Sound]");
        !           672:        Configuration_SaveSection(sConfigFileName, configs_Memory, "[Memory]");
        !           673:        Configuration_SaveSection(sConfigFileName, configs_Floppy, "[Floppy]");
        !           674:        Configuration_SaveSection(sConfigFileName, configs_HardDisk, "[HardDisk]");
        !           675:        Configuration_SaveSection(sConfigFileName, configs_Rom, "[ROM]");
        !           676:        Configuration_SaveSection(sConfigFileName, configs_Rs232, "[RS232]");
        !           677:        Configuration_SaveSection(sConfigFileName, configs_Printer, "[Printer]");
        !           678:        Configuration_SaveSection(sConfigFileName, configs_Midi, "[Midi]");
        !           679:        Configuration_SaveSection(sConfigFileName, configs_System, "[System]");
        !           680: }
        !           681: 
        !           682: 
        !           683: /*-----------------------------------------------------------------------*/
        !           684: /**
        !           685:  * Save/restore snapshot of configuration variables
        !           686:  * ('MemorySnapShot_Store' handles type)
        !           687:  */
        !           688: void Configuration_MemorySnapShot_Capture(bool bSave)
        !           689: {
        !           690:        MemorySnapShot_Store(ConfigureParams.Rom.szTosImageFileName, sizeof(ConfigureParams.Rom.szTosImageFileName));
        !           691:        MemorySnapShot_Store(ConfigureParams.Rom.szCartridgeImageFileName, sizeof(ConfigureParams.Rom.szCartridgeImageFileName));
        !           692: 
        !           693:        MemorySnapShot_Store(&ConfigureParams.Memory.nMemorySize, sizeof(ConfigureParams.Memory.nMemorySize));
        !           694: 
        !           695:        MemorySnapShot_Store(&ConfigureParams.HardDisk.bUseHardDiskDirectories, sizeof(ConfigureParams.HardDisk.bUseHardDiskDirectories));
        !           696:        MemorySnapShot_Store(ConfigureParams.HardDisk.szHardDiskDirectories[DRIVE_C], sizeof(ConfigureParams.HardDisk.szHardDiskDirectories[DRIVE_C]));
        !           697:        MemorySnapShot_Store(&ConfigureParams.HardDisk.bUseHardDiskImage, sizeof(ConfigureParams.HardDisk.bUseHardDiskImage));
        !           698:        MemorySnapShot_Store(ConfigureParams.HardDisk.szHardDiskImage, sizeof(ConfigureParams.HardDisk.szHardDiskImage));
        !           699: 
        !           700:        MemorySnapShot_Store(&ConfigureParams.Screen.nMonitorType, sizeof(ConfigureParams.Screen.nMonitorType));
        !           701:        MemorySnapShot_Store(&ConfigureParams.Screen.bUseExtVdiResolutions, sizeof(ConfigureParams.Screen.bUseExtVdiResolutions));
        !           702:        MemorySnapShot_Store(&ConfigureParams.Screen.nVdiWidth, sizeof(ConfigureParams.Screen.nVdiWidth));
        !           703:        MemorySnapShot_Store(&ConfigureParams.Screen.nVdiHeight, sizeof(ConfigureParams.Screen.nVdiHeight));
        !           704:        MemorySnapShot_Store(&ConfigureParams.Screen.nVdiColors, sizeof(ConfigureParams.Screen.nVdiColors));
        !           705: 
        !           706:        MemorySnapShot_Store(&ConfigureParams.System.nCpuLevel, sizeof(ConfigureParams.System.nCpuLevel));
        !           707:        MemorySnapShot_Store(&ConfigureParams.System.nCpuFreq, sizeof(ConfigureParams.System.nCpuFreq));
        !           708:        MemorySnapShot_Store(&ConfigureParams.System.bCompatibleCpu, sizeof(ConfigureParams.System.bCompatibleCpu));
        !           709:        MemorySnapShot_Store(&ConfigureParams.System.nMachineType, sizeof(ConfigureParams.System.nMachineType));
        !           710:        MemorySnapShot_Store(&ConfigureParams.System.bBlitter, sizeof(ConfigureParams.System.bBlitter));
        !           711:        MemorySnapShot_Store(&ConfigureParams.System.nDSPType, sizeof(ConfigureParams.System.nDSPType));
        !           712:        MemorySnapShot_Store(&ConfigureParams.System.bRealTimeClock, sizeof(ConfigureParams.System.bRealTimeClock));
        !           713:        MemorySnapShot_Store(&ConfigureParams.System.bPatchTimerD, sizeof(ConfigureParams.System.bPatchTimerD));
        !           714:        MemorySnapShot_Store(&ConfigureParams.DiskImage.bSlowFloppy, sizeof(ConfigureParams.DiskImage.bSlowFloppy));
        !           715: 
        !           716:        if (!bSave)
        !           717:                Configuration_Apply(true);
        !           718: }
        !           719: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.