Обновил первый пост.
Обновил первый пост.
Причина скорее где-то в неправильной реализации канала 0, т.к. в этой игре при вводе ранга игры опрашивается только регистр 177562 на заданное значение, без опроса регистра 177560. Наверное надо копать в этом направлении, ну и помнить, что идет завязка и на регистры со стороны ПП.
Код:UINT16 FASTC CPU_RdW_DST0_DATA(void) { // Регистр данных приемника канала 0 CPU_DST0_STATE &= 0x7F; // Сбросить бит готовности регистра состояния приемника 0 CPU PPU_SRC_STATE |= 0x08; // Установить бит готовности источника 0 регистра состояния источников PPU GPU_SRC2_STATE |= 0x80; // Установить бит готовности источника-2 GPU (для КЦГД ДВК) if (PPU_SRC_STATE & 0x1) // Если прерывание PPU по чтению данных каналом 0 разрешено PPU_IRQ_MASK |= PPU_IRQM_TRN0; // Установить запрос прерывания PPU источником 0 if (KCGD_On) // Разрешен только при активном КЦГД { if (GPU_SRC2_STATE & 0x40) // Если разрешены прерывания источником-2 GPU, GPU_IRQ_MASK |= GPU_IRQM_TRN2; // то установить запрос на прерывание } return(PPU_SRC0_DATA); }
Вот она ошибка. Я уже вроде писал неоднократно, что запрос на прерывание возникает только тогда, когда предыдущее состояние бита готовности и бита разрешения прерывания, сложенное по ЛОГИЧЕСКОМУ И, равно нулю(ЛОЖЬ), а новое равно единице(ИСТИНА). В данном же варианте предыдущее состояние со стороны ПП уже было равно ИСТИНЕ, а тут еще дают запрос на прерывание. Собственно программа обработки прерываний со стороны ПП небось в ступор и входит.
Правда есть еще особенности работы каналов со стороны ПП, а также каналов 1 и 2 со стороны ЦП, когда запрос на прерывание дается, а при удовлетворении запроса п/п обработки прерываний не читает/записывает регистр данных, но это уже обсуждалось.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Вот как сделано в UKNCBTL:
Код:BYTE CMotherboard::ChanReadByCPU(BYTE chan) { BYTE res,oldp_ready = m_chanpputx[chan].ready; // Получить пред.состояние бита готовности канала в ПП chan &= 3; ASSERT(chan<2); res = m_chancpurx[chan].data;// Получить данные канала ЦП m_chancpurx[chan].ready = 0; // Сбросить бит готовности канала ЦП m_chancpurx[chan].rdwr = 1; // Установить признак чтения регистра данных канала ЦП m_chanpputx[chan].ready = 1; // Установить бит готовности канала ПП m_pCPU->InterruptVIRQ(chan*2+1,0); // Сбросить запрос на прерывание со стороны ЦП if((m_chanpputx[chan].irq) && (oldp_ready==0)) // Если со стороны канала ПП установлено разрешение на прерывание и пред.состояние бита готовности было равно нулю { m_chanpputx[chan].rdwr = 0; // Сбросить признак записи регистра данных каналам ПП m_pPPU->InterruptVIRQ(chan?8:6, chan?0334:0324); // Установить запрос на прерывание со стороны ЦП } return res; }
Да, посмотрел - тест у меня тестирует пока что только приемники ЦП, приемники и источники ПП. А источники ЦП не тестирует. Впрочем, и в этих трех тестах нашел давно уже ошибки, но не исправлял, т.к. хотел все скопом, когда полная информация по тестам будет. Вот и остались пока что эти ошибки.
С этой игрой странные вещи творятся, во первых где-то в дебрях "хламника" есть вообще не рабочая версия (к сожалению просто для примера не могу её откопать)
- на живой машинке не проверенная. Возможно битая.
Уползание рамки стартового меню ЕМНИП было и на живой машинке, это можно потом проверить. Штука такая, при запуске с дискеты и в EmuStudio и в UKNCBTL нормально работает )
А вот если этот же самый файл запустить с ЖД в UKNCBTL после выхода из игры он
"убивает" сессию, эмулятор впадает в "бешенство", курсор мигает очень очень быстро и начинают залипать все все клавиши. Как-то так.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)