Вход

Просмотр полной версии : ZXMAK2 - Виртуальная машина ZX Spectrum



Страницы : 1 2 3 4 5 [6] 7 8 9

palsw
07.11.2014, 14:28
ZXMAK, Жду с нетерпением - только мое железо pentium M 1600 коней двинуло.
пересел на P4 архитектуру - celeron 3,0 и видик radeon 7000 igp -еще тот тормоз .

sergio78
08.11.2014, 12:59
Если на какомто железе меньше, то что это за железо, если таблетка его уделывает :)

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

Eltaron
08.11.2014, 14:50
таблетку эту, через год по любому выкинешь.
А между тем детям, рожденным в год выхода первого iPad, в следующем году идти в первый класс. И где они, эти сдохшие айпады?


вот десктоп годами работает, на коленке чинится
У меня SATA-контроллер подох в южном мосту, одолжи коленку, а?

sergio78
08.11.2014, 17:56
У меня SATA-контроллер подох в южном мосту, одолжи коленку, а?
бог тебе в помощь вместо коленки, и алиекспресс. pcie надеюсь ещё не отвалился?

Eltaron
08.11.2014, 18:57
бог тебе в помощь вместо коленки, и алиекспресс. pcie надеюсь ещё не отвалился?
Он единственный и занят звуковухой.

sergio78
08.11.2014, 21:39
Он единственный и занят звуковухой.
звуковуху можно легко, поменять на usb. а sata контралёр, на usb вешается с весьма большими потерями скорости. если материнка так дорога душе и телу, а в чулане ничего нету для наколенной замены в системнике, может быть у знакомых чего ненужное отжать есть. в любом случае, попобираться лучше чем с нынешним курсом нормальных денег, скупать современный компьютерный хлам у наших федеральных барыг.

bakanovse
08.11.2014, 22:27
угу, и последний предел в 5 nm в 2020 году им под ребро.

Eltaron
08.11.2014, 22:37
звуковуху можно легко, поменять на usb. а sata контралёр, на usb вешается с весьма большими потерями скорости. если материнка так дорога душе и телу, а в чулане ничего нету для наколенной замены в системнике, может быть у знакомых чего ненужное отжать есть. в любом случае, попобираться лучше чем с нынешним курсом нормальных денег, скупать современный компьютерный хлам у наших федеральных барыг.
То есть когда у айпада дохнет аккум - это сразу "выкидывай таблетку", а когда нужно менять звуковуху на внешнюю, бегать покупать SATA-контроллер и обзванивать знакомых - это "чинится на коленке"? Ок :)

Для справки - аккум айпада стоит 700р и меняется за полчаса (на коленке, да). И дохнут аккумы не потому, что "так на заводе рассчитали", а потому, что Li-Ion в принципе дохнет со временем. Но триумф LiFePo4, которые служат годами без потери ёмкости, уже не за горами. Они уже прямо сейчас стоят всего в два раза больше Li-Ion сравнимых характеристик.

sergio78
08.11.2014, 23:06
То есть когда у айпада дохнет аккум - это сразу "выкидывай таблетку", а когда нужно менять звуковуху на внешнюю, бегать покупать SATA-контроллер и обзванивать знакомых - это "чинится на коленке"? Ок :)

Для справки - аккум айпада стоит 700р и меняется за полчаса (на коленке, да). И дохнут аккумы не потому, что "так на заводе рассчитали", а потому, что Li-Ion в принципе дохнет со временем. Но триумф LiFePo4, которые служат годами без потери ёмкости, уже не за горами. Они уже прямо сейчас стоят всего в два раза больше Li-Ion сравнимых характеристик. сейчас идёт сравнения хрена с пальцем. я не могу расковырять айпад. а с системником и одной отвёрткой действительно всё намного проще получается. мало того владельцев этого самого реального айпада, не особо много, да и они действительно ничего паяльником не тыкают, ибо элита. а тот ведроидный хлам, что у населения в массовом употреблении, почему то сплош и рядом либо с разбитым тачем в помойку летит, либо с дохлой батареей. и при этом колхозят перепайкой опять же единицы. а пк всю жизнь крутили сами, так и крутят до сих пор. ладно, хватит бодаться доводами и цепляться словами. есть деньги на планшет, идёшь и покупаешь этот огрызочный планшет и хвастаешься об этом на специальных ресурсах. нет денег, сидишь за старым компом дальше.

Eltaron
08.11.2014, 23:19
хватит бодаться доводами и цепляться словами
А может хватит разводить PC-некрофилию в непрофильных разделах? Нравится хлам с помойки за две копейки - пожалуйста, но зачем с таким настроем идти в .NET-ветку? Конструктива-то нуль.

ZXMAK
09.11.2014, 00:38
таблетку эту, через год по любому выкинешь. на это она на заводе специально рассчитывается. потому что, либо батарея вздуется, или потеряется почти вся ёмкость. ну или сдохнет, из за окисления шлейфа, отвала чипа, и тд и тп. а вот десктоп годами работает, на коленке чинится, и ещё 10 лет проработать может легко, в виду моря запчастей в чулане или на авито.

хз, таблетка на андроиде - nexus 10, у меня уже где-то полтора года, юзаю в slim чехле (http://www.yoobao.com/en/product.asp?b_id=126&m_id=244&a_id=686), чтобы не царапалась, беру с собой в путешествия, юзаю и зимой и летом. Чехол поцарапался и откололся кусок пластика (пластик в чехле неважный). Таблетка под ним как новенькая - царапин нет. Даже запах нового пластика под чехлом еще сохранился :)

Таблетке на win 8.1 скоро год, тоже самсунг, но качество сборки похуже чем у нексуса, но тоже нормально работает :smile:

sergio78
09.11.2014, 14:49
А может хватит разводить PC-некрофилию в непрофильных разделах? Нравится хлам с помойки за две копейки - пожалуйста, но зачем с таким настроем идти в .NET-ветку? Конструктива-то нуль.
похоже вы не заметили, что непрофильные петросянские посты о некрофилии вы развели сами. вопрос был всего лишь про возможность оптимизации, для ускорения работы эмулятора, ещё более некрофильного zx. айпад тоже к этой ветке не относится, так как .net - это win ПК платформа. к тому же вы не являетесь разработчиком данного эмулятора, поэтому конструктивы от вас тут тут точно так же ~0. давайте взаимно перестанем друг другу, что либо указывать.

---------- Post added at 15:49 ---------- Previous post was at 15:44 ----------


хз, таблетка на андроиде - nexus 10,
Таблетке на win 8.1 скоро год, тоже самсунг,
это дорогие, качественные вещи. к сожалению, у населения, в том числе и у меня на такие вещи денег нет. а всякие дигмы, престижио, тексеты, ритмиксы, и тд и тп, которые активно по рукам у нас расходятся, грешат мной описанными ранее проблемами, очень часто. стоит только 4pda почитать, и отзывы на сайтах магазинов.

ZXMAK
09.11.2014, 17:46
Некоторое время назад писали что Microsoft работает над новым компилятором, который даст возможность компилировать c++ и c# в нативный код, что позволит увеличить производительность до 60%.

---------- Post added at 16:46 ---------- Previous post was at 16:42 ----------


к тому же вы не являетесь разработчиком данного эмулятора, поэтому конструктивы от вас тут тут точно так же ~0.

Тут вы неправы, Eltaron тоже учавствовал в разработке эмулятора ;)

PS: вчера удалось запустить новый каркас эмулятора, прирост производительности от новой реализации z80 составил гдето 40%. Если старый движок на моей машине давал 588 fps, то новый дает 819 fps. Это прирост только за счет новой эмуляции z80, ula и memory те-же самые, только адаптированы к новому коду

sergio78
09.11.2014, 22:08
Тут вы неправы, Eltaron тоже учавствовал в разработке эмулятора ;)

Вам, как автору виднее. Где можно скачивать ночные сборки, можно меня пальцем ткнуть?

MetalliC
10.11.2014, 00:35
это дорогие, качественные вещи. к сожалению, у населения, в том числе и у меня на такие вещи денег нет.
меня всегда "умилял" такой взгляд на вещи.
то есть получается если у юзера нет денег на требуемое железо, либо же (что скорее всего) есть но жаба давит -- автор и так бесплатной софтины должен еще тратить свое время (равно деньги) на какие-то там оптимизации и хако-ускорялки, вместо того чтоб кодить или улучшать то, что ему действительно интересно, так чтоли ?

sergio78
10.11.2014, 10:51
меня всегда "умилял" такой взгляд на вещи.
то есть получается если у юзера нет денег на требуемое железо, либо же (что скорее всего) есть но жаба давит -- автор и так бесплатной софтины должен еще тратить свое время (равно деньги) на какие-то там оптимизации и хако-ускорялки, вместо того чтоб кодить или улучшать то, что ему действительно интересно, так чтоли ?

проехали,уже. давно всё переобсудили. сейчас только по теме дальше беседуем.

SAVC
20.11.2014, 01:02
Кнопки мыши поменяны местами
В режиме Scorpion 256 память при сбросе обнуляется ВСЯ - и RAM-диск вместе с ней
В оригинальном компьютере такого не происходит.

Gelip
24.11.2014, 20:38
I test new version ZXMAK2762-TEST i found synchronization problem while play some RZX files:
http://savepic.net/6238651.png

P.S. If you have the time, or could you add to emulate VI53 to clone "Byte48"?

Regards :v2_thumb:

Eltaron
24.11.2014, 21:48
I test new version ZXMAK2762-TEST i found synchronization problem while play some RZX files
RZX file should be played exactly on the same machine architecture as it was recorded. If you are using BYTE architecture - then this can be the problem. Try with classic ZX48 or ZX128.

Gelip
24.11.2014, 23:37
RZX file should be played exactly on the same machine architecture as it was recorded. If you are using BYTE architecture - then this can be the problem. Try with classic ZX48 or ZX128.
Yes. I use "Byte" emulation in ZXMAK2 but after switch to ZX48 still same problem. In Spectaculator no any problems with the same file.

File is Batty.rzx 50072

P.S. Spectaculator auto-switch to ZX128 and RZX file work OK. ZXMAK2 no auto-switch so display error but after manually switch to ZX128 still have error only in other time.

ZXMAK
26.11.2014, 02:14
Yes. I use "Byte" emulation in ZXMAK2 but after switch to ZX48 still same problem. In Spectaculator no any problems with the same file.

File is Batty.rzx 50072

P.S. Spectaculator auto-switch to ZX128 and RZX file work OK. ZXMAK2 no auto-switch so display error but after manually switch to ZX128 still have error only in other time.

yeah, it seems like something is going wrong, thanks for report, I will check it

palsw
02.12.2014, 12:19
есть такой вопрос или пожелание.
на примере Sprinter -можно подключить реальный дисковод и юзать реальную дискету?
Хочу перекинуть парочку прог на образ HDD - было бы удобно сразу записать нужные файлы на дискету и посмотреть как работает на реале и как в эмуляторе

Sayman
04.12.2014, 07:21
дискеты для спринтера это обычная fat12. обдирается прям в винде через winimage или winhex. есть утилита для монтирования образов дискет (почти вообще любых образов) OSF Mount. есть другое пожелание к эмулятору - прикрутить нормальную эмуляцию памяти спринтера и звук.

ZXMAK
23.12.2014, 05:46
Зарелизил для тестов новую версию ZXMAK 2.8.0.37486: https://zxmak2.codeplex.com/releases/view/437027

Много переделок в коде, но пока только малая часть задуманного :)
Перевел эмулятор на .NET4, протестируйте пожалуйста как работает под линуксом.

Есть много фиксов в эмуляции:
- Добавлен новый режим масштабирования SquarePixelSize (удерживает пикселы квадратными независимо от размера окна);
- Добавлен фильтр Mimic TV (типа симуляция scan lines);
- повышенная точность измерения rendering FPS;
- добавлено измерение update FPS;
- установка высокого приоритета во время ожидания vblank (для плавных скроллов)
- Исправлены tape traps (тут выкладывали tapetest.tap)
- Добавлена поддержка расширенного ROM 128K для модуля памяти ATM 4.50
- исправлен крэш в ULA ATM turbo (renderer crash issue)
- Добавлена версия для XNA4 (но пока включается только вручную через unity.config)
- добавлены файлы с маппингами клавиатуры (для XNA и DirectX, но пока они грузятся не из файла, а внедрены в виде ресурса в DLL, поэтому редактировать пока можно только через перекомпиляцию);
- логгер заменен на log4net, по дефолту логи пишутся в С:\Logs\, путь можно поменять в файле log4net.config, там-же можно включить консоль для отображения логов (но это поддерживается минимум с Windows 2000, поэтому в Win XP консоль работать не будет)
- Добавлен Unity Application Block для IoC, но пока реализовано наспех и коряво (слишком много кода и на момент реализации идея была еще не продумана). В дальнейшем под каждую платформу будут свои конфиги с маппингом view и общий конфиг для движка

PS: не рекомендуется включать Max Speed или VBlank Sync на машинах с одним ядром, в следующих версиях добавлю проверку

http://savepic.org/6740398.png

Sayman
23.12.2014, 06:39
ZXMAK, Кнопка Max Speed это хорошо, а как насчёт добавления нормальной (настраиваемой) кнопки турбо? А ещё - прикрутить звук к конфе Спринтера и исправить работу с кэш памятью?

ZXMAK
23.12.2014, 07:21
ZXMAK, Кнопка Max Speed это хорошо, а как насчёт добавления нормальной (настраиваемой) кнопки турбо? А ещё - прикрутить звук к конфе Спринтера и исправить работу с кэш памятью?

Для начала нужно код отрефакторить :)
Чтобы турбо программное сделать нужно цикл переделать, есть рабочая заготовка, но в текущем коде эмулятора сильно много кода и связей, нужно это пофиксить. переписал движок процессора, но прикрутить в существующем коде непросто. Кроме того модель вью переписать на mvvm, тогда легко будет новый ui прикручивать :)

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

Для запуска нужно 4 фреймворк установить. обнаружилось что для полной установки directx 9 на голой win xp всеравно нужно предварительно 2-й фреймворк поставить, иначе directx не устанавливает нужные библиотеки, даже если 4-й установлен - странно, похоже проще библиотеки от directx 9 вместе с эмулятором таскать.

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

s_kosorev
23.12.2014, 07:53
directx 9 вместе с эмулятором таскать.
Имхо стоит рассмотреть вариант переезда на SlimDX или SharpDX

Titus
23.12.2014, 11:01
PS: не рекомендуется включать Max Speed или VBlank Sync на машинах с одним ядром, в следующих версиях добавлю проверку

Докладываю.
WinXP, одно ядро.

Запускается очень медленно (даже по второму разу, когда либы нет.4 уже подгружены в память), секунд 5. Далее ОЧЕНЬ тормозит, да так, что невозможно войти в меню и снять эти галочки Max Speed или VBlank Sync (какая-то из них, видимо, стоит по умолчанию).

Gelip
23.12.2014, 12:08
Перевел эмулятор на .NET4, протестируйте пожалуйста как работает под линуксом.
OMG, only not .NET 4 :v2_dizzy_facepalm::v2_dizzy_facepalm::mad_std: :eek:
Please not use .NET 4 and back to max .NET 2.0. It is abnormal to install multiple megabytes of data just to run a small program of about 2MB :v2_dizzy_facepalm:

.NET 2.0 - 22MB
.NET 3.5 - 231MB
.NET 4.0 - 50MB

I do not use programs that use newer than the 2.0 versions of the .NET

