header-logo

Маркетинговые коммуникации на основе искусственного интеллекта

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


Как эмуляторы SNES получили несколько пикселей от полного совершенства

Apr 3, 2020 2:38 AM ET

Bsnes нуждается в вашей помощи, чтобы расшифровать некоторые три десятилетия назад PPU чипов.

РЭШ предназначендля для выполнения различных задач на определенных частотах и времени.

Если представить себе часы 100 Гц, это устройство с цифровым штифтом, которое переходит к логике высокой (например, 5 вольт), а затем возвращается к логике низкой (0 вольт, или земли) 100 раз в секунду. Таким образом, каждую секунду, пин-напряжение будет колебаться в 200 раз: 100 восходящих часов края и 100 падающих часов края.

Цикл часов, как правило, рассматривается как один полный переход, так что 100 Гц часы будут генерировать 100 часовых циклов в секунду. Есть некоторые системы, которые требуют различения между восходящими и падающими краями, и для тех, мы разбиваем это дальше вниз на полуциклы, чтобы обозначить каждую фазу (высокую или низкую) сигнала часов.

Ключевой целью аутентичного эмулятора является выполнение задач точно таким и же способом и в точно такое же время, как и реальное оборудование. Не имеет большого значения, как конкретно выполняются задачи. Важно только то, что эмулятор, когда им дают те же входы, генерирует те же выходы с тем же временем, что и реальное оборудование.

Времени

Иногда операции происходят с течением времени. Возьмем, к примеру, умножение Процессора SNES. Вместо того, чтобы приоружить, чтобы ждать завершения умножения, процессор SNES вычисляет результат умножения по одному биту в фоновом режиме в течение восьми циклов опкода процессора. Это позволяет коду, возможно, делать другие вещи в ожидании умножения для завершения.

Любое коммерчески выпущенное программное обеспечение, скорее всего, будет ждать эти восемь циклов, потому что если вы попытаетесь прочитать результат, прежде чем он будет готов, вы получите частично вычисленный результат вместо этого. Еще раньше эмуляторы SNES давали правильные результаты сразу, недожидаясь этих дополнительных циклов.

Когда любители начали создавать и тестировать доморощенное программное обеспечение с помощью эмуляторов, это несоответствие начало вызывать некоторые проблемы. Некоторые из этих программ, таких, как многие ранние Super Mario World ROM хаки, только работал правильно на этих ранних эмуляторов, а не на реальном sNES оборудования. Это потому, что они были разработаны с эмулятором немедленного (и недостоверных к реальному оборудованию) результаты умножения в виду.

Как эмуляторы улучшились, это старое программное обеспечение сломалось, и мы должны были впоследствии предложить варианты совместимости в наших новых эмуляторов, чтобы не потерять это программное обеспечение на время. Да, как сюрреалистический, как это сказать, в эти дни наши эмуляторы должны подражать другим эмуляторам! Как мета!

Хорошая вещь о задержке умножения процессора является то, что это очень предсказуемо: восемь циклов вычислений начинаются сразу после запроса умножения. Написав код для чтения результатов после каждого цикла, мы смогли подтвердить, что процессор SNES использует алгоритм Бута для умножения.

Синхронизация часов

Другие операции не так просты в модели, так как они происходят асинхронно в фоновом режиме. Одним из таких случаев является обновление DRAM процессора SNES.

Во время визуализации каждого сканирования, в определенный момент, весь процессор SNES замораживается на короткий срок по мере обновления содержимого чипа оперативной памяти. Это необходимо, потому что, в качестве меры сокращения расходов, SNES использовали динамическую оперативной памяти (а не статической оперативной памяти) для своей основной памяти процессора. Динамическая оперативная память должна периодически обновляться, чтобы со временем сохранить ее содержимое.

For a truly perfect emulator, just making ~3,500 commercially released SNES games playable isn't enough. Every function of the system has to be simulated with cycle-perfect accuracy, too.
Увеличить / Для действительно идеального эмулятора, просто сделать 3500 фунтов коммерчески выпущенных игр SNES воспроизводиться не достаточно. Каждая функция системы должна быть смоделирована с идеальной точностью цикла, тоже.

