static void configure_cpu(void) { bool uae_cpu_24bit_addressing = !cfg->cpu_32bit_addressing; const char *uae_cpu_model = cfg->default_cpu; const char *uae_fpu_model = cfg->default_fpu; const char *uae_mmu_model = cfg->default_mmu; //bool allow_6888x_fpu = false; //bool allow_68040_fpu = false; //bool allow_68060_fpu = false; const char *cpu = fs_config_get_const_string(OPTION_CPU); if (cpu == NULL) { cpu = cfg->accelerator_cpu; } if (cpu == NULL || fs_uae_values_matches(cpu, "auto")) { /* Go with the already configured value */ } else if (fs_uae_values_matches(cpu, "68000")) { uae_cpu_24bit_addressing = true; uae_cpu_model = "68000"; uae_fpu_model = "0"; uae_mmu_model = "0"; } else if (fs_uae_values_matches(cpu, "68010")) { uae_cpu_24bit_addressing = true; uae_cpu_model = "68010"; uae_fpu_model = "0"; uae_mmu_model = "0"; } else if (fs_uae_values_matches(cpu, "68EC020")) { uae_cpu_24bit_addressing = true; uae_cpu_model = "68020"; uae_fpu_model = cfg->default_fpu_noninternal; uae_mmu_model = "0"; //allow_6888x_fpu = true; } else if (fs_uae_values_matches(cpu, "68020")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68020"; uae_fpu_model = cfg->default_fpu_noninternal; uae_mmu_model = "0"; } else if (fs_uae_values_matches(cpu, "68EC030")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68030"; uae_fpu_model = "0"; uae_mmu_model = "0"; } else if (fs_uae_values_matches(cpu, "68030")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68030"; uae_fpu_model = cfg->default_fpu_noninternal; uae_mmu_model = "68030"; } else if (fs_uae_values_matches(cpu, "68EC040")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68040"; uae_fpu_model = "0"; uae_mmu_model = "0"; } else if (fs_uae_values_matches(cpu, "68LC040")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68040"; uae_fpu_model = "0"; uae_mmu_model = "68040"; } else if (fs_uae_values_matches(cpu, "68040")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68040"; uae_fpu_model = "68040"; uae_mmu_model = "68040"; } else if (fs_uae_values_matches(cpu, "68040-NOMMU")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68040"; uae_fpu_model = "68040"; uae_mmu_model = "0"; } else if (fs_uae_values_matches(cpu, "68EC060")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68060"; uae_fpu_model = "0"; uae_mmu_model = "0"; } else if (fs_uae_values_matches(cpu, "68LC060")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68060"; uae_fpu_model = "0"; uae_mmu_model = "68060"; } else if (fs_uae_values_matches(cpu, "68060-NOMMU")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68060"; uae_fpu_model = "68060"; uae_mmu_model = "0"; } else if (fs_uae_values_matches(cpu, "68060")) { uae_cpu_24bit_addressing = false; uae_cpu_model = "68060"; uae_fpu_model = "68060"; uae_mmu_model = "68060"; } else { fs_emu_warning("Unknown CPU specified"); } const char *fpu = fs_config_get_const_string(OPTION_FPU); if (fpu == NULL || fs_uae_values_matches(fpu, "auto")) { /* Go with the already configured value */ } else if (fs_uae_values_matches(fpu, "0")) { uae_fpu_model = "0"; } else if (fs_uae_values_matches(fpu, "68881")) { if (fs_uae_values_matches(uae_cpu_model, "68020") || fs_uae_values_matches(uae_cpu_model, "68030")) { uae_fpu_model = "68881"; } else { fs_emu_warning("68881 FPU must be paired with 68020/68030 CPU\n"); } } else if (fs_uae_values_matches(fpu, "68882")) { if (strcmp(uae_cpu_model, "68020") == 0 || strcmp(uae_cpu_model, "68030") == 0) { uae_fpu_model = "68882"; } else { fs_emu_warning("68882 FPU must be paired with 68020/68030 CPU\n"); } } else if (fs_uae_values_matches(fpu, "68040")) { if (strcmp(uae_cpu_model, "68040") == 0) { uae_fpu_model = "68040"; } else { fs_emu_warning("68040 FPU must be paired with 68040 CPU"); } } else if (fs_uae_values_matches(fpu, "68060")) { if (strcmp(uae_cpu_model, "68060") == 0) { uae_fpu_model = "68060"; } else { fs_emu_warning("68060 FPU must be paired with 68060 CPU"); } } else { fs_emu_warning("Unknown FPU specified"); } const char *mmu = fs_config_get_const_string(OPTION_MMU); if (mmu == NULL || fs_uae_values_matches(mmu, "auto")) { /* Go with the already configured value */ } else if (fs_uae_values_matches(mmu, "0")) { uae_mmu_model = "0"; } else if (fs_uae_values_matches(mmu, "68030")) { if (strcmp(uae_cpu_model, "68030") == 0) { uae_mmu_model = "68030"; } else { fs_emu_warning("68030 MMU must be paired with 68030 CPU"); } } else if (fs_uae_values_matches(mmu, "68040")) { if (strcmp(uae_cpu_model, "68040") == 0) { uae_mmu_model = "68040"; } else { fs_emu_warning("68040 MMU must be paired with 68040 CPU"); } } else if (fs_uae_values_matches(mmu, "68060")) { if (strcmp(uae_cpu_model, "68060") == 0) { uae_mmu_model = "68060"; } else { fs_emu_warning("68060 MMU must be paired with 68060 CPU"); } } else { fs_emu_warning("Unknown MMU specified"); } if (uae_cpu_model[0]) { amiga_set_option("cpu_model", uae_cpu_model); } if (uae_fpu_model[0]) { amiga_set_option("fpu_model", uae_fpu_model); } if (uae_mmu_model[0]) { amiga_set_option("mmu_model", uae_mmu_model); } if (uae_cpu_24bit_addressing) { amiga_set_option("cpu_24bit_addressing", "true"); } else { amiga_set_option("cpu_24bit_addressing", "false"); } cfg->cpu_32bit_addressing = !uae_cpu_24bit_addressing; cfg->allow_z3_memory = !uae_cpu_24bit_addressing; int accuracy = fs_config_get_int("accuracy"); if (accuracy == FS_CONFIG_NONE) { accuracy = 1; } int blitter_mode = BLITTER_MODE_NORMAL; int cpu_mode = CPU_MODE_CYCLE_EXACT; int cpu_speed = CPU_SPEED_REAL; if (strcmp(uae_cpu_model, "68030") == 0 || strcmp(uae_cpu_model, "68040") == 0 || strcmp(uae_cpu_model, "68060") == 0) { cpu_speed = CPU_SPEED_MAX; cpu_mode = CPU_MODE_NONCOMPATIBLE; } else { cpu_speed = CPU_SPEED_REAL; if (accuracy > 0) { cpu_mode = CPU_MODE_CYCLE_EXACT; } else if (accuracy == 0) { cpu_mode = CPU_MODE_COMPATIBLE; } else if (accuracy < 0) { cpu_mode = CPU_MODE_NONCOMPATIBLE; } } if (cpu_mode == CPU_MODE_CYCLE_EXACT && strcmp(uae_cpu_model, "68000") == 0) { blitter_mode = BLITTER_MODE_NORMAL; } else if (accuracy < 0) { blitter_mode = BLITTER_MODE_IMMEDIATE; } else { blitter_mode = BLITTER_MODE_WAITING; } if (cpu_speed == CPU_SPEED_MAX) { amiga_set_option("cpu_speed", "max"); } else { amiga_set_option("cpu_speed", "real"); } if (cpu_mode == CPU_MODE_CYCLE_EXACT) { amiga_set_option("blitter_cycle_exact", "true"); amiga_set_option("cpu_compatible", "true"); amiga_set_option("cpu_cycle_exact", "true"); } else if (cpu_mode == CPU_MODE_COMPATIBLE) { amiga_set_option("blitter_cycle_exact", "false"); amiga_set_option("cpu_compatible", "true"); amiga_set_option("cpu_cycle_exact", "false"); } else if (cpu_mode == CPU_MODE_NONCOMPATIBLE) { amiga_set_option("blitter_cycle_exact", "false"); amiga_set_option("cpu_compatible", "false"); amiga_set_option("cpu_cycle_exact", "false"); } if (blitter_mode == BLITTER_MODE_NORMAL) { amiga_set_option("waiting_blits", "false"); amiga_set_option("immediate_blits", "false"); } else if (blitter_mode == BLITTER_MODE_WAITING) { amiga_set_option("waiting_blits", "true"); amiga_set_option("immediate_blits", "false"); } else if (blitter_mode == BLITTER_MODE_IMMEDIATE) { amiga_set_option("waiting_blits", "false"); amiga_set_option("immediate_blits", "true"); } int cpu_idle = fs_config_get_int_clamped(OPTION_CPU_IDLE, 0, 10); if (cpu_idle == FS_CONFIG_NONE) { cpu_idle = cfg->cpu_idle; } if (cpu_idle != FS_CONFIG_NONE) { fs_log("Setting cpu_idle to %d\n", cpu_idle); amiga_set_cpu_idle(cpu_idle); } }
void fs_uae_configure_amiga_hardware() { amiga_config *c = g_fs_uae_amiga_configs + g_fs_uae_amiga_config; char *path; fs_emu_log("fs_uae_configure_amiga_hardware\n"); fs_uae_load_rom_files(fs_uae_kickstarts_dir()); #ifdef NEW_ACCURACY_SYSTEM g_accuracy = 1; #endif fs_emu_log("configuring \"%s\", accuracy=%d\n", c->name, g_accuracy); amiga_quickstart(c->quickstart_model, c->quickstart_config, g_accuracy); amiga_set_option("cachesize", "0"); if (c->cpu_model) { amiga_set_option("cpu_model", c->cpu_model); } if (c->z3mem_size) { amiga_set_int_option("z3mem_size", c->z3mem_size); } if (c->cpu_32bit_addressing) { amiga_set_option("cpu_24bit_addressing", "false"); } if (c->fast) { amiga_set_option("cpu_speed", "max"); amiga_set_option("blitter_cycle_exact", "false"); amiga_set_option("cpu_cycle_exact", "false"); amiga_set_option("cpu_compatible", "false"); amiga_set_option("immediate_blits", "true"); } //if (g_fs_uae_fastest_possible) { amiga_set_cpu_idle(2); //} if (g_fs_uae_ntsc_mode) { // FIXME: ciiatod on some Amiga models? amiga_set_option("ntsc", "true"); } path = fs_config_get_string("kickstart_file"); if (path) { path = fs_uae_expand_path_and_free(path); path = fs_uae_resolve_path_and_free(path, FS_UAE_ROM_PATHS); amiga_set_option("kickstart_rom_file", path); free(path); } path = fs_config_get_string("kickstart_ext_file"); if (path) { path = fs_uae_expand_path_and_free(path); path = fs_uae_resolve_path_and_free(path, FS_UAE_ROM_PATHS); amiga_set_option("kickstart_ext_rom_file", path); free(path); } configure_memory(c); if (fs_config_get_boolean("bsdsocket_library") == 1) { amiga_set_option("bsdsocket_emu", "yes"); } amiga_enable_serial_port(); configure_accuracy(c); /* if (g_fs_uae_amiga_model == MODEL_A500) { if (slow_memory || fast_memory || chip_memory > 512) { fs_log("using A500 and memory expansions, " "enabling real-time clock"); amiga_set_option("rtc", "MSM6242B"); } } */ /* char **keys = g_key_file_get_keys(g_fs_uae_config, "uae", NULL, NULL); if (keys) { for (char **key = keys; *key; key++) { char *value = g_key_file_get_string(g_fs_uae_config, "uae", *key, NULL); if (value != NULL) { amiga_set_option(*key, value); free(value); } } g_strfreev(keys); } */ }