С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
С CPC и CPSW есть тонкие моменты. Они изменяются только когда в PSW сброшен бит 7 или 8. Это можно посмотреть в исходниках UKNCBTL.
При этом CPSW меняется только при изменении младшего байта PSW. Целиком PSW меняется только в таких случаях -прерывания режима HALT (двойное зависание, сигнал/команда HALT, прерывание ошибки шины в HALT-режиме, включение питания, команда FIS, ошибка получения адреса вектора прерывания), команды STEP и RUN, команды RTI и RTT при возврате в адрес больший 0160000. В остальных случаях изменяется только младший байт.Код:void SetPSW(WORD word){ m_psw = word & 0777; if ((m_psw & 0600) != 0600) m_savepsw = m_psw; } void SetLPSW(BYTE byte) { m_psw = (m_psw & 0xFF00) | (WORD)byte; if ((m_psw & 0600) != 0600) m_savepsw = m_psw; } void SetReg(int regno, WORD word) { m_R[regno] = word; if ((regno == 7) && ((m_psw & 0600)!=0600)) m_savepc = word; } void SetLReg(int regno, BYTE byte) { m_R[regno] = (m_R[regno] & 0xFF00) | (WORD)byte; if ((regno == 7) && ((m_psw & 0600)!=0600)) m_savepc = m_R[7]; } void SetPC(WORD word) { m_R[7] = word; if ((m_psw & 0600) != 0600) m_savepc = word; }
Есть еще один тонкий момент. В эмуляторе UKNCBTL также не шел эмулятор FIS, пока в команде не была вставлена небольшая затычка (отмечена красным):
А иначе в эмуляторе FIS происходило прерывание, но т.к. в стек в 1801ВМ2 кладутся CPC и CPSW, то соответственно без этого клался в стек адрес за командой FIS, а надо адрес за MTPS.Код:void CProcessor::ExecuteMTPS () // MTPS - move to PS{ WORD ea; BYTE dst; if(m_methdest) { ea = GetByteAddr(m_methdest,m_regdest); if (m_RPLYrq) return; dst = GetByte(ea); if (m_RPLYrq) return; } else dst = GetLReg(m_regdest); SetLPSW((GetLPSW() & 0x10) | (dst & 0xEF)); SetPC(GetPC()); m_internalTick=MTPS_TIMING[m_methdest]; }
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)