
Сообщение от
Titus
Это может быть все, что угодно. Надо смотреть, что за процессор. В NMOS-е я таких моментов в формировании 3 и 5 флагов в SCF/CCF не вижу.
Рассмотрев внимательнее, стало видно, что особенности есть!
В отличие от классических АЛУ-команд, команда 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
Код:
LD HL,$FFFF($0000,$FF00,$00FF)
PUSH HL
POP AF
SCF(100 раз)
долнжны давать разное значение флагов 5 и 3 (пока это тестить не надо, надо подумать о нормальном тесте).
- - - Добавлено - - -
Поискал в интернете, и нашел здесь подтверждение моих предположений для родного 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, но т.к. все же на грани порога, то любой чих, примесь в кристалле, нюансы производства, наводки на процессор с платы, температура, могут сместить эту шаткую границу, поэтому и нестабильность, как я думаю.