Ключевым моментом для выяснения точных сроков этих операций было использование горизонтальных и вертикальных счетчиков ГПУ SNES. Эти счетчики заранее и сбросить после каждого горизонтального и вертикального периода зачистки. Однако их точность составляет лишь четверть частоты осциллятора процессора SNES; то есть горизонтальные приращения счетчика только один раз в четыре часовых цикла.

Читая счетчики несколько раз, я смог определить, какая четверть цикла часов счетчик был выровнен с. Объединив это понимание со специально созданной функцией, которая могла бы шагзать по точному, определенному для пользователя количеству часовых циклов, стало возможным идеально выровнять процессор SNES с любой точной позицией цикла часов, которую я хотел.

По итерации в течение ряда часовых циклов в цикле, я мог бы точно определить, когда определенные операции (такие как DRAM обновления, HDMA переводы, прерывание опроса и т.д.) будет происходить, и я был в состоянии воспроизвести это именно под эмуляцией.

SNES SMP чип имеет свои собственные таймеры, а также, и аналогичные обратной инженерии был успешным против этого процессора, а также. Я мог бы потратить всю статью говорить о SMP TEST регистра в одиночку, что позволяет кодерам контролировать часы делитель SMP и его таймеры, среди других ужасных вещей. Достаточно сказать, что, хотя это был не легкий или быстрый процесс, мы в конечном счете одержали победу.

Сбор сопроцессоров

The SuperFX chip is just one of many cartridge coprocessors that an SNES emulator has to handle correctly.
Увеличить / SuperFX чип является лишь одним из многих картриджей сопроцессоров, что эмулятор SNES должен обрабатывать правильно.

Существовали целый ряд Сопроцессоров SNES, используемых внутри различных картриджов игры, которые должны быть приручены, а также. От специализированных процессоров общего назначения, таких как SuperFX и SA-1,до цифровых процессоров сигнала, таких как DSP-1 и Cx4, до ускорителей декомпрессии, таких как S-DD1 и SPC7110, до часов в режиме реального времени от Sharp и Epson, и многое другое…

Это означает, что эмулятор SNES должен быть в состоянии обрабатывать инструкции и пиксельные кэши SuperFX; арбитр конфликта шины памяти SA-1 (который позволил CPU SNES и SA-1 делить такие же обломоки rom и RAM одновременно); встроенная прошивка DSP-1 и Cx4; арифметические кодеры S-DD1 и SPC7110 на основе предсказаний; и нечетные BCD (двоичный закодированный десятичной) край случаях в режиме реального времени часы. Медленно, но верно, применяя выше методы для определения правильности и времени, мы смогли почти идеально подражать все эти фишки.

На самом деле потребовалось огромное усилие и тысячи долларов, чтобы декап и извлечь программную программу программирования из цифровых процессоров сигнала, используемых в различных играх. В одном случае, эмуляция NEC uPD772x привела к коду из хигана, используемого для спасения голоса покойного профессора Стивена Хокинга!

В другом случае нам пришлось развернуть весь набор инструкций архитектуры Hitachi HG51B, потому что эта архитектура никогда не была публично задокументирована. В еще одной, одна игра (Hayazashi Нидан Морита Shougi 2) в конечном итоге содержащие полномасштабный 32-битный, 21 МГц ARM6 процессор для ускорения своего японского шахматного двигателя!

Сохранение всех сопроцессоров SNES в одиночку

был многолетний путь, полный проблем и сюрпризов.

Обработка цифрового сигнала

Не следует путать с DSP-1 картридж сопроцессор, Sony S-DSP (цифровой процессор сигнала) чип является то, что генерируется отличительный звук из SNES. Этот чип объединил восемь голосовых каналов с 4-разрядным кодированием ADPCM для получения 16-битного стереосигнала.

На первый взгляд, и в схеме системы от ранее, DSP первоначально выглядит как черный ящик: вы настраиваете голосовые каналы и настройки микшера и сидеть сложа ч. 00 м. и генерировать звук, который будет отправлен на динамики.

Но одна ключевая особенность позволила разработчику по имени blargg полностью реверсивно инженер этот чип: эхо буфера. SNES DSP имеет функцию, которая смешивает выходы из предыдущих образцов вместе, чтобы произвести эффект эхо. Это происходит в самом конце процесса генерации звука (кроме последнего последнего немой флаг, который может быть применен, чтобы заставить замолчать все аудио выход.)

