Не совсем ясно, почему вы берёте на себя роль судьи, оценивая, что "верно", а что "неверно". Думаю, было бы более корректно выразить своё несогласие, аргументировав его, например: "Я с вами не согласен, потому что...".
Во-первых, ваше заявление о "неверности" ответа в данном случае ошибочно. То, что вы упоминаете, не противоречит сказанному, а лишь дополняет его.
Во-вторых, ваш аргумент относительно второго пункта не точен. Инструкция NOP не переводит процессор в состояние, которое не может быть сохранено в формате SZX. Префиксы, напротив, действительно могут перевести процессор в такое состояние, так как SZX не сохраняет информацию о текущих префиксных режимах. Именно в этом состоит принципиальная разница между инструкцией NOP и префиксами в данном контексте.
Последний раз редактировалось ZXMAK; 27.11.2024 в 14:31.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Прихожу без разрешения, сею смерть и разрушение...
Так.
R увеличивается только в цикле M1.
Ты сам себе ответил в вопросе) Сколько префиксов или опкодов на столько и увеличится)
- - - Добавлено - - -
Мне кажется, мы куда-то в сторону ушли)
- - - Добавлено - - -
Да, есть исключение именно в FD CB.
Тут код команды читается не в цикле M1, а в цикле M3.
Так что ты прав, это особый случай.
- - - Добавлено - - -
Я думаю, это было сделано для ускорения выполнения таких команд, чтобы не повторять заново цикл M1, который более длинный из-за регенерации памяти.
в M4 (в M3 адрес операнда вычисляется)
M4 - тоже четырёхтактовый, так что не поэтому
- - - Добавлено - - -
подозреваю, там вообще другая схема работает по сравнению с "нормальным" CB префиксом
но хотелось бы чётких подтверждений/опровержений и грязных подробностей от тебя))
Прихожу без разрешения, сею смерть и разрушение...
Инициируется M3, заканчивается в M4.
- - - Добавлено - - -
Да, там другая схема.
И на реверсе все это видно)
- - - Добавлено - - -
Дело не в четырехтактовости.
А в том, что в М1 много делается разного лишнего для регенерации памяти. В том числе блокируется использование блока 16-битного автоинкремента/копирования для основного набора регистров.
Т.е. в M1 этим блоком пользуются только PC и IR.
А тут нужна переброска WZ (со сформировавшимся адресом данных).
Думаю, что именно для этого и сделан такой дополнительный костыль.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
я всего лишь хочу устранить неоднозначности в определении ЗНАЧИМОСТИ префикса
для меня вот "значимый" - это который что-то ЗНАЧИТ для выполнения фрагмента
то есть от его присутствия или отсутствия (замены на ноп, например) может измениться результат
если результат в принципе НЕ может измениться - префикс НЕзначимый
(для упрощения пока считаем, что прерываний не случится за это время)
именно противоречит! было заявлено:
заявленный признак не является, ни необходимым, ни достаточным, так как найдутся контрпримеры в любую сторону
если префикс последний, он необязательно значимый; если значимый, то необязательно последний (...DD CB)
то же самое
еще раз: а для предваряемой команды - какая разница?
и зачем нужно сохранять состояние, которое далее заведомо не используется?
- - - Добавлено - - -
любой префикс был и остаётся инструкцией![]()
Прихожу без разрешения, сею смерть и разрушение...
то, что сохранять такое состояние может оказаться бесполезным - с одной стороны возможно и так, но с другой стороны вполне можно придумать ситуации, когда машина со всей памятью забитой префиксом может способна выходить из такого состояния. Тут важно, чтобы была возможность сохранить состояние и отлаживать код даже в такой ситуации.
Обдумав варианты, решил остановиться на компромисном варианте. При остановке эмулятор пытается завершить префиксную инструкцию, если это не получается в течении большого количества тактов, то останавливает как есть. Таким образом минимизируется вероятность префиксного состояния, которое невозможно корректно сохранить SZX, в то-же время во время загрузки при наличии взведенного флага LAST_EI (который по документации взводится также и для префиксов), производится проверка предыдущего опкода в памяти, если это префикс, то восстанавливается префиксное состояние. Таким образом эмулятор по возможности сохраняет снэпшоты, которые однозначно будут загружены другими эмуляторами, но также при необходимости позволяет сохранить/восстановить и префиксное состояние. Правда такие снэпшоты не будут корректно работать на эмуляторах которые не поддерживают остановку в префиксном состоянии.
Хотя может кому-то ситуация со всей памятью забитой префиксом покажется нереальной, но вот например тест, который переводит ZX Spectrum +2/3 в такой режим:
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)