Pyk, а можно объяснить смысл этого vsync? Вот закончил ВГ75 кадр и что дальше?
Вид для печати
Pyk, а можно объяснить смысл этого vsync? Вот закончил ВГ75 кадр и что дальше?
uart, ВГ75 тут ни при чем, это имеет отношение к обновлению экрана на PC. Позволяет избежать tearing (как это по-русски?) и избыточных обновлений экрана.
А для gigascreen-программ, работающих на частоте, совпадающей с частотой монитора ПК, позволяет увидеть gigascreen-эффект (хотя и нестабильный из-за неточного совпадения частоты - см., например, заставку Lines от vinxru: если кадровая частота монитора 60 Гц, то эффект будет заметен).
Ну и внутренняя продолжительность фрейма эмуляции совпадает также с периодом обновления экрана. А ВГ75 работает асинхронно.
Pyk, вот это и не понятно. В играх, которые сами генерят картинку, 24P в телевизоре и в подобном - понятно. Либо генератор контента подстраивается под возможности изображения, либо наоборот.
А в эмуляторе что? ВГ75 даёт 50 кадров, на мониторе 60.
Или это просто настройка OpenGL и эмулятор ничего больше и не делает?
uart, постараюсь объяснить.
На платформах, которые не содержат ВГ75 и не имеют программного опроса КСИ, экран отрисовывается упрощенно, без привязки к реальной частоте кадров эмулируемого компьютера. В этом случае эмулятор работает как генератор контента - тут должно быть понятно.
Этот же механизм был оставлен и для ВГ75. В этом случае контент генерится дискретно, отдельными кадрами ВГ75, но тем не менее смысл некоторый в таком отображении есть: если частота монитора ПК и частота ВГ75 совпадут (реально это может быть 50 или 60 Гц), то это автоматически даст более плавную картинку и эффект gigascreen. И другое соображение: просто отрисовываем каждый кадр на мониторе ПК - чаще нет смысла, а реже приведет к более "дерганому" изображению... Более того, без vsync, чтобы увидеть полноценный gigascreen, частота должна быть как минимум в 2 раза больше частоты монитора.
А у тебя как сделано?
Pyk, да я как то и не задумывался об этом. Просто как ВГ75 заканчивает кадр вызываю вывод, в конце вывода вызывается glFlush, который по идее должен отработать во время смены кадров. Без ВГ75 тоже самое, но вызывается 50 раз в секунду.
Наверное стоит отвязаться от константы и посадить на callback от синхронизации монитора, хуже не будет.
Да и с подергиваниями в lines наверное можно побороться, хотя у меня и TV с реальным Апогеем дергается :)
Некоторым (например, мне) важен режим, когда кадровая эмулятора полностью синхронна с кадровой моника. И пусть при этом звук будет чуть быстрее или медленнее.
Но это, разумеется, актуально при эмуляции машинок, где софт активно использует one-frame эффекты. Например, Спектрум, или игровые консоли.
Что-то затишье... Для тех, кто пропустил: тестируем Qt-версию эмулятора:
http://zx-pk.ru/threads/27488-emu80-...l=1#post961498
У всех все работает? Проблем нет? ;)
вроде ошибок не заметно, но если какие-то найду - сообщу обязательно.
заметил в эмуляторе "emu" от b2m ошибку в игре descent для радио 86 - не отображаются предметы замедляющие экран.
в emu80 работает как надо.
нашёл кое-что.
1 - игрушка FORMULA.RK - при запуске экран искажается свернувшись в узкую полосу.
2 - игра GLASS1.GAM - игра запускается, могу двигать фигуры влево и вправо, но эмулятор отказывается реагировать на клавиши F1, F2 (поворот фигуры).
обе игры для радио 86.
ZEman, спасибо за тестирование!
GLASS1.GAM - увы, не смог смоделировать ситуацию, фигуры вращаются и влево, и вправо
FORMULA.RK - а вот с этим все сложнее. Во-первых, эта игра для "Партнера", а не для РК. Но и на Партнере она зависает во время игры - посмотрю, видимо какие-то проблемы с эмуляцией ВГ75.
насчёт игры GLASS1.GAM - я уже понял, это оказывается из-за клавиатуры.
у меня клавиатура Asus cerberus, почему-то в некоторых играх или программах она блокирует функциональные клавиши F1 - F12 и что с этим делать я так и не понял.
на другой клавиатуре фигуры вертятся.
- - - Добавлено - - -
ещё 2 игры загадки.
1- marsiane - загружается, видно текст, просит нажать Y или N и всё висит.
2- press - смутила титульная картинка, так и должно быть сдвинуто ?
ZEman, PRESS - опять-таки для Партнера.
MARSIANE - не работает и в других эмуляторах, возможно, поврежденный файл? Впервые вижу эту игру, откуда он вообще?
скачивал откуда-то, не помню точно.
ещё 4 игрушки которые выдают ошибки в эмуляторе:
1- 2048 - не запускается. работает в emu от b2m
2- aliaz1 - не запускается, возможно для другого типа компьютера.
3- attack - запускается и работает, но экран сдвинут вправо.
4 - flower - эмулятор не запускает игру, экран искажается. работает в emu от b2m
Aliaz1 точно для Партнера, с остальными завтра попробую разобраться...
2048 - возьми исправленную версию от автора здесь:
http://zx-pk.ru/threads/10161-radio-...l=1#post695856
(первоначальная версия не учитывала возможности наличия в РК контроллера дисковода)
FLOWER - это какая-то неудачная попытка адаптации программы для Микроши на РК. Очень сомневаюсь, что она будет работать на реале, хотя и работает в некоторых эмуляторах. У кого есть возможность - потестируйте.
Оказалось проще переделать обратно для Микроши:
Вложение 65182
ATTACK - странная какая-то игра, думаю, что и на реале она точно так же смещена. Не понял, чего хотели добиться авторы. А может быть, это просто результат некой "адаптации"...
а что насчёт FORMULA.RK и marsiane.rk ?
было бы хорошо еслиб сюда ещё b2m заглянул.
вот такая есть странность:
игра запущенна в режиме микроши на обоих эмуляторах.
- - - Добавлено - - -
есть пара пожеланий к эмулятору.
добавьте пожалуйста автоматическое скрывание указателя мышки (стрелочка) с экрана.
и если можно добавьте кнопку звук на меню, чтобы можно было отключать звук.
b2m, да пра ваш эмулятор то я знаю :)
то были пожелания к emu80.
интересно ваше мнение по поводу этих вложений.
ZEman, FORMULA - похоже, что проблема именно в эмуляторе. Не разбирался еще, но надеюсь, что в следующих версиях исправлю.
MARSIANE - не смотрел еще толком.
Кнопка Mute и автоскрытие указателя мыши есть в планах, сделаю рано или поздно (скорее рано, чем поздно ;).
Разместил исходники Qt-версии на github
Работа под Windows и Linux протестирована, желающие могут попробовать собрать и под другие ОС ;)
ZEman, вы специально троллите разработчика(-ов) эмулятора(-ов) битыми игрушками? :v2_dizzy_facepalm:
---
marsiane.rk - возможно выдрана из пакета O1.GAM (ссылка)
В составе пакета она работает.
Скрытый текст
Александр Дëмин тоже "шутник" - как играть в игрушку "ПРОГРАММАТОР ПЗУ" в онлайн-эмуляторе ? :v2_crazy:
Ну, и стоит упомянуть, что в каталоге с его эмулятором много полубитых игрушек и/или игрушек не с Радио-86РК (много с Партнёра)[свернуть]
Эх, занялся бы кто-нибудь созданием единого репозитория всех известных игр (или не только игр) для РК и клонов...
А то такой зоопарк уже развелся... Причем самое неприятное, что многие даже не работают на реале: только в некоторых эмуляторах :(
Сам бы взялся, но времени на это жалко.
- - - Добавлено - - -
Вопрос про "Ъ"? Ну да, знакогенератор Микроши слегка отличается от знакогенератора РК, в том числе и символом с кодом 7F. На РК это почти полностью закрашенный прямоугольник, а на Микроше - твердый знак.
- - - Добавлено - - -
В помощь тем, кто будет собирать из исходников Qt-версию под Linux: мне в Debian 9 пришлось дополнительно установить следующие пакеты:
- qtbase5-dev
- qtmultimedia5-dev
- libqt5multimedia5-plugins (если не установить, не будет звука)
- qt5-default (как обойтись без него, пока не разбирался)
Если не сложно, напишите, какие пакеты понадобилось установить в используемом вами дистрибутиве.
:v2_dizzy_botan:
Вот, оттуда (kas17.zip прямая ссылка) он взял marsiane.rk . Но...
1) кроме этой, все остальные программы там для Микроши...
2) имеется интересный файл zagr_rk86.rkm
Это загружаемый монитор 86РК для Микроши.
1. загружаем в Микрошу zagr_rk86
2. запускаем G5800
3. загружаем marsiane
4. запускаем G100
:v2_dizzy_punk: Резюме: файл не битый, но не для Радио-86РК ! ( гемплей оценивать не буду )
Попробовал компилировать под Windows в Qt Creator 4.6.0.
Конфигурация Desktop Qt 5.6.3 MinGW 32bit.
Собралось без ошибок и варнингов (и это отлично).
При запуске пустое окно со списком платформ -- тут было бы здорово писать сообщение о том что нужно положить/настроить emu80.conf, также стоит это написать в README.md в исходниках.
Затем, после того как я положил emu80.conf и запустил конфигурацию rk86 -- видимо программа не нашла папки rk86, программа работает в фоне, ошибок не показывает -- тут надо показать окно-алерт и завершиться или вернуться в окно выбора платформы.
При выборе команды Debug -- segmentation fault в DebugWindow::draw() строка 257.
Эта проблема решилась тем что подложил файл dbgfont.bin. Но тут нужно проверять что шрифт не загрузился.
Ну и отладчик лучше было переделать в графический конечно, выделить в отдельные окна просмотр памяти и всё остальное.
- - - Updated - - -
Несколько подозрительных мест в коде:
1. Debugger.cpp:130
Похоже на то что перепутаны местами значение и количество байт.Код:memset(&m_states, sizeof(m_states), 1);
2. Debugger.cpp:1035
Странно что m_inputCurPos сначала вычисляется в зависимости от условия, а потом обнуляется.Код:if (useInitialNumber) {
m_inputCurPos = nDigits - 1;
m_inputCurValue = int2Hex(initialNumber, nDigits);
} else {
m_inputCurPos = 0;
m_inputCurValue = "";
}
m_inputCurPos = 0;
3. ConfigReader.cpp
В функции ConfigReader::createObject() два раза одна проверка:
4. CpuZ80.cpp:377Код:else if (typeName == "Ut88MemPageSelector")
obj = new Ut88MemPageSelector();
IXY ^ IXY -- странно что одно и то же значение, по идее это даёт 0.Код:cbits = (IXY ^ IXY ^ sum) >> 8;
5. CpuZ80.cpp:841
Что-то тут не так, AF это af[af_sel], то есть первая и третья строчки делают присваивание в себя.Код:case 0x08: /* EX AF,AF' */
af[af_sel] = AF;
af_sel = 1 - af_sel;
AF = af[af_sel];
break;
И вот тут ниже подобный код, думаю та же проблема:
6. Eureka.cpp:70Код:case 0xD9: /* EXX */
regs[regs_sel].bc = BC;
regs[regs_sel].de = DE;
regs[regs_sel].hl = HL;
regs_sel = 1 - regs_sel;
BC = regs[regs_sel].bc;
DE = regs[regs_sel].de;
HL = regs[regs_sel].hl;
break;
Логический AND между bool и константой -- непонятно что это значит.Код:m_useRomDisk = value && 0x80;
nzeemin, спасибо за внимание к эмулятору!
Какой компилятор? clang? У меня gcc6 выдавал кажется один варнинг где-то - не успел избавиться...
Ошибка, хотя и не очень критичная. Должно быть memset(&m_states, 0, sizeof(m_states));
Пробовал разные варианты, забыл убрать лишнюю строку.
fixed
Так в оригинале у Frank D. Cringle (на его коде основан исходник), надо разбираться.
Не, не, см. 2-ю строчку, индекс-то меняется!
Аналогично
Баг, но по стечению обстоятельств не проявивший себя. Довольно часто такие ошибки делаю - пишу логические операции вместо битовых и наоборот :(
Еще раз спасибо за тестирование, исправленные исходники в репозитории (кроме вопроса насчет IXY).
- - - Добавлено - - -
Согласен, сделаю.
Там процедура установки описана, которая сама все положит куда нужно...
Pyk, компилятор -- g++ из MinGW.
Вообще было бы здорово и MSVC поддерживать, VS2013 или VS2015.
Ну давай раскроем шаблон AF и вот так запишем:Цитата:
Не, не, см. 2-ю строчку, индекс-то меняется!
Получается что меняется только af_sel, может оно и правильно, но зачем тогда лишние присваивания.Код:case 0x08: /* EX AF,AF' */
af[af_sel] = af[af_sel];
af_sel = 1 - af_sel;
af[af_sel] = af[af_sel];
break;
- - - Updated - - -
7. Ut88.cpp:65, Micro80.cpp:69
memset два раза, странный размер m_bufSize, а выделяется до этого 512 * 512, совсем не факт что эти две величины равны.
8. CpuZ80.cpp:281
Тут что-то странное, два оператора логического NOT дают тип bool, с которым делают побитовую операцию -- в общем, тут надо копать.Код:cbshflg1:
AF = (AF & ~0xff) | (temp & 0xa8) |
(((temp & 0xff) == 0) << 6) |
parity(temp) | !!cbits;
Так MSVC поддерживается, хотя я нигде явно это не афишировал. По крайней мере, я периодически собираю в MSVC 2015 x32 и x64. Для того, чтобы официально объявить о поддержке, не хватает некоторых мелочей: есть проблемы с отображением статусной строки в последних версиях (что-то с интерпретацией unicode-констант в исходниках) и нечитаемые варнинги при сборке из-за русской локали установленного у меня MSVC. Думаю, что и с тем, и с другим вполне можно разобраться, но опять-таки - руки не дошли...
Так в данном контексте AF вроде бы переменная и ее нельзя так раскрыть!
Да, похоже, что лишняя память выделяется, а в memset размер правильный. Завтра внимательно проверю.
Опять-таки не мой код, сильно подозреваю, что !!cbits эквивалентно чему-то вроде (cbsts == 0 ? 0 : 1);
> Так MSVC поддерживается
Тогда нужно файл проекта положить в исходники.
Я попробовал сделать проект VS2013 со сборкой через nmake, были проблемы с типами данных, такими как int32_t.
В целом мои рекомендации:
1. Использовать бьютифаер кода, который по заданным правилам форматирует код автоматически. Применять сразу после изменений. Я использую AStyle, ещё есть clang-format.
2. Настроить CI для автоматической сборки всех вариантов по коммиту, под всеми системами. На это нужно несколько часов, окупается это время быстро.
3. Сделать тестовый стенд -- консольное приложение на основе той же самой кодовой базы, выполняющее загрузку и запуск наиболее часто используемых программ, с контролем совпадения "скриншотов" в контрольных точках. Прогонять их после существенных изменений. Это даёт проверку на то что нет регрессии -- что не упало то что раньше уже работало.
4. Найти программные тесты (в частности, процессора), включить их в набор тестового стенда.
nzeemin, я имел в виду, что успешно собирается из Qt Creator и использованием компилятора командной строки MSVC. Собирать из IDE Visual Studio я никогда не пробовал. Согласен, что неплохо бы поэкспериментировать с этим - для многих будет актуально... Кстати, избавился от имевшейся проблемы с MSVC - см. последний коммит. Сейчас все работает после сборки с помощью MSVC, хотя при сборке и выдается большое количество варнингов.
За рекомендации спасибо: настройка CI есть в ближайших планах, остальное по возможности.
Думаю еще, что делать с установкой в linux-системах для тех, кто не хочет либо не может заниматься сборкой. Надо бы наверное сделать deb/rpm-пакеты. Как быть только с библиотеками Qt? Пакеты с актуальной версией Qt есть только в репозиториях самых последних версияй дистрибутивов. Наверное статически слинковать? Нет опыта в подобных вещах?
Под Qt Creator в конфигурации Desktop Qt 5.6.3 MSVC2013 32bit -- НЕ собирается, ошибки на типы, такие как uint32_t.
Под Qt Creator в конфигурации Desktop Qt 5.6.3 MSVC2015 32bit -- собралось, 87 варнингов, работает.
- - - Updated - - -
В Qt версии команда сохранения скриншота предлагает только .BMP, но Qt позволяет много других форматов, хотя бы .PNG стоит добавить.
- - - Updated - - -
Нет.
nzeemin, да, все так. От варнингов MSVC 2015 постараюсь со временем избавиться, не уверен, есть ли смысл добиваться сборки с помощью MSVC 2013?
Кстати, MSCV 2013 и 2015 одновременно установлены? Qt без проблем их различает? У меня не получилось так просто завести одновременно MSVC 2015 и 2010: Qt не видит установленный MSVC 2010 (Express).
Насчет форматов сохранения в курсе, но отложил пока этот вопрос, поскольку требуется небольшой рефакторинг в SDL-части, чтобы не городить условную компиляцию... В общем, в ближайших планах...
- - - Добавлено - - -
P.S. Да, в конфигурации MSVC2015 64bit также собирается и работает.
Под macOS в Qt Creator 4.6.0 собралось, конфигурация Desktop Qt 5.9.4 clang 64bit, 3 warnings.
Особенность в том что конфиг и прочее нужно положить в "папку" /Users/nzeemin/MyProjects/emu80v4/src/Emu80qt.app/Contents/MacOS, то есть по сути внутрь "приложения".
Радио-86РК запустился, отладчик тоже, кстати это очень забавно видеть такой терминал на маке.
- - - Updated - - -
Скриншот: https://yadi.sk/i/pphicPgx3VhJCzКод:/Users/nzeemin/MyProjects/emu80v4/src/Debugger.cpp:24: In file included from Debugger.cpp:24:
/Users/nzeemin/MyProjects/emu80v4/src/Debugger.h:99: warning: 'init' overrides a member function but is not marked 'override' [-Winconsistent-missing-override]
void init() {EmuWindow::init();};
^
/Users/nzeemin/MyProjects/emu80v4/src/EmuWindow.h:68: overridden virtual function is here
void init() override;
^
/Users/nzeemin/MyProjects/emu80v4/src/Platform.cpp:34: In file included from Platform.cpp:34:
/Users/nzeemin/MyProjects/emu80v4/src/Debugger.h:99: warning: 'init' overrides a member function but is not marked 'override' [-Winconsistent-missing-override]
void init() {EmuWindow::init();};
^
/Users/nzeemin/MyProjects/emu80v4/src/EmuWindow.h:68: overridden virtual function is here
void init() override;
^
/Users/nzeemin/MyProjects/emu80v4/src/qt/qtPaintWidget.cpp:180: warning: unused parameter 'event' [-Wunused-parameter]
void PaintWidget::mouseMoveEvent(QMouseEvent *event)
^
nzeemin, спасибо за хорошие новости.
Куда на маке обычно нужно класть конфиг и прочее?
На unix-like это обычно usr/share или usr/local/share, но насчет MacOS совершенно не уверен...
Кстати, если из "прочего" убрать папку "_settings", то текущие настройки должны сохраняться в $HOME/.config/Emu80, при этом директория установки может быть закрыта для записи.
А насчет отладчика - сам не знаю, почему мне захотелось сделать такой old-school-отладчик ;) Может быть, когда-нибудь переделаю... Ну или как минимум управление мышкой добавлю...
Pyk, я по маку мало что знаю, почти не пишу там, проще нагуглить.
Про отладчик -- по опыту скажу что хороший отладчик это очень важно, в свой я вложил очень много, и это окупается.
И ещё один вариант с отладчиком -- сделать стаб для gdb, и отлаживать снаружи через gdb или любой другой отладчик, работающий по этому протоколу.
больше месяца затишье, продолжение следует ?
спасибо за информацию.
просто видел коммиты в которых написано что добавлен scanline, скрытие мыши и громкости - думал что скоро новый билд будет.