Look at this abnormal example -> Xor Midi Control (http://java.xor.sk/?en=1&x=xor_midi_control). Program have - ATTENTION !!! only 96KB size but to run it need install about 230MB - ha, ha, ha, ha :v2_dizzy_tired2::v2_wacko::v2_conf3:

I'm sick of .NET, cluttering only my stable WinXP 64-bit!

Please back to old good .NET 2.0, otherwise I will not use any more ZXMAK2 :-(

ZXMAK
23.12.2014, 14:37
OMG, only not .NET 4 :v2_dizzy_facepalm::v2_dizzy_facepalm::mad_std: :eek:
Please not use .NET 4 and back to max .NET 2.0. It is abnormal to install multiple megabytes of data just to run a small program of about 2MB :v2_dizzy_facepalm:

.NET 2.0 - 22MB
.NET 3.5 - 231MB
.NET 4.0 - 50MB

I do not use programs that use newer than the 2.0 versions of the .NET

Look at this abnormal example -> Xor Midi Control (http://java.xor.sk/?en=1&x=xor_midi_control). Program have - ATTENTION !!! only 96KB size but to run it need install about 230MB - ha, ha, ha, ha :v2_dizzy_tired2::v2_wacko::v2_conf3:

I'm sick of .NET, cluttering only my stable WinXP 64-bit!

Please back to old good .NET 2.0, otherwise I will not use any more ZXMAK2 :-(

You don't need to install .net 2.0, 3.5 and 4.0, because 4.0 is enough. 2.0 is needed only to install several dll from the directx 9, but you can place these directx dll's into the emulator folder manually

---------- Post added at 13:37 ---------- Previous post was at 13:10 ----------

пока убрал из рекомендованых релизов, нужно будет потестить установку на голую систему и подложить dll'ки от directx

ZXMAK
24.12.2014, 08:36
Зарелизил версию 2.8.0.37493: https://zxmak2.codeplex.com/releases/view/459209

Учел проблемы с устновкой, добавил проверки и нужные сборки для DirectX в релиз, теперь эмулятор работает даже без DirectX :biggrin: Если нет DirectX 9, то изображения и звука естественно не будет, но можно юзать отладчик, смотреть состояние... :biggrin:

Что нового в релизе:
- исправлена поддержка расширенного пзу для ATM450;
- улучшено отображение имени страницы пзу в окне Memory Map (теперь номер страницы отображается всегда + имя);
- добавлена проверка количества процессоров, если процессор только один, то высокий приоритет при ожидании VBlank не включается;
- добавлена проверка поддержки ReadScanLine драйвером видеокарты, если не поддерживается, то вызов не делается и ожидания VBlank не будет;
- исправлено сохранение настройки VBlankSync (раньше не сохранялась)
- исправлена инициализация DirectX;
- добавлена загрузка раскладки клавиатуры из XML файла (имя файла указывается в unity.config)
- добавлены сборки DirectX необходимые для работы, теперь все что нужно это только .NET Framework 4.0 и обычный DirectX 9 (последовательность установки теперь не важна)

Отмечу также, что эмулятору нужен только .NET 4, остальные версии не нужно ставить, т.к. программы для второго фреймворка будут работать и под 4-ым.
В Windows 8, .NET 4 входит в состав операционной системы.

http://savepic.org/6695402.png

daniel
24.12.2014, 17:37
Как запустить режим +2A + TR-DOS?
Возможно ли прилепить +2 GRAY?

goodboy
24.12.2014, 18:14
Как запустить режим +2A + TR-DOS?
Возможно ли прилепить +2 GRAY?
+2a=+3
+2grey=128k

daniel
24.12.2014, 21:07
+2grey=128k
зачем же в спектакуляторе сделано отдельно? ну или пзу добавить.


+2a=+3
тыр дос не работает в таком режиме.

ZXMAK
25.12.2014, 00:59
зачем же в спектакуляторе сделано отдельно? ну или пзу добавить.


тыр дос не работает в таком режиме.


Я не знаю чем они отличаются, если есть информация выкладывай вместе с образом пзу, добавлю

Максагор
25.12.2014, 04:03
Ну что ж, теперь расширенное ПЗУ работает. Проверено на практике. Теперь смогу конструячить принципиально новые прошивки. Но дальше начинаются всякие "но":

Раньше я для эмуляции ATM использовал исключительно UNREAL, поэтому софт на ZXMAK2 не гонял. А тут, раз такие расклады пошли, позапускал (в режиме ATM-1). Из того, что сразу бросилось в глаза:

Известная демка "Personal Nightmare" не пошла. Она известна тем, что сама настраивается на АТМ1 или АТМ2+, причем сама определяет также, устранено перепутывание памяти при переходе в высокую графику или нет. В UNREAL она пошла во всех режимах 1,2+, с перепутывание ОЗУ и без оного. В ZXMAK пошла только в режиме 2+, а в АТМ-1 вывела заставочную надпись (без установки палитры!) и после начала загрузки, а точнее, в ее процессе, зависает, выводя мусор на экран.

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

Саму дему для опытов и вивисекции качать, если что, тут:
http://atmturbo.nedopc.com/download/trdos/demos/pn2/pn2.zip

Titus
25.12.2014, 04:13
- добавлена проверка количества процессоров, если процессор только один, то высокий приоритет при ожидании VBlank не включается;
- добавлена проверка поддержки ReadScanLine драйвером видеокарты, если не поддерживается, то вызов не делается и ожидания VBlank не будет;

Так же жутко тормозит на одноядернике, как и предыдущая версия. Невозможно даже войти в меню настроек.

Впечатление такое, что процесс врубает высокий приоритет и кушает все быстродействие.

ZXMAK
25.12.2014, 05:19
хм, ATM4.50 тяжко писалась и потестить особо не начем было, с ATM7.10 проще :)

А можешь проверить, дешифрация портов правильная для ATM4.50?
Вот как они выбираются в ZXMAK2:

#FE - маска адреса #0001, выборка #0000 (есть подозрение что маска неправильная)
#FB - маска адреса #0004, выборка #0000
#7FFD - маска адреса #8202, выборка #0200
#FDFD - маска адреса #8202, выборка #8000
#7DFD - маска адреса #8202, выборка #0000

Updated: попробовал отключить перепутывание памяти - дема заработала на ATM4.50, но с палитрой всеравно чтото не так...


---------- Post added at 04:19 ---------- Previous post was at 04:14 ----------


Так же жутко тормозит на одноядернике, как и предыдущая версия. Невозможно даже войти в меню настроек.

Впечатление такое, что процесс врубает высокий приоритет и кушает все быстродействие.

а что за одноядерник? При выключенной опции VBlankSync, тормозов быть не должно. На одноядерном процессоре повышение приоритета в цикле ожидания VBlank должно отключаться, но холостой цикл ожидания всеравно есть, поэтому эту опцию нужно отключать.

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

Опцию можно выключить не запуская эмулятор - через реестр,
ветка реестра: HKCU\Software\ZXMAK2
параметр: RenderVBlankSync
0 - выключено
1 - включено

daniel
25.12.2014, 09:27
Я не знаю чем они отличаются, если есть информация выкладывай вместе с образом пзу, добавлю

пзу можно брать здесь:
http://www.shadowmagic.org.uk/spectrum/roms.html

128 менюшка даже визуально разная у 128 и +2

---------- Post added at 09:27 ---------- Previous post was at 09:17 ----------

выбираю модель +2A. В басике
USR0
RANDOMIZE USR 15616

трдоса нет. хотя он выбран в настройках.

Titus
25.12.2014, 15:45
а что за одноядерник? При выключенной опции VBlankSync, тормозов быть не должно. На одноядерном процессоре повышение приоритета в цикле ожидания VBlank должно отключаться, но холостой цикл ожидания всеравно есть, поэтому эту опцию нужно отключать.

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

Это я прекрасно знаю, я же эмуляторописатель тоже)

Ты не придумал, а я придумал, и мы об этом даже где-то на форуме переписывались. Я делаю высокий приоритет, засыпаю на 1мс, просыпаюсь, смотрю, не достиг ли луч начала кадра, опять засыпаю на 1мс и т.д. В EmuStudio это работает очень устойчиво и совсем не жрет быстродействия (проверял на XP и 7).

ZXMAK
27.12.2014, 13:56
Ты не придумал, а я придумал, и мы об этом даже где-то на форуме переписывались. Я делаю высокий приоритет, засыпаю на 1мс, просыпаюсь, смотрю, не достиг ли луч начала кадра, опять засыпаю на 1мс и т.д. В EmuStudio это работает очень устойчиво и совсем не жрет быстродействия (проверял на XP и 7).

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

Так что всетаки за процессор?

Titus
27.12.2014, 14:49
такой вариант проверялся, желаемого результата он не дает, т.к. часто пропускает кадры, хоть и не все, но пропускает

Так что всетаки за процессор?

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

У меня проц T2300 1.6ГГц с одним ядром (второе отключено). Это ноутбучный проц, но стоит в десктопе.

abelenki
28.12.2014, 17:40
ZXMAK, спасибо за новую версию.

копирайт бы поправить на 2014. ;)

Alex Rider
28.12.2014, 21:46
копирайт бы поправить на 2014.
Так уж проще подождать 5 дней и поправить сразу на 2015.

ZXMAK
05.01.2015, 10:30
Обновил до версии 2.8.1.37646: https://zxmak2.codeplex.com/releases/view/574338

По функционалу больших изменений нет, т.к. изменения в основном в структуре кода.
Но кое-что пофиксил:
- исправлены подвисания на однопроцессорных системах при включении VBlank или Max Speed;
- исправлена обработка ошибок для XNA платформы;
- исправлена ошибка приводившая к крешу в окне настройки (заодно ускорилось открытие окна настроек);
- добавлены библиотеки XNA, чтобы не было ошибок если не установлен XNA;
- MACHINES.PAK заменен на machines.config, который содержит сразу все модели, для удобства редактирования;
- Немного переименованы файлы с раскладками клавиатуры;
- В конфигурации логгера теперь по дефолту включен вывод ошибок во всплывающую консоль (всплывает если возникнет ошибка), лог по дефолту также пишется в С:\Logs\ZXMAK2.log;
- Добавлена возможность задавать modelId, который будет использоваться при сохранении SZX снэпшотов. Пока можно задать только вручную в VMZ файле, дописав modelId="Sinclair128" у элемента Bus. Но модель для стандартных конфигураций уже устанавливается автоматом, см. machines.config;
- Проведен объемный рефакторинг кода по разрезке эмулятора на составные части, правда пока не до конца - engine и контролы в отдельную сборку пока не вынесены

Ну и вернул назад XNA реализацию, если не доступен WinForms, то будет предпринята попытка запуститься в XNA. Порядок, в каком производится попытка запуска можно задать в unity.config, в 52 строке. По дефолту стоит "WinForms, XNA", что значит вначале пробовать WinForms, а затем XNA. Можно прописать просто "XNA", тогда запуск всегда будет в режиме "XNA"

Titus
05.01.2015, 14:23
- исправлены подвисания на однопроцессорных системах при включении VBlank или Max Speed;

Да, теперь работает.
Хотя при первом нажатии на меню настроек (волшебную палочку) жестко тормозит секунд 5-7. При последующих всего 3. Почему так?

ZXMAK
05.01.2015, 20:51
Да, теперь работает.
Хотя при первом нажатии на меню настроек (волшебную палочку) жестко тормозит секунд 5-7. При последующих всего 3. Почему так?

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

Максагор
06.01.2015, 00:37
Но кое-что пофиксил:

Не разобрались, в чем проблема с запуском софта из-под АТМ-1?

Eltaron
06.01.2015, 02:36
Я думаю заменить это прописыванием всех доступных устройств в конфигурационном файле
Но всё-таки предусмотри тогда кнопочку "Обновить", которая будет актуализировать список доступных устройств ценой 5 секунд тормозов. А то плаг-эн-плей для плагинов поломается :)

ZXMAK
06.01.2015, 04:22
Не разобрались, в чем проблема с запуском софта из-под АТМ-1?

Нет, похоже эта дема определяет атм1 как атм2, но почему пока сложно сказать, загрузчик в ней тяжелый. Усугубляет ситуацию то, что точной информации по атм1 практически нет. Все что есть - это твоя страничка с кратким описанием. Но в ней не все сходится. Например нет информации как именно происходит выборка портов, например #FE и #7FFD, зависит ли это от режимов и в каких режимах они доступны. Разбирал декодировку портов в unreal, но там такая каша, что я удивлен что это вообще работает :)

По коду демы, там все грузится до 40-го вызовова в трдос, после возврата из которого в памяти нули вместо данных, отсюда и зависание
Отловить проблемное место можно так:
Ставим брейкпоинт на #80EF, запускаем дему, ждем точки останова.
Тут будет проблемный CALL #8144, заходим в него и шагаем до #816D, там будет CALL #3D13 в трдос.
Этот вызов назад уже не возвращается, т.к. в процессе его работы на одном из вызовов в озу, по адресу #5CC2 будут нули вместо кода.

Это както связано с перепутыванием памяти, т.к. если его выключить, то дема работает. Почему палитра не работает не разбирался, вероятно причина одна и таже - машина определяется как атм2, а не атм1, а там палитра уже по другому работает

Максагор
06.01.2015, 06:08
Например нет информации как именно происходит выборка портов, например #FE и #7FFD

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

ZXMAK
06.01.2015, 09:50
подебажил немного дему, оказалось запутывание памяти неправильно работало - не всю память запутывало :)

Зарелизил версию 2.8.2.37652: https://zxmak2.codeplex.com/releases/view/574368

Что нового:
- исправлено запутывание памяти для ATM 4.50 и переработан код маппинга памяти
- исправлено обновление в окне Memory Map (теперь обновляются и хардварные значения)
- исправлена ошибка при редактировании хардварных значений в Memory Map

http://savepic.ru/6525619.png

ZXMAK
06.01.2015, 18:59
Понял. На днях попробую уточнить описание выборки портов в соответствии со схемой, после чего отпишусь здесь.

Еще очень интересует что происходит в момент сброса? Какой видеорежим включается? что происходит с портами AFE и AFB?
И пожалуй самое интересное - видеорежимы выбираются двумя битами, но почему тогда видеорежимов 3, а не 4, Что происходит если включить недостающий (недокументированый) видеорежим?

ZXMAK
07.01.2015, 02:58
В последний релиз 2.8.2.37652 попала отладочная версия файла конфигурации логгера, в котором отключено логирование в файл и уровень сообщений для всплывания консоли с логами установлен на Debug.
В результате часто всплывала консоль с логами.
Чтобы консоль не мешала можно ее выключить или установить уровень сообщений для появления консоли на Warn или Error. Делается это в файле log4net.config:


<appender name="asyncAppender" type="ZXMAK2.Logging.Appenders.AsyncAppender, ZXMAK2.Logging" >
<appender-ref ref="rollingFile" />
<appender-ref ref="console" />
</appender>

<appender name="console" type="ZXMAK2.Logging.Appenders.ConsoleAppender, ZXMAK2.Logging">
<AllocMode value="Auto" />
<AutoLevel value="Warn" /> <!-- тут задается уровень для появления консоли -->


чтобы отключить консоль вообще, можно просто удалить или закоментировать строчку <appender-ref ref="console" />, например:


<appender name="asyncAppender" type="ZXMAK2.Logging.Appenders.AsyncAppender, ZXMAK2.Logging" >
<appender-ref ref="rollingFile" />
<!--<appender-ref ref="console" />-->
</appender>


Перезалил архив с исправленным конфигурационным файлом.

ZXMAK
07.01.2015, 22:54
Пофиксил обработку ошибок, оказалось что эмулятор прекрасно работает под Linux без Wine :)
Естественно без изображения и звука, т.к. DirectX недоступен, но можно отлаживать код в отладчике :D

http://savepic.ru/6561242.png

daniel
08.01.2015, 16:36
под win 8.1 ругается на direct x, так должно быть?

ZXMAK
09.01.2015, 04:17
под win 8.1 ругается на direct x, так должно быть?

Да, если DirectX 9 не установлен, то должен ругаться.

В голую win 8.1 входит только DirectX 11.2, который имеет совсем другую архитектуру и другие не совместимые с DirectX 9 интерфейсы. Можно сказать что DirectX до 9-ой версии включительно и DirectX 10 и старше - это совсем разные продукты. К тому-же DirectX 11 заточен под особые возможности новых видеокарт и старые видеокарты не поддерживает.

Поэтому DirectX 9 нужно устанавливать дополнительно, иначе DirectX 9 программы работать не будут. Ссылка на последнюю версию DirectX 9 можно найти на странице загрузки эмулятора

DirectX 9 (June 2010):
Standalone (98MB) - http://www.microsoft.com/en-us/download/details.aspx?id=8109
Web Installer (286KB + online) - http://www.microsoft.com/en-us/download/details.aspx?id=35

При установке DirectX не забываем отключить галочку установки Bing Bar, иначе внагрузку получите ненужный плагин к браузеру. :)

Я тестировал эмулятор под win 8.1, все работает отлично.
Все что нужно эмулятору на голой win 8.1 из коробки - это только DirectX 9 (June 2010):

http://savepic.ru/6556816.png

daniel
09.01.2015, 08:05
Поэтому DirectX 9 нужно устанавливать дополнительно, иначе DirectX 9 программы работать не будут.

старые демки под dx9 работают без проблем. Какие dllки используются, может достаточно их установить, чтобы весь пакет не ставить? Почему такая жёсткая привязка к DX9?

SoftLight
09.01.2015, 12:43
Я тестировал эмулятор под win 8.1, все работает отлично.
Все что нужно эмулятору на голой win 8.1 из коробки - это только DirectX 9 (June 2010)

На win 8.1 x64 полет эмулятора нормальный, но действительно нужно ставить по ссылке DirectX9 причем не runtime а именно SDK комплект. Когда я ставил чисто runtime эмулятор сообщал что DirectX9 не установлен.

Titus
09.01.2015, 13:12
Я тестировал эмулятор под win 8.1, все работает отлично.

Интересные у тебя сканлайны) Повторяют половину яркости цвета бумаги, а цвет чернил не трогают? Или как?

ZXMAK
09.01.2015, 20:37
Интересные у тебя сканлайны) Повторяют половину яркости цвета бумаги, а цвет чернил не трогают? Или как?

не, сканлайны - это маска на изображении, поэтому и ink и paper затрагивает :smile:

Titus
09.01.2015, 20:46
не, сканлайны - это маска на изображении, поэтому и ink и paper затрагивает :smile:

Что за маска? По какому алгоритму?

ZXMAK
09.01.2015, 20:49
старые демки под dx9 работают без проблем. Какие dllки используются, может достаточно их установить, чтобы весь пакет не ставить? Почему такая жёсткая привязка к DX9?

SDK не нужен, достаточно runtime. Я приводил выше ссылки на инсталляцию только runtime. Нужен Direct3D от DirectX 9 за Июнь 2010.

От привязки к Direct3D9 не избавишься, потому что если использовать Direct3D11, то работать будет только на Vista/Seven/8. Интерфейс Direct3D11 совсем другой, в нем много проблем, да и под простую графику он не особо пригоден, т.к. заточен на шрейдеры и т.п.
Требование именно этой версии Direct3D9, оттого что Managed DirectX ссылается на нее. Привязываются ли другие обертки именно к этой версии или другой не знаю, но не вижу в этой привязки особой проблемы, т.к. это последняя версия DirectX 9 и новых не будет, поэтому лучше ее установить.

Поэтому тут выбор - либо использвать Direct3D9 и тогда работать будет на всех системах. Либо Direct3D11, но тогда работать будет только на Windows Vista/Seven/8 и будет много проблем.

Если демки не используют Direct3D, то возможно и на DirectX 11 заработают, тут нужно разбираться.

Titus
09.01.2015, 20:56
SDK не нужен, достаточно runtime. Я приводил выше ссылки на инсталляцию только runtime. Нужен Direct3D от DirectX 9 за Июнь 2010.

Т.е. DX9 выпилили из официального пака начиная с Win8.1? А как же куча старых прог, которые под это заточены? Или они обычному пользователю сразу пишут - поставьте DX9?

ZXMAK
09.01.2015, 21:01
Т.е. DX9 выпилили из официального пака начиная с Win8.1? А как же куча старых прог, которые под это заточены? Или они обычному пользователю сразу пишут - поставьте DX9?

Не выпилили, там его изначально не было. Начиная с DirectX 10 полностью сменили интерфейс DirectX 9. А в Windows Vista/Seven/8 полный DirectX не входит, только DirectX 11.
Все игры, которые используют DirectX 9, устанавливают его при установке.

Titus
09.01.2015, 21:03
Не выпилили, там его изначально не было. Начиная с DirectX 10 полностью сменили интерфейс DirectX 9. А в Windows Vista/Seven/8 полный DirectX не входит, только DirectX 11.
Все игры, которые используют DirectX 9, устанавливают его при установке.

Я свой эмуль запускал под семеркой - он работает сразу. И другие не жаловались. А он под DX, правда не 9, а может более раннюю версию.

ZXMAK
09.01.2015, 21:18
Что за маска? По какому алгоритму?

Да никакого алгоритма, просто маска :smile:
В маске полупрозрачные горизонтальные полоски между пикселами, а область самих пикселов прозрачная.
В результате на месте этих полосок яркость пиксела снижена.

---------- Post added at 20:05 ---------- Previous post was at 20:04 ----------


Я свой эмуль запускал под семеркой - он работает сразу. И другие не жаловались. А он под DX, правда не 9, а может более раннюю версию.

а ты уверен что он Direct3D использует, а не DirectDraw? Изменения архитектуры интерфейса связаны именно с Direct3D.

---------- Post added at 20:18 ---------- Previous post was at 20:05 ----------

Я сейчас разрезаю движок на части чтобы не было кросс зависимостей. Также нужно будет реализовать MVVM вместо кривого MVP.
После этого хочу добавить хост OpenGL/OpenAL на базе OpenTK с тем-же WinForms интерфейсом (который на Linux уже и так работает без wine). Пока не разбирался с OpenTK, но по идее его можно будет запускать и на Windows и на Linux (без wine). А заюзать OpenGL вместо DirectX в той-же реализации интерфейса на WinForms выглядит не так сложно, в OpenGL есть контрол GLControl для WinForms. Т.е. можно просто на нем реализовать RenderVideo контрол и все :)

Titus
09.01.2015, 21:27
а ты уверен что он Direct3D использует, а не DirectDraw? Изменения архитектуры интерфейса связаны именно с Direct3D.

Блин, точно)
А какие версии DirectDraw поддерживаются везде?

ZXMAK
09.01.2015, 21:35
Блин, точно)
А какие версии DirectDraw поддерживаются везде?

за DirectDraw не знаю, от него уже давно отказались. Но видимо поддержка для существующих програм еще присутствует.

Кстати была идея сделать еще RGB маску пикселей таким-же способом, чтобы изображение было похоже на маску цветной ЭЛТ.

http://upload.wikimedia.org/wikipedia/commons/thumb/0/04/CRT_pixel_array.jpg/220px-CRT_pixel_array.jpg

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

Titus
09.01.2015, 21:48
за DirectDraw не знаю, от него уже давно отказались. Но видимо поддержка для существующих програм еще присутствует.

Но, однако DD - это универсальная штуковина для 2D графики, и, самое главное, она есть во всех виндах по умолчанию. Это очень важно для универсальных программ типа эмулей.

Eltaron
09.01.2015, 21:59
Но, однако DD - это универсальная штуковина для 2D графики, и, самое главное, она есть во всех виндах по умолчанию.
Однажды тянуть его за собой станет слишком накладно, и выпилят. Так же, как большую часть досовской подсистемы выпилили при переходе на NT.

ZXMAK
09.01.2015, 22:30
Но, однако DD - это универсальная штуковина для 2D графики, и, самое главное, она есть во всех виндах по умолчанию. Это очень важно для универсальных программ типа эмулей.

Возможно поддержка старых программ пока еще есть, но поддержки разработки под DirectDraw уже давно нет. Смысла воевать и тратить кучу времени на DirectDraw нет, этот интерфейс мертв уже более 10 лет. К тому-же на Linux он работать точно не будет.