Написав тщательно цикл времени код и мониторинга этих результатов эхо, стало возможным обнаружить точный порядок операций SNES DSP будет принимать для создания каждого образца и для создания цикла точной, бит-идеальный звук.

Сохранение ППУ

Все это приводит нас к заключительной части архитектурной диаграммы SNES: ppU-1 и PPU-2 чипов. Благодаря Джону Макмастеру, у нас есть 20x сканирование увеличения S-PPU1 (пересмотр 1) и S-PPU2 (пересмотр 3) чипов.

Сканирование умереть выше подчеркнуть, что они, очевидно, не общего назначения процессоров, и они не пользовательские архитектуры выполнения операционных кодов из внутренней программы прошивки ROM. Они оба посвященные, жестко закодированные логические схемы, которые принимают входы различных регистров и памяти и производить выход видео на монитор, один сканирование за один раз.

Причина, по которой ППУ остаются последним рубежом эмуляции SNES, заключается в том, что, в отличие от всех обсуждаемых до сих пор компонентов, ППС действительно являются черным ящиком. Вы можете настроить их в любое состояние, но процессор SNES не имеет возможности непосредственно наблюдать за тем, что они генерируют.

Чтобы использовать наш предыдущий пример умножения в качестве аналогии, представьте, если вы запросили результат 3 и 7, но вместо того, чтобы получить двоичный ответ, вы вместо этого получили нечеткое, аналоговое изображение, показывающее цифры ’21’ на экране вместо этого. Любой, кто работает ваше программное обеспечение может увидеть 21, но вы не могли написать тестовую программу, чтобы автоматически подтвердить, что они видели правильный ответ. Ручная проверка человеком такого рода результатов не выходит за рамки нескольких тысяч тестов, и нам понадобится несколько миллионов, чтобы действительно отточить точное поведение PPU.

Теперь я знаю, что вы, вероятно, думаете: “Но byuu, не было бы легко использовать карту захвата, выполнять много обработки изображений, примерно совпадают с цифровым изображением экрана эмулятора, и пройти неудачу тест на основе этого?”

Ну, наверное! Особенно, если тест был так же прост, как два гигантских числа, охватывающих весь размер экрана.

Но что делать, если наше тестирование было очень нюансы, и мы пытались обнаружить полутени цветовой разницы одного пикселя? Что делать, если мы хотели запустить миллион последовательных тестов и не обязательно знать, что они собираются генерировать только пока, но все же хотел, чтобы соответствовать его выход нашей эмуляции?

Ничто не сравнится с удобством и определенностью цифровых данных, точный поток битов, которые вы либо совпадают или не совпадают. Аналоговый домен CRT-изображения этого не обеспечивает.

Почему это важно?

За исключением одной игры(Air Strike Patrol), все официально лицензированное программное обеспечение SNES (предназначено для того, чтобы быть) основано на сканировании. Эти игры не пытаются изменить состояние рендеринга PPU в середине активноренго сканлинга (трюк программирования, известный как “эффект raster”). Это означает, что время для запуска подавляющего большинства игр не должно быть невероятно точным; до тех пор, как вы готовы к следующему полный сканирования, вы в порядке.

Но это имеет значение для этой одной игры.

Выше, вы видите, что “Хорошая удача” текст в Air Strike Patrol в настоящее время вращается от кадра к кадру. Игра делает это путем изменения фонового слоя 3 (BG3) вертикального положения прокрутки. Тем не менее, HUD дисплей слева (где он отображает у вас есть 39 ракет доступны) также на том же фоновом слое.

Игра управляет этим разделением, изменяя положение прокрутки BG3 после того, как HUD слева оказал, но до того, как текст «Good Luck» начинает рендеринг на каждом сканировании. Это может сойти с рук, потому что BG3 является прозрачным за пределами HUD и текста, так что нет ничего, чтобы действительно обратить между этими двумя точками, независимо от вертикального значения регистра прокрутки. Это поведение говорит нам о том, что регистры прокрутки могут быть изменены в любой момент во время визуализации.

That little shadow below the plane here causes an untold number of headaches for an accuracy-obsessed emulator maker.
Эта маленькая тень под плоскостью вызывает неисчислимое количество головных болей для одержимого точностью эмулятора.

Выше печально известной тени плоскости в нижней части экрана. Этот эффект отображается путем изменения регистра яркости дисплея экрана для коротких очередей в течение пяти сканлайнов.

