Обновил первый пост.
Вид для печати
Обновил первый пост.
Причина скорее где-то в неправильной реализации канала 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 со стороны ЦП, когда запрос на прерывание дается, а при удовлетворении запроса п/п обработки прерываний не читает/записывает регистр данных, но это уже обсуждалось.
Вот как сделано в 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;
}
Да, посмотрел - тест у меня тестирует пока что только приемники ЦП, приемники и источники ПП. А источники ЦП не тестирует. Впрочем, и в этих трех тестах нашел давно уже ошибки, но не исправлял, т.к. хотел все скопом, когда полная информация по тестам будет. Вот и остались пока что эти ошибки.
http://savepic.ru/3784327.png
С этой игрой странные вещи творятся, во первых где-то в дебрях "хламника" есть вообще не рабочая версия (к сожалению просто для примера не могу её откопать)
- на живой машинке не проверенная. Возможно битая.
Уползание рамки стартового меню ЕМНИП было и на живой машинке, это можно потом проверить. Штука такая, при запуске с дискеты и в EmuStudio и в UKNCBTL нормально работает )
А вот если этот же самый файл запустить с ЖД в UKNCBTL после выхода из игры он
"убивает" сессию, эмулятор впадает в "бешенство", курсор мигает очень очень быстро и начинают залипать все все клавиши. Как-то так.