Direct3D работает отлично, тратить время на поддержку старючего и давно мертвого DirectDraw, только для того, чтобы не нужно было устанавливать DirectX нет никакого смысла. Более целесообразно было бы вообще отказаться от DirectX, но реализация на нем работает очень хорошо.

Titus
09.01.2015, 22:31
Однажды тянуть его за собой станет слишком накладно, и выпилят. Так же, как большую часть досовской подсистемы выпилили при переходе на NT.

Если б было целесообразно, выпилили бы уже в вин7/8. А раз оставили, значит слишком больше число программ написано под него.

---------- Post added at 23:31 ---------- Previous post was at 23:30 ----------


Возможно поддержка старых программ пока еще есть, но поддержки разработки под DirectDraw уже давно нет. Смысла воевать и тратить кучу времени на DirectDraw нет, этот интерфейс мертв уже более 10 лет. К тому-же на Linux он работать точно не будет.

Линукс меня пока что мало интересует.

А что будет работать от XP до 8.1 безо всяких патчей и предустановок? Кроме GDI, которая является изрядным тормозом.

ZXMAK
09.01.2015, 22:45
Линукс меня пока что мало интересует.

А что будет работать от XP до 8.1 безо всяких патчей и предустановок? Кроме GDI, которая является изрядным тормозом.

DirectX 9 будет работать. Установка занимает 1-2 минуты. Воевать и пытаться прикрутить мертвый DirectDraw, поддержки которого нет уже лет 10 я не буду :smile:
Гораздо интереснее cделать поддержку Linux

Titus
09.01.2015, 22:58
DirectX 9 будет работать. Установка занимает 1-2 минуты. Воевать и пытаться прикрутить мертвый DirectDraw, поддержки которого нет уже лет 10 я не буду :smile:
Гораздо интереснее cделать поддержку Linux

Фраза 'установка займет' не входит число искомых величин моего вопроса)

ZEman
10.01.2015, 13:09
про DirectDraw уже можно смело забыть, он и так уже практически не поддерживается многие эмуляторы (винплюс, klive, kega fusion...) испытывают серьёзные проблемы под восьмёркой.
скоро выйдет windows 10 на замену с треском провалившейся восьмёрке, там говорят DirectDraw не будет поддерживаться.

Titus
10.01.2015, 13:12
про DirectDraw уже можно смело забыть, он и так уже практически не поддерживается многие эмуляторы (винплюс, klive, kega fusion...) испытывают серьёзные проблемы под восьмёркой.
скоро выйдет windows 10 на замену с треском провалившейся восьмёрке, там говорят DirectDraw не будет поддерживаться.

Что за проблемы? Это слишком общие слова.

'Говорят' - это еще вовсе не точно)

ZEman
10.01.2015, 13:21
в полноэкранный режим попробуй перевести эти эмуляторы, некоторые крашатся, некоторые выдают кислотную палитру (вообще таких эмуляторов довольно много, особенно стареньких).

ZXMAK, правильно делает что отказывается от DirectDraw, незачем некрофилией заниматься, кроме протухшего зомби ничего не получится.

Titus
10.01.2015, 13:28
в полноэкранный режим попробуй перевести эти эмуляторы, некоторые крашатся, некоторые выдают кислотную палитру (вообще таких эмуляторов довольно много, особенно стареньких).

Я пока ориентируюсь на свой эмуль. Он запускается на всех виндах, и в полноэкранном, и в окне. И запускается мгновенно.

ZXMAK
10.01.2015, 14:22
Я пока ориентируюсь на свой эмуль. Он запускается на всех виндах, и в полноэкранном, и в окне. И запускается мгновенно.


Так в чем проблема, исходники доступны, реализуй IHostVideo интерфейс, который в контрол winforms рисуется, я добавлю и буду поддерживать. Интерфейс проще некуда - два метода PushFrame и WaitFrame. Первый получает IVideoData содержащий размеры изображения, вертикальный масштаб и буфер в формате 32 битного цвета. У второго вообще нет параметров. Сделаешь для DirectDraw, будет хост и под него :)

Я вот какраз только добавил возможность выбора хоста через командную строку:

/host:xna - для использования xna хоста
/host:winforms - для использования Direct3D хоста
Собираюсь еще добавить opengl, будет чтото вроде такого:

/host:opengl

Titus
10.01.2015, 14:28
Сделаешь для DirectDraw, будет хост и под него :)
Твой эмуль тяжел для XP-систем из-за .NET.
Первичный запуск всегда тормозной (а это актуально, когда хочется кликнуть на какой-нить .SNA и сразу его запустить).
Да и вызов менюшки пока тоже тормозной.

daniel
10.01.2015, 14:54
TR-DOS под конфигурацией +2A/+3 так и не работает. Надо бы пофиксить.

ZEman
10.01.2015, 15:28
Titus, ну незнаю, у меня почти мгновенно открываются и снапшоты и менюшки, задержка максимум в пол-секунды, что не критично.
видимо у тебя слабое железо в компе используется.

у меня: Intel core i5 3570 - 3.40 Ghz, 16GB memory, Nvidia GTX 760, Windows 7 x64 ultimate.

zebest
10.01.2015, 15:43
TR-DOS под конфигурацией +2A/+3
+2 ну как бы по определению с магнитофоном, а +3 - там вовсе не тырдос.
а так да, не работает, хоть и заявлено +3

Titus
10.01.2015, 17:47
Titus, ну незнаю, у меня почти мгновенно открываются и снапшоты и менюшки, задержка максимум в пол-секунды, что не критично.
видимо у тебя слабое железо в компе используется.

у меня: Intel core i5 3570 - 3.40 Ghz, 16GB memory, Nvidia GTX 760, Windows 7 x64 ultimate.

Core2 Duo, 1Gb, WinXP SP3.

При этом у тебя по умолчанию стоит .NET, и даже наверное закешировано до запуска эмулятора каким-нибудь ранее запущенным .NET процессом.

ZXMAK
10.01.2015, 20:32
Твой эмуль тяжел для XP-систем из-за .NET.
Первичный запуск всегда тормозной (а это актуально, когда хочется кликнуть на какой-нить .SNA и сразу его запустить).
Да и вызов менюшки пока тоже тормозной.


так это не проблема :smile:
При первом запуске происходит компиляция дотнет кода в нативный код на лету, поэтому первое выполнение кода будет немного медленее чем повторные.

Но это решается генерацией нативного образа и помещением его в кэш. Тогда при запуске будет сразу запускаться заранее скомпилированный образ :)

Делается это так:


ngen.exe install ZXMAK2.exe


для удаления из кэша:


ngen.exe uninstall ZXMAK2.exe


ngen.exe установлен в папке C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen .exe

Хм, только тут есть подводный камень, сейчас не все сборки референсятся из ZXMAK2.exe, поэтому это нужно проделывать со всеми сборками которые прописаны в unity.config
Ок, в следующей версией положу батник который все файлы будет компилить

Titus
10.01.2015, 20:46
Хм, только тут есть подводный камень, сейчас не все сборки референсятся из ZXMAK2.exe, поэтому это нужно проделывать со всеми сборками которые прописаны в unity.config

А почему нельзя попростому? Запустил и все? Почему раньше это было так просто, а чем 'совершеннее' становятся системы, так все сложнее и/или медленнее? )

ZXMAK
10.01.2015, 20:55
TR-DOS под конфигурацией +2A/+3 так и не работает. Надо бы пофиксить.

Помоему TRDOS не совместим с +2A/+3, поэтому он никак не будет там работать

---------- Post added at 19:52 ---------- Previous post was at 19:50 ----------


А почему нельзя попростому? Запустил и все? Почему раньше это было так просто, а чем 'совершеннее' становятся системы, так все сложнее и/или медленнее? )

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

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

CodeMaster
10.01.2015, 21:11
у меня: Intel core i5 3570 - 3.40 Ghz, 16GB memory

Превышение ТТХ эмулируемой системы по процессору в 1000-8000 раз, по памяти 125000 раз ;-) Надо бы и о "простых" людях подумать :-)

ZXMAK
10.01.2015, 21:14
Превышение ТТХ эмулируемой системы по процессору в 1000-8000 раз, по памяти 125000 раз ;-) Надо бы и о "простых" людях подумать :-)

так ведь и эмуляция идет не на уровне кода, а ближе к эмуляции схемы. Попробуй запусти на супермощном компе эмуляцию схемы со всеми сигналами и т.п. ;) Я скажу больше, для точной синхронизации видео, мощности у такого процессора особо никакой нет. Сказываются недостатки отсутствия уведомлений о начале развертки у видеокарт. Поэтому сравнение некорректное.
Основные пожиратели процессора - это графика и звук. Есть возможность для некоторой оптимизации.

CodeMaster
10.01.2015, 21:28
так ведь и эмуляция идет не на уровне кода, а ближе к эмуляции схемы.

Т.е. если взять проект спектрума на FPGA и проэмулировать его софтово, то вот такая система это минимум требуемого?


Основные пожиратели процессора - это графика и звук.

Надо использовать возможности GPU видеокарты по распределённым вычислениям.

Eltaron
10.01.2015, 21:33
Надо использовать возможности GPU видеокарты по распределённым вычислениям.
Толку-то, алгоритмы непараллелящиеся.

Titus
10.01.2015, 22:08
Но по большому счету это не нужно, на мой взгляд скорость запуска и так вполне нормальная

Ну да, 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 и проэмулировать его софтово, то вот такая система это минимум требуемого?

Если эмулировать FPGA в реальном времени - это никакой бытовой комп не справится.

ZXMAK
11.01.2015, 01:25
Ну да, 5 секунд - ниче так скорость)

---------- Post added at 23:06 ---------- Previous post was at 23:03 ----------



В ZXMak'е явно не на уровне транзисторов эмуляция)
Скорее на уровне циклов.


в 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 Гц дисплеях. А при синхронизации от звуковой карты система кидает уведомления о достижении позиции проигрывания звука пачками, т.е. старается удерживать большой размер заполненного аудиобуфера. Из-за этого часть видео кадров обновляется быстро, а потом возникает пауза, пока не освободится достаточно много места в аудиобуфере. Отсюда и дрожание на плавных скролах

Titus
11.01.2015, 01:38
Как ты вычисляешь точное время, по какому таймеру?

---------- Post added at 02:38 ---------- Previous post was at 02:37 ----------


А Unreal синхронизируется TSC счетчику, который зависит от частоты процессора.

Да, этот счетчик в современных реалиях применять уже не кошерно.

Но кроме него вроде и нет мелкозернистых таймеров.

ZXMAK
11.01.2015, 01:53
Как ты вычисляешь точное время, по какому таймеру?

---------- Post added at 02:38 ---------- Previous post was at 02:37 ----------



Да, этот счетчик в современных реалиях применять уже не кошерно.

Но кроме него вроде и нет мелкозернистых таймеров.

в ZXMAK2 время замеряется по системному таймеру (тот что у материнской платы), на моей системе он работает с частотой 2742900 Гц. Т.е. точность измерения 0,000000365 сек (365 наносекунд) или 36572 тиков между кадрами на 75 Гц дисплее

Titus
11.01.2015, 02:14
в ZXMAK2 время замеряется по системному таймеру (тот что у материнской платы), на моей системе он работает с частотой 2742900 Гц. Т.е. точность измерения 0,000000365 сек (365 наносекунд) или 36572 тиков между кадрами на 75 Гц дисплее

Это как к нему обращаться корректно через винду?

ZXMAK
11.01.2015, 02:32
Это как к нему обращаться корректно через винду?

QueryPerformanceCounter / QueryPerformanceFrequency

daniel
11.01.2015, 11:41
+2 ну как бы по определению с магнитофоном, а +3 - там вовсе не тырдос.
а так да, не работает, хоть и заявлено +3

я не про встроенную ос веду речь, контроллер 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 ----------


Помоему TRDOS не совместим с +2A/+3, поэтому он никак не будет там работать
ну в общем выше ответил уже

---------- Post added at 11:41 ---------- Previous post was at 11:39 ----------

лично использую trdos на +2A хоть и в составе DivIDE (тоже не мешало бы прикрутить). Пользователь ZX NOVOSIB, на сколько я помню использует +2B c аппаратным контроллером TR-DOS.

Eltaron
11.01.2015, 12:05
А фирменный BDI с +3 по идее не работает там свой дос.
А что ему помешает работать? Порты не пересекаются, а при обращении к нужным адресам контроллер BDI подключит свой ром и всё.
По-моему главная и единственная причина того, что TR-DOS не пашет в эмуляции +2/+3, это то, что ром с TR-DOS вообще не предусмотрен в их маппинге. Тут бы какую-нибудь возможность для устройств добавлять свои ромы сделать. Без этого ни DivIDE, ни даже мультифейс проэмулировать не выйдет.

daniel
11.01.2015, 12:50
Надо эмулировать тр дос 2.0 или выбор версии сделать. ДИВ ИДЕ эмуляция тоже не помешала бы.

ZX_NOVOSIB
11.01.2015, 19:08
ZXMAK2 помню качал когда-то, эта прога мне кучу каких-то ошибок выдала, запустить не смог, короче слишком сложная и непонятная штука, этот ваш ZXMAK.

Относительно TR-DOS, могу сказать, что у меня +2B прекрасно работает с Beta Disk Interface. (брал у MV1971) И в том режиме когда ПЗУ подменяется, и с оригинальным ПЗУ.

C +3 ситуация, по слухам, такая: в режиме подмены ПЗУ - всё работает идеально. С оригинальным ПЗУ +3 - непонятки, есть данные, что работать - работает, но половина наших игрушек (со всякими заковыристыми интрами) не идёт. Но этот вопрос требует дальнейшего изучения! К сожалению пока нет желающих вплотную протестировать совместимость BDI и "+3 с оригинальным ПЗУ."

ZXMAK
11.01.2015, 20:07
перекрасил рилтайм граф, добавил лимит 50 Гц (уже зачекинил изменения), теперь выглядит так :)

http://savepic.ru/6590334.png

Зеленый цвет - время между present frame (обновление на дисплее);

Красный - время затрачиваемое на эмуляцию кадра, обновление текстуры и аудиобуфера;

Желтая линия - период частоты дисплея

Сиреневая линия - период 50 Гц

---------- Post added at 19:07 ---------- Previous post was at 19:02 ----------


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

Так нужно было написать про ошибку, описать ее вместе с самим сообщением об ошибке из лога. Вот ты не написал, я об этом не узнал и ошибка так и продолжала существовать, пока ктото не заметил и не дал мне знать ;)
С времен "когда-то" прошло много времени, за это время много чего поменялось :wink:

Titus
11.01.2015, 20:13
Так нужно было написать про ошибку, описать ее вместе с самим сообщением об ошибке из лога. Вот ты не написал, я об этом не узнал и ошибка так и продолжала существовать, пока ктото не заметил и не дал мне знать ;)

Подозреваю, что этой ошибкой было отсутствие .NET в системе)

ZXMAK
11.01.2015, 20:24
А что ему помешает работать? Порты не пересекаются, а при обращении к нужным адресам контроллер BDI подключит свой ром и всё.
По-моему главная и единственная причина того, что TR-DOS не пашет в эмуляции +2/+3, это то, что ром с TR-DOS вообще не предусмотрен в их маппинге. Тут бы какую-нибудь возможность для устройств добавлять свои ромы сделать. Без этого ни DivIDE, ни даже мультифейс проэмулировать не выйдет.

а как должна работать подмена ROM устройствами? Если несколько устройств захотят одновременно подменить ROM как быть?

Тут возникает ситуация как с портами. Отслеживать конфликты сложно. Я думаю правильнее было-бы завести устройство порт-менеджер, через который другие устройства могут подписываться на порты. Соответственно вся логика портов в одном устройстве.
С ROM'ами видимо можно аналогично поступить - добавить в интерфейс MMU методы для замены ROM. Только пока не совсем понятно что именно требуется заменять?

Как вообще работает эта подмена ромов в DivIDE? Ром всегда подменяется или только по какомуто условию?

---------- Post added at 19:24 ---------- Previous post was at 19:22 ----------


Подозреваю, что этой ошибкой было отсутствие .NET в системе)

или DirectX )))

s_kosorev
11.01.2015, 20:39
Только пока не совсем понятно что именно требуется заменять?
На оригинальных компьютерах в область 0x0000-0x3fff при помощи специального сигнала на шине можно заблокировать сигнал выбора встроенного на плату ПЗУ, внешние устройства в момент чтения из памяти из этой области при активном сигнале, могу выставлять свои данные на шину, простейший случай - подставляют ПЗУ

Eltaron
12.01.2015, 00:32
а как должна работать подмена ROM устройствами? Если несколько устройств захотят одновременно подменить ROM как быть?


На оригинальных компьютерах в область 0x0000-0x3fff при помощи специального сигнала на шине можно заблокировать сигнал выбора встроенного на плату ПЗУ, внешние устройства в момент чтения из памяти из этой области при активном сигнале, могу выставлять свои данные на шину, простейший случай - подставляют ПЗУ
Вот именно это поведение и проэмулировать. Если два устройства хотят выставить этот ROMCS, то срабатывает то, которое выше (ниже) в списке устройств.

Может даже так


var mem = bus_manager.FindDevice<IMemoryDevice>();
mem.SetROMCS(false, CustomRead0000); // отключили ПЗУ, вместо него все запросы чтения уходят делегату CustomRead0000
....
mem.SetROMCS(true); // включили ПЗУ обратно

Ну или тупо массив передавать в IMemoryDevice, если падение скорости будет значительным. Если у эмулируемого устройства больше 16к ПЗУ - пусть само пейджингом рулит.

Поглядел, кстати, шину - на +3 и +2A этого ROMCS нет. Вот и не работает бетадиск. Но там сходные сигналы есть на других пинах. Новодельный BDI вроде же на плисине, возможно, что проблема решается прошивкой.

http://velesoft.speccy.cz/other/zx_bus_video.png


Original BETADISK and all Czech BETADISC clones is designed for ZX48 or 128/+2(no +2A) only. BETADISK detect only bit D4 of port #7FFD = enable trdos if 48rom is set (D4=1). ZX48 use only 48 rom = work correct after switching to 48mode. On ZX128 and +2(grey model) work also without problem.

+2A/+2B and +3 machines use different ZX bus pinout and use two singals ROMOE1 and ROMOE2. This bus also absent next signals as 9V etc.... If you connect original BETADISC to +2A, then ZX will destroyed - romcs signal from betadisc will on +2A ignored and trdos rom will collide with +2A rom of RAM memory of with ULA (if you set allram mode)

Отсюда (http://zx-pk.ru/showpost.php?p=212164&postcount=13)

---------- Post added at 02:32 ---------- Previous post was at 02:15 ----------


Как вообще работает эта подмена ромов в DivIDE? Ром всегда подменяется или только по какомуто условию?
Управляемо, там есть соответствующий порт.
Дока http://baze.au.com/divide/files/pgm_model.txt

ZXMAK
12.01.2015, 08:21
Вот именно это поведение и проэмулировать. Если два устройства хотят выставить этот ROMCS, то срабатывает то, которое выше (ниже) в списке устройств.

Может даже так


var mem = bus_manager.FindDevice<IMemoryDevice>();
mem.SetROMCS(false, CustomRead0000); // отключили ПЗУ, вместо него все запросы чтения уходят делегату CustomRead0000
....
mem.SetROMCS(true); // включили ПЗУ обратно

Ну или тупо массив передавать в IMemoryDevice, если падение скорости будет значительным. Если у эмулируемого устройства больше 16к ПЗУ - пусть само пейджингом рулит.

для производительности лучше чтобы одно устройство памятью рулило. Для обычного спектрума понятно, но как быть в случае, если это какой-нибудь PENTEVO, АТМ или Scorpion PROF-ROM? У них уйма страниц пзу, в том числе и разные TRDOS. Когда подмена в таком случае должна работать?

Eltaron
12.01.2015, 08:58
для производительности лучше чтобы одно устройство памятью рулило. Для обычного спектрума понятно, но как быть в случае, если это какой-нибудь PENTEVO, АТМ или Scorpion PROF-ROM? У них уйма страниц пзу, в том числе и разные TRDOS. Когда подмена в таком случае должна работать?
Никак, оставить как есть. У них и устройства бетадиска свои, так что ничего не поломается :) А новый функционал реализовать только для классических спектрумов и их наследников.

Хотя вообще можно, наверное, по схеме логику проследить. Но непонятно, какие устройства к пентеве имеет смысл подключать. Бетадиск незачем, дивиде, мультифейс тоже. Разве что спектранет, у него тоже свое ПЗУ вроде есть. Не факт, впрочем, что он и на реальной пентеве заведется.

---------- Post added at 10:58 ---------- Previous post was at 10:54 ----------

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

ZXMAK
12.01.2015, 10:29
Наконецто порезал эмулятор на части, теперь движок независим от реализации хоста, нет референсов на winforms или xna :v2_thumb: :v2_dizzy_roll:

В самом ZXMAK.exe остались только реализации устройств без каких-либо ссылок на winforms или xna :) Можно их тоже порезать на части :smile:

Реализации для разных платформ задаются в unity.config в отдельных контейнерах с именами соответствующими платформе. Сейчас это winforms или xna.
Какую платформу запускать по дефолту можно задать в том-же unity.config (переменная viewType). А можно задать через командную строку:


ZXMAK2.exe /host:xna [<snapshot>]

На самом деле эта опция просто перегружает значение viewType в unity.config :smile:

Для добавления новой платформы нужно реализовать сборку с реализацией IMainView и IHost и добавить новый контейнер в unity.config, в котором прописать мапинг на реализацию. Остальные вью можно не добавлять, тогда их вызов будет просто игнорироваться (команды возвращают CanExecute()==false).
Вообще mainview нужно переписать, чтобы реюзать winforms для opengl, да и код mainpresenter/mainview получился кривоватый :)

Пока новый релиз не делал, но все изменения доступны в тфс :smile:

Заодно пофиксилась синхронизация звука в xna, теперь 50 Гц, правда стабильность синхронизации под XNA4 оставляет желать лучшего, но уже более-менее юзабельно, даже звук нормальный :)

daniel
12.01.2015, 14:54
Я не знаю чем они отличаются, если есть информация выкладывай вместе с образом пзу, добавлю

http://zx-pk.ru/showpost.php?p=771519&postcount=117
http://zx-pk.ru/showpost.php?p=771698&postcount=119

ZXMAK
12.01.2015, 22:47
обнаружилось что рилтайм граф не на всех видеокартах рисовался, на лаптопе не рисовался, ломал голову почему, оказалось дело в rhwvalue для transformed color вершин.

Также заметил интересную особенность, Direct3D девайс запоминает дисплей на котором был создан и если перетянуть окно на другой дисплей с другой частотой, он продолжает обновляться с частотой другого видеоадаптера (на котором был создан). Нашел способ вычислить на каком адаптере сейчас работает эмулятор - его можно найти по имени дисплея, а имя дисплея можно вытянуть из hWnd. Это дает возможность получить частоту дисплея, но нужно еще придумать способ заставить Direct3D применить новую частоту.
Кстати люди пишут, что если через твики менять частоту дисплея, то DirectX дает неправильную частоту... Так что с этим тоже засада, похоже реальную частоту нужно только замерять... :)

Еще интересный факт - по графу теперь стало видно, что на каждой машине синхронизация от звука работает совершенно по разному :eek_std:
Вторым открытием стало то что Win 7 иногда чегото творит, что в результате кадры успешно и вовремя отправляются, но система их забывает показать, наблюдается обычно если чтото тяжелое начинает ворочаться на уровне ядра (антивирус)

PS: также был обнаружен и пофиксен баг с синхронизацией потоков в реализациях IHostKeyboard

zebest
12.01.2015, 23:46
девайс запоминает дисплей на котором был создан и если перетянуть окно на другой дисплей с другой частотой, он продолжает обновляться с частотой другого видеоадаптера (на котором был создан).
а из неприятностей - Full Screen всегда работает на одном экране, даже не на том, на котором создан(

ZXMAK
13.01.2015, 00:04
Зарелизил новую версию: 2.8.3.37808 (https://zxmak2.codeplex.com/releases/view/599611)

Что нового:
- исправлена ошибка синхронизации потоков;
- добавлен рилтайм граф, отображающий время между сменой кадров и затраченного времени на обновление и отправку данных на видеокарту и звуковую карту;
- исправлено измерение fps (теперь для большей точности интервал измерения 1 секунда);
- исправлена заливка фона для индикатора fps (раньше на некоторых видеокартах его просто не было);
- исправлена синхронизация XNA4 хоста;
- исправлен сброс Z80 (USR 46578);
- исправлен порт IRB у AY8910 для PENTEVO (подвисало при переходе в 48К бейсик);
- исправлена эмуляция флага только чтение для HDD (теперь операция записи выполняется как положено, но запись на диск не происходит);
- исправлена обработка ошибок для лучшей совместимости с Linux;
- добавлена возможность закрыть консоль логов по Ctrl+C/Ctrl+Break;
- отключена кнопка закрытия у консоли логов, т.к. приводила к мгновенному закрытию эмулятора без сохранения данных (также консоль логов отключена по дефолту в log4net.config);
- масштабный рефакторинг кода практически завершен, теперь UI полностью отделен от движка, крупные изменения завершены (ну разве что Hardware часть будет вынесена в отдельную или несколько отдельных сборок), изменения теперь будут более точечными;
- также поменяласть структура имени типа при загрузке/сохранении конфигурации машины (в связи с масштабной сменой структуры);
- также, если нет конфига машины, то по дефолту теперь открывается конфигурация из machines.config, помеченная аттрибутом isDefault="true"

http://savepic.ru/6597201.png

ZXMAK
13.01.2015, 08:59
Я смотрю идея с графом понравилась, в unreal тоже прикрутили :)

ZXMAK
14.01.2015, 05:08
возился с синхронизацией видео, в конце концов попробовал синхронизацию просто от времени сделать и на ней к моему удивлению эмуль стал работать очень плавно и отзывчиво :)

Вот как выглядит граф при синхронизации по времени:
http://savepic.ru/6636814.png

частота кадров иногда дергается между 50.000 и 50.001, а так стоит как вкопанная :biggrin:

но к сожалению в этом режиме, также как и в спектакуляторе и unreal, происходит смена четных/нечетных кадров каждые 5-10 секунд. Что заметно в ZXTIME-15... Но плавность скролов и отзывчивость эмулятора с такой синхрой просто обалденная. Вобщем маст хев :) Буду добавлять синхру по времени (сейчас пока отладочный вариант -кривоватый). :smile:

Titus
14.01.2015, 14:58
возился с синхронизацией видео, в конце концов попробовал синхронизацию просто от времени сделать и на ней к моему удивлению эмуль стал работать очень плавно и отзывчиво :)

По времени - это все от того же QueryPerformanceCounter / QueryPerformanceFrequency?

ZXMAK
14.01.2015, 19:52
По времени - это все от того же QueryPerformanceCounter / QueryPerformanceFrequency?

да, а других источников точного измерения времени на PC вроде как и нету :)

Кстати заодно заменил поэлементное копирование массивов с графикой и звуком на kernel32 MemoryCopy. Если вывести время копирования на граф, то с достаточно заметного уровня оно упало практически до уровня, который на графе даже не виден :)
Проверял еще как эмит кода в рантайме на моно под линуксом работает - все ок :)
Проверял точками останова по условию в отладчике Adlers, я ему подсказал вариант с эмитом кода в рантайме для условных точек останова и он на удивление быстро этот вопрос разобрал и реализовал. код конечно требует переработки, но работает все на удивление быстро. например условие остановки AF==0005 на скорость эмуляции практически не влияет :)

Под моно в линуксе сейчас нет видео, поэтому проверял вслепую через встроенный отладчик Adlers, путем установки брейкпонита по обращению к памяти: br memread 0003
Все работает - после сброса вываливается в отладчик, т.е. эмит кода в рантайме под моно работает :)
Возможностей для оптимизации еще уйма :)

ZXMAK
15.01.2015, 12:20
Обновил эмулятор до версии 2.8.4.37878 (https://zxmak2.codeplex.com/releases/view/610752):

- исправлен фулскрин на системах с несколькими дисплеями;
- заметная оптимизация производительности для video/sound rendering;
- оптимизация измерения fps;
- добавлен Time Sync (синхронизация кадров по времени);
- значительно улучшен VBlank Sync;
- Настройки меню View переработаны (добавлены пункты "Frame Sync Source" и "Video Filter");
- значительно уменьшена нагрузка на процессор для Time sync;
- значительно уменьшена нагрузка на процессор для VBlank sync;
- рефакторинг кода (CPU, Engine, Circuits, HDD emulation)

Основная фишка этого релиза - переработанная синхронизация видео/звука. Добавлена возможность синхронизации по времени. Качество VBlank Sync улучшено в разы.

Теперь при включении синхронизации от видео эмулятор не жрет процессор! :biggrin: При этом качество еще улучшилось.

Синхронизация по Video, теперь работает лучше чем во всех остальных эмуляторах и процессор при этом не жрет :biggrin:
Правда ресамплер пока заточен под 75 Гц дисплеи, на 60 Гц будут наблюдаться биения, нужно будет переделать.

http://savepic.su/4696998.png

В релизе замечен небольшой баг - после включения Max Speed, синхронизация сбрасывается на Sound, хотя отображается та что была выбрана. Фиксится выбором Frame Sync Source после каждого нажатия Max Speed. В следующем релизе исправлю.

Titus
15.01.2015, 14:24
Теперь при включении синхронизации от видео эмулятор не жрет процессор! :biggrin: При этом качество еще улучшилось.

Поделись методикой)

ZXMAK
15.01.2015, 14:44
думаю прикрутить запись видео в MP4, в отладочном варианте уже работает :)
Пишет в реальном времени очень даже неплохо и проц не особо жрет :)

Eltaron
15.01.2015, 15:12
думаю прикрутить запись видео в MP4, в отладочном варианте уже работает :)
Пишет в реальном времени очень даже неплохо и проц не особо жрет :)
Можно сделать как в анрыле, через ffmpeg, чтобы с кодеками не геморроиться.

Titus
15.01.2015, 15:14
Заметил, что при синхронизации от звука можно таскать окно с эмулем или заниматься иной активной деятельностью и эмуль не тормозит, а при синхронизации от видео или таймера - при таскании окна или иной активности в винде - сразу тормозит и заикается звук.

ZXMAK
15.01.2015, 15:55
Поделись методикой)

при синхронизации по VBlank, ScanLine используется как таймер с частотой FPS * DisplayMode.Height для прогнозирования времени которое осталось до VBlank. Когда время вычислено, если его достаточно, то делается Thread.Sleep :)
Кроме того момент VBlank засекается по системному таймеру и если на следующем ожидании кадра окажется что прошло время равное или большее чем frequency / FPS, то обновляется время последнего VBlank и производится немедленный возврат, чтобы попытаться успеть.

Идея с прогнозированием времени для Thread.Sleep подсмотрена в unreal :smile: Только в unreal для прогнозирования используется ненадежный RDTSC. А у меня системный таймер.

Может возникнуть проблема, если DirectX говорит одну частоту FPS, а на самом деле другая. Или если реальный FPS сильно отличается от той, которую дает DirectX. Тогда время неточно прогнозироваться будет. Думаю можно сделать адаптивный алгоритм для коррекции реального fps путем замера реального времени между VBlank.

Кстати интересный вопрос - можно как-то узнать количество ScanLines для текущего режима? Я сейчас тупо беру Height дисплея, что естественно не очень правильно, т.к. реальное число ScanLines больше Height, т.е. частота ScanLines вычисляется меньше реальной.

---------- Post added at 14:55 ---------- Previous post was at 14:45 ----------


Можно сделать как в анрыле, через ffmpeg, чтобы с кодеками не геморроиться.

я именно на ffmpeg и сделал, с помощью AForge.Video :smile: прикручивание заняло минут 15-20, включая загрузку библиотек :biggrin:

Проблемное место с видео - как писать видео, если меняется разрешение экрана. На лету разрешение видеофайла не поменяешь. Думаю в таких случаях можно начинать писать следующий файл после каждой смены разрешения, например test.mp4, test.1.mp4, test.2.mp4, test.3.mp4 и т.д. Или просто прекращать запись.

Titus
15.01.2015, 16:02
при синхронизации по VBlank, ScanLine используется как таймер с частотой FPS * DisplayMode.Height для прогнозирования времени которое осталось до VBlank. Когда время вычислено, если его достаточно, то делается Thread.Sleep :)

Только дискретность Thread.Sleep не лучше 1мс, так ведь?

ZXMAK
15.01.2015, 16:02
Заметил, что при синхронизации от звука можно таскать окно с эмулем или заниматься иной активной деятельностью и эмуль не тормозит, а при синхронизации от видео или таймера - при таскании окна или иной активности в винде - сразу тормозит и заикается звук.

хм, интересная особенность, можно будет поисследовать почему так происходит. Если с VBlank можно списать на то что Highest приоритет ставится, то для синхры по времени приоритет не меняется и таскание не должно сильно влиять на поток который с UI не связан.

Titus
15.01.2015, 16:03
Кстати интересный вопрос - можно как-то узнать количество ScanLines для текущего режима? Я сейчас тупо беру Height дисплея, что естественно не очень правильно, т.к. реальное число ScanLines больше Height, т.е. частота ScanLines вычисляется меньше реальной.

Посмотрю чуть позже, как я это делаю в EmuStudio - отпишусь.

ZXMAK
15.01.2015, 16:06
Только дискретность Thread.Sleep не лучше 1мс, так ведь?

с дискретностью вопрос интересный, я вообще считал что Sleep минимум через 10 мс управление возвращает, на деле оказалось что и через 1 мс возвращает. Но это возможно от версии Windows зависит.

Titus
15.01.2015, 16:12
с дискретностью вопрос интересный, я вообще считал что Sleep минимум через 10 мс управление возвращает, на деле оказалось что и через 1 мс возвращает. Но это возможно от версии Windows зависит.

Я тоже читал, что в XP (или даже 98) дискретность 10мс, поэтому принудительно в эмуле ставил дискретность самую маленькую 1мс. И на всех виндах от XP до 7 это прокатывало, она была действительно 1мс.

И все же, если дискретность 1мс, не топорно ли засыпать на время с такой грубой дискретностью? Ибо можно промахнуться от начала VBlank на порядка 10%.

ZXMAK
15.01.2015, 16:38
Я тоже читал, что в XP (или даже 98) дискретность 10мс, поэтому принудительно в эмуле ставил дискретность самую маленькую 1мс. И на всех виндах от XP до 7 это прокатывало, она была действительно 1мс.

И все же, если дискретность 1мс, не топорно ли засыпать на время с такой грубой дискретностью? Ибо можно промахнуться от начала VBlank на порядка 10%.

там запас 5 мс вычитается, оставшиеся 5 мс эмуль опрашивает VBlank и крутит Thread.SpinLock. Если частоту процессора правильно вычислить, то можно попробовать остаток времени в Thread.SpinWait отдавать, но это не очень надежно, т.к. частота может гулять плюс минус лапоть на всяких Turbo Boost и т.п. новомодных технологиях

Titus
15.01.2015, 16:40
там запас 5 мс вычитается, оставшиеся 5 мс эмуль опрашивает VBlank и крутит Thread.SpinLock.

5мс - это больше трети кадра. Что такое Thread.SpinLock?

ZXMAK
15.01.2015, 17:19
5мс - это больше трети кадра. Что такое Thread.SpinLock?

опечатался, Thread.SpinWait

abelenki
15.01.2015, 19:40
ZXMAK, есть ли надежда на эмуляцию ULAPlus (http://speccy.info/ULAplus) в будущих релизах?

нет ли подвижек в этом направлении? ;)

Titus
15.01.2015, 19:47
опечатался, Thread.SpinWait

А зачем? Это же, на сколько я понимаю, просто цикл с заданным числом итераций?

ZXMAK
15.01.2015, 20:12
А зачем? Это же, на сколько я понимаю, просто цикл с заданным числом итераций?

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

Потестил на других машинах, оказалось не везде такая красивая картинка, на некоторых машинах довольно сильный разброс. Видимо там где time-slice довольно большой и Thread.Sleep со слишком большими квантами времени работает.

А есть способ уменьшить кванты времени на Win 7? в старых системах помню можно было какой-то апишный вызов сделать и система переходила в рилтайм режим с низким time slice

---------- Post added at 19:12 ---------- Previous post was at 19:10 ----------


нет ли подвижек в этом направлении? ;)

я сам давно хочу его реализовать, но для этого нужно разобраться как оно работает :)

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

1) На сколько я знаю (может я отстал от новых процессоров) каждое ядро имеет свой набор вычислительных блоков.
2) Зачем нужен этот цикл? Какая от него польза, если это просто пустой цикл на заданное число итераций?

---------- Post added at 23:31 ---------- Previous post was at 23:05 ----------



Кстати интересный вопрос - можно как-то узнать количество ScanLines для текущего режима? Я сейчас тупо беру Height дисплея, что естественно не очень правильно, т.к. реальное число ScanLines больше Height, т.е. частота ScanLines вычисляется меньше реальной.

В EmuStidio я делаю так:

Выполнять в realtime-приоритете процесса. В этом приоритете ни один другой процесс не может получить квант времени, пока вы его не отдадите по Sleep. Т.е. если ваш процесс его не отдаст, то система зависнет железно (во всяком случае с одним ядром, проверял на XP). Возможно, что на современных виндах такой приоритет можно получить только под админом, я не проверял. Альтернативный вариант - это приоритет чуть меньше - high priority. Но он не дает гарантий точного измерения.

Как известно, высота экрана в сканлайнах состоит из видимой части (которую нам сообщает система) и невидимой (VBlank части). Невидимая часть на LCD мониторах может быть равна 0 или 1. Для CRT-мониторов невидимая часть может быть несколько десятков сканлайнов.

Алгоритм таков:

1) Определяем видимую высоту экрана в сканлайнах через dwHeight

2) Ждем пока луч не дойдет до середины экрана. Делаем это так:

a) Sleep(1)
b) Считываем номер сканлайна
c) Если номер сканлайна меньше dwHeight/2, то цикл --> a)

Таким образом мы отдаем около 50% быстродействия системе, дабы система не тормознула во время дальнейших измерений, ведь мы в realtime-приоритете.

3) Далее определяем точку перехода через 0-й сканлайн:

a) Считываем номер сканлайна
b) Если номер сканлайна не меньше предыдущего, то цикл --> a)

Таким образом полная высота экрана будет равна максимальному номеру сканлайна плюс 1

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


Теперь об установки минимальной дискретности для Sleep (т.е. для переключения процессов). Я это делаю через timeBeginPeriod(1). Во всех системах это прокатывает. Какое получилось реальное разрешение таймера можно потом проверить так:


TIMECAPS tc;

timeGetDevCaps(&tc,sizeof(TIMECAPS));
printf("Timer Period Min - %dms\n", tc.wPeriodMin);

ZXMAK
15.01.2015, 23:53
1) На сколько я знаю (может я отстал от новых процессоров) каждое ядро имеет свой набор вычислительных блоков.
2) Зачем нужен этот цикл? Какая от него польза, если это просто пустой цикл на заданное число итераций?[COLOR="Silver"]



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

Titus
15.01.2015, 23:55
Если выполнять тупой цикл, то процессор не получит такой возможности

Зачем тебе нужен этот цикл? Тупой он или нет, не важно. Смысл его?

ZXMAK
16.01.2015, 00:00
Выполнять в realtime-приоритете процесса. В этом приоритете ни один другой процесс не может получить квант времени, пока вы его не отдадите по Sleep. Т.е. если ваш процесс его не отдаст, то система зависнет железно (во всяком случае с одним ядром, проверял на XP). Возможно, что на современных виндах такой приоритет можно получить только под

Это не так, даже с рилтаймом система отобрает процессор для своих более важных задач. Да и зависаний никаких нет от рилтайма. Сегодня возился, пробовал и realtime+highest приоритет (это максимум) - синхра стабильнее, но видно что система отбирает процессор

---------- Post added at 23:00 ---------- Previous post was at 22:58 ----------


Зачем тебе нужен этот цикл? Тупой он или нет, не важно. Смысл его?

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

Titus
16.01.2015, 00:03
Это не так, даже с рилтаймом система отобрает процессор для своих более важных задач. Да и зависаний никаких нет от рилтайма. Сегодня возился, пробовал и realtime+highest приоритет (это максимум) - синхра стабильнее, но видно что система отбирает процессор

На XP с одним ядром если в реалтайм приоритете ты не отдашь управление системе, то комп железно зависнет (замрет экран, мышка и т.д.) и до ресета.

ZXMAK
16.01.2015, 00:04
Кстати если процесс сам себе приоритет ставит, то это очень плохо. Во первых пермиссии может не быть. Во вторых мы мешаем системе и юзеру управлять приоритетами процессов.
В тесте к эмулятору есть код который рилтайм ставит и этот код валится под линуксом из-за отсутствия пермиссии

Titus
16.01.2015, 00:04
Смысл в том что раз уж берем блокируем поток на холостой цикл, то нужно хотябы поделиться блоками процессора с другими потоками и дать прцессору пооптимизировать свои кэши. Это лучше чем тупо жрать вхолостую ресурсы

Я не понимаю зачем ты блокируешь поток на холостой цикл?

ZXMAK
16.01.2015, 00:07
На XP с одним ядром если в реалтайм приоритете ты не отдашь управление системе, то комп железно зависнет (замрет экран, мышка и т.д.) и до ресета.


Если explorer завис это не значит что система поток себе не берет. Еще как берет. Себя она на уровне ядра никогда не обделит

Titus
16.01.2015, 00:07
Кстати если процесс сам себе приоритет ставит, то это очень плохо. Во первых пермиссии может не быть. Во вторых мы мешаем системе и юзеру управлять приоритетами процессов.
В тесте к эмулятору есть код который рилтайм ставит и этот код валится под линуксом из-за отсутствия пермиссии

Это нормально, если иного способа гарантированно отобрать процессорное время на заднное время нет.

Про линукс ничего не знаю, там нужны, очевидно, другие методы.

ZXMAK
16.01.2015, 00:13
Я не понимаю зачем ты блокируешь поток на холостой цикл?
Это не холостой цикл. Это аналог nop'а, только он дает процессору возможность использовать это время с пользой. В итоге операции на которые процессор бы всеравно потратил время позже, выполняются раньше, а мы не теряем поток.

---------- Post added at 23:13 ---------- Previous post was at 23:09 ----------


Это нормально, если иного способа гарантированно отобрать процессорное время на заднное время нет.

Про линукс ничего не знаю, там нужны, очевидно, другие методы.

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

Titus
16.01.2015, 00:17
Это очень плохо, более того, если процесс сам пытается запрввлять своим приоритетом, то есть серьезный повод отказаться от использования такого процесса. Процесс может упрввлять только приоритетами своих потоков.

Для системы не реального времени (Windows) приходится идти на ухищирения, чтобы реализовать те фичи, которые она кошерными методами не предоставляет.

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


Это не холостой цикл. Это аналог nop'а, только он дает процессору возможность использовать это время с пользой. В итоге операции на которые процессор бы всеравно потратил время позже, выполняются раньше, а мы не теряем поток.

Я понимаю, что это nop, холостой цикл и т.д.) Смысле его у тебя в эмуляторе какой?

Ты же в этом nop'e не можешь ничего делать. Не можешь задать nop на определенное время. Просто nop неопределенной длительности и ничего не делающий. Зачем?

ZXMAK
16.01.2015, 06:09
Для системы не реального времени (Windows) приходится идти на ухищирения, чтобы реализовать те фичи, которые она кошерными методами не предоставляет.

если задача требует того чтобы забрать процессор в эксклюзивное пользование на длительное время, то задача плохая ее нужно переделать, чтобы она получала кванты времени именно тогда когда нужно, в этом и весь смысл этой борьбы. Тем более если это длительное время будет использовано для холостого цикла :smile:



Я понимаю, что это nop, холостой цикл и т.д.) Смысле его у тебя в эмуляторе какой?

Ты же в этом nop'e не можешь ничего делать. Не можешь задать nop на определенное время. Просто nop неопределенной длительности и ничего не делающий. Зачем?

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

Alex Rider
16.01.2015, 13:26
Last Ninja Remix 2 (http://vtrdos.ru/gamez/l/LN2REMIX.zip) на Скорпе с ПрофПЗУ после входа в монитор по NMI и выхода кажет черный экран. Потому что включена вторая экранная область. Сдается мне, проблема в чтении 1ffd и 7ffd. Или в ПрофПЗУ :) Игра 48-я, но при сохранении образа памяти ПрофПЗУ пишутся 256 Кб. Unreal ведет себя так же. По мотивам этой (http://zx-pk.ru/showthread.php?t=24605) темы.

Titus
16.01.2015, 13:34
если задача требует того чтобы забрать процессор в эксклюзивное пользование на длительное время, то задача плохая ее нужно переделать, чтобы она получала кванты времени именно тогда когда нужно, в этом и весь смысл этой борьбы. Тем более если это длительное время будет использовано для холостого цикла :smile:

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

---------- Post added at 13:34 ---------- Previous post was at 13:32 ----------


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

Теперь я понял) Ты ждешь события. Что за событие?
Разве события могут приходить чаще, чем раз в квант (1мс?). Когда я экспериментировал с событиями от звукового буфера, они приходили именно так, с дискретностью в квант. А иной раз задерживались и приходили скопом по несколько штук даже.

Eltaron
16.01.2015, 13:43
я именно на ffmpeg и сделал, с помощью AForge.Video :smile: прикручивание заняло минут 15-20, включая загрузку библиотек :biggrin:
А, а то у меня от всех этих разговоров о графах показалось, что DirectShow. Сразу попытался вспомнить, где там счас кодеки берут :)

ZXMAK
16.01.2015, 21:23
А, а то у меня от всех этих разговоров о графах показалось, что DirectShow. Сразу попытался вспомнить, где там счас кодеки берут :)

хотел закомитить, но когда начал код причесывать и делать общий интерфейс для разных рекордеров, всплыли недостатки текущих интерфейсов - разнообразие указателей, картинки в виде int*, звук в виде byte* и uint*. Пока отложил - нужно интерфейсы подрефакторить.

Может кто подскажет простой и быстрый алгоритм для хорошего ресамплинга. Нужно чтобы на 60 Гц дисплеях скролы плавные были. Сейчас просто считается сколько фреймов пропустить, в итоге на 60 Гц слишком неравномерно обновление кадров получается :)

Суть в чем - есть импульсы с частотой источника (частота дисплея, например 60 Гц) и есть импульсы с целевой частотой (частота TV, 50 Гц). Нужна функция которая будет показывать какой импульс источника пропускать, а какой нет, чтобы на выходе получилась целевая частота, но в сетке частоты источника, при этом чтобы импульсы были распределены равномерно.

---------- Post added at 20:23 ---------- Previous post was at 20:06 ----------


Теперь я понял) Ты ждешь события. Что за событие?
Разве события могут приходить чаще, чем раз в квант (1мс?). Когда я экспериментировал с событиями от звукового буфера, они приходили именно так, с дискретностью в квант. А иной раз задерживались и приходили скопом по несколько штук даже.

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

Titus
16.01.2015, 21:35
речь не об уведомлениях, а о событии vblank, наличие которого определяется соответствующим вызовом в драйвер видеокарты :)

Значит ты засыпаешь на столько-то миллисекунд, чтобы проснуться перед временем в которое должен прийти VBlank, затем проснувшись (а VBlank уже рядом) вызываешь странный цикл из NOP'в неопределенной длительности, а после этого цикла начинаешь проверять не наступил ли VBlank? Словом, я опять не понял необходимости в этом цикле NOP'ов)

ZXMAK
16.01.2015, 21:53
Значит ты засыпаешь на столько-то миллисекунд, чтобы проснуться перед временем в которое должен прийти VBlank, затем проснувшись (а VBlank уже рядом) вызываешь странный цикл из NOP'в неопределенной длительности, а после этого цикла начинаешь проверять не наступил ли VBlank? Словом, я опять не понял необходимости в этом цикле NOP'ов)

Титус, ну чего ты к этому прицепился? :smile: Это не цикл nop'ов, а цикл специальных инструкций, которые разгружают процессор. В отличие от nop, который несмотря на ничего не делание, блоки процессора таки загружает.
Что тут странного? Цикл простой - проверили vblank, если его нету, то даем немного тактов процессору, нам несколько тактов погоды не делают, зато у процессора появляется возможность прокачать кэши, обновить оптимизатор или отключить ненужные блоки чтобы снизить потребления тока. Это в любом случае лучше чем тупо цикл крутить или nop'ы выполнять. так в чем вопрос? :smile:

---------- Post added at 20:53 ---------- Previous post was at 20:47 ----------

чтото я с ресемплингом запутался. Сделал интерполяцию - результат тот-же, что и сейчас. Ну разве что диапазон частот больше поддерживается. Однако на 60 Гц скролл получается дерганый, т.к. все сводится к тому чтобы пропускать каждый 6-й кадр, вот на этом кадре и видно неравномерность.
Получается что из 60 Гц плавные 50 Гц никак не выжмешь? Или есть какие-то методики для обмана зрения? :)

Titus
16.01.2015, 21:58
Титус, ну чего ты к этому прицепился? :smile:
Что тут странного? Цикл простой - проверили vblank, если его нету, то даем немного тактов процессору, нам несколько тактов погоды не делают, зато у процессора появляется возможность прокачать кэши, обновить оптимизатор или отключить ненужные блоки чтобы снизить потребления тока. Это в любом случае лучше чем тупо цикл крутить или nop'ы выполнять. так в чем вопрос? :smile:

Вот в этом и был вопрос) Теперь ты ответил)
Я не цепляюсь, а стараюсь понять суть ибо тоже занимаюсь сходными проблемами.

Кстати, как ты решаешь проблему рассинхронизации звука и видео, когда синхронизация идет по видео? Или и в этом случае ты за опору берешь аудиобуфер?

---------- Post added at 21:58 ---------- Previous post was at 21:53 ----------


чтото я с ресемплингом запутался. Сделал интерполяцию - результат тот-же, что и сейчас. Ну разве что диапазон частот больше поддерживается. Однако на 60 Гц скролл получается дерганый, т.к. все сводится к тому чтобы пропускать каждый 6-й кадр, вот на этом кадре и видно неравномерность.
Получается что из 60 Гц плавные 50 Гц никак не выжмешь? Или есть какие-то методики для обмана зрения? :)

Попробуй использовать методику смешения двух соседних кадров с прозрачностью каждого пропорциональной расстоянию реального 60Гц кадра от двух прогнозируемых 50Гцовых. Например:

50----------60---50--------60--------50----60------------50

т.е. в первом случае твой 60гц кадр это смесь на 1/4 от предыдущего 50гц и 3/4 последующего.
второй твой 60гц кадр это смесь 1/2 предыдущего 50гц и последующего, и третий это 3/4 предыдущего и 1/4 последующего.
Коэффициенты взяты грубо для наглядности.

ZXMAK
16.01.2015, 22:16
Вот в этом и был вопрос) Теперь ты ответил)
Я не цепляюсь, а стараюсь понять суть ибо тоже занимаюсь сходными проблемами.

Кстати, как ты решаешь проблему рассинхронизации звука и видео, когда синхронизация идет по видео? Или и в этом случае ты за опору берешь аудиобуфер?

просто решаю - если ошибка накопится до размеров одного кадра, до просто будет пропущен кадр у того устройства которое является слейвом. Т.е. если синхра от звука, то будет пропущен один кадр видео. Если синхра от видео, то 1 кадр звука. Если синхра от времени, то кому как повезет.
Учитывая что ошибка маленькая, да и фреймы очень маленькие (1/50 секунды), то такие коллизии не критичны, например потери одного фрейма за несколько минут никто не заметит :) Вот если это будет происходить часто, то это будет заметно :)

---------- Post added at 21:16 ---------- Previous post was at 21:04 ----------



Попробуй использовать методику смешения двух соседних кадров с прозрачностью каждого пропорциональной расстоянию реального 60Гц кадра от двух прогнозируемых 50Гцовых. Например:

50----------60---50--------60--------50----60------------50

т.е. в первом случае твой 60гц кадр это смесь на 1/4 от предыдущего 50гц и 3/4 последующего.
второй твой 60гц кадр это смесь 1/2 предыдущего 50гц и последующего, и третий это 3/4 предыдущего и 1/4 последующего.
Коэффициенты взяты грубо для наглядности.

вот какраз такого хотел избежать, но похоже только такой вариант и остается

Titus
16.01.2015, 22:21
просто решаю - если ошибка накопится до размеров одного кадра, до просто будет пропущен кадр у того устройства которое является слейвом. Т.е. если синхра от звука, то будет пропущен один кадр видео. Если синхра от видео, то 1 кадр звука. Если синхра от времени, то кому как повезет.

Блин, это не айс) Кадр от звука - это вплоть до щелчка, а кадр от видео это дернулся скролл.

ZXMAK
17.01.2015, 02:11
Блин, это не айс) Кадр от звука - это вплоть до щелчка, а кадр от видео это дернулся скролл.


А какие есть варианты? Адаптивный рескейл аудио и видео в реальном времени? :)

---------- Post added at 01:11 ---------- Previous post was at 01:04 ----------


Last Ninja Remix 2 (http://vtrdos.ru/gamez/l/LN2REMIX.zip) на Скорпе с ПрофПЗУ после входа в монитор по NMI и выхода кажет черный экран. Потому что включена вторая экранная область. Сдается мне, проблема в чтении 1ffd и 7ffd. Или в ПрофПЗУ :) Игра 48-я, но при сохранении образа памяти ПрофПЗУ пишутся 256 Кб. Unreal ведет себя так же. По мотивам этой (http://zx-pk.ru/showthread.php?t=24605) темы.


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

Titus
17.01.2015, 02:45
А какие есть варианты? Адаптивный рескейл аудио и видео в реальном времени? :)

Да, я так и делаю. Когда тактирование идет от VBlank.
Только это, как оказалось прокатывает лишь на моей звуковухе (т.к. у ней есть нотификация о ТОЧНОЙ позиции в звуковом буфере на текущий момент), и я могу адаптивно подстраиваться.
Когда же стал тестить на других звуковухах, чаще всего интегрированных типа AC97, то выяснилось, что у них данные о текущей позиции в буфере предоставляются с точностью в +-километр (сотни байт). А начиная с Висты (у меня-то XP), системно вообще не предусмотрено получать значения позиции в аудиобуфере точнее, чем с дискретностью... то ли 400 позиций, то ли скокько-то там. В общем, не одна сотня. Это все было обсуждено ТУТ (http://zx-pk.ru/showthread.php?t=21908), но потом за неимением точных методов /временно/ заглохло.

ZXMAK
17.01.2015, 09:01
Да, я так и делаю. Когда тактирование идет от VBlank.
Только это, как оказалось прокатывает лишь на моей звуковухе (т.к. у ней есть нотификация о ТОЧНОЙ позиции в звуковом буфере на текущий момент), и я могу адаптивно подстраиваться.
Когда же стал тестить на других звуковухах, чаще всего интегрированных типа AC97, то выяснилось, что у них данные о текущей позиции в буфере предоставляются с точностью в +-километр (сотни байт). А начиная с Висты (у меня-то XP), системно вообще не предусмотрено получать значения позиции в аудиобуфере точнее, чем с дискретностью... то ли 400 позиций, то ли скокько-то там. В общем, не одна сотня. Это все было обсуждено ТУТ (http://zx-pk.ru/showthread.php?t=21908), но потом за неимением точных методов /временно/ заглохло.

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

Titus
17.01.2015, 12:41
на мой взгляд тут ошибкой было ориентироваться на замеры времени кадров - под windows это не корректно. Точный замер сделать не получится - аппаратура для этого не предназначена. а коррекция в процессе работы невозможна, т.к. для этого прийдется останавливать эмуляцию чтобы произвести еще один замер. Если учесть то, что частоты процессора, видеокарты и звуковухи могут меняться в процессе работы, то без повторных замеров тут не обойтись

На моей звуковухе это работало ИДЕАЛЬНО.
Так что пока открытый вопрос, как это адаптировать (и можно ли) под более грубую нотацию других звуковух и Win7 систем.

Частота процессора тут вообще не при чем.

А уж если пользователь меняет частоту видюхи во время эмуляции, то или не надо этого делать, или пересчитывать.

А частоту звуковухи... Как она может поменяться?

ZXMAK
17.01.2015, 14:05
Обновил эмулятор до версии 2.8.5.37912 (https://zxmak2.codeplex.com/releases/view/610813)

Что нового:
- улучшения для стабильности синхронизации;
- исправлен баг MaxSpeed/SyncSource;
- добавлено включение high resolution timer;
- исправлена поддержка нескольких дисплеев;
- мелкие исправления для лучшей совместимости с Wine/Mono под Linux;

http://savepic.su/4712182.png

синхра стабильная, но скроллы красиво выглядят на 75 Гц, поэтому лучше переключить LCD дисплей на 75 Гц.
Для 60 Гц нужно видеофильтр делать, чтобы цвета пикселей размазывать.
Эмулятор теперь привязывается к дисплею на котором был открыт.

Titus
18.01.2015, 01:06
А звук-то на пол-секунды отстает?

ZXMAK
18.01.2015, 06:51
А звук-то на пол-секунды отстает?

нет, максимум на 0.08 сек, можно до 0.06 сек снизить, при 0.04 сек, система не справляется - начинаются срывы звука. 0.08 сек выбрано чтобы запас был.

Titus
18.01.2015, 12:45
нет, максимум на 0.08 сек, можно до 0.06 сек снизить, при 0.04 сек, система не справляется - начинаются срывы звука. 0.08 сек выбрано чтобы запас был.

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

ZXMAK
18.01.2015, 14:50
Мне показалось, что эта задержка значительно больше, т.к. запаздывание (во всяком случае у меня) заметно. Пробовал на звуке клавиш в бейсике. Возможно, задержку еще вносят интерфейсы, которые ты используешь.

используется DirectSound, размер буфера - 4 x 1/50 сек

Titus
18.01.2015, 15:01
используется DirectSound, размер буфера - 4 x 1/50 сек
Скорее, даже 0.1сек это уже заметно при звуках типа клика.

ZXMAK
18.01.2015, 15:10
Скорее, даже 0.1сек это уже заметно при звуках типа клика.

ну можно уменьшить, но не все звуковухи такую малую задержку поддерживают. Лучше чтоб везде работало, чем на избранных звуковухах :)

abelenki
18.01.2015, 15:26
Мне показалось, что эта задержка значительно больше, т.к. запаздывание (во всяком случае у меня) заметно.

может нормальный компьютер купишь? и все проблемы ВНЕЗАПНО исчезнут, нет?

---------- Post added at 17:23 ---------- Previous post was at 17:14 ----------

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

---------- Post added at 17:26 ---------- Previous post was at 17:23 ----------

этот тип даже thanks не ставит после релиза, а запросов - уйма.

пусть сам доделывает под нищебродское железо. благо, исходники в открытом доступе (либо пусть сидит под X128 для MS-DOS).

Titus
18.01.2015, 15:43
может нормальный компьютер купишь? и все проблемы ВНЕЗАПНО исчезнут, нет?

Человек, если ты не в теме, попридержи свое мнение при себе и не переходи на личности.

ZXMAK
18.01.2015, 16:41
Вопрос к Eltaron:

Добавил в тфс твой плагин GDB сервера. Подправил в соответствии с последними изменениями структуры эмулятора. Попробовал заюзать.
Я с GDB дела никогда не имел, поэтому просьба помочь разобраться :)

Поставил MinGW 32 7.5, пытаюсь подключиться:


gdb.exe
...
target remote localhost:2000


плагин падает с исключением. По отладчику выяснил что gdb пытается прочитать адрес a1a4400, который явно не 16 битный и падает на преобразовании строки в 16 битное значение. Почему GDB пытается читать 32-битный адрес? Какой правильный ответ должен дать GDB сервер в данном случае? (попытка чтения 32-битного адреса на 16-битном таргете)

Вот лог обмена:


--> +
--> $qSupported:multiprocess+;xmlRegisters=i386;qReloc Insn+#b5
<-- +$PacketSize=4000#f4
--> +
--> $Hg0#df
<-- +$OK#9a
--> +
--> $?#3f
<-- +$T05thread:00;#06
--> +
--> $Hc-1#09
<-- +$OK#9a
--> +
--> $qC#b4
<-- +$#00
--> +
--> $qAttached#8f
<-- +$1#31
--> +
--> $ma1a4400,1#85

на последнем пакете и валится. Судя по логу gdb считает что это i386, как его переключить в z80? :)

