Вход

Просмотр полной версии : ZXMAK.NET 2 alpha небольшой ремикс :)



ZXMAK
01.09.2011, 05:25
Откопал исходники, ковырялся целый вечер, переписал основной цикл и гуй, выкинул мусор, вот что получилось :)

Изначально идея была сделать аналог VMWARE Workstation для Speccy :smile: Идея конечно интересная, но пока интереса хватило только отрисовку переписать :rolleyes:

Минимализм во всей красе - F3 сброс, F8 - старт стоп магинтофона, Alt+Сtrl - освобождение мыши :)

shuran33
01.09.2011, 11:04
Alexander Makeev, а для Android'а не сможешь написать нормального эмулятора?

ZEK
01.09.2011, 11:21
На андроиде дотнета нет

shuran33
01.09.2011, 11:39
На андроиде дотнета нет
Понятно. А на javа никто не пробовал писать эмуль спектрума?

ZXMAK
01.09.2011, 17:50
На андроиде дотнета нет

дотнет на андроиде есть (http://android.xamarin.com/), но платный :)

Кстати работает вроде как в несколько раз быстрее чем роданая java :smile: Но из-за платности и недостатка свободного времени я его еще не пробовал.

Что касается эмулятора для андроида, мне думается в этом мало смысла. Пробовал запускать у себя на телефоне какой-то эмулятор - ну какой спектрум без клавиатуры? :v2_dizzy_facepalm:

ZEK
01.09.2011, 17:56
стати работает вроде как в несколько раз быстрее чем роданая java
вообще не работает... на 2.2 одни ошибки валились на 2.3 другие

ZXMAK
01.09.2011, 19:37
вообще не работает... на 2.2 одни ошибки валились на 2.3 другие

что именно не работает? Только недавно обзор производительности читал, там была и запись ютуба наглядно на самом девайсе показывающая насколько дотнет быстрее бегает чем родная java

shuran33
01.09.2011, 20:32
У меня планшет на Android 3.1, экран огромный, так что проблем с клавиатурой наэкранной не возникнет, легко можно подключить usb-клавиатуру.
Очень хочется эмуль с поддержкой трдоса...

ZEK
02.09.2011, 11:47
что именно не работает?
Да кто его знает, оно же падает на экране ничего не говорит вразумительного, на 2.2 падало на некоторых семплах когда крутишь телефон, переключаю задачки диспетчером задач, на 2.3 вообще половина не работает, падает при запуске. Или наоборот на 2.2 половина не работала а на 2.3 глюки :)

Хотя не знаю по ссылке это тот же моно что и с маркета, я ставил из маркета.

Eltaron
03.09.2011, 18:59
выкинул мусор
А развитие не-DirectX версий прекращено? Оно, конечно, и под wine отлично запустилось и работает, но потенциальная кросс-платформенность грела душу :)

ZXMAK
07.09.2011, 02:00
А развитие не-DirectX версий прекращено? Оно, конечно, и под wine отлично запустилось и работает, но потенциальная кросс-платформенность грела душу :)

вобщем-то не DirectX версию из DirectX сделать несложно. Поэтому я на этом концентрироваться не буду, у меня идея удобный эмулятор сделать :)

ZXMAK
08.09.2011, 23:16
Версия 2.0.1 alpha

- добавлен отладчик;
- опять переработан основной цикл и отрисовка (painting);
- добавлен полноэкранный режим;
- добавлены кнопки управления F5 (пауза), F7 (перемотка магинтофона на начало), F9 (продолжить работу), Alt+Enter (полноэкранный режим);


В архив также вкладываю бенчмарк производительности движка, просьба запустить его на слабых машинах и выложить результаты с указанием конфигурации машины (процессор, частота, ОС)


Открыт прием заявок на фичи :v2_wink2:

ZEK
08.09.2011, 23:46
Открыт прием заявок на фичи
возможность расширять плагинами:

как минимум возможность работать через порты и подставлять в свое ПЗУ (для устройств не завязаных на видео и звук можно обойтись к привязкам эмулируемого времени)

