к сожалению в отладчике этого эмулятора не отображаются значения портов и номера страниц, поэтому понять что происходит при нажатии алт+ф11 сложно
Вид для печати
Там глубже, там идет хитрая проверка (с #02FD в сервисной странице ПЗУ): пишется число в #0000, а потом читается из #C000, если не совпало - идет переход еще на какую-то логику. Подразумевается, что в этот момент в качестве теневого ОЗУ подключена 0-я страница, и она же впечатана в окно с #C000.
Я добился такого же поведения (грубо - MapWrite0000 = RamPages[ramPage0000]; безо всяких условий), но оно все равно виснет, хотя теперь выходит из обработчика NMI с верными регистрами и страницами.
тут проблема в том что при выполнении меню Restart между двумя точками pc=#02F8 и pc=#004e в унриале в порту 7ffd оказывается #17, а в ZXMAK #10. Вначале подумал блокировка не дает записать значение в #7FFD, проверил - в ZXMAK2 в этот промежуток вообще нет обращений к порту #7FFD...
Кстати если поставить брейкпоинт на #0000, после выполнения меню Restart вывалившись на точке останова прописать в CMR0 значение #17, вместо #10 (окно Memory Map), то в ZXMAK2 NMI работает нормально - возвращается без проблем, как и в унрилкворуме. Т.е. проблема с портом #7FFD.
Теперь нужно отловить, где между точками pc=#02F8 и pc=#004e происходит запись значения #17 в порт #7ffd
---------- Post added at 22:40 ---------- Previous post was at 22:25 ----------
не, тут все хитрее - в этот момент подключено обычное пзу, а в окно #C000 замаплена нулевая страница, но в унрилкворуме при записи в нулевую ячейку, запись происходит в 0-ю страницу, а в пзу значение остается страрым...
Странное поведение, почему при записи в пзу происходит запись в нулевую страницу? :v2_conf2:
предположил что запись в 0-ю страницу при выключенном бите blkwr работает всегда, попробовал так:
в этом случае при Restart бейсик запускается с 7 страницей, но при выходе из из NMI зависает...Код:MapWrite0000 = !blkwr ? RamPages[ramPage0000] : m_trashPage;
хм, тогда правильно так:
и действительно - вход в бейсик так получается с правильными страницами, но выход из NMI всеравно не работаетКод:MapWrite0000 = !blkwr ? RamPages[ramPage0000] : m_trashPage;
а описание хардварной части кворума где-то можно найти?
---------- Post added at 23:40 ---------- Previous post was at 23:00 ----------
На данный момент удалось заставить возвращаться из NMI, вот такой доработкой:
плюс вышеупомянутая доработка UpdateMapping, для разрешения записи в кэш при замапленом пзу:Код:protected virtual void BusNmiRq(BusCancelArgs e)
{
e.Cancel = (m_cpu.regs.PC&0xC000) == 0 &&
m_cpu.regs.PC!=0x0038;
}
Код:MapWrite0000 = !blkwr ? RamPages[ramPage0000] : m_trashPage;
правда есть большие сомнения насчет проверки pc на 0x0038 в аппаратной реализации :)
В модели QOURUM оказалось было еще пара ошибок маппинга страниц пзу, исправил.
Проблему с NMI это не решило, как выяснилось после выхода не включаются прерывания. Более того, как выяснилось, выход в унриалкворум работает только если NMI сработал вначале кадра. Т.е. если по шагам нащелкать N-ое число тактов, подальше от 0, а затем нажать альт-ф11, то будет та-же самая проблема - прерывания при выходе запрещены.
Проанализировав как это сейчас работает, я пришел к выводу что работает это только из расчета что NMI будет формироваться когда активны INT и M1, т.е. когда началось выполнение обработчика прерывания - обработчик при выходе разрешит их.
Собственно эту модель NMI и реализовал. Т.е. теперь NMI срабатывает когда активны INT и M1. Теперь выход из NMI в кворуме работает также как в унриалкворум и даже надежнее - NMI можно вызывать на любом такте кадра :)
---------- Post added at 02:59 ---------- Previous post was at 02:57 ----------
Готово
---------- Post added at 03:16 ---------- Previous post was at 02:59 ----------
Обновил эмулятор до версии 2751:
- исправлен менеджер памяти QUORUM
- исправлена логика обработки NMI у QUORUM
- при запуске устанавливается начальное положение мыши отличное от нуля
http://savepic.org/3562669.png
Офигенно! Спасибо!
На реале, правда, к INT привязки нет:
https://dl.dropboxusercontent.com/u/...uorum-nmi1.png
К M1 есть:
https://dl.dropboxusercontent.com/u/...uorum-nmi2.png
Схема получения NMI (K.NMI и K.RES - сигналы с клавиатуры):
https://dl.dropboxusercontent.com/u/...uorum-nmi3.png
PS Возможно, используемое в эмуляторе ПЗУ 4.2 1997го года ставилось на какие-нибудь доработанные версии. Я попробую считать свою прошивку 3.5 94го и сравнить.