zebest
18.01.2015, 16:50
- исправлена поддержка нескольких дисплеев;
ну наконец-то)) не прошло и три года)))
Только не надо меня в игнор, ладно?))
http://savepic.net/6352686m.jpg (http://savepic.net/6352686.htm)
это синхра по видео)) по звуку и по таймеру немного лучче. 25-28 фпс)))
курсор в басике еле-еле моргает:))
если что - это режим full-full-screen :)))))))))

ZXMAK
18.01.2015, 17:22
ну наконец-то)) не прошло и три года)))
Только не надо меня в игнор, ладно?))
http://savepic.net/6352686m.jpg (http://savepic.net/6352686.htm)
это синхра по видео)) по звуку и по таймеру немного лучче. 25-28 фпс)))
курсор в басике еле-еле моргает:))
если что - это режим full-full-screen :)))))))))

это та самая необычная система, на которой раньше Direct3D крешился? :smile:
Судя по графу, гдето неправильно расчитывается время для синхронизации, только с чем это может быть связано не ясно :)
Возможно частота вертикальной синхронизации дисплея неправильно вычисляется.
Но по звуку ничего не менялось - должно также работать.
Давай я отладочную версию скину, нужно ее запустить и отписать что она в логах пишет.

Eltaron
18.01.2015, 19:21
этот тип даже thanks не ставит после релиза, а запросов - уйма
Этот коварный тип гражданской наружности этим эмулем даже и не пользуется-то, поди :) Но дискуссия в итоге познавательная.

С желанием пускать зхмак на компах 10-летней давности тут другой был тип, с бородатой аватаркой.

---------- Post added at 21:21 ---------- Previous post was at 21:19 ----------


Почему GDB пытается читать 32-битный адрес?
Потому что gdb под каждую платформу свой :) Доберусь до компа - выложу бинарник.

ZXMAK
18.01.2015, 19:38
Потому что gdb под каждую платформу свой :) Доберусь до компа - выложу бинарник.

уже догадался, только не могу найти gdb-z80 под windows :)

Спасибо, жду :smile:

---------- Post added at 18:38 ---------- Previous post was at 18:36 ----------


та же система. я хорошемуу не изменяю) w2k3
сейчас включу скайп, там кинь

как оказалось проблема возникает если эмулятор на два дисплея одновременно растянуть :smile: И по всей видимости связана с недостаточной мощностью видеокарты, т.к. разрешение зашкаливают за 3000 пикселов, а карта не топовая :smile:
В итоге Direct3D.Present подвисает слишком надолго

Alex Rider
18.01.2015, 21:56
А можно сделать автообновлялку билда? А то новые сборки выходят чуть ли не каждый день, а качать и распаковывать лень...

ZXMAK
18.01.2015, 23:14
А можно сделать автообновлялку билда? А то новые сборки выходят чуть ли не каждый день, а качать и распаковывать лень...

можно Click Once прикрутить, при запуске проверять будет. Но на это время нужно

Eltaron
18.01.2015, 23:43
Спасибо, жду :smile:
http://dl.dropboxusercontent.com/u/20289147/zx/z80-unknown-coff-gdb.exe.zip
Статически слинкован, вроде должен без проблем работать.

Alex Rider
19.01.2015, 00:30
Но на это время нужно
Потенциально увеличишь количество бета-тестеров. PROFIT!!!
Особенно, если разделишь свойи релизы на альфа-бета-гамма и стабильные (с возможностью выбора в апдейтере).

ZXMAK
21.01.2015, 02:01
Просьба затестить спец-сборку эмулятора с новым вариантом синхронизации по видео. На моем компе работает просто обалденно :)
Но интересует как будет на разных машинах, т.к. суть сводится к развязке UI потока и потока эмуляции путем уведомлений через трид пул. Механизм многопоточный, поэтому как поведет себя на одноядерных машинах непонятно :)

2.8.6.0 TESTSYNC: https://zxmak2.codeplex.com/releases/view/610909

abelenki
21.01.2015, 02:13
Просьба затестить спец-сборку эмулятора с новым вариантом синхронизации по видео. На моем компе работает просто обалденно :)
Но интересует как будет на разных машинах, т.к. суть сводится к развязке UI потока и потока эмуляции путем уведомлений через трид пул.

работает замечательно. все настройки по умолчанию.

в аттаче скриншоты debug info в оконном и полноэкранном режимах.

мой конфиг в подписи.

Titus
21.01.2015, 02:29
Просьба затестить спец-сборку эмулятора с новым вариантом синхронизации по видео. На моем компе работает просто обалденно :)

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

ZXMAK
21.01.2015, 02:31
работает замечательно. все настройки по умолчанию.

в аттаче скриншоты debug info в оконном и полноэкранном режимах.

мой конфиг в подписи.

Хм, это точно синхронизация по видео? Чтото странно, зеленый уровень (время между обновлением экрана) должен болтаться около желтой линии (частоты дисплея). Больше похоже на синхру от звука, т.к. разброс сильно большой

abelenki
21.01.2015, 02:38
Хм, это точно синхронизация по видео? Чтото странно, зеленый уровень (время между обновлением экрана) должен болтаться около желтой линии (частоты дисплея). Больше похоже на синхру от звука, т.к. разброс сильно большой

прошу прощения, ошибся в прошлый раз.

архив debug.zip (http://zx-pk.ru/attachment.php?attachmentid=50786&d=1421797078) обновлён с правильными настройками.

ZXMAK
21.01.2015, 05:01
прошу прощения, ошибся в прошлый раз.

архив debug.zip (http://zx-pk.ru/attachment.php?attachmentid=50786&d=1421797078) обновлён с правильными настройками.

это с влюченой синхронизацией от видео? Нехорошо, слишком нестабильно, а что за процессор - одноядерный?

---------- Post added at 04:01 ---------- Previous post was at 02:20 ----------

обновил тестовую версию с новой синхронизацией, просьба затестить и написать сюда как работает на разных машинах в режиме синхронизации от видео (от Time и Sound тоже интересно), в особенности на одноядерных. Сильный ли разброс на графе? (в Debug Info)

2.8.6.2 TESTSYNC: https://zxmak2.codeplex.com/releases/view/610909

abelenki
21.01.2015, 05:30
это с влюченой синхронизацией от видео?

да.


Нехорошо, слишком нестабильно, а что за процессор - одноядерный?

нет, 4-ядерный. как я говорил, моя конфигурация описана в подписи.

abelenki
21.01.2015, 05:41
обновил тестовую версию с новой синхронизацией, просьба затестить и написать сюда как работает на разных машинах в режиме синхронизации от видео (от Time и Sound тоже интересно), в особенности на одноядерных. Сильный ли разброс на графе? (в Debug Info)

выкладываю все тесты на 2.8.6.2.

ZXMAK
21.01.2015, 12:38
выкладываю все тесты на 2.8.6.2.

уже лучше :smile:
А что это за выбросы такие большие по времени обновления (красная область)? Так и на предыдущих версиях было или они появились только в этой версии с новым алгоритмом?

Можешь снять такие-же скриншоты на той-же деме с версией 2.8.5.37912?
Нужно понять чем вызваны эти выбросы, чтобы устранить.
Спасибо

И что за модель спектрума использована при эмуляции? Пентагон и Spectrum лучше всего оптимизированы, на остальных может быть недостаточно оптимальный код.

abelenki
21.01.2015, 16:18
А что это за выбросы такие большие по времени обновления (красная область)? Так и на предыдущих версиях было или они появились только в этой версии с новым алгоритмом?

честно говоря, не обращал внимания, т.к. визуально эмулятор работает отлично.


Можешь снять такие-же скриншоты на той-же деме с версией 2.8.5.37912? Нужно понять чем вызваны эти выбросы, чтобы устранить.

разумеется. скинь плиз ссылку на 2.8.5.37912. а то я всегда использую только последнюю версию ZXMAK2, даже альфы/беты/тесты.


И что за модель спектрума использована при эмуляции? Пентагон и Spectrum лучше всего оптимизированы, на остальных может быть недостаточно оптимальный код.

Pentagon 128, который стоит по умолчанию (без изменений в конфигурации машины).

ZXMAK
21.01.2015, 22:06
разумеется. скинь плиз ссылку на 2.8.5.37912. а то я всегда использую только последнюю версию ZXMAK2, даже альфы/беты/тесты.


https://zxmak2.codeplex.com/releases/view/610813

abelenki
22.01.2015, 02:24
выкладываю все тесты на 2.8.5.37912.

ZXMAK
23.01.2015, 14:09
покопался в коде AY8910, обнаружился баг в миксере, который тянется еще с первых версий ZXMAK :)
Пофиксил, хотел сделать релиз, но codeplex сейчас падает при попытке создать новый релиз.

ZXMAK
24.01.2015, 18:25
Зарелизил тестовую версию 2.8.6.7 TESTSYNC (https://zxmak2.codeplex.com/releases/view/610983).

В эту-же версию вошли такие изменения:
- исправлен миксер и шум для AY8910;
- много разных фиксов и оптимизаций для стабильности синхронизации;
- изменен цикл эмуляции;
- исправлена поддержка 100 Гц дисплеев (и не только);
- исправлены Sprinter ULA и Memory, чтобы не падали если нет контроллера дисковода и т.п.;
- изменен механизм загрузки плагинов, теперь плагины грузятся из сборок перечисленных в plugins.config;
- добавлен отладчик GDB-Z80 server;
- много кода отрефакторено;



Тут довольно сильно затронут механизм синхронизации, поэтому к стабильным релизам пока относить не буду. При синхронизации от видео, теперь вызывается Present для каждого кадра. Нужно потестить как новый механизм работает на разных машинах.
Значительно изменился граф debug info. Теперь тут есть сетка, по горизонтали 25 фреймов, по вертикали 1 мс (белая сетка) или 10 мс (красная сетка).
Расчет данных для графа довольно тяжеловат, поэтому при включении debug info эмулятор кушает дополнительное процессорное время.

Просьба потестить как работает на разных машинах и выложить скрины с включенным debug info при синхронизации от видео.

Заодно просьба написать отзывы по поводу нового звука AY. :) Т.к. серьезно потестить исправленный вариант времени не было.

http://savepic.su/4846048.png

Легенда по графу:

Зеленый график - время между отображением кадров (Present);

Красный график - время затраченное на эмуляцию фрейма (теперь не включает в себя время на рендеринг текстуры и запись буфера в звуковую карту);

Желтая граница - время периода частоты обновления дисплея;

Сиреневая граница - время периода 50 Гц;

Белая сетка - вертикальный масштаб 1 мс на клетку, горизонтальный 25 кадров;
Красная сетка - вертикальный масштаб 10 мс на клетку, горизонтальный 25 кадров;

MinT/AvgT/MaxT - минимальное/среднее/максимальное время между отображением кадров (Present);

AvgE - среднее время эмуляции кадра;

MinL/AvgL/MaxL - минимальная/средняя/максимальная латентность планировщика операционной системы, отражает разницу между запрошенным временем на Thread.Sleep и реальным временем, через которое система вернула управление. Больше 0 - плохо, т.к. будут пропуски кадров. Сильно меньше нуля тоже плохо, т.к. процессор больше времени работает в холостую. Оптимальное значение -0.001...-1.000 мс

Значения вычисляются за период графа - 150 кадров.

[bETA]mEN
24.01.2015, 19:34
- исправлена поддержка 100 Гц дисплеев (и не только);

А на дисплеях с 60 Гц, сейчас, с любыми настройками, будет не очень?

http://i.imgur.com/0gWCAPu.gif

ZXMAK
24.01.2015, 19:49
mEN;776617']А на дисплеях с 60 Гц, сейчас, с любыми настройками, будет не очень?

для 60 Гц дисплея нужно интерполяцию кадров делать, чтобы получить плавный ресэмплинг. Это второй шаг. Сейчас задача добиться хорошей синхронизации.
Сейчас обновление на каждом кадре производится какраз специально для того, чтобы в дальнейшем обновлять кадры с временными коэфициентами для интерполяции.

По гифке не очень понятно, насколько стабильно держится AvgT? Что это за выброс в конце гифки?
Судя по времени обновления на графе, частота кадров реально 59.952 Гц. Если это так, то ресэмплинг сбивается, т.к. ориентируется на частоту, которую говорит DirectX - 59,000 Гц. Первое наблюдение, когда частота кадров дисплея не соответствует заявленной системой.
В реальности действительно так дергается?

abelenki
25.01.2015, 14:39
выкладываю все тесты на 2.8.6.7.

Sayman
27.01.2015, 12:32
скриншот с эмуляции Спринтера:
http://savepic.su/4844482.jpg

ZXMAK
27.01.2015, 12:56
Обновил до версии 2.9.0.38062 (https://zxmak2.codeplex.com/releases/view/611045)


Исправлена и переработана эмуляция AY8910 и звука.
Теперь для ау используется передискретизация.
Исправлены миксеры - общий и АY.
Качество звука выросло в разы :)

Частоту ay можно задавать любую (в разумных пределах), правда пока только вручную через файл конфигурации машины zxmak2.vmz

Интересно услышать ваше мнение по поводу качества звука в новой версии по сравнению с unreal например :)

Vitamin
27.01.2015, 13:19
Интересно услышать ваше мнение по поводу качества звука
Звук не слушал, но заглянул в исходники. Очень странный микшер- сложение сразу двухканальных семплов. Само по себе оно нормальное, но вот ненормированные коэффициенты в m_mixerPreset могут дать переполнение при сложении, что чревато переползанием левого канала в правый и клиппингом в правом канале (или наоборот, не суть важно).
Раз у тебя есть отличное событие OnVolumeChanged, заюзай его по полной- считай таблицу в 32768 элементов примерно следующим способом:


for (int idx = 0; idx != 32768; ++idx) {
int volA = vol_table[idx & 31] * volume / 65535;
int volB = vol_table[(idx >> 5) & 31] * volume / 65535;
int volC = vol_table[(idx >> 10) & 31] * volume / 65535;
int levAL = m_mixerPreset[0];
int levAR = m_mixerPreset[1];
int levBL = m_mixerPreset[2];
int levBR = m_mixerPreset[3];
int levCL = m_mixerPreset[4];
int levCR = m_mixerPreset[5];
int volL = (volA * levAL + volB * levBL + volC * levCL) / 300;
int volR = (volA * levAR + volB * levBR + volC * levCR) / 300;
m_volTable[idx] = volL + (volR << 16);
}


и потом в коде:


var sample = m_volTable[(mixC << 10) | (mixB << 5) | mixA];
UpdateDac(m_lastTime, (ushort)sample, (ushort)(sample >> 16));


Вообще, mixA/mixB/mixC тоже можно считать практически параллельно, но это уже несколько сложнее.

ZXMAK
27.01.2015, 13:33
скриншот с эмуляции Спринтера

Для спринтера это нормально, у него графика прилично процессор ест, нужно оптимизировать.

Кстати как работает ковокс на спринтере? Насколько помню, у спринтера ковокс с буффером. С новым звуком добавить его поддержку думаю будет несложно. У SoundDeviceBase появились методы UpdateDac, принимающие время относительно кадра (от 0 до 1) и метод получающий текущее время кадра (тоже от 0 до 1). Т.е привязки к текущему такту нет - можно сразу пачками апдейты делать, главное время вычислить и с убывающим временем не обновлять :)
UpdateDac теперь несколько вариантов для signed 16 бит и для unsigned 16 бит.

---------- Post added at 12:33 ---------- Previous post was at 12:20 ----------


Звук не слушал, но заглянул в исходники. Очень странный микшер- сложение сразу двухканальных семплов. Само по себе оно нормальное, но вот ненормированные коэффициенты в m_mixerPreset могут дать переполнение при сложении, что чревато переползанием левого канала в правый и клиппингом в правом канале (или наоборот, не суть важно).
Раз у тебя есть отличное событие OnVolumeChanged, заюзай его по полной- считай таблицу в 32768 элементов примерно следующим способом:


Вообще, mixA/mixB/mixC тоже можно считать практически параллельно, но это уже несколько сложнее.\

спасибо, я тоже это заметил, но пока эту часть не трогал, нужно будет пофиксить.

Sayman
27.01.2015, 18:37
Для спринтера это нормально, у него графика прилично процессор ест, нужно оптимизировать.
при использовании Акселя в Альтере, проц, можно сказать, прохлаждается.


Кстати как работает ковокс на спринтере?
есть "документация" и некоторые исходники того же ваф плеера. если в кратце, ковокс буферизированный, с возможностью задавать битность (8 или 16, но тут могу ошибиться).


Covox с буферным ОЗУ.
Подключение буферного ОЗУ осуществляется по следующей схеме:
http://zx-pk.ru/attachment.php?attachmentid=50848&stc=1&d=1422373114
Счетчик работает на частоте 15 или 22 килогерца, в зависимости от состояния порта конфигурации
Covox-а. Адрес мультиплексируется на момент записи в порт из процессора, все остальное время данные
из ОЗУ записываются в регистр ЦАП-а.
Ввод байтов в буферное ОЗУ осуществляется командой OTIR (OUTI), что позволяет ускорить вывод
звука и создать достаточно большие паузы для работы других частей программы. Так как при использовании
команды OTIR регистр B (который попадает на A15..A8 процессора) уменьшается, для нормальной работы
CBL счетчик считает «назад».
Для контроля за работой Covox-Blaster-а используется бит 7 порта #FE, в который выводится старший
бит счетчика. Блок ОЗУ 256 байт условно разбит на две банки по 128 байт, и бит 7 порта #FE указывает
какая из банок ОЗУ выводится в ЦАП в конкретный момент времени. Это используется программой вывода
для определения, нужно ли подгружать следующие 128 байт в буфер.

В плате Sp2000 COVOX-Blaster включен в основную прошивку и включается через порт управления
CBL - #4E. Запись в этот порт значения #80 приводит к включению режима CBL, #00 - включение
обычного COVOX-а. Другие биты порта #4E имеют значение и их следует выставлять в 0 для получения
описанного выше режима CBL. В дальнейшем этот порт будет устанавливать режимы Stereo, 8/16-bit и
частоту.

ZXMAK
27.01.2015, 20:57
при использовании Акселя в Альтере, проц, можно сказать, прохлаждается.


есть "документация" и некоторые исходники того же ваф плеера. если в кратце, ковокс буферизированный, с возможностью задавать битность (8 или 16, но тут могу ошибиться).