Играя в игру, вы заметите, что тень довольно неустойчива. На изображении выше это выглядит немного как ‘c’, но кадр для кадра форма постоянно меняется в длине и отправной точке для каждого сканирования. Воздушный удар патруль просто направлены в общем стадионе, где они хотели тень появится, а затем пошел на это, пушки пылающий. Это в основном работало.

Эмуляция этого поведения правильно требует цикл идеального времени, что чрезвычайно трудно получить абсолютно прямо в эмуляторе.

The <em>Air Strike Patrol</em> pause screen uses raster effects that weren't intentionally used in any other SNES game.
Экран паузы Air Strike Patrol использует эффекты raster, которые не были намеренно использованы в любой другой игре SNES.

Наконец, вот экран паузы. Это один переключает BG3 на во время желтой и черной границы слева, и снова во время той же границы справа, чтобы нарисовать серые линии на экране. Он также чередует, которые scanlines отображения этих серых линий каждый другой кадр, чтобы создать эффект встряхивания для наложения.

Если увеличить эмулированное изображение выше, вы заметите, что есть несколько недостающих пикселей на левом краю этих серых линий для нескольких сканлайнов. Это потому, что моя эмуляция PPU не сто процентов цикла идеально. В этом случае он запускает эффект переключения BG3 немного позже, чем предполагается.

Я мог бы очень легко настроить тайминги, чтобы сделать это изображение правильно. Но эта корректировка столь же вероятно, будет иметь неблагоприятные последствия в других названиях, которые изменяют PPU дисплей регистрирует середине сканирования. В то время как Air Strike Patrol является единственной игрой, чтобы сделать это намерение

союзник, Есть по крайней мере десятка игр, которые делают это случайно (может быть, они были Огонь ИКЗ слишком рано или слишком поздно).

Иногда это приводит к некоторым кратким, видимых коррупции, которая была упущена в развитии (как и в случае с Full Throttle Racing при переходе между магазином и игрой). Иногда записи происходят во время прозрачной части экрана и, таким образом, не вызывают визуальных аномалий (например, с дисплеем статуса HP в Dai Kaijuu Monogatari II.) Даже эти “невидимые” случаи края могут вызвать проблемы с менее точными сканлайн рендереров, используемых в более перипетийных эмуляторов, однако.

Даже дисконтирование Air Strike Patrol, все эти случайные (но эффективные) эффекты raster в программном обеспечении SNES делают его функционально невозможно разработать PPU рендерер, который генерирует весь сканлайн с циклом идеальной точности.

С bsnes, через годы проб и ошибок, я создал список этих “эффект raster” игры. Я также создал пользовательские позиции рендеринга, которые позволяют гораздо быстрее сканирования на основе рендеринга для отображения всех этих игр должным образом (за исключением Air Strike Patrol, конечно). Они по существу составляют неудовлетворительные за игру хаки, однако.

У меня также есть цикл основе PPU рендерер, который не нуждается в любой из этих хаки, но в конечном итоге это вызывает крошечные, один-четыре пикселя различия с фактическим оборудованием, как и в последнем Air Strike Patrol скриншот на фото выше.

Защелка внутренних регистров

Причина этих небольших промахов сводится к фиксации времени поведения.

Допустим, SNES оказывает свой знаковый режим 7,который представляет собой преобразование текстуры с помощью корректировок параметров для сканирования. Для определения любого данного пикселя на экране можно выполнить вычисления:

px - клип (hoffset - hcenter) - клип (voffset - vcenter) и
b q y (hcenter slt; 8) py s s

s клип (hoffset - hcenter)

Реальный SNES будет бороться, чтобы выполнить эти шесть умножений достаточно быстро для каждого оказанные пиксель в кадре. Но ни одно из этих значений не меняется от пикселя к пикселю (или, по крайней мере, они не должны), поэтому мы только должны вычислить px и py один раз в начале каждого сканирования. Таким образом, PPU кэширует статические результаты в защелки, которые по существу являются копиями регистров PPU, которые, возможно, были преобразованы или могут быть преобразованы дальше с течением времени.

Х,й координаты затем преобразуются режимом 7, как так:

бык й (px и х) йgt; йgt; 8

oy (py q c х)

