Речь была про эмулятор VV автору эмулятора.
Но спасибо за информацию.
Вид для печати
Речь была про эмулятор VV автору эмулятора.
Но спасибо за информацию.
Читал здесь, что с игрушкой pillars у всех эмуляторов проблемы. Но не очень понял - из-за чего именно они происходят?
Загорелся я тут недавно идеей написать собственный эмулятор "Вектора-06Ц" (когда-то в юности это был мой первый свой комп ;) ). И уже почти сделал это. Под win. Почти все программы работают. Кроме pillars. Не могу найти причину... :(
Вижу, что в "Virtual Vector" pillars работает. Может народ подскажет - в чём там засада? Куда копать?
Вот тут ответ был, вроде. Особенности работы процессора, которые следует учесть в эмуляторе.
Может быть у эмуляторов были проблемы 15 лет назад, но мир не стоял на месте. Мы все усердно трудились все эти годы и вот сейчас, в 2024, насколько я знаю, сейчас нет эмуляторов, у которых эта проблема сохранилась ;)
Копать надо в обработку флага дополнительного переноса в инструкции SUB.
Так копал уже.
Сделал тест, в котором "SUB C" вычисляется в цикле для всех возможных значений A=0...0xFF и для значений C=0...0x40 с предварительно всеми сброшенными флагами и предварительно всеми установленными. Сохраняя регистр флагов после каждой операции. Запустил этот тест на своём эмуляторе и на VV, сравнил дампы результата - совпадение полное. Может конечно в оставшемся диапазоне C=0x40...0xFF косяк, но как-то маловероятно.
Я могу предложить две вещи:
1) прогнать на своем процессоре 8080 Exerciser https://github.com/begoon/8080ex1 -- тест брутальный и выявляет любые неточности
2) сравнить свой код с кодом Begoon https://github.com/begoon/i8080-core...r/i8080.c#L172
rst, а что у тебя за эмуль, можно ли нам на него глянуть ?
Спасибо! Если иначе найти не получится - буду пробовать.
Ещё такой вопрос:
При выполнении "теста CPU" из "Теста устройств" базового набора программ своим эмулятором я вижу значения измеренной производительности:
624тыс.оп и 749тыс.оп. Но вроде как память подсказывает, что на реальном Векторе результаты были: 623тыс.оп и 748тыс.оп.
Т.е. получается - что-то у меня выполняется слишком быстро? По идее - команды не должны, тогда бы разница была гораздо существеннее. Есть подозрение, что у меня установлена неверная длительность входа в прерывание. Я её задал равной длительности команды "RST 7". Но, возможно, нужно больше тактов добавить.
Может кто подсказать по длительности входа в прерывание на реальном "Вектор-06Ц"? (который без доработок, оригинальный Кишинёвский).
Или всё-таки мне память изменяет, и тест на реальном Векторе тоже мог показывать 624/749?
- - - Добавлено - - -
У меня свой. Я его ещё только пишу. Ему всего только месяц от роду. :v2_dizzy_egg:
Пока он ещё очень сырой. Ещё не приступал к эмуляции ВИ53 и вообще звука. Также пока плохо проработано маппированние клавиатуры. Займусь ими когда полностью выгребу все вопроосы по корректной эмуляции команд и работе разных программ.
Осталась одна pillars. Других неработающих больше не нашёл.
Но зато в моём эмуляторе уже более навороченный и удобный (на мой взгляд!) встроенный отладчик, чем в VV. Да простит меня автор VV. Тысяча извинений! Его эмулятор реально крут!.... за исключением встроенного отладчика. ;)
Как более-менее допилю - поделюсь. Если конечно кому интересно.
Не зная других деталей трудно подсказать. Вход в прерывание такая же инструкция, как и все остальные. Может быть дело в торможении процессора? У Вектора время каждого машинного цикла округляется вверх до чиста тактов, кратного четырем. За одно прерывание исполняется 59904 такта, 312 строк по 192 такта.
Оп! А здесь можно подробнее? Почему 59904, а не 3e6/50=60000 ? Процессор останавливается сигналом прерывания на 96 тактов?
Наверное это можно почерпнуть из схемы, но.... долго разбираться. Поэтому буду благодарен за пояснения.
PS: Если так, то всё понятно: (96/6e4+1)*748 = ~749тыс.оп; и (96/6e4+1)*623 = ~624 тыс.оп
Как раз получаются мои показания. Спасибо!
rst, Pilars использует особенность реализации команды вычитания через сложение, т.е. i8080 на самом деле выполняет не вычитание, а сложение с числом в дополнительном коде и флаг дополнительного переноса при этом получается инвертированый, если сравнивать его с этой же командой SUB на i8086, там этот баг уже пофиксили.
В общем - pillars заработала. Проблема была не в эмуляции команд, а в неверной эмуляции работы с прерываниями. Из разных кривых описаний в сети я решил, что во время действия запрета прерывания, новое событие запроса прерывания защёлкивается. И хранится до момента разрешения прерываний. И активируется после разрешения. И только команда DI сбрасывает ждущий запрос прерывания (если он есть).
Оказывается - никакого запоминания запроса нет. Если на момент запроса прерывания запрещены - запрос просто игнорируется.
Сразу после исправления этого, pillars и заработала.
rst, мой эмулятор тоже споткнулся об игру pillars. Оказалось что я забыл выставить неиспользуемые биты регистра флагов в нужные значения при выполнении pop psw. Хотел посоветовать посмотреть в эту сторону, а ты уже разобрался. Отлично! :)
Кстати про дебагинг. Интересно глянуть на функционал который у тебя в эмуляторе. Я тоже добавил некоторые фишки в свой.
Все обычно почему-то спотыкаются на флагах. Но я - на другом. ;)
Как только более-менее закончу - поделюсь. Пока ещё слишком сырой - много чего не доделано или сделано на скорую руку.
Но некоторые вещи (типа эмуляции звука) у меня работают уже лучше, чем у существующих эмуляторов. ;)
Под программой я подразумевал программу для вектора, которую запускаем в эмуляторе и слышим разницу с другим эмулятором или реалом.
Субъективно о качестве звука в эмуляторах
Основная проблема для эмуляторов - ШИМ во всех его проявлениях (и "преднамеренный" шим и биперная музыка). Остальное сравнительно легко поправить. Сам условно делю современные эмуляторы на 1) группу с качеством получше: лидер v06x и на втором месте Emu80; 2) с качеством похуже: VV и Emu. У VV и Emu свои фишки, на звуке свет клином не сошелся, но мне, например, он очень важен. Пару раз очень кратко пробовал Devector в win10, и он приятно удивил качеством звука, но это было мельком и сложного почти ничего не попробовал.[свернуть]
Забавное наблюдение по эмуляции процессора КР1821ВМ85А (он же i8085)... Вот такую картинку выдаёт программа clrspace в эмуляторе EMU:
Вложение 81328
А такую в эмуляторе VV:
Вложение 81327
И та же программа на реале выглядит вот так, в нормальном режиме работы ПК-6128ц:
https://s1.hostingkartinok.com/uploa...e878a0b365.png https://i.ibb.co/nDVBqcF/IMG-20240930-normal.jpg
Приведу вариант и в "ускоренном" режиме, хотя этот результат тут не имеет особого значения:
https://s1.hostingkartinok.com/uploa...ac7727127b.png https://i.ibb.co/28VDQdD/IMG-20240930-vtec.jpg
В то же время оба эмулятора и реал (в нормальном режиме) показывают одинаковые результаты в тесте vstvi53. Сама программа clrspace, как я понимаю, имеет чёткое выравнивание по тактам процессора КР580ВМ80А и то, что картинка искажается на ВМ85, вроде, удивления не должно вызывать, но по факту имеем три разных варианта этих искажений. :)
Я бы поставил не на процессор, а на отличие в моменте прихода прерывания или каких-то других моментах связанных с разверткой. Эти особенности 6128 не тестировались.
- - - Добавлено - - -
Просто в качестве забавного факта. У меня есть версия clrspace, которая в emu выглядит как на приведенном фото реала. Но скорее всего это я ее (эту версию clrspace) испортил/модифицировал, и на реале она дала бы другую картинку.
Не совсем. Если запустить моделирование схемы ПК-6128ц, то там микросхемы К155РУ2 блокируются 8 раз на время ССИ перед КСИ и на 8 строк в конце сигнала КСИ, в это время палитру нельзя записать:
Вложение 81331
Если ошибок в перерисовке схемы нет, то в реале было также, а в моей схеме это было исправлено и запись палитры доступна в любой момент. А как запись палитры была реализована в эмуляторах -- не могу сказать...
В них даже для 06Ц зоны непрограммируемости не реализованы, кроме VV при включении соответствующей опции, вряд ли с 6128 ситуация лучше. Хотя помню, что по крайней мере в старых версиях Emu (скорее всего так и в новых) для 6128 была странность с непрограммируемостью палитры сразу после прерывания.
Вчера добавлял поддержку формата .cas в свой эмулятор. Добавлял, основываясь на анализе .cas-файлов, которые нашёл.
Всё уже работает (по-крайней мере - те .cas-файлы, которые нашёл - все нормально запускаются), но возможно что-то я упустил. Поэтому есть несколько вопросов:
1. В .cas-файлах могут храниться только Бейсик-программы? или могут быть и какие-то другие?
2. Формат .cas (как я его понял, основываясь на реверсе):
а) 0xD3,0xD3,0xD3,0xD3;
б) ASCII-имя_файла, завершающееся тремя 0x00 подряд;
в) 0x55[0 ... k байт. подряд], завершается 0xE6 (каково макс. возможное значение k?);
г) 0xD3,0xD3,0xD3,0x00;
д) тело_программы [1...n байт];
е) 2 байта контрольной суммы.
Всё ли правильно?
И особенно интересен пункт "в": Может ли вместо 0xE6 быть его инверсия =0x19? И если да - тогда все байты после неё нужно инвертировать?
В тех .cas-файлах, что удалось найти, везде только 0xE6.
В этом формате могут храниться файлы Бейсика, записанные по команде CSAVE, BSAVE и файлы Монитора-отладчика.
Там примерно так должно быть:
Формат CSAVE в CAS следующий:
- 4 байта 0D3h
- имя (до 127 байт)
- 3 байта 0h
- заголовок 768 байт 55h
- синхробайт 0E6h
- 3 байта 0D3h
- байт 0h
- байты файла ==========
- 3 байта 0h
- младший байт контр. суммы всех байтов файла без переноса
- старший байт контр. суммы всех байтов файла без переноса
Формат BSAVE в CAS следующий:
- 4 байта 0D2h
- имя (до 127 байт);
- 3 байта 0h
- заголовок 256 байт 0h
- синхробайт 0E6h
- ст., мл. байт адреса начала;
- ст., мл. байт адреса конца;
- байты файла ==========
- 1 байт контр. сумма всех байтов файла без переноса
Формат Монитора-отладчика совпадает с BSAVE, только имя файла ограничено до 11 байт.
Некое описание форматов Вектора я собрал вот тут, если что...
Ok. Значит я правильно разобрал .cas-формат. И всегда только 0E6h. Без инверсии.
Вот тут неясность: Я считал, что эти 3 байта 0 - входят в тело файла. И их туда включаю. В Бейсике (который в базовой поставке, v2.5 вроде) есть две ячейки в памяти, в которых хранится начало и конец программы в ОЗУ. И, если исходя из их содержимого вычислить размер программы, то он будет включать в себя эти 3 хвостовых 0.
У меня в эмуляторе так описаны ячейки Бейсика:
enum {BASIC_PRG_CSUM = 0x4015, BASIC_PRG_START = 0x4043, BASIC_PRG_END = 0x4045};
Эти: BASIC_PRG_START, BASIC_PRG_END.
Вот за это - Большое Спасибо! Получается, что .cas может содержать не только Бейсик-программы, но и в кодах. И что по содержимому их можно различать. Добавлю в свой эмулятор это.
Возможно и так, по крайней мере я в скетче ардуино-плеера заремил вывод этих трёх нулей, пометив, что они должны быть в файле BAS... Но в любом случае, без нулей в конце программы Бейсик будет выдавать ошибку, поэтому пометил этот момент в формате вывода.
- - - Добавлено - - -
Да.
Похоже - у "Virtual Vector" сносит крышу, если в Бейсике в команде BSAVE указать начальный адрес больше конечного. Пишет в файл какой-то мусор.
В VV 7.15 в конфиге z80 c тактовой 12 МГц тест при запусках/перезапусках может каждый раз выдавать разные странные результаты. При 3 и 6 МГц нормально.
В Emu ошибка в конфиге Vector06c-Z80.cfg
Если включено обращение стеком к квазу и приходит прерывание, то адрес возврата запишется в основную память, не в кваз.
Если это дань аутентичности, то для consistency и ret должен читать из памяти, а не из кваза.
Тут вопрос еще в том, на какой частоте должен работать таймер при разгоне проца, на половинной от ЦПУ, или на фиксированной? Проблема с тестом происходит из за того, что при частоте ЦПУ свыше 6 МГц таймер начинает делать пропуски относительно ЦПУ и пропуски эти сделаны по принципу - после каждой команды ЦПУ выполняем обработку таймера, или пропускаем, и все бы ничего, но команды ЦПУ имеют разную длину по тактам поэтому и торможение получается не очень равномерное. Можно сделать, чтобы таймер после 6МГц тоже разгонялся вместе с СПУ, тогда все будет стабильно работать.
У меня нет сомнений или вопросов по поводу таймера в клонах вектора, частота таймера фиксированная 1.5 МГц (кроме кристы 2), тем более советские ВИ53 просто не тянут 3 МГц. Во всех известных высокочастотных векторах (реализации в FPGA и турбо+) используется этот подход, в турбо+ дополнительно проц тормозится при обращении к старым микросхемам, чтобы они успевали.
Если в современном клоне вектора предполагается использование микросхем таймера способных работать на более высоких частотах или реализация в FPGA, то эти более высокие частоты должны переключаться явным образом (вероятно через какой-нибудь порт). Примеров такого на данный момент не знаю.
- - - Добавлено - - -
Ситуация с таймером аналогична AY, его же частоту не увеличивают при увеличении частоты проца. А таймер в векторе тоже звуковое устройство.