А вот это кстати самый правильный вариант
Вид для печати
именно с этого примера и началась эта тема, см. первый пост.
Это невозможно, когда процессор остановлен и юзер отлаживает код и вдруг решил пойти на обед, он хочет сохранить текущее состояние в снэпшоте, а не выполнить N циклов и только потом сохранить состояние.
Можно конечно просто запретить пользователю останавливать выполнение на длинных инструкциях, например занимающих 30 кБ памяти на одну инструкцию, чтобы у него просто не было возможности установить точку останова и остановить процессор в нужный момент. Но это не совсем правильно.
не подходит, не выполняется условие по исходным (а также не является примером "бага формата", а является примером ССЗБ)
:v2_dizzy_wall: ЕЩЕ РАЗ:
- - - Добавлено - - -
и да, что эта тема вообще делает в разделе "ZX Spectrum Software"? даже тут неверно определил :D
повторюсь, это невозможно, т.к. в SZX формате изначально присутствует баг, который допускает сохранение некоррректных снэпшотов. Без добавления новых флагов это никак не решить.
Проблема выше уже описывалась, возможно я недостаточно ясно её раскрыл. Попробую объяснить более понятным языком.
Для случаев с длинными префиксами в SZX предлагается трактовать их как "invalid", и такое префиксное состояние помечать флагом ZXSTZF_EILAST, при этом предполагается, что процессор всегда останавливается на "valid" префиксе.
Проблема возникает, когда эмулятор сохраняет снэпшот для такого "invalid" префикса, предполагая что после загрузки снэпшота выполнится префикс из текущей ячейки памяти и префикс восстановится. Для блокировки прерываний при этом взводится ZXSTZF_EILAST. Казалось бы всё хорошо. Но нет... После загрузки снэпшота и выборке следующей инструкции она может оказаться далеко не префиксом. Например если выборка приводит к триггеру переключающему память, как это происходит в адресном гейте TRDOS.
И баг формата SZX заключается в том, что "invalid" префикс который эмулятор видел на этапе сохранения, оказался вовсе не "invalid" префиксом, а очень даже "valid" префиксом. Однако информация о префиксном состоянии от предыдущего префикса после восстановления снэпшота потеряна, т.к. состояние префиксов в SZX не сохраняется. Поэтому после загрузки снэпшота процессор выполнит не префиксную команду, а команду без префикса, т.е. выполнит некорректный код.
Это и есть совсем правильно)
Процессор не может остановиться посередине, а значит это самое правильное)
Кроме того, сколько тебе встречалось на практике программ, где 30 кб префиксов, и кто-то захотел это отладить? Причем так отладить, что шагать пошагово все эти 30Кб) Думаю, что ни разу)
в таком случае если память забита префиксом снэпшот вообще невозможно сохранить - эмулятор будет просто зависать. Это уже серьезный баг.
Процессору ничего не мешает остановиться после выполнения инструкции префикса, но до начала выполнения префиксной инструкции. Прерывание - да, в таком состоянии процессор не примет, также как и после выполнения EI.
Не зря же в SZX предусмотрен флаг для состояния после выполнения EI и "invalid" (или если более корректно выражаться - многократного префикса). Но, как описано выше, этот флаг не дает возможность всегда корректно сохранить снэпшот, т.к. подразумеват что при наличии многократного префикса состоянием префикса можно пренебречь, что на практике не всегда так...
когда отлаживал multicolor не так уж и редко, может не 30 кБ, но помню были случаи где-то 10-20 кБ, а может и больше 30 кБ. К сожалению уже не помню название демки.
Мы опять переходим к обсуждению, которое было выше)
1. Такой снапшот практически невозможен, только на клонах с ОЗУ вместо ПЗУ.
2. Такой снапшот никому не нужен, т.к. он полностью нерабочий. Это просто повисший компьютер с вечно зацикленным префиксом в памяти.
- - - Добавлено - - -
В смысле остановиться? Процессор неостановим в середине команды. Его можно остановить только ресетом или остановкой тактирования. Как и в середине любой другой команды.
Реакция на любые внешние раздражители в процессе выполнения команды (в том числе и сверхдлинной) у процессора отсутствуют.
- - - Добавлено - - -
Допустим, в мультиколоре у тебя стоит 20кб префиксов. Ну шагнул ты сразу в конец 20кб команды, и что такого? Это единая команда, в процессе нее не может произойти перерывания, нет смысла останавливаться.
Смысла не больше, чем остановиться внутри любой команды типа LD HL,nnnn. Давай и в ней останавливаться после опкода $21.
для эмулятора, где остановка не предусмотрена может и так. Я-же смотрю на это со стороны железа, которое при нажатии кнопки "цикл" запускает серию клоков до появления комбинации сигналов M1 & RD & MREQ. Другого варианта задетектить в железе начало цикла выборки инструкции вроде как нет. А для такой комбинации что префикс #DD, что #00 - одна инструкция.
в одной из демок которую помню была длинная серия префиксов, потом nop и опять префиксы, прерывание срабатывало только если nop приходился на момент прерывания. ну и в таком роде, зачем там были длинные последовательности префиксов я не разбирался, меня интересовало чтобы прерывание приходило на нужном такте.
:v2_dizzy_facepalm::v2_dizzy_facepalm::v2_dizzy_fa cepalm: ты вообще читаешь, что тебе пишут? и даже повторяют неоднократно! ЕЩЕ РАЗ, до полного просветления:
почему вот у меня в эмуле (в котором тоже шаг отладчика - M1 любой, в том числе префиксы) и возможно, и (даже для sna) прекрасно работает?
а теперь, внимание, вопрос: а ЗАЧЕМ твой "эмулятор сохраняет снэпшот для такого "invalid" префикса"?
выдумал сам себе проблему на ровном месте, кто ТЕБЕ в таком случае мешает НЕ сохранять?
а в дебагере, допустим, пометить символом или цветом выделить ЗНАЧИМЫЙ префикс в такие моменты
сразу видно - сохранение заблокировано, для разблокировки нужно сделать шаг (одного достаточно)
еще раз: НЕТУ никакого "бага формата", есть нарушение ТБ и простреленная нога :D