Однажды тянуть его за собой станет слишком накладно, и выпилят. Так же, как большую часть досовской подсистемы выпилили при переходе на NT.
Вид для печати
Возможно поддержка старых программ пока еще есть, но поддержки разработки под DirectDraw уже давно нет. Смысла воевать и тратить кучу времени на DirectDraw нет, этот интерфейс мертв уже более 10 лет. К тому-же на Linux он работать точно не будет.
Direct3D работает отлично, тратить время на поддержку старючего и давно мертвого DirectDraw, только для того, чтобы не нужно было устанавливать DirectX нет никакого смысла. Более целесообразно было бы вообще отказаться от DirectX, но реализация на нем работает очень хорошо.
Если б было целесообразно, выпилили бы уже в вин7/8. А раз оставили, значит слишком больше число программ написано под него.
---------- Post added at 23:31 ---------- Previous post was at 23:30 ----------
Линукс меня пока что мало интересует.
А что будет работать от XP до 8.1 безо всяких патчей и предустановок? Кроме GDI, которая является изрядным тормозом.
про DirectDraw уже можно смело забыть, он и так уже практически не поддерживается многие эмуляторы (винплюс, klive, kega fusion...) испытывают серьёзные проблемы под восьмёркой.
скоро выйдет windows 10 на замену с треском провалившейся восьмёрке, там говорят DirectDraw не будет поддерживаться.
в полноэкранный режим попробуй перевести эти эмуляторы, некоторые крашатся, некоторые выдают кислотную палитру (вообще таких эмуляторов довольно много, особенно стареньких).
ZXMAK, правильно делает что отказывается от DirectDraw, незачем некрофилией заниматься, кроме протухшего зомби ничего не получится.
Так в чем проблема, исходники доступны, реализуй IHostVideo интерфейс, который в контрол winforms рисуется, я добавлю и буду поддерживать. Интерфейс проще некуда - два метода PushFrame и WaitFrame. Первый получает IVideoData содержащий размеры изображения, вертикальный масштаб и буфер в формате 32 битного цвета. У второго вообще нет параметров. Сделаешь для DirectDraw, будет хост и под него :)
Я вот какраз только добавил возможность выбора хоста через командную строку:
Собираюсь еще добавить opengl, будет чтото вроде такого:Цитата:
/host:xna - для использования xna хоста
/host:winforms - для использования Direct3D хоста
Цитата:
/host:opengl
TR-DOS под конфигурацией +2A/+3 так и не работает. Надо бы пофиксить.
Titus, ну незнаю, у меня почти мгновенно открываются и снапшоты и менюшки, задержка максимум в пол-секунды, что не критично.
видимо у тебя слабое железо в компе используется.
у меня: Intel core i5 3570 - 3.40 Ghz, 16GB memory, Nvidia GTX 760, Windows 7 x64 ultimate.
так это не проблема :smile:
При первом запуске происходит компиляция дотнет кода в нативный код на лету, поэтому первое выполнение кода будет немного медленее чем повторные.
Но это решается генерацией нативного образа и помещением его в кэш. Тогда при запуске будет сразу запускаться заранее скомпилированный образ :)
Делается это так:
для удаления из кэша:Код:ngen.exe install ZXMAK2.exe
ngen.exe установлен в папке C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen .exeКод:ngen.exe uninstall ZXMAK2.exe
Хм, только тут есть подводный камень, сейчас не все сборки референсятся из ZXMAK2.exe, поэтому это нужно проделывать со всеми сборками которые прописаны в unity.config
Ок, в следующей версией положу батник который все файлы будет компилить
Помоему TRDOS не совместим с +2A/+3, поэтому он никак не будет там работать
---------- Post added at 19:52 ---------- Previous post was at 19:50 ----------
потому что так быстрее будет работать, заранее компилировать нет смысла, т.к. еще не известно на каком процессоре и в какой среде будет выполняться код, поэтому оптимизации не все можно сделать.
Вообще, это обычно делается при установке инсталлятором, но т.к. эмулятор без инсталлятора распространяется, то это нужно делать вручную :smile:
Но по большому счету это не нужно, на мой взгляд скорость запуска и так вполне нормальная
так ведь и эмуляция идет не на уровне кода, а ближе к эмуляции схемы. Попробуй запусти на супермощном компе эмуляцию схемы со всеми сигналами и т.п. ;) Я скажу больше, для точной синхронизации видео, мощности у такого процессора особо никакой нет. Сказываются недостатки отсутствия уведомлений о начале развертки у видеокарт. Поэтому сравнение некорректное.
Основные пожиратели процессора - это графика и звук. Есть возможность для некоторой оптимизации.
Ну да, 5 секунд - ниче так скорость)
---------- Post added at 23:06 ---------- Previous post was at 23:03 ----------
В ZXMak'е явно не на уровне транзисторов эмуляция)
Скорее на уровне циклов.
У какого 'такого' процессора?
Уведомление у видеокарты о начале кадра есть, но без коллбека, а посредством простого опроса ручками. Что многократно обсуждалось.
Графика - понятно. Но звук-то чего занимает?
---------- Post added at 23:08 ---------- Previous post was at 23:06 ----------
Если эмулировать FPGA в реальном времени - это никакой бытовой комп не справится.
в ZXMAK на уровне тактов (а кое-где и глубже), все операции которые происходят в риале на каждом такте эмулируются.
т.к. процессор вынужден отслеживать положение луча, он в это время не может быть использован для других полезных задач. Соответственно на полезные задачи, включая эмуляцию уходит лишь значительно малая часть времени. Основную мощность процессора пожирает отслеживание луча на дисплее.
Речь разумеется о режиме синхронизации VBlank. Когда он выключен синхронизация идет по событиям от звуковой карты. У звуковой карты события есть и процессорное время используется только на полезную работу. Но теряется абсолютная плавность скроллов в демах - заметно подрагивание.
Со звуком довольно много времени уходит на микширование звуковых потоков. Не то чтобы это критично, но времени на это тратится прилично.
На worldofspectrum указали на то, что при частоте дисплея 60 Гц, VBlank Sync не помогает и скролы всеравно дрожат. Пишут что в Unreal при такой частоте скролы плавные.
Однако у меня на Unreal скролы дрожат не меньше чем в ZXMAK2 без VBlank :)
Мы тут когда-то разбирались в чем может быть причина, пришли к выводу что видимо это из-за того, что у меня относительно современный процессор, а на них используется Intel® Turbo Boost Technology, которая динамически меняет частоту процессора. А Unreal синхронизируется TSC счетчику, который зависит от частоты процессора.
Потестил Spectaculator, в нем синхронизация ведет себя точно также как и VBlank в ZXMAK2, т.е. используется привязка к видеокарте с ресэмплингом.
Чтобы посмотреть что там происходит, добавил в эмулятор рилтайм граф. Изменения с графом пока не чекинил, нужно еще потестить.
Получились интересные картинки, думаю многим будет любопытно на них взглянуть:
Дисплей 60 Гц, синхронизация VBlank (с ресэмплингом фреймов):
http://savepic.ru/6554608.png
Дисплей 60 Гц, синхронизация от звуковой карты:
http://savepic.ru/6561776.png
Данные на графе отражают время.
Красная полоса - это время регенерации дисплея.
Желтый цвет - это время между рендерингом фреймов изображения.
Зеленый цвет - время затраченное на эмуляцию фрейма, включая рендеринг в текстуру видеокарты и микширование звуковых потоков и запись результата в буфер драйвера звуковой платы
А вот какая картина на дисплее 75 Гц:
Дисплей 75 Гц, синхронизация VBlank (с ресэмплингом фреймов):
http://savepic.ru/6618098.png
Дисплей 75 Гц, синхронизация от звуковой карты:
http://savepic.ru/6617074.png
Выводы: ресэмплинг работает корректно и на 60 и на 75 Гц дисплеях. А при синхронизации от звуковой карты система кидает уведомления о достижении позиции проигрывания звука пачками, т.е. старается удерживать большой размер заполненного аудиобуфера. Из-за этого часть видео кадров обновляется быстро, а потом возникает пауза, пока не освободится достаточно много места в аудиобуфере. Отсюда и дрожание на плавных скролах
я не про встроенную ос веду речь, контроллер tr-dos подключается к +3 ровно как и к другим фирменным машинам
http://zx-pk.ru/market/viewtopic.php?f=7&t=790
цитирую:
/Конструктор BDI 2.0
Печатная плата и набор деталей для сборки контроллера BDI ( TR-DOS ) с разъемом ZX-BUS
Контроллер подходит:
1. Для всех фирменных компов ( Sinclair ZX-Spectrum 48, 48+, 128, +2, +2A/B, +3 )
/
на форуме есть люди которые пользуются.
и ещё есть DivIDE с поддержкой trdos и, о чудо, тоже работает на +2A, +3.
---------- Post added at 11:39 ---------- Previous post was at 11:36 ----------
ну в общем выше ответил уже
---------- Post added at 11:41 ---------- Previous post was at 11:39 ----------
лично использую trdos на +2A хоть и в составе DivIDE (тоже не мешало бы прикрутить). Пользователь ZX NOVOSIB, на сколько я помню использует +2B c аппаратным контроллером TR-DOS.
А что ему помешает работать? Порты не пересекаются, а при обращении к нужным адресам контроллер BDI подключит свой ром и всё.
По-моему главная и единственная причина того, что TR-DOS не пашет в эмуляции +2/+3, это то, что ром с TR-DOS вообще не предусмотрен в их маппинге. Тут бы какую-нибудь возможность для устройств добавлять свои ромы сделать. Без этого ни DivIDE, ни даже мультифейс проэмулировать не выйдет.
Надо эмулировать тр дос 2.0 или выбор версии сделать. ДИВ ИДЕ эмуляция тоже не помешала бы.
ZXMAK2 помню качал когда-то, эта прога мне кучу каких-то ошибок выдала, запустить не смог, короче слишком сложная и непонятная штука, этот ваш ZXMAK.
Относительно TR-DOS, могу сказать, что у меня +2B прекрасно работает с Beta Disk Interface. (брал у MV1971) И в том режиме когда ПЗУ подменяется, и с оригинальным ПЗУ.
C +3 ситуация, по слухам, такая: в режиме подмены ПЗУ - всё работает идеально. С оригинальным ПЗУ +3 - непонятки, есть данные, что работать - работает, но половина наших игрушек (со всякими заковыристыми интрами) не идёт. Но этот вопрос требует дальнейшего изучения! К сожалению пока нет желающих вплотную протестировать совместимость BDI и "+3 с оригинальным ПЗУ."
перекрасил рилтайм граф, добавил лимит 50 Гц (уже зачекинил изменения), теперь выглядит так :)
http://savepic.ru/6590334.png
Зеленый цвет - время между present frame (обновление на дисплее);
Красный - время затрачиваемое на эмуляцию кадра, обновление текстуры и аудиобуфера;
Желтая линия - период частоты дисплея
Сиреневая линия - период 50 Гц
---------- Post added at 19:07 ---------- Previous post was at 19:02 ----------
Так нужно было написать про ошибку, описать ее вместе с самим сообщением об ошибке из лога. Вот ты не написал, я об этом не узнал и ошибка так и продолжала существовать, пока ктото не заметил и не дал мне знать ;)
С времен "когда-то" прошло много времени, за это время много чего поменялось :wink:
а как должна работать подмена ROM устройствами? Если несколько устройств захотят одновременно подменить ROM как быть?
Тут возникает ситуация как с портами. Отслеживать конфликты сложно. Я думаю правильнее было-бы завести устройство порт-менеджер, через который другие устройства могут подписываться на порты. Соответственно вся логика портов в одном устройстве.
С ROM'ами видимо можно аналогично поступить - добавить в интерфейс MMU методы для замены ROM. Только пока не совсем понятно что именно требуется заменять?
Как вообще работает эта подмена ромов в DivIDE? Ром всегда подменяется или только по какомуто условию?
---------- Post added at 19:24 ---------- Previous post was at 19:22 ----------
или DirectX )))
На оригинальных компьютерах в область 0x0000-0x3fff при помощи специального сигнала на шине можно заблокировать сигнал выбора встроенного на плату ПЗУ, внешние устройства в момент чтения из памяти из этой области при активном сигнале, могу выставлять свои данные на шину, простейший случай - подставляют ПЗУ
Вот именно это поведение и проэмулировать. Если два устройства хотят выставить этот ROMCS, то срабатывает то, которое выше (ниже) в списке устройств.
Может даже так
Ну или тупо массив передавать в IMemoryDevice, если падение скорости будет значительным. Если у эмулируемого устройства больше 16к ПЗУ - пусть само пейджингом рулит.Код:var mem = bus_manager.FindDevice<IMemoryDevice>();
mem.SetROMCS(false, CustomRead0000); // отключили ПЗУ, вместо него все запросы чтения уходят делегату CustomRead0000
....
mem.SetROMCS(true); // включили ПЗУ обратно
Поглядел, кстати, шину - на +3 и +2A этого ROMCS нет. Вот и не работает бетадиск. Но там сходные сигналы есть на других пинах. Новодельный BDI вроде же на плисине, возможно, что проблема решается прошивкой.
http://velesoft.speccy.cz/other/zx_bus_video.png
ОтсюдаЦитата:
Сообщение от Velesoft
---------- Post added at 02:32 ---------- Previous post was at 02:15 ----------
Управляемо, там есть соответствующий порт.
Дока http://baze.au.com/divide/files/pgm_model.txt
для производительности лучше чтобы одно устройство памятью рулило. Для обычного спектрума понятно, но как быть в случае, если это какой-нибудь PENTEVO, АТМ или Scorpion PROF-ROM? У них уйма страниц пзу, в том числе и разные TRDOS. Когда подмена в таком случае должна работать?
Никак, оставить как есть. У них и устройства бетадиска свои, так что ничего не поломается :) А новый функционал реализовать только для классических спектрумов и их наследников.
Хотя вообще можно, наверное, по схеме логику проследить. Но непонятно, какие устройства к пентеве имеет смысл подключать. Бетадиск незачем, дивиде, мультифейс тоже. Разве что спектранет, у него тоже свое ПЗУ вроде есть. Не факт, впрочем, что он и на реальной пентеве заведется.
---------- Post added at 10:58 ---------- Previous post was at 10:54 ----------
Ну или да, реализовать менеджер ром-страниц с возможностью добавлять и переключать страницы извне. Все проблемы это решит, хоть решение и будет дальше от того, как работает железо.
Наконецто порезал эмулятор на части, теперь движок независим от реализации хоста, нет референсов на winforms или xna :v2_thumb: :v2_dizzy_roll:
В самом ZXMAK.exe остались только реализации устройств без каких-либо ссылок на winforms или xna :) Можно их тоже порезать на части :smile:
Реализации для разных платформ задаются в unity.config в отдельных контейнерах с именами соответствующими платформе. Сейчас это winforms или xna.
Какую платформу запускать по дефолту можно задать в том-же unity.config (переменная viewType). А можно задать через командную строку:
На самом деле эта опция просто перегружает значение viewType в unity.config :smile:Цитата:
ZXMAK2.exe /host:xna [<snapshot>]
Для добавления новой платформы нужно реализовать сборку с реализацией IMainView и IHost и добавить новый контейнер в unity.config, в котором прописать мапинг на реализацию. Остальные вью можно не добавлять, тогда их вызов будет просто игнорироваться (команды возвращают CanExecute()==false).
Вообще mainview нужно переписать, чтобы реюзать winforms для opengl, да и код mainpresenter/mainview получился кривоватый :)
Пока новый релиз не делал, но все изменения доступны в тфс :smile:
Заодно пофиксилась синхронизация звука в xna, теперь 50 Гц, правда стабильность синхронизации под XNA4 оставляет желать лучшего, но уже более-менее юзабельно, даже звук нормальный :)