Breaknes — дайджест изменений

PR #518 – #526 · 30–31 августа 2026 · эмулятор NES/Famicom/Dendy на уровне вентилей

Шесть pull request'ов, влитых в main с 30 по 31 августа 2026 года. Направления: единая система журналирования (#518), доведение SDL2-порта до паритета с управляемым приложением (#519), инфраструктура нескольких экранов с привязкой PPU⇄TV (#520), приведение базы плат к реальным ревизиям материнских плат (#522), фирменная иконка (#524) и переработка модели картриджных плат (#526).

#518

Журналирование с управлением на этапе компиляции

автор: ogamespec 30 августа 2026 45 файлов · +1605 −17 issue #517

Разрозненные printf-трассы заменены единой макросной системой логирования (Common/BaseLogicLib). Ключевое решение — два уровня управления: на этапе компиляции (в Release-сборках кода логирования нет вообще, с по-системными переопределениями) и на этапе выполнения (маска источников, отдельная маска категорий на источник, вывод в файл и stdout). Категории принадлежат самим компонентам: каждая подсистема объявляет свой enum категорий и публичный SetLogMask().

Что изменилось

  • Трассы добавлены во все подсистемы: 6502 (сброс, NMI/IRQ, записи на внешнюю шину), APU (OAM DMA, регистры), PPU (регистры CPU-интерфейса, VBlank NMI), MMC1, CartPcb (обращения к памяти, захват latch), Board (жизненный цикл платы — замена прежних printf) и IO (контроллеры, подключение устройств).
  • BreaksCore регистрирует источники с категориями и открывает API логирования управляемому приложению.
  • В настройках появился диалог FormLogging: чекбоксы по источникам и категориям, запись в файл / stdout.

Ссылки: PR #518 · issue #517

#519

IO-подсистема перенесена в SDL2-порт

автор: ogamespec 30 августа 2026 14 файлов · +1720 −13 issue #516

SDL2-порт получил ввод с контроллеров, которого у него не было: события SDL2 (клавиши, геймпад — кнопки, стики, триггеры) превращаются в события устройств и раздаются по биндингам на устройства, подключённые к материнской плате, — по той же схеме, что и в управляемом приложении. Конфигурация хранится отдельно (IOConfigSDL.json), чтобы не пересекаться с конфигом управляемой версии.

Что изменилось

  • Интерактивный конфигуратор (breaknes --ioconfig): пул устройств, биндинги актуаторов (ожидание события ввода), подключение и отключение устройств к портам платы.
  • Идентификаторы устройств берутся из общего enum IO::DeviceID вместо захардкоженных значений.
  • Починены сборки: в CMake добавлен пропущенный при рефакторинге #509 CartPcbPort.cpp; JsonLib исправлен для Linux (компиляция, сериализация Int через %llu).

Ссылки: PR #519 · issue #516

#520

До двух экранов: привязка PPU⇄TV

автор: ogamespec 30 августа 2026 37 файлов · +1392 −248 issue #515

Инфраструктура для плат с несколькими PPU. У платы теперь список PPU, каждый привязывается к виртуальному TV Set, окно эмулятора показывает до двух экранов в горизонтальной или вертикальной компоновке; для отладки один PPU можно вывести сразу на оба экрана. Много-PPU разводка (несколько PPU в одной плате) — следующий шаг (NES-аркады); сейчас готовы PPU-список, привязка, схема JSON и API.

Что изменилось

  • BoardDescription.json: поля ppus, tvs, tv_layout; отладочные платы «один PPU на двух TV» (горизонталь / вертикаль).
  • Управляемое приложение: экраны сводятся в единый битмап окна через TvWall (512×240 / 256×480); одиночный TV растягивается на окно, как в мультиэкранном режиме.
  • SDL2-порт: читает BoardDescription.json вместо захардкоженной платы, опция --board, окно рендерится один раз за кадр.

Ссылки: PR #520 · issue #515

#522

База плат приведена к реальным ревизиям

автор: ogamespec 30 августа 2026 12 файлов · +557 −143 issue #521

Список плат был набран произвольно и противоречил исследованию реальных ревизий материнских плат (например, «NES-101 (NESN-101 PCB)» не существует; Famicom-платам независимо от эпохи приписывались RP2A03G/RP2C02G). База приведена к документу ревизий из репозитория breaks31 реальная плата с корректными маркировками чипов по эпохам.

Что изменилось

  • Famicom HVC-CPU-01…08 и GPM, AV Famicom HVCN-CPU, NES-001 NES-CPU-01…11, NES-101 NESN-CPU/JIO/AV, региональные (PAL, Comboy, Playtronic) — с правильными чипами для каждой эпохи.
  • Неподдерживаемые ревизии чипов резолвятся таблично к ближайшей поддерживаемой модели вместо деградации платы до Bogus — с записью в лог при создании платы.
  • PPUSim: поддержка RP2C02H — ранее неинициализированный H/V-декодер давал чёрный экран.
  • SDL2-порт по умолчанию — реальная плата NES (NES-CPU-07, 1987); NESBoard стала отладочной «один PPU на двух TV».
  • Мелочи: JSON-конфиги копируются в выходные каталоги; при отсутствии сохранённой платы в базе берётся первая.

Ссылки: PR #522 · issue #521

#524

Иконка проекта

автор: ogamespec 31 августа 2026 10 файлов · +1558 −0 issue #523

У проекта появилась фирменная иконка на основе DALL-E арта. Генератор (Artwork/gen_breaknes_icon.py) квадратно кадрирует исходник и производит PNG-мастер 256×256, многоразмерную Windows-иконку .ico (16–256 px) и C++-заголовок со встроенными пикселями 64×64 для SDL2-порта: иконка окна не требует загрузчика изображений и работает одинаково в Windows и Linux.

Что изменилось

  • Иконка установлена в окно управляемого приложения и SDL2-порта.
  • Скрипт-генератор позволяет перегенерировать все артефакты (PNG, ICO, C++-заголовок) из одного исходника.

Ссылки: PR #524 · issue #523

#526

CartPcb: scroll-перемычка, клеевая логика чипами, фолбэк по iNES

автор: ogamespec 31 августа 2026 23 файла · +883 −106 issues #525, #514

Три связанные переработки модели картриджных плат. (1) У PCB нет «мирарринга» — есть паяная перемычка, выбирающая схему скролла, а конкретное H/V значение — параметр экземпляра картриджа, выводимый из iNES-заголовка. (2) Клеевая логика UNROM/AOROM моделируется реальными чипами, а не абстрактным latch. (3) Дампы без записи в базе nescartdb (хомбрю, редкие) теперь запускаются: тип платы выводится из iNES-заголовка.

Что изменилось

  • «Mirroring» → Scroll: схема объявляет перемычку "mirroring": {"mode": "scroll"}; H/V определяется по биту 0 Flags6 (инверсия); legacy-режим "hardwired" сохранён как алиас.
  • UNROM: банковый регистр — 74LS161 (счётчик с загрузкой по фронту /ROMSEL), адресный мультиплексор PRG — 74LS32; симуляция цепей идёт в два прохода, чтобы выходы чипов распространялись по сетям в пределах такта.
  • InesTranslator для «диких» дампов: 0→NROM, 1→SGROM/SHROM, 2→UNROM, 3→CNROM, 7→AOROM (новые cnrom.json, shrom.json); запуск через тот же CartPcb-путь с предупреждением в логе.

Ссылки: PR #526 · issue #525 · issue #514