как максимум делать свою отрисовку, менеджеры памяти, читать блокировать "набортные устройства", расширять дебагер своими данными.

ZXMAK
09.09.2011, 00:40
возможность расширять плагинами:

как минимум возможность работать через порты и подставлять в свое ПЗУ (для устройств не завязаных на видео и звук можно обойтись к привязкам эмулируемого времени)

к этому и идет, правда есть опасения что если раскидать дешифрацию портов/памяти по плагинам, то может заметно пострадать быстродействие :v2_dizzy_botan:



как максимум делать свою отрисовку,

свою отрисовку - пожалуй что проблем нет, для этого нужно реализовать интерфейс IUla, предоставляющий видеобуфер в формате 32 битного цвета и его размеры. Вопрос пока только в перехвате вывода в порты (который понадобится для нестандартных видеорежимов), реализация обработки портов может негативно повлиять на производительность.

насчет остального, не совсем ясно, если можно - поподробней что под этим понимается:

менеджеры памяти, читать блокировать "набортные устройства", расширять дебагер своими данными.

ZEK
09.09.2011, 01:17
дешифрацию портов/памяти по плагинам, то может заметно пострадать быстродействие
Тут мысль есть. Выглядит примерно так

Делаем табличку на 64к делегатов и при регистрации порта чтения передаем строку (например для регистрации порта FE клавиатуры строка будет выглядеть так "xxxx_xxxx_xxxx_xxx0" где в строке могут быть x бит не имеет значения для дешифрации; 0,1 конкретное значение бита при дешифрации _ для визуального удобства) по этим строкам можно заполнить табличку делегатов и не будет влиять на скорость работы зарегистрирован один порт на чтение или 200, для записи сложнее по идее несколько устройств могут одновременно откликнуться на запись в порт, тут надо подумать, думаю можно сделать 4 таблички и обрабатывать их каскадом в реальности (в железе) не могу представить себе ситуации что бы больше 2х устройств откликнулось на запись по одному адресу.



Вопрос пока только в перехвате вывода в порты (который понадобится для нестандартных видеорежимов)
ну тут вопрос еще есть с лучом развертки, как по мне правильная отрисовка не совсем тривиальная задача, в идеале было бы нарисовать какой нить базовый класс и классы хелперы что бы как то стандартизировать и упростить их реализацию, но тут тебе виднее как оно должно быть как всегда упирается все в компромиссы между быстро и удобно.


насчет остального, не совсем ясно, если можно - поподробней что под этим понимается:
Под менеджером памяти подразумевается - плагин который к примеру позволит использовать память по стандарту пентагона 1024 или там пентевы, опять же как я вижу есть 4 ссылки на массивы по 16кил (страницы), для каждой четверти адресного пространства, плагин регистрирует порты на запись, заказывет у эмулятора что ему надо к примеру 32 страницы по 16 кил, отдает ссылки на страницы с которых будет браться картинка (ну простейший вариант на 5 и 7 страницы) и будет по записи в порт изменять ссылки того что подключено к адресному пространству.

Под "читать блокировать набортные устройства", блокировку набортных устройств отчасти можно решить табличкой делегатов на 64к адресов с битовой строкой как описывал выше, под читать это имел ввиду что бы можно было по какому то идентификатору прочитать к примеру значение порта 7FFD или там значение флага TR-DOS (хотя чтение портов опять же можно решить с регистрацией в плагине функции реагирующую на запись к примеру по маске "xxxx_xxxx_xxxx_xx0x"), тут додумать надо, можно взяться пописать плагины и тогда уже точно сложатся функциональные требования.

Под расширением дебагера, добавить возможность выводить где нить (к примеру в области окна там где выводится текущий такт и значения флагов IFF1 IFF2 свои значения, добавлю к примеру порт 1FFD и очень неплохо видеть его значение в дебагере, или к примеру добавлю флаг SHADOW_ROM который будет показывать что нахожусь в теневом ПЗУ, в общем позволить регистрировать там подписчики на вывод значений bool, byte, short, string)


Надеюсь не много набредил :)

---------- Post added at 00:17 ---------- Previous post was at 00:16 ----------