Хотя x изменяет каждый пиксель, мы знаем, что каждый раз он приращается по одному. Сохраняя внутренние аккумуляторы, мы можем просто добавить постоянные значения a и c к быку и oy раз каждый пиксель, вместо того, чтобы выполнять два умножения для каждого пикселя.

Затем возникает вопрос, в какой точной позиции цикла PPU считывал значения a и c от cPU-доступных внешних регистров ГПУ SNES PPU?

Если мы угадаем время, которое слишком рано, это может сломать определенный подмножество игр. Если мы угадаем время, которое слишком поздно, он может сломать другой подмножество игр.

Простой подход заключается в том, чтобы просто продолжать ждать отчетов об ошибках и корректировать эти позиции для решения проблем в любой конкретной игре. Но, делая это, мы никогда не узнаем точные позиции, только приближения.

И каждый раз, когда мы изменим одну из этих переменных, мы не сможем перепроверить всю библиотеку SNES за 3500 фунтов, чтобы обнаружить какие-либо регрессии, которые могли бы вызвать наши изменения.

Эмуляция Whack-a-Mole

Artist's conception of the process of fixing emulation errors.
Увеличение / Представление художника о процессе исправления ошибок эмуляции.

Этот стиль “просто получить текущую игру интересов работает любой ценой” методологии тестирования привело к явлению я называю Whack-A-Mole эмуляции.

Еще в первые дни эмуляции SNES, всякий раз, когда игра была проблема, любое исправление, что привело к данной игре работы будут приняты и привержены эмулятор. В обязательном порядке, что исправить будет в конечном итоге разорвать другую игру. И когда эта игра была исправлена, третья игра провалилась. Исправление третьей игры затем разорвать первую игру снова. Это продолжалось в течение многих лет.

Ошибка, допущенная здесь, заключалась в том, чтобы рассматривать только одну переменную за раз. Допустим, у нас есть игра, где событие должно произойти между циклом 20 и 120 для того, чтобы работать. Мы не знаем точного цикла, поэтому мы идем вперед и выбрать 70, прямо в середине.

Позже отчет об ошибке приходит для другой игры, и мы определяем, что для этой игры, чтобы работать, значение цикла должно быть между 10 и 60. Так что теперь мы настраиваем его на 40, который работает для обеих игр. Кажется разумным!

Но затем приходит третья игра, которая нуждается в событии, чтобы вызвать между циклами 80 и 160! Теперь нет никакого способа, чтобы получить все три игры, работающие в то же время с одним значением.

Это привело эмуляторов для реализации игры конкретных хаки. Вы не хотите быть человеком, чтобы отправить эмулятор, который не работает Марио, Зельда, или Metroid. Таким образом, вы используете 40 для общего случая, но заставить значение времени, чтобы быть 100 вместо того, когда Metroid загружается.

Как это возможно, что две игры нуждаются в разных значениях? Это потому, что есть больше, чем просто одна переменная в игре. Сроки, которые вы использовали для запуска другого события ранее, могут повлиять на то, какое значение времени необходимо для следующего события.

Чтобы положить его как простое алгебраическое выражение, представьте себе:

2x й й 120

Вы можете решить это уравнение с помощью x’10, y’100. Или с х-20, y’80. Или с х-30, й60. Если вы только думаете о том, что значения х делает ваш подмножество игр все работают одновременно, то вы можете упустить тот факт, что фактическая проблема заключается в том, что ваш у переменной является неправильным!

Ранние эмуляторы просто переопределить значение x на основе игры играет, для того, чтобы быть более совместимым. Те, за игру хаки сохраняются, даже если правильное, единственное значение для х стало известно позже. Таким образом, вопрос с y никогда бы даже не был раскрыт!

С SNES, однако, это не только одна или две переменные в игре за один раз. Только ГПУ SNES имеет 52 внешних регистра, включающих настройки 130 фунтов стерлингов. Процесс рендеринга одного сканирования включает в себя все настройки 130 фунтов и неизвестное количество внутренних и затылковых регистров, все в игре в одно и то же время. Это слишком много для тех, кто на улице, чтобы в полной мере понять все состояние SNES PPU в любой данный момент времени.

