/* * VARCem Virtual ARchaeological Computer EMulator. * An emulator of (mostly) x86-based PC systems and devices, * using the ISA,EISA,VLB,MCA and PCI system buses, roughly * spanning the era between 1981 and 1995. * * This file is part of the VARCem Project. * * Implementation of the Settings dialog. * * Version: @(#)win_settings_periph.h 1.0.13 2018/09/29 * * Authors: Fred N. van Kempen, * Miran Grca, * * Copyright 2017,2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the: * * Free Software Foundation, Inc. * 59 Temple Place - Suite 330 * Boston, MA 02111-1307 * USA. */ /************************************************************************ * * * (Other) Peripherals Dialog * * * ************************************************************************/ static int scsi_to_list[20], list_to_scsi[20]; static const char *hdc_names[16]; /* Populate the HDC combo. */ static void recalc_scsi_list(HWND hdlg) { WCHAR temp[128]; char tempA[128]; const char *stransi; const device_t *dev; HWND h; int c, d; h = GetDlgItem(hdlg, IDC_COMBO_SCSI); SendMessage(h, CB_RESETCONTENT, 0, 0); c = d = 0; while (1) { stransi = scsi_card_get_internal_name(c); if (stransi == NULL) break; dev = scsi_card_getdevice(c); if (!scsi_card_available(c) || !device_is_valid(dev, machines[temp_machine].flags)) { c++; continue; } if (c == 0) { SendMessage(h, CB_ADDSTRING, 0, win_string(IDS_NONE)); } else { stransi = scsi_card_getname(c); sprintf(tempA, "[%s] %s", device_get_bus_name(dev), stransi); mbstowcs(temp, tempA, sizeof_w(temp)); SendMessage(h, CB_ADDSTRING, 0, (LPARAM)temp); } scsi_to_list[c] = d; list_to_scsi[d++] = c++; } SendMessage(h, CB_SETCURSEL, scsi_to_list[temp_scsi_card], 0); EnableWindow(h, d ? TRUE : FALSE); } /* Populate the HDC combo. */ static void recalc_hdc_list(HWND hdlg) { WCHAR temp[128]; char tempA[128]; char tempB[128]; const char *stransi; const device_t *dev; HWND h; int c, d; h = GetDlgItem(hdlg, IDC_COMBO_HDC); SendMessage(h, CB_RESETCONTENT, 0, 0); c = d = 0; while (1) { stransi = hdc_get_internal_name(c); if (stransi == NULL) break; dev = hdc_get_device(c); if (!hdc_available(c) || !device_is_valid(dev, machines[temp_machine].flags)) { c++; continue; } hdc_names[d] = stransi; if (c == 0) { SendMessage(h, CB_ADDSTRING, 0, win_string(IDS_NONE)); } else if (c == 1) { if (! (machines[temp_machine].flags&MACHINE_HDC)) { /* Skip "Internal" if machine doesn't have one. */ c++; continue; } SendMessage(h, CB_ADDSTRING, 0, win_string(IDS_INTERNAL)); } else { wcstombs(tempB, hdd_bus_to_ids((dev->local >> 8) & 255), sizeof(tempB)); stransi = hdc_get_name(c); sprintf(tempA, "[%s] %s (%s)", device_get_bus_name(dev), stransi, tempB); mbstowcs(temp, tempA, sizeof_w(temp)); SendMessage(h, CB_ADDSTRING, 0, (LPARAM)temp); } c++; d++; } if (temp_hdc_type != -1 && temp_hdc_type < d) SendMessage(h, CB_SETCURSEL, temp_hdc_type, 0); else SendMessage(h, CB_SETCURSEL, 0, 0); EnableWindow(h, d ? TRUE : FALSE); } #ifdef __amd64__ static LRESULT CALLBACK #else static BOOL CALLBACK #endif peripherals_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { WCHAR temp[128]; const char *stransi; const device_t *dev; int c, d; HWND h; switch (message) { case WM_INITDIALOG: recalc_scsi_list(hdlg); h = GetDlgItem(hdlg, IDC_CONFIGURE_SCSI); if (scsi_card_has_config(temp_scsi_card)) EnableWindow(h, TRUE); else EnableWindow(h, FALSE); recalc_hdc_list(hdlg); h = GetDlgItem(hdlg, IDC_CONFIGURE_HDC); if (hdc_has_config(temp_hdc_type)) EnableWindow(h, TRUE); else EnableWindow(h, FALSE); if (machines[temp_machine].flags & MACHINE_AT) { h = GetDlgItem(hdlg, IDC_CHECK_IDE_TER); EnableWindow(h, TRUE); SendMessage(h, BM_SETCHECK, temp_ide_ter, 0); h = GetDlgItem(hdlg, IDC_CONFIGURE_IDE_TER); EnableWindow(h, TRUE); h = GetDlgItem(hdlg, IDC_CHECK_IDE_QUA); EnableWindow(h, TRUE); SendMessage(h, BM_SETCHECK, temp_ide_qua, 0); h = GetDlgItem(hdlg, IDC_CONFIGURE_IDE_QUA); EnableWindow(h, TRUE); } else { h = GetDlgItem(hdlg, IDC_CHECK_IDE_TER); EnableWindow(h, FALSE); h = GetDlgItem(hdlg, IDC_CONFIGURE_IDE_TER); EnableWindow(h, FALSE); h = GetDlgItem(hdlg, IDC_CHECK_IDE_QUA); EnableWindow(h, FALSE); h = GetDlgItem(hdlg, IDC_CONFIGURE_IDE_QUA); EnableWindow(h, FALSE); } h = GetDlgItem(hdlg, IDC_CHECK_BUGGER); SendMessage(h, BM_SETCHECK, temp_bugger, 0); /* Populate the ISA RTC card dropdown. */ h = GetDlgItem(hdlg, IDC_COMBO_ISARTC); for (d = 0; ; d++) { stransi = isartc_get_internal_name(d); if (stransi == NULL) break; if (d == 0) { /* Translate "None". */ SendMessage(h, CB_ADDSTRING, 0, win_string(IDS_NONE)); } else { stransi = isartc_get_name(d); mbstowcs(temp, stransi, sizeof_w(temp)); SendMessage(h, CB_ADDSTRING, 0, (LPARAM)temp); } } SendMessage(h, CB_SETCURSEL, temp_isartc, 0); h = GetDlgItem(hdlg, IDC_CONFIGURE_ISARTC); if (temp_isartc != 0) EnableWindow(h, TRUE); else EnableWindow(h, FALSE); /* Populate the ISA memory card dropdowns. */ for (c = 0; c < ISAMEM_MAX; c++) { h = GetDlgItem(hdlg, IDC_COMBO_ISAMEM_1 + c); for (d = 0; ; d++) { stransi = isamem_get_internal_name(d); if (stransi == NULL) break; if (d == 0) { /* Translate "None". */ SendMessage(h, CB_ADDSTRING, 0, win_string(IDS_NONE)); } else { stransi = isamem_get_name(d); mbstowcs(temp, stransi, sizeof_w(temp)); SendMessage(h, CB_ADDSTRING, 0, (LPARAM)temp); } } SendMessage(h, CB_SETCURSEL, temp_isamem[c], 0); h = GetDlgItem(hdlg, IDC_CONFIGURE_ISAMEM_1 + c); if (temp_isamem[c] != 0) EnableWindow(h, TRUE); else EnableWindow(h, FALSE); } return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_COMBO_SCSI: h = GetDlgItem(hdlg, IDC_COMBO_SCSI); temp_scsi_card = list_to_scsi[SendMessage(h, CB_GETCURSEL, 0, 0)]; h = GetDlgItem(hdlg, IDC_CONFIGURE_SCSI); if (scsi_card_has_config(temp_scsi_card)) EnableWindow(h, TRUE); else EnableWindow(h, FALSE); break; case IDC_CONFIGURE_SCSI: h = GetDlgItem(hdlg, IDC_COMBO_SCSI); temp_scsi_card = list_to_scsi[SendMessage(h, CB_GETCURSEL, 0, 0)]; temp_deviceconfig |= dlg_devconf(hdlg, scsi_card_getdevice(temp_scsi_card)); break; case IDC_COMBO_HDC: h = GetDlgItem(hdlg, IDC_COMBO_HDC); temp_hdc_type = hdc_get_from_internal_name(hdc_names[SendMessage(h, CB_GETCURSEL, 0, 0)]); h = GetDlgItem(hdlg, IDC_CONFIGURE_HDC); if (hdc_has_config(temp_hdc_type)) EnableWindow(h, TRUE); else EnableWindow(h, FALSE); break; case IDC_CONFIGURE_HDC: h = GetDlgItem(hdlg, IDC_COMBO_HDC); temp_hdc_type = hdc_get_from_internal_name(hdc_names[SendMessage(h, CB_GETCURSEL, 0, 0)]); temp_deviceconfig |= dlg_devconf(hdlg, hdc_get_device(temp_hdc_type)); break; case IDC_CHECK_IDE_TER: h = GetDlgItem(hdlg, IDC_CHECK_IDE_TER); temp_ide_ter = SendMessage(h, BM_GETCHECK, 0, 0); h = GetDlgItem(hdlg, IDC_CONFIGURE_IDE_TER); EnableWindow(h, temp_ide_ter ? TRUE : FALSE); break; case IDC_CONFIGURE_IDE_TER: temp_deviceconfig |= dlg_devconf(hdlg, &ide_ter_device); break; case IDC_CHECK_IDE_QUA: h = GetDlgItem(hdlg, IDC_CHECK_IDE_QUA); temp_ide_qua = SendMessage(h, BM_GETCHECK, 0, 0); h = GetDlgItem(hdlg, IDC_CONFIGURE_IDE_QUA); EnableWindow(h, temp_ide_qua ? TRUE : FALSE); break; case IDC_CONFIGURE_IDE_QUA: temp_deviceconfig |= dlg_devconf(hdlg, &ide_qua_device); break; case IDC_COMBO_ISARTC: h = GetDlgItem(hdlg, IDC_COMBO_ISARTC); temp_isartc = SendMessage(h, CB_GETCURSEL, 0, 0); h = GetDlgItem(hdlg, IDC_CONFIGURE_ISARTC); if (temp_isartc != 0) EnableWindow(h, TRUE); else EnableWindow(h, FALSE); break; case IDC_COMBO_ISAMEM_1: case IDC_COMBO_ISAMEM_2: case IDC_COMBO_ISAMEM_3: case IDC_COMBO_ISAMEM_4: c = LOWORD(wParam) - IDC_COMBO_ISAMEM_1; h = GetDlgItem(hdlg, LOWORD(wParam)); temp_isamem[c] = SendMessage(h, CB_GETCURSEL, 0, 0); h = GetDlgItem(hdlg, IDC_CONFIGURE_ISAMEM_1 + c); if (temp_isamem[c] != 0) EnableWindow(h, TRUE); else EnableWindow(h, FALSE); break; case IDC_CONFIGURE_ISARTC: dev = isartc_get_device(temp_isartc); if (dev != NULL) temp_deviceconfig |= dlg_devconf(hdlg, dev); break; case IDC_CONFIGURE_ISAMEM_1: case IDC_CONFIGURE_ISAMEM_2: case IDC_CONFIGURE_ISAMEM_3: case IDC_CONFIGURE_ISAMEM_4: c = LOWORD(wParam) - IDC_CONFIGURE_ISAMEM_1; dev = isamem_get_device(c); if (dev != NULL) temp_deviceconfig |= dlg_devconf(hdlg, dev); else ui_msgbox(MBX_INFO, (wchar_t *)IDS_ERR_SAVEIT); break; } return FALSE; case WM_SAVE_CFG: h = GetDlgItem(hdlg, IDC_COMBO_HDC); c = SendMessage(h, CB_GETCURSEL, 0, 0); if (hdc_names[c]) temp_hdc_type = hdc_get_from_internal_name(hdc_names[c]); else temp_hdc_type = 0; h = GetDlgItem(hdlg, IDC_COMBO_SCSI); temp_scsi_card = list_to_scsi[SendMessage(h, CB_GETCURSEL, 0, 0)]; h = GetDlgItem(hdlg, IDC_CHECK_BUGGER); temp_bugger = SendMessage(h, BM_GETCHECK, 0, 0); return FALSE; default: break; } return FALSE; }