дешифрацию портов/памяти по плагинам, то может заметно пострадать быстродействие
Тут мысль есть. Выглядит примерно так

Делаем табличку на 64к делегатов и при регистрации порта чтения передаем строку (например для регистрации порта FE клавиатуры строка будет выглядеть так "xxxx_xxxx_xxxx_xxx0" где в строке могут быть x бит не имеет значения для дешифрации; 0,1 конкретное значение бита при дешифрации _ для визуального удобства) по этим строкам можно заполнить табличку делегатов и не будет влиять на скорость работы зарегистрирован один порт на чтение или 200, для записи сложнее по идее несколько устройств могут одновременно откликнуться на запись в порт, тут надо подумать, думаю можно сделать 4 таблички и обрабатывать их каскадом в реальности (в железе) не могу представить себе ситуации что бы больше 2х устройств откликнулось на запись по одному адресу.



Вопрос пока только в перехвате вывода в порты (который понадобится для нестандартных видеорежимов)
ну тут вопрос еще есть с лучом развертки, как по мне правильная отрисовка не совсем тривиальная задача, в идеале было бы нарисовать какой нить базовый класс и классы хелперы что бы как то стандартизировать и упростить их реализацию, но тут тебе виднее как оно должно быть как всегда упирается все в компромиссы между быстро и удобно.


насчет остального, не совсем ясно, если можно - поподробней что под этим понимается:
Под менеджером памяти подразумевается - плагин который к примеру позволит использовать память по стандарту пентагона 1024 или там пентевы, опять же как я вижу есть 4 ссылки на массивы по 16кил (страницы), для каждой четверти адресного пространства, плагин регистрирует порты на запись, заказывет у эмулятора что ему надо к примеру 32 страницы по 16 кил, отдает ссылки на страницы с которых будет браться картинка (ну простейший вариант на 5 и 7 страницы) и будет по записи в порт изменять ссылки того что подключено к адресному пространству.

Под "читать блокировать набортные устройства", блокировку набортных устройств отчасти можно решить табличкой делегатов на 64к адресов с битовой строкой как описывал выше, под читать это имел ввиду что бы можно было по какому то идентификатору прочитать к примеру значение порта 7FFD или там значение флага TR-DOS (хотя чтение портов опять же можно решить с регистрацией в плагине функции реагирующую на запись к примеру по маске "xxxx_xxxx_xxxx_xx0x"), тут додумать надо, можно взяться пописать плагины и тогда уже точно сложатся функциональные требования.

Под расширением дебагера, добавить возможность выводить где нить (к примеру в области окна там где выводится текущий такт и значения флагов IFF1 IFF2 свои значения, добавлю к примеру порт 1FFD и очень неплохо видеть его значение в дебагере, или к примеру добавлю флаг SHADOW_ROM который будет показывать что нахожусь в теневом ПЗУ, в общем позволить регистрировать там подписчики на вывод значений bool, byte, short, string)


Надеюсь не много набредил :)

ZXMAK
09.09.2011, 02:57
Немного о бенчмарке Test.exe, бенчмарк измеряет время эмуляции 500 кадров (10 секунд) заложенных в exe снэпшотов. После выполнения 500 кадров состояние сохраняется в снэпшот на диск для возможности проверки корректности эмуляции.

Следует отметить что из-за особенностей сохранения Z80 снэпшотов (не сохраняется состояние HALT), результирующий снэпшот videoTest.z80 будет нерабочий, чтобы сделать его рабочим нужно после загрузки уменьшить PC на единицу. Может кто-то знает где в Z80 можно сохранить состояние HALT?

---------- Post added at 01:57 ---------- Previous post was at 01:35 ----------


Тут мысль есть. Выглядит примерно так

Делаем табличку на 64к делегатов и при регистрации порта чтения передаем строку (например для регистрации порта FE клавиатуры строка будет выглядеть так "xxxx_xxxx_xxxx_xxx0" где в строке могут быть x бит не имеет значения для дешифрации; 0,1 конкретное значение бита при дешифрации _ для визуального удобства) по этим строкам можно заполнить табличку делегатов и не будет влиять на скорость работы