используется ли этот Covox-Blaster на других моделях спектрума? или это девайс именно Cпринтера? Есть ли софт на котором его можно потестить?

Из описания не все ясно, например:
1) если начать писать по адресам банки которая сейчас выводится, что произойдет? или вывод по этим адресам блокируется? :)

2) какое назначение для ковокс-бластера имеют остальные биты порта #4E? Какими битами устанавливается режим 8/16, стерео/моно? И в каком формате данные из озу попадают на цап в этих режимах? Ведь если по одному байту устанавливать 16 битный цап, то будет треск...

3) как происходит переключение в режим обычного ковокса? задействуется ли в этом механизме озу или просто выход порта напрямую переключается на цап?

Sayman
27.01.2015, 21:45
ZXMAK, данных по работе CBLа у меня мало. я не разбирался пока в работе звука. То, что Covox-Blaster фишка чисто Спринтера, это точно. на профи или там на атм или скорпе такого не было. Как оно работает точно не знаю, не изучал ещё вопрос, но вот есть несколько исходников и бинаров. Во1х, есть дока от Ивана:



;************************************************* **********************
;
; Пример программы для Covox-Blaster-a.
;
;************************************************* **********************
CLEAR_COVOX: ; программа для очистки буфера ОЗУ и
; отключения звука
LD A,80H ; значение, эквивалентное нулю на выходе Covox
LD BC,0FBH ; порт Covox-Blaster-&#224;
CLEAR_CBL:
OUT (C),A
DJNZ CLEAR_CBL
XOR A
LD (SND_P),A ; установить в страницу звука 0 (нет звука)
RET
;************************************************* **********************
SOUND_START: ; программа инициализации Covox-Blaster-&#224;
;================================================= ======================
; здесь должна располагаться программа, которая
; произведет расчет первой страницы данных для COVOX-&#225;&#235;&#224;&#241;&#242;&#229;&#240;&#224; &#232;
; адреса данных. Страница и адрес соответственно в регистры A и HL
;================================================= ======================
LD (SND_A),HL ; запомнить состояние адреса звука
LD (SND_P),A ; запомнить новую страницу WAV-данных
RET
SND_A: DB 0
SND_P: DW 0
;************************************************* **********************
SOUND:
PUSH AF
LD A,(SND_P) ; проверка, что страница WAV-данных не равна 0
AND A
JR Z,RET_ALL ;иначе выход -- нет звука
PUSH HL
SND_MORE:
IN A,(0FEH) ; бит 7 порта #FE указывает состояние 7-го бита
; счетчика выводимого байта (банк 0/1)
XOR 0 ; запомненное состояние Covox адреса
COV_ADR EQU $-1
AND 80H ; проверить, переключение банки 128 байт
JP NZ,NO_LD_SND ; если изменения не было, вернуться.
LD A,(SND_P)
AND A
JR Z,RET_ALL
PUSH DE
PUSH BC
LD A,(COV_ADR) ; взять адрес Covox-а.
CPL ; инвертировать
LD B,A ; запомнить в B
LD HL,(SND_A) ; взять адрес WAV-данных
LD C,0FBH ; порт Covox-Blaster-а
IN A,(PAGE3) ; запомнить состояние PAGE3
LD E,A
LD A,(SND_P) ; взять номер страницы WAV-данных
OUT (PAGE3),A ; переключить PAGE3
LD D,16 ; повторять 16 раз
L_DDX:
OUTI ; выводить в Covox-Blaster
OUTI ; (OUTI работает несколько быстрее, чем OTIR)
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
DEC D
JR NZ,L_DDX
LD (SND_A),HL ; запомнить состояние адреса звука
LD A,H ; проверить, что адрес не дошел до конца страницы
AND A
JP NZ,NO_SNDP ; если не дошел, идти на выход
LD A,E ; вспомнить страницу PAGE3
OUT (PAGE3),A
;================================================= ======================
; здесь должна располагаться программа, которая
; произведет рассчет новой страницы данных для COVOX-бластера и
; адреса данных. Страница и адрес соответственно в регистры A и HL
;================================================= ======================
LD (SND_A),HL ; запомнить состояние адреса звука
LD (SND_P),A ; запомнить новую страницу WAV-данных
JR NO_SNDP1
NO_SNDP:
LD A,E ; вспомнить страницу PAGE3
OUT (PAGE3),A
NO_SNDP1:
POP BC
POP DE
NO_LD_SND:
POP HL
RET_ALL:
POP AF
RET


Во2х, есть ваф плеер собранный и в виде исходников. Переключение режима 8бит и 16 бит, сюдя по плееру, осуществляется так:



...
LD B,80h+10h ; CBL-mode8 & INT ENABLE
JR Z,NEXT_1
CP 16
LD B,80h+20h+10h; CBL-mode16 & INT ENABLE
...
NEXT_1:

LD A,(0C016h)
CP 1
JR Z,NEXT_2
CP 2
SET 6,B ; set stereo-mode
JR NZ,ERROR2
NEXT_2:
LD A,B
LD (CBL_MODE),A

LD BC,(0C018h) ; частота
LD HL,7000
LD DE,9000
CALL Test_DIAP
EX AF,AF'
LD A,8 ; 8khz
EX AF,AF'
JR Z,NEXT_3

LD HL,10000
LD DE,12000
CALL Test_DIAP
EX AF,AF'
LD A,9 ; 11khz
EX AF,AF'
JR Z,NEXT_3

LD HL,15000
LD DE,17000
CALL Test_DIAP
EX AF,AF'
LD A,10 ; 16khz
EX AF,AF'
JR Z,NEXT_3

LD HL,21000
LD DE,23000
CALL Test_DIAP
EX AF,AF'
LD A,11 ; 22khz
EX AF,AF'
JR Z,NEXT_3

LD HL,30000
LD DE,34000
CALL Test_DIAP
EX AF,AF'
LD A,12 ; 32khz
EX AF,AF'
JR Z,NEXT_3

LD HL,42000
LD DE,46000
CALL Test_DIAP
EX AF,AF'
LD A,13 ; 44khz
; LD A,15 ; 109khz
EX AF,AF'
JR Z,NEXT_3

LD HL,50000
LD DE,60000
CALL Test_DIAP
EX AF,AF'
LD A,14 ; 54khz
EX AF,AF'
JR Z,NEXT_3

JP ERROR3

NEXT_3:
EX AF,AF'
LD C,A
EX AF,AF'
LD A,(CBL_MODE)
ADD A,C
LD (CBL_MODE),A

JP PLAY_FILE
...
LD A,0
LD BC,78
OUT (C),A

LD BC,79
LD A,80h
FILL_L0:
OUT (C),A ; забить во все 80h
DJNZ FILL_L0

LD HL,0A000h ; CLEAR PAGE_IM2
LD DE,0A001h
LD BC,100h
LD (HL),0
LDIR

DI

LD DE,PLAY
LD (0A0FFh),DE ; IM2_ADRESS

LD A,0A0h
LD I,A
IM 2

LD A,(CBL_MODE)
LD BC,78
OUT (C),A
и т.д.


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

ZXMAK
27.01.2015, 22:41
[/SPOILER]
прямо сейчас большего сказать не смогу. сам плеер есть. так же он есть в доступе в теме спринтера в первом посте, там ссылка на рабочий архив с настройками эмуля и образ винта, на котором есть плеер (но нет ваф вайлов).

а что такое Test_DIAP? в коде не вижу вывода в порт для смены частоты, каким портом задается частота остается пока загадкой

Sayman
28.01.2015, 06:59
а что такое Test_DIAP? в коде не вижу вывода в порт для смены частоты, каким портом задается частота остается пока загадкой
по указанной тобой процедуре идёт проверка, попадает ли взятое значение из заголовка ваф файла под выбранную частоту. если посмотреть, то:


LD BC,(0C018h) ; частота
LD HL,7000
LD DE,9000
CALL Test_DIAP ; если в диапазоне, тогда
LD A,8 ; 8khz
JR Z,NEXT_3
...
NEXT_3:
LD C,A
LD A,(CBL_MODE)
ADD A,C
LD (CBL_MODE),A
; а там дальше ты уже видел:
...
LD A,(CBL_MODE)
LD BC,4eh
OUT (C),A


как то так. т.е. все настройки Ковокса через порт 4Eh.
собственно, во вложении отдельно сам плеер.
а тут полный архив с настройками и образами. Скопируй в образ для примера какой-нить ваф вайл, примонтируй образ в эмуль, запусти эмуль как Спринтер и там уже все проверки...
https://www.dropbox.com/s/7lxe0jrmdjtaok6/sp_work.rar?dl=0

ZXMAK
29.01.2015, 15:07
так что, ктото оценивал качество нового AY в ZXMAK2?
Есть ли разница с риалом или один в один как риал играет? :)

Moro
29.01.2015, 20:43
Реала уже давно нет, но на слух очень хорошо. :-)

ZXMAK
30.01.2015, 05:02
попробовал запустить эмулятор с выводом звука на звуковуху с частотой дискретизации 176,4 кГц, впринципе звучит также, но не совсем :smile:
В некоторых мелодиях можно заметить небольшие ньюансы на высокочастотных звуках и шуме, кое-где даже провляются эффекты не заметные на 44,1 кГц, плюс на 176 кГц появляется едва заметная субъективная разница, которую в словах можно описать как "более чистый звук" :smile:
А на 192 кГц звук еще чище :biggrin: Кстати нагрузка на процессор заметно при этом практически не меняется :)

Кому интересно, сейчас частота задается в двух местах - при создании DirectSound, там же указывается размер буфера и его тоже нужно корректировать (вместо 882 нужно указать частоту/50). А второе место в SoundDeviceBase при вызове метода ApplyTimings.
Впринципе можно прикрутить установку частоты дискретизации звуковухи в настройки, но думаю пока это немного опасно будет, т.к. хорошо поддерживаются только частоты кратные 50 Гц.

Кстати выяснился еще один интересный эффект. Для тестов звука понадобилась запись Stereo Output, но как выяснилось дефолтный драйвер Win 7 не поддерживает этого, почитал что пишут - оказалось нужно устанавливать родной драйвер. У меня звуковуха встроенная на материнку (какой-то риалтек), установил и был немного удивлен результатом...
Кроме того что появилась возможность включить запись того что сейчас играет в системе, в эмуляторе при синхронизации от звуковухи синхра стала держаться на 50 Гц без провалов... :)

Vitamin
30.01.2015, 11:19
Для теста адекватности эмуляции AY рекомендую музон из второй части демы Binary Love (Authors/Joe/Binary Love 2.ftc в коллекции Бульбы). Там весьма зубодробительное сочетание ВЧ тона и огибающей- хорошо слышно разницу между разными режимами эмуляции и фильтрации.

ZXMAK
30.01.2015, 14:13
Для теста адекватности эмуляции AY рекомендую музон из второй части демы Binary Love (Authors/Joe/Binary Love 2.ftc в коллекции Бульбы). Там весьма зубодробительное сочетание ВЧ тона и огибающей- хорошо слышно разницу между разными режимами эмуляции и фильтрации.

А запись с реального ау есть?

Vitamin
30.01.2015, 20:04
А запись с реального ау есть?
Можешь сверяться с http://sovietov.com/app/ayumi/ayumi.html как с эталоном звучания.

Gonzo
30.01.2015, 23:35
ZXMAK,прикрути п/ж сохранение в SCL

ZXMAK
31.01.2015, 00:47
ZXMAK,прикрути п/ж сохранение в SCL

сохранение в SCL и hobeta специально и преднамеренно вырезано, т.к. это очень проблемный формат, сохранение в нем портит образы, т.к. в SCL не предусмотрено сохранение секторов которые могут содержать важные данные. Ну и кроме того поддержка сохранения проблематичная, т.к. код эмулятора не должен разбираться какие сектора к какому файлу относятся, тем более что записанная на диске информация часто не соответствует действительности.

SCL - это мертвый формат, сохранение в нем часто приводит к порче софта, причем определить испортился образ при сохранении или нет невозможно. А смысла в нем нету, TRD в ZIP архиве меньше места занимает и с ним меньше проблем.

---------- Post added at 23:47 ---------- Previous post was at 23:23 ----------


Можешь сверяться с http://sovietov.com/app/ayumi/ayumi.html как с эталоном звучания.

спасибо, при детальном исследовании BIN LOVE part 2, сразу обнаружилось что есть проблема с миксером AY. Вначале мелодии ничего не слышно, хотя в это время идут переливы. Сразу определить в чем проблема не удалось, чтото странное. Вот так у меня микшируются генераторы, шум и огибающая:

тут три бита m_stateGen содержат состояние выходов делителей A, B, C генератора.
А три бита m_stateNoise содержат состояние генератора шума (одинаковое).
Делаем ИЛИ с управляющими битами регистра миксера и получаем единицы для отключеных каналов.


var outGen = m_stateGen | (m_controlChannels & 7);
var outNoise = m_stateNoise | ((m_controlChannels & 0x38) >> 3);


Тут делаем И между выходами генератора и генератором шума (отключенные каналы в 1 и не влияют на результат)


var outMix = outGen & outNoise;


Тут мы берем вначале амплитуду 0, потом проверяем состояние outMix - если 1, то берем амплитуду из регистра амплитуды.
Далее проверяем если в амплитуде включен старший бит, то берем амплитуду из из генератора огибающей.
mixA + 1 - это рудимент, предназначался чтобы использовалась большая амплитуда из 32 (на баг не влияет)


var mixA = 0;
if ((outMix & 0x01) != 0)
{
mixA = (m_volumeA & 0x1F) << 1;
mixA = (mixA & 0x20) == 0 ? mixA + 1 : m_bendVolumeIndex;
}


чтото тут неправильно :smile:
Если инициализировать mixA=0x0F, то переливы в BIN LOVE появляются, но дальше по мелодии вместо нормальных эффектов возникает какие-то шумовые эффекты :smile:
Может ктото разбирается генераторах AY, подскажет в чем ошибка?

SAM style
31.01.2015, 00:58
SCL - это мертвый формат, сохранение в нем часто приводит к порче софта, причем определить испортился образ при сохранении или нет невозможно. А смысла в нем нету, TRD в ZIP архиве меньше места занимает и с ним меньше проблемЯ чуть печенькой не подавился. Можно сказать, что всё, кроме UDI - мёртвые форматы, потому что не сохраняют все поля дорожки и важная информация может быть утеряна. SCL хранит файлы, он для этого и предназначен. Выдай-ка кучу примеров, как SCL портит обычный софт.

ZXMAK
31.01.2015, 01:13
Я чуть печенькой не подавился. Можно сказать, что всё, кроме UDI - мёртвые форматы, потому что не сохраняют все поля дорожки и важная информация может быть утеряна. SCL хранит файлы, он для этого и предназначен. Выдай-ка кучу примеров, как SCL портит обычный софт.

почему-же, вовсе не так, для обычных записей (без приколов с хитрой записью секторов, маркеров и т.п.) TRD - отличный формат, ну и заодно позволяет сразу записать на диск чтото, без танцев с бубном :smile:

---------- Post added at 00:13 ---------- Previous post was at 00:08 ----------

посмотрел свежим взглядом на код миксера, вот это я намудрил с битами :)
Поправил, чтобы соответствовало задуманному:


var mixA = 0;
if ((outMix & 0x01) == 0)
{
mixA = (m_volumeA & 0x1F) << 1;
mixA = (mixA & 0x20) == 0 ? mixA & 0x1F : m_bendVolumeIndex;
}


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

SAM style
31.01.2015, 01:21
почему-же, вовсе не так, для обычных записей (без приколов с хитрой записью секторов, маркеров и т.п.) TRD - отличный формат, ну и заодно позволяет сразу записать на диск чтото, без танцев с бубном :smile:Для обычных файлов и SCL - отличный формат. 97% игр/софта не используют удалённые файлы или "якобы свободные" сектора, которые потом в SCL не сохранятся.
На рабочих TRD приходится иногда MOVE делать (не надо мне рассказывать, что нечасто, я на реале долго кодил), а в SCL сохранил - уже спрессовал место.
---
А ещё и с TRD бывают извращения - больше 160 дорожек, обрезанные по дорожке/сектору, всякие чешскопольские умельцы извращаться умеют...

ZXMAK
31.01.2015, 01:32
Для обычных файлов и SCL - отличный формат. 97% игр/софта не используют удалённые файлы или "якобы свободные" сектора, которые потом в SCL не сохранятся.
На рабочих TRD приходится иногда MOVE делать (не надо мне рассказывать, что нечасто, я на реале долго кодил), а в SCL сохранил - уже спрессовал место.
---
А ещё и с TRD бывают извращения - больше 160 дорожек, обрезанные по дорожке/сектору, всякие чешскопольские умельцы извращаться умеют...

Из за таких 97% мне не раз пришлось повозиться, чтобы понять почему программа глючит - с виду образ рабочий, все запускается, но глючит. Обычно этим буты страдают


Когдато по размеру трд определялось сколько сторон у диска, но в zxmak это пришлось отключить из за появления вот таких инвалидных трдшек :)

SAM style
31.01.2015, 01:46
Из за таких 97% мне не раз пришлось повозиться, чтобы понять почему программа глючит - с виду образ рабочий, все запускается, но глючит. Обычно этим буты страдаютВсякие "скрытые" буты, которые сидят на 0 дорожке, конечно, не подходят для SCL, но почти все остальные годятся! Для образов без boot-ов надо сделать, как в Unreal - догружать туда пользовательский boot.$B
Да и не обязательно софт будет что-то на диск писать - куча игр, демки вполне могут храниться в SCL и не источать неприятных запахов.

Gonzo
31.01.2015, 01:57
тогда прикрути выбор из зипа с хобо файлами какие из них на диск пихать ... когда их в зипе штук сорок .. а то достало каждый раз кидать зип

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

ну типо галочку поставить что монтировать.

ZXMAK
31.01.2015, 02:04
тогда прикрути выбор из зипа с хобо файлами какие из них на диск пихать ... когда их в зипе штук сорок .. а то достало каждый раз кидать зип

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

ну типо галочку поставить что монтировать.

хм, действительно дельное предложение :smile:
как разберусь с AY и синхронизацией (я ее опять хочу переделать, т.к. текущий вариант не позволяет железобетонную синхру сделать), займусь дискетами, нужно еще прикрутить поддержку образов с аппаратно считанными raw дорожками в mfm.
Еще думаю встроенный snippet compiller прикрутить, c подсветкой и т.п., чтобы компилить небольшие куски кода и отлаживаться по исходному коду. Компилятор думаю использовать сторонний, сделать настройку конфигураций для разных языков и дергать внешний компилятор через командную строку... :)


---------- Post added at 01:04 ---------- Previous post was at 01:01 ----------



Да и не обязательно софт будет что-то на диск писать - куча игр, демки вполне могут храниться в SCL и не источать неприятных запахов.

так чтение SCL и хобет и так работает :)
Убрана только запись, т.к. с ней много проблем было, плюс опасность потерять сектора при записи.

Gonzo
31.01.2015, 02:46
спс и прикрути поддеожку записи с мафона.

---------- Post added at 02:08 ---------- Previous post was at 02:06 ----------

в старых версиях вроде было не помню .. ща нема..

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

в спекуляторе есть чтение с кассеты у тя нема. надо..

---------- Post added at 02:17 ---------- Previous post was at 02:10 ----------

раньше была такая шляпа как плавное затухание лампы на дисковде.. не в одном эмуле не видал.. а на реале есть)))

---------- Post added at 02:46 ---------- Previous post was at 02:17 ----------

ну чтоб визуально видно было.. помню ета хрень в ревю публиковалась

ZXMAK
31.01.2015, 02:47
в спекуляторе есть чтение с кассеты у тя нема. надо..

в каком смысле чтение с магнитофона? чтение и так есть...

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

