
Сообщение от
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);
}
}
Кстати - при переполнении в регистре данных остаётся старый байт, а не появляется новый.