Большая часть людей радуется, когда им удаётся вернуть к жизни старые вещи. Бесконечное стремление заново пережить опыт молодости ведёт нас путями, которые мы давно уже позабыли. А по дороге мы иногда сталкиваемся с забытыми воспоминаниями, вызывающими другие забытые воспоминания, позволяющие нам заново переживать счастливые моменты, о которых мы не думали годами, или даже десятилетиями. Кого-то обратно в старшие классы, к вечерним автопрогулкам с выкрученной на полную катушку громкостью радиоприёмника возвращает рёв двигателя Ford Windsor. Для тех, кто родился в 80-х и 90-х подобные воспоминания могут вызывать видеоигры. Кто может забыть первую встречу со скрепкой-помощником из Microsoft Office, элегантную музыку из Final Fantasy, или вверх-вверх-вниз-вниз-влево-вправо-влево-вправо-b-a-выбрать-начать?
Прогресс в технологии процессоров позволил нам заново провести время с нашими любимыми играми посредством эмуляторов – программ, эмулирующих процессоры старых компьютеров. Игры скачиваются с ROM-чипов в файлы. Эти файлы затем можно загрузить в эмулятор, и поиграть в игру так, будто бы вы играете в неё на оригинальной системе.
Внутренности NES Zapper
Технология – штука прекрасная. Она позволяет нам двигаться вперёд и делать сегодня то, что было невозможным вчера. Однако в некоторых случаях эта парадигма неверна. Один из них – это игровая приставка NES, Nintendo Entertainment System, и её контроллер в виде пистолета, Zapper. В своё время NES стала самой популярной игровой приставкой, и не зря. Инженеры, программисты и эксперты по аудио компании Nintendo сумели породить некоторые из лучших видеоигр, когда-либо созданных. К сожалению, в некоторые из этих игр нельзя играть на вашем любимом эмуляторе на Raspberry Pi, поскольку Zapper несовместим с современными цифровыми мониторами. Вряд ли кто может забыть, как весело было играть в «Утиную охоту» (Duck Hunt). Эта игра шла в комплекте со всеми системами NES, поэтому мы все играли в неё. Но связанная с нею ностальгия погребена из-за нерешённых технологических особенностей.
Скажу вам, как хакер хакеру – этого больше терпеть нельзя. Так что сначала мы разберёмся, как работает Zapper, и почему он не работает с цифровыми дисплеями. А потом мы подумаем, как его исправить.
Проблема
Пистолет Zapper – это просто фотоэлемент с переключателем. Когда спусковой крючок (переключатель) нажимается, NES проводит определённые манипуляции с экраном, чтобы понять, куда направлен пистолет. Какие именно – обсудим чуть позже. Но сначала нам необходимо понять, что они работают только на аналоговых телевизорах с ЭЛТ. Если вы подключите ваш эмулятор к такому телевизору, у вас не будет проблем. Проблема в том, что телевизоров с ЭЛТ уже ни у кого нет. У всех стоят цифровые телевизоры с плоским экраном и мониторы. При подключении к такому монитору игра не будет работать. Нам нужно понять, почему это так.
Развенчиваем мифы
По поводу того, откуда NES знает, куда направлен Zapper, есть много путаницы, даже среди людей, немного разбирающихся в электронике. Некоторые из них считают, и продолжают распространять этот миф, что NES считывает строчки развёртки с ЭЛТ. ЭЛТ рисует строки развёртки с верха до низа экрана через определённые промежутки времени. Сравнив время начала прорисовки и время, когда Zapper видит линию, NES может узнать, куда указывает Zapper. А поскольку современный монитор показывает все строки одновременно, подсчитать, куда именно указывает Zapper, нельзя никак. Возможно, что какие-то более старые пистолеты на фотоэлементах так и работали, но NES работает не так. Совсем.
Как работает NES Zapper
Система довольно хитроумная. При нажатии спускового крючка NES рисует сплошной чёрный кадр на ТВ. NES рисует 60 кадров в секунду, поэтому один кадр находится на экране примерно 0,0166, или 17 мс. В следующем кадре на месте утки появляется белый прямоугольник, и приставка опрашивает состояние фотоэлемента в пистолете. Выход фотодиода сильно отличается в зависимости от того, направлен ли он на чёрный экран или на белый прямоугольник. И всё это происходит за время демонстрации двух кадров, 34 мс. Человек едва это замечает. Следующий кадр снова рисует игровое поле, и вам засчитывается попадание или промах. Гениально!
«Но погодите, как эта система работает, когда на экране есть две цели?» Хороший вопрос. Инженеры NES справляются с этой проблемой, просто повторяя весь процесс. Первый кадр будет чёрный, за ним будет кадр с белым прямоугольником на месте одной цели и опрос фотоэлемента. Если на экране есть ещё одна цель, то третий кадр будет с прямоугольником вокруг второй цели. Все три кадра проходят примерно за полсекунды, поэтому у вас не будет возможности подстрелить сразу двух уток. Вы можете подстрелить только одну, и эта техника даёт NES знать, какую именно.
«Если NES просто опрашивает состояние фотоэлемента, могу я просто направить пистолет на яркий свет и каждый раз записывать себе попадание?» Ещё один хороший вопрос. Инженеры NES избавились от такого обмана, опрашивая состояние фотоэлемента ещё во время появления первого, чёрного кадра. Если фотоэлемент видит что-то, отличное от чёрного экрана, приставка засчитывает вам промах. Есть слухи о том, что в самых ранних версиях игры эту ошибку не исправляли, но пока что никто такого бага продемонстрировать не смог.
Другой взгляд на проблему
Теперь, зная, как работает Zapper, мы можем перейти к решению проблем с цифровым монитором. Если игра просто замеряет разницу между чёрным и белым, то пистолет должен прекрасно работать и на цифровых мониторах. Но он, очевидно, не работает. Некоторые утверждают, что фотоэлемент чувствителен к инфракрасному излучению ЭЛТ, а цифровой монитор не испускает инфракрасных лучей. Но посмотрите на этот ролик: Zapper прекрасно работает!
[В ролике показан модифицированный Zapper / прим. перев.]
Мы знаем, что строки развёртки тут ни при чём, и что Zapper может различать контраст между белым и чёрным на цифровом экране. Мы можем заключить, что наша проблема связана со временем. Судя по всему, ЭЛТ может выводить изображение гораздо быстрее цифрового коллеги. В NES жёстко зашита необходимость проверять наличие белого прямоугольника после 16 мс. Если ваш цифровой экране не в состоянии обрабатывать выход NES с достаточной скоростью, то приставка будет искать белый прямоугольник в то время, когда на экране ещё видна игра.
Выходное разрешение NES — 256 x 240 точек. Цифровому монитору необходимо масштабировать каждый кадр до рабочего разрешения. Этот процесс порождает задержку, которая может доходить до 70 мс, серьёзно превышая наш показатель в 16 мс.
Как это исправить
Это будет нелегко. Если цифровой монитор по своей природе слишком медленный, то единственным решением будет замедление NES.
Вариант 1: уменьшение тактовой частоты
Мы все слышали про разгон процессора через увеличение тактовой частоты. А что насчёт торможения? Можем ли мы замедлить время в процессоре NES, не разогнав его до ощутимой доли от скорости света? При этом необходимо, чтобы игра шла с нормальной скоростью, но при нажатии спускового крючка переключалась на замедленную работу и, по сути, увеличивала время задержки. Помните, что NES выводит чёрный экран на 16 мс, а затем рисует белый прямоугольник. Замедляя процессор, мы можем увеличить эту задержку и дать цифровому монитору время на реакцию.
Вариант 2: редактирование ROM
ROM можно редактировать только в шестнадцатеричном редакторе. Что, если бы мы изучили эмулятор и нашли, в каком месте задаётся величина задержки после нажатия спускового крючка? Мы могли бы просто сделать её больше, и надеяться, что ничего не сломали.
Вариант 3: ваш вариант
Теперь, когда вы знаете, как работает NES Zapper, и почему он не работает с современными цифровыми мониторами, вы уже на полпути к решению этой проблемы и освобождению ностальгии, которой лишила нас жестокая технологическая судьба. Что бы вы сделали, чтобы заставить Zapper работать с цифровым монитором и стать героем интернета?
Схема работы не такая уж и сложная – наверняка мы все вместе сможем придумать, как сделать так, чтобы Zapper перестал стрелять холостыми в нашем цифровом мире. Делитесь вашими решениями в комментариях.
Источник