Флаги переполнения и переноса на Z80

Я дошел до реализации набора кодов операций ADD A, r на моем Ядро Z80. У меня была небольшая путаница по поводу флагов переноса и переполнения, которые, как мне кажется, я прибил, но я хотел сообщить об этом сообществу, чтобы убедиться, что я прав.

В основном, насколько я могу судить, ALU в Z80 не заботится о подписанных / неподписанных операциях, он просто добавляет биты. Это означает, что если два 8-битных значения складываются вместе и в результате их сложения возникает 9-битное значение, устанавливается флаг переноса. Это включает в себя добавление двух отрицательных чисел в дополнительном коде, например -20 (11101100) и -40 (11011000), поскольку, хотя результат равен -60 (11000100), результат фактически представляет собой 9-битное значение 1 1100 0100. Это, безусловно, означает если добавляются два отрицательных значения дополнения до двух, флаг переноса всегда будет установлен, даже если нет условия переполнения - я прав?

Во-вторых, я решил, что для обнаружения переполнения в этой инструкции я бы использовал XOR бит 7 для оба операнда, и если результат был 10000000, то переполнения определенно нет - если результат этого равен 00000000, то может быть переполнение, так как знаки такие же, и поэтому я бы XOR бит 7 результата сложения с битом 7 любого операнда, и если результат - 10000000, то произошло переполнение, и я установил флаг переполнения P / V.Я тоже здесь прав?

Извините за такой запутанный вопрос, я почти уверен, что прав, но мне нужно знать, прежде чем я продолжу с бесчисленным множеством других инструкций, основанных на этой логике. Большое спасибо.

23
задан Mateusz Piotrowski 25 June 2015 в 22:32
поделиться