Большая часть людей радуется, когда им удаётся вернуть к жизни старые вещи. Бесконечное стремление заново пережить опыт молодости ведёт нас путями, которые мы давно уже позабыли. А по дороге мы иногда сталкиваемся с забытыми воспоминаниями, вызывающими другие забытые воспоминания, позволяющие нам заново переживать счастливые моменты, о которых мы не думали годами, или даже десятилетиями. Кого-то обратно в старшие классы, к вечерним автопрогулкам с выкрученной на полную катушку громкостью радиоприёмника возвращает рёв двигателя 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 перестал стрелять холостыми в нашем цифровом мире. Делитесь вашими решениями в комментариях.
Оригинал статьи
Комментарии (48)
Ardanay
25.07.2018 15:54+3А мне вот запрещали играть в игры пистолетом :) Потому что кинескоп садят.
tormozedison
25.07.2018 20:35+4Не… Кинескоп, согласно тогдашнему мифу, садил сам факт игры, а не пистолет.
Прототипом мифа был реальный факт неравномерного износа люминофора от статичных изображений.
Roland_D
25.07.2018 16:30Сильно подозреваю, что универсального решения тут быть не может, т.к. все мониторы будут обладать разным временем задержки. Это потребует индивидуальной калибровки под монитор самостоятельно игроком. Да и всегда ли это время задержки строго одинаково у одного и того же монитора?
Nuwen
25.07.2018 16:37Ещё в те времена обратил внимание на такое поведение приставки, кое-как подключенной к старенькому, плохо настраиваемому ламповому телевизору «Рассвет»: если при запущенной пистолетной игре водить стволом вверх-вниз, то помехи на экране, в виде обширного, более светлого участка изображения, смещаются вслед за тем, куда указывает пистолет. Таким образом можно увидеть то, в какую часть экрана направлен ствол — в верхнюю или нижнюю, но по горизонтали точка прицела не локализуется, потому что светлое поле просто ходит вверх и вниз, занимая всю горизонталь. Ну я и думал всегда, что пистолет просто постоянно опрашивается приставкой на предмет задержки принимаемого от кинескопа света строки, а в момент выстрела положение прицела просто уточняется ещё по горизонтали. Как-то же приставка знала о том, куда направлен пистолет, раз отправляла такие помехи. Уж не знаю теперь, в чём дело, может подключенный пистолет просто работал как дополнительная антенна для помех, и от её положения и зависели помехи, либо у меня был какой-то китайский клон NES/FAMICOM, который работал по отличному от описанного в статье принципу.
Javian
26.07.2018 13:19+2В других приставках использовались и более сложные методы, к примеру учитывающие то, что луч (в ЭЛТ-телевизорах) освещает только одну точку в каждый момент времени. Приставка заливала экран белым в момент нажатия и отсчитывала время до засветки фотодиода. Таким образом, направление можно было вычислить более точно, а количество мишеней определялось «радиусом поражения» пистолета. Эта схема, к примеру использовалась в SNES.
habr.com/post/24274Nuwen
26.07.2018 15:29+2Да, кстати, вспомнилось. В момент выстрела засвечивался весь экран, и никаких белых прямоугольников. Выходит, по крайней мере, на том китайском клоне, на котором я это заметил, метод был именно таким. И вот интересно, насколько я понимаю, в России большинство приставок было именно китайскими разношерстными клонами, а не Dendy, которая разумеется была таким же китайско-тайваньским клоном, но имела какие-то ещё характерные особенности. Например видеопроцессор в ней работал на частоте NTSC, однако видеовыход был PAL. Значит, информация из статьи актуальна, как минимум, не для всех.
В глаза не видел "настоящей" Dendy, поэтому не знаю как там выглядели игры, зато перевидал с десяток разных китайских моделей, а в своё время стало откровением то, что оригинальный Famicom работал на частоте в 60Hz, а китайские клоны — на частоте 50Hz, что влияло на скорость игры и скорость и тональность звукового сопровождения. Оказывается, мы играли в заторможенную версию оригинальных игр, и те места, которые считали хардкорными, у американцев и японцев были вообще непроходимы. И даже игровая музыка была несколько динамичнее.Javian
26.07.2018 16:41+2Еще отличия в контроллерах: «игровыми контроллерами Famicom, NES и Dendy, и чем же они отличаются в этом плане.», «Денди — это очень странная смесь NES и Famicom, PAL и NTSC»
Там же в комментариях обсуждают ЖК и световой пистолет.
habr.com/post/260749
К слову интересное дополнение о принципах работы пистолета:
В ходе тестирования было выяснено, что сигнал с фотодиода поступает не постоянно, а только при резкой смене освещённости с темного на светлый. При этом, если в этот момент нажат курок — сигнал сильнее.
Световой пистолет к Ардуино
habr.com/post/141643Nuwen
26.07.2018 16:48А у нас в Сибири была достаточно популярна вот эта:
Найди, как говорится, несколько отличий.
Byteman
25.07.2018 17:19Самый простой вариант — добавить перед началом игры калибровочный код, который будет смотреть задержку (в кадрах) между выдачей видео с консоли и детектом на экране. Однако, могут возникнуть проблемы с «умным» деинтерлейсом в телевизорах. Возможно, придется выводить квадрат не один кадр, а два (телевизор может запросто не отрисовать одиночный черный кадр, а просто «смешает» два соседних кадра; при выдаче двух последовательных кадров он будет обязан их отрисовать).
lingvo
25.07.2018 18:43Для начала стоит проверить видны ли эти два кадра на современном мониторе или нет. Для этого надо взять быструю камеру( или тот же айфон в режиме замедленной сьемки). Если кадры мелькают, можно продолжить исследование и попробовать обмануть цепь детектора эмулятором — черный/белый. Если и это заработает — определяться, где вводить задержки.
Byteman
26.07.2018 14:14+1Не факт. Картинка с композитного видеовхода всегда прогоняется через деинтерлейсер. Посмотрите, как демы с ZX Spectrum'а, где используется эффект gigascreen (переключение двух экранных областей с частотой 50гц), смотрятся на современных ТВ. Некоторые телики показывают честное мерцание, некоторые просто смешивают два кадра. Третьи принимают такой сигнал как черезстрочный и показывают один кадр на четных, другой — на нечетных строках растра. Поэтому я и написал, что (возможно) придётся квадрат выводить не один кадр («поле» в терминологии черезстрочного сигнала), а два, чтобы телик/монитор это дело отрисовал 100%.
opanas
25.07.2018 18:23Недавно на кикстартере пытались денег поднять на разработку, кстати, но неуспешно:
www.kickstarter.com/projects/metsasta/modern-mallard
robert_ayrapetyan
25.07.2018 18:36Эээ, был уверен, что речь пойдет о другой утиной охоте (отечественного производства Электроника).
tormozedison
25.07.2018 20:32Это где вместо уток квадраты, что ли?
robert_ayrapetyan
25.07.2018 20:47Никаких квадратов, обычные утки. Конкретно эта версия называлась «Электроника ИМ-18».
tormozedison
25.07.2018 20:59А, такую тоже помню, там уток надо не стрелять, а ловить (ружьё в роли пылесоса?), как в «Ну, погоди».
solariserj
25.07.2018 20:11+2А есть ли разница на чб или цветном играешь? А то в моей молодости у нас был черно-белый горизонт, и не стрелял, хотя когда покупали то на цветном работал. Далее (не помню как) выяснилось что работает через футболку о_0 футболку просвечивало и по силуэту(темному пятну) можно было понять где утка. И игра приобрела командный характер один держит футболку перед телевизором, другой стреляет пистолетом, далее выяснилось что также работает через красную плёнку от обложки папки, и наконец наклеяли кусок этой красной обложки на пистолет и он начал стрелять. Но потом подвели порты которые расыпались, а починить не хватало навыков.
hzs
25.07.2018 21:30+4Тоже мне нашли проблему.
Играешь на старом ЭЛТ телевизоре и не паришься, и соотношение сторон экрана правильное и красивое размытие пикселей и вообще ламповая картинка.
Ну и аутентичность полная.tormozedison
25.07.2018 22:55Это сейчас легко говорить. Все такие телевизоры когда-нибудь выдохнутся, и снятые с производства детали к ним купить будет всё труднее и труднее. Не скоро, но обязательно наступит момент, когда даже Музей советских игровых автоматов будет вынужден искать запчасти к трубочным мониторам своих экспонатов с миру по нитке, а в некоторые ставить ЖК-панели.
hzs
26.07.2018 05:19Тогда и будем решать проблемы, по мере их поступления.
Думаю, лет 10 — 20 ещё можно будет найти ЭЛТ телевизоры в рабочем состоянии.
Byteman
26.07.2018 14:15+1А ещё круче найти кинескопный 60''+ проекционник 4:3 и играть на огромном экране :)
juray
26.07.2018 02:27+2По заголовку сначала было подумалось про какой-то ремейк самой игры.
Типа такого:
lingvo
Здесь тоже можно делиться?
Zapper постоянно отсылает в приставку состояние фотодиода или только когда приставка его спросит?
kvazimoda24
Недавно читал статью про этот пистолет. Там говорилось, что приставка по желанию может опросить датчик и без нажатия на курок. Подозреваю, что сам пистолет является совсем примитивным устройством, в котором стоит кнопка и фотодиод. Всё это напрямую подключается к приставке. А уж опрашивать или нет фотодиод и кнопку, и когда именно это делать решает программа в приставке.
Понятное дело, что постоянно смотреть информацию с фотодиода программе из статьи (игра Утиная охота) не нужно. Да это и не имеет смысла, т.к. для анализа направления пришлось бы постоянно мигать экраном, что было бы неприятным для игрока.