MCPcopy Create free account
hub / github.com/AppleWin/AppleWin / CommStatus

Method CommStatus

source/SerialComms.cpp:818–889  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

816};
817
818BYTE __stdcall CSuperSerialCard::CommStatus(WORD, WORD, BYTE, BYTE, ULONG)
819{
820 if (!CheckComm())
821 return ST_DSR | ST_DCD | ST_TX_EMPTY;
822
823 DWORD modemStatus = m_kDefaultModemStatus;
824 if (m_hCommHandle != INVALID_HANDLE_VALUE)
825 {
826 modemStatus = m_dwModemStatus; // Take a copy of this volatile variable
827 if (!m_bCfgSupportDCD) // Default: DSR state is mirrored to DCD (GH#553)
828 {
829 modemStatus &= ~MS_RLSD_ON;
830 if (modemStatus & MS_DSR_ON)
831 modemStatus |= MS_RLSD_ON;
832 }
833 }
834 else if (m_hCommListenSocket != INVALID_SOCKET && m_hCommAcceptSocket != INVALID_SOCKET)
835 {
836 modemStatus = MS_RLSD_ON | MS_DSR_ON | MS_CTS_ON;
837 }
838
839 //
840
841 bool bComSerialBufferEmpty = true; // Assume true, so if using TCP then logic below works
842
843 if (m_hCommHandle != INVALID_HANDLE_VALUE)
844 {
845 EnterCriticalSection(&m_CriticalSection);
846 const UINT uSSCIdx = m_vuRxCurrBuffer ^ 1;
847 bComSerialBufferEmpty = m_qComSerialBuffer[uSSCIdx].empty();
848 }
849
850 BYTE IRQ = 0;
851 if (m_bTxIrqEnabled)
852 {
853 IRQ |= m_vbTxIrqPending ? ST_IRQ : 0;
854 m_vbTxIrqPending = false; // Ensure 2 reads of STATUS reg only return ST_IRQ for first read
855 }
856 if (m_bRxIrqEnabled)
857 {
858 IRQ |= m_vbRxIrqPending ? ST_IRQ : 0;
859 m_vbRxIrqPending = false; // Ensure 2 reads of STATUS reg only return ST_IRQ for first read
860 }
861
862 //
863
864 BYTE DSR = (modemStatus & MS_DSR_ON) ? 0x00 : ST_DSR; // DSR is active low (see SY6551 datasheet) (GH#386)
865 BYTE DCD = (modemStatus & MS_RLSD_ON) ? 0x00 : ST_DCD; // DCD is active low (see SY6551 datasheet) (GH#386)
866
867 //
868
869 BYTE TX_EMPTY = m_vbTxEmpty ? ST_TX_EMPTY : 0;
870 BYTE RX_FULL = (!bComSerialBufferEmpty || !m_qTcpSerialBuffer.empty()) ? ST_RX_FULL : 0;
871
872 //
873
874 BYTE uStatus =
875 IRQ

Callers 1

SSC_IOReadMethod · 0.80

Calls 1

CpuIrqDeassertFunction · 0.85

Tested by

no test coverage detected