User Tag List

Страница 7 из 14 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя
Показано с 61 по 70 из 131

Тема: Баг формата SZX

  1. #61

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    В смысле зависит от префикса? Зачем что-то предсказывать?
    Если ты выбрал любой префикс, то все, что дальше по любому зависит от этого префикса, не важно, сколько раз он повторится, и останавливать выполнение, пока команда не закончится, нельзя.
    Если нельзя, тогда эмулятор должен зависать в мёртвом бесконечном цикле, если память заполнена префиксами.
    Тут одно из двух - либо можно и тогда ничего зависать не будет, либо нельзя и прийдется зависать по дизайну.

    Понятно, что зависание программы это однозначно неправильное поведение.
    Поэтому поведение "останавливать выполнение, пока команда не закончится, нельзя" - это однозначный баг эмулятора.

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

    Далеко не факт, что если спектакулятор прочитал из памяти по адресу PC префикс, то после сохранения/загрузки снэпшота, при выполении M1 цикла именно этот префикс по этому адресу и прочитается. Вполне может произойти переключение страниц памяти, например в ПЗУ TRDOS или в гейт другого устройства. И тогда так называемый "инвалидный префикс" внезапно станет далеко не инвалидным, а самым нормальным, но будет уже поздно, т.к. в снэпшоте информация о текущем режиме префикса не сохранена и процессор выполнит некорректную инструкцию, т.к. режим префикса в снэпшоте не был сохранен.
    Последний раз редактировалось ZXMAK; 14.11.2024 в 13:11.
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  2. #61
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #62

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,392
    Спасибо Благодарностей отдано 
    1,701
    Спасибо Благодарностей получено 
    2,218
    Поблагодарили
    872 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Если нельзя, тогда эмулятор должен зависать в мёртвом бесконечном цикле, если память заполнена префиксами.
    Да не бывает всей памяти заполненной префиксами. Потому что если она заполнена, то такой снапшот сохранять не надо, он не будет работать, и никому не нужен.
    А эмулятор может проверить, если друг за другом идет 100500 префиксов, то все, команду можно прерывать, злобный буратино запорол себе программу.

    Этот пользователь поблагодарил Titus за это полезное сообщение:

    Reobne(16.11.2024)

  4. #63

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Цитата Сообщение от Titus Посмотреть сообщение
    А эмулятор может проверить, если друг за другом идет 100500 префиксов, то все, команду можно прерывать, злобный буратино запорол себе программу.
    это некорректное поведение, потому что пользователь может в это время отлаживать по тактам свою программу или взаимодействие с устройством, например точную отрисовку на экране, а эмулятор положит на это болт и принудительно выполнит 100500 циклов, после чего состояние процессора уже станет бесполезным...
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  5. #64

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,866
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    310
    Поблагодарили
    234 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Если нельзя, тогда эмулятор должен зависать в мёртвом бесконечном цикле, если память заполнена префиксами.
    Тут одно из двух - либо можно и тогда ничего зависать не будет, либо нельзя и прийдется зависать по дизайну.

    Понятно, что зависание программы это однозначно неправильное поведение.
    Поэтому поведение "останавливать выполнение, пока команда не закончится, нельзя" - это однозначный баг эмулятора.

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

    Далеко не факт, что если спектакулятор прочитал из памяти по адресу PC префикс, то после сохранения/загрузки снэпшота, при выполении M1 цикла именно этот префикс по этому адресу и прочитается. Вполне может произойти переключение страниц памяти, например в ПЗУ TRDOS или в гейт другого устройства. И тогда так называемый "инвалидный префикс" внезапно станет далеко не инвалидным, а самым нормальным, но будет уже поздно, т.к. в снэпшоте информация о текущем режиме префикса не сохранена и процессор выполнит некорректную инструкцию, т.к. режим префикса в снэпшоте не был сохранен.
    Короче - проц знает что он выполняет и когда? значит это знание проца надо перенести кудато во флаги. хоть в AF -там есть бит свободный
    сам по себе СНАПШОТ является извращением работы системы, значит заботится о правильном выполнении должен автор формата.
    Вот и заботься.
    С уважением,
    Jerri / Red Triangle.

  6. #65

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,392
    Спасибо Благодарностей отдано 
    1,701
    Спасибо Благодарностей получено 
    2,218
    Поблагодарили
    872 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    Короче - проц знает что он выполняет и когда? значит это знание проца надо перенести кудато во флаги. хоть в AF -там есть бит свободный
    Нельзя переносить в AF, и битов там свободных нет.
    Конечно, в снапшоте все можно сохранять и восстанавливать, это не извращение.
    Извращение, если при этом портится стек или что-то еще.

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

  7. #66

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,866
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    310
    Поблагодарили
    234 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Нельзя переносить в AF, и битов там свободных нет.
    Конечно, в снапшоте все можно сохранять и восстанавливать, это не извращение.
    Извращение, если при этом портится стек или что-то еще.
    НУ в данном случае как раз и происходит извращение

    inc IX >> inc hl

    потому что прерывание приходит между #DD и #23
    и эмулятор забывает что работает с префиксом

    Кстати, ввиду того, что может в будущем появиться потактовый основанный на реверсе эмулятор Z80, в нем будет больше состояний, которые нужно сохранять, чем сейчас. Поэтому придется изобретать новый формат снапшота.
    Ну как тут пишет ZXMAK вот оно будущее уже пришло.
    С уважением,
    Jerri / Red Triangle.

  8. #67

    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,966
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    314
    Поблагодарили
    237 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    вот это условие проверить проблематично. Как узнать в новом M1 операция зависит от префикса или нет?
    да как угодно, хоть через таблицу опкод проверить

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Для этого нужно выполнить цикл, чтобы процессор полноценно сделал выборку опкода, тогда станет понятно зависит или нет.
    почему "процессор"? процедура для проверки отдельная

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Но когда новый цикл M1 будет выполнен,
    нафига? холостую выборку просто сделай

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Грубо говоря проблема в том, что читать память для проверки что будет выполнять процессор в следующем цикле - это ошибочный подход, т.к. предсказать какой опкод будет выбран нереально. Можно только сделать предположение, что опкод прочитается из текущей страницы памяти, но это далеко не факт, т.к. во время выборки опкода какое-то эмулируемое устройсво может переключить страницу памяти или отключить память и само выдать опкод на шину данных во время выборки опкода.
    у тебя, блин, ЭМУЛЯТОР! с ним всё предсказуемо и реально

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    И даже если удалось правильно предсказать, какой прочитается опкод в следующем M1 цикле, пользователь после загрузки снэпшота может поменять память, сделав какой-то poke или загрузив патч для кода и тогда окажется что опкод который прогнозировался до сохранения опкода окажется неправильным и это приведет к неправильной интерпретации "некорретности" префикса.
    ну и ССЗБ такой кулхацкер, эмуль-то при чём? шаловливыми ручонками лезть в принципе небезопасно, понимать надо
    Прихожу без разрешения, сею смерть и разрушение...

  9. #68

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    Короче - проц знает что он выполняет и когда? значит это знание проца надо перенести кудато во флаги. хоть в AF -там есть бит свободный
    процессор-то знает, у него для этого флаги есть. Но в снэпшоте нет полей куда это состояние процессора можно сохранить, поэтому информация о состоянии этих флагов теряется.

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

    Цитата Сообщение от jerri Посмотреть сообщение
    и эмулятор забывает что работает с префиксом
    не эмулятор забывает, а снэпшот не сохраняет это состояние. В нем не предусмотрено полей для сохранения этих состояний.

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    да как угодно, хоть через таблицу опкод проверить
    проверить код опкода на префикс не проблема. Проблема спрогнозировать какой опкод прочитается на следующем цикле, не выполняя этот цикл.

    - - - Добавлено - - -

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

    Например, ставим PC процессора на адрес перед входом в гейт TRDOS, в отладчике видим что читается один байт, выполняем шаг - прочитался совсем другой байт, т.к. при выполнении цикла M1 подключилась банка ПЗУ TRDOS, в которой байт отличается от того что в банке ПЗУ ROM48.
    Последний раз редактировалось ZXMAK; 14.11.2024 в 16:46.
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  10. #69

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,866
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    310
    Поблагодарили
    234 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    процессор-то знает, у него для этого флаги есть. Но в снэпшоте нет полей куда это состояние процессора можно сохранить, поэтому информация о состоянии этих флагов теряется.
    вот ты носки жуешь уже 7 страницу.
    дополни/сделай версию 2

    не эмулятор забывает, а снэпшот не сохраняет это состояние. В нем не предусмотрено полей для сохранения этих состояний.
    Новые проблемы требуют современных решений.
    С уважением,
    Jerri / Red Triangle.

  11. #70

    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,966
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    314
    Поблагодарили
    237 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    проверить код опкода на префикс не проблема. Проблема спрогнозировать какой опкод прочитается на следующем цикле, не выполняя этот цикл.
    в каком "следующем"? ты ТЕКУЩИЙ проверяешь ПОСЛЕ префикса!

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

    - - - Добавлено - - -

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

Страница 7 из 14 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Баг в W1793 (1818ВГ93).
    от xolod в разделе Клоны на ПЛИС, МК и БМК
    Ответов: 18
    Последнее: 19.03.2019, 14:18
  2. Баг в depacker от hrust1.3?
    от moroz1999 в разделе Программирование
    Ответов: 65
    Последнее: 17.04.2014, 10:39
  3. [Atari]баг игры NINJA?
    от denpopov в разделе Atari
    Ответов: 13
    Последнее: 16.03.2014, 07:20
  4. BUG in SZX snapshots ???
    от VELESOFT в разделе Эмуляторы
    Ответов: 1
    Последнее: 12.09.2009, 13:28

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •