Цитата Сообщение от Vamos Посмотреть сообщение
опять облом с переполнением
Вот код, эмулирующий работу по кабелю с квитированием и полностью исключающий переполнения:

Код:
#include <deque>
std::deque<BYTE> CA_OverrunBuf;

BOOL CFirstMemoryController::NetworkInput(BYTE inputByte)
{
    if (m_Port176560 & 0200)  // Ready?
    {
        if( bEmulate_CA_Overrun )
        {
            m_Port176560 |= 010000;  // Set Overflow flag
        }
        else
        {
            CA_OverrunBuf.push_back( inputByte ); // Store byte..
        }
    }
    else
    {
        m_Port176562 = (WORD)inputByte;
        m_Port176560 |= 0200;  // Set Ready flag
        if (m_Port176560 & 0100)  // Interrupt?
            return TRUE;
    }
    return FALSE;
}

WORD CFirstMemoryController::GetPortWord(WORD address)
{
    switch (address) {
        case 0176562:  // СА: Регистр данных приемника
        case 0176563:  // нижние 8 бит доступны по чтению
            m_Port176560 &= ~010200;  // Reset bit 12 and bit 7
            if( CA_OverrunBuf.size() )
            {
                WORD uPrev = m_Port176562; 
                m_Port176562 = (WORD)CA_OverrunBuf.front();
                CA_OverrunBuf.pop_front();
                m_Port176560 |= 0200;  // Set Ready flag
                if( m_Port176560 & 0100 )
                    m_pCPU->InterruptVIRQ(9, 0360);
                return (uPrev + m_NetStation);
            }
            return (m_Port176562 + m_NetStation);
    }
}

Кстати - при переполнении в регистре данных остаётся старый байт, а не появляется новый.