Z80 DAA инструкция - PullRequest
       11

Z80 DAA инструкция

17 голосов
/ 14 ноября 2011

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

Мои вопросы:

  • что произойдет, если она будет выполнена после другой инструкции?
  • откуда он знает, какая инструкция ему предшествовала?
  • Я понимаю, что есть флаг N - но это, безусловно, не будет точно указывать, что предыдущая инструкция была командой сложения или вычитания?
  • Изменяет ли он в любом случае аккумулятор, основываясь на условиях, изложенных в таблице DAA, независимо от предыдущей инструкции?

Ответы [ 3 ]

15 голосов
/ 14 ноября 2011

Изменяет ли он в любом случае аккумулятор, основываясь на условиях, изложенных в таблице DAA, независимо от предыдущей инструкции?

Да. Документация только говорит вам, для чего предназначен DAA. Возможно, вы ссылаетесь на таблицу по этой ссылке :

--------------------------------------------------------------------------------
|           | C Flag  | HEX value in | H Flag | HEX value in | Number  | C flag|
| Operation | Before  | upper digit  | Before | lower digit  | added   | After |
|           | DAA     | (bit 7-4)    | DAA    | (bit 3-0)    | to byte | DAA   |
|------------------------------------------------------------------------------|
|           |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
|   ADD     |    0    |     0-8      |   0    |     A-F      |   06    |   0   |
|           |    0    |     0-9      |   1    |     0-3      |   06    |   0   |
|   ADC     |    0    |     A-F      |   0    |     0-9      |   60    |   1   |
|           |    0    |     9-F      |   0    |     A-F      |   66    |   1   |
|   INC     |    0    |     A-F      |   1    |     0-3      |   66    |   1   |
|           |    1    |     0-2      |   0    |     0-9      |   60    |   1   |
|           |    1    |     0-2      |   0    |     A-F      |   66    |   1   |
|           |    1    |     0-3      |   1    |     0-3      |   66    |   1   |
|------------------------------------------------------------------------------|
|   SUB     |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
|   SBC     |    0    |     0-8      |   1    |     6-F      |   FA    |   0   |
|   DEC     |    1    |     7-F      |   0    |     0-9      |   A0    |   1   |
|   NEG     |    1    |     6-F      |   1    |     6-F      |   9A    |   1   |
|------------------------------------------------------------------------------|

Должен сказать, я никогда не видел спецификацию инструкций после этого. Если вы внимательно изучите таблицу, то увидите, что действие инструкции зависит только от флагов C и H и значения в аккумуляторе - оно вообще не зависит от предыдущей инструкции. Кроме того, он не разглашает, что произойдет, если, например, C=0, H=1, а нижняя цифра в аккумуляторе равна 4 или 5. Таким образом, вам придется выполнить NOP в таких случаях или создать сообщение об ошибке или что-то.

9 голосов
/ 13 января 2012

Просто хотел добавить, что флаг N - это то, что они имеют в виду, когда говорят о предыдущей операции. Дополнения устанавливают N = 0, вычитания устанавливают N = 1. Таким образом, содержимое регистра A и флаги C, H и N определяют результат.

Инструкция предназначена для поддержки арифметики BCD, но имеет другое применение. Рассмотрим этот код:

    and  15
    add  a,90h
    daa
    adc  a,40h
    daa

Конец преобразования младших 4 битов регистра A в значения ASCII '0', '1', ... '9', 'A', 'B', ..., 'F'. Другими словами, двоичный в шестнадцатеричный преобразователь.

8 голосов
/ 01 мая 2015

Эта инструкция показалась мне довольно запутанной, но я нашел, что это описание ее поведения из z80-heaven было бы наиболее полезным.

Когда эта инструкция выполняется,регистр A корректируется BCD с использованием содержимого флагов.Точный процесс заключается в следующем: если младшие четыре бита A содержат не-BCD цифру (т. Е. Она больше 9) или установлен флаг H, то в регистр добавляется $ 06.Затем проверяются четыре наиболее значимых бита.Если эта более значимая цифра также оказывается больше 9 или установлен флаг C, то добавляется $ 60.

Это обеспечивает простой шаблон для инструкции:

  • если младшие 4 бита образуют число больше 9 или установлено значение H, добавьте $ 6 к аккумулятору
  • если старшие 4 бита образуют число больше 9 или значение C установлено, добавьте $ 60 к аккумулятору

Кроме того, в то время как DAA предназначен для для запуска после сложения или вычитания, он может запускаться в любое время.

...