Это аспект эмуляции, который неинтуитивно для посторонних, но очень верно: точность не то же самое, что совместимость. Вы можете иметь эмулятор, который 99 процентов точной, но только запустить 10 процентов игр. И вы могли бы эмулятор, который только 80 процентов точной, но он будет работать 98 процентов игр. Иногда, делать все правильно будет перерыв популярных игр в краткосрочной перспективе. Это необходимая жертва, если вы когда-нибудь надеетесь достичь как 100-процентной точности, так и 100-процентной совместимости.

Выяснение

То, как мы получили SNES PPU эмуляции до точки она в настоящее время было через дедуктивные рассуждения и реальных результатов.

Мы знаем, что PPUs имеют доступ к двум чипам VRAM. Мы знаем, что они могут только читать так много байтов данных с каждого чипа на сканирование. Мы знаем широкие подробности о том, как работает каждый видеорежим SNES. И с этим, мы можем выложить общую картину того, как дизайн может выглядеть. Вот пример того, как могут работать первые три видеорежима SNES:

если (io.bgMode - 0) -

bg4.fetchNameTable();

bg3.fetchNameTable();

bg2.fetchNameTable();

bg1.fetchNameTab

ле(); bg4.fetchCharacter (0); bg3.fetchCharacter (0); bg2.fetchCharacter (0); bg1.fetchCharacter (0); } если (io.bgMode No 1) bg3.fetchNameTable(); bg2.fetchNameTable(); bg1.fetchNameTable(); bg3.fetchCharacter (0); bg2.fetchCharacter (0); bg2.fetchCharacter (1); bg1.fetchCharacter (0); bg1.fetchCharacter (1); } если (io.bgMode No 2) bg2.fetchNameTable(); bg1.fetchNameTable(); bg3.fetchOffset (0); bg3.fetchOffset (8); bg2.fetchCharacter (0); bg2.fetchCharacter (1); bg1.fetchCharacter (0); bg1.fetchCharacter (1); }

Отверстия в черном ящике

PPU предоставляет немного своего состояния внешним наблюдателям: горизонтальные и вертикальные флаги зачистки, горизонтальные и вертикальные счетчики пикселей, и “диапазон плитки над” флагами для спрайтов. Это не много, но опять же, каждый немного подвергаются состояние помогает.

VRAM SNES PPU (видео оперативной памяти) заблокирован от процессора SNES во время рендеринга, даже для чтения. Но оказывается, что OAM (спрайт памяти) и CGRAM (палитра памяти) не являются. Загвоздка в том, что SNES PPU контролирует адрес автобуса в течение этого времени. Таким образом, читая OAM и CGRAM в то время как экран оказывает, я могу наблюдать, что SNES PPU является получение из этих двух частей памяти в течение этого решающего времени.

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

Использование открытых моделей доступа OAM и CGRAM, флагов PPU, общих наблюдений (читай: угадывание) из отчетов об ошибках в различных играх, а также некоторые дедуктивные рассуждения привели к циклообразным рендеретам PPU, которые могут работать почти на всех коммерчески выпущенных играх идеально.

Но это все еще карточный домик: если кто-то начнет создавать доморощенное, что эксплуатирует идеальный цикл времени и raster эффекты, все наши эмуляторы сегодня начнет рушиться. Это включает в себя как программное обеспечение, так и FPGA-реализации, так.

Я хочу быть ясным здесь: все в настоящее время угадать внутренний порядок операций и фиксации поведения SNES PPUs. Никто не знает, как подражать этому прекрасно. Пока нет, во всяком случае.

Возможные решения

Так что же нам с этим делать? Как мы определяем точный порядок работы ГПУ SNES, когда он выступает в качестве черного ящика для нас со стороны SNES CPU вещей?

Я вижу четыре возможности: анализаторы логики, тест-режим цифрового видео выход, прорыв платы, и decapping.

Анализаторы логики

Если вы посмотрите на PPU умереть сканирует сверху, вы заметите черные колодки по всей края чипов. Это колодки, которые подключаются к булавкам на фактических фишках.

Эти контакты удерживают состояние PPUs во время каждого часового цикла выполнения. Здесь вы найдете текущий адрес, к который они обращаются для чипа видео оперативной памяти, какое значение данных передается от одного PPU к другому, и многое другое.

Это информация, которая недоступна для кода, работающегося на процессоре SNES, но она дает ценную информацию о внутреннем порядке операций SNES PPU.

