
Сообщение от
Lisitsin
Есть идея сделать так:
1. Прибавить к операнду изначалое значение С.
2. Запомнить флаги P1, C1, S1 - после первой операции.
2. Прибавить к HL текущее значение операнда используя компнда ADD, ADC.
3. Запомнить флаги P2, C2, S2 после второго действия.
4. Вычислить флаги P, C, S результата как P=P2XORC1, C=C1ORC2, S=S1ORS2, Z вычислить проверкой HL на ноль.
Правильно я думаю на этот раз?
Почти. 
В терминах Z80, и если перекладывать на восьмиразрядные инструкции, инструкция "ADC HL, OP" эквивалентно следующему.
1) Прибавляем CF к OP:
Код:
LD A, OPL
ADC A, 0
LD OPL, A
LD A, OPH
ADC A, 0
LD OPH, A
Здесь запоминаем флаги CF1 и PF1.
Имеем в виду, что OP -- это временная копия операнда, а не сам этот регистр в правой части инструкции. То есть, сам регистр не модифицируем.
2) Прибавляем OP к HL:
Код:
LD A, L
ADD A, OPL
LD L, A
LD A, H
ADD A, OPH
LD H, A
3) Считаем PF. Он равен текущему PF (после "ADD A, OPH") в ксорке с PF1, то есть
4) Считаем CF. Он равен текущему CF (после той же инструкции) в дизъюнкции с CF1 -- как вы и написали, то есть
5) Считаем ZF. Это, действительно, просто проверка HL на 0.
6) SF считать не нужно. Последняя инструкция его выставит сама.
7) А вот HF посчитать придется. То, что дает последняя инструкция будет правильным значением для инкрементированного операнда (если CF на входе взведен), а нам нужен HF для исходных операндов, то есть до инкремента.
8) MEMPTR = значение HL до исполнения.
9) Во флаги 3 и 5 копируем соответствующие разряды старшей половины резлуьтата (то есть H).