хорошая идея :v2_thumb:

daniel
09.09.2011, 05:48
Версия 2.0.1 alpha
Открыт прием заявок на фичи :v2_wink2:

плэйлист сделай http://zx.pk.ru/showthread.php?t=16726

Vitamin
09.09.2011, 07:22
для записи сложнее по идее несколько устройств могут одновременно откликнуться на запись в порт, тут надо подумать, думаю можно сделать 4 таблички и обрабатывать их каскадом в реальности (в железе) не могу представить себе ситуации что бы больше 2х устройств откликнулось на запись по одному адресу.
Не совсем так.
Если зарегистрировано несколько делегатов на запись (а это обычная ситуация, например SounDrive и BDI висят на одних и тех же портах), то здесь нюансом может быть блокирование дальнейшей записи устройством. Например, тот же BDI может решить, что порт предназначается ему и не разрешить передавать его следующему делегату. Т.е. возникает проблема порядка, которую надо решать конфигурациями.
Если зарегистрировано несколько делегатов на чтение- вот это уже плохо, ибо конфликт на шине.

ZEK
09.09.2011, 11:02
Если зарегистрировано несколько делегатов на чтение- вот это уже плохо, ибо конфликт на шине.
Тут может быть такое же решение как и в железе - приоритеты, тобиш логика IOQGE
если откликнулось устройство которое сидит раньше в цепочке (к примеру в первом слоте слотовых машин) IORQGE то остальные идут лесом.


сли зарегистрировано несколько делегатов на запись (а это обычная ситуация, например SounDrive и BDI висят на одних и тех же портах), то здесь нюансом может быть блокирование дальнейшей записи устройством.
Вот теперь я вспомнил где конкретно надо логика блокировки "набортных устройств", то есть работать с устройствами пересекающиеся с BDI это исключение из правил а не практика.
В то же время есть вполне законное право что бы несколько устройств отреагировало на запись в один порт, так можно сделать в железе без каких либо доработок было бы отлично если бы была бы такая возможность в эмуляторе, тогда можно макетировать всякие внешние видяхи (которым надо слушать на запись порты 7FFD и FE). Как вариант можно конечно предоставить функции которые позволят в любой момент прочитать 7FFD и FE, но это не совсем честное макетирование получится.

В общем все мои хотелки это то что я в какой то мере делал на предыдущем zxmak для отладки железяк, но там как по мне не совсем удобно надо создавать платформу и в неё всовывать железку, тобиш нельзя железку потестиь с Profi Kay Pentagon, это надо везде полазить.

---------- Post added at 10:02 ---------- Previous post was at 08:42 ----------

Бажка с востановление контекста графического устройства, видать обрабатывается только состояние DeviceNoReset или как то так, а на DeviceLost вываливает исключение (ноут усыпил с включеным эмулятором, после пробуждения красный крест вместо картинки)

Eltaron
09.09.2011, 12:32
Версия 2.0.1 alpha
О, из этой версии я понял, что значит "VMWARE Workstation для Speccy" :)
Да, отличная идея!
А исходники-то будут? :)


Бажка с востановление контекста графического устройства, видать обрабатывается только состояние DeviceNoReset или как то так, а на DeviceLost вываливает исключение (ноут усыпил с включеным эмулятором, после пробуждения красный крест вместо картинки)
еще под Wine если скрыть окно, а потом показать обратно, то практически всегда сурфейс отваливается, видео больше не обновляется и звук останавливается. Меню при этом работает нормально.

ZXMAK
09.09.2011, 15:17
Тут может быть такое же решение как и в железе - приоритеты, тобиш логика IOQGE
если откликнулось устройство которое сидит раньше в цепочке (к примеру в первом слоте слотовых машин) IORQGE то остальные идут лесом.

попробовал вариант с массивами делегатов, я пошел дальше и на обращение к памяти тоже делегатами рулится. Сделал так - есть менеджер шины, в котором регистрятся все девайсы реализующие IBusListener. Менеджер шины при регистрации вызывает метод BusInit у каждого девайса в котором девайсы сообщают на какие события они подписываются, например:


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;
}


