Флаг половинного переноса / неполного заимствования в инструкции 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.

Другие вопросы по тегам