Расчет флагов: различия между версиями

Материал из Emuverse
(Новая: {{Emuverse}} for 8-bit add/adc, sub/sbc (it's similar with 16-bit opcodes) A=accumulator d=data to be added/subtracted, excluding carry flag r=result after calculation carry: simply ...)
 
(перенос)
Строка 1: Строка 1:
{{Emuverse}}
{{Emuverse}}
В данной статье описываютя алгоритмы расчета значений регистра состояния процессора (регистра флагов).


for 8-bit add/adc, sub/sbc (it's similar with 16-bit opcodes)
В следующих алгоритмах используются следующие обозначения (предполагается, что вычисления 8-битовые):
A=accumulator
* '''A''': Аккумулятор, первый операнд;
d=data to be added/subtracted, excluding carry flag
* '''d''': второй операнд;
r=result after calculation
* '''r8''': результат вычислений при использовании 8-разрядной переменной;
* '''r16''': результат вычислений при использовании 16-разрядной переменной;


== Перенос ==
* для '''r8''': <TT>CY=1</TT> если <tt>A&gt;r</tt> при сложении, <TT>CY=1</TT> если <tt>A&lt;r</tt> при вычитании;
* для '''r16''': просто
** '''<tt>r16>>8&1</tt>''' (Си)
** '''<tt>(r16 shr 8) and 1</tt>''' (Паскаль);




carry: simply A>r for add, A<r for sub (or if r>8bit: r>>8&1)
half carry: like you said it's (r^A^d)&0x10
half carry: like you said it's (r^A^d)&0x10
overflow: ((A^r)&(d^r))>>5&4 for add, ((A^d)&(A^r))>>5&4 for sub
overflow: ((A^r)&(d^r))>>5&4 for add, ((A^d)&(A^r))>>5&4 for sub
[[Категория:Приёмы программирования]]

Версия от 10:22, 20 февраля 2008

Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

В данной статье описываютя алгоритмы расчета значений регистра состояния процессора (регистра флагов).

В следующих алгоритмах используются следующие обозначения (предполагается, что вычисления 8-битовые):

  • A: Аккумулятор, первый операнд;
  • d: второй операнд;
  • r8: результат вычислений при использовании 8-разрядной переменной;
  • r16: результат вычислений при использовании 16-разрядной переменной;

Перенос

  • для r8: CY=1 если A>r при сложении, CY=1 если A<r при вычитании;
  • для r16: просто
    • r16>>8&1 (Си)
    • (r16 shr 8) and 1 (Паскаль);


half carry: like you said it's (r^A^d)&0x10

overflow: ((A^r)&(d^r))>>5&4 for add, ((A^d)&(A^r))>>5&4 for sub