Прихожу без разрешения, сею смерть и разрушение...
Рассмотрев внимательнее, стало видно, что особенности есть!
В отличие от классических АЛУ-команд, команда SCF в такте T3 не устанавливает результат работы АЛУ на обьединенную шину HBUS/LBUS (например, содержимое регистра A), в связи с чем при записи флагов 5 и 3 с шины LBUS в регистр F в такте T4, происходит запись заряда, оставшегося там с предыдущего состояния LBUS, которое следует рассмотреть более подробно.
Как уже упоминалось, если команда в конце своей работы обновляет регистр F, то следующая за ней команда не перечитывает F из регистрового файла, а читает его прямо с шины LBUS, т.к. в этот момент на шину LBUS выдаются флаги. Что же касается флагов 5 и 3, то от предыдущего такта (Т3) на шине LBUS остается сильный заряд (например, значение регистра А), который и попадает во флаги 5 и 3.
Говоря еще проще по шагам: В такте T3 шины LBUS и HBUS обьединены, на них находится содержимое регистра A. В такте T4 шины LBUS и HBUS разьединяются, и с шины LBUS происходит запись в регистр F, а на шину HBUS читается регистр A из регистрового файла.
Теперь рассмотрим отличие работы команды SCF от классической АЛУ-команды.
Рассмотрим такую последовательность команд ALU A,r; SCF; SCF; SCF и т.д.
В такте T3 на шине LBUS было какое-то значение, т.е. оставшееся с предыдущей команды (ALU A,r) значение регистра A. В такте T4 оно записывается фо флаги 5 и 3, и также в этом такте читается значение регистра А на HBUS. В такте T1 следующего цикла шины HBUS и LBUS обьединяются, но на них ничего не выдается, т.к. команда SCF не использует АЛУ. И тут возникает вопрос, какой заряд сильнее? 0 или 1? Если 0 сильнее, то на обьединенной шине HBUS/LBUS будет содержимое A & F. Если 1 сильнее, то будет A | F. В течение тактов T1, T2, T3 ничего не меняется. А далее в такте T4 шины HBUS и LBUS снова разьединяются, на шину HBUS читается регистр A для следующей команды, а вот шина LBUS все еще сохраняет заряд A & F, и в таком виде записывает его в регистр флагов (мы тут рассматриваем только флаги 5 и 3). Далее в такте T1 следующего цикла шины HBUS и LBUS опять обьединяются, и на шине HBUS мы имеем сильный обновленный заряд (регистр A), и электрически соединяясь с шиной LBUS, на которой заряд более слабый, оставшийся от соединения шин 4 такта назад, что мы получим в сумме?
Вот это вопрос. Шина HBUS сильно заряжена, а шина LBUS осталась с прежним зарядом, являющимся электрической суммой LBUS и HBUS предыдущего цикла. Если мы рассматриваем последовательность команд SCF, то регистр A не изменяется, значит HBUS подзаряжается одинаковым значением, которое постепенно (за сколько команд SCF) пересилит ослабевающий заряд LBUS, и в итоге через несколько итераций содержимое F (5 и 3 флаги) будет равняться не электрической сумме A и F, а только A, не зависимо от того, что сильнее, 0 или 1.
Вот такие теоретические рассуждения, которые требуют проверки на практике.
Если теория верна, то последовательность команд типа:
Код:LD HL,$FFFF($0000,$FF00,$00FF) PUSH HL POP AF SCFдолнжны давать разное значение флагов 5 и 3 (пока это тестить не надо, надо подумать о нормальном тесте).Код:LD HL,$FFFF($0000,$FF00,$00FF) PUSH HL POP AF SCF(100 раз)
- - - Добавлено - - -
Поискал в интернете, и нашел здесь подтверждение моих предположений для родного NMOS:
- - - Добавлено - - -Код:if <previous instruction modified the flags> then YF = A.5 XF = A.3 else YF = YF | A.5 XF = XF | A.3 endif
Все-таки OR, а не AND (т.е. 1 более сильные).
Если предыдущая команда не модифицирует флаги, то перед выполнением команды, регистр F читается на LBUS из регистрового файла, и заряд сильный, равноценный заряду на HBUS, куда читается A. Поэтому получается некая электрическая сумма по OR.
А вот если предыдущая команда модифицирует флаги, то перед выполнением команды, регистр F (5 и 3 биты) читаются с LBUS, где остались слабо заряжены от предыдущей команды, поэтому хорошо заряженный HBUS (регистр A) их пересиливает.
- - - Добавлено - - -
Итак, почему же плавают значения? Да потому что после обьединения HBUS и LBUS пртивоположные заряды дают нечто среднее, не 0 и 1, а 0.5. И в зависимости от чувствительности затворов, это может прочитаться как 0, а может как 1. Судя по всему, тяготеет ближе к 1, но т.к. все же на грани порога, то любой чих, примесь в кристалле, нюансы производства, наводки на процессор с платы, температура, могут сместить эту шаткую границу, поэтому и нестабильность, как я думаю.
Последний раз редактировалось Titus; 28.09.2024 в 11:37.
CodeMaster(28.09.2024), Dexus(29.09.2024), ZjoyKiLer(30.09.2024)
Ввиду того, что загадка установки 5 и 3 флагов в командах SCF/CCF для NMOS Z80 наконец-то разгадана, написал несколько тестов шума SCF для реалов (тестировать CCF нет смысла ввиду абсолютно одинаковой внутренней реализации этих команд).
В отличие от этого теста, все более наглядно, нет индикации бит, никак не участвующих в формировании 5 и 3 флагов. Заполнение экрана предполагаемым шумом более однородное и визуально понятное.
Верхняя треть экрана отображает тест бита 3 (черный с белым), средняя треть экрана отображает тест бита 5 (синий с голубым).
Также каждая треть разделена на несколько зон с разными комбинациями начальных флагов для теста.
В архиве три теста:
1. Классический SCF после команды 'не влияющей на флаги'.
2. Тоже самое, но два SCF подряд.
3. Классический тест, но перед SCF выполняется команда, влияющая на флаги.
На эмуляторах поля будут однородные.
На реалах исходя из теоретических предположений, некоторые поля на некоторых процессорах будут шуметь. Вот это самое интересное и нужное.
Расчехляйте ваши реалы и запускайте тесты!
Пример картинки из теста на эмуляторе:
- - - Добавлено - - -
p.s.: Можете тестировать на любом реале, не обязательно на NMOS.
p.p.s: Тест убран, как устаревший. Используете Test SCF 9.
Последний раз редактировалось Titus; 28.10.2024 в 15:53.
Ну что, я то готов тестировать. Но...
Проц сейчас стоит тот, что нестабильный, что надо.
но надо или исходники тестов или с загрузчиком под ТР-ДОС. Тап-ку грузить сильно проблемно.
Profi v3.2 -=- Speccy2010,r2
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
понятно, что там предельно просто, но с исходниками я бы быстрее трд сделал.
а так то пока один сделал и запустил)
ну сейчас, неспеша сделаю все три и озвучу результат)
- - - Добавлено - - -
два SCF подряд - я думаю не имеют смысла, но это так, мысли вслух.
Вобщем второй и третий тест стабильно, не шумят.
Авот первый очень интересно шумит. Если считать по полоскам сверху вниз, то шумит нижняя вторая половина первой белой полосы и
первая верхняя половина последней синей полосы..
Там натуральные иероглифы в динамике!! возможно кЕтайцы или корейцы что-то знакомое точно узнали бы!!
сорри, что ч\б, но результат и так виден))
Последний раз редактировалось zebest; 28.09.2024 в 23:44.
Profi v3.2 -=- Speccy2010,r2
Немножко странновато, если верить тому, что этот процессор NMOS.
- - - Добавлено - - -
Для чистоты эксперимента надо было сделать и такие варианты.
- - - Добавлено - - -
Это очень радует. Значит теория совпала с практикой.
Обязательно нужно записать видео этого шума.
Во втором и третьем тесте что на месте шума? Белое или черное?
- - - Добавлено - - -
И еще, какая полная маркировка процессора?
- - - Добавлено - - -
Рисунок наводит на некоторые дополнительные мысли о перекрестном влиянии некоторых линий. Нужно видео, и нужны еще тесты с разных процессоров. А еще интересно, не будет ли меняться картина, если потрогать процессор пальцем, или слегка нагреть его.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)