к сожалению производительность упала на 30-40%, при том-же функционале :( Может написать часть эмулятора на Си?
Пока рано делать окончательные выводы, т.к. при вызове делегатов многовато лишнего происходит, нужно посмотреть что можено соптимизировать...


в аттачменте пробный вариант с BusManager (глубоко не проверял, но с виду все вроде работает)

---------- Post added at 10:02 ---------- Previous post was at 08:42 ----------


Бажка с востановление контекста графического устройства, видать обрабатывается только состояние DeviceNoReset или как то так, а на DeviceLost вываливает исключение (ноут усыпил с включеным эмулятором, после пробуждения красный крест вместо картинки)

хм, на десктопе проверял в разных режимах все ок, иногда только в лог пролетают единичные InvalidCall на текстуре после манипуляций с фокусом и старт-стопом. Проверю на ноутбуке...

ZXMAK
09.09.2011, 15:24
Если зарегистрировано несколько делегатов на чтение- вот это уже плохо, ибо конфликт на шине.

конфликт - это не страшно, конфликтное устройство просто может забивать результаты других устройств, при конфликтах его можно просто отключить. Зато девайс может устанавливать только свои биты в результате.
Плохо то что вызов кучи делегатов на каждый доступ к памяти кушает много времени...

ZEK
09.09.2011, 17:13
Зато девайс может устанавливать только свои биты в результате.
И такая ситуация существует в железе. Не помню где но что то с глюкчасами связанное. Так же к примеру контролер клавиатуры от caro который умеет команды принимать чтением из порта FE тож только своими битами управляет и трогает магнитофонный бит.

---------- Post added at 16:13 ---------- Previous post was at 15:09 ----------

Для памяти может вместо делегатов использовать expession? по идее быстрее будет, потеряется возможность multicast но для памяти как бы и не надо.

Eltaron
09.09.2011, 20:33
Для памяти может вместо делегатов использовать expession? по идее быстрее будет
в этом случае, как мне кажется, никакого выигрыша не будет. Наоборот даже будет лишняя потеря времени на компиляцию Expression'а в рантайме

Vitamin
09.09.2011, 21:41
Плохо то что вызов кучи делегатов на каждый доступ к памяти кушает много времени...
При таких вот массовых опросах провайдеров можно использовать один прием. Я его открыл для себя, когда писал анализатор данных для ZXTune. Вместо того чтобы дергать каждый детектор на каждый байт смещения во входных данных (очевидный алгоритм поиска) делается следующее. Результатом работы каждого детектора является пара чисел- сколько байт он проанализировал (их можно пропустить для анализа) и сколько байт его можно не трогать. Эти числа взаимоисключающие, разумеется.

В ситуации с эмулем результатом может стать одно число вида "позвать через N тактов".
Разумеется, это лишь идея, ее результат будет зависеть от исполнения:)

ZXMAK
10.09.2011, 16:27
после оптимизации кода процессора под новую модель с BusManager, результат таков: падение производительности на новой модели составило 23%. Решил оставить, т.к. уж больно удобная модель получилась :)

Как выяснилось, львиную долю дополнительного времени съедает подписка Beta Disk Interface на ReadMemoryM1. Кода в обработчиках фактически нет, но при подписке на ReadMemory производительность сразу проседает на 15%. Вот код обработчиков:


