Последние исправления:
Вид для печати
Последние исправления:
Исправил:
Может, спрошу то что уже здесь обсуждалось (весь тред прочитать не осилю), но в глаза не бросилось чтобы применяли zexall для проверки. А между тем, эта утилита как раз для проверки корректности выполнения всех команд с учетом всех флагов. Ну типа чтобы не гадать что где недоэмулировано. И большинство эмуляторшиков ориентируются по ней чтобы вывести "базис" эмулируемых команд.
zexall очень медленно работает - я в эмуле выставил частоту 50 MHz и то приходиться долго ждать результатов.
Работаю ...
Я там вас ещё не замучил? Да, код у меня .... на какой мы там строчке от начала?
Я правильно понимаю, BIT n, (IX/Y+d):
1. при n=3, 5, 7 должна копировать ,бит 3, 5, 7 из тестируемого байта соответственно в F3, F5, SF. Тогда влияет ли она на флаги (F5, SF), (F3, SF), (F5, SF) при n=3, 5, 7 соответственно?
2. При n=0, 1, 2, 4, 6 копирует в F3, F5 биты 3, 5 из HIGH (IX(Y)+d). FS при этом не меняется. (?)
Трейсинг шлю.
Намана. :) На 225-й строке. Если игнорировать флаги 3 и 5, то на 695-й строке. Уже кое что. :)
Нет, во флаги 3 и 5 эти инструкции копируют биты 3 и 5 старшей половины IX/Y+d. Независимо от значения n. Если и только если тестируемый бит сброшен, эти инструкции взводят ZF и PF. Если и только если тестируется бит 7 и он взведен, взводится флаг SF. MEMPTR присваивается значение IX/Y+d. Тоже независимо от значения n.
---------- Post added at 20:42 ---------- Previous post was at 20:32 ----------
Сломали RRCA: при A=#01 взводит SF. Эта инструкция не должна менять SF, ZF и PF, что бы там ни получалось после сдвига.
С меня много литров пива. Правда я живу в Рязани.
Все та же "BIT 1, (IY +1)" по #0B03 -- упорно взводит SF.
Но прогресс есть, теперь даже без игнорирования флагов 3 и 5 доходим до 695-й строки.
Она у меня на него не влияет. До этого SF сброшен? Если установлен до этой инструкции - она его и не трогает:
SBR F,1<<HH
CBR F,(1<<NN)|(1<<ZZ)|(1<<PP); 87
SBRS BUF,1 ; 88
SBR F,(1<<ZZ)|(1<<PP); 89
BST RES,7 ; SAVE FLAG S 90
MOV RES,TMPH; SAVE BITS 3, 5 FROM HIGH ADDRESS 91
BLD RES,7 ; RESTORE S FLAG 92
JMP DONEM24 ; 95
В BUF у меня тестируемый бит;
RES - регистр флагов S, 5, 3 (результат)
Перед тем как скопировать в RES биты 3 и 5 я запоминаю FS, а потом его восстанавливаю.
На всякий случай повторил ещё раз:
Ну ни уже ли прогресс? Теперь в геометрической попрёт ...
Может что по-сложнее задать? Там DAA failed ...
Трейсинг со слов 9523 5483 0000 C9D4 0005 2000 2000.
Медленно она крутится. Попробую ускорить.
Тогда хорошо бы следующее условие для начала трейсинга:
PC=#8920 и 16-разрядное значение по адресу (#8929)=#86E7.
Это начало теста на DAA. Сможете?
Попробую ... А можно по какой-то одной тетраде, например 86 по адресу 8929 или E7 по адресу 892A?
А - а - а !!! перепутал с 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 после исполнения должен быть сброшен.
Надеюсь, это будет не большая правка. :)