попробовал вариант с массивами делегатов, я пошел дальше и на обращение к памяти тоже делегатами рулится. Сделал так - есть менеджер шины, в котором регистрятся все девайсы реализующие IBusListener. Менеджер шины при регистрации вызывает метод BusInit у каждого девайса в котором девайсы сообщают на какие события они подписываются, например:
к сожалению производительность упала на 30-40%, при том-же функционале :( Может написать часть эмулятора на Си?Код:public void BusInit(IBusManager bmgr)
{
// false - это M1
bmgr.AddListenerReadMemory(0xC000, 0x4000, false, readPage4000);
bmgr.AddListenerReadPort(0x0001, 0x0000, readPortFE);
}
private void readPage4000(long cpuTact, ushort addr, ref byte value)
{
value = RAMS[5][addr&0x3FFF];
}
private void readPortFE(long cpuTact, ushort addr, ref byte value)
{
value = (value & 0xBF) | GetTapeBit(cpuTact)? 0x40:0x00;
}
Пока рано делать окончательные выводы, т.к. при вызове делегатов многовато лишнего происходит, нужно посмотреть что можено соптимизировать...
в аттачменте пробный вариант с BusManager (глубоко не проверял, но с виду все вроде работает)
---------- Post added at 10:02 ---------- Previous post was at 08:42 ----------
хм, на десктопе проверял в разных режимах все ок, иногда только в лог пролетают единичные InvalidCall на текстуре после манипуляций с фокусом и старт-стопом. Проверю на ноутбуке...Цитата:
Бажка с востановление контекста графического устройства, видать обрабатывается только состояние DeviceNoReset или как то так, а на DeviceLost вываливает исключение (ноут усыпил с включеным эмулятором, после пробуждения красный крест вместо картинки)