Кстати с портами беда - когда стал настройки портов для машин прописывать, оказалось что для многих машин они просто общие используются. Покопался в интернете, оказалось что найти информацию о том как декодируются порты для разных машин практически невозможно. В unreal с этим вообще беда, там порты вручную подогнаны с разными костылями, чтобы как-то работало с разным софтом.
Даже информацию про декодирование портов AY в пентагоне найти невозможно. Пришлось сидеть разбираться по схеме, которую кстати тоже проблематично найти (оригинал схемы В.М.Г. так и не нашел). И как выяснилось, в большинстве эмуляторов выборка портов AY для пентагона реализована неправильно.

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

Gonzo
31.01.2015, 03:33
чтение в реале я типо майфун подклю
чил

---------- Post added at 03:31 ---------- Previous post was at 03:24 ----------

раньше была такая шляпа как плавное затухание лампы на дисковде.. не в одном эмуле не видал.. а на реале есть)))

---------- Post added at 03:33 ---------- Previous post was at 03:31 ----------

забубень

ZXMAK
31.01.2015, 06:35
прикрутил эмулятор AY от unreal :biggrin:
Вся логика, счетчики и миксер из unreal 038, не переносил только ресэмплинг - используется старый SoundDeviceBase, хотя он тоже на базе кода unreal основан.
Эмулятор AY от unreal прожорливый оказался, жрет чуть больше времени чем эмуляция всего остального железа занимает. На звуковухе со 176 кГц звуком неплохо работает :smile:


Судя по коду unreal, огибающую тоже нужно миксить как и генератор с шумом. Попробую зафиксить родной zxmak эмулятор AY, он поменьше процессор кушает :smile:

Вобщем в следующей версии можно будет через unity.config переключать какой эмулятор AY использовать - zxmak или unreal. Заодно прикручу, чтобы можно было частоту звуковухи задавать - тоже будет через unity.config задаваться

Дмитрий
31.01.2015, 07:46
т.к. с ней много проблем было, плюс опасность потерять сектора при записи.
Ну так честно предупреждай пользователя, что делается на ваш страх и риск, мол возможна порча иму... содержимого. пусть юзер имеет возможность сохранять в SCL, но делает это сознательно.

---------- Post added at 07:46 ---------- Previous post was at 07:43 ----------


раньше была такая шляпа как плавное затухание лампы на дисковде.. не в одном эмуле не видал.. а на реале есть)))
Скажем так, эта фишка, даже назовем ее багофичей, работала не везде и не всегда, помнится даже был список моделей дисководов, которые умели это, а 3,5" дисководы так, имхо, вообще этого не умели, только головками трещали. Поправьте, если не прав.

SoftLight
31.01.2015, 11:43
чтение в реале я типо майфун подклю
чил
Да в Spectaculator и вроде в zx Spin есть чтение с
реального магнитофона вернее с линейного входа звуковухи или микрофона, смотря как микшер настроить. Иногда полезно например включаешь ютуб где со звуком грузится что–то в спектрум автора и Spectaculator начинает синхронно грузить:)

---------- Post added at 11:43 ---------- Previous post was at 11:41 ----------


раньше была такая шляпа как плавное затухание лампы на дисковде.. не в одном эмуле не видал.. а на реале есть)))

Эх запамятовал я примеры - была какая-то игрушка и еще в zx-ревю пример кода печатали.

Alex Rider
31.01.2015, 18:45
ZXMAK, еще раз напомею свою хотелку про автоапдейт. Ну не вызывает у меня радости перекачивать архив с билдом при каждом обновлении. У тебя ж не поумертвый unreal от трупософта, которых хорошо, если раз в год апдейтится. Живое развитие, но ты теряешь тестеров эмуля из-за необходимости руками апдейтить сборку на машине. Если не хочешь делать, хотя бы напиши почему нет.

---------- Post added at 18:45 ---------- Previous post was at 18:44 ----------

Кстати, уркто было бы вообще сделать инсталлер. Жмешь на ссылку в теме - оно выкаичвается и ставится.

ZEman
31.01.2015, 19:48
да чтение с реального кассетника было бы очень хорошо.
несколько эмуляторов обладают такой функцией - Spectaculator, ZX Spin, Klive, spectrum ZigaRamsak.
сам когда-то с помощью zx spin оцифровал немало игрушек и прог с кассет.

Vitamin
31.01.2015, 22:17
Эмулятор AY от unreal прожорливый оказался, жрет чуть больше времени чем эмуляция всего остального железа занимает. На звуковухе со 176 кГц звуком неплохо работает :smile:

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

ZXMAK
01.02.2015, 02:25
Убери микширование с помощью таблицы на 32к элементов (как я описал ранее) - получишь неплохой профит в скорости.
unreal использует оверсемплинг, потому так и много кушает (хотя много- понятие относительное).


Так у меня тоже оверсэмплинг, UpdateDac использует оверсэмплинг :)
Вобщем порефакторил звук, добавил микширование огибающей, поправил косяки и вышло тоже самое что в unreal. Но в unreal операции оптимизированы чтобы не делать if, поэтому не стал мудрить - заюзал микcер unreal, порефакторил код и вынес эмуляцию в hardware.circuits. Уже закомитил, кому интересно могут уже сбилдить и потестить. Звук ау заметно преобразился, особенно там где эффекты на огибающей :)

как выяснилось, процессор ел ресэмплер, т.к. я тестил его на частоте дискретизации 176 кГц. Так впринципе примерно одинаково, но нагрузка на проц с новой реализацией чуток подросла, проявляется когда в музыке активно огибающая используется

[bETA]mEN
01.02.2015, 14:03
кому интересно могут уже сбилдить и потестить
http://www.emucr.com/search/label/ZXMAK2

ZEman
01.02.2015, 14:10
не советую брать оотуда билды, они частенько оказываются нерабочими.

ZXMAK
01.02.2015, 18:30
не советую брать оотуда билды, они частенько оказываются нерабочими.

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

Начиная с версии 38156 можно задавать частоту дискретизации (должна быть кратной 50) для звуковой платы в unity.config (контейнер winforms, т.к. есть еще xna с аналогичным блоком для XnaSound):


<!-- Host -->
<register type="IHostSound" mapTo="HostSound_Mdx">
<constructor>
<param name="form" />
<param name="sampleRate" value="44100" />
<param name="bufferCount" value="4" />
</constructor>
<lifetime type="transient" />
</register>


можно даже уменьшить число буферов, это уменьшает время задержки звука, но тогда могут появиться срывы.
Можно даже попробовать скормить WinForms реализации хост сануд от XNA, но он не запустится - почемуто не хочет без запуска Game класса :smile:
А вот наоборот (DirectX в XNA) - работает :biggrin: Для этого нужно заменить IHostSound регистрацию в контейнере xna (аналогична вышепроцитированной секции для winforms), на такую-же из контейнера winforms.

У кого звуковая плата поддерживает, можно поставить 192 кГц на вывод звука, правда нагрузка на процессор незначительно выростет, поэтому для древних слабеньких машин не рекомендуется.

А начиная с версии 38158 устранен щелчек при запуске. Слабый щелчек все-же остался, но связан с тем что эмулятор AY использует весь диапазон 16 битной амплитуды, поэтому ноль у него не посредине, а в нижней части осциллограммы.

---------- Post added at 17:30 ---------- Previous post was at 15:45 ----------

Записал raw output эмулятора AY на деме BIN LOVE (в том виде как это идет на звуковую карту, до микширования с остальными девайсами).

Частота дискретизации: 192 кГц
Частота AY: 1750000 Гц
Панорама: ABC
Тайминги: Pentagon
Размер файла: 51 МБ в архиве, 237 МБ в распакованом виде

Запись в WAV без компрессии (чтобы сохранить все мельчайшие детали) скачать для изучения можно тут: https://drive.google.com/file/d/0B3Ubk04ABqGfTXR5TGZ3SzVRSEE/view?usp=sharing

Просьба сравнить с риалом, заценить качество эмуляции :)

s_kosorev
01.02.2015, 19:42
Конфигурирование IoC это для программистов инструмент, для пользователей бесполезен, непонятен итд, нужно по человечески ini файл делать, либо GUI интерфейс который это месиво xml будет сам собирать и предлагать доступные варианты значений параметров.

ZXMAK
01.02.2015, 20:06
Конфигурирование IoC это для программистов инструмент, для пользователей бесполезен, непонятен итд, нужно по человечески ini файл делать, либо GUI интерфейс который это месиво xml будет сам собирать и предлагать доступные варианты значений параметров.

Новый UI пока временно не добавляю, т.к. я хочу переделать его архитектуру, чтобы было проще добавлять новые контролы и скрины. Сейчас много зависимостей мешает это сделать, потихоньку от них избавляюсь.
Сейчас просто отвлекся на важные фичи - звук и синхронизация. От них многое зависит, поэтому начал с них.
Конфигурировать тут вобщемто ничего не нужно, достаточно заменить параметры :)

ZXMAK
02.02.2015, 11:04
У кого есть ZX Spectrum 48 Late?

Запустите плиз этот тестик, спектакулятор на нем почемуто глючит - из отладчика по шагам показывает 33, а если запустить в нормальном режиме - показывает 0 :smile:

По всей видимости должно быть 33... Нашел тут ошибочку в ZXMAK2, но пока не уверен правильный ли фикс - нужно убедиться :)

Тест тут: minfo.tap.zip (http://zx-pk.ru/attachment.php?attachmentid=41098&d=1366516383)

Faster
02.02.2015, 14:48
раньше была такая шляпа как плавное затухание лампы на дисковде.. не в одном эмуле не видал.. а на реале есть)))
А какой смысл от этой фичи в эмуле? К тому же, если у юзера соответствующий LED отключен, так он тем более не увидит ни какой индикации.


Скажем так, эта фишка, даже назовем ее багофичей, работала не везде и не всегда, помнится даже был список моделей дисководов, которые умели это, а 3,5" дисководы так, имхо, вообще этого не умели, только головками трещали. Поправьте, если не прав.
3.5" тоже умели...

ZXMAK
03.02.2015, 04:42
Ну вот и зарелизил версию 2.9.1.38194 (https://zxmak2.codeplex.com/releases/view/611303) :)

Что нового:
- переработана звуковая подсистема, улучшена стабильность синхронизации;
- новая эмуляция AY8910 с оверсэмплингом и хорошим качеством звука;
- добавлена возможность менять частоту дискретизации при выводе звука на звуковую карту (пока без UI - только через unity.config, см. параметр sampleRate="44100" для HostSound_Mdx, обращу внимание что в unity.config два места где задается частота - в первом - для Windows, во втором для XNA4);
- добавлено сохранение загрузка частоты AY, панорамы (ABC, ACB, BAC, BCA, CAB, CBA, MONO) и пресет амплитуд AY (пока тоже без UI, редактировать можно в ZXMAK2.VMZ файле (см. аттрибуты для AY8910);
- исправлена длительность прерывания для Spectrum 48 late ULA;
- добавлена эмуляция ЦАП/микрофона на бипере (актуально для ZX48/128, они могут бипером выводить 2-разрядный звук);
- исправлен щелчек при запуске;
- исправлена ошибка возникавшая при попытка загрузить/сохранить блок данных в отладчике;
- исправлено зависание для XNA4 хоста;
- исправлены маски кое-каких портов для ATM & Scorpion конфигураций;
- исправлены небольшие лаги UI возникавшие в отладчике;
- улучшена буферизация звука, теперь вывод звука происходит без блокировок потоков - все lock убрал (используется concurrent синхронизация потоков), т.е. теперь поток проигрывания звука никогда не притормаживает поток UI, за счет чего улучшилась стабильность синхронизации от звука;

http://savepic.su/4895422.png

PS: частоту дискретизации для звуковой карты можно выбирать от 500 Гц, верхний предел ограничен возможностями звуковой карты, обычно это 44100 Гц или 192 кГц. Частота должна быть кратной 50.

Titus
03.02.2015, 07:21
- добавлена эмуляция ЦАП/микрофона на бипере (актуально для ZX48/128, они могут бипером выводить 2-разрядный звук);

В каких программах или демках это можно послушать?

ZXMAK
03.02.2015, 07:36
В каких программах или демках это можно послушать?

В той, что на скриншоте например :)
Там голос после выбора управления так выводится, на простом бипере не слышно :)

ZXMAK
04.02.2015, 01:23
Какие будут отзывы о новом звуке? :)

Titus
04.02.2015, 02:12
Какие будут отзывы о новом звуке? :)

Звук хороший.

Но я пока что эмулем пользоваться не могу, в связи с его подтормаживаниями на моем Core 2 Duo 1.6Ггц. Т.е. занимает он по времени 30-50% быстродействия, но периодически корябается звук при любой синхронизации, хоть по видео, хоть по аудио. У того же Спекткакулятора звук всегда стабилен, хотя видео может терять кадры.

ZXMAK
04.02.2015, 03:29
Звук хороший.

Но я пока что эмулем пользоваться не могу, в связи с его подтормаживаниями на моем Core 2 Duo 1.6Ггц. Т.е. занимает он по времени 30-50% быстродействия, но периодически корябается звук при любой синхронизации, хоть по видео, хоть по аудио. У того же Спекткакулятора звук всегда стабилен, хотя видео может терять кадры.

да, сейчас есть потеря времени на синхронизацию обновления экрана между потоком эмуляции и UI. Нотификация UI потока лочит поток эмуляции, поэтому он приостанавливается, пока UI не обработает WM_PAINT. Поэтому на слабых машинах UI может притормаживать поток эмуляции.
Пробовал вариант когда рендеринг полностью в отдельном потоке - на dlcorp с deathsoft тестили, UI конечно в таком случае уже особой роли не играет, окно стабильно продолжает обновляться даже если на тайтле кликнуть и синхра проще и легче для процессора становится. Но... обнаружились проблемы с поддержкой нескольких дисплеев. Если такое окно перетащить на второй дисплей, оно перестает реагировать на мышь (его даже ухватить за тайтл нельзя), хотя и продолжает прекрасно обновляться...
Проблема в том, чтобы максимально быстро уведомить UI поток о необходимости отрендериться, не задерживая при этом поток эмуляции. Думаю нужно еще покопать вариант с полным рендерингом в отдельном потоке - очень уж красиво работает - никакие UI манипуляции на рендеринг и эмуляцию не влияют :) Т.е. UI и эмуляция живут каждый своей жизнью :)


Разнесенную синхру (когда WaitFrame и PushFrame вызывались из потока эмуляции по отдельности устранил), теперь эмулятор просто кидает серию фреймов, а как их засинхронизировать с дисплеем и звуковухой уже дело хоста. Отдельные вызовы сильно усложняли синхронизацию.
Теперь думаю переделать сам хост, слишком много в нем накручено логики. Нужно проще делать :)
Логика как это должно работать уже понятна, осталось это реализовать. Копаюсь сейчас с возможностями Direct3D :smile:

PS: Ктото в шейдерах разбирается? :smile:

ZXMAK
04.02.2015, 07:19
Думаю пора перейти на SlimDX, т.к. MDX устарел и в нем нет фишек от SlimDX. К тому-же SlimDX поддерживает x64 :)

Titus
04.02.2015, 07:54
обнаружились проблемы с поддержкой нескольких дисплеев. Если такое окно перетащить на второй дисплей, оно перестает реагировать на мышь (его даже ухватить за тайтл нельзя), хотя и продолжает прекрасно обновляться...

Как такое вообще может быть и из-за чего?

DenisGrachev
04.02.2015, 08:52
Чего-то я в исходниках потерялся - наворочено всего :) Хотя, это скорее всего я сейчас не в форме.

ZXMAK, смотри. Есть такой старый эмулятор на C# + XNA - http://zx360.codeplex.com/

Там всё просто. Чтобы получить работающий спек под XNA нужно сделать несколько простых шагов.

1. using Core; Здесь всё :)
2. Spectrum spectrum = new Spectrum();

И всё :) В UPDATE - spectru.execute в DRAW spectrum.ScreenBuffer преобразуется в текстуру XNA (правда под XNA 4.0 нужно несколько изменить код, но не суть)

Внимание, вопрос - как по простому сделать также с ZXMAK2?
Т.е. создаём новый XNA проект, подключаем какие нужны для базовой функциональности классы, создаём спек, обновляем его в UPDATE и отрисовываем в DRAW. Т.е без хостов и прочего.

Есть пару идей, а вменяемый и обновляющийся эмуль на C# один твой :)

ZXMAK
04.02.2015, 14:21
Так реализация под xna4 и так есть, причем со звуком. правда хост для него сыроват - плохо синхронизируется - запускаешь эмулятор с опцией командной строки /host:xna и все. Чтобы по дефолту xna запускался можно в unity.config прописать viewType="xna" вместо winforms.
UI под xna правда нету - просто окно, файлы можно через командную строку открывать

можно использовать DirectSound вместо XnaSound, для этого нужно в unity.config заменить регистрацию IHostSound в xna контейнере на аналогичную из winforms контейнера

Не знаю получится ли на xbox запустить, т.к. engine к файлы через System.IO читает, если будешь пробовать напиши какие референсы мешают я их уберу.

Arigato
04.02.2015, 16:00
Пожелание к разработчику: сделать виртуальную клавиатуру не только для справки где какая кнопка, но чтобы можно было на ней мышкой нажимать кнопки.

Arigato
05.02.2015, 11:23
Эмулятор просто отличный. Но есть еще несколько просьб:
1. В окне Debbuger у меня нет строки для ввода команды, хотя в хэлпе она упоминается. Версия эмулятора 2.9.1.
2. Клавиши на цифровой клавиатуре не работают (работают только /*-+ и ентер). Очень хотелось бы задействовать еще цифры и точку.
3. Выше уже упомянул: виртуальную клавиатуру было бы отлично сделать функциональной, чтобы можно было набирать мышкой (либо пальцем на сенсорном экране!).
4. Если это возможно, сделать функциональной клавишу Delete. По сути там комбинация вперед и Backspace. Но это существенно облегчило бы работу в редакторе Бейсика.
5. Задействовать следующие кнопки на клавиатуре: []{}\|~` - сейчас их нажатие никак не фиксируется.
6. CapsLock кнопка включает режим [E], а не [C]. Наверное, я много очень хочу, но не хватает кнопки Caps. Да и шифты я бы немного не так расположил: Shift левый и правый как Caps Shift, а оба Ctrl как Symbol Shift. В идеале сделать возможность настройки дополнительных клавиш, чтобы каждый как ему удобно разместил все шифты.
7. Добавить в деббагер функцию скопировать программу на Бейсике в буфер обмена, то есть чтобы в буфере был текст программы, который можно вставить, скажем, на форуме.

В общем с такими доработками, по моему мнению, эмулятор вообще будет просто идеальный.

P.S. Сейчас покопаюсь в конфигах эмулятора, может все это удастся сделать самому.

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

Eltaron
05.02.2015, 11:46
В окне Debbuger у меня нет строки для ввода команды, хотя в хэлпе она упоминается.
Надо удалить устройство DEBUGGER и добавить DEBUGGER ADLERS.

ZXMAK
05.02.2015, 19:36
5. Задействовать следующие кнопки на клавиатуре: []{}\|~` - сейчас их нажатие никак не фиксируется.
6. CapsLock кнопка включает режим [E], а не [C]. Наверное, я много очень хочу, но не хватает кнопки Caps. Да и шифты я бы немного не так расположил: Shift левый и правый как Caps Shift, а оба Ctrl как Symbol Shift. В идеале сделать возможность настройки дополнительных клавиш, чтобы каждый как ему удобно разместил все шифты.


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

шифты и кнопки можно настроить в Keyboard.Mdx.config, а вот с несколькими кнопками на одну спектрумовскую, это действительно сейчас не получится, нужно будет мэппинг доработать :)

---------- Post added at 18:36 ---------- Previous post was at 18:34 ----------



7. Добавить в деббагер функцию скопировать программу на Бейсике в буфер обмена, то есть чтобы в буфере был текст программы, который можно вставить, скажем, на форуме.

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