Просмотр полной версии : ZXMAK2 - Виртуальная машина ZX Spectrum
Страницы :
1
2
3
4
5
6
7
8
[
9]
Вроде-бы все TZX 1.20 блоки читаются. Но не могу найти TZX с нормальным блоком CSW, те несколько что гуглятся (AdvancedGretaThunbergSimulator.tzx, 18-CSW_Explosion.tzx, CaseOfMurderA.tzx, OlimpoEnGuerra(Part2).tzx) cодержат CSW блок чисто номинально - в них во всех просто один импульс для паузы в CSW блоке.
Может у кого-то есть TZX файл с CSW блоком для тестов?
Добрый день! Эмулятор scl формат понимает?
Конечно, с самых первых версий понимает.
Я подключаю диск, потом наживаю RUN и... тишина. Ничего. Ни ошибки, ни загрузки. На любом SCL. Читал про KEMPSTON - его отключение ни на что не влияет.
RUN запускает программу boot c диска. Если её нет, то ничего и не будет, без бута нужно вручную запускать RUN "имя программы".
Чтобы запустить бут для вашего SCL, можно открыть его в режиме нового диска и нажать кнопку Quick Boot (дисплей с молнией) - эта кнопка запускает бут из снэпшот файла boot.zip в папке эмулятора. Т.е. грубо говоря на диске бута нет, он запускается из снэпшота. Это самый простой и быстрый способ запуска бута, даже если бута на диске нет.
Либо нужно вначале открыть SCL с бутом и потом открыть ваш SCL в режиме добавления к диску. При этом диски смерджатся и на диске будет как бут, так и ваша программа. Проверить что бут присутствует можно выполнив команду CAT. Когда бут на диске есть можно его запустить с помощью RUN.
yurymerkulov
13.11.2024, 20:44
Спасибо огромное, все заработало!
Встроенный boot симпатичный, кстати :)
Еще такой уже мелкий вопрос. В полноэкранном режиме снизу остается серая полоса. Это так и задумано?
https://disk.yandex.ru/i/m3ya-WpfrzrSog - вот я скрин сделал
Еще такой уже мелкий вопрос. В полноэкранном режиме снизу остается серая полоса. Это так и задумано?
нет, так не должно быть. В полноэкранном режиме, если есть неиспользуемая область (может появляться для пикселов фиксированного размера в зависимости от режима растягивания изображения см. меню View->Scale Mode), она должна быть черной.
А что у вас за система?
yurymerkulov
13.11.2024, 21:03
Windows 10 LTSC 2021 года
Я пробовал все варианты scale mode - снизу строка остается всегда. Такое как на основном 2к мониторе, так и на втором fhd+
PS вопрос решается снятием галочки с пункта показа статусной строки
https://disk.yandex.ru/i/fAc-Up1obno-fQ
Если ее отключить - все работает идеально, без полосы снизу.
да, если включить статусную строку, она будет видна, но она не используется, поэтому смысла включать ее нет
Для справки:
Для переключения моделей спектрума нужно зайти в меню VM->Settings и кнопкой Wizard выбрать модель компьютера.
Если не работает какая-то дисковая игра помогает зайти в настройки машины и включить/выключить галку WD93 No delay для устройства Disk BDI-128.
anarchyman
14.11.2024, 01:01
на MacOS должно работать также как на Linux. Сборка отдельная не нужна, нужно только конфиг подправить.
Приветствую!
Есть предложение. А давайте добавим ZXMAK в brew, что бы все пользователи macos - могли без проблем его устанавливать.
Удивительно - но факт, для macos - так что бы "из коробки" - совсем не много эмуляторов "наших".
Приходится как то руками все собирать, править конфиги или src непосредственно что бы собралось. Это не всегда удобно.
Вот документация, как можно добавить в пакет в brew (одно наверное (кроме непосредственно apple store) из самых популярных средств установки софта))
https://docs.brew.sh/Adding-Software-to-Homebrew
Я могу выступить как тестер, но у меня, увы, сейчас не самая последняя версия macos.
Какой будет Ваш положительный ответ? :-)
я думаю пока рано добавлять, для macOS код пока сыроват в пакеты добавлять, когда добавлю OpenGL рендерер и поддержку мыши с джойстиками для macOS, тогда можно думать.
anarchyman
14.11.2024, 05:50
я думаю пока рано добавлять, для macOS код пока сыроват в пакеты добавлять, когда добавлю OpenGL рендерер и поддержку мыши с джойстиками для macOS, тогда можно думать.
Благодарю за ответ!
Если со своей стороны могу чем то поспособствовать и помочь - дайте знать.
А то уж очень бы желал и я, и еще куча людей видеть отличный и удобный эмулятор для macos :-)
yurymerkulov
14.11.2024, 08:52
У меня, если говорить, о "хотелках", возникает вопрос, можно ли сделать горячие клавиши на быстрое сохранение и загрузку статуса. Пока только через меню, окно выбора имени файла.
У меня, если говорить, о "хотелках", возникает вопрос, можно ли сделать горячие клавиши на быстрое сохранение и загрузку статуса. Пока только через меню, окно выбора имени файла.
Это интересный вопрос, дело в том что в ZXMAK2 некоторые модели спектрума могут использовать полную клавиатуру, т.е. кнопки F1,F2,...,F12, Ctrl, Alt, Shift и т.д. Поэтому горячие кнопки могут обрабатываться в самом спектруме. Для клавиатуры обычного спектрума это не актуально, но в эмуляторе нет разницы какую клавиатуру пользователь добавил к машине.
yurymerkulov
14.11.2024, 14:09
Это интересный вопрос, дело в том что в ZXMAK2 некоторые модели спектрума могут использовать полную клавиатуру, т.е. кнопки F1,F2,...,F12, Ctrl, Alt, Shift и т.д. Поэтому горячие кнопки могут обрабатываться в самом спектруме. Для клавиатуры обычного спектрума это не актуально, но в эмуляторе нет разницы какую клавиатуру пользователь добавил к машине.
Наверняка можно придумать что-то уникальное. Пауза, перезагрузка, полный экран - все это реализовано же. И тут можно какое-нибудь сочетание использовать.
Знаете еще, чем Ваш эмулятор нравится? Подключается kempston и предлагается его назначить на цифровой блок клавиатуры. У меня компактная проводная механика и отдельно беспроводной цифровой блок. Играть в спектрумовские игрушки - просто идеально. Как геймпад получается :) За эту функцию огромное спасибо.
Добавил полную поддержку TZX 1.2, тест билд тут: https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2483921592
Магнитофонный трап доработан, теперь должен работать в большинстве случаев, т.е. для сложных загрузчиков можно не отключать.
Также исправлены кое-какие баги с UI на Linux и небольшие оптимизиции во время проигрывания магнитофона и отображение окна магнитофона.
Если ктото найдет TZX файл который не грузится, дайте знать.
На Raspberry Pi под Linux скорость в несколько раз выше, чем fuse. В fuse с магнитофона грузить - тормозит нереально, а в ZXMAK даже максимальную скорость для ускорения можно включить. Вполне играбельно.
Магнитофонный трап доработан, теперь должен работать в большинстве случаев
Кстати, как делается перехват магнитофона, чтобы работал со всеми загрузчиками?
Кстати, как делается перехват магнитофона, чтобы работал со всеми загрузчиками?
он не со всеми работает, только со стандартными, а чтобы не нарушал нестандартные загрузчики трап переделан максимально прозрачно - вход #059E, выход #05DF, с эмуляцией регистровых изменений и флагов, плюс позиционирование касеты на нужную позицию и полярность входа, если код расчитывает подхватить загрузку со средины блока, как в WIZBALL
А как ведет себя эмулятор, если загрузка совсем нестандартная? Просто ускоряет эмуляцию по максимуму до конца загрузки?
если загрузка нестандартная, все работает как обычно, без трапов
если загрузка нестандартная, все работает как обычно, без трапов
Т.е. пользователю придется ждать 2-3 минуты, когда загрузится игра?
Нашел любопытные образы ленты, игрушка Mask, оригиналы CSW и WAV тут:
https://www.alessandrogrussu.it/loading/Schemes/schemes.html
CSW: https://www.alessandrogrussu.it/loading/DirectRecords/Mask%20(10%20Great%20Games%202).csw.zip
WAV: https://www.alessandrogrussu.it/loading/DirectRecords/Mask%20(10%20Great%20Games%202).wav.zip
Любопытно тут то, что из CSW игра у меня не грузится, fuse тоже отказывается грузить.
А из WAV нормально грузится, хотя этот CSW вроде как из этого WAV получен...
На WOS лежат 2 TZX: https://worldofspectrum.org/archive/software/games/mask-gremlin-graphics-software-ltd
1: https://www.worldofspectrum.org//pub/sinclair/games/m/MASK.tzx.zip
2: https://www.worldofspectrum.org//pub/sinclair/games/m/MASK(IBSA).tzx.zip
Обе версии похожи на исходный WAV, с таким-же необычным загрузчиком. Но... оба TZX тоже не работают, ни у меня, ни в fuse. Иногда случайно загружаются если долго дергать загрузку сохранившись в снэпшот. Тоесть есть какая-то плавающая ошибка.
При этом оригинал из WAV грузится абсолютно стабильно. Однако в CSW почему-то начальное состояние сигнала 1, а в исходном WAV - 0. Что окончательно запутывает ситуацию. Пробовал инвертировать начальное состояние в CSW, загрузка вроде стаблильнее становится, но всеравно до конца не грузится.
Отсюда возникают вопросы - неужели на WOS выложили битые TZX образы? И почему в CSW начальное значение отличается от WAV оригинала?
Еще очень странная штука - в CSW и WAV sampleRate = 45454 Hz. Чтото тут не так, откуда такая частота? Разве есть звуковухи с такой странной частотой?
Lethargeek
20.11.2024, 01:56
Обе версии похожи на исходный WAV, с таким-же необычным загрузчиком. Но... оба TZX тоже не работают, ни у меня, ни в fuse. Иногда случайно загружаются если долго дергать загрузку сохранившись в снэпшот. Тоесть есть какая-то плавающая ошибка.
вроде там неправильная полярность, на спекомпутинге лежит пофикшенный pzx
https://spectrumcomputing.co.uk/entry/3042/ZX-Spectrum/MASK/
возможно и полярность, но тогда полярность непосредственно перед самими блоками, т.к. полярность в начале файла я пробовал менять - не помогает. При этом напомню, что из оригинального WAV всё грузится нормально.
И что совсем непонятно, начальная полярность в WAV файле 0, а в CSW файле 1. Возникает вопрос - это ошибка софта, который конвертил WAV в CSW или в CSW начальная полярность указывается наоборот?
Также мучают сомнения, есть подозрения, что далеко не все магнитофоны имеют одинаковую полярность выхода... тогда как работала загрузка с оригинальных кассет?
Lethargeek
20.11.2024, 12:40
Также мучают сомнения, есть подозрения, что далеко не все магнитофоны имеют одинаковую полярность выхода... тогда как работала загрузка с оригинальных кассет?
запросто - нечувствительные загрузчики
- - - Добавлено - - -
И что совсем непонятно, начальная полярность в WAV файле 0, а в CSW файле 1. Возникает вопрос - это ошибка софта, который конвертил WAV в CSW или в CSW начальная полярность указывается наоборот?
а в других csw вообще бывает не с единицы?
запросто - нечувствительные загрузчики
что значит нечувствительные загрузчики?
В том-то и дело, что есть загрузчики чувствительные и они с оригинальной кассеты для реального железа, а не для TZX/CSW/WAV писались... :)
тот-же WIZBALL, как он на оригинале грузился с рандомной начальной полярностью?
а в других csw вообще бывает не с единицы?
вот этого не знаю. Я как-раз и наткнулся на эти образы, когда искал CSW для тестов.
У меня нет достоверно правильных CSW файлов для тестов...
Lethargeek
20.11.2024, 14:03
что значит нечувствительные загрузчики?
замеряют только время между фронтами
Про MASK Alessandro же пишет (https://www.alessandrogrussu.it/loading/Schemes/docs/gremlin2.html): "Warning - due to the wrong concept of the loading routine (it detects the falling edge), all the double pulses must start with the EAR=0 pulse followed by the EAR=1 pulse! "
Как я понимаю, реальный магнитофон выдаёт синусоиду. А реальный компаратор захватывает только «половину», положительную или отрицательную — не важно, так как, во-первых, всегда такую, а, во-вторых, на входе синусоида. Дальше, насколько синусоида с данного конкретного магнитофона будет корректно обработана компаратором с данными конкретными настройками, как правильно сказал тов. Lethargeek, это лотерея, но предвзятая, магнитофоны, всё же более или менее стандартизированы, а компаратор в реальном устройстве на эти стандартизированные магнитофоны настроен.
А что имели в виду под «correct polarity» кто-там-размещал PZX на SC, тут можно только гадать. Если принять за оригинал TZX, то там только блоки 0x11, там никакой полярности и быть не может по определению, это битовая последовательность. Может быть, они имели в виду параметры DSP, который использовался при оцифровке сигнала в тот TZX. PZX-же, пытается описать именно исходный сигнал, там уже можно передать какие-то особенности сигнала и делегировать его правильное декодирование реализации компаратора. Мне кажется, для работающей оцифровки (PZX), правильнее было написать «better reproduction of the original signal»
В эмулятор можно добавить поддержку ZX-EVO TS Config?
Про MASK Alessandro же пишет (https://www.alessandrogrussu.it/loading/Schemes/docs/gremlin2.html): "Warning - due to the wrong concept of the loading routine (it detects the falling edge), all the double pulses must start with the EAR=0 pulse followed by the EAR=1 pulse! "
оно как-бы так и получается - стабильно грузит только если полярность в ноль установить, но вопрос - как-же это работало на реальных магнитофонах, где полярность могла зависеть от конкретного магнитофона?
- - - Добавлено - - -
В эмулятор можно добавить поддержку ZX-EVO TS Config?
Видеорежимы EVO должны работать. Поддержка каких-то устройств типа FDD, сд-карты, часов и т.п. есть. Что конкретно понимается под TS Config, честно говоря не знаю. Подразумевается аппаратное ускорение спрайтов и т.п.? Добавить-то можно, но есть более приоритетные задачи. Пока делаю поддержку Linux/MacOS и новых форматов ленты.
Что конкретно понимается под TS Config, честно говоря не знаю. Подразумевается аппаратное ускорение спрайтов и т.п.?
Ну да, как-то так https://speccy.info/TS-Config
Lethargeek
20.11.2024, 17:29
как-же это работало на реальных магнитофонах, где полярность могла зависеть от конкретного магнитофона?
так же как защищённые и нестандартные записи в целом - хреновее
Lethargeek
29.11.2024, 19:06
Вроде-бы все TZX 1.20 блоки читаются. Но не могу найти TZX с нормальным блоком CSW
а где ты брал само описание csw? гуглить пробовал, куча мёртвых ссылок или невнятица
также, как сделал поддержку в блоке #19 более двух символов в алфавите?
из доки рамсофта неясно, номер символа в потоке данных little или big endian
- - - Добавлено - - -
а также непонятно, как реагировать, если в данных закодирован несуществущий символ
(номер больше максимального в таблице, но влез в установленную разрядность)
также, как сделал поддержку в блоке #19 более двух символов в алфавите?
из доки рамсофта неясно, номер символа в потоке данных little или big endian
можешь tzx выложить?
а где ты брал само описание csw? гуглить пробовал, куча мёртвых ссылок или невнятица
из веб архива восстановил, вот
Кстати, на счет ZXMAK2.
Какой рендер для видео используется Direct2D или Direct3D?
И какой для звука? WASAPI или DirectSound?
Кстати, на счет ZXMAK2.
Какой рендер для видео используется Direct2D или Direct3D?
И какой для звука? WASAPI или DirectSound?
под win используется Direct3D, DirectSound и DirectInput
Насчет словаря в TZX #19 возможно есть проблема, которая не воспроизводится из-за отсутствия TZX файлов с некоторыми комбинациями, буду тестить... :)
под win используется Direct3D, DirectSound и DirectInput
Для синхронизации с лучом ты используешь DMW или же ждешь луч отслеживая сканлайны, или же делегируешь переключение буферов Direct3D автоматически?
Почему не WASAPI, ведь на всех виндах после XP она есть, и DirectSound там эмулируется, что хуже, чем нативный WASAPI?
Тоже самое с DirectInput, который даже на XP уже устарел.
Видео рендерится из отдельного потока, который ничем другим больше не занимается - просто рендерит в цикле кадры, поток эмуляции ему кидает кадры в ConcurrentQueue, чтобы не использовать блокировки и при их появлении этот поток просто рендерит из этой очереди в каждом кадре. Рендеринг завершается вызовом Present, по завершении которого устанавливается ивент, по которому синхронизируется поток эмуляции.
Я пробовал и сканлайн отслеживать, но преимуществ от этого не заметил - только нагрузка на проц растет. Т.к. поток больше ничем не занимается, то он всегда вовремя дергает Present, поэтому по его завершению можно четко отслеживать начало развертки.
Честно говоря я уже и сам забыл все это, пришлось пройтись по коду, вспомнить. Кстати там можно еще улучшить синхронизацию, как оказалось между Present и установкой ивента работает еще код, что может несколько откладывать установку ивента относительно реального положения луча.
Lethargeek
30.11.2024, 03:10
можешь tzx выложить?
не уверен, существуют ли вообще такие в дикой природе :D но ведь теоретически допускаются
ошибка действительно была с загрузкой блока #19 с нестандартным размером словаря. Исправил :)
Собрал новый тестовый билд:
https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2508881244
- исправлен TZX #19 блок для нестандартных размеров словаря
- исправлен CSW, теперь с обработкой полярности
- переработано сканирование клавиатуры (теперь матрица клавиатуры полностью конфигурируется, добавлены конфиги клавиатуры для PROFI и для Орель с её нестандартной клавиатурой)
- добавлена новая модель спектрума Орель (менеджер памяти и клавиатура)
- исправлен баг с делителем шума AY
- переработан запрос NMI, теперь NMI и MAGIC/MONITOR это отдельные команды
- исправлены баги с точками останова в отладчике
- мелкие оптимизации
ошибка действительно была с загрузкой блока #19 с нестандартным размером словаря. Исправил :)
Собрал новый тестовый билд:
https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2508881244
- исправлен TZX #19 блок для нестандартных размеров словаря
- исправлен CSW, теперь с обработкой полярности
- переработано сканирование клавиатуры (теперь матрица клавиатуры полностью конфигурируется, добавлены конфиги клавиатуры для PROFI и для Орель с её нестандартной клавиатурой)
- добавлена новая модель спектрума Орель (менеджер памяти и клавиатура)
- исправлен баг с делителем шума AY
- переработан запрос NMI, теперь NMI и MAGIC/MONITOR это отдельные команды
- исправлены баги с точками останова в отладчике
- мелкие оптимизации
ZXMAK Спасибо большое за поддержку Орельки. Для меня по крайней мере теперь это лучший эмулятор zx spectrum. Орельку можно прятать в ящик :)
https://pic.maxiol.com/thumbs2/1732972838.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732972838.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732972880.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732972880.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732972904.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732972904.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732972920.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732972920.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732972934.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732972934.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732972945.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732972945.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732972957.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732972957.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732972969.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732972969.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732972981.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732972981.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732973001.1596886884.4.jpg (https://pic.maxiol.com/?v=1732973001.1596886884.4.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732973013.1596886884.5.jpg (https://pic.maxiol.com/?v=1732973013.1596886884.5.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732973025.1596886884.5.jpg (https://pic.maxiol.com/?v=1732973025.1596886884.5.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732973052.1596886884..jpg (https://pic.maxiol.com/?v=1732973052.1596886884..jpg&dp=2)https://pic.maxiol.com/thumbs2/1732973203.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732973203.1596886884.screenshot20241130.jpg&dp=2)https://pic.maxiol.com/thumbs2/1732973224.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732973224.1596886884.screenshot20241130.jpg&dp=2)
ZXMAK Спасибо большое за поддержку Орельки.
Скриншоты не смотрятся без ВПН.
Лучше размещать их на https://pic.maxiol.com/
Скриншоты не смотрятся без ВПН.
Лучше размещать их на https://pic.maxiol.com/
Перезалил.
Вот чучуть не в тему, чисто настальгическое воспоминание об орельке.. Отсканированая клавиатура орели, у кого была орель у того заложилось на долгую память как мягко работают кнопки орели, руссифицированная клавиатура и игра Bomb Jack кажется из-за руссификации не работала на орельке, но с прошивкой rapidos все работало..
https://pic.maxiol.com/thumbs2/1732973486.1596886884..jpg (https://pic.maxiol.com/?v=1732973486.1596886884..jpg&dp=2)
теперь это лучший эмулятор zx spectrum. Орельку можно прятать в ящик
возможно у Орель другие тайминги экрана (на первой картинке смещены полосы на бордюре).
посмотри как это выглядит на реале.
- - - Добавлено - - -
Скриншоты не смотрятся без ВПН.
всё зависит от твоего провайдера !!!
я их спокойно вижу.
всё зависит от твоего провайдера !!!
я их спокойно вижу.
Он их перезалил)
возможно у Орель другие тайминги экрана (на первой картинке смещены полосы на бордюре).
да, ULA я не добавлял, да и вообще не тестил, т.к. у меня нет программ орели, которыми можно потестить развертку изображения.
Я неудачно в конфиг орели добавил ULA от стандартного ZX Spectrum 48, у которой задержки есть, а у орели нет. Лучше конечно выбрать в настройках ULA от другой модели - без задержек, чтото вроде Pentagon. Для этого после переключения в модель Орель, нужно настроить ULA, выбрав другой тип.
Чтобы исправить настройку по умолчанию при смене модели, можно подправить machines.config, скопировав строку с ULA из ZXMAK2.vmz
Для детальной настройки ULA нужны тесты с фотками как на реальной орели выглядит.
Основной момент - протестить клавиатуру (как я вижу тест похоже пройден, кроме кнопок ГРАФ, НОРМ, ИНВ, РЕД. Где взять этот тест клавиатуры орель со скрина?
Кнопка УПР должна работать - она в конфигурации клавиатуры замаплена на кнопку KEY_INSERT. Можно добавить в конфиг и ГРАФ, НОРМ, ИНВ, РЕД, правда для этого прийдется решить на какие кнопки их замапить, что непросто, т.к. почти все кнопки клавиатуры заняты клавишами орели. Можно например KEY_Fx использовать.
Сама конфигурация клавиш задана в Keyboard-orel.config. Вначале идет определение матрицы клавиатуры:
<!--Keyboard matrix rows. The button names defined in these row
definitions are used in the Key attribute of KeyBinding elements-->
<!-- KD0, KD1, KD2, KD3, KD4, KD5, KD6,KD7 -->
<Row> ALT, Z, X, C, V, RUS, _, REG, </Row>
<Row> A, S, D, F, G, BACKSLASH, _, SLASH, </Row>
<Row> Q, W, E, R, T, COMMA, _, DOT, </Row>
<Row> 1, 2, 3, 4, 5, GRAVE, _, TAB, </Row>
<Row> 0, 9, 8, 7, 6, MINUS, _, EQUAL, </Row>
<Row> P, O, I, U, Y, LEFTBRACE, _, RIGHTBRACE, </Row>
<Row> ENT, L, K, J, H, SEMICOLON, _, APOSTROPHE, </Row>
<Row> SPC, UPR, M, N, B, RA, _, CAPSLOCK </Row>
В ней задаются имена элементов матрицы, в данном случае условное название кнопок. Эти условные имена используются только в конфиг файле, поэтому можно переименовать при желании, можно и на других языках писать, но учитывать, что разделителем являются символы ',', ';', ' ', '\t', их использовать в качестве имени нельзя. Неиспользуемые элементы матрицы лучше называть одинаково _ для единообразия.
Далее определеняется какие кнопки приводят к срабатыванию элемента матрицы, например:
<KeyBinding Key="RA">
<Condition Key="KEY_LEFTALT"/>
<Condition Key="KEY_RIGHTALT"/>
</KeyBinding>
Задает срабатывание кнопки Р/А по нажатию одной из клавиш KEY_LEFTALT или KEY_RIGHTALT.
Если задан атрибут Condition в элементе KeyBinding, то вложенные элементы Condition игнорируются (хотя есть мысль убрать это ограничение, т.к. оно запутывает):
<KeyBinding Key="TAB" Condition="KEY_TAB"/>
PS: для картинок наверное лучше https://imgur.com использовать - и шустрее и вроде везде работает, но чтобы можно было в эмулятор вставить лучше переделать изображение в графику по аналогии как в Help->Keyboard сделано, желательно с векторной графикой.
ссылка (https://imgur.com/EQDywRV)
yashcher
30.11.2024, 20:18
Собрал новый тестовый билд:
https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2508881244
- добавлена новая модель спектрума Орель (менеджер памяти и клавиатура)
Отличный эмулятор. QuickBoot, мне очень нравится. Автор, пожалуйста, развивайте свой проект и добавляйте хоть иногда в него новые возможности: не хватает маленьких инструментов, типа просмотрщика графики, удобного помощника клавиатуры, в котором работает нажатие клавиш (соответственно, добавить изображение клавиатуры Байта, Орели) и т.п., что можно было бы перенять из других, по-большей части заброшенных, эмуляторов.;)
Lethargeek
30.11.2024, 22:20
ошибка действительно была с загрузкой блока #19 с нестандартным размером словаря. Исправил
так как правильно-то было? и как узнал)
Отличный эмулятор
Согласен.
Интересен вопрос, почему автор уходит от виндовой версии к линуксовой? Ведь комп с виндой это пока что самое распространенное среди эмуляторщиков, да и вообще.
- - - Добавлено - - -
Кстати, по поводу синхронизации эмулятора с кадровой разверткой.
Совершенно случайно сегодня обнаружил, что есть и еще один современный надежный метод: IDXGIOutput::WaitForVBlank()
Позволяет синхронизироваться с каким-то конкретным монитором, если у вас он не один.
Например, запустили приложение на первом мониторе, а потом перетащили окно на второй. Но если синхронизация идет каким-то стандартным способом через DMW или Present, я думаю, что все будет завязано на кадровую развертку первого монитора. А так можно произвольно выбирать.
Функция эта появилась начиная с Vista, поэтому кто не рассчитывает на XP (а я давно его выпилил из своего эмуля), можно смело использовать.
Причем, эта функция является абсолютно не блокирующей, в отличие от устаревших версий в DirectDraw.
И даже меньше занимает времени системы, чем DMW (и, как я думаю, Present), потому что не ждет компоновки рабочего стола, а сразу выходит по VBlank.
возможно у Орель другие тайминги экрана (на первой картинке смещены полосы на бордюре).
посмотри как это выглядит на реале.
Чето мне кажется что от оригинала не отличается, могу наделать фото с оригинальной орели в разных режимах, программах, для более точной эмуляции..
https://pic.maxiol.com/thumbs2/1732995773.1596886884.screenshot20241130.jpg (https://pic.maxiol.com/?v=1732995773.1596886884.screenshot20241130.jpg&dp=2)
https://youtu.be/6N9R4ArxsMs?si=7Dw_uktdShmDtmG1
Dart Alver
30.11.2024, 23:18
Интересен вопрос, почему автор уходит от виндовой версии к линуксовой? Ведь комп с виндой это пока что самое распространенное среди эмуляторщиков, да и вообще.
Никуда он не уходит, те же exы болтыхаются, а на счёт да и вообще, у меня например xpecсy на лине, RVM на лине, UNREAL через wine запускаю на крайняк. Так что чем больше под линь эмулей, тем лучше ))
Кстати как сиё чудо под линем запустить ? Поставил чтото из mono, стало грузить окошко, но вертикальные полосы только. В настройках ромы недоступны. Куда и как ? ))
Да, MX-Linux ака debian 12.
Совершенно случайно сегодня обнаружил, что есть и еще один современный надежный метод: IDXGIOutput::WaitForVBlank()
Позволяет синхронизироваться с каким-то конкретным монитором, если у вас он не один.
Например, запустили приложение на первом мониторе, а потом перетащили окно на второй. Но если синхронизация идет каким-то стандартным способом через DMW или Present, я думаю, что все будет завязано на кадровую развертку первого монитора. А так можно произвольно выбирать.
эмулятор и так отслеживает смену дисплея, на котором отображается окно и пересоздает контекст на лету, если окно перетащили на другой дисплей.
- - - Добавлено - - -
Кстати как сиё чудо под линем запустить ? Поставил чтото из mono, стало грузить окошко, но вертикальные полосы только. В настройках ромы недоступны. Куда и как ? ))
Да, MX-Linux ака debian 12.
Та версия, что в релизах на линукс не заточена. Для линукса тестовый билд вот тут: https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2508881244
Для работы эмулятора нужно установить такие библиотеки:
sudo apt install mono-runtime libmono-system-drawing4.0-cil libmono-system-windows-forms4.0-cil
sudo apt install libopenal-dev
Для запуска на линуксе запускать bash скрипт zxmak2.
Возможно чтото еще пропустил для установки, если не работает, посмотрите лог файл, который создается в папке эмулятора.
Dart Alver
30.11.2024, 23:35
Для линукса тестовый билд вот тут:
Его и использовал, либы установлены, ничего не поменялось.
Под wine кстати работает великолепно, а просто под mono нифига ))
Лог:
81624
эмулятор и так отслеживает смену дисплея, на котором отображается окно и пересоздает контекст на лету, если окно перетащили на другой дисплей.
А если окно на двух дисплеях сразу?
Лог
проблема с кодировками на вашей машине:
[23:31:03.053][1 ][ERROR] System.NotSupportedException: Load RomSet failed, romSet="Pentagon"
System.NotSupportedException: Encoding 866 data could not be found. Make sure you have correct international codeset assembly installed and enabled.
at System.Text.Encoding.GetEncoding (System.Int32 codepage) [0x0024d] in <12b418a7818c4ca0893feeaaf67f1e7f>:0
at ZipLib.Zip.ZipConstants.ConvertToString (System.Byte[] data, System.Int32 count) [0x00017] in <d2bb322f2429458e991b7adea610685a>:0
at ZipLib.Zip.ZipConstants.ConvertToStringExt (System.Int32 flags, System.Byte[] data, System.Int32 count) [0x00032] in <d2bb322f2429458e991b7adea610685a>:0
at ZipLib.Zip.ZipFile.ReadEntries () [0x00312] in <d2bb322f2429458e991b7adea610685a>:0
at ZipLib.Zip.ZipFile..ctor (System.String name) [0x0006d] in <d2bb322f2429458e991b7adea610685a>:0
at ZXMAK2.Hardware.RomPack.GetImageStream (System.String fileName) [0x0007b] in <3378b2647e3a4f79a2a81e95908c1094>:0
at ZXMAK2.Hardware.RomPack.GetRomSet (System.String romSetName) [0x0000e] in <3378b2647e3a4f79a2a81e95908c1094>:0
собствено сама ошибка вот:
System.NotSupportedException: Encoding 866 data could not be found. Make sure you have correct international codeset assembly installed and enabled.
at System.Text.Encoding.GetEncoding (System.Int32 codepage)
у вас в системе видимо почему-то настроена кодировка 866 по умолчанию, но сама кодировка почему-то не поддерживается, видимо не установлен какой-то пакет. Я с таким пока не сталкивался, нужно разбираться.
Ну а эмулятор не работает потому что из-за этой ошибки не может распаковать ром файл из zip архива.
Кстати, что на счет звука в эмуляторе?
Можно ли менять частоту дискретизации и разрядность? В каких пределах?
Кстати, что на счет звука в эмуляторе?
Можно ли менять частоту дискретизации и разрядность? В каких пределах?
разрядность нет - всегда 16 бит. А частоту можно задать в unity.config в конструкторе соответствующей реализации. Для DirectSound, см. блок
<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>
Для OpenAL на линукс см. блок:
<register type="IHostSound" mapTo="HostSound_OAL">
<constructor>
<param name="sampleRate" value="48000" />
<param name="bufferCount" value="4" />
</constructor>
<lifetime type="transient" />
</register>
sampleRate должен быть кратным 50. В остальном пределы ограничиваются пределами используемой библиотеки. Для DirectSound помоему максимальная 384000.
Dart Alver
30.11.2024, 23:52
у вас в системе видимо почему-то настроена кодировка 866 по умолчанию, но сама кодировка почему-то не поддерживается, видимо не установлен какой-то пакет. Я с таким пока не сталкивался, нужно разбираться.
Чушь. В лине по умолчанию UTF-8 для русской локализации. В редакторе kwrite я обычно настраиваю cp1251 по умолчанию, некоторые автоматом 1251 схватывают, но 866 ни одна падла без пинка не понимает.
Скорее это ваш эмуль требует 866-ю, а нету и какую либу ставить х.з. ))
- - - Добавлено - - -
Ну а эмулятор не работает потому что из-за этой ошибки не может распаковать ром файл из zip архива.
Линь не любит распаковывать русские буквы из названий файлов в архивах, он тока utf юзает в распаковщиках ... увы ((
---
Просмотрел архив ромов, не нашёл ничего с русскими буками - опять ерунда какаято... ))
разрядность нет - всегда 16 бит. А частоту можно задать в unity.config в конструкторе соответствующей реализации. Для DirectSound, см. блок
А как для DirectSound меняется частота, если при использовании кооперативного режима (не эксклюзивного) все равно все в итоге приводится к частоте системного микшера, а она обычно 48, или сколько там пользователь установит.
Линь не любит распаковывать русские буквы из названий файлов в архивах, он тока utf юзает в распаковщиках ... увы ((
---
Просмотрел архив ромов, не нашёл ничего с русскими буками - опять ерунда какаято... ))
Эмулятор использует код SharpZipLib, в нем для обработки строк используется дефолтная кодировка установленная для системы, точнее значение кодировки по умолчанию берется из Thread.CurrentThread.CurrentCulture.TextInfo.OEMCo dePage.
Это значение зависит от настроек вашей системы. В вашем случае оно равно 866. Однако ваша система не поддерживает кодировку 866. Как такое у вас получилось, я не знаю :)
Самому эмулятору 866 кодировка не нужна, в архивах все имена в ASCII. Проблема в том, что эмулятор пытается использовать дефолтную кодировку вашей системы для работы со строками, а она у вас почему-то не поддерживается.
А чему у вас равна переменная окружения LANG? Что выводит команда
echo $LANG
Попробуйте запустить эмулятор задав для него другое значение этой переменной, например:
LANG=en_GB.UTF-8 mono --debug ZXMAK2.exe
или такое какое поддерживается в вашей системе, их можно посмотреть с помощью команды
locale -a
Dart Alver
01.12.2024, 00:38
Эмулятор использует код SharpZipLib, в нем для обработки строк используется дефолтная кодировка установленная для системы, точнее значение кодировки по умолчанию берется из Thread.CurrentThread.CurrentCulture.TextInfo.OEMCo dePage.
Это значение зависит от настроек вашей системы. В вашем случае оно равно 866. Однако ваша система не поддерживает кодировку 866. Как такое у вас получилось, я не знаю
$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
где здесь 866 - ума не приложу. ))
Скорее код SharpZipLib (я так понимаю это libmono-sharpzip4.84-cil ) нагло врёт.
- - - Добавлено - - -
$ echo $LANG
ru_RU.UTF-8
master@mx:~
$ locale -a
C
C.utf8
en_US.utf8
POSIX
ru_RU.utf8
master@mx:~
$
что происходит если запустить эмулятор из командной строки как
LANG=C mono --debug ZXMAK2.exe
или
LANG=POSIX mono --debug ZXMAK2.exe
Dart Alver
01.12.2024, 00:44
С LANG=en_GB.UTF-8 mono --debug ZXMAK2.exe запускается а с LANG=ru_RU.UTF-8 mono --debug ZXMAK2.exe - висит без ромов ))
- - - Добавлено - - -
LANG=C mono --debug ZXMAK2.exe - запускается
Скорее код SharpZipLib (я так понимаю это libmono-sharpzip4.84-cil ) нагло врёт.
нет, эмулятор использует старую версию SharpZipLib, в новой этого кода не вижу. с кодировкой не вижу, видимо он куда-то переехал в другое место. Нужно разбираться.
Dart Alver
01.12.2024, 01:01
Хм... внезапно стало
$ LANG=ru_RU.UTF-8 mono --debug ZXMAK2.exe
AL lib: (EE) ALCpulsePlayback_contextStateCallback: Received context failure!
AL lib: (EE) ALCpulsePlayback_streamStateCallback: Received stream failure!
- - - Добавлено - - -
и вдруг
$ LANG=C mono --debug ZXMAK2.exe
AL lib: (EE) ALCplaybackAlsa_open: Could not open playback device 'default': Host is down
и какие-то дичайшие тормоза.
81625
Хм... внезапно стало
звук при этом работает?
флаг --debug запускает приложение в отладочном режиме, могут выводиться отладочные сообщения которые в обычном режиме не выводятся.
Вероятно у вас не настроен OpenAL. вы можете настроить какую аудиоподсистему использовать в alsoft.conf рядом с эмулятором, по умолчанию там все закоменчено и по дефолту. Потом можно скопировать этот конфиг в систему, чтобы он для всех приложений работал
Dart Alver
01.12.2024, 01:08
Блин по ходу пульса отвалилась нафиг. Странно...
если у вас OpenAL не хочет нормально работать с драйвером по умолчанию, попробуйте задать ей другой драйвер. Например alsa.Это можно указать в alsoft.conf
Dart Alver
01.12.2024, 01:28
Перезагрузил, LANG=C mono --debug ZXMAK2.exe пока работает нормально и со звуком, при старте выдаёт в окне сообщение об ошибке, но работает.
81626
Мыши не хватает ))
пока работает нормально и со звуком, при старте выдаёт в окне сообщение об ошибке, но работает.
это нормально для линукс пока нет OpenGL рендерера, поэтому используется от DirectX, который из-за недоступности падает с ошибкой и приводит к переключению в режим отрисовки на форме средствами WinForms. Это не очень эффективно и может иногда приводить к остановке обновления изображения, но пока как есть. С мышью и джойстиком аналогичная ситуация.
- - - Добавлено - - -
А как для DirectSound меняется частота, если при использовании кооперативного режима (не эксклюзивного) все равно все в итоге приводится к частоте системного микшера, а она обычно 48, или сколько там пользователь установит.
Для DirectSound устанавливается режим DSSCL_PRIORITY, далее указанная частота дискретизации прописывается в формат используемый для SoundBuffer.
В Windows можно и OpenAL использовать, только нужно чтобы в системе или в папке с эмулятором был доступен openal32.dll. Если эмулятор запущен на 64-битной системе, то openal32.dll должен быть 64 битный. Если на 32-битной системе, то 32-битный. Если надо, могу выложить эти файлы. Правда сейчас эмулятор автоматически не выбирает соответствующий файл в зависимости от архитектуры и нужно подложить правильный вручную. Но можно приделать, чтобы автоматически грузил из соответствующей папки.
Для DirectSound устанавливается режим DSSCL_PRIORITY, далее указанная частота дискретизации прописывается в формат используемый для SoundBuffer.
Я думаю, что это не работает начиная с Висты, т.к. DirectSound эмулируется через WASAPI, а WASAPI позволяет управлять форматом воспроизведения только в эксклюзивном режиме, когда кроме выбранного приложение, никакое другое приложение звук выводить не может.
- - - Добавлено - - -
Не нашел, где в эмуляторе настройка частоты дискретизации, чтобы попробовать.
Я думаю, что это не работает начиная с Висты, т.к. DirectSound эмулируется через WASAPI, а WASAPI позволяет управлять форматом воспроизведения только в эксклюзивном режиме, когда кроме выбранного приложение, никакое другое приложение звук выводить не может.
Если у вас есть готовый вариант кода для вывода звука используя другие API, я могу добавить. Пока есть только вариант с DirectSound и OpenAL.
Но OpenAL позволяет настроить работу через разные бекенды, включая PipeWire, PulseAudio, ALSA, WASAPI, OpenSL, CoreAudio, OSS, JACK, DirectSound, WinMM, Solaris, SoundIO, PortAudio, SDL2. OpenAL настраивается через alsoft.conf.
В Linux OpenAL используется по умолчанию, для переключения на OpenAL в Windows нужно в файле unity.config, в секции <container name="win32"> заменить вот этот кусок:
<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>
на такой (его можно просто скопировать из секции <container name="linux">):
<register type="IHostSound" mapTo="HostSound_OAL">
<constructor>
<param name="sampleRate" value="48000" />
<param name="bufferCount" value="4" />
</constructor>
<lifetime type="transient" />
</register>
Не нашел, где в эмуляторе настройка частоты дискретизации, чтобы попробовать.
открываете блокнотом файл unity.config и прописываете желаемый sampleRate в вышеуказанной секции IHostSound, главное не перепутать - их там несколько в разных контейнерах, для windows нужно смотреть контейнер "win32".
Если у вас есть готовый вариант кода для вывода звука используя другие API, я могу добавить. Пока есть только вариант с DirectSound и OpenAL.
Готового для WASAPI нет. А всякие прослойки типа OpenAL в нативных системах я не люблю. Они, на мой взгляд, всегда чем-то хуже. Или тормознее, или урезанные по возможностям относительно нативных систем.
- - - Добавлено - - -
открываете блокнотом файл unity.config и прописываете желаемый sampleRate
Прописал. Разумеется, ничего не меняется.
Так как на Vista и выше поменять битрейт буфера микширования системы можно только в эксклюзивном режиме владения звуковухой.
Либо же, если пользователь поменяет это сам в настройках виндовс.
Lethargeek
04.12.2024, 05:29
Собрал новый тестовый билд:
https://github.com/zxmak/ZXMAK2/issu...ent-2508881244
а теперь попробуй вот этот тызыкс
происходит с ним какая-то магия :v2_wacko:
загрузить нормально смог
- только в ZXSpin (0.7 и 0.666), причём
- в 0.7 только начиная со второго блока program
- в 0.666 только с самого начала (первого program)
- только при включённом ускорении (Edge/Flash)
...и то, даже так не всегда прокатывает
переключение полярности вроде не влияет
во ВСЕХ остальных испробованных эмулях и вариантах загрузки - глюки, сразу видные на заставке, причём разные глюки!
а внутри - обычный вроде бы турбо блок, причём времянки со стандартными совпадают
а теперь попробуй вот этот тызыкс
а чем его распаковать?
$ unzip Equinox\ \(1986\)\(IBSA\)\(ES\)\(en\)\[re-release\].tzx.zip
Archive: Equinox (1986)(IBSA)(ES)(en)[re-release].tzx.zip
skipping: Equinox (1986)(IBSA)(ES)(en)[re-release].tzx need PK compat. v6.3 (can do v4.6)
1 archive had fatal errors.
Spectramine
04.12.2024, 06:59
а теперь попробуй вот этот тызыкс
происходит с ним какая-то магия :v2_wacko:
загрузить нормально смог
- только в ZXSpin (0.7 и 0.666), причём
- в 0.7 только начиная со второго блока program
- в 0.666 только с самого начала (первого program)
- только при включённом ускорении (Edge/Flash)
...и то, даже так не всегда прокатывает
переключение полярности вроде не влияет
во ВСЕХ остальных испробованных эмулях и вариантах загрузки - глюки, сразу видные на заставке, причём разные глюки!
а внутри - обычный вроде бы турбо блок, причём времянки со стандартными совпадают
Грузится в Spectaculator, SpecEmu, ZXSpin, Fuse, Спектрамине, с включенным Flash Load (в Спектрамине он включен всегда с быстрой загрузкой) . Видимо, оцифровка в TZX некорректная, параметры турбо блока не соответствуют реальным (иначе зачем его надо было определять как турбо).
- - - Добавлено - - -
да, ULA я не добавлял, да и вообще не тестил, т.к. у меня нет программ орели, которыми можно потестить развертку изображения.
У Орели тайминги экрана как у фирменного Спектрума 48, но без задержек ULA.
Serg6845
04.12.2024, 08:31
а чем его распаковать?
7zip, rar 5.90 - ошибок не находят.
Грузится в Spectaculator, SpecEmu, ZXSpin, Fuse, Спектрамине, с включенным Flash Load (в Спектрамине он включен всегда с быстрой загрузкой) . Видимо, оцифровка в TZX некорректная, параметры турбо блока не соответствуют реальным (иначе зачем его надо было определять как турбо).
Да, в нём турбо-блок идет с длительностями импульсов стандартного блока:
.tzx-pilot-sym 0, 2168 ; symbol#0 for pilot pulses
.tzx-pilot-sym 0, 667,735 ; symbol#1 for sync pulses
.tzx-pilot 0,3220 , 1,1 ; 3220 pilot pulses (symbol#0), then one sync pulse symbol (symbol#1)
.tzx-data-sym 0, 855,855 ; symbol#0 for bit 0
.tzx-data-sym 0, 1710,1710 ; symbol#1 for bit 1
Я попробовал подставить длительности как в релизе ERBE и он стал грузиться:
.tzx-pilot-sym 0, 2165 ; symbol#0 for pilot pulses
.tzx-pilot-sym 0, 714,714 ; symbol#1 for sync pulses
.tzx-pilot 0,3261 , 1,1 ; 3261 pilot pulses (symbol#0), then one sync pulse symbol (symbol#1)
.tzx-data-sym 0, 615,615 ; symbol#0 for bit 0
.tzx-data-sym 0, 1230,1230 ; symbol#1 for bit 1
Но образ похоже левый, т.к. в названии релиз IBSA, а в заставке пишет ERBE...
В общем если какой-то эмулятор загружает этот TZX, то это баг эмулятора. Он не должен грузиться.
Вот исправленный вариант с пропатченными длительностями импульсов в турбо-блоке:
Lethargeek
04.12.2024, 13:54
а чем его распаковать?
упаковано 7-zip 24.08 как zip/9-ultra/PPMd
древний Total Commander у меня справляется
...хм, а проводник почему-то нет
Грузится в Spectaculator, SpecEmu, ZXSpin, Fuse, Спектрамине, с включенным Flash Load
у меня в specemu не загрузился, версия другая видать
Но образ похоже левый, т.к. в названии релиз IBSA, а в заставке пишет ERBE...
переиздатель переиздал переиздателя, в принципе может быть и так
и/или тупо первый program кто-то забыл, оцифровщик или эта ibsa
В общем если какой-то эмулятор загружает этот TZX, то это баг эмулятора. Он не должен грузиться.
это-то понятно, раз только с ускорением грузится
непонятно, почему глюки - разные
от совсем пустой заставки до угадывающейся надписи
и почему в spin с edge load тоже работает
эмулятор и так отслеживает смену дисплея, на котором отображается окно и пересоздает контекст на лету, если окно перетащили на другой дисплей.
Вернусь немного к прежней теме.
В чем проявляется отслеживание смены дисплея?
Ведь синхронизация обновления окна привязана к дисплею и адаптеру на котором это окно было открыто изначально.
Lethargeek
04.12.2024, 14:11
Вернусь немного к прежней теме.
В чем проявляется отслеживание смены дисплея?
Ведь синхронизация обновления окна привязана к дисплею и адаптеру на котором это окно было открыто изначально.
+ кстати, а в какой момент окно считается перетащенным? а если оставить пол-окна на одном дисплее, пол-окна на другом?
и почему в spin с edge load тоже работает
Это баг - эмуляторов - неправильно анализируется код загрузчика и данные пишутся напрямую в память и процессор направляется по ветке правильной загрузки, хотя при заданной длительности импульсов эмулятор должен был направить процессор по ветке обработки ошибки.
- - - Добавлено - - -
В чем проявляется отслеживание смены дисплея?
Ведь синхронизация обновления окна привязана к дисплею и адаптеру на котором это окно было открыто изначально.
эмулятор на каждом кадре проверяет на каком дисплее отображается окно, если дисплей поменялся, то он пересоздает контекст, чтобы синхронизироваться от нового дисплея. Это происходит на лету прямо во время перетаскивания окна с одного дисплея на другой.
- - - Добавлено - - -
кстати, а в какой момент окно считается перетащенным? а если оставить пол-окна на одном дисплее, пол-окна на другом?
помню что решал этот вопрос (когда окно еще не полностью перетащено и часть его отображается на одном дисплее, а часть на другом) и тестил, но какое условие используется уже не помню, помоему если большая часть окна попала на новый дисплей, но может быть и когда окно будет полностью перемещено, нужно будет посмотреть.
эмулятор на каждом кадре проверяет на каком дисплее отображается окно, если дисплей поменялся, то он пересоздает контекст, чтобы синхронизироваться от нового дисплея.
Странно. Может на старом DirectX так и можно было сделать, но начиная с DXGI в описаниях четко сказано, что если окно открыто на конкретном дисплее, то цепочка буферов и ее обновление привязывается именно к тому дисплею, на котором открыто окно. Иными словами, без закрытия и открытия окна заново на новом дисплее, и создание новых привязанных к этому окну буферов, синхронизироваться под другой дисплей не получится.
Но я это пока не проверял.
Lethargeek
04.12.2024, 14:55
Это баг - эмуляторов - неправильно анализируется код загрузчика и данные пишутся напрямую в память и процессор направляется по ветке правильной загрузки, хотя при заданной длительности импульсов эмулятор должен был направить процессор по ветке обработки ошибки.
а там разве вот прям код анализируется? а не (например) юла морозится до фронта
вот этот тызыкс
скорее всего оцифровка делалась в автоРежиме.
если перегнать в wav и `правильно` оцифровать - заработает.
https://pic.maxiol.com/thumbs2/1733315634.3645248183.mtzx.png (https://pic.maxiol.com/?v=1733315634.3645248183.mtzx.png&dp=2)
Странно. Может на старом DirectX так и можно было сделать, но начиная с DXGI в описаниях четко сказано, что если окно открыто на конкретном дисплее, то цепочка буферов и ее обновление привязывается именно к тому дисплею, на котором открыто окно. Иными словами, без закрытия и открытия окна заново на новом дисплее, и создание новых привязанных к этому окну буферов, синхронизироваться под другой дисплей не получится.
Но я это пока не проверял.
посмотрел логику, дисплей проверяется по завершению перетаскивания окна, если дисплей на котором отображается окно изменился, то Direct3D девайс освобождается и создается заново для нового дисплея. HWND окна используется вроде тот-же, могу ошибаться но не увидел, чтобы окно пересоздавалось. На этапе отладки помню у меня были разные варианты, по результатам тестов остановился на таком. Он для всех случаев корректно работал, в том числе и с подключением новых дисплеев и перетаскиванием окна эмулятора на него.
- - - Добавлено - - -
а там разве вот прям код анализируется? а не (например) юла морозится до фронта
не знаю, я ускорение загрузки edge load не делал, смысл его в том, что эмулятор видит где короткий импульс, где длинный - так libspectrum помечает флагом. Насколько понимаю эмуляторы анализируют эмулируемый код и пропускают эмуляцию сразу перескакивая на новый адрес в зависимости от того какой импульс на входе - длинный или короткий. Видимо, если код более сложный и может проверять больше чем две длительности импульсов, то указанные эмуляторы дают неправильную эмуляию, т.к. не могут корректно обработать такой код.
Грубо говоря это попытка не эмулировать кусок кода, а сразу подставить готовые результаты. Но проблема в том, что корректно проанализировать загрузчик на лету довольно проблематично, не потеряв в скорости и корректно обработав все возможные варианты загрузчиков.
Я даже не стал смотреть как это делается, т.к. тот-же fuse при загрузке с кассеты дико тормозит на медленных компьютерах, таких как raspberry pi. А я именно под raspberry pi и затачиваю zxmak2.
PS: посмотрел код fuse, да - там длинный свитч проверяющий текущую инструкцию и считающий что код загрузчика всегда одинаков и только такой как заложен в эмулятор, там в коде эмулятора захардкожено назначение регистров и битов в регистрах для загрузчика, поэтому такая акселерация загрузки не будет корректно работать для нестандартных загрузчиков.
я ускорение загрузки edge load не делал
вроде-бы там просто включается дикая турба и выключается после загрузки.
вроде-бы там просто включается дикая турба и выключается после загрузки.
нет, эмулятор сразу модифицирует регистры процессора:
static void
do_acceleration( void )
{
if( length_known1 ) {
/* B is used to indicate the length of the pulses */
int set_b_high = length_long1;
set_b_high ^= ( acceleration_mode == ACCELERATION_MODE_DECREASING );
if( set_b_high ) {
z80.bc.b.h = 0xfe;
} else {
z80.bc.b.h = 0x00;
}
/* Bit 5 of C is used to indicate the current microphone level */
z80.bc.b.l = (z80.bc.b.l & ~0x20) | (tape_microphone ? 0x00 : 0x20);
z80.af.b.l |= 0x01;
/* Simulate the RET at the end of the edge-finding loop */
z80.pc.b.l = readbyte_internal( z80.sp.w ); z80.sp.w++;
z80.pc.b.h = readbyte_internal( z80.sp.w ); z80.sp.w++;
event_remove_type( tape_edge_event );
tape_next_edge( tstates, 1 );
successive_reads = 0;
}
length_known1 = length_known2;
length_long1 = length_long2;
}
причем, как видно назначение регистров и логика загрузчика захардкожена в эмуляторе, если загрузчик использует регистры по другому, то такая симуляция будет неправильной.
Мне такой подход не нравится, поэтому я такой акселератор загрузки не стал добавлять, хотя флаги LENGTH_SHORT и LENGTH_LONG прикрутил, на случай если захочется поэкспериментировать.
Lethargeek
05.12.2024, 01:02
если перегнать в wav и `правильно` оцифровать - заработает.
в смысле "перегнать" - какой, неисправленный?
так он же воспроизведётся неправильно))
а исправленный уже нет смысла перегонять
PS: посмотрел код fuse, да - там длинный свитч проверяющий текущую инструкцию и считающий что код загрузчика всегда одинаков и только такой как заложен в эмулятор, там в коде эмулятора захардкожено назначение регистров и битов в регистрах для загрузчика, поэтому такая акселерация загрузки не будет корректно работать для нестандартных загрузчиков.
в zxspin, наверно, что-то сложнее, потому что для него я затрудняюсь сходу назвать загрузчик, который НЕ сработает с edgeload
вроде-бы там просто включается дикая турба и выключается после загрузки.
с виду-то похоже (турба и для ленты, и для проца) - полосы на бордере ужимаются
но для некорректного тызыкса не должно быть разницы в таком случае - а он грузится
в zxspin, наверно, что-то сложнее, потому что для него я затрудняюсь сходу назвать загрузчик, который НЕ сработает с edgeload
если поставить цель обмануть захардкоженую в эмуляторе логику для загрузчиков, то я думаю не проблема сделать загрузчик, который не будет работать ни в zxspin, ни в каком другом эмуляторе использующем edge load акселерацию. Т.к. невозможно захардкодить в эмуляторе поддержку всех возможных загрузчиков, а код с таким анализом будет сильно тормозить.
- - - Добавлено - - -
но для некорректного тызыкса не должно быть разницы в таком случае - а он грузится
потому что edge load - это не загрузка, это обман загрузчика эмулятором, с подсовыванием ему готовых данных напрямую вместо реальной эмуляции. Анализ длительности импульса при этом не производится, поэтому даже если импульсы некорректные и сигнал никогда не сможет быть загружен реальным спектрумом, загрузка в таком эмуляторе всегда будет "успешной". Эмуляции загрузки при этом по сути не происходит, просто данные из tzx напрямую записываются в память спектрума, счетчик в регистрах подкручивается чтобы загрузчик думал что загрузка произошла.
PS: Кстати, в этом очевидно и кроется ответ, как такой битый TZX появился. Ктото протестил в эмуляторе с edge load что программа "грузится" и выложил TZX, а на самом деле TZX битый, в нём потеряна реальная длительность импульсов, он не будет грузиться на реальном спектруме.
И восстановить длительность импульсов будет проблематично. В данном случае я просто взял TZX с другим релизом этой программы и посмотрел в ней длитетльность импульсов, но если бы смотреть было некуда, то пришлось бы анализировать код загрузчика и подбирать опытным путём чтобы сделать такой TZX загружаемым.
И наверняка таких битых TZX немало, благодаря этой edge load акселерации...
в смысле "перегнать" - какой, неисправленный?
так он же воспроизведётся неправильно))
TZX (problem) -> WAV
и указав (в параметрах MakeTZX) NormalROM создаётся вполне рабочий TZX
TZX (problem) -> WAV
и указав (в параметрах MakeTZX) NormalROM создаётся вполне рабочий TZX
не поможет. В этом TZX указаны стандартные длительности импульсов. Вот фрагмент из asm файла сформированного дампером:
#code BLOCK7_DATA, 0, *, flag=$ff, pause=0
.tzx-pilot-sym 0, 2168 ; symbol#0 for pilot pulses
.tzx-pilot-sym 0, 667,735 ; symbol#1 for sync pulses
.tzx-pilot 0,3220 , 1,1 ; 3220 pilot pulses (symbol#0), then one sync pulse symbol (symbol#1)
.tzx-data-sym 0, 855,855 ; symbol#0 for bit 0
.tzx-data-sym 0, 1710,1710 ; symbol#1 for bit 1
а должны быть укороченные:
#code BLOCK7_DATA, 0, *, flag=$ff, pause=0
.tzx-pilot-sym 0, 2165 ; symbol#0 for pilot pulses
.tzx-pilot-sym 0, 714,714 ; symbol#1 for sync pulses
.tzx-pilot 0,3261 , 1,1 ; 3261 pilot pulses (symbol#0), then one sync pulse symbol (symbol#1)
.tzx-data-sym 0, 615,615 ; symbol#0 for bit 0
.tzx-data-sym 0, 1230,1230 ; symbol#1 for bit 1
Сравните длительность импульсов 855 и 1710 тактов против 615 и 1230 тактов в оригинале.
Синхроимпульс тоже неправильный - 667,735 вместо 714,714 в оригинале.
Очевидно ошибку не заметили из-за того, что для теста загрузили файл в эмуляторе с edge-load, который из-за ошибки загрузил его как корректный. На самом деле в нем отсутствует важная информация о длительности импульсов и восстановить ее было бы довольно сложно, если бы не было аналогичного рабочего релиза. Т.е. загрузить на реальном спектруме было бы невозможно, только в эмуляторе с загрузкой edge-load, которая игнорирует длительность импулсов и пишет данные сразу в регистры процессора подменяя счетчик.
ага, понял.
действительно (сразу не заметил) проверял с включённым EdgeLoad.
причём грузит только в модели48к
Хмм, я тоже думал что во fuse просто происходит детект фазы загрузки и включается макс.ускорение (отключена эмуляция всякого ненужного).
Еще один битый tzx из той-же серии - с неправильными длительностями импульсов, который грузится из-за ошибки с edge-load:
https://worldofspectrum.net/item/0001837/
https://worldofspectrum.net/pub/sinclair/games/f/ForbiddenPlanet.tzx.zip
там-же лежит и рабочий вариант с турбоблоком вместо обычного:
https://worldofspectrum.net/pub/sinclair/games/f/ForbiddenPlanetV1.tzx.zip
в zxmak2 загружать с отключенным автостартом, т.к. лоадер капризен ко времени и приводит к ложному срабатыванию.
Lethargeek
09.12.2024, 19:27
ZXMAK, а от зловредных тызыксов защитился? ну, таких, где переходы зациклились без появления в процессе звуковых блоков
ZXMAK, а от зловредных тызыксов защитился? ну, таких, где переходы зациклились без появления в процессе звуковых блоков
да, нормально работает
Lethargeek
11.12.2024, 01:15
ZXMAK, а что ты такого с MASK намутил, что даже исправленная (добавлением блоков 2B куда нужно) не работает?
и еще вопрос, частота сэмплов ленты у тебя потактовая или меньше?
а то есть, например, схема Digital Integration с порченными таймингами
которая честно вроде не должна бы загружаться, однако грузится
а что ты такого с MASK намутил, что даже исправленная (добавлением блоков 2B куда нужно) не работает?
для загрузки Mask нужно отключать автоплей, т.к. он может останавливать магнитофон в паузах, что нарушает тайминги сигнала.
А куда там 2B нужно добавлять? У меня TZX только те что гуглом гуглятся - нерабочие. Нормально грузится только из WAV образа.
- - - Добавлено - - -
и еще вопрос, частота сэмплов ленты у тебя потактовая или меньше?
а то есть, например, схема Digital Integration с порченными таймингами
которая честно вроде не должна бы загружаться, однако грузится
Загрузка привязана к тактам процессора. При загрузке TZX и других образов, во избежание конфликтов, тайминги не привязанные к тактам пересчитываются в такты исходя из фиксированной тактовой 3.5 МГц, независимо от фактической тактовой. Т.е. для загрузчика сигнал по тактам будет одинаковым, независимо от фактической частоты Z80.
а что за образ?
Lethargeek
11.12.2024, 04:59
для загрузки Mask нужно отключать автоплей, т.к. он может останавливать магнитофон в паузах, что нарушает тайминги сигнала.
А куда там 2B нужно добавлять? У меня TZX только те что гуглом гуглятся - нерабочие. Нормально грузится только из WAV образа.
перед каждым турбоблоком #11 - высокий уровень
автоплей был выключен
Загрузка привязана к тактам процессора. При загрузке TZX и других образов, во избежание конфликтов, тайминги не привязанные к тактам пересчитываются в такты исходя из фиксированной тактовой 3.5 МГц, независимо от фактической тактовой. Т.е. для загрузчика сигнал по тактам будет одинаковым, независимо от фактической частоты Z80.
нифига не понял, проще скажи - сколько тактов Z80 на сэмпл у тебя?
вот если спеку скормить оцифровку 44100 - будет 79 тактов на сэмпл
пробую сейчас процедурку с точностью один такт на сэмпл
но вот что-то грузит она не всё, вот например три файла
который блоками #19 с красивыми цифрами импульсов - грузится
такие цифры, похоже, восстановлены анализом кода загрузчика
(так как в тызыксе другой игры той же фирмы - ATF - такие же)
8191 x 1180
256 x 2168
1 x 1000
а который то же самое через #12-#13-#14 - пилот не видит
и времянки явно кривые, разные даже между собой
8190 x 1144 / 1144
256 x 2102 / 2098
1 x 805 / 725 (!)
импульсы данных тоже разные и некруглые, но это оказалось некритично
в архиве три версии (нужен переход в 48k):
general - всё норм
puretone - всё плохо
puretone - исправлены тайминги пилотона - после чего стало загружаться
еще пробовал плохие прописать в хороший #19 - перестал грузить
вот сижу и думаю - может, тайминги старых тызыксов замерялись/подбирались неточно
и проверялись в старых же эмулях, в которых память на сериализации экономили?
но неточность подбора маскируется неточностью представления
а тут всё вылезло
Spectramine
11.12.2024, 10:52
в архиве три версии (нужен переход в 48k):
general - всё норм
puretone - всё плохо
puretone - исправлены тайминги пилотона - после чего стало загружаться
еще пробовал плохие прописать в хороший #19 - перестал грузить
вот сижу и думаю - может, тайминги старых тызыксов замерялись/подбирались неточно
и проверялись в старых же эмулях, в которых память на сериализации экономили?
но неточность подбора маскируется неточностью представления
а тут всё вылезло
у меня все три грузятся ок без ускорений и с ними.
Lethargeek
11.12.2024, 11:01
у меня все три грузятся ок без ускорений и с ними.
ё-моё, давай с подробностями - "у тебя" что конкретно видит загрузчик?
сформированный для кадра звук (и с какой частотой дискретизации) или что?
Spectramine
11.12.2024, 11:28
У меня загрузчик видит длины импульсов в тактах (не считая загрузки wav, там семплы).
Lethargeek
11.12.2024, 11:39
У меня загрузчик видит длины импульсов в тактах (не считая загрузки wav, там семплы).
ляяяя... загрузчик (который спектрумовский) видит один бит порта #FE
вопрос в том, по какой сетке выравнивается однобитный вывод проигрывателя
- - - Добавлено - - -
и да, для чистоты эксперимента тайминги Z80 поставь пентагоновские, без тормозов
Spectramine
11.12.2024, 11:48
ляяяя... загрузчик (который спектрумовский) видит один бит порта #FE
вопрос в том, по какой сетке выравнивается однобитный вывод проигрывателя
я хз о чем ты, у меня в момент чтения порта проверяется, на какой импульс приходится чтение (если надо, выбирается новый импульс (или импульсы)), и его полярность читается с порта.
и да, для чистоты эксперимента тайминги Z80 поставь пентагоновские, без тормозов грузится и с тормозами, и без них.
Lethargeek
11.12.2024, 12:03
я хз о чем ты, у меня в момент чтения порта проверяется, на какой импульс приходится чтение (если надо, выбирается новый импульс (или импульсы)), и его полярность читается с порта.
тогда пока других идей нет, почему у меня не грузит по той же схеме
ведь я же проверяю логи, такого типа:
...
000000000000000000000000000000000
11111111111111111111111111111111
00000000000000000000000000000000000000000000000000 000000000000000
11111111111111111111111111111111111111111111111111 1111111111111111
00000000000000000000000000000000
111111111111111111111111111111111
...
...и ничего там подозрительного не вижу
ну да, длительность для разных tzx отличается
но так и должно получаться
Spectramine
11.12.2024, 12:22
другие эмули твой badall тоже грузят. надеюсь, ты не забываешь загружать в 48к режиме.
у меня тоже все три нормально грузятся. Правда я код подчищал от старых рудиментов, может чтото поменялось. Код для блока PURE-DATA был очень старый, я особо не разбирался что там было, просто переписал начисто, возможно это сказалось.
Что касается MASK, у меня она с полярностью 1 не грузится, ей нужно 0. Вот допиленный TZX, который грузится в ZXMAK2.
Кстати, что у тебя за странный ZIP архиватор? Стандартный UNZIP твой файл не понимает, при этом размер у него на 5% больше, чем если перепаковать стандартным ZIP с обычным уровнем сжатия.
Lethargeek
11.12.2024, 12:36
другие эмули твой badall тоже грузят. надеюсь, ты не забываешь загружать в 48к режиме.
конечно, а иначе просто сбросится еще до
- - - Добавлено - - -
Что касается MASK, у меня она с полярностью 1 не грузится, ей нужно 0.
нет, судя по коду, ей нужно именно setlevel=1 (для чётного кол-ва пилотных импульсов)
он же замеряет общую длительность для пары импульсов именно 0000...00001111...11111
https://www.alessandrogrussu.it/loading/Schemes/docs/gremlin2.html
либо у тебя всё инверсное?
- - - Добавлено - - -
Кстати, что у тебя за странный ZIP архиватор?
я ж говорил уже - 7-zip 24.08
Spectramine
11.12.2024, 12:38
Нашел любопытные образы ленты, игрушка Mask, оригиналы CSW и WAV тут:
https://www.alessandrogrussu.it/loading/Schemes/schemes.html
CSW: https://www.alessandrogrussu.it/loading/DirectRecords/Mask%20(10%20Great%20Games%202).csw.zip
WAV: https://www.alessandrogrussu.it/loading/DirectRecords/Mask%20(10%20Great%20Games%202).wav.zip
Любопытно тут то, что из CSW игра у меня не грузится, fuse тоже отказывается грузить.
А из WAV нормально грузится, хотя этот CSW вроде как из этого WAV получен...
На WOS лежат 2 TZX: https://worldofspectrum.org/archive/software/games/mask-gremlin-graphics-software-ltd
1: https://www.worldofspectrum.org//pub/sinclair/games/m/MASK.tzx.zip
2: https://www.worldofspectrum.org//pub/sinclair/games/m/MASK(IBSA).tzx.zip
Обе версии похожи на исходный WAV, с таким-же необычным загрузчиком. Но... оба TZX тоже не работают, ни у меня, ни в fuse. Иногда случайно загружаются если долго дергать загрузку сохранившись в снэпшот. Тоесть есть какая-то плавающая ошибка.
При этом оригинал из WAV грузится абсолютно стабильно. Однако в CSW почему-то начальное состояние сигнала 1, а в исходном WAV - 0. Что окончательно запутывает ситуацию. Пробовал инвертировать начальное состояние в CSW, загрузка вроде стаблильнее становится, но всеравно до конца не грузится.
Отсюда возникают вопросы - неужели на WOS выложили битые TZX образы? И почему в CSW начальное значение отличается от WAV оригинала?
Еще очень странная штука - в CSW и WAV sampleRate = 45454 Hz. Чтото тут не так, откуда такая частота? Разве есть звуковухи с такой странной частотой?
погонял у себя, первый tzx грузится, всё остальное нет.
в Спектакуляторе wav грузится, всё остальное нет.
в SpecEmu csw грузится, всё остальное нет
веселуха)
выложил новый тестовый билд: https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2535341864
исправления:
- исправлена частота шума AY
- добавлены оригинальные образы trdos 5.03 и 5.04T (проверял по md5, найти оказалось не просто), эмулятор теперь использует 5.04T по умолчанию
- добавлена ULA Орель БК-08 (не проврял, просто со слов подставил параметры ULA48 без задержек и подправленной дешифрацией порта бордюра)
- подчищен и переработан код загрузки TZX, исправлены мелкие ошибки, добавлено более детальное отображение ошибок, добавлена возможность грузить битые TZX до места ошибки.
У кого есть Орель, проверьте - совпадают ли мультиколорные и бордюрные эффекты в эмуляторе с реальной Орелью.
Lethargeek
11.12.2024, 12:59
Вот допиленный TZX, который грузится в ZXMAK2.
он не допиленный, а вообще в другой формат перепиленный
ты фактически добавил один импульс к длине пилота
а я в оригинальном tzx добавил в Tapir блоки #2B
он не допиленный, а вообще в другой формат перепиленный
ты фактически добавил один импульс к длине пилота
а я в оригинальном tzx добавил в Tapir блоки #2B
нет, число ипульсов должно совпадать, там только в одном турбо-блоке я заменил тайминги и число импульсов, т.к. оно сильно отличалось от остальных.
В ZXMAK2 этот MASK.TZX (https://zx-pk.ru/attachment.php?attachmentid=81661&d=1733908906) работает :D
Я думаю нужно узнать какие длительности 0 и 1 загрузчик ожидает и сколько импульсов пилот-тона и привести все к единообразию, а то сейчас в этом TZX в каждом блоке тайминги свои, хоть и не сильно отличаются.
Что касается твоего файла bobsleigh-test.zip (https://zx-pk.ru/attachment.php?attachmentid=81659&d=1733881593), то в последней версии ZXMAK2 все три варианта грузятся без ошибок.
выложил новый тестовый билд:
А в версии под винду такие же правки будут?
Lethargeek
11.12.2024, 14:18
нет, число ипульсов должно совпадать,
не совпадает; я в другом ошибся: ты не добавил, а фактически убрал импульс
флаг=2 это значит первый символ начинается с нуля, то есть совпадает с тишиной
но результат тот же - кол-во реальных импульсов в пилоте стало нечётным
тогда синхропара начинается с нуля и определяется правильно
А в версии под винду такие же правки будут?
так версия одна под linux и win. Эмулятор просто при запуске проверяет систему и использует разные unity конфигурации под разные платформы.
Единственное, что собрано в mono под linux, могут быть приколы с переносами строк в win.
Lethargeek
11.12.2024, 14:37
ZXMAK, да, всё забываю сказать: ctrl+scroll для maximum speed крайне неудачный выбор
во-1, комба вместо одной кнопки; во-2, нынче не на всех клавах есть отдельная кнопка scroll
таким в лучшем случае нужна комба аж из трёх кнопок, в худшем не работает вовсе
ак версия одна под linux и win. Эмулятор просто при запуске проверяет систему и использует разные unity конфигурации под разные платформы.
Да, точно)
Если ставить у монитора развертку, например, 100Гц, то плавные скроллы в демках чуть дрожат примерно раз в несколько секунд. Но оно и на прежних релизах было, я думаю, от этого никуда не деться при подобном методе синхронизации.
Впрочем, у Спектакулятора дрожание гораздо заметнее и неприятнее, поэтому пока что ZXMAK2 в топчике)
Lethargeek
11.12.2024, 15:00
Да, точно)
Если ставить у монитора развертку, например, 100Гц, то плавные скроллы в демках чуть дрожат примерно раз в несколько секунд. Но оно и на прежних релизах было, я думаю, от этого никуда не деться при подобном методе синхронизации.
Впрочем, у Спектакулятора дрожание гораздо заметнее и неприятнее, поэтому пока что ZXMAK2 в топчике)
в топчике вообще дрожать не должно в режиме честной синхры по видео, что же там за метод такой тогда
Если ставить у монитора развертку, например, 100Гц, то плавные скроллы в демках чуть дрожат примерно раз в несколько секунд. Но оно и на прежних релизах было, я думаю, от этого никуда не деться при подобном методе синхронизации.
Впрочем, у Спектакулятора дрожание гораздо заметнее и неприятнее, поэтому пока что ZXMAK2 в топчике)
а зачем 100 Гц ставить, я ставлю 50 Гц - скролы идеально плавно идут, как на оригинале :)
Если дисплей не позволяет, то оптимально 75 Гц поставить, но при мерцании цвет не совсем верный получается.
- - - Добавлено - - -
в топчике вообще дрожать не должно в режиме честной синхры по видео, что же там за метод такой тогда
при 100 Гц не получится, чтобы 50 Гц не дрожало - либо прийдется картинку смазывать, либо будет дрожать. По другому никак. Дрожание обусловлено тем, что движение обновляется раз в два кадра, у спектрума нет промежуточных кадров, поэтому заполнить лишний кадр нечем.
Lethargeek
11.12.2024, 15:11
при 100 Гц не получится, чтобы 50 Гц не дрожало - либо прийдется картинку смазывать, либо будет дрожать. По другому никак. Дрожание обусловлено тем, что движение обновляется раз в два кадра, у спектрума нет промежуточных кадров, поэтому заполнить лишний кадр нечем.
как так нечем? выводи каждую zx-картинку тупо два раза
в топчике вообще дрожать не должно в режиме честной синхры по видео, что же там за метод такой тогда
Дрожание при таких методах синхронзиации происходит из-за расхождения тактовой частоты звуковухи (если она не интегрированна в материнку) и частоты материнки (процессора) /видюхи.
У меня есть несколько звуковух. Так вот на встроенных все нормально, на отдельной звуковухе, вставленной в слот, периодически дрожит.
- - - Добавлено - - -
при 100 Гц не получится, чтобы 50 Гц не дрожало - либо прийдется картинку смазывать, либо будет дрожать. По другому никак.
Смазывание и дрожание - это разные вещи.
Смазывание происходит из-за того, что между двумя кадрами нет угасания люминофора.
Если каждый второй кадр при 100Гц вставить кадр с половинной яркостью, или хотя бы на 20-30 процентов уменьшенной, то смазывание значительно сократится.
Кстати, если у вас LCD-монитор, то там, что 50, что 100Гц, смазывание будет одинаковое, т.к. у LCD-моников нет между кадрами затухания люминофора (что логично).
- - - Добавлено - - -
Я у себя в эмуляторе пробовал экспериментировать с каждым вторым кадром пониженной яркости, действительно смазывание убирается, но так глаза напрягаются больше, т.к. идет стробоскопический эффект.
как так нечем? выводи каждую zx-картинку тупо два раза
вот именно так и происходит
Lethargeek
11.12.2024, 16:00
Дрожание при таких методах синхронзиации происходит из-за расхождения тактовой частоты звуковухи (если она не интегрированна в материнку) и частоты материнки (процессора) /видюхи.
У меня есть несколько звуковух. Так вот на встроенных все нормально, на отдельной звуковухе, вставленной в слот, периодически дрожит.
при каких "таких"? если включено "frame sync source = video", звуковуха-то каким боком?
либо звук подстраивается под видео, либо видео под звук, но что-нибудь одно пострадает
а если подстраивать под время - страдает всё)) но звук проще корректировать плавненько
- - - Добавлено - - -
вот именно так и происходит
у меня картинка так не дрожит - ЧЯДНТ?
- - - Добавлено - - -
в смысле, с выводом в режиме SDL_RENDERER_PRESENTVSYNC
у меня картинка так не дрожит
это кажется, что не дрожит, а если сравнить с 50 Гц разверткой, то можно заметить, что дрожит :)
Lethargeek
11.12.2024, 16:14
это кажется, что не дрожит,
так дрожание и есть "то, что кажется" ))
а если сравнить с 50 Гц разверткой, то можно заметить,
запускаю свой эмуль, неважно с какой развёрткой, без пропуска кадров - всё плавно
включаю замедление вдвое (сделанно тупым повтором кадров) - всё равно плавно
ЧЯДНТ?
при каких "таких"? если включено "frame sync source = video", звуковуха-то каким боком?
либо звук подстраивается под видео, либо видео под звук, но что-нибудь одно пострадает
а если подстраивать под время - страдает всё)) но звук проще корректировать плавненько
Можно синхронизировать и под звук и под видео одновременно. Но это сложнее.
На ранних версиях моего эмулятора так и было, пока у меня был DirectSound с монопольным доступом к звуковухе.
А как пересел на более новые винды, это не работало, и я выкинул временно такую идею.
смотрю программу MZ80 для Орели, по инструкции её нужно загружать как LOAD "" CODE. В заголовке адрес загрузки 0. Получается теневая память в нем все-время включена на запись а бит в системном порту подключает ее на чтение?
Правильно, ли этот отладчик запустился после сброса и нажатия NMI?
https://i.imgur.com/FrQL1BP.png
Что-то никак не могу включить курсор E в Орелевском конфиге, видимо, какой-то из модификаторов работает неправильно - у Орели их был весь набор - CTRL-SHIFT-ALT, плюс Р/L, временное переключение языка.
Ctrl + Insert. Кнопка Ctrl - это ALT. А кнопка УПР - это Insert. А CODE можно ввести удерживая Insert и J.
Переназначить можно в Keyboard-orel.config
И в теневое ОЗУ ничего не грузится чет(
В той версии, что я сегодня выложил, запись в теневое озу когда подключено ПЗУ еще не работает, это я только-что исправил.
Spectramine
11.12.2024, 23:27
Ctrl + Insert. А CODE можно ввести удерживая Insert и J.
А отобразить модификаторы PC в модификаторы Орели как есть, шифт в шифт, контрол в контрол, альт в альт, не получится?
А отобразить модификаторы PC в модификаторы Орели как есть, шифт в шифт, контрол в контрол, альт в альт, не получится?
Да как угодно можно замапить в Keyboard-orel.config. Но тогда нужно будет куда-то Р/А назначить и будет не похоже на клавиатуру орели по физическому расположению.
Вот zorel нарисовал где какие кнопки:
https://i.imgur.com/FI58uDK.png
Сейчас максимально близко к оригиналу по расположению, только кнопки УПР на PC клавиатурах нет, поэтому пришлось ее на Insert повесить. Возможно ктото подскажет лучший вариант.
Spectramine
11.12.2024, 23:41
Сейчас максимально близко к оригиналу по расположению, только кнопки УПР на PC клавиатурах нет, поэтому пришлось ее на Insert повесить. Возможно ктото подскажет лучший вариант.
Так УПР это CTRL же)
Так УПР это CTRL же)
по названию, а по расположению на современных клавиатурах этой кнопки слева от CAPS LOCK нет :)
Можно поменять - поставить УПР на ALT, а Р/А перекинуть на Insert. Правда тогда будет не похоже на клавиатуру Орели, а насколько это юзабельно, я затрудняюсь сказать.
Spectramine
11.12.2024, 23:53
Вот кстати классная клавиатура на фото, на моей клавиатуре Орели не было ключевых слов, приходилось лазить в инструкцию.
- - - Добавлено - - -
по названию, а по расположению на современных клавиатурах этой кнопки слева от CAPS LOCK нет :)
Всё же, мне кажется, прямое отображение модификаторов лучше, во-первых, не надо ничего помнить, во-вторых, кнопки для курсора E рядом, в третьих, Ins в качестве модификатора как-то некомильфо.
- - - Добавлено - - -
С Ctrl же куча ключевых слов на Орели вводится.
- - - Добавлено - - -
А РУС и Р/Л можно повесить на кнопки Попапменю и Win.
Залил исправление для записи в shadow RAM для Орели: https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2537166699
теперь монитор работает :)
В аттачменте tap файл. Загрузить LOAD "" CODE, потом нажать VM->NMI.
В виду отсутствия утилит на linux, TAP файлы были сконверчены из WAV вручную, в на скорую руку написаной утилите flac2tap :) Поэтому не могу быть уверен, что все правильно, но crc совпадает и вроде работает :)
- - - Добавлено - - -
А где тот монитор для Орели альтернативный, что выкладывали выше? не успел скачать, а его уже убрали...
Lethargeek
12.12.2024, 18:53
ZXMAK, с бобслеем разобрался (разница влияла, но не так, как подумал было)
но теперь другое нашёл - в Update6 грузится только со включенным autoplay
да и вообще капризная, например, в zxspin требует модель (не режим) 48k
а в inkspector2 нормально и в 128k загрузилась (везде тестил без ускорения)
но теперь другое нашёл - в Update6 грузится только со включенным autoplay
да и вообще капризная, например, в zxspin требует модель (не режим) 48k
а в inkspector2 нормально и в 128k загрузилась (везде тестил без ускорения)
да, действительно - любопытный tzx.
Заметил баг в автоплее - он отключает магнитофон во время паузы перед 10-ым блоком на 2.08 секунды, хотя из контекста можно понять что отключать в такие моменты не нужно. Думал проблема в этом - исправил...
Но нет, это не помогло - автостоп теперь не срабатывает, но загрузка мистическим образом при включенном автоплее завершается корректно, а с отключенным - сбрасывается. Проверил - состояние автоплея нигде больше не используется. Думал влияет момент запуска с включенным автоплеем, однако запуск по автоплею, с последующим отключеним автоплея не помогает- сбрасывается. Мистика прямо какая-то :)
Update: а нет, всеж-таки при запуске по автоплею с последующим его отключением грузится нормально, правда не всегда. Видимо проблема с моментом когда начинается чтение и запускается магнитофон. Видимо успешность зависит от того - смотря в какой момент запуск магнитофона прозошел. Странно это :)
в 48к действительно всегда нормально грузится
Update2: разница между запуском магнитофона автоплеем и без в том, что с автоплеем загрузчик подхватывает пилот-тоны всех блоков на 2161 тактов раньше, что подозрительно похоже на 1 полупериод пилот-тона.
Вот табличка такт процессора в момент начала воспроизведения каждого блока. Трапы включены. Первая колонка с автоплеем (с корректной загрузкой), вторая без (со сбросом):
0 0
17482105 17484262
27806450 27808616
49229443 49231617
59532828 59534986
71320201 71322336
86513078 86515220
106812486 106814656
106815325 106817491
106816060 106818222
131868608 131870773
131871442 131873607
131872172 131874348
144489138
Lethargeek
14.12.2024, 07:29
в 48к действительно всегда нормально грузится
выставил в своём эмуле для пентагона 69888 тактов на кадр - прокатило, загружается даже из 128k менюшки
однако при 70908 уже не захотела никак - хотя в inkspector2 в 128k почему-то грузится
возможно, модель спека определяется заранее по каким-то другим признакам
- - - Добавлено - - -
ну, и с автоплеем у тебя всё равно, похоже, что-то не так, надо разбираться и фиксить
вспомнил про ещё один `хитрый` TZX, проверьте загрузку игры MoonLighter
https://spectrumcomputing.co.uk/pub/sinclair/games/m/Moonlighter.tzx.zip
...............
в MylaDi (во время игры) IM2=#39FF,
с нестабильной шиной будут проблемы
вспомнил про ещё один `хитрый` TZX, проверьте загрузку игры MoonLighter
https://spectrumcomputing.co.uk/pub/...ighter.tzx.zip
во всех режимах стабильно работает
Lethargeek
14.12.2024, 14:06
во всех режимах стабильно работает
у меня опять хочет фрейм короче пентагоновского :v2_mad:
а то есть еще такоэ - http://www.tzxvault.org/Spectrum/TZX/FalconTheRenegadeLord.zip
так вот, ему меньше пентагона норм, турба многократно больше норм, а с кадром пентагона - nonsense in basic :v2_crazy:
а то есть еще такоэ - http://www.tzxvault.org/Spectrum/TZX...negadeLord.zip
тоже стабильно грузится во всех режимах. Но загрузчик любопытный с пикалкой в стиле космической музыки :)
Lethargeek
15.12.2024, 00:16
тоже стабильно грузится во всех режимах. Но загрузчик любопытный с пикалкой в стиле космической музыки :)
пикалка как раз не проблема, у меня почему-то сглючивает кодовый блок при 71680 (хотя speedtest одинаково показывает)
может, в длительности INTR еще дело, но ведь тоже в допустимых для пента пределах установил
Lethargeek
15.12.2024, 18:40
покопал немного, некоторые поверхностные выводы
пикалка - роли не играет и не нужна (в данной версии спидлока, по крайней мере), можно вообще удалить из образа
длительности пауз между начальными стандартными блоками - не важны (можно хоть остановки полные вставить)
больше того, даже первый бейсик блок выглядит не нужным - всё прекрасно со второго загружается и работает
причём даже у меня загружается)) а вот после первого блока - хрен; что же он такого делает, кроме как пакостит
(непосредственная причина глюка - прерывание приходит во время ксорки по R, без первого бейсика - не заденет)
как-то я не заметил, что при переписывании загрузчика TZX сломалась загрузка блоков #18 c Z-RLE и #28. Исправил.
Выложил новый тестовый билд 8: https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2545420954
Что нового:
- добавлена поддержка кнопок KEY_COMPOSE и KEY_NUMLOCK (меню приложения и num-lock на нумпаде). Для Орели в Keyboard-orel.config кнопка KEY_COMPOSE добавлена в дополнение к KEY_INSERT как дублирующая для кнопки УПР.
- исправлена загрузка TZX блоков 0x18 и 0x28
- исправлены сообщения об ошибках в TZX загрузчике
- мелкие исправления и оптимизации для эмуляции магнитофона
- исправлена обработка блоков некорректной длины в tape trap
- исправлен отладчик для поддержки всей памяти залитой #DDFD (см. tap-файл с тестом в аттачменте для модели Spectrum +2/+3) от Mark Woodmass. Раньше отладчик зависал при открытии на таком коде. Теперь дизассемблирует "невалидные" префиксы как *DB #DD/FD.
- исправлен стоп эмуляции чтобы избежать префиксного состояния при записи снэпшотов. На "невалидных" префиксах эмулятор останавливается, т.к. они не мешают сохранению. Валидные префиксы при остановке завершаются. Step Into и Step Over в отладчике теперь тоже рассматривают невалидные префиксы как отдельную интрукцию.
- исправлена проблема с переносом строк на Windows
- немного оптимизирован рендеринг WinForms для Linux
- добавлены кнопки для быстрого сохранения и загрузки снэпшота: Ctrl+Alt+PageDown сохраняет текущее состояние, Ctrl+Alt+PageUp восстанавливает. Быстрые снэпшоты сохраняются в папке FASTSAVE как fastsave0.szx. Предыдущие записи копируются в fastsave1.szx, fastsave2.szx и fastsave3.szx, так что в случае чего можно найти и несколько предыдущих сохранений.
- исправлены пропорции отображения для экрана Sprinter в WinForms для Linux
В аттачменте tap-файл с тестом забивающим всю память #DDFD префиксом, запускать на Spectrum +2/+3 модели.
Немного по поводу вывода на экран в эмуляторе.
Есть такая программка - PresentMon. Она позволяет замерить какая задержка между моментом отправки кадра в окно и его реальным обновлением в окне. Помимо этого, конечно, еще многое чего может, но это отдельная тема.
Начиная с Win7 появилась возможность перейти к новому принципу вывода в окно не на основе блиттинга (копирования битмапа в окно) а на основе модели переключения flip.
Все программное обеспечение написанное под старые API, такие как Direct3D 9, или еще хуже DirectDraw, не может пользоваться этим новым функционалом.
Для примера затестил вывод в окно на нескольких эмуляторах:
Spectaculator 8.0: D3D9: Задержка 30мс, вывод в окно GPU GDI. 50fps. GPU 5%
ZXMAK 2: D3D9: Задержка 29мс, вывод в окно GPU GDI. 100fps. GPU 50%
EmuStudio old: DirectDraw: Задержка 27мс, вывод в окно GPU GDI, 100fps. GPU 25%
EmuStudio flip: DXGI: Задержка 27мс, вывод в окно Flip. 100fps. GPU 2%
EnuStudio independent flip: DXGI: Задержка 17мс, вывод в окно independent flip. 100fps. GPU 4%
Как видно, на современной видеокарте и на последней винде все режимы, кроме Independent flip дают задержку около 27-30мс. А режим independent flip выводит на целый фрейм раньше (17мс). Если же частота обновления монитора будет меньше, не 100, а 50Гц, то задержка увеличится вдвое.
Есть ли у кого-то процессор Z80 NEC NMOS (NEC D780C-1)?
Именно такой сейчас в эмуляторе эмулируется.
Тут пишут, что нашли новые фишки для INIR/OTIR/INDR/OTDR:
https://spectrumcomputing.co.uk/forums/viewtopic.php?t=10555
Попробовал исправить, но z80memptr.tap с исправлением ошибок не выдает, а вот без исправления наоборот выдает. Видимо автор теста уже пофиксил CRC для NEC NMOS процессоров в тесте - с фиксом CRC совпадает с тем что указал ZjoyKiLer.
Однако z80full.tap из той-же версии почему-то ругается на исправленный INIR:
https://i.imgur.com/Clgpwgp.png
А если фикс убрать, то наоборот пишет OK.
В общем путаница... Нужно проверить какие результаты дает эта версия теста (см. аттачмент) на реальном Z80 NEC D780C-1.
Есть ли у кого-то процессор Z80 NEC NMOS (NEC D780C-1)?
Именно такой сейчас в эмуляторе эмулируется.
У zebest был.
Это немного нестандартный NMOS, если судить по Test SCF.
Это немного нестандартный NMOS, если судить по Test SCF.
да, такие Z80 реже встречаются, но довольно широко использовались в оригинальных спектрумах.
На самом деле в эмуляторе есть выбор 4 типов Z80 (Zilog NMOS, Zilog CMOS, NEC NMOS и ST CMOS), но 3 остальные типа используют Q регистр, он реализован в SCF/CCF, но чтобы он полноценно работал, нужно по всем инструкциям не использующим флаги распихать сброс Q регистра, мне такая модификация не нравится, поэтому остальные типы пока без эмуляции Q регистра. А этот процессор не использует Q регистр, поэтому я устанавливаю его тип по умолчанию.
Вот тут есть скрины с тестами спектрумов на NEC NMOS, правда непонятно какой версии тесты, явно старые:
https://github.com/redcode/Z80/wiki/Zilog-Z80-CPU-Test-Suite
Сделал новую версию теста для визуальной проверки таймингов ULA - mctest3.
У кого есть реальные спектрумы, просьба запустить и сделать снимок экрана с хорошим качеством (чтобы пикселы было видно), приложить снимок с описанием - какая модель спектрума и были-ли в схеме доработки влияющие на тайминги.
Особенно интересует оригинальный Pentagon-128 и фирменный ZX Spectrum 48.
Также для коррекции таймингов требуется снимок с экрана для Орель БК-08 и других моделей.
Spectramine
25.12.2024, 02:18
Особенно интересует оригинальный Pentagon-128 и фирменный ZX Spectrum 48.
Самое интересное это картинка теста с желтого Скорпиона - у Спектакулятора, Fuse, ZXMAK и Unreal картинки слегка отличаются :) А ещё в Unreal тест шумит, в остальных молчит.
А ещё в Unreal тест шумит, в остальных молчит.
в Unreal тайминги сдвинуты на нечетное число тактов, отсюда и нестабильность.
Интереснее, что Pentagon-128 в эмуляторах неправильно эмулируется. Причем разброс довольно большой - до 4-6 тактов. В ZXMAK2 вроде корректно.
Spectramine
25.12.2024, 16:20
в Unreal тайминги сдвинуты на нечетное число тактов, отсюда и нестабильность.
Нет, я имел ввиду гул при работе теста. Оказалось, тест выводит звук в бит записи на ленту.
Интереснее, что Pentagon-128 в эмуляторах неправильно эмулируется. Причем разброс довольно большой - до 4-6 тактов. В ZXMAK2 вроде корректно.Проверил основные свои референсные эмули, нашел различие только у FUSE. У Пентагонов реальных тоже бывает сдвиг начала растра на 1-2 такта.
У Пентагонов реальных тоже бывает сдвиг начала растра на 1-2 такта
на 1 такт может, но это помоему только для пиксельного поля актуально, насколько помню в пентагоне такты выборки цвета и пиксела могут меняться местами если память занята в момент выборки, за счет этого может возникать расхождение в 1 такт. Но на 2 такта и более, тем более на бордюре - о таком не слышал.
Lethargeek
25.12.2024, 17:19
на 1 такт может, но это помоему только для пиксельного поля актуально, насколько помню в пентагоне такты выборки цвета и пиксела могут меняться местами если память занята в момент выборки, за счет этого может возникать расхождение в 1 такт. Но на 2 такта и более, тем более на бордюре - о таком не слышал.
ну, два, не два, но как раз на бордюре оно заметно
емнип Rage и Across the Edge для разных пентагонов заточены
емнип Rage и Across the Edge для разных пентагонов заточены
а в чём там проблема, они вроде с дефолтными таймингами пентагона обе одинаково корректно отображаются:
https://i.imgur.com/0uduoSb.pnghttps://i.imgur.com/TaQQ0d5.png
https://i.imgur.com/O4W3Quy.png
Lethargeek
25.12.2024, 18:34
а в чём там проблема, они вроде с дефолтными таймингами пентагона обе одинаково корректно отображаются:
у меня в твоём эмуле (вроде бы последнего апдейта) across кривая :)
в rage надо остановки дождаться или поймать строго по вертикали
у меня в твоём эмуле (вроде бы последнего апдейта) across кривая
что именно и в какой версии across?
Я проверял эту версию (https://zxaaa.net/view_demo.php?id=9284), в ней вроде всё в порядке, ошибок не вижу.
в rage надо остановки дождаться или поймать строго по вертикали
Проверил на этой версии rage (https://zxaaa.net/view_demo.php?id=2632) все углы - всё ок... :)
На скринах ULA с расширенным бордюром:
https://i.imgur.com/DE8o8o8.png
https://i.imgur.com/wPSqrw3.png
Возможно вы загружаете демы из снепшотов и в снэпшоте не сохранена какая-то деталь, существенная для корректной обработки таймингов, поэтому тестить нужно загружая и запуская программу в обычном режиме с образа диска/кассеты.
Lethargeek
25.12.2024, 20:04
что именно и в какой версии across?
которая fix3 - в ZXMAK2 Update8
Я проверял эту версию, в ней вроде всё в порядке, ошибок не вижу.
там 4 версии, возможно, как раз под разные пентагоны
Spectramine
25.12.2024, 20:10
там 4 версии, возможно, как раз под разные пентагоны
именно
там 4 версии, возможно, как раз под разные пентагоны
да, действительно, я запускал fix_0, она нормально работает, в fix_3 таймниги действительно сдвинуты.
Хм, а у пентагона разве были ревизии плат с доработками таймингов? В чем у них отличие?
Spectramine
25.12.2024, 20:36
Хм, а у пентагона разве были ревизии плат с доработками таймингов? В чем у них отличие?
Не ревизии с доработками таймингов, а на разных экземплярах Пентагона разные начальные такты вывода растра, как я уже сказал.
Не ревизии с доработками таймингов, а на разных экземплярах Пентагона разные начальные такты вывода растра, как я уже сказал.
как такое получается, что на одинаковой схеме разные начальные такты?
Spectramine
25.12.2024, 21:19
Понятия не имею) Видимо, разброс параметров элементов схемы.
запускал fix_0, она нормально работает, в fix_3 таймниги действительно сдвинуты
фикс0 самый правильный, отсальное - ну захотелось разрабам так, чО..
"- Господи, да у нее шесть ног! Что ж вы сразу не сказали? -всколыхнулся Анаконда. - Зачем ей шесть ног?!
- Перестраховщики с Венеры, - бросил Рассветов. - Это их работка.
Сконструировали недурное, в общем, устройство, но, чтобы увеличить коэффициент прочности, добавили пару ног..." (с)
Spectramine
25.12.2024, 21:42
ну захотелось разрабам так, чО..
разрабам так захотелось не на пустом месте. разные начальные такты вывода растра на Пентагоне были зафиксированы тестами.
разрабам так захотелось не на пустом месте. разные начальные такты вывода растра на Пентагоне были зафиксированы тестами.
мне кажется дело не в пентагоне, а в том, чтобы работало на разных эмуляторах, даже если тайминги отличаются от пентагона :D
А с таймингами пентагона в эмуляторах разброд и шатание. Посмотрел Fuse и Xpeccy - у каждого свои тайминги пентагона. Оба отличаются от ZXMAK2.
К сожалению на оригинальном пентагоне пока никто не проверил.
Вот прислали режим Pentagon в ZX Spectrum Next (в точности соответствует ZXMAK2):
https://i.imgur.com/o4F693g.jpeg
https://i.imgur.com/xKLpg8b.png
Spectramine
26.12.2024, 00:36
мне кажется дело не в пентагоне,
вам кажется, а я тесты проводил. точнее, по моей просьбе люди гоняли мои тесты на своих пентагонах. разные тайминги начала экрана на Пентагоне доказанный экспериментально факт.
- - - Добавлено - - -
Посмотрел Fuse и Xpeccy - у каждого свои тайминги пентагона.
Xpeccy не пользуюсь, а кривая эмуляция Пентагона во Fuse давно известна. Спектакулятор, СпекЭму, Unreal дают одинаковую картинку, совпадающую с вышеприведенной и ZXMAK2.
от прислали режим Pentagon в ZX Spectrum Next
ну правильно, там умные люди подгоняли режим Пент-а по Rage, а не по мифическим fix1-2-3 для инвалидов.
Да и вообще, по эмулям, хотя и железным равняЦЦа - ну такое себе..
https://pic.maxiol.com/images2/1735164202.2987899537.emuulator.jpg
Супер-точный эмуулятор, мне нравиЦЦа :) Название называть не буду :))
а по Fuse я давно говорил, там кривые тайминги, вы бы еще с Лунтером сравнивали, ага..
я тесты проводил. точнее, по моей просьбе люди гоняли мои тесты на своих пентагонах. разные тайминги начала экрана на Пентагоне доказанный экспериментально факт.
откуда тогда разница берется? Чтобы была разница в таймингах схема должна отличаться. Плавать могут фронты внутри такта, но на несколько тактов отличия без изменений в схеме не может быть.
Spectramine
26.12.2024, 03:42
откуда тогда разница берется? Чтобы была разница в таймингах схема должна отличаться. Плавать могут фронты внутри такта, но на несколько тактов отличия без изменений в схеме не может быть.
Возможно, из-за модификаций схемы, хотя разница в такт была и на Пентагоне-128. Плюс есть демка Confusion, на ней видно, что делалась под Пентагон со сдвигом в два такта, на стандарте не совпадает рисунок на бордюре и папере.
- - - Добавлено - - -
Супер-точный эмуулятор, мне нравиЦЦа Название называть не буду )
Эмулятор со сдвигом на 1 такт назад от стандарта. На моих эмулях можно выставить в настройках.
Возможно, из-за модификаций схемы, хотя разница в такт была и на Пентагоне-128.
разница в 1 такт на пентагоне возможна, т.к. у пентагона специфическая ULA, у которой могут меняться местами такт выборки аттрибута и такт выборки пиксела. Но это дает разницу максимум на 1 такт и только на пикселах. Для бордюра обращение к памяти не нужно.
Spectramine
26.12.2024, 04:28
разница в 1 такт на пентагоне возможна, т.к. у пентагона специфическая ULA, у которой могут меняться местами такт выборки аттрибута и такт выборки пиксела. Но это дает разницу максимум на 1 такт и только на пикселах. Для бордюра обращение к памяти не нужно.
дело строго в сдвиге такта начала вывода картинки (от начала INT), выборка атрибута/пикселя тут не причем.
дело строго в сдвиге такта начала вывода картинки (от начала INT), выборка атрибута/пикселя тут не причем.
Я вижу это так, что сдвинуть INT можно такими способами:
1) добавлением дополнительных триггеров для задержки на N клоков, что не имеет смысла, т.к. каждая микросхема стоит денег и усложняет конструкцию, а преимуществ от такой задержки 0
2) пропусканием INT через цепочку логических элементов, но на несколько тактов так сдвинуть будет почти нереально, т.к. логика достаточно быстра
3) установкой конденсатора на INT для смазывания фронта, однако это приведет к нестабильному моменту прерывания и к проблемам с метастабильностью. INT в таком случае будет нестабильный. Зачем это делать - непонятно.
первые два случая - это явное изменение схемы с внесением дополнительной логики в INT.
Третий случай можно рассмотреть как "настройку", но это некорректный способ, т.к. делает INT нестабильным по моменту срабатывания и чреват проблемами с метастабильностью - это может привести к непредсказуемым шумам и залипанию сигнала INT на случайное непредсказуемое время, смысл такого действия непонятен. В качестве генератора случайных чисел такой подход возможно имел бы смысл, но не для INT.
Spectramine
26.12.2024, 23:50
Я вижу это так, что сдвинуть INT можно такими способами:
К Late Timings фирменных моделей у вас вопросов нет? Причем они могут меняться даже на одной машине.
К Late Timings фирменных моделей у вас вопросов нет?
Это разные чипы ULA, т.е. по сути разные схемы формирования изображения из памяти.
- - - Добавлено - - -
обновил тест MCTEST3 для ULA. В самом тесте изменений нет, поправлена инициализация, чтобы работало из TRDOS.
В архив добавлены три варианта загрузки - TZX, TAP и TRD.
https://i.imgur.com/gFJ3SMa.png
Spectramine
27.12.2024, 06:31
Это разные чипы ULA, т.е. по сути разные схемы формирования изображения из памяти.
Што?? На одной машине в разное время могут быть как Early, так и Late Timings. Подтверждено экспериментально)
Подтверждено экспериментально)
тогда давайте ссылку на "подтверждение", без деталей непонятно о чем вы говорите.
Spectramine
27.12.2024, 08:03
тогда давайте ссылку на "подтверждение", без деталей непонятно о чем вы говорите.
Мне достаточно того, что я это знаю.
Это разные чипы ULA, т.е. по сути разные схемы формирования изображения из памяти.
Это ваше измышление, которое я мог бы легко опровергнуть, но не буду. Оставайтесь в своей незамутнённой самоуверенности.
Мне достаточно того, что я это знаю.
Это ваше измышление, которое я мог бы легко опровергнуть, но не буду. Оставайтесь в своей незамутнённой самоуверенности.
Ваше утверждение вызывает интерес, но, к сожалению, без конкретных подтверждений или воспроизводимых данных сложно принять его как достоверное. Наука и инженерия строятся на проверяемости и подтверждаемости утверждений. Если у вас есть результаты тестов, подтверждающие, что разные тайминги действительно могут наблюдаться на одной и той же машине без изменений в схеме и использовании одних и тех-же чипов, было бы полезно поделиться ими для анализа.
Без таких данных ваше заявление остается субъективным мнением, не подкрепленным фактами. Это не только усложняет конструктивное обсуждение, но и ставит под сомнение обоснованность ваших выводов. Про такие "экспериментальные подтверждения" в народе говорят "Бабушка гадала, да надвое сказала - то ли дождик, то ли снег, то ли будет, то ли нет".
Если вы уверены в своих выводах, предлагаю представить более конкретные данные, такие как конкретные тесты, конкретные модели спектрума на которых он запускался и результаты замеров. Это позволит объективно рассмотреть вашу гипотезу, проверить ваши результаты повторными экспериментами и проанализировать есть ли в тестах или в результатах ошибка или вашу гипотезу действительно чем-то можно подтвердить.
Пока-же я вижу, что никаких подтверждений вашим словам нет. Что-же касается возможных смещений тайминга на несколько тактов, то это выглядит скорее как ошибка теста, который не синхронизируется с прерываниями, т.е. не выравнивает момент прерывания на нулевой такт и за счет этого может каждый раз давать разные результаты, в зависимости от того на какой такт прийдется запуск теста. Это никак не говорит, о том, что early и late тайминги не зависят от разницы в схеме или что пентагон без модификаций в схеме может давать большой разброс в таймингах более 1T. Это говорит только об ошибке в тестовом коде или ошибках при тестировании.
Сделать тест, который сможет настроиться на нулевой такт на любой машине с учетом разной длины фрейма и разных схем с contention и выравниванием до четных тактов, довольно проблематично. Поэтому не удивительно, если ваш тест показывал разные результаты на одной и той-же машине. Это объясняется ошибкой теста, которая проявлялась на конкретной модели спектрума. В таких случаях тест нужно делать под конкретную модель, а не делать выводы что одна схема может давать разные тайминги.
Поэтому, если вы не можете предоставить тест и результаты для проверки и повторения, то нет даже предмета для обсуждения.
разные тайминги действительно могут наблюдаться на одной и той же машине
ну тут все немного не так. Одновременно конечно не могут, но.. Но буржуи приводили результаты, когда при холодном включении одни тайминги (например Early), а через какое-то время, видимо с прогревом, через 5-10-30 мин\час тайминги меняются на Late, и до выключения.
Но это скорее исключение, чем правило. И по Пентагону. Я знаю всего одну демку, на которой бордер на один такт не совпадает, и если выставить Late - то совпадает. Трудно сказать, так задумано\не досмотрели, но что есть - то есть. Думаю это тоже исключение, на которое не надо равняЦЦа.. Но это всего 1! такт, но не как не fix1-2-3
буржуи приводили результаты, когда при холодном включении одни тайминги (например Early), а через какое-то время, видимо с прогревом, через 5-10-30 мин\час тайминги меняются на Late, и до выключения
чем и как тестировали? Где о таких результатах почитать можно?
MCTEST3 кстати заточен на синхронизацию к INT для машин без замедления. На оригинальных с contention он стабильно работает, но за счет удачного стечения обстоятельств, поэтому вполне возможно, что на каких-то машинах может работать не стабильно.
Да какая разница, чем тестировали (может тестом EARLY\LATE на классике), елси это проделки ULA, коих и так не одна версия была (не просто же так?). С прогревом задержки в кремнии "ехали", если были и так на грани.
Spectramine
27.12.2024, 16:02
Ваше утверждение вызывает интерес, но, к сожалению, без конкретных подтверждений или воспроизводимых данных сложно принять его как достоверное. А ваше утверждение о том, что разница в таймингах фирменных машин вызвана разными моделями ULA, вызывает у меня фейспалм, и говорит о том, что вы глубоко не в теме вопроса. С чего вы это взяли вообще? Просто сами для себя это так объяснили, и выдаете за истину в последней инстанции, как обычно.
Без таких данных ваше заявление остается субъективным мнением, не подкрепленным фактами.Зато вы свое заявление подкрепили фактами, ага.
Если вы уверены в своих выводах, предлагаю представить более конкретные данные, такие как конкретные тесты, конкретные модели спектрума на которых он запускался и результаты замеров. Это позволит объективно рассмотреть вашу гипотезу, проверить ваши результаты повторными экспериментами и проанализировать есть ли в тестах или в результатах ошибка или вашу гипотезу действительно чем-то можно подтвердить.
Да кто вы такой, чтобы что-то вам предоставить? Обойдетесь. Вы уже отличились своими заявлениями об ошибке в SZX-формате и необоснованными наездами по поводу использования мной GNU-сной либы. А также советами, как лучше заработать деньги и т.п.
Дальнейший ваш высер по поводу сомнений в моих тестах считаю личным оскорблением) впрочем, не первым. Ну что ж, продолжайте сомневаться в моих тестах, и ни в коем случае не в своих выводах и умственных способностях. Я не заинтересован в том, чтобы вам что-то доказывать.
Зато вы свое заявление подкрепили фактами, ага.
Какое именно? Что спектрумы на разных чипах ULA производились? Так это не секрет, и вы об этом не просили, на мой взгляд это очевидная информация, которая доступна в интернете.
Вот например, можете ознакомитсья с некоторыми версиями чипов ULA, которые применялись в спектрумах: https://spectrumforeveryone.com/technical/zx-spectrum-ula-types/
Spectramine
27.12.2024, 16:43
Какое именно? Что спектрумы на разных чипах ULA производились? Так это не секрет, и вы об этом не просили, на мой взгляд это очевидная информация, которая доступна в интернете.
Вот например, можете ознакомитсья с некоторыми версиями чипов ULA, которые применялись в спектрумах: https://spectrumforeveryone.com/technical/zx-spectrum-ula-types/
Ох... :v2_dizzy_facepalm: Ваше заявление, что Early/Late timings обусловлены моделью ULA.
- - - Добавлено - - -
Это разные чипы ULA, т.е. по сути разные схемы формирования изображения из памяти.
Вот здесь.
Да кто вы такой, чтобы предлагать мне что-то вам предоставить? Обойдетесь. Вы уже отличились своими заявлениями об ошибке в SZX-формате и необоснованными наездами по поводу использования мной GNU-сной либы. А также советами, как лучше заработать деньги и т.п.
Дальнейший ваш высер по поводу сомнений в моих тестах считаю личным оскорблением) впрочем, не первым. Ну что ж, продолжайте сомневаться в моих тестах, и ни в коем случае не в своих выводах и умственных способностях.
Ваше сообщение содержит много эмоций, но, к сожалению, абсолютно никак не подкрепляет вашу позицию аргументами. Очень жаль.
Если вы хотите, чтобы ваши заявления воспринимались всерьез, особенно в техническом обсуждении, их стоит подкреплять фактами или результатами тестов, избегая оскорблений и эмоциональных тирад. Это стандартная практика в профессиональной среде, где аргументированность и открытость проверки помогают находить истину.
Также обращу внимание, что ваши субъективные оценки личностей не имеют отношения к обсуждаемой теме и меня не интересуют. Предлагаю оставить их вне обсуждения и сосредоточиться на конструктивном рассмотрении вопроса таймингов ZX Spectrum.
Если у вас есть технические аргументы по теме и возможность подтвердить свои слова конкретными данными, это будет гораздо более полезно для дискуссии. Эмоциональные высказывания и переходы на личности никак не могут служить доказательствами и лишь усиливают сомнения относительно вашей позиции.
Я не заинтересован в том, чтобы вам что-то доказывать.
Вы выдвинули гипотезу, что тайминги могут значительно отличаться (более чем на 1T) для одной и той же модели Spectrum без модификаций в схеме. В таком случае по правилам дискуссии бремя доказательств лежит на вас. Если вы не заинтересованы в предоставлении доказательств, тогда не стоило и выдвигать таких гипотез.
Ссылаться на некие "доказательства" которые у вас есть, но вы их никому не покажете, потому что не хотите и не должны - это не серьезно. И больше похоже на рассуждения ребенка, чем взрослого человека. Подобные фразы с вашей стороны только укрепляют уверенность в том, что вы ошибаетесь. Поэтому не обижайтесь, но вы сами своим отказом давать какие-либо подтверждения своим словам показываете их несостоятельность.
Я пока не увидел ни одного подтверждения вашим словам. А вот как вы могли получить разные тайминги даже на одной машине я вижу. Для этого не нужно чтобы тайминги действительно были разными, достаточно ошибки в тесте, причем такую ошибку будет довольно сложно заметить, даже при понимании как она может происходить.
Spectramine
27.12.2024, 17:46
Я не заинтересован в дискуссии с человеком, ожидающим от других подкреплять их позицию аргументами, но ниасиливающим подтвердить свою позицию хоть чем-то, кроме списка моделей ULA :v2_dizzy_facepalm: Которому приходится многостранично объяснять очевидное для всех, как в случае с "ошибкой формата SZX". Который выкатил тест с бордюрной картинкой, далеко не первый, и скорее всего не последний, и при этом сомневается в моих тестах и их результатах, которых он в глаза не видел. В дальнейшем я постараюсь избегать любых контактов с вами, так как в моих глазах вы утвердились как человек с раздутым самомнением, самоуверенностью, и ригидностью мышления.
Я не заинтересован в дискуссии с человеком, ожидающим от других подкреплять их позицию аргументами, но ниасиливающим подтвердить свою позицию хоть чем-то, кроме списка моделей ULA :v2_dizzy_facepalm: Которому приходится многостранично объяснять очевидное для всех, как в случае с "ошибкой формата SZX". Который выкатил тест с бордюрной картинкой, далеко не первый, и скорее всего не последний, и при этом сомневается в моих тестах и их результатах, которых он в глаза не видел. В дальнейшем я постараюсь избегать любых контактов с вами, так как в моих глазах вы утвердились как человек с раздутым самомнением, самоуверенностью, и ригидностью мышления.
Я уважаю ваше право на своё мнение, каким бы оно ни было, но ваши личные субъективные оценки моей личности не имеют отношения к обсуждаемой теме и мне совершенно не интересны. Предлагаю оставить их вне диалога, чтобы сохранять профессиональный подход.
Справедливости ради отмечу, что вы также демонстрировали профессионализм, например, когда поделились TZX файлом с игрой c необычным загрузчиком, который действительно помог в отладке. Однако вызывает недоумение, почему вы сразу же удалили этот файл (что, кстати, я замечал у вас неоднократно). С одной стороны, вы показали, что можете вести конструктивный диалог, но почему-то постоянно тяготеете к бесполезным оскорблениям и переходам на личности. Очень жаль.
Если у вас все-таки появится желание представить аргументы или результаты тестов, готов рассмотреть их предметно. Желаю успехов.
откуда тогда разница берется? Чтобы была разница в таймингах схема должна отличаться. Плавать могут фронты внутри такта, но на несколько тактов отличия без изменений в схеме не может быть.
Ну так фазы памяти жестко не привязаны.
Память работает на частоте 3.5мгц, так же есть триггер фазы атрибуты/пиксели
Видеоконтроллер каждый цикл памяти читает либо атрибуты либо пиксели в промежуточные буферы и триггер при каждом чтении меняет свое состояние на противоложное
Если процессор запросил доступ к памяти, ему выделяется 1 цикл памяти, в это время триггер пиксели атрибуты не меняет свое значение
Каждые 4 такта (8 точек растра) промежуточные буферы переписываются в сдвиговый регистр пикслей и регистр атрибутов
Начально значение триггера атрибуты/пиксели рандомно
за 4 такта памяти, процессор больше 2х раз не может запросить доступ к памяти, просто выходит из его диаграммы шинных циклов
амять работает на частоте 3.5мгц, так же есть триггер фазы атрибуты/пиксели
Видеоконтроллер каждый цикл памяти читает либо атрибуты либо пиксели в промежуточные буферы и триггер при каждом чтении меняет свое состояние на противоложное
Если процессор запросил доступ к памяти, ему выделяется 1 цикл памяти, в это время триггер пиксели атрибуты не меняет свое значение
это вы про пентагон, да я об этом писал выше может на 1 такт меняться за счет того что такт выборки аттрибутов и пикселов меняется местами если память была занята. Но это приводит к отклонению в 1 такт. Тут-же речь шла об отклонении в несколько тактов.
это вы про пентагон, да я об этом писал выше может на 1 такт меняться за счет того что такт выборки аттрибутов и пикселов меняется местами если память была занята. Но это приводит к отклонению в 1 такт. Тут-же речь шла об отклонении в несколько тактов.
Почему на 1? Может и на 2 (С-CPU A-ATTR P-PIX)
1. P A P A - К примеру начальная ситуация
2. C P A P - Поменялись местами
2. P A C P - Разница в обратную сторону но уже на 2 такта
- - - Добавлено - - -
дело строго в сдвиге такта начала вывода картинки (от начала INT), выборка атрибута/пикселя тут не причем.
INT формируется по счетчикам вывода картинки, начало INT не может плавать от каких либо номиналов компонентов на плате, только длительность
- - - Добавлено - - -
Хотя, вспомнил, На INT на сам сигнал вешали конденсатор, как раз что бы в rage выровнять бордюр.
Lethargeek
28.12.2024, 12:48
это вы про пентагон, да я об этом писал выше может на 1 такт меняться за счет того что такт выборки аттрибутов и пикселов меняется местами если память была занята. Но это приводит к отклонению в 1 такт. Тут-же речь шла об отклонении в несколько тактов.
это на бордюре же верхнем видно, когда эти выборки не делаются)))
Это разные чипы ULA, т.е. по сути разные схемы формирования изображения из памяти.
- - - Добавлено - - -
обновил тест MCTEST3 для ULA. В самом тесте изменений нет, поправлена инициализация, чтобы работало из TRDOS.
В архив добавлены три варианта загрузки - TZX, TAP и TRD.
https://i.imgur.com/gFJ3SMa.png
Добрый день. Орель работает вот так
https://pic.maxiol.com/thumbs2/1735476894.1596886884.img20241229143623.jpg (https://pic.maxiol.com/?v=1735476894.1596886884.img20241229143623.jpg&dp=2)
https://pic.maxiol.com/thumbs2/1735476959.1596886884.img20241229143629.jpg (https://pic.maxiol.com/?v=1735476959.1596886884.img20241229143629.jpg&dp=2)
Добрый день. Орель работает вот так
поправил, вроде совпадает, будет в следующей версии тестового билда:
https://i.imgur.com/Ia4mslf.png
только не понял один момент - у вас на фото вместо первой строки пикселов почему-то бордер отображается - это неисправность или так схема работает?
Запустите еще minfo, что он показывает?
поправил, вроде совпадает, будет в следующей версии тестового билда:
https://i.imgur.com/Ia4mslf.png
только не понял один момент - у вас на фото вместо первой строки пикселов почему-то бордер отображается - это неисправность или так схема работает?
Запустите еще minfo, что он показывает?
Добрый день, с праздником!
Вот фото сделал на еще одной орельке.
На платах кварци на платах чуток разные с завода, по этому скорей всего может быть небольшое отличие в работе.
https://pic.maxiol.com/thumbs2/1735736514.1596886884.img20250101145506.jpg (https://pic.maxiol.com/?v=1735736514.1596886884.img20250101145506.jpg&dp=2)
И фото теста со второй программы
https://pic.maxiol.com/thumbs2/1735736593.1596886884.img20250101145735.jpg (https://pic.maxiol.com/?v=1735736593.1596886884.img20250101145735.jpg&dp=2)
C Новым Годом! :)
Вот фото сделал на еще одной орельке.
На платах кварци на платах чуток разные с завода, по этому скорей всего может быть небольшое отличие в работе.
это не из-за кварца, разная циклограмма, вероятно поменялась схема или прошивка видеогенератора, а на плате есть какие-то отличительные признаки вроде версии, года выпуска или просто цвет платы? Можете выложить прошивки видеогенератора (DS10, DS15) с обоих вариантов для сравнения?
PS: картинки лучше выкладывать на imgur.com, они везде видны, быстро грузятся и без рекламного спама.
Вот прислали режим Pentagon в ZX Spectrum Next (в точности соответствует ZXMAK2)
У кого то есть реальный Next? KS1/KS2??
Может могли бы на нем проверить еще небольшой тест с z80DMA ? Ибо эту фичу полтора эмуля поддерживает, ну и ZX Next в т.ч.
тест с z80DMA
Что это за тест, и какие эмуляторы поддерживают?
Ну как бы немного оффтопик для данного топика ( автор такую дичь не поддерживает, видимо сложно очень?), но речь про чип z80 DMA.
И я бы не сказал, что совсемъ уж мало эмулей его поддерживает.
Открываем всем известную таблицу срамнения эмулей
https://docs.google.com/spreadsheets/d/14XnVBY8a9-IMtNC9RxUth_HPl8_bQncq-VCq1NmfOsg/edit?gid=0#gid=0
Как видим, минимуум 4 эмууля поддерживают интерфейс zDMA, плюс еще в списке МАМЕ, вроде как тоже поддерживает. Это софтово.
Железно ну само собой есть интерфейс и на краевой разъем классики, и в сокет z80 для совместимых.
Полу-железно:), в ФПГА есть поддержка в ZXNext (2 различных варианта), в ZX Uno ( то жи 2 разных варианта), в LNX, и в ts-conf ( у них правда свой собственный вариант DMA, но он есть, не знаю, есть ли в Анриле поддержка его)
Так что эта тема точно не полтора землекопам интересна (ключая меня).
Ну и да, реверса z80DMA вряд ли кто делал, непопулярно видимо, так что все эмулиЦЦа "по мотивам"
А вопрос в том, что в ZX Spectrum Next вроде как обещали 100% симулировать, но пока то что я вижу - довольно криво, может у кого то все же есть правильно :)
Как видим, минимуум 4 эмууля поддерживают интерфейс zDMA
а что это за зверь такой? я вообще не вижу по указанной ссылке упоминаний про zDMA и вообще DMA
Если правильно понимаю zDMA это какая-то фирменная либа в Xilinx для копирования памяти?
http://www.zilog.com/docs/z80/z84c10.pdf
такой же, ну или почти такой же и в ZX Spectrum Next, вот только проверить никто не хочет.
может комуу-то на С++ понятнее будет?)
https://github.com/mamedev/mame/pull/12658
У кого то есть реальный Next? KS1/KS2??
Может могли бы на нем проверить еще небольшой тест с z80DMA ? Ибо эту фичу полтора эмуля поддерживает, ну и ZX Next в т.ч.
Есть KS2 в доступности, смогу проверить (но, скорее всего, только на выходных)
существует ли шанс что эмуль соберут по windows/arm? unreal работает более менее нормально при эмуляции а zxmak2 крашится…
существует ли шанс что эмуль соберут по windows/arm? unreal работает более менее нормально при эмуляции а zxmak2 крашится…
Под Linux Arm работает. Под Windows Arm тоже должен работать. Если крешится, приведите лог с ошибкой.
Телепатией не владею, поэтому без описания не могу на расстоянии угадать, что именно у вас происходит...
Первым делом убедитесь, что DirectX 9 установлен.
ZXMAK, спасибо Вам, видимо все таки владете телепатией, сегодня внезапно заработало само все, скорее всего дело в апдейтах винды, работает довольно клево на Win11Arm@VMWare Fusion@Apple M3
sergio78
29.04.2025, 10:15
а где ссылки на сам актуальный эмулятор? а то тему читаю, все время чтото поправляют и добавляют, а на гитхабе дохлая мышь от 2018 года только висит.
https://github.com/zxmak/ZXMAK2/issues/8
sergio78
29.04.2025, 11:55
https://github.com/zxmak/ZXMAK2/issues/8
а здесь на этой ссылке, они теперь все время появляться будут дальше?
нужно синхронизировать код с репозиторием, когда я начинал исправлять код, у меня не был настроен git. Сейчас там нужно потратить время, чтобы все корректно синхронизировать, т.к. изменения включают исправления в регистре имени файлов (важно для линукса), я также делал OpenGL бакенд но работа приостановилась в состоянии - прототип на Linux отлично работает, не хуже чем бакенд DirectX в Windows, но в Windows у меня сейчас нет возможностей проверить, а по некоторым отзывам на Windows с новым OpenGL бакендом есть проблемы с пропуском кадров при отображении, непонятно с чем связанные - это не нагрузка на процессор, скорости хватает, все кадры отправляются на дисплей, но система почему-то пропускает некоторые кадры даже на простом приложении с переключением цвета заливки экрана на каждом кадре, возможно проблема с конкретным драйвером nVidia.
нужно синхронизировать код с репозиторием, когда я начинал исправлять код, у меня не был настроен git. Сейчас там нужно потратить время, чтобы все корректно синхронизировать, т.к. изменения включают исправления в регистре имени файлов (важно для линукса)
Готов с этим помочь, если выложишь просто снапшот текущей директории. Замежу и пулл-реквест пришлю. Больно смотреть, как эмулятор превращается в распространяющийся бинарями closed source.
- - - Добавлено - - -
Вот, кстати, может будет интересно. Недавно озаботился причесыванием своей архивной копии репозитория.
Там у меня не как у тебя, где первый коммит - это переезд на гитхаб, а хранится вся история со времен codeplex. Я перетащил все более свежие коммиты из основного репо и настроил автосборку на серверах гитхаба при пуше.
Еще переписал всю историю, распаковав ROMS.PAK. Теперь всё лежит отдельными ромами (так намного удобней отслеживать историю изменений в логе), а в архив собирается уже при окончательной релизной сборке автоматом.
https://github.com/atsidaev/ZXMAK2-archive
Еще переписал всю историю, распаковав ROMS.PAK. Теперь всё лежит отдельными ромами (так намного удобней отслеживать историю изменений в логе), а в архив собирается уже при окончательной релизной сборке автоматом.
да, с ромами я тоже сделал отдельную папку с ромами и скриптом для сборки, правда скрипт bash, для линукс. Можно и для Windows батник добавить, но может есть лучше варианты?
Я там также убрал ildasm/ilasm из проектного файла, т.к. оно сильно тормозило сборку и слишком сложно было править большой IL файл и были проблемы с компиляцией на линукс, теперь код генерится с помощью Mono.Cecil, и достаточно просто добавить прототип функции в C# и он автоматически при сборке имплементируется. Это используется для реализации OpenGL, где для вызова функции теперь достаточно толко объявить прототип функции и переменную с указателем с таким-же именем и они автоматически имплементятся и инициализируются при компиляции - можно сразу вызывать и проверять указатель - найдена ли функция. Переписывание кода с си заключается по сути в добавлении прототипов функций в класс gl и замене glClear на gl.Clear, или GL_VERSION на GL.VERSION.
Вот пример OpenGL кода:
static void onResize(Vector2i wndSize) {
gl.Viewport(0, 0, wndSize.X, wndSize.Y);
gl.MatrixMode(GL.PROJECTION);
gl.LoadIdentity();
gl.Ortho(0.0, 1.0, 1.0, 0.0, 1, 0);
gl.MatrixMode(GL.MODELVIEW);
}
static void onRender(Context ctx, Vector2i size) {
gl.MatrixMode(GL.MODELVIEW);
gl.PushMatrix();
gl.Clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT);
gl.Enable(GL.TEXTURE_2D);
gl.LoadIdentity();
if (_program.IsLinked) {
gl.UseProgram(_program.Id);
if (_rubyInputSizeId != -1)
gl.Uniform2f(_rubyInputSizeId, 320f, 256f);
if (_rubyOutputSizeId != -1)
gl.Uniform2f(_rubyOutputSizeId, (float)size.X, (float)size.Y);
if (_rubyTextureSizeId != -1)
gl.Uniform2f(_rubyTextureSizeId, 320f, 256f);
}
curtxid = texids[curtex];
gl.BindTexture(GL.TEXTURE_2D, curtxid);
gl.Begin(GL.TRIANGLE_STRIP);
gl.TexCoord2f(1.0f, 0.0f); gl.Vertex2f(1.0f, 0.0f); // RT
gl.TexCoord2f(0.0f, 0.0f); gl.Vertex2f(0.0f, 0.0f); // LT
gl.TexCoord2f(1.0f, 1.0f); gl.Vertex2f(1.0f, 1.0f); // RB
gl.TexCoord2f(0.0f, 1.0f); gl.Vertex2f(0.0f, 1.0f); // LB
gl.End();
if (_program.IsLinked) {
gl.UseProgram(0);
}
gl.Disable(GL.TEXTURE_2D);
gl.MatrixMode(GL.MODELVIEW);
gl.PopMatrix();
gl.Flush();
//gl.Finish();
ctx.SwapBuffers();
}
А как ты перетащил историю с codeplex?
А как ты перетащил историю с codeplex?
Я уже не помню, что там не кодеплексе было, svn вроде? Экспортировал весь репо в несколько сотен патчей, а потом на их основе гит-репо конструировал.
да, с ромами я тоже сделал отдельную папку с ромами и скриптом для сборки, правда скрипт bash, для линукс. Можно и для Windows батник добавить
А зачем? Для разработки достаточно того, что папка ROMS копируется в папку с экзешником (я добавил в csproj таргет для этого). У тебя же там так и сделано, что в ROMS.PAK мы лезем только если файл не найден в файловой системе. Поэтому скопировать всю папку достаточно. А релизные версии пусть сам гитхаб собирает, раз он предоставляет теперь такие возможности. Вот такой у меня там скрипт - https://github.com/atsidaev/ZXMAK2-archive/blob/master/.github/workflows/build.yml
Я там еще начал делать чтобы артефакты сборки куда-нибудь выкладывались, но не допилил еще. Можно сделать даже так, что новые версии будут прямо в Releases выкладываться.
Обновил тестовый билд 9: https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2844988275
Из основных изменений:
- исправлена эмуляция MEMPTR и флагов для блоковых инструкций inir/indr/otir/otdr
- наконец реализована полная поддержка Z80 NMOS и CMOS процессоров. Вроде все тесты что у меня есть для Z80 NMOS и CMOS типов проходит. Реализация позволяет переключать тип процессора. Но пока эта настройка не протянута. Т.к. текущая реализация для NEC и ST типов процессоров хоть и проходит тесты но почему-то не проходит SELF TEST - непонятно почему, поэтому пока процессор инициализируется как Zilog Z80 NMOS, где все тесты проходят ок. Позже приделаю выбор типа процессора и его можно будет менять на лету.
- исправлена, переписана и оптимизирована загрузка из WAV файлов, теперь не тупит и грузит шустро, также теперь поддерживаются WAV_FORMAT_EXTENSIBLE форматы и поправлены ошибки обработки сэмплов. Эмулятор всегда грузит WAV из первого (левого) канала (стерео и квадро поддерживается, но остальные каналы просто игнорируются), никакие фильтры не применяет, поэтому перед загрузкой WAV рекомендуется обработать его ФВЧ фильтром со срезом порядка 450 Гц.
- еще какие-то исправления, вклюая TZX/CSW и еще чтото точно не помню.
Релиз в двух архивах - можно использовать любой на любой платформе Windows, Linux или MacOS. Это просто билды разными компиляторами. msbuild версия на Linux может кидать ворнинги в консоль, но вроде работает пошустрее, чем mono версия.
anarchyman
01.05.2025, 19:20
ZXMAK, Приветствую!
Попробовал сейчас запустить на macos 12.7.6 (intel)
Новую версию mono поставил через brew
abayrak@MacBook-Air-Alexander ZXMAK2 % mono --version
Mono JIT compiler version 6.14.1 (tarball Tue Apr 29 17:43:02 UTC 2025)
Copyright (C) Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS:
SIGSEGV: altstack
Notification: kqueue
Architecture: amd64
Disabled: none
Misc: softdebug
Interpreter: yes
LLVM: supported, not enabled.
Suspend: hybrid
GC: sgen (concurrent by default)
При запуске (через ./zxmak2) - вот такая ошибка:
abayrak@MacBook-Air-Alexander ZXMAK2 % ./zxmak2
WARNING: The Carbon driver has not been ported to 64bits, and very few parts of Windows.Forms will work properly, or at all
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: The type initializer for 'System.Drawing.GDIPlus' threw an exception. ---> System.DllNotFoundException: libgdiplus.dylib assembly:<unknown assembly> type:<unknown type> member:(null)
at (wrapper managed-to-native) System.Drawing.GDIPlus.GdiplusStartup(ulong&,System.Drawing.GdiplusStartupInput&,System.Drawing.GdiplusStartupOutput&)
at System.Drawing.GDIPlus..cctor () [0x000b0] in <e6eb2331cafe45d88e5f98d6df8e2628>:0
--- End of inner exception stack trace ---
at System.Drawing.Icon.Dispose () [0x00011] in <e6eb2331cafe45d88e5f98d6df8e2628>:0
at (wrapper remoting-invoke-with-check) System.Drawing.Icon.Dispose()
at System.Drawing.Icon.Finalize () [0x00000] in <e6eb2331cafe45d88e5f98d6df8e2628>:0
Что с этим можно предпринять? :-)
Судя по ошибке mono работает и эмулятор запустился, но отсутствует необходимая библиотека libgdiplus - нужно установить.
На Linux она ставится как sudo apt install libgdiplus, как на Mac не знаю.
Если нет в репозитории, можно из исходников собрать и установить: https://github.com/mono/libgdiplus
Сборка на Linux выглядит примерно так:
sudo apt-get install libgif-dev autoconf libtool automake build-essential gettext libglib2.0-dev libcairo2-dev libtiff-dev libexif-dev
git clone https://github.com/mono/libgdiplus.git
cd libgdiplus
./autogen.sh --prefix=$PREFIX
make -j$(nproc)
sudo make install
Как собрать на MacOS, там на странице библиотеки есть инструкции.
если разберетесь, как на MacOS установить или собрать libgdiplus, отпишите шаги.
anarchyman
01.05.2025, 20:46
ZXMAK, Благодарю за ответ!
Дело сдвинулось. На macos libgdiplus я поставил через brew ( https://formulae.brew.sh/formula/mono-libgdiplus )
Команда для установки: brew install mono-libgdiplus
Теперь оно крешится вот так:
abayrak@MacBook-Air-Alexander ZXMAK2 % ./zxmak2
WARNING: The Carbon driver has not been ported to 64bits, and very few parts of Windows.Forms will work properly, or at all
================================================== ===============
Native Crash Reporting
================================================== ===============
Got a segv while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.
================================================== ===============
================================================== ===============
Native stacktrace:
================================================== ===============
0x10378685c - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_dump_native_crash_info
0x10372ef59 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_handle_native_crash
0x10392e54d - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : altstack_handle_and_restore.cold.1
0x103781e58 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_amd64_get_exception_trampolines
0x7ff822d93d87 - /System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight : SLDisplayBounds
0x10a3c5408 - Unknown
0x103ff9b76 - Unknown
0x1036b0017 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_jit_runtime_invoke
0x103865c5d - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : do_runtime_invoke
0x1038620b8 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_runtime_class_init_full
0x1036a89a2 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_jit_compile_method_inner
0x1036ac33b - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_jit_compile_method_with_opt
0x1037312c0 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : common_call_trampoline
0x103730cf1 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_magic_trampoline
0x103bfb396 - Unknown
0x10a166023 - Unknown
0x10a3c0108 - Unknown
0x1064d8403 - Unknown
0x103fcdf39 - Unknown
0x103fcdc93 - Unknown
0x103f6c53a - Unknown
0x103c8d671 - Unknown
0x1036b0017 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_jit_runtime_invoke
0x103865c5d - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : do_runtime_invoke
0x103868f0c - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : do_exec_main_checked
0x1036fed93 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_jit_exec
0x10370199a - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_main
0x1036a238c - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : main
0x1129f552e - Unknown
================================================== ===============
External Debugger Dump:
================================================== ===============
================================================== ===============
Basic Fault Address Reporting
================================================== ===============
Memory around native instruction pointer (0x7ff822d93d87):0x7ff822d93d77 89 fb 48 8b 05 d0 18 fe 3a 0f 10 00 0f 10 48 10 ..H.....:.....H.
0x7ff822d93d87 0f 11 4f 10 0f 11 07 89 f7 48 89 de e8 67 00 fb ..O......H...g..
0x7ff822d93d97 ff 48 89 d8 48 83 c4 08 5b 5d c3 55 48 89 e5 53 .H..H...[].UH..S
0x7ff822d93da7 48 83 ec 28 48 8b 05 16 2b fe 3a 48 8b 00 48 89 H..(H...+.:H..H.
================================================== ===============
Managed Stacktrace:
================================================== ===============
at <unknown> <0xffffffff>
at System.Windows.Forms.XplatUICarbon:CGDisplayBounds <0x000b7>
at System.Windows.Forms.XplatUICarbon:get_WorkingArea <0x00072>
at System.Windows.Forms.XplatUICarbon:get_VirtualScre en <0x00043>
at System.Windows.Forms.XplatUI:get_VirtualScreen <0x00048>
at System.Windows.Forms.Screen:.cctor <0x0017a>
at System.Object:runtime_invoke_void <0x000a5>
at <unknown> <0xffffffff>
at System.Windows.Forms.Form:get_CreateParams <0x00622>
at System.Windows.Forms.Form:SetClientSizeCore <0x001c7>
at System.Windows.Forms.Control:set_ClientSize <0x00048>
at System.Windows.Forms.Form:set_ClientSize <0x00052>
at System.Windows.Forms.Form:UpdateWindowText <0x00082>
at System.Windows.Forms.Control:set_Text <0x000a8>
at System.Windows.Forms.Form:set_Text <0x0004a>
at ZXMAK2.Host.WinForms.Views.MainView:InitializeComp onent <0x06100>
at ZXMAK2.Host.WinForms.Views.MainView:.ctor <0x00382>
at ZXMAK2.Host.WinForms.Views.MainView:.ctor <0x00072>
at System.Object:BuildUp_ZXMAK2.Host.WinForms.Views.M ainView <0x00272>
at Microsoft.Practices.ObjectBuilder2.DynamicMethodBu ildPlan:BuildUp <0x00046>
at Microsoft.Practices.ObjectBuilder2.BuildPlanStrate gy:PreBuildUp <0x001d6>
at Microsoft.Practices.ObjectBuilder2.StrategyChain:E xecuteBuildUp <0x000c1>
at Microsoft.Practices.Unity.UnityContainer:DoBuildUp <0x00288>
at Microsoft.Practices.Unity.UnityContainer:DoBuildUp <0x00062>
at Microsoft.Practices.Unity.UnityContainer:Resolve <0x0005a>
at Microsoft.Practices.Unity.UnityContainerExtensions :Resolve <0x00087>
at ZXMAK2.Dependency.ResolverUnity:Resolve <0x00322>
at ZXMAK2.Host.Presentation.Launcher:Run <0x0017f>
at ZXMAK2.Program:RunSafe <0x00059>
at ZXMAK2.Program:Main <0x0015a>
at <Module>:runtime_invoke_void_object <0x000b0>
================================================== ===============
./zxmak2: line 3: 83662 Abort trap: 6 mono "$(dirname ${BASH_SOURCE[0]:-$0})"/ZXMAK2.exe "$@"
Вообщем я думаю вот в чем основная причина:
WARNING: The Carbon driver has not been ported to 64bits, and very few parts of Windows.Forms will work properly, or at all
И так да, с 10.15 macos 64bit только.
В подтверждении по части carbon'а:
--
With the release of the Macintosh's 10.15 (Catalina) update, the Carbon API was officially discontinued and removed, leaving Cocoa as the sole primary API for developing modern Mac applications.
--
Тогда это очень печально :-(
А кто то из пользователей активных писал о том что удачно все запустил под macos?
А попробуйте создать вот такой файл testwf.cs:
using System;
using System.Windows.Forms;
class Program {
static void Main(string[] args) {
try {
using (var form = new Form())
{
Application.Run(form);
}
} catch (Exception ex) {
Console.WriteLine("\x1b[31;1m{0}:\x1b[22m {1}\n{2}\x1b[0m", ex.GetType().Name, ex.Message, ex.StackTrace);
}
}
}
и затем скомпилировать его и запустить:
mcs -out:"testwf.exe" -debug -define:DEBUG testwf.cs -r:System.Windows.Forms
mono --debug testwf.exe
Откроется окно?
anarchyman
01.05.2025, 21:46
Откроется окно?
Крешнулось :-(
abayrak@MacBook-Air-Alexander ZXMAK2 % mcs -out:"testwf.exe" -debug -define:DEBUG testwf.cs -r:System.Windows.Forms
abayrak@MacBook-Air-Alexander ZXMAK2 % mono --debug testwf.exe
WARNING: The Carbon driver has not been ported to 64bits, and very few parts of Windows.Forms will work properly, or at all
================================================== ===============
Native Crash Reporting
================================================== ===============
Got a segv while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.
================================================== ===============
================================================== ===============
Native stacktrace:
================================================== ===============
0x10ac8585c - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_dump_native_crash_info
0x10ac2df59 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_handle_native_crash
0x10ae2d54d - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : altstack_handle_and_restore.cold.1
0x10ac80e58 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_amd64_get_exception_trampolines
0x7ff822d93d87 - /System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight : SLDisplayBounds
0x111f8bda8 - Unknown
0x10b32dcc6 - Unknown
0x10abaf017 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_jit_runtime_invoke
0x10ad64c5d - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : do_runtime_invoke
0x10ad610b8 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_runtime_class_init_full
0x10aba79a2 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_jit_compile_method_inner
0x10abab33b - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_jit_compile_method_with_opt
0x10ac302c0 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : common_call_trampoline
0x10ac2fcf1 - /usr/local/Cellar/mono/6.14.1/bin/mono-sgen : mono_magic_trampoline
0x10b0fa396 - Unknown
0x111f8b32b - Unknown
================================================== ===============
External Debugger Dump:
================================================== ===============
================================================== ===============
Basic Fault Address Reporting
================================================== ===============
Memory around native instruction pointer (0x7ff822d93d87):0x7ff822d93d77 89 fb 48 8b 05 d0 18 fe 3a 0f 10 00 0f 10 48 10 ..H.....:.....H.
0x7ff822d93d87 0f 11 4f 10 0f 11 07 89 f7 48 89 de e8 67 00 fb ..O......H...g..
0x7ff822d93d97 ff 48 89 d8 48 83 c4 08 5b 5d c3 55 48 89 e5 53 .H..H...[].UH..S
0x7ff822d93da7 48 83 ec 28 48 8b 05 16 2b fe 3a 48 8b 00 48 89 H..(H...+.:H..H.
================================================== ===============
Managed Stacktrace:
================================================== ===============
at <unknown> <0xffffffff>
at System.Windows.Forms.XplatUICarbon:CGDisplayBounds <0x000b7>
at System.Windows.Forms.XplatUICarbon:get_WorkingArea <0x00072>
at System.Windows.Forms.XplatUICarbon:get_VirtualScre en <0x00043>
at System.Windows.Forms.XplatUI:get_VirtualScreen <0x00048>
at System.Windows.Forms.Screen:.cctor <0x0017a>
at System.Object:runtime_invoke_void <0x000a5>
at <unknown> <0xffffffff>
at System.Windows.Forms.Hwnd:GetNextStackedFormLocati on <0x001aa>
at System.Windows.Forms.XplatUICarbon:CreateWindow <0x00462>
at System.Windows.Forms.XplatUI:CreateWindow <0x00047>
at System.Windows.Forms.NativeWindow:CreateHandle <0x0006a>
at System.Windows.Forms.Control:CreateHandle <0x000ac>
at System.Windows.Forms.Form:CreateHandle <0x00052>
at System.Windows.Forms.Control:CreateControl <0x000ba>
at System.Windows.Forms.Control:SetVisibleCore <0x000fa>
at System.Windows.Forms.Form:SetVisibleCore <0x0023a>
at System.Windows.Forms.Control:set_Visible <0x00052>
at System.Windows.Forms.Control:set_Visible <0x000aa>
at System.Windows.Forms.Application:RunLoop <0x00422>
at System.Windows.Forms.Application:Run <0x00092>
at System.Windows.Forms.Application:Run <0x0007a>
at Program:Main <0x000b2>
at <Module>:runtime_invoke_void_object <0x000b0>
================================================== ===============
zsh: abort mono --debug testwf.exe
abayrak@MacBook-Air-Alexander ZXMAK2 %
это плохо, значит Windows.Forms не получится использовать. Можно еще попробовать более старую версию mono 6.12, может там бакенд для Windows.Forms на MacOS работает.
Попробуйте еще вот этот тест запустить, это на основе моего нового opengl движка, он не использует Windows.Forms, должен открыть окно и показывать два кадра из raw файлов (это сырой код текстур 320x256x4 записаный из эмулятора) должна получиться мультиколорная картинка из эмулятора. По F11 переключается в полноэкранный режим и обратно, но это помоему только для Linux и Windows реализовано, для MacOS я полноэкранный режим помоему не доделал. Я когда-то отлаживал на старой версии MacOS и вроде работало, работает ли сейчас на MacOS не знаю, т.к. основная отладка велась на Linux и Windows. Скопируете лог инициализации который в консоль пишется сюда.
Вообще хотел использовать его совместно с Windows.Forms, но раз на MacOS он не работает, то прийдется без Windows.Forms чтото придумывать. Это печально. На Linux с OpenGL все замечательно работает, я думал и на MacOS все будет хорошо, в Windows только с OpenGL проблемы с потерей некоторых кадров. А тут еще и в MacOS поддержку убрали...
anarchyman
01.05.2025, 23:12
ZXMAK, Полный провал, но есть мысли.
abayrak@MacBook-Air-Alexander test_gl % mono test-zx.exe
sizeof(void*): 8
sizeof(utsname): 2304
EntryPointNotFoundException: NewEventHandlerUPP assembly:<unknown assembly> type:<unknown type> member:(null)
at (wrapper managed-to-native) SFGL.Platform.Mac.NativeMethods.NewEventHandlerUPP (SFGL.Platform.Mac.Carbon.MacOSEventHandler)
at SFGL.Platform.Mac.CarbonApp.ConnectEvents () [0x0011f] in <5b0a5322be994d2cb9f0eb60e99c30c7>:0
at SFGL.Platform.Mac.CarbonApp.Initialize () [0x0001e] in <5b0a5322be994d2cb9f0eb60e99c30c7>:0
at SFGL.Platform.Mac.Window.CreateNativeWindow (SFGL.Platform.Mac.Carbon.WindowClass class, SFGL.Platform.Mac.Carbon.WindowAttributes attrib, SFGL.Platform.Mac.Carbon.Rect r) [0x00001] in <5b0a5322be994d2cb9f0eb60e99c30c7>:0
at SFGL.Platform.Mac.Window..ctor (SFGL.Platform.Mac.Carbon.WindowClass class, SFGL.Platform.Mac.Carbon.WindowAttributes attrib, System.Int16 width, System.Int16 height, SFGL.Platform.PixelSettings pixelSettings) [0x0002b] in <5b0a5322be994d2cb9f0eb60e99c30c7>:0
at SFGL.Platform.Mac.Window..ctor (System.Int16 width, System.Int16 height, SFGL.Platform.PixelSettings pixelSettings) [0x00000] in <5b0a5322be994d2cb9f0eb60e99c30c7>:0
at SFGL.Platform.Mac.FactoryMac.CreateWindow (System.Int32 width, System.Int32 height, SFGL.Platform.PixelSettings pixelSettings) [0x00001] in <5b0a5322be994d2cb9f0eb60e99c30c7>:0
at TESTZX.Program.Main () [0x0000e] in <5b0a5322be994d2cb9f0eb60e99c30c7>:0
abayrak@MacBook-Air-Alexander test_gl %
Опять упоминается Carbon - который не работает на 64bit. Я не программист, но меня в логе смутило:
System.Int16 и System.Int32 - Под Int я-ж правильно понимаю что это Integer?
хм, судя по логу программа не смогла загрузить функцию NewEventHandlerUPP для инициализации Carbon.
Хотя она работает в 64-битном режиме, получается Carbon в 64 битном режиме не доступен?
А в 32-битном режиме он доступен? Или его вообще выпилили из MacOS с концами?
Уже не помню деталей, возможно я отлаживал код на 32-битной MacOS и возможно в этом проблема - на 64-битной системе возможно нужно использовать другое имя функции или чтото подправить. Ну или как вариант - ждать пока в mono добавят драйвер для Cocoa.
Если ктото может привести пример на Си для инициализации окна OpenGL под новые API MacOS, можно попробовать сделать новый бакенд.
System.Int32 - это тип int C# он всегда 32-битный независимо от того на какой платформе и каком процессоре работает.
System.Int16 - это тип short C# он всегда 16-битный независимо от того на какой платформе и каком процессоре работает.
с тем фрагментом кода все в порядке - это обертка над MacOS API. Проблема возникает тут:
EntryPointNotFoundException: NewEventHandlerUPP assembly:<unknown assembly> type:<unknown type> memberhttps://zx-pk.ru/images/smilies/dizzy_frown.gifnull)
at (wrapper managed-to-native) SFGL.Platform.Mac.NativeMethods.NewEventHandlerUPP (SFGL.Platform.Mac.Carbon.MacOSEventHandler)
at SFGL.Platform.Mac.CarbonApp.ConnectEvents () [0x0011f] in <5b0a5322be994d2cb9f0eb60e99c30c7>:0
Функция CarbonApp.ConnectEvents () пытается инициализировать Carbon, а точнее установить обработчик событий окна, но падает, т.к. не может найти функцию NewEventHandlerUPP, вот как эта функция определена:
private const string Carbon = "/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon";
private const string GestaltLib = "/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon";
private const string Agl = "/System/Library/Frameworks/AGL.framework/Versions/Current/AGL";
[SuppressUnmanagedCodeSecurity]
[DllImport(Carbon)]
public static extern IntPtr AcquireRootMenu();
[SuppressUnmanagedCodeSecurity]
[DllImport(Carbon)]
public static extern IntPtr NewEventHandlerUPP(MacOSEventHandler handler);
...
internal delegate OSStatus MacOSEventHandler(IntPtr inCaller, IntPtr inEvent, IntPtr userData);
}
любопытно тут то, что перед этой функцией вызывается AcquireRootMenu() и судя по логу она вызвалась успешно, т.е. Carbon всетаки есть, но видимо API поменялся и вместо NewEventHandlerUPP нужно дергать чтото другое...
AI говорит, что Carbon вообще выпилили... Говорит, что запустить Carbon приложение можно только из 32-битного режима, для этого предлагает запускать так:
arch -i386 mono test-zx.exe
но тут-же пишет, что это сработает только если у вас установлена 32-битная версия Mono и вы используете старую версию macOS (<10.15). Начиная с macOS Catalina, 32-битные приложения вообще не поддерживаются. Т.е. Carbon вообще никак теперь нельзя использовать. А некоторые функции все еще работают, т.к. используются в Cocoa. Вот так...
Вобщем можно поправить, но для этого нужно переделать код для использования Cocoa вместо Carbon.
В процессе прогона тестов оказалось, что в тестовом билде 9 была добавлена ошибка. Точнее при исправлении флагов INIR/INDR по ошибке была удалена 1T задержка. Что привело к ошибкам в contended memory тестах.
Вот исправленная версия 9b: https://github.com/zxmak/ZXMAK2/issues/8#issuecomment-2845991083
PS: Кстати, к своему удивлению заметил что скорость в режиме max speed стала в 3-4 раза выше, чем в старом релизе 2.9.3.8. Не обратил внимание, что привело к такому ускорению, но теперь эмулятор стал заметно шустрее.
cafedead
02.05.2025, 16:03
PS: Кстати, к своему удивлению заметил что скорость в режиме max speed стала в 3-4 раза выше, чем в старом релизе 2.9.3.8. Не обратил внимание, что привело к такому ускорению, но теперь эмулятор стал заметно шустрее.
Что-то я не увидел разницы. Что в одной версии до 1200 фпс, что в другой.
видимо от процессора зависит у меня 200 vs 700
ZXMAK, а когда планируешь стабильную версию выпустить ?
вроде уже довольно много изменений набралось.
ZXMAK, а когда планируешь стабильную версию выпустить ?
да, нужно, но каждый раз какое-то дело находится чтобы отложить :)
anarchyman
03.05.2025, 18:02
ZXMAK, По части сборки для macos - пока временная тишина. У себя пока ничего нового сделать не могу. Тут видимо у кого маки - или не интересно, или лень.
Я уже написал 2 людям проверенным у кого mac - в наличии - но один ща в 4 дне запоя по случаю майских, а второй в пути.
Но тех задание, и просьбу выйти на связь - я заслал, так что продолжим в ближайшее время - наш мини-детектив, со сборочкой ZXMAK2 - для macos.
Думаю просто дело чести довести до конца, а как идеал - оформим еще что бы через brew можно было поставить.
По части сборки для macos - пока временная тишина.
вот есть какой-то Cocoa driver для mono в MacOS: https://github.com/migueldeicaza/CocoaDriver, посмотрите, может получится собрать с ним.
У меня macOS нету и виртуалку запустить не могу, поэтому проверять не на чем.
abelenki
25.05.2025, 08:52
ZXMAK, подскажи пожалуйста, можно ли в новых тестовых версиях отключить принудительное логгирование в текстовый файл *.log?
ZXMAK, подскажи пожалуйста, можно ли в новых тестовых версиях отключить принудительное логгирование в текстовый файл *.log?
да, для этого нужно просто закоментить fileAppender в файле log4net.config, т.е. заменить вот эту строку:
<appender-ref ref="fileAppender" />
на вот такую:
<!--<appender-ref ref="fileAppender" />-->
mike-shevchenko
25.10.2025, 04:12
Поставил свежий релиз 2.9.3.8 (другие не пробовал на этой машине) на полностью заапдейченную 10-ю винду - вроде работает, но вверху экрана постоянно горит сообщение "System.DllNotFoundException: Unable to load DLL 'd3dx9_43'. The specified module could not be found."
Полагаю, эмуль требует какой-то фиксированной версии DirectX?
[bETA]mEN
25.10.2025, 11:17
Полагаю, эмуль требует какой-то фиксированной версии DirectX?
Видимо, нужен https://www.microsoft.com/ru-ru/download/details.aspx?id=35
Надеюсь, с ZXMAK все хорошо. Что-то он с лета не появлялся.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot