Прогоню позже, пока рано -- в T11 нет понятия bus error, и чтобы его добавить корректно, придется немного перетряхнуть код.
Прогоню позже, пока рано -- в T11 нет понятия bus error, и чтобы его добавить корректно, придется немного перетряхнуть код.
Мне показалось удобным добавлять Trap_4 в код при помощи исключений :
Тогда бросать исключения можно в любом месте и на любом уровне вложенности вызовов подпрограмм, а обрабатывать - только на самом верхнем уровне.Код:if( !abRAM[addr] ) { wBadAddr = addr; nBadAccessType = 4; throw(0); }
Я так и собираюсь сделать. Похоже, для этого придется залезть и в ядро mame -- https://github.com/mamedev/mame/blob...mumem.cpp#L715
Конвертор в абсолютный формат bin2load (https://github.com/jguillaumes/retroutils via http://ancientbits.blogspot.ru/2012/...nes-pdp11.html) оказался весьма полезен -- конвертировал им загрузочный сектор виртуальных дисков HD:, стало чуть удобнее грузить тесты.
Код перетряхнул и результат довольно ужасен, но стал проходить тест памяти 791323.
Тест FIS 791403 проваливается схоже с VKAC, и результаты TSTVM2 намекают, где именно (команда DIV).
Попутно выяснил, что диск TSTSYS.DSK довольно странный -- rt11 5.3 считает его битым, и PUTR портит файлы при записи на него.
С любовью к вам, 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]; }
Заново переписываю обработку прерываний и все такое, результат 791403 временно стал похож на VKAC (проваливаются тесты на bus error внутри команд FIS), зато сломалось многое другое Буду думать.
Где-то на этом форуме упоминалась прошивка КЦГД с тестами -- есть у кого такая?
Заработала эмуляция КЦГД (см. соседнюю тему) с прошивкой 181 + попутно стал проходить тест скорости:
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)