Флаг половинного переноса / неполного заимствования в инструкции DAA
Прошу прощения за то, что сделал этот мой второй вопрос по DA80 для Z80 - я в значительной степени выполнил эту инструкцию сейчас, но есть одна вещь, в которой я не уверен - установлен ли флаг H этой инструкцией вообще? В руководстве по Z80 написано "см. Инструкцию", но в нем упоминается только флаг перед DAA, а не после его выполнения.
Я установил флаги следующим образом:
S устанавливается, если результат отрицателен (0x80 и результат равен 0x80) Z устанавливается, если результат равен нулю H (не уверен, поэтому этот вопрос) P/V устанавливается на четность результата (1, если четное, 0, если нечетное) N остается один C устанавливается, если верхний клочок исходного значения аккумулятора изменен
Кроме этого, инструкция, кажется, работает так, как я ожидаю:-) Я надеюсь, что кто-то может прояснить это для меня, большое спасибо.
2 ответа
Это хороший вопрос. Да, поведение флага H четко не задокументировано, потому что это поведение нестандартно с DAA
,
Если младший полубайт (младшие четыре бита) A является неосновным числом 10 (больше 9, как A,B,C,D,E или F) или установлен флаг H, 6 добавляется в регистр. Это означает, что даже если нижний полубайт находится в диапазоне 0-9, вы можете принудительно добавить 6 в регистр A, установив флаг H.
Когда дело доходит до вашего вопроса, флаг H обычно остается неизменным в моем опыте, но вы не можете зависеть от этого, потому что сказано, что "эффект нестандартен", что означает, что флаг H может меняться или не меняться в зависимости от ситуации. В таких случаях вы всегда должны думать, что на флаг H влияет DAA
инструкция после выполнения, даже если вы видите, что это не влияет на ваши тесты.
Я мог только найти здесь, что флаг половинного переноса / заимствования изменен DAA.
Я рекомендую установить этот флаг точно так же, как флаг AF (вспомогательный перенос) установлен в инструкциях DAA и DAS на процессорах x86. Я не вижу причин, почему между i8080/i8085/Z80 и DA80 /DAS i8086 должно быть какое-либо различие в работе.
X86 DAA /DAS устанавливает AF на 1, если он устанавливает младшие 4 бита аккумулятора на 6. Если он не регулирует их, он сбрасывает AF на 0.
См. Псевдокод для DAA и DAS в руководствах по процессорам Intel (или AMD) x86.