antirez выпустил c64-hw-sim: симулятор платы Commodore 64 с поломками пинов

antirez опубликовал программу c64-hw-sim, которая попиново симулирует материнскую плату Commodore 64 ревизии ASSY 250407. В ней можно отогнуть ножку микросхемы, замкнуть её на землю или на +5 В, вынуть чип из панельки или «разорвать» резистор. После этого видно, что делает машина: картинку на мониторе, реакцию клавиатуры и каждый сигнал на плате.
Программа знает список соединений платы (netlist, электрические связи на печатной плате) и поведение каждой микросхемы на её выводах. Как выглядит сломанный Commodore 64, она не знает: если при имитации поломки экран заполняется мусором, этот мусор вычислен из схемы, а не выбран заранее человеком, который знал, чего ожидать.
Пример из README: отогните ножку 17 (A7) цветной памяти до включения питания, и машина загрузится и будет выглядеть исправной. Процессор пишет, а видеочип читает по одному и тому же неверному адресу, поэтому память просто «склеивается» сама с собой. Верните ножку на место, половина цветной памяти, в которую никогда не писали, покажется случайными цветами. Отогните снова, экран чистый. Автор пишет, что настоящая микросхема 2114 ведёт себя так же.
Автор называет две основные цели. Первая, разобраться, как устроен Commodore 64, на уровне, который трудно воспроизвести на живом железе без риска его повредить (на большинстве плат многие чипы не в панельках, а запаяны). Вторая, если у вас сломанный C64 и есть гипотеза о неисправности, можно смоделировать её и получить подсказки, чтобы выпаивать микросхемы в самом логичном порядке и как можно меньше: выпаивание утомительно и каждый раз грозит повредить плату. При этом автор оговаривает: совпавший симптом, подсказка, а не доказательство, разные неисправности могут выглядеть одинаково, а у симуляции есть пределы.
Скорость невысокая: даже на быстрых компьютерах реальный C64 симулируется лишь на 31% от своей скорости на Apple M3 Max, 39% на AMD Ryzen AI Max+ PRO 495 (Gorgon Halo) и 48% на Apple M5 Max. Для целей программы это не проблема, но играть в ней нельзя, это не эмулятор для игр.
Идея родилась у автора при работе с чипами Андре Вайсфлога (Andre Weissflog, floooh), эмуляторами 6502, VIC-II, CIA, SID и других микросхем, интерфейсом которых служат выводы. Следующим шагом стало доведение подхода «до логического предела»: попиновые модели всех остальных частей C64, ОЗУ, ПЗУ, логических микросхем, PLA и так далее. Ядра 6510, VIC-II, CIA и SID, тактово-точные ядра из проекта floooh; каждое сидит в «панельке», которая видит только его выводы. Ядра взяты из c64-llm (лицензия zlib), данные платы, из KiCad-реплики C64-250407-Replica-KiCad авторства bwack (лицензия CERN OHL), уравнения PLA, из считывания 82S100, выполненного Марком Смитом (Mark Smith) и Марко Мякеля (Marko Mäkelä).
Окно программы показывает плату, монитор, панель управления и осциллограф. Выводы подсвечены как на логическом пробнике: красный, высокий уровень, синий, низкий, жёлтый, пульсация, серый, «плавающий» вывод, пурпурный, два выхода борются друг с другом. Щелчок по выводу выводит его на осциллограф и позволяет сломать: оставить плавающим, замкнуть на GND или на +5 В. Щелчок по микросхеме вынимает её, по резистору, ферритовой бусине или кварцу, разрывает цепь. Панель управления перечисляет неисправности с кнопкой ремонта каждой и загружает файлы .prg: они пишутся прямо в микросхемы динамической памяти, как это делал бы картридж-«фризер», поэтому загрузка работает и на сломанной плате. Сборка, командой make, запуск./c64-hw-sim [program.prg]; программа работает на macOS и Linux (X11) через OpenGL.
Есть и режим без окна: например./c64-hw-sim --headless 200 --text --shot out.png --fault U17:removed прогоняет четыре секунды (200 кадров), печатает текст с картинки монитора так, как его прочёл бы человек, и сохраняет снимок. Неисправность задаётся как REF:что или REF.PIN:что:что, например U21.14:gnd или R51:open. Другие опции: --at для поломки и ремонта деталей на ходу, --nets для отчёта о цепях, где выходы конфликтовали, C64HW_TYPE для набора текста после загрузки, C64HW_CHECK=1 для сверки каждого чтения KERNAL и каждой выборки VIC с идеальной картой памяти, --record для сохранения кадров окна. Скрипт tests/faults.sh прогоняет 31 типовую неисправность; ожидаемый симптом каждой был записан до запуска симулятора. Инструмент tools/kicad2c.py превращает KiCad-реплику платы в таблицы на C: 216 деталей с их площадками и 249 цепей.
Модель электрики устроена так: каждый вывод задаёт уровень в цепи сильно, слабо (подтяжка), через замыкание на питание или не задаёт вовсе; побеждает сильнейший, при равной силе возникает конфликт и побеждает низкий уровень. Цепь, которую не задаёт ни один вывод, хранит заряд и затем дрейфует: примерно к 1,4 В за микросекунды, если её нагружают входы ТТЛ, и к нулю за долю секунды, если на ней только МОП-входы. Входы сравнивают это напряжение (плюс немного шума) со своим порогом, поэтому «плавающая» линия читается неустойчиво. Микросхема без VCC мертва, без GND её выходы «плавают» высоко, а КМОП-микросхема продолжает работать на «фантомном» питании, которое приходит через защитные диоды выводов. Шум задан зерном, поэтому прогон можно повторить точно.
Ограничения автор перечисляет сам. Модели плавающих линий и питания имеют правильную форму, но их числа (пороги, времена дрейфа, перекрёстные наводки), догадки, они лежат константами в src/sim.c. Аналоговые части не симулируются: видеовыход, фильтр SID, блок питания и ФАПЧ точечной частоты. Неисправности внутри микросхем (например, плохие ячейки DRAM или медленные детали) и перемычки между двумя цепями запланированы, но не сделаны.
Ключевые факты
- c64-hw-sim попиново симулирует материнскую плату Commodore 64 ревизии ASSY 250407: можно отгибать ножки, замыкать их на GND или +5 В, вынимать микросхемы и разрывать резисторы.
- Поведение неисправностей вычисляется из схемы платы (216 деталей, 249 цепей из KiCad-реплики bwack), а не берётся из заготовленных симптомов; tests/faults.sh прогоняет 31 типовую неисправность.
- Симулятор работает на 31% реальной скорости на Apple M3 Max, 39% на AMD Ryzen AI Max+ PRO 495 и 48% на Apple M5 Max, для игр не годится.
- Ядра 6510, VIC-II, CIA и SID взяты из чипов Андре Вайсфлога (floooh), остальные части платы смоделированы попиново.
- Автор честно оговаривает пределы: числа в моделях плавающих линий и питания, догадки, аналоговые части не симулируются, поломки внутри чипов и перемычки между цепями пока не сделаны.
Почему это важно
Обычно эмуляторы воспроизводят поведение исправной машины. Здесь цель другая: показать, что происходит на плате при поломке, причём симптомы не записаны заранее, а вычисляются из схемы и поведения чипов на выводах. Пример с цветной памятью (отогнутая ножка A7, машина выглядит здоровой, потому что память «склеивается» сама с собой) хорошо показывает, как работает такой подход. Это редкий инструмент и для обучения устройству C64, и для подготовки к ремонту.
Кому это важно
Владельцам и ремонтникам Commodore 64, которым нужно решить, какие микросхемы выпаивать и в каком порядке. Энтузиастам ретрокомпьютеров и тем, кто хочет понять, как плата устроена на уровне выводов, не рискуя живым железом. Разработчикам эмуляторов тоже может быть любопытен подход с попиновыми моделями поверх ядер floooh.
Как это применить
Сборка, make, запуск./c64-hw-sim [program.prg] на macOS или Linux (X11) с OpenGL. В графическом режиме щёлкайте по выводам, микросхемам и резисторам, чтобы ломать их, и смотрите на экран, осциллограф и подсветку выводов. Для сценариев есть режим без окна: --headless с --fault, например U17:removed или U21.14:gnd, плюс --at для поломки на ходу. Если у вас есть гипотеза о неисправности, смоделируйте её и сравните симптомы с реальной машиной. Сведений о лицензии самой программы в README нет.
Можно ли доверять
Источник, README самого проекта, то есть слова автора, независимой проверки в материале нет. Автор сам предупреждает: совпавший симптом, подсказка, а не доказательство; числовые константы моделей плавающих линий и питания, догадки. Заявление о том, что настоящая 2114 ведёт себя так же, как в примере с цветной памятью, остаётся словами автора. Для 31 типовой неисправности ожидаемые симптомы были записаны до запуска симулятора, но результаты этих тестов в источнике не приведены.
Риски и подводные камни
Симуляция идёт медленно (31-48% реальной скорости на трёх названных машинах), играть в ней нельзя. Поддерживается только плата ASSY 250407. Не симулируются видеовыход, фильтр SID, блок питания и ФАПЧ точечной частоты; не реализованы неисправности внутри чипов (плохие ячейки DRAM, медленные детали) и перемычки между цепями. Из-за этого часть реальных поломок воспроизвести не получится, а разные неисправности могут давать одинаковую картину, решать о выпаивании только по симуляции не стоит.
«Совпавший симптом, это подсказка, а не доказательство: разные неисправности могут выглядеть одинаково, а у симуляции есть свои пределы.»
— antirez, README проекта c64-hw-sim