#518
Журналирование с управлением на этапе компиляции
Разрозненные 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-порт
SDL2-порт получил ввод с контроллеров, которого у него не было: события SDL2 (клавиши, геймпад —
кнопки, стики, триггеры) превращаются в события устройств и раздаются по биндингам на устройства,
подключённые к материнской плате, — по той же схеме, что и в управляемом приложении. Конфигурация
хранится отдельно (IOConfigSDL.json), чтобы не пересекаться с конфигом управляемой версии.
Что изменилось
- Интерактивный конфигуратор (
breaknes --ioconfig): пул устройств, биндинги актуаторов (ожидание события ввода), подключение и отключение устройств к портам платы.
- Идентификаторы устройств берутся из общего enum
IO::DeviceID вместо захардкоженных значений.
- Починены сборки: в CMake добавлен пропущенный при рефакторинге #509
CartPcbPort.cpp; JsonLib исправлен для Linux (компиляция, сериализация Int через %llu).
Ссылки: PR #519 · issue #516
#520
До двух экранов: привязка PPU⇄TV
Инфраструктура для плат с несколькими 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
База плат приведена к реальным ревизиям
Список плат был набран произвольно и противоречил исследованию реальных ревизий материнских плат
(например, «NES-101 (NESN-101 PCB)» не существует; Famicom-платам независимо от эпохи приписывались
RP2A03G/RP2C02G). База приведена к документу ревизий из репозитория
breaks — 31 реальная плата с корректными маркировками чипов по эпохам.
Что изменилось
- 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
Иконка проекта
У проекта появилась фирменная иконка на основе 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
Три связанные переработки модели картриджных плат. (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