]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Serial port status line and ring indicator options.
authorToni Wilen <twilen@winuae.net>
Mon, 8 May 2023 17:22:20 +0000 (20:22 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 8 May 2023 17:22:20 +0000 (20:22 +0300)
cfgfile.cpp
include/options.h
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/serial_win32.cpp
od-win32/win32gui.cpp

index 11ebde0c94783531aa5d618c2c37fdddbaddfc48..78f9610e7ab9537f5004baac91f3e78a70c2130b 100644 (file)
@@ -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;
index 033caf1ed283b13712742bafeae1c507837ef938..c0f3b215981ec70619860e60afac185efb60ba36 100644 (file)
@@ -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;
index 125d561e39b4a49da81082a9bb0f00b57536f03a..50488b0393e4c982b8b82c6718482ffa0502a561 100644 (file)
 #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
 #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
index 7427a1a66724eae1667448c31b7b1779645c77c6..e2962e0fb08e5d7393fe6bd7f7d70bd66747bec4 100644 (file)
@@ -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
index bbb0e18eef75fafc1b353033914c4bb93c877f2f..f70fee7df25db8f1c3749a368d68ddfb7d8305cb 100644 (file)
@@ -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
index 76a6879fb663fc74b16e91e5c1ef427b53121ee0..8a400b338dbb10dbae3119f8bde9dfd8c9b4fb29 100644 (file)
@@ -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) {