From: Toni Wilen Date: Mon, 8 May 2023 17:22:20 +0000 (+0300) Subject: Serial port status line and ring indicator options. X-Git-Tag: 5.0.0~51 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=2e62c51cd2e5f6821c4ae6685b69e4a3668f1763;p=francis%2Fwinuae.git Serial port status line and ring indicator options. --- diff --git a/cfgfile.cpp b/cfgfile.cpp index 11ebde0c..78f9610e 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -2151,7 +2151,9 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write (f, _T("cd_speed"), _T("%d"), p->cd_speed); cfgfile_write_bool (f, _T("parallel_on_demand"), p->parallel_demand); cfgfile_write_bool (f, _T("serial_on_demand"), p->serial_demand); - cfgfile_write_bool (f, _T("serial_hardware_ctsrts"), p->serial_hwctsrts); + cfgfile_write_bool(f, _T("serial_hardware_ctsrts"), p->serial_hwctsrts); + cfgfile_write_bool(f, _T("serial_status"), p->serial_rtsctsdtrdtecd); + cfgfile_dwrite_bool(f, _T("serial_ri"), p->serial_ri); cfgfile_write_bool (f, _T("serial_direct"), p->serial_direct); cfgfile_dwrite (f, _T("serial_stopbits"), _T("%d"), p->serial_stopbits); cfgfile_dwrite_strarr(f, _T("serial_translate"), serialcrlf, p->serial_crlf); @@ -5903,6 +5905,8 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH || cfgfile_yesno(option, value, _T("parallel_postscript_detection"), &p->parallel_postscript_detection) || cfgfile_yesno(option, value, _T("serial_on_demand"), &p->serial_demand) || cfgfile_yesno(option, value, _T("serial_hardware_ctsrts"), &p->serial_hwctsrts) + || cfgfile_yesno(option, value, _T("serial_status"), &p->serial_rtsctsdtrdtecd) + || cfgfile_yesno(option, value, _T("serial_ri"), &p->serial_ri) || cfgfile_yesno(option, value, _T("serial_direct"), &p->serial_direct) || cfgfile_yesno(option, value, _T("fpu_strict"), &p->fpu_strict) || cfgfile_yesno(option, value, _T("comp_nf"), &p->compnf) @@ -8341,6 +8345,8 @@ void default_prefs (struct uae_prefs *p, bool reset, int type) p->use_serial = 0; p->serial_demand = 0; p->serial_hwctsrts = 1; + p->serial_ri = false; + p->serial_rtsctsdtrdtecd = true; p->serial_stopbits = 0; p->parallel_demand = 0; p->parallel_matrix_emulation = 0; diff --git a/include/options.h b/include/options.h index 033caf1e..c0f3b215 100644 --- a/include/options.h +++ b/include/options.h @@ -513,6 +513,8 @@ struct uae_prefs { bool use_serial; bool serial_demand; bool serial_hwctsrts; + bool serial_rtsctsdtrdtecd; + bool serial_ri; bool serial_direct; int serial_stopbits; int serial_crlf; diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index 125d561e..50488b03 100644 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -1331,6 +1331,8 @@ #define IDC_KEYBOARD_SWAPHACK 1865 #define IDC_SCSIROM24BITDMA 1866 #define IDC_CUSTOMDATAPATH 1866 +#define IDC_SER_RTSCTSDTRDTECD 1867 +#define IDC_SER_RI 1868 #define ID__FLOPPYDRIVES 40004 #define ID_FLOPPYDRIVES_DF0 40005 #define ID_ST_CONFIGURATION 40010 @@ -1382,7 +1384,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 407 #define _APS_NEXT_COMMAND_VALUE 40050 -#define _APS_NEXT_CONTROL_VALUE 1867 +#define _APS_NEXT_CONTROL_VALUE 1869 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 7427a1a6..e2962e0f 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -519,21 +519,24 @@ BEGIN RTEXT "Sampler:",IDC_STATIC,6,102,57,15,SS_CENTERIMAGE COMBOBOX IDC_SAMPLERLIST,67,103,317,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Stereo sampler",IDC_SAMPLER_STEREO,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,68,122,149,12 - GROUPBOX "Serial Port",IDC_STATIC,1,145,393,51 + GROUPBOX "Serial Port",IDC_STATIC,1,145,393,66 COMBOBOX IDC_SERIAL,67,158,317,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Shared",IDC_SER_SHARED,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,32,179,66,12 - CONTROL "RTS/CTS",IDC_SER_CTSRTS,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,107,179,66,12 + CONTROL "Shared",IDC_SER_SHARED,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,25,179,66,12 + CONTROL "Host RTS/CTS",IDC_SER_CTSRTS,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,107,179,66,12 CONTROL "Direct []Use when emulating serial-link games on two PCs running WinUAE",IDC_SER_DIRECT, "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,182,179,83,12 - CONTROL "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,274,179,108,12 - GROUPBOX "MIDI",IDC_STATIC,1,199,393,54,BS_LEFT - RTEXT "Out:",IDC_MIDI,22,210,32,15,SS_CENTERIMAGE - COMBOBOX IDC_MIDIOUTLIST,58,212,145,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "In:",IDC_MIDI2,204,209,31,15,SS_CENTERIMAGE - COMBOBOX IDC_MIDIINLIST,239,211,145,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Route MIDI In to MIDI Out",IDC_MIDIROUTER,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,41,235,170,12 - GROUPBOX "Protection Dongle",IDC_STATIC,1,260,393,41,BS_LEFT - COMBOBOX IDC_DONGLELIST,58,278,232,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,292,179,94,12 + GROUPBOX "MIDI",IDC_STATIC,1,213,393,54,BS_LEFT + RTEXT "Out:",IDC_MIDI,22,224,32,15,SS_CENTERIMAGE + COMBOBOX IDC_MIDIOUTLIST,58,226,145,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "In:",IDC_MIDI2,204,224,31,15,SS_CENTERIMAGE + COMBOBOX IDC_MIDIINLIST,239,225,145,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Route MIDI In to MIDI Out",IDC_MIDIROUTER,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,41,249,170,12 + GROUPBOX "Protection Dongle",IDC_STATIC,1,274,393,41,BS_LEFT + COMBOBOX IDC_DONGLELIST,58,292,232,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Serial status (RTS/CTS/DTR/DTE/CD)",IDC_SER_RTSCTSDTRDTECD, + "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,25,192,162,12 + CONTROL "Serial status: Ring Indicator",IDC_SER_RI,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,182,192,202,12 END IDD_GAMEPORTS DIALOGEX 0, 0, 396, 316 diff --git a/od-win32/serial_win32.cpp b/od-win32/serial_win32.cpp index bbb0e18e..f70fee7d 100644 --- a/od-win32/serial_win32.cpp +++ b/od-win32/serial_win32.cpp @@ -1090,66 +1090,73 @@ uae_u8 serial_readstatus(uae_u8 v, uae_u8 dir) return v; } - if (!(status & TIOCM_CAR)) { - if (!(serbits & 0x20)) { - serbits |= 0x20; + if (currprefs.serial_rtsctsdtrdtecd) { + if (!(status & TIOCM_CAR)) { + if (!(serbits & 0x20)) { + serbits |= 0x20; #if SERIALHSDEBUG > 0 - write_log ( "SERIAL: CD off\n" ); + write_log ( "SERIAL: CD off\n" ); #endif - } - } else { - if (serbits & 0x20) { - serbits &= ~0x20; + } + } else { + if (serbits & 0x20) { + serbits &= ~0x20; #if SERIALHSDEBUG > 0 - write_log ( "SERIAL: CD on\n" ); + write_log ( "SERIAL: CD on\n" ); #endif + } } - } - if (!(status & TIOCM_DSR)) { - if (!(serbits & 0x08)) { - serbits |= 0x08; + if (!(status & TIOCM_DSR)) { + if (!(serbits & 0x08)) { + serbits |= 0x08; #if SERIALHSDEBUG > 0 - write_log ( "SERIAL: DSR off\n" ); + write_log ( "SERIAL: DSR off\n" ); #endif - } - } else { - if (serbits & 0x08) { - serbits &= ~0x08; + } + } else { + if (serbits & 0x08) { + serbits &= ~0x08; #if SERIALHSDEBUG > 0 - write_log ( "SERIAL: DSR on\n" ); + write_log ( "SERIAL: DSR on\n" ); #endif + } } - } - if (!(status & TIOCM_CTS)) { - if (!(serbits & 0x10)) { - serbits |= 0x10; + if (!(status & TIOCM_CTS)) { + if (!(serbits & 0x10)) { + serbits |= 0x10; #if SERIALHSDEBUG > 0 - write_log ( "SERIAL: CTS off\n" ); + write_log ( "SERIAL: CTS off\n" ); #endif - } - } else { - if (serbits & 0x10) { - serbits &= ~0x10; + } + } else { + if (serbits & 0x10) { + serbits &= ~0x10; #if SERIALHSDEBUG > 0 - write_log ( "SERIAL: CTS on\n" ); + write_log ( "SERIAL: CTS on\n" ); #endif + } } } // SEL == RI - if (!isprinter()) { + if (isprinter()) { + serbits &= ~0x04; + serbits |= v & 0x04; + if (currprefs.serial_ri && (status & TIOCM_RI)) { + serbits &= ~0x04; + } + } else if (currprefs.serial_ri) { serbits |= 0x04; + if (status & TIOCM_RI) { + serbits &= ~0x04; + } } else { serbits &= ~0x04; serbits |= v & 0x04; } - if (status & TIOCM_RI) { - serbits &= ~0x04; - } - serbits &= 0x04 | 0x08 | 0x10 | 0x20; oldserbits &= ~(0x04 | 0x08 | 0x10 | 0x20); oldserbits |= serbits; @@ -1168,13 +1175,13 @@ uae_u8 serial_writestatus (uae_u8 newstate, uae_u8 dir) #ifdef SERIAL_PORT if (currprefs.use_serial) { - if (((oldserbits ^ newstate) & 0x80) && (dir & 0x80)) { + if (currprefs.serial_rtsctsdtrdtecd && ((oldserbits ^ newstate) & 0x80) && (dir & 0x80)) { if (newstate & 0x80) serial_dtr_off(); else serial_dtr_on(); } - if (!currprefs.serial_hwctsrts && (dir & 0x40)) { + if (!currprefs.serial_hwctsrts && currprefs.serial_rtsctsdtrdtecd && (dir & 0x40)) { if ((oldserbits ^ newstate) & 0x40) { if (newstate & 0x40) { setserstat(TIOCM_RTS, 0); @@ -1224,14 +1231,14 @@ uae_u8 serial_writestatus (uae_u8 newstate, uae_u8 dir) if (sermap_data && sermap_enabled) { uae_u32 flags = 0x80000000; bool changed = false; - if (((oldserbits ^ newstate) & 0x80) && (dir & 0x80)) { + if (currprefs.serial_rtsctsdtrdtecd && ((oldserbits ^ newstate) & 0x80) && (dir & 0x80)) { if (!(newstate & 0x80)) { flags |= 1; // DSR flags |= 2; // CD } changed = true; } - if (!currprefs.serial_hwctsrts && (dir & 0x40)) { + if (!currprefs.serial_hwctsrts && currprefs.serial_rtsctsdtrdtecd && (dir & 0x40)) { if ((oldserbits ^ newstate) & 0x40) { if (!(newstate & 0x40)) { flags |= 4; // RTS diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 76a6879f..8a400b33 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -17291,19 +17291,23 @@ static void enable_for_portsdlg (HWND hDlg) ew (hDlg, IDC_SWAP, TRUE); #if !defined (SERIAL_PORT) - ew (hDlg, IDC_MIDIOUTLIST, FALSE); - ew (hDlg, IDC_MIDIINLIST, FALSE); - ew (hDlg, IDC_SHARED, FALSE); - ew (hDlg, IDC_SER_CTSRTS, FALSE); - ew (hDlg, IDC_SERIAL_DIRECT, FALSE); - ew (hDlg, IDC_SERIAL, FALSE); - ew (hDlg, IDC_UAESERIAL, FALSE); + ew(hDlg, IDC_MIDIOUTLIST, FALSE); + ew(hDlg, IDC_MIDIINLIST, FALSE); + ew(hDlg, IDC_SHARED, FALSE); + ew(hDlg, IDC_SER_CTSRTS, FALSE); + ew(hDlg, IDC_SER_RTSCTSDTRDTECD, FALSE); + ew(hDlg, IDC_SER_RI, FALSE); + ew(hDlg, IDC_SERIAL_DIRECT, FALSE); + ew(hDlg, IDC_SERIAL, FALSE); + ew(hDlg, IDC_UAESERIAL, FALSE); #else v = workprefs.use_serial ? TRUE : FALSE; - ew (hDlg, IDC_SER_SHARED, v); - ew (hDlg, IDC_SER_CTSRTS, v); - ew (hDlg, IDC_SER_DIRECT, v); - ew (hDlg, IDC_UAESERIAL, full_property_sheet); + ew(hDlg, IDC_SER_SHARED, v); + ew(hDlg, IDC_SER_CTSRTS, v); + ew(hDlg, IDC_SER_RTSCTSDTRDTECD, v); + ew(hDlg, IDC_SER_RI, v); + ew(hDlg, IDC_SER_DIRECT, v); + ew(hDlg, IDC_UAESERIAL, full_property_sheet); #endif isprinter = true; issampler = true; @@ -17604,13 +17608,19 @@ static void values_from_portsdlg (HWND hDlg) workprefs.sername[0] = 0; } workprefs.serial_demand = 0; - if (ischecked (hDlg, IDC_SER_SHARED)) + if (ischecked(hDlg, IDC_SER_SHARED)) workprefs.serial_demand = 1; workprefs.serial_hwctsrts = 0; - if (ischecked (hDlg, IDC_SER_CTSRTS)) + if (ischecked(hDlg, IDC_SER_CTSRTS)) workprefs.serial_hwctsrts = 1; + workprefs.serial_rtsctsdtrdtecd = 0; + if (ischecked(hDlg, IDC_SER_RTSCTSDTRDTECD)) + workprefs.serial_rtsctsdtrdtecd = 1; + workprefs.serial_ri = 0; + if (ischecked(hDlg, IDC_SER_RI)) + workprefs.serial_ri = 1; workprefs.serial_direct = 0; - if (ischecked (hDlg, IDC_SER_DIRECT)) + if (ischecked(hDlg, IDC_SER_DIRECT)) workprefs.serial_direct = 1; workprefs.uaeserial = 0; @@ -17682,10 +17692,12 @@ static void values_to_portsdlg (HWND hDlg) ew (hDlg, IDC_MIDIROUTER, workprefs.win32_midioutdev >= -1 && workprefs.win32_midiindev >= -1); CheckDlgButton (hDlg, IDC_MIDIROUTER, workprefs.win32_midirouter); - CheckDlgButton (hDlg, IDC_UAESERIAL, workprefs.uaeserial); - CheckDlgButton (hDlg, IDC_SER_SHARED, workprefs.serial_demand); - CheckDlgButton (hDlg, IDC_SER_CTSRTS, workprefs.serial_hwctsrts); - CheckDlgButton (hDlg, IDC_SER_DIRECT, workprefs.serial_direct); + CheckDlgButton(hDlg, IDC_UAESERIAL, workprefs.uaeserial); + CheckDlgButton(hDlg, IDC_SER_SHARED, workprefs.serial_demand); + CheckDlgButton(hDlg, IDC_SER_CTSRTS, workprefs.serial_hwctsrts); + CheckDlgButton(hDlg, IDC_SER_RTSCTSDTRDTECD, workprefs.serial_rtsctsdtrdtecd); + CheckDlgButton(hDlg, IDC_SER_RI, workprefs.serial_ri); + CheckDlgButton(hDlg, IDC_SER_DIRECT, workprefs.serial_direct); if(!workprefs.sername[0]) { xSendDlgItemMessage (hDlg, IDC_SERIAL, CB_SETCURSEL, 0, 0L); @@ -18134,7 +18146,8 @@ static INT_PTR CALLBACK IOPortsDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR if (isprinter ()) { closeprinter (); } - } else if (wParam == IDC_UAESERIAL || wParam == IDC_SER_SHARED || wParam == IDC_SER_DIRECT || wParam == IDC_SER_CTSRTS || wParam == IDC_PRINTERAUTOFLUSH || wParam == IDC_SAMPLER_STEREO || wParam == IDC_MIDIROUTER) { + } else if (wParam == IDC_UAESERIAL || wParam == IDC_SER_SHARED || wParam == IDC_SER_DIRECT || wParam == IDC_SER_CTSRTS || wParam == IDC_SER_RTSCTSDTRDTECD || wParam == IDC_SER_RI || + wParam == IDC_PRINTERAUTOFLUSH || wParam == IDC_SAMPLER_STEREO || wParam == IDC_MIDIROUTER) { values_from_portsdlg (hDlg); } else { if (HIWORD (wParam) == CBN_SELCHANGE) {