ivagor, готовь тест :)
Вид для печати
Tim0xA
Итак, состряпал нечто похожее на тест установки флагов командой sub d (легким движением руки превращается в тест других подобных команд)
Нужно делать 4 прогона, записывая по адресу 830B команды lxi h,0000 (так исходно); lxi h,8000; lxi h,00FF; lxi h,80FF (младший байт - то, что будет в регистре флагов перед sub d; старший - исходное значение рег-ра A, в ходе теста оно будет увеличено на 127).
Тест предлагаю делать в Мониторе 3.5, тем более он у тебя прошит в ПЗУ. Стартуем в режиме 1 (9400-9FFF, E000-FFFF)
На всякий случай желательно сделать XS и задать 100, хотя это вроде только для трассировки, а так стек устанавливается отдельно.
Загружаем (или набираем) testpsw.
Запуск C8300
В адресах 0200-81FF теперь лежит результат
Задаем имя IPSW0000
Выгружаем W200,81FF
Потом остальные варианты - модифицируем команду по адресу 830B - исходно было lxi h,0000; потом делаем lxi h,8000; lxi h,00FF; lxi h,80FF
Желательно задавать имя сохраняемого файла аналогично аргументу lxi h - PSW0000, PSW8000, PSW00FF, PSW80FF
После загрузки в PC и сохранения как участка памяти из VV можно объединить фрагменты, например так
copy /b psw8000 + psw0000 psw00
copy /b psw80FF + psw00FF pswFF
(логичнее объединять именно так, т.к. стек идет от старших адресов к младшим, и при таком объединении не будет "скачка аргументов" на стыке)
В качестве примера я приложил результаты прогонов в VV (на ВМ80, ВМ1 и Z80) и в TDV (там только ВМ80).
Как нетрудно убедиться, VV и TDV при выполнении sub d обрабатывают флаги совершенно одинаково.
Также видно, что ВМ80, ВМ1 и Z80 устанавливают флаги по разному :)
Обнаружилась, как я считаю, неточность в эмуляции ВМ1 - sub d влияет на флаг MF (бит 3), поэтому pswVV_00_vm1 и pswVV_FF_vm1 одинаковые. По моим представлениям на MF должны влиять только команды SMF0, SMF1 и POP PSW, поэтому pswVV_00_vm1 и pswVV_FF_vm1 должны отличаться значением бита 3 в каждом байте.
Если я что-то не учел, не заметил или ошибся - поправьте, ведь есть шанс совершить прорыв в точности эмуляции КР580ВМ80 :)
ivagor, выполнил тесты, три выгрузил (в приложении), на четвертом комп притормозил, запись была нарушена, но в ней похоже уже нет смысла, т.к. судя по результатам тестов в эмуляции ВМ80А нужно проинвертировать флаг вспомогательного переноса AC.
Вон оно как оказалось...
Чтож, теперь ждем вердикта от Ramiros-а, что он скажет...
Действительно, достаточно инвертировать флаг доп. переноса в командах вычитания:
Выяснение этого вопроса заняло примерно 9 лет :)
Всем спасибо! совместными усилиями мы это сделали! :)
Добавлено через 11 минут
Весь прикол похоже в том, что ВМ80 в командах вычитания сначало внутренне получает дополнительный код вычитаемого, а потом вместо вычитания делает сложение. Наверное к ВМ1 это тоже относится. Кстати косяк с флагом MF в ВМ1 действительно был, но он сидел в команде POP PSW.
И что теперь делать с командой DAA? Оставить так, как есть?