Hooking a Super NES PPU to a logic analyzer like this could be the key to opening the
Увеличение / Подключение Super NES PPU к анализатору логики, как это может быть ключом к открытию “черного ящика”.

Критическая проблема с анализаторами логики заключается в том, что он не очень хорошо контролируется: попытка отогнать живые данные в запущенной системе даст вам поток результатов, которые довольно трудно расшифровать. Вы также столкнетесь с той же проблемой, как вы бы пытаются проанализировать аналоговый выход Системы RGB: вам придется вручную запустить каждый тест для захвата этих данных. Это не очень хорошая система для создания воспроизводимых автоматизированных регрессионных тестов.

Выход цифрового видео в тестовом режиме

Недавно, благодаря decapped 20x умереть сканирование изображений, секретный режим тестирования был обнаружен с SNES PPUs. Выполняя небольшую аппаратную модификацию, SNES PPUs начнет выводить 15-разрядный цифровой сигнал RGB!

Это почти точно то, что нам нужно! Тем не менее, этот режим имеет несколько проблем, таких как известный режим 7 не выход правильной картины в этом режиме. Кажется, эта функция никогда не была полностью завершена.

Кроме того, для этого по-прежнему потребуется изменить вручную консоли SNES и создать соответствующий механизм для захвата выходного тестового режима и его анализа. Тем не менее, в отличие от аналогового решения rGB захвата, этот цифровой сигнал имеет потенциал для того, чтобы быть поставлены через автоматическое тестирование, которое может позволить нам быстро завершить большую часть PPU реверс-инженерных работ.

Доски прорыва

Учитывая, что PpUs SNES статичны, можно было бы извлечь PPUs из рабочей консоли SNES и поместить их на протоборде или пользовательские ПХД вместе с двумя чипами VRAM. Отсюда микроконтроллер может сидеть между PPUs и интерфейсUSB на ПК, что позволит кодеру программировать все видео оперативной памяти и PPU внешних регистров. Наконец, кодер может вручную управлять часами PPU и пробовать полученные ppU I/O контакты, регистры и память во время каждого цикла.

Модифицируя эмулятор программного обеспечения для генерации этих же внутренних значений ввоза/о, можно было бы напрямую сравнить реальное оборудование с эмуляцией, даже в режиме реального времени. Это будет по-прежнему очень тяжелая работа, однако, так как мы до сих пор не имеют видимость во внутренних операциях PPUs.

Декаппинг

И поэтому последний, самый экстремальный подход будет заключаться в расширении наших усилий по уничтожению. У нас есть 20x умереть сканирования, но разрешение не достаточно, чтобы разработать и реконструировать отдельные логические схемы из них, такие, как это было сделано с visual 6502 проекта. Если мы сможем получить 100-x увеличение сканирования обоих PPU умирает, мы могли бы начать трудную задачу отображения всего PPUs и преобразования их в netlists или VHDL код. Они будут непосредственно пригодны для удовоблятся FPGA и могут быть портированы на C- или другой язык программного обеспечения, пригодный для удовечения с нашими эмуляторами программного обеспечения.

Ballpark оценки я получил от тех, кто сделал работу, как это в прошлом, что это займет около 600 часов, чтобы сделать это отображение для обоих PPUs. Это далеко за точку “давайте сбор средств и платить кому-то, чтобы сделать это” уровней и падает прямо в “давайте надеяться, кто-то чрезвычайно талантливый с уникальным, востребованным skillset заинтересован в добровольческой, чтобы помочь нам” территории.

Это, конечно, не означает, что я не был бы рад финансово вознаградить любого, кто в состоянии помочь мне, а также платить за любые части или труда требуется.

Призыв о помощи

Таким образом, я зашел так далеко, как я могу с моим SNES эмулятор проекта, и мне нужна помощь, чтобы закончить эту последнюю задачу. Если вы читали это далеко, мы надеемся, вы можете предоставить эту помощь! Любая помощь, втомяв вклад в наш проект bsnes GitHub, или любую исследовательскую документацию во внутреннюю работу НПФ SNES, которые могут быть созданы, будет иметь неоценимое значение!

Большое вам спасибо за чтение, и за постоянную поддержку каждого! Это была честь быть частью сообщества эмуляции SNES эти последние пятнадцать лет.

Contact Information:

BYUU
Tags:   Russian, United States, Wire