Учитывая то, что AC у него формируется неверно, странно.
Новая версия на сайте.
Вид для печати
Я загружаю данные в монитор реала используя временный выход в загрузчик, без промежуточной подготовки WAV-файлов (или прямой загрузки) в MON-формате из эмулятора.
Новая версия эмулятора VV на сайте.
Добавлено через 13 минут
Вечером прогоню на реале - отпишусь.
Я же говорю, если оставить ANA как в версии 5.71 и просто проинвертировать флаг АС, то тест непроходит, значит это неправильно, значит ты гдето разницу просто незаметил. Сделал я по своему, я неутверждаю что это истина, но покрайней мере тест проходит, мне интересно как у b2m этот флаг расчитывается?
Добавлено через 4 минуты
DAA я тоже исправил, описание ее работы (флага АС) есть в базовой книжке от вектора по ассемблеру. могу сказать точно, что 8080 незапоминает вычитание или сложение было до команды DAA в отличии от Z80.
Я немножко опоздал, мне штрафную пожалуйста.
Сейчас попробовал для затравки инвертировать бит АС в команде "-1" в ALU. Тест №11 пролетел, но обломалось дальше. Кто мне поможет интерпретировать результат теста:
Вроде b2m уже все разобрал, инструкция была RLC, аккумулятор был 56H, получилось 46H в флагах вместо ожидаемых 59H.Код:Instruction sequence was 070000H
Register f contains 46H
But should contain 59H
Register value before instruction sequence was 56H
Test Number 0015H
Я сижу с даташитом от 8080, карандашом и бумажкой и никак не могу понять, как в регистре F может оказаться число 59H. Бит 3 должен быть всегда "0", бит 1 всегда "1". С такими битами девятка в младшем нибле не получается.
svofski, Это похоже глюк теста, просто если команда заработает правильно, то тест пройдет дальше
Ничего инвертировать не надо. В командах ANA/ANI у меня он устанавливается в ИЛИ третьих битов операндов. Можно даже научно обосновать, почему так происходит.
Очевидно, флаг AC делался с учётом того, что он формируется в операции сложения. Тогда:
a3=0, b3=0 -> AC=0
a3=1, b3=1 -> AC=1
a3=0, b3=1, r3=1 -> AC=0
a3=0, b3=1, r3=0 -> AC=1
a3=1, b3=0, r3=1 -> AC=0
a3=1, b3=0, r3=0 -> AC=1
где a и b - операнды, r - результат
Однако для логического И результат однозначно определяется соответствующими битами и пару строк можно выкинуть, останется:
a3=0, b3=0 -> AC=0
a3=1, b3=1 -> AC=1
a3=0, b3=1, r3=0 -> AC=1
a3=1, b3=0, r3=0 -> AC=1
что и соответствует логическому ИЛИ :)
Если бы в ORA/ORI флаги переноса не обнулялись, то значение AC было бы равно логическому И третьих разрядов. Парадокс :)
Добавлено через 14 минут
Подозреваю, что в процессоре сделано типа так:
AC = (a3 & b3) | ( (a3 ^ b3) & ~r3 )
Реальные результаты теста TestDAAfull и тест команды ANA с результатами (real,vv571,vv572).
Как я и предполагал, у меня были ошибки эмуляции DAA. Теперь, надеюсь, нету. По крайней мере тест ivagor-а совпадает с реальными данными, спасибо ему.
Отдельное спасибо Tim0xA-е, за реальные данные.
b2m, поздравляю! Тест "8080 instruction exerciser" в последней версии эмулятора дал результаты, идентичные реальным. На сегодняшний день я не знаю таких тестов, которые могли бы выявить расхождения между реалом и твоей симуляцией ВМ80А. Вектор можно убирать в шкаф. Все результаты в виде скриншотов выложены. Ramiros и svofski, не сдаваться! :)