- PVSM.RU - https://www.pvsm.ru -
Большая часть людей радуется, когда им удаётся вернуть к жизни старые вещи. Бесконечное стремление заново пережить опыт молодости ведёт нас путями, которые мы давно уже позабыли. А по дороге мы иногда сталкиваемся с забытыми воспоминаниями, вызывающими другие забытые воспоминания, позволяющие нам заново переживать счастливые моменты, о которых мы не думали годами, или даже десятилетиями. Кого-то обратно в старшие классы, к вечерним автопрогулкам [1] с выкрученной на полную катушку громкостью радиоприёмника возвращает рёв двигателя Ford Windsor [2]. Для тех, кто родился в 80-х и 90-х подобные воспоминания могут вызывать видеоигры. Кто может забыть первую встречу со скрепкой-помощником из Microsoft Office, элегантную музыку из Final Fantasy, или вверх-вверх-вниз-вниз-влево-вправо-влево-вправо-b-a-выбрать-начать [3]?
Прогресс в технологии процессоров позволил нам заново провести время с нашими любимыми играми посредством эмуляторов – программ, эмулирующих процессоры старых компьютеров. Игры скачиваются с ROM-чипов в файлы. Эти файлы затем можно загрузить в эмулятор, и поиграть в игру так, будто бы вы играете в неё на оригинальной системе.
Внутренности NES Zapper [4]
Технология – штука прекрасная. Она позволяет нам двигаться вперёд и делать сегодня то, что было невозможным вчера. Однако в некоторых случаях эта парадигма неверна. Один из них – это игровая приставка NES, Nintendo Entertainment System, и её контроллер в виде пистолета, Zapper. В своё время NES стала самой популярной игровой приставкой, и не зря. Инженеры, программисты и эксперты по аудио компании Nintendo сумели породить некоторые из лучших видеоигр, когда-либо созданных. К сожалению, в некоторые из этих игр нельзя играть на вашем любимом эмуляторе на Raspberry Pi, поскольку Zapper несовместим с современными цифровыми мониторами. Вряд ли кто может забыть, как весело было играть в «Утиную охоту» (Duck Hunt [5]). Эта игра шла в комплекте со всеми системами NES, поэтому мы все играли в неё. Но связанная с нею ностальгия погребена из-за нерешённых технологических особенностей.
Скажу вам, как хакер хакеру – этого больше терпеть нельзя. Так что сначала мы разберёмся, как работает Zapper, и почему он не работает с цифровыми дисплеями. А потом мы подумаем, как его исправить.
Пистолет Zapper – это просто фотоэлемент с переключателем. Когда спусковой крючок (переключатель) нажимается, NES проводит определённые манипуляции с экраном, чтобы понять, куда направлен пистолет. Какие именно – обсудим чуть позже. Но сначала нам необходимо понять, что они работают только на аналоговых телевизорах с ЭЛТ [6]. Если вы подключите ваш эмулятор к такому телевизору, у вас не будет проблем. Проблема в том, что телевизоров с ЭЛТ уже ни у кого нет. У всех стоят цифровые телевизоры с плоским экраном и мониторы. При подключении к такому монитору игра не будет работать. Нам нужно понять, почему это так.
По поводу того, откуда NES знает, куда направлен Zapper, есть много путаницы, даже среди людей, немного разбирающихся в электронике. Некоторые из них считают, и продолжают распространять этот миф, что NES считывает строчки развёртки с ЭЛТ. ЭЛТ рисует строки развёртки с верха до низа экрана через определённые промежутки времени. Сравнив время начала прорисовки и время, когда Zapper видит линию, NES может узнать, куда указывает Zapper. А поскольку современный монитор показывает все строки одновременно, подсчитать, куда именно указывает Zapper, нельзя никак. Возможно, что какие-то более старые пистолеты на фотоэлементах так и работали, но NES работает не так. Совсем.
Система довольно хитроумная. При нажатии спускового крючка 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.
Мы все слышали про разгон процессора через увеличение тактовой частоты. А что насчёт торможения? Можем ли мы замедлить время в процессоре NES, не разогнав его до ощутимой доли от скорости света? При этом необходимо, чтобы игра шла с нормальной скоростью, но при нажатии спускового крючка переключалась на замедленную работу и, по сути, увеличивала время задержки. Помните, что NES выводит чёрный экран на 16 мс, а затем рисует белый прямоугольник. Замедляя процессор, мы можем увеличить эту задержку и дать цифровому монитору время на реакцию.
ROM можно редактировать только в шестнадцатеричном редакторе. Что, если бы мы изучили эмулятор и нашли, в каком месте задаётся величина задержки после нажатия спускового крючка? Мы могли бы просто сделать её больше, и надеяться, что ничего не сломали.
Теперь, когда вы знаете, как работает NES Zapper, и почему он не работает с современными цифровыми мониторами, вы уже на полпути к решению этой проблемы и освобождению ностальгии, которой лишила нас жестокая технологическая судьба. Что бы вы сделали, чтобы заставить Zapper работать с цифровым монитором и стать героем интернета?
Схема работы не такая уж и сложная – наверняка мы все вместе сможем придумать, как сделать так, чтобы Zapper перестал стрелять холостыми в нашем цифровом мире. Делитесь вашими решениями в комментариях.
Оригинал статьи [7]
Автор: SLY_G
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/staroe-zhelezo/287153
Ссылки в тексте:
[1] вечерним автопрогулкам: https://www.kinopoisk.ru/film/amerikanskie-graffiti-1973-7332/
[2] Ford Windsor: https://en.wikipedia.org/wiki/Ford_Windsor_engine
[3] вверх-вверх-вниз-вниз-влево-вправо-влево-вправо-b-a-выбрать-начать: http://mentalfloss.com/article/56401/23-places-where-konami-code-lives
[4] NES Zapper: https://en.wikipedia.org/wiki/NES_Zapper
[5] Duck Hunt: https://ru.wikipedia.org/wiki/Duck_Hunt
[6] ЭЛТ: https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D0%BE-%D0%BB%D1%83%D1%87%D0%B5%D0%B2%D1%8B%D0%B5_%D0%BF%D1%80%D0%B8%D0%B1%D0%BE%D1%80%D1%8B
[7] Оригинал статьи: https://hackaday.com/2015/11/16/resurrecting-duckhunt/
[8] Источник: https://habr.com/post/418201/?utm_campaign=418201
Нажмите здесь для печати.