public void BusInit(IBusManager bmgr)
{
bmgr.AddListenerReadMemoryM1(0xFF00, 0x3D00, readMem3D00_M1);
bmgr.AddListenerReadMemoryM1(0xC000, 0x4000, readMemRam);
bmgr.AddListenerReadMemoryM1(0xC000, 0x8000, readMemRam);
bmgr.AddListenerReadMemoryM1(0xC000, 0xC000, readMemRam);

bmgr.AddListenerWritePort(0x8002, 0x0000, writePort7FFD);

bmgr.AddListenerWritePort(0x00E3, 0x0003, writePortCMD);
bmgr.AddListenerWritePort(0x00E3, 0x0023, writePortTRK);
bmgr.AddListenerWritePort(0x00E3, 0x0043, writePortSEC);
bmgr.AddListenerWritePort(0x00E3, 0x0063, writePortDATA);
bmgr.AddListenerWritePort(0x00E3, 0x00E3, writePortBETA);

bmgr.AddListenerReadPort(0x00E3, 0x0003, readPortCMD);
bmgr.AddListenerReadPort(0x00E3, 0x0023, readPortTRK);
bmgr.AddListenerReadPort(0x00E3, 0x0043, readPortSEC);
bmgr.AddListenerReadPort(0x00E3, 0x0063, readPortDATA);
bmgr.AddListenerReadPort(0x00E3, 0x00E3, readPortBETA);

bmgr.AddListenerReset(busReset);
}

private void busReset(long cpuTact)
{
m_selTrdos = false;
m_lock = false;
writePort7FFD(cpuTact, 0x7FFD, 0);
}

#region RDMEM

private void readMem3D00_M1(long cpuTact, ushort addr, ref byte value)
{
if (m_romPage == 1)
m_selTrdos = true;
}

private void readMemRam(long cpuTact, ushort addr, ref byte value)
{
m_selTrdos = false;
}

#endregion



обнаруженые недостатки на примере бета диск интерфейса:
- из девайса бета диска приходится мониторить чтение памяти чтобы отловить вход в TRDOS для разрешения обработки портов (сами ROM переключаются в девайсе Memory);
- из девайса бета диска приходится мониторить RESET и запись в порт 7FFD на предмет битов LOCK и ROM, чтобы блокировать вход в TRDOS из 128K ROM

ZXMAK
12.09.2011, 01:26
вот что на данный момент получилось - см.аттачмент. Сыровато пока, но работает :)
Уже проясняется где можно оптимизацию сделать - слушать порты например можно только в одном устройстве, а в остальных искать на шине девайс с нужным интерфейсом и брать данные вывода в порт у него. Таким образом можно уменьшить дублирование обработки портов...

что нового:
- добавлен индикатор доступа к диску :)
- добавлена страница с настройками дисплея (сглаживание, VBlank, индикторы)
- мелкие фиксы и рефакторинг кода Z80 с оптимизацией под BusManager
- fix Z80 interrupt timing
- fix Z80 HALT issue (z80 snapshot)
- fix Z80 mistakes (undocumented DD/FD opcodes)
- реализован базовый класс UlaGeneric, на основе которого можно создавать стандартные со своими модами
- добавлен ULA девайс для Pentagon без обрезки по бордюру
- добавлен ULA девайс для Scorpion
- добавлен ULA девайс для ATM1 (только стандартный видеорежим)
- добавлен ULA девайс для Profi (пока не работает, т.к. требует соответствующую память)


PS: залил версию 204, в 203 был баг с отладчиком (повторно не открывался)

ZXMAK
13.09.2011, 08:03
Новая версия 2.0.5:
- исправлены тайминги SEEK для ВГ93 (CHORDOUT)

Нужно бы заняться ВГ93, т.к. движок от unreal никуда не годится. Кто-то может помочь со сбором информации по ВГ93 на реальном железе?

ZEK
13.09.2011, 10:26
Ближе к зиме буду подрубать к DE1 Nemo FDC
можно будет вымерять все вдоль и поперек.

ZXMAK
13.09.2011, 22:09
может кто подскажет, в харькове можно гдето приобрести компактный спектрум на Z80 и ВГ93, на современной элементной базе? Интересно с железкой поковыряться :)
Главное не старый гроб, т.к. некуда ставить. Что-то типа маленькой коробочки по размерам с роутер-мыльницу, но чтоб проц Z80 был :)

ZEK
14.09.2011, 10:44
роутер-мыльницу, но чтоб проц Z80 был
таких компов только 3-4 модели, но из них только один с живым процом Speccy 2007

