diff --git a/src/WIN/86Box.rc b/src/WIN/86Box.rc index 04d628200..05381bd48 100644 --- a/src/WIN/86Box.rc +++ b/src/WIN/86Box.rc @@ -461,8 +461,10 @@ BEGIN COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Type:",IDT_1738,7,86,24,8 - CONTROL "Turbo timings (no accuracy)",IDC_CHECKTURBO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,131,86,129,10 + CONTROL "Turbo timings",IDC_CHECKTURBO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 + CONTROL "Check BPB",IDC_CHECKBPB,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,116,253,60 @@ -838,6 +840,7 @@ BEGIN IDS_2167 "&Reload previous image" IDS_2168 "&Image..." IDS_2169 "Image (&Write-protected)..." + IDS_2170 "Check BPB" IDS_3072 "None" IDS_3073 "[Bus] Bus mouse" diff --git a/src/WIN/resource.h b/src/WIN/resource.h index 41206cb1f..41b933e7f 100644 --- a/src/WIN/resource.h +++ b/src/WIN/resource.h @@ -163,17 +163,18 @@ #define IDC_LIST_FLOPPY_DRIVES 1151 #define IDC_COMBO_FD_TYPE 1152 #define IDC_CHECKTURBO 1153 -#define IDC_BUTTON_FDD_ADD 1154 // status bar menu -#define IDC_BUTTON_FDD_EDIT 1155 // status bar menu -#define IDC_BUTTON_FDD_REMOVE 1156 // status bar menu -#define IDC_LIST_CDROM_DRIVES 1157 -#define IDC_COMBO_CD_BUS 1158 -#define IDC_COMBO_CD_ID 1159 -#define IDC_COMBO_CD_LUN 1160 -#define IDC_COMBO_CD_CHANNEL_IDE 1161 -#define IDC_BUTTON_CDROM_ADD 1162 // status bar menu -#define IDC_BUTTON_CDROM_EDIT 1163 // status bar menu -#define IDC_BUTTON_CDROM_REMOVE 1164 // status bar menu +#define IDC_CHECKBPB 1154 +#define IDC_BUTTON_FDD_ADD 1155 // status bar menu +#define IDC_BUTTON_FDD_EDIT 1156 // status bar menu +#define IDC_BUTTON_FDD_REMOVE 1157 // status bar menu +#define IDC_LIST_CDROM_DRIVES 1158 +#define IDC_COMBO_CD_BUS 1159 +#define IDC_COMBO_CD_ID 1160 +#define IDC_COMBO_CD_LUN 1161 +#define IDC_COMBO_CD_CHANNEL_IDE 1162 +#define IDC_BUTTON_CDROM_ADD 1163 // status bar menu +#define IDC_BUTTON_CDROM_EDIT 1164 // status bar menu +#define IDC_BUTTON_CDROM_REMOVE 1165 // status bar menu /* For the DeviceConfig code, re-do later. */ @@ -319,6 +320,7 @@ #define IDS_2167 2167 // "RLL" #define IDS_2168 2168 // "IDE (PIO-only)" #define IDS_2169 2169 // "%01i:%01i" +#define IDS_2170 2170 // "%01i:%01i" #define IDS_3072 3072 #define IDS_3073 3073 @@ -391,7 +393,7 @@ #define IDS_LANG_ENUS IDS_6144 -#define STRINGS_NUM_2048 122 +#define STRINGS_NUM_2048 123 #define STRINGS_NUM_3072 11 #define STRINGS_NUM_4096 20 #define STRINGS_NUM_4352 7 diff --git a/src/WIN/win_settings.c b/src/WIN/win_settings.c index 781a73e23..7b127e17e 100644 --- a/src/WIN/win_settings.c +++ b/src/WIN/win_settings.c @@ -78,6 +78,7 @@ static hard_disk_t temp_hdc[HDC_NUM]; /* Removable devices category */ static int temp_fdd_types[FDD_NUM]; static int temp_fdd_turbo[FDD_NUM]; +static int temp_fdd_check_bpb[FDD_NUM]; static cdrom_drive_t temp_cdrom_drives[CDROM_NUM]; static HWND hwndParentDialog, hwndChildDialog; @@ -158,6 +159,7 @@ static void win_settings_init(void) { temp_fdd_types[i] = fdd_get_type(i); temp_fdd_turbo[i] = fdd_get_turbo(i); + temp_fdd_check_bpb[i] = fdd_get_check_bpb(i); } memcpy(temp_cdrom_drives, cdrom_drives, CDROM_NUM * sizeof(cdrom_drive_t)); } @@ -224,6 +226,7 @@ static int win_settings_changed(void) { i = i || (temp_fdd_types[j] != fdd_get_type(j)); i = i || (temp_fdd_turbo[j] != fdd_get_turbo(j)); + i = i || (temp_fdd_check_bpb[j] != fdd_get_check_bpb(j)); } i = i || memcmp(cdrom_drives, temp_cdrom_drives, CDROM_NUM * sizeof(cdrom_drive_t)); @@ -327,6 +330,7 @@ static void win_settings_save(void) { fdd_set_type(i, temp_fdd_types[i]); fdd_set_turbo(i, temp_fdd_turbo[i]); + fdd_set_check_bpb(i, temp_fdd_check_bpb[i]); } memcpy(cdrom_drives, temp_cdrom_drives, CDROM_NUM * sizeof(cdrom_drive_t)); @@ -3531,6 +3535,16 @@ static BOOL win_settings_floppy_drives_recalc_list(HWND hwndList) { return FALSE; } + + lvI.iSubItem = 2; + lvI.pszText = win_language_get_string_from_id(temp_fdd_check_bpb[i] ? IDS_2060 : IDS_2061); + lvI.iItem = i; + lvI.iImage = 0; + + if (ListView_SetItem(hwndList, &lvI) == -1) + { + return FALSE; + } } return TRUE; @@ -3603,7 +3617,7 @@ static BOOL win_settings_floppy_drives_init_columns(HWND hwndList) lvc.iSubItem = 1; lvc.pszText = win_language_get_string_from_id(IDS_2059); - lvc.cx = 100; + lvc.cx = 50; lvc.fmt = LVCFMT_LEFT; if (ListView_InsertColumn(hwndList, 1, &lvc) == -1) @@ -3611,6 +3625,16 @@ static BOOL win_settings_floppy_drives_init_columns(HWND hwndList) return FALSE; } + lvc.iSubItem = 2; + lvc.pszText = win_language_get_string_from_id(IDS_2170); + + lvc.cx = 75; + lvc.fmt = LVCFMT_LEFT; + + if (ListView_InsertColumn(hwndList, 2, &lvc) == -1) + { + return FALSE; + } return TRUE; } @@ -3710,6 +3734,16 @@ static void win_settings_floppy_drives_update_item(HWND hwndList, int i) { return; } + + lvI.iSubItem = 2; + lvI.pszText = win_language_get_string_from_id(temp_fdd_check_bpb[i] ? IDS_2060 : IDS_2061); + lvI.iItem = i; + lvI.iImage = 0; + + if (ListView_SetItem(hwndList, &lvI) == -1) + { + return; + } } static void win_settings_cdrom_drives_update_item(HWND hwndList, int i) @@ -3897,6 +3931,9 @@ static BOOL CALLBACK win_settings_removable_devices_proc(HWND hdlg, UINT message h = GetDlgItem(hdlg, IDC_CHECKTURBO); SendMessage(h, BM_SETCHECK, temp_fdd_turbo[fdlv_current_sel], 0); + h = GetDlgItem(hdlg, IDC_CHECKBPB); + SendMessage(h, BM_SETCHECK, temp_fdd_check_bpb[fdlv_current_sel], 0); + cdlv_current_sel = 0; h = GetDlgItem(hdlg, IDC_LIST_CDROM_DRIVES); win_settings_cdrom_drives_init_columns(h); @@ -3958,6 +3995,8 @@ static BOOL CALLBACK win_settings_removable_devices_proc(HWND hdlg, UINT message SendMessage(h, CB_SETCURSEL, temp_fdd_types[fdlv_current_sel], 0); h = GetDlgItem(hdlg, IDC_CHECKTURBO); SendMessage(h, BM_SETCHECK, temp_fdd_turbo[fdlv_current_sel], 0); + h = GetDlgItem(hdlg, IDC_CHECKBPB); + SendMessage(h, BM_SETCHECK, temp_fdd_check_bpb[fdlv_current_sel], 0); rd_ignore_change = 0; } else if ((((LPNMHDR)lParam)->code == LVN_ITEMCHANGED) && (((LPNMHDR)lParam)->idFrom == IDC_LIST_CDROM_DRIVES)) @@ -4035,6 +4074,20 @@ static BOOL CALLBACK win_settings_removable_devices_proc(HWND hdlg, UINT message rd_ignore_change = 0; return FALSE; + case IDC_CHECKBPB: + if (rd_ignore_change) + { + return FALSE; + } + + rd_ignore_change = 1; + h = GetDlgItem(hdlg, IDC_CHECKBPB); + temp_fdd_check_bpb[fdlv_current_sel] = SendMessage(h, BM_GETCHECK, 0, 0); + h = GetDlgItem(hdlg, IDC_LIST_FLOPPY_DRIVES); + win_settings_floppy_drives_update_item(h, fdlv_current_sel); + rd_ignore_change = 0; + return FALSE; + case IDC_COMBO_CD_BUS: if (rd_ignore_change) { diff --git a/src/config.c b/src/config.c index 1dbbd28f6..8af6785fe 100644 --- a/src/config.c +++ b/src/config.c @@ -1547,6 +1547,8 @@ static void loadconfig_removable_devices(void) ui_writeprot[c] = !!config_get_int(cat, temps, 0); sprintf(temps, "fdd_%02i_turbo", c + 1); fdd_set_turbo(c, !!config_get_int(cat, temps, 0)); + sprintf(temps, "fdd_%02i_check_bpb", c + 1); + fdd_set_check_bpb(c, !!config_get_int(cat, temps, 1)); /* Check, whether each value is default, if yes, delete it so that only non-default values will later be saved. */ if (fdd_get_type(c) == ((c < 2) ? 2 : 0)) @@ -1572,6 +1574,12 @@ static void loadconfig_removable_devices(void) sprintf(temps, "fdd_%02i_turbo", c + 1); config_delete_var(cat, temps); } + + if (fdd_get_check_bpb(c) == 1) + { + sprintf(temps, "fdd_%02i_check_bpb", c + 1); + config_delete_var(cat, temps); + } } memset(temps, 0, 512); @@ -2455,6 +2463,16 @@ static void saveconfig_removable_devices(void) { config_set_int(cat, temps, fdd_get_turbo(c)); } + + sprintf(temps, "fdd_%02i_check_bpb", c + 1); + if (fdd_get_check_bpb(c) == 1) + { + config_delete_var(cat, temps); + } + else + { + config_set_int(cat, temps, fdd_get_check_bpb(c)); + } } memset(temps, '\0', sizeof(temps)); diff --git a/src/disc_img.c b/src/disc_img.c index 8c78a5180..64eb40fe7 100644 --- a/src/disc_img.c +++ b/src/disc_img.c @@ -710,7 +710,7 @@ jump_if_fdf: pclog("BPB reports %i sides and %i bytes per sector (%i sectors total)\n", bpb_sides, bpb_bps, bpb_total); - if (((bpb_sides < 1) || (bpb_sides > 2) || !bps_is_valid(bpb_bps) || !first_byte_is_valid(first_byte)) && !fdi && !cqm) + if ((((bpb_sides < 1) || (bpb_sides > 2) || !bps_is_valid(bpb_bps) || !first_byte_is_valid(first_byte)) && !fdi && !cqm) || !fdd_get_check_bpb(drive)) { /* The BPB is giving us a wacky number of sides and/or bytes per sector, therefore it is most probably not a BPB at all, so we have to guess the parameters from file size. */ diff --git a/src/fdd.c b/src/fdd.c index 1fb1e50ec..2fb24c5ec 100644 --- a/src/fdd.c +++ b/src/fdd.c @@ -32,6 +32,8 @@ static struct int head; int turbo; + + int check_bpb; } fdd[FDD_NUM]; /* Flags: @@ -329,6 +331,16 @@ int fdd_get_turbo(int drive) return fdd[drive].turbo; } +void fdd_set_check_bpb(int drive, int check_bpb) +{ + fdd[drive].check_bpb = check_bpb; +} + +int fdd_get_check_bpb(int drive) +{ + return fdd[drive].check_bpb; +} + int fdd_get_densel(int drive) { if (drive_types[fdd[drive].type].flags & FLAG_INVERT_DENSEL) diff --git a/src/fdd.h b/src/fdd.h index 6a28743f4..3caf5250f 100644 --- a/src/fdd.h +++ b/src/fdd.h @@ -32,6 +32,8 @@ void fdd_set_head(int drive, int head); int fdd_get_head(int drive); void fdd_set_turbo(int drive, int turbo); int fdd_get_turbo(int drive); +void fdd_set_check_bpb(int drive, int check_bpb); +int fdd_get_check_bpb(int drive); void fdd_set_type(int drive, int type); int fdd_get_type(int drive);