возможно у Орель другие тайминги экрана (на первой картинке смещены полосы на бордюре).
посмотри как это выглядит на реале.
- - - Добавлено - - -
всё зависит от твоего провайдера !!!
я их спокойно вижу.
Вид для печати
да, ULA я не добавлял, да и вообще не тестил, т.к. у меня нет программ орели, которыми можно потестить развертку изображения.
Я неудачно в конфиг орели добавил ULA от стандартного ZX Spectrum 48, у которой задержки есть, а у орели нет. Лучше конечно выбрать в настройках ULA от другой модели - без задержек, чтото вроде Pentagon. Для этого после переключения в модель Орель, нужно настроить ULA, выбрав другой тип.
Чтобы исправить настройку по умолчанию при смене модели, можно подправить machines.config, скопировав строку с ULA из ZXMAK2.vmz
Для детальной настройки ULA нужны тесты с фотками как на реальной орели выглядит.
Основной момент - протестить клавиатуру (как я вижу тест похоже пройден, кроме кнопок ГРАФ, НОРМ, ИНВ, РЕД. Где взять этот тест клавиатуры орель со скрина?
Кнопка УПР должна работать - она в конфигурации клавиатуры замаплена на кнопку KEY_INSERT. Можно добавить в конфиг и ГРАФ, НОРМ, ИНВ, РЕД, правда для этого прийдется решить на какие кнопки их замапить, что непросто, т.к. почти все кнопки клавиатуры заняты клавишами орели. Можно например KEY_Fx использовать.
Сама конфигурация клавиш задана в Keyboard-orel.config. Вначале идет определение матрицы клавиатуры:
В ней задаются имена элементов матрицы, в данном случае условное название кнопок. Эти условные имена используются только в конфиг файле, поэтому можно переименовать при желании, можно и на других языках писать, но учитывать, что разделителем являются символы ',', ';', ' ', '\t', их использовать в качестве имени нельзя. Неиспользуемые элементы матрицы лучше называть одинаково _ для единообразия.Код:<!--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>
Далее определеняется какие кнопки приводят к срабатыванию элемента матрицы, например:
Задает срабатывание кнопки Р/А по нажатию одной из клавиш KEY_LEFTALT или KEY_RIGHTALT.Код:<KeyBinding Key="RA">
<Condition Key="KEY_LEFTALT"/>
<Condition Key="KEY_RIGHTALT"/>
</KeyBinding>
Если задан атрибут Condition в элементе KeyBinding, то вложенные элементы Condition игнорируются (хотя есть мысль убрать это ограничение, т.к. оно запутывает):
PS: для картинок наверное лучше https://imgur.com использовать - и шустрее и вроде везде работает, но чтобы можно было в эмулятор вставить лучше переделать изображение в графику по аналогии как в Help->Keyboard сделано, желательно с векторной графикой.Код:<KeyBinding Key="TAB" Condition="KEY_TAB"/>
ссылка
Отличный эмулятор. QuickBoot, мне очень нравится. Автор, пожалуйста, развивайте свой проект и добавляйте хоть иногда в него новые возможности: не хватает маленьких инструментов, типа просмотрщика графики, удобного помощника клавиатуры, в котором работает нажатие клавиш (соответственно, добавить изображение клавиатуры Байта, Орели) и т.п., что можно было бы перенять из других, по-большей части заброшенных, эмуляторов.;)
Согласен.
Интересен вопрос, почему автор уходит от виндовой версии к линуксовой? Ведь комп с виндой это пока что самое распространенное среди эмуляторщиков, да и вообще.
- - - Добавлено - - -
Кстати, по поводу синхронизации эмулятора с кадровой разверткой.
Совершенно случайно сегодня обнаружил, что есть и еще один современный надежный метод: IDXGIOutput::WaitForVBlank()
Позволяет синхронизироваться с каким-то конкретным монитором, если у вас он не один.
Например, запустили приложение на первом мониторе, а потом перетащили окно на второй. Но если синхронизация идет каким-то стандартным способом через DMW или Present, я думаю, что все будет завязано на кадровую развертку первого монитора. А так можно произвольно выбирать.
Функция эта появилась начиная с Vista, поэтому кто не рассчитывает на XP (а я давно его выпилил из своего эмуля), можно смело использовать.
Причем, эта функция является абсолютно не блокирующей, в отличие от устаревших версий в DirectDraw.
И даже меньше занимает времени системы, чем DMW (и, как я думаю, Present), потому что не ждет компоновки рабочего стола, а сразу выходит по VBlank.
Чето мне кажется что от оригинала не отличается, могу наделать фото с оригинальной орели в разных режимах, программах, для более точной эмуляции..
https://pic.maxiol.com/thumbs2/17329...ot20241130.jpg
https://youtu.be/6N9R4ArxsMs?si=7Dw_uktdShmDtmG1
Никуда он не уходит, те же exы болтыхаются, а на счёт да и вообще, у меня например xpecсy на лине, RVM на лине, UNREAL через wine запускаю на крайняк. Так что чем больше под линь эмулей, тем лучше ))
Кстати как сиё чудо под линем запустить ? Поставил чтото из mono, стало грузить окошко, но вертикальные полосы только. В настройках ромы недоступны. Куда и как ? ))
Да, MX-Linux ака debian 12.
эмулятор и так отслеживает смену дисплея, на котором отображается окно и пересоздает контекст на лету, если окно перетащили на другой дисплей.
- - - Добавлено - - -
Та версия, что в релизах на линукс не заточена. Для линукса тестовый билд вот тут: https://github.com/zxmak/ZXMAK2/issu...ent-2508881244
Для работы эмулятора нужно установить такие библиотеки:
Для запуска на линуксе запускать bash скрипт zxmak2.Код:sudo apt install mono-runtime libmono-system-drawing4.0-cil libmono-system-windows-forms4.0-cil
sudo apt install libopenal-dev
Возможно чтото еще пропустил для установки, если не работает, посмотрите лог файл, который создается в папке эмулятора.
Его и использовал, либы установлены, ничего не поменялось.
Под 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
у вас в системе видимо почему-то настроена кодировка 866 по умолчанию, но сама кодировка почему-то не поддерживается, видимо не установлен какой-то пакет. Я с таким пока не сталкивался, нужно разбираться.Код: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)
Ну а эмулятор не работает потому что из-за этой ошибки не может распаковать ром файл из zip архива.
Кстати, что на счет звука в эмуляторе?
Можно ли менять частоту дискретизации и разрядность? В каких пределах?
разрядность нет - всегда 16 бит. А частоту можно задать в unity.config в конструкторе соответствующей реализации. Для DirectSound, см. блок
Для OpenAL на линукс см. блок:Код:<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>
sampleRate должен быть кратным 50. В остальном пределы ограничиваются пределами используемой библиотеки. Для DirectSound помоему максимальная 384000.Код:<register type="IHostSound" mapTo="HostSound_OAL">
<constructor>
<param name="sampleRate" value="48000" />
<param name="bufferCount" value="4" />
</constructor>
<lifetime type="transient" />
</register>
Чушь. В лине по умолчанию UTF-8 для русской локализации. В редакторе kwrite я обычно настраиваю cp1251 по умолчанию, некоторые автоматом 1251 схватывают, но 866 ни одна падла без пинка не понимает.
Скорее это ваш эмуль требует 866-ю, а нету и какую либу ставить х.з. ))
- - - Добавлено - - -
Линь не любит распаковывать русские буквы из названий файлов в архивах, он тока 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
где здесь 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=
Скорее код 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
С LANG=en_GB.UTF-8 mono --debug ZXMAK2.exe запускается а с LANG=ru_RU.UTF-8 mono --debug ZXMAK2.exe - висит без ромов ))
- - - Добавлено - - -
LANG=C mono --debug ZXMAK2.exe - запускается
Хм... внезапно стало
- - - Добавлено - - -Код:$ 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 рядом с эмулятором, по умолчанию там все закоменчено и по дефолту. Потом можно скопировать этот конфиг в систему, чтобы он для всех приложений работал
Блин по ходу пульса отвалилась нафиг. Странно...
если у вас OpenAL не хочет нормально работать с драйвером по умолчанию, попробуйте задать ей другой драйвер. Например alsa.Это можно указать в alsoft.conf
Перезагрузил, LANG=C mono --debug ZXMAK2.exe пока работает нормально и со звуком, при старте выдаёт в окне сообщение об ошибке, но работает.
Вложение 81626
Мыши не хватает ))
это нормально для линукс пока нет OpenGL рендерера, поэтому используется от DirectX, который из-за недоступности падает с ошибкой и приводит к переключению в режим отрисовки на форме средствами WinForms. Это не очень эффективно и может иногда приводить к остановке обновления изображения, но пока как есть. С мышью и джойстиком аналогичная ситуация.
- - - Добавлено - - -
Для DirectSound устанавливается режим DSSCL_PRIORITY, далее указанная частота дискретизации прописывается в формат используемый для SoundBuffer.
В Windows можно и OpenAL использовать, только нужно чтобы в системе или в папке с эмулятором был доступен openal32.dll. Если эмулятор запущен на 64-битной системе, то openal32.dll должен быть 64 битный. Если на 32-битной системе, то 32-битный. Если надо, могу выложить эти файлы. Правда сейчас эмулятор автоматически не выбирает соответствующий файл в зависимости от архитектуры и нужно подложить правильный вручную. Но можно приделать, чтобы автоматически грузил из соответствующей папки.
Я думаю, что это не работает начиная с Висты, т.к. 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"> заменить вот этот кусок:
на такой (его можно просто скопировать из секции <container name="linux">):Код:<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>
открываете блокнотом файл unity.config и прописываете желаемый sampleRate в вышеуказанной секции IHostSound, главное не перепутать - их там несколько в разных контейнерах, для windows нужно смотреть контейнер "win32".Код:<register type="IHostSound" mapTo="HostSound_OAL">
<constructor>
<param name="sampleRate" value="48000" />
<param name="bufferCount" value="4" />
</constructor>
<lifetime type="transient" />
</register>
Готового для WASAPI нет. А всякие прослойки типа OpenAL в нативных системах я не люблю. Они, на мой взгляд, всегда чем-то хуже. Или тормознее, или урезанные по возможностям относительно нативных систем.
- - - Добавлено - - -
Прописал. Разумеется, ничего не меняется.
Так как на Vista и выше поменять битрейт буфера микширования системы можно только в эксклюзивном режиме владения звуковухой.
Либо же, если пользователь поменяет это сам в настройках виндовс.
а теперь попробуй вот этот тызыкс
происходит с ним какая-то магия :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.
Грузится в Spectaculator, SpecEmu, ZXSpin, Fuse, Спектрамине, с включенным Flash Load (в Спектрамине он включен всегда с быстрой загрузкой) . Видимо, оцифровка в TZX некорректная, параметры турбо блока не соответствуют реальным (иначе зачем его надо было определять как турбо).
- - - Добавлено - - -
У Орели тайминги экрана как у фирменного Спектрума 48, но без задержек ULA.
Да, в нём турбо-блок идет с длительностями импульсов стандартного блока:
Я попробовал подставить длительности как в релизе ERBE и он стал грузиться:Код:.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
Но образ похоже левый, т.к. в названии релиз IBSA, а в заставке пишет 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
В общем если какой-то эмулятор загружает этот TZX, то это баг эмулятора. Он не должен грузиться.
Вот исправленный вариант с пропатченными длительностями импульсов в турбо-блоке:
упаковано 7-zip 24.08 как zip/9-ultra/PPMd
древний Total Commander у меня справляется
...хм, а проводник почему-то нет
у меня в specemu не загрузился, версия другая видать
переиздатель переиздал переиздателя, в принципе может быть и так
и/или тупо первый program кто-то забыл, оцифровщик или эта ibsa
это-то понятно, раз только с ускорением грузится
непонятно, почему глюки - разные
от совсем пустой заставки до угадывающейся надписи
и почему в spin с edge load тоже работает
Это баг - эмуляторов - неправильно анализируется код загрузчика и данные пишутся напрямую в память и процессор направляется по ветке правильной загрузки, хотя при заданной длительности импульсов эмулятор должен был направить процессор по ветке обработки ошибки.
- - - Добавлено - - -
эмулятор на каждом кадре проверяет на каком дисплее отображается окно, если дисплей поменялся, то он пересоздает контекст, чтобы синхронизироваться от нового дисплея. Это происходит на лету прямо во время перетаскивания окна с одного дисплея на другой.
- - - Добавлено - - -
помню что решал этот вопрос (когда окно еще не полностью перетащено и часть его отображается на одном дисплее, а часть на другом) и тестил, но какое условие используется уже не помню, помоему если большая часть окна попала на новый дисплей, но может быть и когда окно будет полностью перемещено, нужно будет посмотреть.
Странно. Может на старом DirectX так и можно было сделать, но начиная с DXGI в описаниях четко сказано, что если окно открыто на конкретном дисплее, то цепочка буферов и ее обновление привязывается именно к тому дисплею, на котором открыто окно. Иными словами, без закрытия и открытия окна заново на новом дисплее, и создание новых привязанных к этому окну буферов, синхронизироваться под другой дисплей не получится.
Но я это пока не проверял.