BreaksCore

Нативное C++-ядро: материнские платы, разводка чипов и debug-хаб — плюс два фронтенда: приложение WinForms и SDL2-порт

BreaksCore — нативная часть эмулятора: эмулятор NES/Famicom/Dendy на уровне вентилей, на котором построены оба фронтенда. Поверх нативного ядра расположены два приложения: управляемое приложение WinForms (Breaknes) и, для тех, кто любит минимализм, сборка Breaknes на SDL2 (BreaknesSDL).

BreaksCore

Нативная часть эмулятора.

Абстрактная плата

Абстрактная материнская плата используется как базовый класс для всех остальных вариантов NES/Famicom/Dendy.

Для создания экземпляра материнской платы используется Board Factory:

Пока это немного абстрактно, но позже мы свяжем классы между собой.

Платы

Список поддерживаемых плат.

Famicom

Планируется симулировать плату Generic Famicom следующим образом:

Плата Famicom — схема в Logisim

NES

Планируется симулировать плату Generic NES следующим образом:

Плата Generic NES

Dendy/Subor/Phantom/Whatever

TBD.

Bogus Board

BogusBoard — материнская плата по умолчанию, если BreaksCore не распознал тип платы при создании экземпляров или были переданы другие ошибочные параметры.

BogusBoard

Эта система содержит 64 Кбайт ОЗУ, процессорное ядро 6502 и больше ничего.

Иными словами, это минимальная вычислительная система, позволяющая проверить, тикает ли что-нибудь в эмуляторе.

Плата PPUPlayer

Специальная debug-плата для PPUPlayer.

Плата PPUPlayer

Плата содержит PPU, окружающую логику (Address Latch, VRAM) и частичную поддержку картриджного разъёма (используются только выводы PPU/CHR).

Плата APUPlayer

Ещё одна debug-плата для «проигрывания» дампа регистров APU.

Плата APUPlayer

Она примерно такая же, как PPUPlayer, но проще: APU не требует картриджного разъёма и дополнительных привязок, связанных с ним.

Сэмплы DPCM загружаются в расширенную память объёмом до 64 Кбайт (WRAM).

Debug Hub

Отладочная инфраструктура Breaknes.

Предупреждение: текущая реализация основана на строковых ассоциативных списках и не может считаться сверхбыстрой.

Поскольку Breaknes — эмулятор на уровне вентилей, главный фокус отладки — наблюдение за различными сигналами, шинами и другими внутренними состояниями эмулируемой системы.

Сущности отладки разделены на следующие категории:

Debug Hub

DebugInfo

Со стороны GUI DebugInfo отображается как PropertyGrid. PropertyGrid заполняется динамически на основе записей отладочной информации, возвращаемых нативным ядром Breaknes.

Типы отладочной информации (DebugInfoType):

Методы:

MemLayout

Различные области памяти внутри эмулируемой системы описываются структурой MemDesrciptor.

Методы:

Управляемое приложение (Breaknes)

Эмулятор NES/Famicom/Dendy на уровне вентилей.

Два телевизора (issue #515)

Эмулятор поддерживает до 2 виртуальных телевизоров. Видеосигнал каждого PPU материнской платы привязан к телевизору; привязка настраивается в BoardDescription.json:

Выберите в настройках debug-плату («NES Debug: one PPU on two TVs (horizontal)» или «NES Debug: one PPU on two TVs (vertical)»), чтобы увидеть окно с двумя телевизорами в действии.

Сборка

Используйте VS2022.

Чтобы нативная и управляемая части генерировались в одну папку Build, нужно воспользоваться этим:

https://docs.microsoft.com/en-us/answers/questions/202445/output-path-ignored-with-net-5-c-classes-lib.html

SDL2-порт (BreaknesSDL)

Для тех, кто любит минимализм — сборка Breaknes на SDL2.

Реализация не отличается от управляемого приложения: используется та же нативная часть BreaksCore. Ревизии материнской платы и чипов берутся из BoardDescription.json (рядом с исполняемым файлом — файл общий с управляемым приложением): SDL-сборка ищет плату по имени, конфиг обязателен (встроенного запасного варианта нет).

Выбор платы

По умолчанию используется запись NES (NES-CPU-07, 1987) из BoardDescription.json. Любую другую плату из того же файла можно выбрать в командной строке:

breaknes --board "NES-101 (NESN-CPU-JIO-01, 1994-1995)" game.nes

Два телевизора (issue #515)

SDL-сборка отображает видеосигнал каждого подключённого телевизора в одном окне. Поддерживается до 2 телевизоров; физическое расположение управляется свойством tv_layout платы в BoardDescription.json:

Привязка PPU к телевизорам описывается массивом tvs (tvs[i] = индекс PPU, показываемого на i-м телевизоре). Привязка по умолчанию: TV[i] показывает PPU[i]; для отладки один PPU можно привязать сразу к обоим телевизорам ("tvs": [0, 0]).

Подсистема ввода-вывода

Подсистема ввода-вывода встроена в SDL-сборку (issue #516). В качестве источника событий ввода используется SDL2 Input:

Устройства (контроллеры Famicom/NES/Dendy, виртуальные контроллеры), их привязки IOState к событиям ввода и статус Attach/Detach к портам материнской платы настраиваются интерактивно:

breaknes --ioconfig [config_path]

Логика конфигуратора основана на диалоге настроек IO управляемого приложения (Breaknes/FormIOConfig.cs): пул устройств (добавление/удаление), привязки (IOState <-> событие ввода) и Attach/Detach к портам.

Настройки IO хранятся отдельно от управляемого приложения (по умолчанию — IOConfigSDL.json, управляемое приложение использует собственный IOConfig.json), поэтому настройки никогда не пересекаются. При запуске эмулятор загружает настройки из того же файла и подключает настроенные устройства.

Примечание: в SDL-сборке у виртуальных контроллеров нет экранных диалогов; ими управляют привязанные события клавиатуры/геймпада, как обычными контроллерами.

Источник: Breaknes/BreaksCore/Readme.md, Breaknes/Breaknes/Readme.md, Breaknes/BreaknesSDL/Readme.md · страница входит в сайт документации.