User Tag List

Показано с 1 по 10 из 131

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

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

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

    По умолчанию

    Цитата Сообщение от Spectramine Посмотреть сообщение
    Я так понимаю, #ED и #CB в вашей картине мира это тоже отдельные инструкции.
    вполне - инструкции перевода процессора в режим расширенных опкодов.

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

    Цитата Сообщение от Titus Посмотреть сообщение
    M1 цикл - это машинный цикл в котором выбирается опкод инструкции. Префикс считается частным случаем опкода.
    А конец инструкции (или начало следующий) в процессоре совершенно четко обозначен. В моем реверсе это сигнал RES_MCLK (последний машинный цикл инструкции).
    M1-циклов может быть много, но RES_MCLK всегда один. По нему процессором и определяется, что инструкция закончилась, можно обработать запрос на прерывание или еще что-то в этом роде.
    Вполне логично, что процессор может вырабатывать дополнительные сигналы блокировки прерывания, чтобы исключить прерывание, когда это нежелательно. Но ведь возможность обработать прерывание не означает что процессор закончил выполнение инструкции, иначе прийдется все что находится между DI и EI или весь обработчик NMI/INT прерывания трактовать как одну большую инструкцию.

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

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Я чутка потерялся. А что будет происходить, если сделать длинную цепочку префиксов, и во время её отработки наступит момент прерывания. Когда оно отработает? В середине цепочки, или будет пропущено, и цепочка отработает до конца? Если в середине, то процессор будет помнить какой был последний префикс перед прерыванием, или потеряет?
    выполнение инструкции префикса переводит процессор в префиксный режим, в котором прерывания блокируются пока режим префикса не будет снят. Также как выполнение EI блокирует прерывания на одну следующую инструкцию.

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

    Цитата Сообщение от Reobne Посмотреть сообщение
    Мне кажется, лучше считать, что никакого бага в SZX нет. Что сохранить снапшот можно только в тот момент, с которого легко продолжить выполнение не только в эмуляторе, но и на реале. Для усложнения нужны более веские причины, чем просто "так хочется".
    Дело в том, что если сохранять снэпшот только в тот момент, когда процессор не находится в режиме префикса, то не всегда будет возможность вообще сохранить снэпшот. В случае, когда вся память заполнена префиксом #DD или #FD, процессор перманентно всегда находится в префиксном режиме, не выходя из него. Поэтому это просто приведет к вечному зависанию эмулятора при попытке сохранить снэпшот. Такое поведение неправильное.

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

    Цитата Сообщение от Reobne Посмотреть сообщение
    Сейчас и на реалах можно делать снапшоты, по немаскируемому прерыванию. Есть, правда, глюки, при некоторых SP. Ну и, получается, если всю помять забить префиксом, то тоже не сработает NMI.
    сохранение снэпшотов из обработачика NMI не всегда даёт рабочие снэпшоты, т.к. необратимо портит память и состояние процессора. Методы защиты от снятия снэпшотов с помощью TRDOS MAGIC или другого NMI обработчика на Z80 давно известны и в таких программах после нажатия NMI код программы будет испорчен и программа покажет сообщение о недопустимости выполнения NMI либо просто сбросится или перестанет работать.

    Эмулятор-же или железный отладчик (JTAG) должен обеспечивать отладку полностью прозрачно для отлаживаемой программы, никак не влияя на её состояние.

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

    Цитата Сообщение от Reobne Посмотреть сообщение
    Эмуляторные извращения это весело, можно хоть любой такт сохранять, но во первых: "Зачем?"
    Затем, чтобы во время отладки можно было сохранить текущее состояние программы, пойти погулять, покушать, отдохнуть и на следующий день загрузить его и продолжить отладку с того-же самого состояния.

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

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

  3. #2

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,104
    Спасибо Благодарностей отдано 
    1,347
    Спасибо Благодарностей получено 
    323
    Поблагодарили
    152 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Затем, чтобы во время отладки можно было сохранить текущее состояние программы, пойти погулять, покушать, отдохнуть и на следующий день загрузить его и продолжить отладку с того-же самого состояния.
    Ну, то есть, заходим в отладчик, а там PC указывает, допустим, на "LD (IY+0),L" Нажимаем на шаг вперёд и что мы увидим? PC увеличится на байт или на 3?

  4. #3

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

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Ну, то есть, заходим в отладчик, а там PC указывает, допустим, на "LD (IY+0),L" Нажимаем на шаг вперёд и что мы увидим? PC увеличится на байт или на 3?
    В этом случае отладчик установит точку останова на адрес следующий за "LD (IY+0),L" и запустит выполнение.
    Далее будет зависеть от того - дойдет ли выполнение до указанной точки останова - тогда отладчик остановится и покажет адрес на котором сработала точка останова.
    Если же управление до точки останова не дойдет, процессор так и будет продолжать работать выполняя все инструкции подряд.

    Поэтому однозначно сказать нельзя - будет зависеть от результатов выполнения кода. Также как нельзя сказать - вернет ли CALL или RST управление на следующий адрес или на следующий адрес + N или вообще не вернет управление или вообще не выполнится, потому что сработает прерывание.

    Однако если вы поставите точку останова на адрес PC, то при шаге/запуске отладчик остановит выполнение на адресе PC+1, т.е. будет показывать "LD (HL),L; NOP" и взведенный флаг префикса IY. Вообще конечно правильнее было-бы доработать отладчик чтобы он дизассемблировал память с учетом текущего состояния процессора и тогда он будет показывать все ту-же инструкцию "LD (IY+0),L"
    Последний раз редактировалось ZXMAK; 13.11.2024 в 07:43.
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  5. #4

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

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    В случае, когда вся память заполнена префиксом #DD или #FD, процессор перманентно всегда находится в префиксном режиме, не выходя из него. Поэтому это просто приведет к вечному зависанию эмулятора при попытке сохранить снэпшот. Такое поведение неправильное.
    1. Нельзя всю память заполнить префиксами. Все равно настанет адрес 0000, где находится ПЗУ, а там уже команда.
    2. Если же эмулируется клон, у которого вместо ПЗУ может встать ОЗУ, и тогда действительно можно заполнить всю память префиксами, то... такой снапшот никому не нужен, т.к. он никогда не будет работать на реале) Вся память в префиксах - это вечный зависон и отсутствие программы)

  6. #5

    Регистрация
    07.10.2006
    Сообщений
    1,731
    Спасибо Благодарностей отдано 
    257
    Спасибо Благодарностей получено 
    275
    Поблагодарили
    167 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    1. Нельзя всю память заполнить префиксами. Все равно настанет адрес 0000, где находится ПЗУ, а там уже команда.
    2. Если же эмулируется клон, у которого вместо ПЗУ может встать ОЗУ, и тогда действительно можно заполнить всю память префиксами, то... такой снапшот никому не нужен, т.к. он никогда не будет работать на реале) Вся память в префиксах - это вечный зависон и отсутствие программы)
    На +2А/+3 вместо ПЗУ может встать ОЗУ (чисто для информации).

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

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

  7. #6

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

    По умолчанию

    Цитата Сообщение от Spectramine Посмотреть сообщение
    На +2А/+3 вместо ПЗУ может встать ОЗУ (чисто для информации).

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

    И насчет синтетической ситуации с полностью заполненной индексным префиксом памятью - это не обязательно, даже просто выполнение цепочки индексных префиксов вполне может быть сохранено в SZX - после любого некорректного префикса, т.е. не последнего префикса в цепочке (корректного).
    возникает вопрос, как остановить выполение именно на таком так называемом "корректном" префиксе? Чтобы проверить корректный ли префикс или нет - нужно выполнить цикл, чтобы процессор прочитал ячейку памяти, однако если память заполнена префиксами, то на новом цикле префикс опять взведен и опять нужно проверить "корректный" ли префикс, для чего снова нужно выполнить цикл и так до бесконечности по кругу.

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

  8. #7

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

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Таким образом проверить "корректный" ли префикс невозможно.
    Если это твой эмулятор Z80, то ты можешь проверить все, что угодно.
    Сделай проверку, что если после выборки префикса DD/FD идет снова выборка префикса DD/FD, то помечай, что префикс 'некорректный', как ты его называешь.

  9. #8

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

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Если это твой эмулятор Z80, то ты можешь проверить все, что угодно.
    Сделай проверку, что если после выборки префикса DD/FD идет снова выборка префикса DD/FD, то помечай, что префикс 'некорректный', как ты его называешь.
    Так в том-то и дело, чтобы сделать проверку - нужно выполнить цикл, а после выполнения цикла нужно проверять уже новое состояние, т.е. нужно опять выполнить цикл и так до бесконечности.

    Просто прочитать память - неправильно, т.к. из памяти может прочитаться одно значение, а при выполнении цикла прочитается другое (например если читается инструкция из TRDOS гейта).

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

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

  10. #9

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

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Так в том-то и дело, чтобы сделать проверку - нужно выполнить цикл, а после выполнения цикла нужно проверять уже новое состояние, т.е. нужно опять выполнить цикл и так до бесконечности.

    Просто прочитать память - неправильно, т.к. из памяти может прочитаться одно значение, а при выполнении цикла прочитается другое (например если читается инструкция из TRDOS гейта).
    какой цикл, какую память читать... ну элементарно же, флажок сделай, что в прошлый M1 был DD/FD
    и тогда если в текущий M1 операция от такого префикса не зависит - сохраняться можно в этот момент

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

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

  11. #10

    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,697
    Спасибо Благодарностей отдано 
    305
    Спасибо Благодарностей получено 
    226
    Поблагодарили
    160 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Проблема тут заключается в том, что просто прочитать память нельзя, т.к. при доступе к памяти процессора банка может переключиться и прочитается совсем другое значение, чем при чтения до выполнения цикла. Таким образом проверить "корректный" ли префикс невозможно.
    я потому и спрашиаал, как работает цепочка префиксов, и может ли между ними придти прерывание ну, и непонятно, что значит "нельзя прочитать" эмуль же, реализовать можно что угодно, лишь бы корректное поведение реальной машины но можно и нереальное - например, Spec256
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

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

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

Эту тему просматривают: 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

Ваши права

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