ZXMAK
14.09.2011, 10:58
новая версия 206:
- исправил чтение порта с магнитофона (звук был, а чтения не было - по ошибке магнитофон выдавал данные в обработчик записи в порт :) )
- добавились сериалайзеры скриншотов в BMP и JPG
- добавилась опция /zexall для Test.exe - выполняет zexall.sna 700000 кадров, сохраняя скриншот каждые 30000 кадров
- доработана структура сериалайзеров для образов дисков
- добавлен скрин конфигурации beta disk interface

ZXMAK
14.09.2011, 11:11
таких компов только 3-4 модели, но из них только один с живым процом Speccy 2007

а купить где-то готовый можно?

ZEK
14.09.2011, 11:16
а купить где-то готовый можно?
http://zx.pk.ru/showthread.php?t=13685
ток учи там нет ВГ93

на современной базе с живым Z80 ВГ93 только ZX Evolution но размер под писюковый корпус

ZXMAK
16.09.2011, 00:41
ну а как по скорости эмулятор на слабых машинах себя ведет?

ZXMAK
16.09.2011, 06:48
Новая версия 207:
- файл лога теперь создается только если появляются записи, чтобы не плодить пустые файлы
- доработана модель шины данных, теперь все устройства вешаются на нее и взаимодействуют друг с другом только через шину
- GUI: захват мыши теперь происходит только при двойном клике (освобождение Alt+Ctrl)
- окно настроек строится динамически - прямо с шины вытягивается список висящих на ней устройств и через рефлексию делается поиск подходящего контрола для настройки каждого девайса (поиск по всем сборкам домена, т.е. без проблем можно подгружать внешние девайсы-плагины ;)

осталось немного допилить (убрать некоторые связи), подоптимизировать, довести до ума скрин конфигурации машины и готов плагинный эмулятор :)

Пока коротоко суть работы плагинов:
Все девайсы (кроме самого проца) являются наследниками IBusDevice и взаимодействуют только с шиной.
Девайс может найти своих собратьев на шине по типу реализуемого ими интерфейса, для этого используется метод FindDevice.

Работа девайса начинается с вызова BusConnect, вот пример реализации магнитофона:


public void BusConnect(IBusManager bmgr)
{
bmgr.SubscribeRDIO(0x0001, 0x0000, readPortFE);
}

public void BusDisconnect()
{
}

public string BusDeviceType { get { return "Tape Recorder"; } }
public string BusDeviceName { get { return "Play only tape device"; } }

#region WRPORT

private void readPortFE(long cpuTact, ushort addr, ref byte value)
{
value &= 0xBF;
value |= (byte)(GetTapeBit(cpuTact) & 0x40);
}

#endregion

ZXMAK
16.09.2011, 07:49
Новая версия 208 :):
- в предыдущей версии после смены ULA девайса плыли тайминги прерываний, из-за чего при выборе ULA Scorpion плыл бордюр в мультиколоре;
- звук загрузки магнитофона временно удалил (вычистил все ссылки на девайсы, чтобы доступ к ним был только через шину)
- незначительно повысилась производительность движка

ZEK
16.09.2011, 09:38
поиск по всем сборкам домена
жестко, мож хотя бы не искать в тех которые в GAC.

Попробывал тестик, эмулятор как библиотеку подключил



static class Program
{
[STAThread]
static void Main()
{
Application.Run(new ZXMAK2.Controls.FormMain());
}
}

public class IO_Test : IBusDevice
{

public void BusConnect(IBusManager bmgr)
{
MessageBox.Show("Connect");
}

public string BusDeviceName
{
get { return "IO_Test"; }
}

public string BusDeviceType
{
get { return "Block device"; }
}

public void BusDisconnect()
{
MessageBox.Show("Disconnect");
}
}


реакции нет...
правда я еще рефлектором внутрь не заглядывал

ZXMAK
16.09.2011, 11:45
жестко, мож хотя бы не искать в тех которые в GAC.

речь про AppDomain :) Короче все загруженные сборки. При запуске эмуль будет сканить папку плагинов и загружать из нее все сборки ;)


Попробывал тестик, эмулятор как библиотеку подключил


реакции нет...
правда я еще рефлектором внутрь не заглядывал

