Ой !!! прошу прощения ...
Вид для печати
А - а - а !!! перепутал с H флагом. Исправляю. А Н флаг DAA тоде не трогает?
Трогает. Смотрите код:
Код:case 0x27: /* DAA: f(4) */
d = 0x0000;
if((Z80_AF & Z80_CF) || Z80_AF >= 0x9a00) d |= 0x6000, Z80_AF |= Z80_CF;
if((Z80_AF & Z80_HF) || ((Z80_AF & 0x0f00) >= 0x0a00)) d |= 0x0600;
if(!(Z80_AF & Z80_NF)) Z80_AF = ((Z80_AF + d) & 0xff00) |
(((Z80_AF & 0x0f00) >= 0x0a00) << HF_BIT) | (Z80_AF & Z80_CF);
else Z80_AF = ((Z80_AF - d) & 0xff00) |
(((Z80_AF & Z80_HF) && (Z80_AF & 0x0f00) <= 0x0500) << HF_BIT) | Z80_NF | (Z80_AF & Z80_CF);
r = (Z80_AF >> 8);
Z80_AF |= PF_LOG(r) | (!r << ZF_BIT) | (r & (Z80_SF | Z80_XF | Z80_YF));
А табличка-то у меня в виде файла EEPROM (вложение).
Весом она 4К. Адреса такие: I:N:H:C:A
где I - идентификатор. I=0 для данных (результата DAA) и I=1 для флагов в результате DAA. N, H, C - флаги до выполнения DAA. A - 8 бит ОПЕРАНДА DAA. Сначала читаю данные при I=0, затем устанавливаю I=1 и читаю флаги.
Там в принципе остался только Н флаг. Может можно что-то почитать про него и я сам смогу?
Строку 94 прошли. Теперь ошибка действительно во флаге H: строка 696, до "DAA" AF=#0010, после -- AF=#0614 вместо правильного AF=#0604, т.е. HF ошибочно взведен.
Логика HF в "DAA" такая:
1) Если NF сброшен, тогда:
1a) Если регистр A до исполнения больше или равен 10, тогда после исполнения HF должен быть взведен.
1b) Иначе A меньше 10 и HF должен быть сброшен.
2) Иначе NF взведен, и тогда:
2a) Если флаг H до исполнения был взведен и регистр A меньше или равен 5, тогда после исполнения HF должен быть взведен.
2b) Иначе либо флаг H до исполнения сброшен, либо регистр A больше 5, и тогда HF после исполнения должен быть сброшен.
Строка 696 с AF=#0010 до исполнения, проходит по пункту 1b), и значит HF должен быть сброшен.
Поднаписал вроде бы.
Ага, исполняется по написанному выше, но я наврал с регистром A: в обоих случаях следует сранивать только четыре младших регистра A. То есть:
1) Если NF сброшен, тогда:
1a) Если четыре младших разряда A до исполнения больше или равны 10, тогда после исполнения HF должен быть взведен.
1b) Иначе четыре младших разряда A меньше 10 и HF должен быть сброшен.
2) Иначе NF взведен, и тогда:
2a) Если флаг H до исполнения был взведен и четыре младших разрядов регистра A меньше или равны 5, тогда после исполнения HF должен быть взведен.
2b) Иначе либо флаг H до исполнения сброшен, либо четыре младших разряда регистра A больше 5, и тогда HF после исполнения должен быть сброшен.
Надеюсь, это будет не большая правка. :)