Вход

Просмотр полной версии : Загружать SNA просто, но есть нюанс!



Lethargeek
29.06.2021, 17:00
Казалось бы, что может быть проще загрузки файла sna в эмулятор? Там ведь только память да регистры, да цвет бордюра (ну, еще IM+IFF и конфигурация страниц для 128k). Считывай, устанавливай модель, записывай данные, запускай. Но не всё так просто - в sna (а также в первой версии z80) не хранится кол-во тактов с начала кадра. Так что варианты на выбор:

1) Считать, что запрос прерывания закончился до выполнения текущей команды. После загрузки снапа эмулировать остаток кадра (весь или частично, но проще весь) до следующего запроса.

2) Считать, что снап был записан прямо в начале кадра (что логично, ведь эмуляция покадрово происходит). Эмулировать запрос прерывания сразу же после выполнения текущей команды (именно после одной команды, а не перед ней, так как до неё мог выполняться префикс или ei).

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

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

А как вы загружаете снапшоты в ваш эмулятор? :v2_dizzy_write:

ZX_NOVOSIB
29.06.2021, 17:41
А как вы загружаете снапшоты в ваш эмулятор?
Я када раньше загружал, то просто два раза мышкой клацал по иконке файла и всё :v2_confu:

Lethargeek
29.06.2021, 19:04
Я када раньше загружал, то просто два раза мышкой клацал по иконке файла и всё
не юродствуй, очевидно же, что вопрос был задан АВТОРАМ эмуляторов и о коде, а не клацании мышой

ZX_NOVOSIB
29.06.2021, 19:54
что поделать, я частенько юродствую

Dexus
30.06.2021, 10:21
Наверное есть смысл иметь оба варианта при загрузке снапа. Хотя оба они не вполне корректные, но один из них точно должен будет более-менее корректно продолжить испонение. Может просто где-то опция - положение инта при загрузке снапа (в начале/в конце). Или грузить по-очереди - со второй попытки точно запустится.

ЗЫ: Самое грустное, что если снап не грузится - непонятно что причина именно в положении инта. Но лично я не припоминаю таких ситуаций.

Lethargeek
30.06.2021, 13:19
Наверное есть смысл иметь оба варианта при загрузке снапа.
сам склоняюсь к этому, но нигде не видел явных вариантов загрузки снапа, разве что в настройках где-то запрятано


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


Может просто где-то опция - положение инта при загрузке снапа (в начале/в конце). Или грузить по-очереди - со второй попытки точно запустится.
запуститься - может и с обеих попыток, и не всегда поймёшь-то сразу, что хрень случилась
а уж потом причины еще туманней, если сохраниться-перезагрузиться еще успел

Titus
30.06.2021, 13:29
А как вы загружаете снапшоты в ваш эмулятор?
Я загружаю, считая, что только что закончился старый кадр, и начнется новый.

Lethargeek
30.06.2021, 13:35
загружаю, считая, что только что закончился старый кадр, и начнется новый.
то есть сразу попытка прерывания происходит?

Dexus
30.06.2021, 13:43
В Xpeccy такты при загрузке снапов остаются теми же что были до загрузки, т.е. можно сказать рандомный вариант, ну или произвольный, т.к. есть возможность дождаться нужного положения между интами, и в дебагере загрузить снап (что может быть даже удобно).


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

Titus
30.06.2021, 13:46
то есть сразу попытка прерывания происходит?
да.

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

vlad-kras
03.12.2021, 16:59
Но поскольку снап может быть записан в любой момент (например, в отладчике) - прерывание может случиться неожиданно для выполняемого кода и привести к неприятным (а то и фатальным) последствиям. Допустим, код читает спрайты стеком при разрешённом прерывании, но при этом с кадром синхронизирован и успевает уложиться в две трети кадра, так что прерывание не может испортить графику. А вот если оно вдруг случится, то в спрайтах появляется мусор. А если вперемежку с графикой спрайтов хранятся и их размеры или координаты, и они будут испорчены, то при выводе такого спрайта и вовсе может произойти что угодно, вплоть до зависания или сброса. Причём сбой можно и не сразу еще заметить.

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

Или это просто теория, что может быть и так.

Spectramine
03.12.2021, 17:05
А что же тогда делать обратной стороне, тому кто записывает снап, то есть пользователю, чтобы не наступить на грабли? Перезагружать сразу после записи и убедиться что работает - но ведь так можно распознать только явные глюки или то, что уже знаешь и намеренно ищешь. Насколько вероятна такая ситуация для игр, есть ли примеры сбоящих игр, можно ли как-то по внешним признакам игры типа мультиколорная узнать нормально она должна грузиться или может вызвать проблемы?

Или это просто теория, что может быть и так.
Использовать более продвинутые снапы - .SZX или хотя бы .Z80 .