так и будет работать, но пока инициализация жестко захардкожена, поэтому юзаются только те девайсы что захардкожены. Нужно еще немного код доделать. Единственное что выводить блокирующие окна из BusConnect нехорошо.

ZEK
16.09.2011, 12:11
Единственное что выводить блокирующие окна из BusConnect нехорошо.
хотел посмотреть подтянет или нет.
и кстати сразу вопрос встает, вот делаю я к примеру плагин SD Card читалку/ писалку хотелось бы: возможность добавить пункт меню File|Load image (ну или допустим расширять список понимаемых форматов и обрабатывать выбор файла своего формата), ну еще было бы хорошо если была бы возможность доступа к конфигурации, что бы не лепить каждому плагину свой, на примере читалки sd было бы хорошо хранить образ подкидываемый по умолчанию.


речь про AppDomain
я просто глянул что в AppDomain.CurrentDomain.GetAssemblies() там половина шлака...

ZXMAK
16.09.2011, 12:54
хотелось бы: возможность добавить пункт меню File|Load image (ну или допустим расширять список понимаемых форматов и обрабатывать выбор файла своего формата)

такая возможность уже давно есть, для реализации своего формата нужно заимплементить абстрактный класс ZXMAK2.Engine.Loader.FormatSerializer, который сообщает с какими расширениями он работает и какие операции умеет делать (сохранять/загружать). После регистрации этого сериалайзера, такой формат автоматически появится в списке доступных для загрузки/сохранения и эмулятор будет вызывать у него методы Load(Stream) и Save(Stream), в из которых сериалайзер может найти свой девайс через Spectrum.BusManager.FindDevice и сериализовать его... :)


, ну еще было бы хорошо если была бы возможность доступа к конфигурации, что бы не лепить каждому плагину свой, на примере читалки sd было бы хорошо хранить образ подкидываемый по умолчанию.


это естественно будет, девайс будет имплементить методы для сериализации/десериализации в/из XmlNode. И таким образом его конфиг будет храниться в XML файле конфигурации виртуальной машины.

ZXMAK
16.09.2011, 17:05
в версии 208 забыл отключить логирование ввода/вывода на ВГ93, в итоге после некоторого времени обращения к диску лог разрастается на десятки мегабайт :)
Вечером исправлю :)

ZEK
16.09.2011, 17:18
Еще одна вполне вероятная ситуация.
Все про те же SD, возможна ситуация когда два Serializer предназначены для одного расширения файла. Например читалка SD и NeoGS в которой есть своя читалка SD могут быть подписаны на расширение img с образом sd, и в принципе в реальном компе ничто не помешает заюзать эти два устройства одновременно. Тут может есть смысл после выбора файла предлагать выбор кого вызвать, такая же ситуация может быть с контролерами винтов.

ZXMAK
16.09.2011, 18:03
Тут может есть смысл после выбора файла предлагать выбор кого вызвать, такая же ситуация может быть с контролерами винтов.

такая-же ситуация с 4-мя дисководами висящими на вг93, я это обошел так, что в общий менеджер сериалайзеров добавляется только экземпляр забинденый на первый дисковод (дефолтный). А открыть образ для остальных дисководов можно из окна настроек :)
Суть в том что с одной стороны чаще всего нужен способ быстро открывать любой файл без надоедливых диалогов, с другой стороны бывает нужно выбрать дополнительные опции открытия. Вариант с сохранением через окно настроек по моемому вполне ничего... :)
Другого варианта пока не вижу :v2_conf2:

ZXMAK
17.09.2011, 19:48
Итак новая версия 209 - первая версия умеющая работать с чужими девайсами :v2_dizzy_roll:
- окончательно вычищены ссылки на девайсы, работа с девайсами идет только через BusManager;
- добавлен код загружающий все сборки из папки Plugins и добавляющий все классы реализующие IBusDevice на шину :)

Осталось написать сохранение настроек в XML и доработать гуй окна настроек на возможность удаления/добавления девайсов :)

В папке Plugins исходник плагина-девайса IO_TEST, он слушает порт 3 и как только в него что-то записывается вываливает мессидж бокс :)