diff --git a/src/config.c b/src/config.c index bb68ebdbf..958310707 100644 --- a/src/config.c +++ b/src/config.c @@ -8,7 +8,7 @@ * * Configuration file handler. * - * Version: @(#)config.c 1.0.39 2018/01/27 + * Version: @(#)config.c 1.0.40 2018/02/06 * * Authors: Sarah Walker, * Miran Grca, @@ -686,9 +686,21 @@ load_ports(void) p = (char *)config_get_string(cat, "lpt1_device", NULL); if (p != NULL) - strcpy(lpt1_device_name, p); + strcpy(lpt_device_names[0], p); else - strcpy(lpt1_device_name, "none"); + strcpy(lpt_device_names[0], "none"); + + p = (char *)config_get_string(cat, "lpt2_device", NULL); + if (p != NULL) + strcpy(lpt_device_names[1], p); + else + strcpy(lpt_device_names[1], "none"); + + p = (char *)config_get_string(cat, "lpt3_device", NULL); + if (p != NULL) + strcpy(lpt_device_names[2], p); + else + strcpy(lpt_device_names[2], "none"); } @@ -1779,10 +1791,20 @@ save_ports(void) else config_set_int(cat, "lpt_enabled", lpt_enabled); - if (!strcmp(lpt1_device_name, "none")) + if (!strcmp(lpt_device_names[0], "none")) config_delete_var(cat, "lpt1_device"); else - config_set_string(cat, "lpt1_device", lpt1_device_name); + config_set_string(cat, "lpt1_device", lpt_device_names[0]); + + if (!strcmp(lpt_device_names[1], "none")) + config_delete_var(cat, "lpt2_device"); + else + config_set_string(cat, "lpt2_device", lpt_device_names[1]); + + if (!strcmp(lpt_device_names[2], "none")) + config_delete_var(cat, "lpt3_device"); + else + config_set_string(cat, "lpt3_device", lpt_device_names[2]); delete_section_if_empty(cat); } diff --git a/src/lpt.c b/src/lpt.c index 93c84e89c..cfa781102 100644 --- a/src/lpt.c +++ b/src/lpt.c @@ -12,7 +12,7 @@ #include "sound/snd_lpt_dss.h" -char lpt1_device_name[16]; +char lpt_device_names[3][16]; static struct @@ -42,118 +42,102 @@ char *lpt_device_get_internal_name(int id) return lpt_devices[id].internal_name; } -static lpt_device_t *lpt1_device; -static void *lpt1_device_p; +static lpt_device_t *lpt_device_ts[3]; +static void *lpt_device_ps[3]; -void lpt1_device_init() +void lpt_devices_init() { + int i = 0; int c = 0; - while (strcmp(lpt_devices[c].internal_name, lpt1_device_name) && strlen(lpt_devices[c].internal_name) != 0) - c++; + for (i = 0; i < 3; i++) { + while (strcmp(lpt_devices[c].internal_name, lpt_device_names[i]) && strlen(lpt_devices[c].internal_name) != 0) + c++; - if (strlen(lpt_devices[c].internal_name) == 0) - lpt1_device = NULL; - else + if (strlen(lpt_devices[c].internal_name) == 0) + lpt_device_ts[i] = NULL; + else + { + lpt_device_ts[i] = lpt_devices[c].device; + if (lpt_device_ts[i]) + lpt_device_ps[i] = lpt_device_ts[i]->init(); + } + } +} + +void lpt_devices_close() +{ + int i = 0; + + for (i = 0; i < 3; i++) { + if (lpt_device_ts[i]) + lpt_device_ts[i]->close(lpt_device_ps[i]); + lpt_device_ts[i] = NULL; + } +} + +static uint8_t lpt_dats[3], lpt_ctrls[3]; + +void lpt_write(int i, uint16_t port, uint8_t val, void *priv) +{ + switch (port & 3) { - lpt1_device = lpt_devices[c].device; - if (lpt1_device) - lpt1_device_p = lpt1_device->init(); + case 0: + if (lpt_device_ts[i]) + lpt_device_ts[i]->write_data(val, lpt_device_ps[i]); + lpt_dats[i] = val; + break; + case 2: + if (lpt_device_ts[i]) + lpt_device_ts[i]->write_ctrl(val, lpt_device_ps[i]); + lpt_ctrls[i] = val; + break; } } - -void lpt1_device_close() +uint8_t lpt_read(int i, uint16_t port, void *priv) { - if (lpt1_device) - lpt1_device->close(lpt1_device_p); - lpt1_device = NULL; + switch (port & 3) + { + case 0: + return lpt_dats[i]; + case 1: + if (lpt_device_ts[i]) + return lpt_device_ts[i]->read_status(lpt_device_ps[i]); + return 0; + case 2: + return lpt_ctrls[i]; + } + return 0xff; } -static uint8_t lpt1_dat, lpt2_dat, lpt3_dat; -static uint8_t lpt1_ctrl, lpt2_ctrl, lpt3_ctrl; - void lpt1_write(uint16_t port, uint8_t val, void *priv) { - switch (port & 3) - { - case 0: - if (lpt1_device) - lpt1_device->write_data(val, lpt1_device_p); - lpt1_dat = val; - break; - case 2: - if (lpt1_device) - lpt1_device->write_ctrl(val, lpt1_device_p); - lpt1_ctrl = val; - break; - } + lpt_write(0, port, val, priv); } + uint8_t lpt1_read(uint16_t port, void *priv) { - switch (port & 3) - { - case 0: - return lpt1_dat; - case 1: - if (lpt1_device) - return lpt1_device->read_status(lpt1_device_p); - return 0; - case 2: - return lpt1_ctrl; - } - return 0xff; + return lpt_read(0, port, priv); } void lpt2_write(uint16_t port, uint8_t val, void *priv) { - switch (port & 3) - { - case 0: - lpt2_dat = val; - break; - case 2: - lpt2_ctrl = val; - break; - } + lpt_write(1, port, val, priv); } + uint8_t lpt2_read(uint16_t port, void *priv) { - switch (port & 3) - { - case 0: - return lpt2_dat; - case 1: - return 0; - case 2: - return lpt2_ctrl; - } - return 0xff; + return lpt_read(1, port, priv); } void lpt3_write(uint16_t port, uint8_t val, void *priv) { - switch (port & 3) - { - case 0: - lpt3_dat = val; - break; - case 2: - lpt3_ctrl = val; - break; - } + lpt_write(2, port, val, priv); } + uint8_t lpt3_read(uint16_t port, void *priv) { - switch (port & 3) - { - case 0: - return lpt3_dat; - case 1: - return 0; - case 2: - return lpt3_ctrl; - } - return 0xff; + return lpt_read(2, port, priv); } uint16_t lpt_addr[3] = { 0x378, 0x278, 0x3bc }; diff --git a/src/lpt.h b/src/lpt.h index c5e59b962..7db61930b 100644 --- a/src/lpt.h +++ b/src/lpt.h @@ -7,13 +7,13 @@ extern void lpt2_remove_ams(); extern void lpt3_init(uint16_t port); extern void lpt3_remove(); -void lpt1_device_init(); -void lpt1_device_close(); +void lpt_devices_init(); +void lpt_devices_close(); char *lpt_device_get_name(int id); char *lpt_device_get_internal_name(int id); -extern char lpt1_device_name[16]; +extern char lpt_device_names[3][16]; typedef struct { diff --git a/src/pc.c b/src/pc.c index 0ac95cd4f..a842ed0cf 100644 --- a/src/pc.c +++ b/src/pc.c @@ -8,7 +8,7 @@ * * Main emulator module where most things are controlled. * - * Version: @(#)pc.c 1.0.56 2018/01/29 + * Version: @(#)pc.c 1.0.57 2018/02/06 * * Authors: Sarah Walker, * Miran Grca, @@ -751,6 +751,8 @@ pc_reset_hard_close(void) mouse_close(); + lpt_devices_close(); + device_close_all(); midi_close(); @@ -810,7 +812,7 @@ pc_reset_hard_init(void) /* Reset some basic devices. */ speaker_init(); serial_reset(); - lpt1_device_init(); + lpt_devices_init(); /* Reset keyboard and/or mouse. */ // FIXME: do we really have to reset the *AT* keyboard?? --FvK @@ -944,6 +946,8 @@ pc_close(thread_t *ptr) plat_mouse_capture(0); + lpt_devices_close(); + for (i=0; i * Fred N. van Kempen, @@ -48,7 +48,8 @@ extern void ui_check_menu_item(int id, int checked); #define SB_RDISK 0x30 #define SB_HDD 0x50 #define SB_NETWORK 0x60 -#define SB_TEXT 0x70 +#define SB_SOUND 0x70 +#define SB_TEXT 0x80 extern wchar_t *ui_window_title(wchar_t *s); extern void ui_status_update(void); diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 6aa842013..25409c3de 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -8,7 +8,7 @@ * * Application resource script for Windows. * - * Version: @(#)86Box.rc 1.0.27 2018/01/27 + * Version: @(#)86Box.rc 1.0.28 2018/02/06 * * Authors: Miran Grca, * Fred N. van Kempen, @@ -119,8 +119,6 @@ BEGIN MENUITEM SEPARATOR MENUITEM "S&tatus", IDM_STATUS MENUITEM "Take s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT - MENUITEM SEPARATOR - MENUITEM "S&ound gain...", IDM_SND_GAIN END #if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) POPUP "&Logging" @@ -415,7 +413,7 @@ BEGIN PUSHBUTTON "Configure",IDC_CONFIGURE_NET,214,43,46,12 END -DLG_CFG_PORTS DIALOG DISCARDABLE 97, 0, 267, 61 +DLG_CFG_PORTS DIALOG DISCARDABLE 97, 0, 267, 99 STYLE DS_CONTROL | WS_CHILD FONT 9, "Segoe UI" BEGIN @@ -423,13 +421,21 @@ BEGIN COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "LPT2 Device:",IDT_1717,7,27,61,10 + COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "LPT3 Device:",IDT_1718,7,46,61,10 + COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + CONTROL "Serial port 1",IDC_CHECK_SERIAL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 CONTROL "Serial port 2",IDC_CHECK_SERIAL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,26,94,10 + BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 CONTROL "Parallel port",IDC_CHECK_PARALLEL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,44,94,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 END DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 97, 0, 267, 97 diff --git a/src/win/resource.h b/src/win/resource.h index 3a0743e56..6b49ab605 100644 --- a/src/win/resource.h +++ b/src/win/resource.h @@ -8,7 +8,7 @@ * * Windows resource defines. * - * Version: @(#)resource.h 1.0.19 2018/01/26 + * Version: @(#)resource.h 1.0.19 2018/02/06 * * Authors: Sarah Walker, * Miran Grca, @@ -148,9 +148,11 @@ #define IDC_COMBO_NET 1092 #define IDC_COMBO_LPT1 1110 /* ports config */ -#define IDC_CHECK_SERIAL1 1111 -#define IDC_CHECK_SERIAL2 1112 -#define IDC_CHECK_PARALLEL 1113 +#define IDC_COMBO_LPT2 1111 +#define IDC_COMBO_LPT3 1112 +#define IDC_CHECK_SERIAL1 1113 +#define IDC_CHECK_SERIAL2 1114 +#define IDC_CHECK_PARALLEL 1115 #define IDC_OTHER_PERIPH 1120 /* other periph config */ #define IDC_COMBO_SCSI 1121 @@ -237,7 +239,6 @@ #define IDM_CONFIG_LOAD 40021 #define IDM_CONFIG_SAVE 40022 #define IDM_STATUS 40030 -#define IDM_SND_GAIN 40040 #define IDM_VID_RESIZE 40050 #define IDM_VID_REMEMBER 40051 #define IDM_VID_DDRAW 40060 diff --git a/src/win/win_settings.c b/src/win/win_settings.c index f71ce9a56..e536206eb 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -8,7 +8,7 @@ * * Windows 86Box Settings dialog handler. * - * Version: @(#)win_settings.c 1.0.36 2018/01/27 + * Version: @(#)win_settings.c 1.0.37 2018/02/06 * * Author: Miran Grca, * @@ -77,7 +77,7 @@ static int temp_net_type, temp_net_card; static char temp_pcap_dev[520]; /* Ports category */ -static char temp_lpt1_device_name[16]; +static char temp_lpt_device_names[3][16]; static int temp_serial[2], temp_lpt; /* Other peripherals category */ @@ -177,7 +177,8 @@ static void win_settings_init(void) temp_net_card = network_card; /* Ports category */ - strncpy(temp_lpt1_device_name, lpt1_device_name, sizeof(temp_lpt1_device_name) - 1); + for (i = 0; i < 3; i++) + strncpy(temp_lpt_device_names[i], lpt_device_names[i], sizeof(temp_lpt_device_names[i]) - 1); temp_serial[0] = serial_enabled[0]; temp_serial[1] = serial_enabled[1]; temp_lpt = lpt_enabled; @@ -292,7 +293,8 @@ static int win_settings_changed(void) i = i || (network_card != temp_net_card); /* Ports category */ - i = i || strncmp(temp_lpt1_device_name, lpt1_device_name, sizeof(temp_lpt1_device_name) - 1); + for (i = 0; i < 3; i++) + i = i || strncmp(temp_lpt_device_names[i], lpt_device_names[i], sizeof(temp_lpt_device_names[i]) - 1); i = i || (temp_serial[0] != serial_enabled[0]); i = i || (temp_serial[1] != serial_enabled[1]); i = i || (temp_lpt != lpt_enabled); @@ -395,7 +397,8 @@ static void win_settings_save(void) network_card = temp_net_card; /* Ports category */ - strncpy(lpt1_device_name, temp_lpt1_device_name, sizeof(temp_lpt1_device_name) - 1); + for (i = 0; i < 3; i++) + strncpy(lpt_device_names[i], temp_lpt_device_names[i], sizeof(temp_lpt_device_names[i]) - 1); serial_enabled[0] = temp_serial[0]; serial_enabled[1] = temp_serial[1]; lpt_enabled = temp_lpt; @@ -1427,41 +1430,36 @@ win_settings_ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) int d = 0; char *s; LPTSTR lptsTemp; + int i; switch (message) { case WM_INITDIALOG: lptsTemp = (LPTSTR) malloc(512); - h = GetDlgItem(hdlg, IDC_COMBO_LPT1); - c = d = 0; - while (1) - { - s = lpt_device_get_name(c); + for (i = 0; i < 3; i++) { + h = GetDlgItem(hdlg, IDC_COMBO_LPT1 + i); + c = d = 0; + while (1) { + s = lpt_device_get_name(c); - if (!s) - { - break; - } + if (!s) + break; - if (c == 0) - { - SendMessage(h, CB_ADDSTRING, 0, (LPARAM) plat_get_string(IDS_2152)); - } - else - { - mbstowcs(lptsTemp, s, strlen(s) + 1); - SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp); - } + if (c == 0) { + SendMessage(h, CB_ADDSTRING, 0, (LPARAM) plat_get_string(IDS_2152)); + } else { + mbstowcs(lptsTemp, s, strlen(s) + 1); + SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp); + } - if (!strcmp(temp_lpt1_device_name, lpt_device_get_internal_name(c))) - { - d = c; - } + if (!strcmp(temp_lpt_device_names[i], lpt_device_get_internal_name(c))) + d = c; - c++; + c++; + } + SendMessage(h, CB_SETCURSEL, d, 0); } - SendMessage(h, CB_SETCURSEL, d, 0); h=GetDlgItem(hdlg, IDC_CHECK_SERIAL1); SendMessage(h, BM_SETCHECK, temp_serial[0], 0); @@ -1477,9 +1475,11 @@ win_settings_ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) return TRUE; case WM_SAVESETTINGS: - h = GetDlgItem(hdlg, IDC_COMBO_LPT1); - c = SendMessage(h, CB_GETCURSEL, 0, 0); - strcpy(temp_lpt1_device_name, lpt_device_get_internal_name(c)); + for (i = 0; i < 3; i++) { + h = GetDlgItem(hdlg, IDC_COMBO_LPT1 + i); + c = SendMessage(h, CB_GETCURSEL, 0, 0); + strcpy(temp_lpt_device_names[i], lpt_device_get_internal_name(c)); + } h = GetDlgItem(hdlg, IDC_CHECK_SERIAL1); temp_serial[0] = SendMessage(h, BM_GETCHECK, 0, 0); diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index 98b99a61a..3628a3642 100644 --- a/src/win/win_stbar.c +++ b/src/win/win_stbar.c @@ -8,7 +8,7 @@ * * Implement the application's Status Bar. * - * Version: @(#)win_stbar.c 1.0.12 2018/01/29 + * Version: @(#)win_stbar.c 1.0.13 2018/02/06 * * Authors: Miran Grca, * Fred N. van Kempen, @@ -465,6 +465,20 @@ StatusBarCreateNetworkTip(int part) } +static void +StatusBarCreateSoundTip(int part) +{ + WCHAR tempTip[512]; + + _swprintf(tempTip, plat_get_string(IDS_2068)); + + if (sbTips[part] != NULL) + free(sbTips[part]); + sbTips[part] = (WCHAR *)malloc((wcslen(tempTip) << 1) + 2); + wcscpy(sbTips[part], tempTip); +} + + /* API */ void ui_sb_update_tip(int meaning) @@ -506,6 +520,10 @@ ui_sb_update_tip(int meaning) StatusBarCreateNetworkTip(part); break; + case SB_SOUND: + StatusBarCreateSoundTip(part); + break; + default: break; } @@ -692,7 +710,7 @@ ui_sb_update_panes(void) if (do_net) { sb_parts++; } - sb_parts++; + sb_parts += 2; iStatusWidths = (int *)malloc(sb_parts * sizeof(int)); memset(iStatusWidths, 0, sb_parts * sizeof(int)); @@ -809,11 +827,16 @@ ui_sb_update_panes(void) sb_parts++; } + edge += SB_ICON_WIDTH; + iStatusWidths[sb_parts] = edge; + sb_part_meanings[sb_parts] = SB_SOUND; + sb_parts++; + if (sb_parts) iStatusWidths[sb_parts - 1] += (24 - SB_ICON_WIDTH); iStatusWidths[sb_parts] = -1; sb_part_meanings[sb_parts] = SB_TEXT; - sb_parts++; + sb_parts ++; SendMessage(hwndSBAR, SB_SETPARTS, (WPARAM)sb_parts, (LPARAM)iStatusWidths); @@ -874,6 +897,11 @@ ui_sb_update_panes(void) StatusBarCreateNetworkTip(i); break; + case SB_SOUND: /* Sound */ + sb_part_icons[i] = 259; + StatusBarCreateSoundTip(i); + break; + case SB_TEXT: /* Status text */ SendMessage(hwndSBAR, SB_SETTEXT, i | SBT_NOBORDERS, (LPARAM)L""); sb_part_icons[i] = -1; @@ -1189,6 +1217,17 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) StatusBarPopupMenu(hwnd, pt, (pt.x / SB_ICON_WIDTH)); break; + case WM_LBUTTONDBLCLK: + GetClientRect(hwnd, (LPRECT)& rc); + pt.x = GET_X_LPARAM(lParam); + pt.y = GET_Y_LPARAM(lParam); + item_id = (pt.x / SB_ICON_WIDTH); + if (PtInRect((LPRECT) &rc, pt) && (item_id < sb_parts)) { + if (sb_part_meanings[item_id] == SB_SOUND) + SoundGainDialogCreate(hwndMain); + } + break; + default: return(CallWindowProc((WNDPROC)OriginalProcedure, hwnd, message, wParam, lParam)); @@ -1221,6 +1260,8 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) hIcon[i] = LoadIconEx((PCTSTR) i); for (i = 224; i < 226; i++) hIcon[i] = LoadIconEx((PCTSTR) i); + for (i = 259; i < 260; i++) + hIcon[i] = LoadIconEx((PCTSTR) i); for (i = 384; i < 386; i++) hIcon[i] = LoadIconEx((PCTSTR) i); for (i = 400; i < 402; i++) diff --git a/src/win/win_ui.c b/src/win/win_ui.c index d025c273c..577960d3b 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -8,7 +8,7 @@ * * user Interface module for WinAPI on Windows. * - * Version: @(#)win_ui.c 1.0.15 2018/02/01 + * Version: @(#)win_ui.c 1.0.16 2018/02/06 * * Authors: Sarah Walker, * Miran Grca, @@ -311,10 +311,6 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) win_settings_open(hwnd); break; - case IDM_SND_GAIN: - SoundGainDialogCreate(hwnd); - break; - case IDM_ABOUT: AboutDialogCreate(hwnd); break;