кажется понял, /BASE_SET активирует дешифратор стандартных опкодов. Т.к. до этого был CB опкод, то сигнал был не активен, а на префиксе переключился в активное состояние, т.к. инструкция обрабатывается стандартным декодером. Ладно, с этим сигналом понятно.
Я сейчас пытаюсь понять, по каким сигналам можно определить что будет делать процессор с опкодом в моменты выборки из памяти. Нужно мне это, чтобы исправить дизассемблер симулятора, чтобы он показывал корректную инструкцию в момент выборки.
Но я пока не вижу как в момент выборки определить что за опкод читается - прямой или с каким префиксом. Ситуация усугубляется тем, что флаги префиксов сбрасываются прямо во время выборки опкода, еще до её завершения, т.е. на последнем такте выборки, когда происходит захват опкода по состоянию сигналов вообще не понятно что читает процессор...
Если на первых двух полутактов еще более-менее понятно - можно понять какой сейчас префикс, то вот на последнем полутакте выборки флаги уже сброшены. Новые флаги у процессора включатся на следующем полутакте. Поэтому в самый важный момент, когда процессор захватывает опкод нет информации о текущем состоянии префиксов...
Последний раз редактировалось ZXMAK; 25.12.2024 в 23:59.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Опкод недействительный всего пол-такта, между окончанием действия предыдущего опкода и выборкой следующего.
Эти пол-такта M1.T3.1 (если нет торможения памяти). В этом же полутакте идет установка режима выборки опкода.
Таким образом, с M1.T3.2 уже в регистре опкода защелкнут и действителен новый опкод, и уже в регистрах префиксов установлен выбор нужного набора команд или префикса.
Во все остальное время регистр опкода действителен и декодируется в соответствии с текущим режимом.
Если режим BASE_SET то по ПЛМ базового набора
Если режим ED_SET или CB_SET то по ПЛМ их наборов
это что, получается, что в промежуток от M1.T1.1 до M1.T2.2 процессор продолжает выполнять предыдущую операцию?
Это конечно хорошо, но как в M1.T3.1 предсказать какие флаги префиксов будут активированы на M1.T3.2?
Я хочу отобразить правильно дизассемблированную инструкцию в момент когда ещё идет её выборка, т.е. в M1.T3.1, а не когда она начинает обрабатываться в M1.T3.2...
По каким сигналам в полу-такте M1.T3.1 можно узнать как процессор будет декодировать текущий опкод?
Проверил еще раз, вот выборка:
Скрытый текст
[свернуть]
1) С самими префиксами ок, по /BASE_SET==0 можно определить что ED/CB/DD/FD - это префикс.
2) C ED46 ок - по /ED_SET==0 можно определить, что 46 - это опкод с префиксом ED
3) С DD210000 тоже ок - по /IDX_SET==0 и /BASE_SET==0 можно определить что 21 - это базовая операция с префиксом DD
4) А вот с CB40 возникает проблема - все перечисленные флаги в M1.T3.1 не активны, /CB_SET станет активным только на следующем полу-такте M1.T3.2. Как понять что 40 это опкод для префикса CB в M1.T3.1 (когда еще идет выборка)?
а если будет торможение wait, опкод может быть выбран не в момент перехода из M1.T3.1 в M1.T3.2?
Проверил - выборка похоже всегда идет в M1.T3.1. Если активируется WAIT, то процессор просто откладывает M1.T3.1 на потом:
Скрытый текст
[свернуть]
Последний раз редактировалось ZXMAK; 26.12.2024 в 02:43.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Приехали. Конечно)
У нас же конвейер. Новая операция начинается с поступлением нового опкода в M1.T3.2.
- - - Добавлено - - -
Процессору Z80 предсказывать это не нужно. Для него в этот полутакт регистр опкода недействителен и все. Идут переходные процессы.
- - - Добавлено - - -
Да
- - - Добавлено - - -
Я понял, ты все вынашиваешь ту свою идею, что процессор можно остановить в любой такт, и надо иметь возможность его состояние сохранять в любой момент, в том числе в середине последовательности префиксов)
Чтобы иметь возможность сохранять состояние процессора в любой такт, и тем более полутакт, надо записывать гораздо больше информации,чем просто состояние префиксов. Но это никому не нужно.
- - - Добавлено - - -
Если тебе прям очень-очень надо это знать, то это состояние триггера T2956/T2922.
Сигналы выбора наборов ED_SET, IDX_SET, BASE_SET устанавливаются уже к M1.T3.1
Тогда как CB_SET задерживается на пол-такта.
Судя по схеме, это сделано для того, чтобы он за эти пол-такта:
1. Заблокировал сигнал BASE_SET
2. Активизировал сигнал SEL_MASK
SEL_MASK - это сигнал генерации маски битовых операций для АЛУ, которая применяется в BIT/SET/RES.
Barmaley_m(26.12.2024), ZXMAK(26.12.2024)
работаетЯ назвал сигнал на затворе T2922 как /CB_SETE (E от early):
Скрытый текст
[свернуть]
теперь задача определить моменты, когда процессор читает опкод
Я правильно понимаю, что опкод всегда читается в M1.T3.1 и это состояние всегда соответствует CLK=0? (точнее в момент posedge CLK, что соответствует переходу из M1.T3.1 в M1.T3.2).
Пробовал давать WAIT, если WAIT заканчивается на CLK=1, то процессор продолжает ожидание до CLK=0.
Тоесть можно считать, что выборка опкода происходит всегда при M1=1 && T3==1 && CLK==0?
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Чтение начинается раньше.
Память может выставлять данные на шину данных уже M1.T2.2.
И начиная с этого времени шина данных уже проброшена и прописывается во внутренний регистр READ_DATA.
И все это происходит в течении цикла ожидания, если он есть, и в M1.T3.1 тоже.
Начиная с M1.T3.1 внутренняя шина /DBUS начинает записываться в регистр опкода. Но при этом эта же шина на этот полу-такт подтягивается к +5, таким образом в этом полутакте в регистр опкода прописывается 0.
Начиная с M1.T3.2 регистр READ_DATA, в котором уже считается устоявшимся ответ от памяти, пробрасывается на шину /DBUS, и соответственно через нее в регистр опкода.
При этом одновременно регистр READ_DATA отключается от внешней шины.
Таким образом, мы можем считать, что по фронту M1.T3.2 внешняя шина данных защелкивается в регистре опкода.
При этом за пол-такта до этого регистр опкода обнуляется.
И, наконец, по M1.T3.3 шина /DBUS отключается от регистра опкода, и он продолжает хранить свое значение дальше.
Но это я описал только момент выборки стандартного опкода.
Выбор опкода в командах DD/FD/CB идет в M3.T3 и вообще в другом полу-такте.
ZXMAK(26.12.2024)
да, я это заметил, когда пробовал wait включать во время выборки.
Правильно ли понял, что независимо от цикла M, по T3 всегда идет выборка из памяти, причем опкод и его данные читаются в T3.1, а при выполнении опкода данные читаются в T3.2? И кстати, почему чтение опкода и его данных занимает 3 полу-такта, а чтение данных при выполнении опкода 4 полу-такта?
Если это так, можно ли по какому-то сигналу отличить эти два случая, т.е. когда идет выборка опкода и его данных, а когда идет выборка данных при выполнении инструкции
Последний раз редактировалось ZXMAK; 26.12.2024 в 16:09.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Нет, не каждый M-цикл порождает цикл чтения-записи памяти. А только по необходимости.
- - - Добавлено - - -
Цикл чтения опкода в M1 укорочен, видимо, это связано с тем, что в M1 надо было упихнуть и цикл чтения опкода, и цикл регенерации памяти, иначе они бы не поместились, если бы были длиннее.
- - - Добавлено - - -
Если у тебя активен LOAD_IR, значит идет загрузка регистра опкода.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)