Флаг полупереноса/полузаимствования в инструкции DAA

Извиняюсь за то, что это мой второй вопрос Z80 DAA - я уже в значительной степени реализовал эту инструкцию, но есть одна вещь, в которой я не уверен - установлен ли флаг H этой инструкцией вообще? В руководстве Z80 сказано «см. инструкцию», но флаг упоминается только перед DAA, а не после его выполнения.

Я устанавливаю флаги следующим образом:

S устанавливается, если результат отрицательный (0x80 и результат равен 0x80) Z устанавливается, если результат равен нулю H (не уверен, поэтому этот вопрос) P/V устанавливается равным четности результата (1, если четный, 0, если нечетный) N остается в покое C устанавливается, если изменяется старший полубайт исходного значения аккумулятора

Кроме этого, инструкция, похоже, работает так, как я ожидаю :-) Надеюсь, кто-нибудь сможет прояснить это для меня, большое спасибо.


person PhilPotter1987    schedule 30.11.2011    source источник


Ответы (2)


Это хороший вопрос. Да, поведение флага H четко не задокументировано, потому что это поведение нестандартно для DAA.

Если младший полубайт (четыре младших бита) A не является числом с основанием 10 (больше 9, как A,B,C,D,E или F), установлен флаг или H, 6 добавлен в реестр. Это означает, что даже если младший полубайт находится в диапазоне от 0 до 9, вы можете принудительно добавить 6 к регистру A, установив флаг H.

Когда дело доходит до вашего вопроса, флаг H обычно по моему опыту остается нетронутым, но вы не можете полагаться на это, потому что сказано, что «эффект нестандартен», что означает, что флаг H может измениться или не может измениться меняться в зависимости от ситуации. В таких случаях вы всегда должны думать, что флаг H зависит от инструкции DAA после выполнения, даже если вы видите, что он не затрагивается в ваших тестах.

person Emir Akaydın    schedule 01.12.2011
comment
Спасибо за это - мне ясно, для чего при расчете нижнего полубайта используется флаг H, просто не был уверен, что произошло после этого - я подумал, что, поскольку флаг C установлен, если старший полубайт изменен, флаг H может быть установить, если младший полубайт изменен - ​​это будет соответствовать поведению других математических инструкций Z80, хотя в руководстве это вообще не указано, поэтому я не буду этого предполагать. - person PhilPotter1987; 01.12.2011

Я смог найти только здесь, что флаг половинного переноса/заимствования изменен по ДАА.

Я рекомендую устанавливать этот флаг точно так же, как флаг AF (вспомогательный перенос) устанавливается инструкциями DAA и DAS на процессорах x86. Я не вижу причин, по которым должна быть какая-то разница в работе между DAA/DAS i8080/i8085/Z80 и i8086.

DAA/DAS x86 устанавливает AF в 1, если он корректирует младшие 4 бита аккумулятора на 6. Если он не корректирует их, он сбрасывает AF в 0.

См. псевдокод для DAA и DAS в руководствах по процессорам Intel (или AMD) x86.

person Alexey Frunze    schedule 01.12.2011
comment
Как вы знаете, инструкции DAS для процессоров Z80 нет. Инструкция Z80 DAA объединяет инструкции DAA и DAS i8086 в одну, что означает, что в какой-то момент она отличается от DAA i8086. - person Emir Akaydın; 01.12.2011
comment
Вы сказали, что я не вижу причин, по которым должна быть какая-то разница в работе между DAA/DAS i8080/i8085/Z80 и i8086. Мой комментарий был нацелен на это предложение. Изучение эквивалентных инструкций x86 не помогло бы объяснить странное поведение флага H для Z80. - person Emir Akaydın; 01.12.2011
comment
Это, казалось бы, логичное поведение, хотя в инструкции к Z80 это не упоминается — меня это немного беспокоит :-( - person PhilPotter1987; 01.12.2011
comment
@EmirAkaydın: эта разница считается понятной. - person Alexey Frunze; 01.12.2011
comment
@PhilPotter1987: ни в документах Z80, ни в документах x86 не предполагается, что после выполнения DAA/DAS H/AF можно использовать каким-либо осмысленным образом, они не предоставляют примеров такого использования. И я не думаю, что многие люди считают H/AF полезными после DAA/DAS. Возможно, нет. Если вы хотите быть уверенным, см. другие документы для Z80 и совместимых процессоров, таких как i8080 и i8085. Может быть, они лучше объясняют DAA. Или... найдите кого-нибудь с компьютером Z80 (например, ZX Spectrum) и попросите его провести тест DAA. - person Alexey Frunze; 01.12.2011