pureikyubu 1.7 — заметки о релизе
Это архивный релиз. Текущий релиз — pureikyubu 1.8.
Версия 1.7 — самое крупное обновление за всю историю проекта. Графический бэкенд перестроен вокруг двух программируемых ступеней Flipper, у двух самых сложных подсистем эмулятора наконец появились автоматические тесты, SDL-сборка стала полноценным интерфейсом со звуком и селектором игр, а исправление ошибок процессора и памяти позволило загрузить на эмулируемой консоли ядро Linux.
На этой странице
Главное
- Графика на шейдерах. Transform Unit и Texture Environment Unit эмулятора выполняются вершинным и фрагментным шейдерами GLSL 3.30 в профиле OpenGL 3.3 core; фиксированный конвейер больше не используется. Command Processor теперь передаёт команды в XF, а не залезает внутрь графических блоков.
- Конвейер GFX покрыт тестами. 340 модульных тестов прогоняют настоящий конвейер CP → XF → SU → RAS → TX → TEV → PE на реальном контексте OpenGL и публикуют HTML-отчёт с 262 отрендеренными эталонными картинками. Тесты нашли и позволили исправить большую часть давних ошибок рендеринга.
- Ядро DSP проверяется по железу. 177 тестов, 1822 эталонных вектора АЛУ и 435 векторов кольцевых буферов; IROM процессора DSP полностью дизассемблирован и разобран.
- GC-Linux загружается. Исправлены декодирование GQR/paired-single,
когерентный с кэшем обход хеш-таблицы MMU, модель декрементера,
mtcrf,lswi/lswxи регистры SI. Ядро 2004 года доходит до консолиgcnfbс загруженным драйвером Broadband Adapter. - Игры. Играет вступительный ролик Metroid Prime и игра доходит до титульного экрана; Zelda: The Wind Waker проходит загрузку; у ролика THP в Ikaruga правильные цвета; PONG снова запускается.
- SDL-интерфейс. В кроссплатформенной сборке появились звук, встроенный файловый браузер, диалоговые окна и полноценный селектор игр (баннеры, Game ID, сортировка, фильтры, переход по первой букве).
Добавлено
Графика
- Вершинный шейдер GLSL 3.30, эмулирующий XF: умножение на матрицы геометрии и текстур, объединение с проекцией, освещение по вершинам для двух цветовых каналов и все режимы генерации текстурных координат.
- Фрагментный шейдер GLSL 3.30, эмулирующий TEV: до 16 ступеней комбинирования, полный тракт операндов, bias, sub, clamp и shift, константы K ревизии B, туман и финальная alpha-функция. Оба шейдера статические и получают состояние регистров через uniform.
- Независимое декодирование и привязка всех восьми текстурных карт, генерация mip-уровней и исправленные режимы wrap и фильтрации сэмплера.
- Полное чтение регистров XF через
CP_XF_ADDR/CP_XF_DATAL/CP_XF_DATAHи путь команд CP → XF → SU → RAS. GFX_DUMPсохраняет каждый n-й отрисованный кадр в BMP;EMU_LOG=<файл>пишет выводDebug::Reportв файл.
Звук
- Звуковой бэкенд SDL (
audiosdl.cpp) для кроссплатформенной сборки. - Поведение ARAM и AI приведено в соответствие с документацией на железо (имена регистров ACRS/ACWE, 32-байтный блочный перенос, маски адресов, CDCR, громкость потока AIVR, ARAM DMA целиком внутри записи AMBL).
Процессор и память
- Расширения GQR и paired-single декодируются по нумерации бит из мануала ISA; математика
преобразований вынесена в
src/gqr.h. - Когерентный с кэшем доступ к хеш-таблице MMU
(
ReadHashPte/WriteHashPte). - Декрементер, соответствующий железу: одно исключение на опустошение, запрос защёлкивается
при снятом
MSR[EE], положительное значение снимает отложенный запрос, при сбросе значение отрицательное. - Ключи командной строки
--ipl(загрузить меню IPL без диска) и--no-disc(запуск с открытым лотком DVD). - Типизированный доступ к регистрам каждого блока Flipper; Command Processor стал
самостоятельной сущностью Flipper; появился сброс памяти (
MemRst).
Интерфейс и отладчик
- Селектор игр в SDL-сборке: поиск DOL/ELF/ISO по
PATH, декодирование баннеров (RGB5A3 с альфой, названия в SJIS), Game ID, столбцы Icon/Title/Size/Game ID/Comment, все правила сортировки из Win32, маленькие значки, фильтры файлов и Add Directory. - Переход к игре по первой набранной букве (issue #92).
- Отдельное окно видеовыхода с фильтрацией событий, чтобы перекрытый селектор не реагировал на клики, предназначенные игре.
- Сервер JDI (JSON Debugger Interface), его представление и передача экземпляра Flipper через дерево отладчика.
- Файловый браузер ImGui и диалоговые окна в SDL-интерфейсе.
Тесты и инструменты
- Стенд тестов GFX с настоящим контекстом OpenGL, проверкой через transform feedback и
HTML-отчётом (
gfx_report.html) с отрендеренными картинками; 340 тестов. - Тесты DSP: покрытие инструкций, независимая эталонная модель флагов, 1822 эталонных вектора АЛУ, 435 векторов кольцевых буферов, протокол почтовых ящиков и путь загрузки IROM; 177 тестов.
- Тесты GQR (17 случаев) и опубликованный дизассемблер IROM в
testing/DspIrom.md. - Проекты Visual Studio 2026 (MSVC v145); проект тестов ссылается на исходники эмулятора, а не копирует их.
- JSON-таблицы встроены в исходники, внешние файлы данных больше не нужны (PR #332).
Изменено
- Графический бэкенд больше не использует фиксированный конвейер OpenGL; пути рисования в режиме immediate удалены, а четырёхугольники раскладываются в треугольники.
- Вершины накапливаются в VBO и рисуются через
glDrawArrays/glDrawElements. - CP передаёт слова команд в XF и опрашивает его готовность вместо прямого управления растеризаторами; загрузка регистров стала пословной, поэтому частичная загрузка больше не останавливает эмуляцию.
- Доступ к регистрам Flipper отрефакторен: у каждого блока собственное типизированное
представление; PI FIFO переехал в
pi.cpp; 8-битный доступ к железу удалён. VI_DISP_POSдоступен только для чтения; регистр PI CONFIG корректно отражает состояние сброса памяти и DVD.- Матрицы и цветовые регистры XF стартуют из состояния, которое задаёт
GXInit(проверено по прогону настоящего bootrom). - Копирование всего кадра в дисплейный буфер стало самостоятельной границей кадра; частичное копирование и копирование в текстуру — нет.
- Папка
imgstoreпереехала вwiki; wiki расширена и переорганизована. - В проекте приняты поведенческие правила в стиле Карпатого в файле
.clinerules.
Исправлено
Графика
- Чёрный экран Bootrom: очистка движком копирования стирала кадр, который ещё предстояло показать.
- Metroid Prime: вступительный ролик оставался чёрным, потому что кадры фильма никогда не
выводились (теперь копирование в дисплейный буфер — граница кадра); целые кадры оставались
чёрными, потому что очистка в начале кадра использовала живые регистры
PE_COPY_CLEAR_*(теперь значения запоминаются при выдаче команды копирования) и потому чтоGX_IDENTITY/GX_DTTIDENTITYне инициализировались. - Ролик THP в Ikaruga: искажённые цвета из-за неверной нумерации полей GQR, общего хранилища констант K и цветовых регистров и перепутанных полей канала и регистра у одноканальных селекторов K.
- Декодирование CMPR (неинициализированная цветовая таблица, альфа концевых точек, прозрачный четвёртый цвет трёхцветного режима).
- Текстурные карты 4–7 нельзя было запрограммировать (блок регистров I4–I7 декодировался как I0–I3), а мультитекстурирование применяло каждую карту к предыдущему текстурному блоку.
- Scissor в SU был отключён;
TexMode0.lodbias,TexMode1.minlod/maxlod,SU_LPSIZE,SU_SSIZE/SU_TSIZE,RAS1_SS0/SS1иGEN_MODE.flat_enтеперь применяются; у тумана TEV для F-select 1 и 3 появился закон; биты обновления цвета и альфы в PE применяются так, как описано в документации. - R и B меняются местами корректно при сохранении кадра в BMP.
- Частичная загрузка регистров больше не останавливает команду рисования.
Процессор
mtcrfиспользовал поле RS как маску CR, а поле CRM как номер регистра (чтениеgpr[128]за границей массива), из-за чего ядро Linux падало вip_auto_config_setup.- Обход хеш-таблицы MMU был некогерентен кэшу с обратной записью, поэтому только что созданные PTE были не видны и ядро зацикливалось на одном DSI-исключении.
- Запрос декрементера был фронтовым и терялся при запрещённых прерываниях; полностью уровневый вариант приводил к лайвлоку Bootrom. Теперь это защёлкиваемый запрос на каждое опустошение.
lswi/lswxтеряли последнее накопленное слово, когда число байт было кратно четырём, что портило копирование структур от GCC.- Каждый ненулевой GQR декодировался с неверной нумерацией бит; исправлены правила преобразования paired-single и условия HID2.
Звук и DSP
- Нарезанный ARAM DMA терял запросы звукового DMA Metroid Prime и вешал игру сразу после вступительного ролика; теперь блок выполняется целиком внутри записи младшего слова AMBL.
divтерял младший бит частного;normиdivбыли заглушками.lsf/asfсдвигали не в ту сторону во всех регистровых формах.ModifyFlagsне маскировал до 40 бит; исправленыneg p, беззнаковые умножения, флаги логического семейства, правила аккумулятора и непосредственных операндов,clr,neg/negc,addp,lsl16,tst pи семейство умножения с накоплением.trapне увеличивал PC (из-за чегоretiзацикливался на повторном исключении), а векторы прерываний игнорировали базу программы.- Кольцевая адресация заворачивалась по длине модификатора вместо выровненного блока 2n; декодер принимал зарезервированные слова; почтовый ящик мог разорвать пару сообщений; упакованные обращения к памяти защёлкивали неверный операнд.
Интерфейс и платформа
- Записи в регистры входного буфера SI больше не останавливают эмуляцию (драйвер
gcn-siв Linux сбрасывает их при инициализации). - Исправлен загрузчик DOL/ELF; PONG снова запускается.
- Исправлены бит переноса FIFO в PI, стик геймпада, загрузка баннеров DVD под Linux и сборка под Linux.
- Проекты мигрированы на Visual Studio 2026; вычищены предупреждения; удалён конфликтующий
fmt.
Известные проблемы
- Bump mapping, indirect-текстурирование, Z-текстурное окружение и Cpu2Efb пока не эмулируются.
- PE dither и несколько полей флагов
SUнамеренно не реализованы; это задокументировано вwiki/gfx.md. - Полная поддержка микрокода JAudio (issue #71) ещё в работе; оставшиеся расхождения DSP с
железом зафиксированы в
testing/Readme.md. - В Linux-сборке пока нет звука и ввода.
- Часть игр по-прежнему не рендерится или зависает; совместимость — постоянная работа.
Сборка
Windows. Откройте scripts/VS2022/pureikyubu.sln в Visual Studio
2022 или 2026 и соберите. У SDL- и Win32-интерфейсов есть конфигурации Debug и Release.
Linux.
sudo apt install libglew-dev
git clone https://github.com/emu-russia/pureikyubu.git
cd pureikyubu
git submodule update --init
cd build && cmake .. && make
./pureikyubu pong.dol
Тесты.
MSBuild scripts/VS2026/pureikyubu_test.slnx -p:Configuration=Release -p:Platform=x64
vstest.console.exe scripts/VS2026/x64/Release/pureikyubu_test.dll /Platform:x64
Подробная история этих изменений, с хронологией и скриншотами, — в дайджесте работ после релиза 1.6.