diff --git a/src/config.c b/src/config.c index 67f89a324..d02e5f63e 100644 --- a/src/config.c +++ b/src/config.c @@ -528,9 +528,9 @@ load_machine(void) cpu = config_get_int(cat, "cpu", 0); cpu_waitstates = config_get_int(cat, "cpu_waitstates", 0); - p = (char *)config_get_string(cat, "fpu", "none"); + p = (char *)config_get_string(cat, "fpu_type", "none"); fpu_type = fpu_get_type(machine, cpu_manufacturer, cpu, p); - + mem_size = config_get_int(cat, "mem_size", 4096); #if 0 @@ -1510,6 +1510,11 @@ save_machine(void) else config_set_int(cat, "cpu_waitstates", cpu_waitstates); + if (fpu_type == 0) + config_delete_var(cat, "fpu_type"); + else + config_set_string(cat, "fpu_type", fpu_get_internal_name(machine, cpu_manufacturer, cpu, fpu_type)); + if (mem_size == 4096) config_delete_var(cat, "mem_size"); else @@ -1517,11 +1522,6 @@ save_machine(void) config_set_int(cat, "cpu_use_dynarec", cpu_use_dynarec); - if (enable_external_fpu == 0) - config_delete_var(cat, "cpu_enable_fpu"); - else - config_set_int(cat, "cpu_enable_fpu", enable_external_fpu); - if (time_sync & TIME_SYNC_ENABLED) if (time_sync & TIME_SYNC_UTC) config_set_string(cat, "time_sync", "utc"); diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index d9e4274b5..c958158fc 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -172,7 +172,6 @@ int is286, is_am486, is_pentium, is_k5, is_k6, is_p6; int hasfpu; -int fpu_type; uint64_t tsc = 0; msr_t msr; diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 68af871e2..fa6207030 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -21,8 +21,6 @@ #ifndef EMU_CPU_H # define EMU_CPU_H -extern int fpu_type; - enum { FPU_NONE, FPU_8087, @@ -592,9 +590,9 @@ extern int sysexit(uint32_t fetchdat); extern int syscall(uint32_t fetchdat); extern int sysret(uint32_t fetchdat); -int fpu_get_type(int machine, int cpu_manufacturer, int cpu, const char *internal_name); -const char *fpu_get_internal_name(int machine, int cpu_manufacturer, int cpu, int type); -const char *fpu_get_name_from_index(int machine, int cpu_manufacturer, int cpu, int c); -int fpu_get_type_from_index(int machine, int cpu_manufacturer, int cpu, int c); +extern int fpu_get_type(int machine, int cpu_manufacturer, int cpu, const char *internal_name); +extern const char *fpu_get_internal_name(int machine, int cpu_manufacturer, int cpu, int type); +extern const char *fpu_get_name_from_index(int machine, int cpu_manufacturer, int cpu, int c); +extern int fpu_get_type_from_index(int machine, int cpu_manufacturer, int cpu, int c); #endif /*EMU_CPU_H*/ diff --git a/src/cpu/x87_ops.h b/src/cpu/x87_ops.h index 57064b281..3c6545bef 100644 --- a/src/cpu/x87_ops.h +++ b/src/cpu/x87_ops.h @@ -321,7 +321,7 @@ static __inline uint16_t x87_compare(double a, double b) if (!memcmp(&ea, &ia, 8) && !memcmp(&eb, &ib, 8)) return C3; - if (!is386 && !(cpu_state.npxc & 0x1000) && + if ((fpu_type != FPU_287XL) && (fpu_type != FPU_387) && !(cpu_state.npxc & 0x1000) && ((a == INFINITY) || (a == -INFINITY)) && ((b == INFINITY) || (b == -INFINITY))) eb = ea; @@ -358,7 +358,7 @@ static __inline uint16_t x87_compare(double a, double b) uint32_t result = 0; double ea = a, eb = b; - if (!is386 && !(cpu_state.npxc & 0x1000) && + if ((fpu_type != FPU_287XL) && (fpu_type != FPU_387) && !(cpu_state.npxc & 0x1000) && ((a == INFINITY) || (a == -INFINITY)) && ((b == INFINITY) || (b == -INFINITY))) eb = ea; diff --git a/src/cpu/x87_ops_arith.h b/src/cpu/x87_ops_arith.h index d4ec58724..de5a3901c 100644 --- a/src/cpu/x87_ops_arith.h +++ b/src/cpu/x87_ops_arith.h @@ -180,7 +180,7 @@ static int opFCOMPP(uint32_t fetchdat) cpu_state.npxs &= ~(C0|C2|C3); p = (uint64_t *)&ST(0); q = (uint64_t *)&ST(1); - if ((*p == ((uint64_t)1 << 63) && *q == 0) && is386) + if ((*p == ((uint64_t)1 << 63) && *q == 0) && ((fpu_type == FPU_287XL) || (fpu_type == FPU_387))) cpu_state.npxs |= C0; /*Nasty hack to fix 80387 detection*/ else cpu_state.npxs |= x87_compare(ST(0), ST(1)); diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index b29f17c6e..9f1fe7c92 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -116,7 +116,7 @@ extern uint32_t mem_size; /* (C) memory size */ extern int cpu_manufacturer, /* (C) cpu manufacturer */ cpu, /* (C) cpu type */ cpu_use_dynarec, /* (C) cpu uses/needs Dyna */ - enable_external_fpu; /* (C) enable external FPU */ + fpu_type; /* (C) fpu type */ extern int time_sync; /* (C) enable time sync */ extern int network_type; /* (C) net provider type */ extern int network_card; /* (C) net interface num */ diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 59dc27d0d..1e93b328a 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -120,7 +120,7 @@ #define IDC_CONFIGURE_MACHINE 1011 #define IDC_COMBO_CPU_TYPE 1012 #define IDC_COMBO_CPU 1013 -#define IDC_CHECK_FPU 1014 +#define IDC_COMBO_FPU 1014 #define IDC_COMBO_WS 1015 #ifdef USE_DYNAREC #define IDC_CHECK_DYNAREC 1016 diff --git a/src/pc.c b/src/pc.c index b2886b183..e720cf529 100644 --- a/src/pc.c +++ b/src/pc.c @@ -135,7 +135,7 @@ uint32_t mem_size = 0; /* (C) memory size */ int cpu_manufacturer = 0, /* (C) cpu manufacturer */ cpu_use_dynarec = 0, /* (C) cpu uses/needs Dyna */ cpu = 3, /* (C) cpu type */ - enable_external_fpu = 0; /* (C) enable external FPU */ + fpu_type = 0; /* (C) fpu type */ int time_sync = 0; /* (C) enable time sync */ #ifdef USE_DISCORD int enable_discord = 0; /* (C) enable Discord integration */ diff --git a/src/win/86Box.rc b/src/win/86Box.rc index e9841e8f2..a4a29ca41 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -347,7 +347,7 @@ BEGIN #endif END -DLG_CFG_MACHINE DIALOG DISCARDABLE 97, 0, 267, 199 +DLG_CFG_MACHINE DIALOG DISCARDABLE 97, 0, 286, 199 STYLE DS_CONTROL | WS_CHILD FONT 9, "Segoe UI" BEGIN @@ -361,25 +361,28 @@ BEGIN COMBOBOX IDC_COMBO_CPU,145,25,115,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "CPU:",IDT_1704,124,26,18,10 - COMBOBOX IDC_COMBO_WS,71,44,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + COMBOBOX IDC_COMBO_FPU,71,44,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Wait states:",IDT_1703,7,45,60,10 - EDITTEXT IDC_MEMTEXT,70,63,45,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "FPU:",IDT_1707,7,45,59,10 + COMBOBOX IDC_COMBO_WS,71,63,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Wait states:",IDT_1703,7,64,60,10 + EDITTEXT IDC_MEMTEXT,70,82,45,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,63, + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,82, 12,12 - LTEXT "MB",IDT_1705,123,64,10,10 - LTEXT "Memory:",IDT_1706,7,64,30,10 - GROUPBOX "Time synchronization",IDC_TIME_SYNC,7,96,100,56 + LTEXT "MB",IDT_1705,123,83,10,10 + LTEXT "Memory:",IDT_1706,7,83,30,10 + GROUPBOX "Time synchronization",IDC_TIME_SYNC,7,115,100,56 CONTROL "Disabled",IDC_RADIO_TS_DISABLED,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,108,84,10 + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,127,84,10 CONTROL "Enabled (local time)", IDC_RADIO_TS_LOCAL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,122,84,10 + BS_AUTORADIOBUTTON | WS_TABSTOP,14,141,84,10 CONTROL "Enabled (UTC)", IDC_RADIO_TS_UTC,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,136,84,10 + BS_AUTORADIOBUTTON | WS_TABSTOP,14,155,84,10 #ifdef USE_DYNAREC CONTROL "Dynamic Recompiler",IDC_CHECK_DYNAREC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,81,94,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 #endif END diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 413fe2daf..de6ab7cbb 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -205,7 +205,7 @@ win_settings_init(void) #ifdef USE_DYNAREC temp_dynarec = cpu_use_dynarec; #endif - temp_fpu = enable_external_fpu; + temp_fpu = fpu_type; temp_sync = time_sync; /* Video category */ @@ -318,7 +318,7 @@ win_settings_changed(void) #ifdef USE_DYNAREC i = i || (temp_dynarec != cpu_use_dynarec); #endif - i = i || (temp_fpu != enable_external_fpu); + i = i || (temp_fpu != fpu_type); i = i || (temp_sync != time_sync); /* Video category */ @@ -422,7 +422,7 @@ win_settings_save(void) #ifdef USE_DYNAREC cpu_use_dynarec = temp_dynarec; #endif - enable_external_fpu = temp_fpu; + fpu_type = temp_fpu; time_sync = temp_sync; /* Video category */ @@ -507,6 +507,40 @@ win_settings_save(void) } +static void +win_settings_machine_recalc_fpu(HWND hdlg) +{ + HWND h; + int c, type; + LPTSTR lptsTemp; + const char *stransi; + + lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR)); + + h = GetDlgItem(hdlg, IDC_COMBO_FPU); + SendMessage(h, CB_RESETCONTENT, 0, 0); + c = 0; + while (1) { + stransi = (char *) fpu_get_name_from_index(temp_machine, temp_cpu_m, temp_cpu, c); + type = fpu_get_type_from_index(temp_machine, temp_cpu_m, temp_cpu, c); + if (!stransi) + break; + + mbstowcs(lptsTemp, stransi, strlen(stransi) + 1); + SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)lptsTemp); + if (!c || (type == temp_fpu)) + SendMessage(h, CB_SETCURSEL, c, 0); + + c++; + } + + if (c > 1) + EnableWindow(h, TRUE); + else + EnableWindow(h, FALSE); +} + + static void win_settings_machine_recalc_cpu(HWND hdlg) { @@ -539,15 +573,7 @@ win_settings_machine_recalc_cpu(HWND hdlg) EnableWindow(h, TRUE); #endif - h = GetDlgItem(hdlg, IDC_CHECK_FPU); - cpu_type = machines[temp_machine].cpu[temp_cpu_m].cpus[temp_cpu].cpu_type; - if (cpu_type < CPU_i486DX) - EnableWindow(h, TRUE); - else { - temp_fpu = 1; - EnableWindow(h, FALSE); - } - SendMessage(h, BM_SETCHECK, temp_fpu, 0); + win_settings_machine_recalc_fpu(hdlg); } @@ -738,6 +764,12 @@ win_settings_machine_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) win_settings_machine_recalc_cpu(hdlg); } break; + case IDC_COMBO_FPU: + if (HIWORD(wParam) == CBN_SELCHANGE) { + h = GetDlgItem(hdlg, IDC_COMBO_FPU); + temp_fpu = fpu_get_type_from_index(temp_machine, temp_cpu_m, temp_cpu, SendMessage(h, CB_GETCURSEL, 0, 0)); + } + break; case IDC_CONFIGURE_MACHINE: h = GetDlgItem(hdlg, IDC_COMBO_MACHINE); temp_machine = listtomachine[SendMessage(h, CB_GETCURSEL, 0, 0)]; @@ -769,9 +801,6 @@ win_settings_machine_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) if(SendMessage(h, BM_GETCHECK, 0, 0)) temp_sync = TIME_SYNC_ENABLED | TIME_SYNC_UTC; - h=GetDlgItem(hdlg, IDC_CHECK_FPU); - temp_fpu = SendMessage(h, BM_GETCHECK, 0, 0); - h = GetDlgItem(hdlg, IDC_COMBO_WS); temp_wait_states = SendMessage(h, CB_GETCURSEL, 0, 0);