Этот пост является введением в мой проект «самодельной» консольной видеоприставки сделаной с нуля. Я вдохновлялся как ретро консолями так и современными образцами, но у меня получилась своя собственная архитектура. Мои друзья постоянно мне говорили, что я должен рассказать о своём проекте, а не делать всё исключительно «для себя», так что вот я публикую этот пост.
Внимание, это — перевод
Меня зовут Серхио Виейра (Sérgio Vieira) я выроc в Португалии в 80-е и 90-е годы, у меня давно ностальгия по ретро-геймингу, особенно по приставкам третьего и четвертого поколения.
Несколько лет назад я решил получше разобраться в электронике и попытаться сделать свою собственную приставку.
По профессии я программист и не имел никакого опыта как электронщик, если не считать (и не стоит этого считать) самостоятельных апгрейдов своего десткопа.
Хотя у меня и не было опыта, я сказал себе «почему бы и нет?», купил несколько книжек, несколько наборов электронщика и начал изучать исходя из своих ощущений о том, что именно стоит изучать.
Я хотел сделать приставку похожую на те которые вызывают у меня ностальгические чувства, я хотел что-то между NES и Super Nintendo, или может между Sega Master System и Mega Drive.
У этих приставок были CPU, оригинальный видео чип (тогда их ещё не называли GPU) и аудио чип, иногда встроеный, а иногда внешний.
Игры распространялись на картриджах, которые в общем были расширениями железа иногда просто ROM чипами, а иногда имели дополнительные компоненты.
Изначальный план был сделать приставку со следущими характеристиками:
- Без эмуляции, игры и программы должны работать на настоящем железе, не обязательно том самом из тех времён, но достаточно быстром для задачи, и не более того.
- С настоящим ретро CPU.
- С аналоговым ТВ выходом.
- Со звуком
- С поддержкой двух контроллеров
- Скроллинг бэков и анимация спрайтов
- С возможностями для поддержки платформерных игр вроде Mario, ну и конечно всяких других игр.
- С загрузкой игр и программ с SD карт.
Почему именно SD карты, а не картриджи, ну в основном просто так намного практичнее, их можно копировать с компа. А картриджи это значило бы, во-первых больше железа в приставке, а во-вторых производить железо для каждой программы.
Видео сигнал
Первое чем я занялся это генерация видео сигнала.
Любая консоль того периода, который я взял за образец, имела различные проприетарные графические чипы, что означает, что у всех у них были различные технические характеристики. По этой причине я не хотел использовать готовый графический чип, я хотел чтобы и моя консоль имела уникальные технические характеристики по графике. И поскольку я не мог сделать свой собственный графический чип, и в то время ещё не умел использовать FPGA, я решил ограничиться софтварным генерированием графического сигнала используя 8-битный, 20 мегагерцовый микроконтроллер.
Это не перебор, и как раз достаточно мощное решение для графики того уровня который мне был интересен.
И так, я начал использовать микроконтроллер Atmega644 на чистоте 20 Мгц для генерации видеосигнала в формате PAL для телевизора. Мне пришлось бит-бангить протокол PAL, поскольку сам чип не умеет его.
Микроконтроллер выдаёт 8-битный цвет (RGB332, 3 бита красный, 3 бита зелёный и 2 синий) и пассивный ЦАП преобразует это всё в RGB. К счастью в Португалии почти все телевизоры оборудованы разъёмом SCART и они поддерживают RGB вход.
Делаем для Денди AV-mod
У этой приставки хоть и есть выходы на тюльпаны, но центральный контакт у них запаян на землю, то есть они не задействованы, нужно аккуратно канцелярским ножом отделить центральный вывод от земляной дорожки, на фото я ручкой расчертил участки, где нужно резать.
Переделка Денди: видеоусилитель, AV-mod, RF-модуль и звук
Переделка Денди: видеоусилитель, AV-mod, RF-модуль и звук
Правильная графическая подсистема
Поскольку микроконтроллер довольно мощный, а использовать его я решил исключительно для генерации видео сигнала (я назвал это VPU — Video Processing Unit), то я решил заодно организовать дабл-буфер.
У меня получилось что второй микроконтроллер (PPU, Picture Processing Unit, чип Atmega1284 тоже на 20 МГц) генерировал картинку в микросхему ОЗУ номер 1 (я назвал её VRAM1), а первый в это же время отправлял содержимое второй микросхемы (VRAM2) в телевизор.
После одного кадра, а два кадра в системе PAL это 1/25 секунды, VPU переключает VRAM-ы и они меняются местами, PPU генерирует картинку в VRAM2, а VPU дампит VRAM1 на ТВ вывод.
Видео плата получилась очень сложной поскольку мне пришлось использовать внешнее железо чтобы оба микроконтроллера могли пользоваться обоими модулями памяти и чтобы ускорить доступ к ОЗУ, ведь там тоже бит-бангинг, так что пришлось добавить чипы 74 серии как счётчики, line-селекторы, трансиверы и тд.
Прошивки для VPU и PPU тоже получились громоздкие поскольку пришлось писать много кода чтобы выжать максимум скорости из графики. Сначала всё было написано на ассемблере, потом часть была переписана на Си.
В результате PPU генерирует картинку 224×192 пикселей, которая потом отпраляется на ТВ через VPU. Может разрешение вам покажется низким, но вообще-то это почти столько, сколько консоли того времени имели на самом деле, обычно 256×224. Несколько меньшее разрешение зато позволило мне добавить больше фич которые система успевает просчитать за один кадр.
Как и в старину, PPU имеет свою жёсткую механику которой надо уметь пользоваться. Подложка (бэк) рендерится из символов 8×8 пикселей, так же называемых тайлами. Получается что размер бэкграунда 28х24 тайла.
Чтобы бэк мог скроллиться плавно, попиксельно, я сделал так что всего есть 4 виртуальных экрана, каждый по 28х24 тайла которые идут в памяти последовательно и обёрнуты вокруг друг друга, на картинке это понятнее.
Поверх бэкграунда, PPU может отрендерить 64 спрайта которые могут быть 8 или 16 пикселей по высоте или ширине, то есть 1, 2 или 4 тайла и ещё могут быть флипнуты горизонтально и/или вертикально.
Сверху бэка можно ещё рендерить оверлеем один буфер размером 28х6 тайлов, это было задумано для отрисовки HUD-ов, скоров так чтобы не мешать основным спрайтам и скроллингу бэка.
Одна «продвинутая» фича в том, что бэк можно скролить не целиком, а каждую линию в отдельности, что позволяет всякие интересные эффекты вроде сплит скрина или почти-параллакса.
Ещё есть таблица аттрибутов, которая позволяет задавать каждому тайлу значение от 0 до 3, и потом можно всем тайлам с одним аттрибутом задать страницу тайлов или инкрементировать их символьное значение. Это удобно когда есть части бэка которые надо регулярно изменять и CPU не придётся обсчитывать каждый тайл в отдельности, ему достаточно только сказать что-то вроде: «все тайлы с аттрибутом 1 инкрементируйте числовое значение своего символа на 2», подобные вещи реализованые разными техниками можно наблюдать, например, в блочных тайлах в Mario где знак вопроса анимируется или в играх где есть водопад в котором все тайлы постоянно меняются создавая эффект падающей воды.
Почему именно 40 килобайт
В 1980-х объём памяти на цифровых устройствах измеряли в килобайтах, потому что ещё не было таких продвинутых её технологий. В большинстве картриджей для восьмибитных приставок было по 40 килобайт памяти. Для сравнения, это в сто тысяч раз меньше, чем на флешке в 4 гигабайта. Даже эта статья весит больше, чем 40 килобайт, так что по современным меркам этого действительно мало.
Два блока памяти в картриджах, 8 и 32 килобайта, в сумме — 40 килобайт.
Чтобы использовать больше памяти, нужно было идти на всякие ухищрения — ставить расширители памяти или отдельные блоки для работы с несколькими картриджами одновременно. Так как почти ни у кого из геймеров такой роскоши не было, то разработчики использовали только 40 доступных килобайт.
Какая бывает память
Когда у тебя мало памяти, у тебя мало возможностей: уровни однообразные, враги однообразные, геймплей одинаковый. Но иногда разработчики шли на безумные ухищрения, и в игру получалось запихнуть много «миров», секретов и вариантов геймплея.
Одна из игр, которая взорвала мозг всем в своё время, была та самая «Супер Марио»: в ней было огромное количество разнообразных уровней разной сложности, боссы, секретные уровни и непростой, очень насыщенный геймплей. Были уровни на земле, под землёй, под водой и даже на небе; у героя было несколько режимов — низкий, высокий, в белом комбинезоне. А как вам идея разрушаемого мира? А как вам атаки с воздуха? Короче, «Марио» была безумной, невероятной игрой для своего времени, а всё благодаря оптимизациям.
В видеоролике разработчики поставили себе похожую цель: сделать насыщенную, разнообразную игру с большим количеством уровней, миров и настроений. И они показали, как этого добиться с помощью жёстких оптимизаций.
«Супер Марио» — игра, в которую играл каждый, у кого была приставка.
CPU
Когда моя видеоплата заработала, я начал работать с CPU в качестве которого для моей приставки был выбран Zilog 80.
Одна из причин по который был выбран именно Z80, ну кроме того, что это классный ретро CPU, это его способность адресовать два 16 битных пространства, одно для памяти и второе для портов ввода-вывода, не менее легендарный 6502, например, так не может, он может только одно адресовать 16 битное пространство и в него приходится мапить как память так и различные внешние устройства, видео, аудио, джойстики, апаратный генератор случайных чисел и тд. Удобнее иметь два адресных пространства, одно полность отданное на 64 килобайта кода и данных в памяти и второе для доступа к внешним устройствам.
Сначала я подсоединил CPU к EEPROM в котором разместилась моя тестовая программка и ещё присоединил его через пространство ввода-вывода к микроконтроллеру который я установил чтобы можно было общаться с моим компом через RS232, и мониторить как работает CPU и всё остальное. Этот микроконтроллер Atmega324 работающий на 20 МГц я называю IO MCU — input/output microcontroller unit, он отвечает за контроль доступа к игровым контроллерам (джойстикам), SD карт ридеру, клавиатуре PS/2 и коммуникатору по RS232.
CPU подключается к микросхеме памяти на 128 килобайт, из которых только 56 килобайт доступны, это конечно бред, но я мог достать только микросхемы по 128 или 32 килобайта. Получилось, что память состоит из 8 килобайт ПЗУ и 56 килобайт ОЗУ.
После этого я обновил прошивку IO MCU с помощью этой библиотеки и у меня появилась поддержка SD карт ридера.
Теперь CPU мог ходить по директориям, смотреть что в них лежит, открывать и читать файлы. Всё это делается посредством записи и чтения в определённые адреса пространства ввода-вывода.
Дорожная карта при сборке Dendy своими руками
Схема, если кто всё-таки дочитал до этапа сборки) Чтобы открыть в полном расширении, на открывшейся картинке правой кнопкой — открыть в новой вкладке и уже левой кнопкой +.
Первым делом
Впаиваем 60-пиновый разъём и проверяем, как прозваниваются все его 60 контактов по дорожкам до тех мест, куда приходит каждый контакт. Почти половина ведёт к СPU, вторая половина — к PPU. Питание и выходы с генератора.
Вторым делом
Собираем схему питания. Разъём питания, диодный мост, стабилизатор с радиатором, конденсаторы до стабилизатора и после, кнопка включения и кнопка resset. Подаём питание и проверяем все последние ножки на всех микросхемах на наличие стабильного питания в +5 вольт. Последняя нога микросхемы +, минус находится на противоположной стороне в конце микросхемы.
Третьим делом
Собираем схему усилителя звука и вывода изображения. После сборки можно проверить работоспособность каскада касаниями к выходам левого и правого каналов с CPU, ножки 1 и 2. При касании к ним рукой должен появляться тихий шум на выходе усилителя звука. На вашем телевизоре, если вы подключили красный и белый выход ко входу аудио)
Касаниями к выходам с PPU ножка 21 на телевизоре при подключенном желтом кабеле к входу видео будет появляться мелкая рябь.
Четвёртым делом
Паяем все детали и каретки для микросхем на плату. Проверяем каждую припаянную деталь трижды: номинал, как припаяли, прозвонили её по месту.
Подключение CPU к PPU
Следущее, что я сделал это связь между CPU и PPU. Для этого я применил «простое решение» которое заключалось в приобретении двухпортового ОЗУ, это такая микросхема ОЗУ которую можно подключать сразу к двум разным шинам. Это позволяет избавиться он дополнительных микросхем вроде лайн-селекторов и, к тому-же, позволяет практически одновременный доступ к памяти с обоих чипов. Ещё PPU напрямую может обращаться к CPU на каждом кадре активируя свои немаскируемые прерывания. Получается, что CPU получает прерывание на каждом кадре, что полезно для разных задач по таймингу и для понимания когда пора заняться апдейтом графики.
Каждый кадр взаимодествия CPU, PPU и VPU происходит согласно следующей схеме:
- PPU копирует информацию из памяти PPU в внутреннюю память.
- PPU отправляет сигнал прерывания на CPU.
- Одновременно:
- CPU прыгает на функцию прерывания и начинает обновлять PPU память новым графическим состоянием. Программа должна вернуться из прерывания до следующего кадра.
- PPU рендерит картинку на основании информации ранее скопированой в одну из VRAM.
- VPU отправляет картинку из другой VRAM на ТВ выход.
Примерно тогда же я занялся поддержкой игровых контроллеров, сначала я хотел использовать контроллеры от Nintendo, но сокеты для них проприетарные и вообще их трудно найти, поэтому я остановился на 6-кнопочных контроллерах совместимых с Mega Drive/Genesis, у них стандартные сокеты DB-9 которые везде есть.
Устанавливаем операционную систему на игровую приставку
Установка игровой системы на уже работающую Raspbian производится через терминал. Это оставим на будущее, сейчас же попробуем вариант для новичков. Все описанные выше эмуляторы устанавливаются одинаково.
Для начала рекомендую попробовать RecalBox. Здесь самый понятный и дружественный интерфейс, настройка предельно простая, большинство фишек включено из коробки, а в виде бонуса получаем медиацентр KODI, который запросто заменит бюджетную ТВ-приставку для просмотра фильмов с флешки, по сети или онлайн.
1. Скачиваем выбранный образ с сайта разработчика.
2. Скачиваем и устанавливаем приложение Etcher для записи образа на карту памяти.
3. Записываем образ на карту памяти.
4. После окончания записи устанавливаем карту памяти в Raspberry и подключаем её к телевизору.
Во время первого запуска произойдет установка системы и первоначальная конфигурация. От пользователя ничего не потребуется, просто ждем несколько минут до запуска визуальной оболочки.
Сразу же система предложит настроить джойстик. Это может быть как USB-аксессуар, так и беспроводной. Под рукой лучше иметь клавиатуру, чтобы произвести все настройки в случае проблем с подключением геймпада.
Добавляем динамическую графику
Всё было супер, у меня была своя игровая приставка, но мне этого было мало, потому-что приходилось в игре использовать графику прошитую в памяти PPU и нельзя было нарисовать тайлы для конкретной игры и изменить её можно было только перепрошив ПЗУ. Я стал думать как добавить ещё памяти, чтобы CPU в неё мог бы загружать символы для тайлов, а PPU потом мог оттуда это всё считывать и как это сделать попроще поскольку приставка и так уже получалась сложной и большой.
И я придумал следущее: только PPU будет иметь доступ к этой новой памяти, а CPU будет загружать туда данные через PPU и пока этот процесс загрузки происходит, эта память не может быть использована для отрисовки, но можно будет в это время рисовать из ПЗУ.
После конца загрузки CPU переключит внутреннюю ПЗУ память на эту новую память, которую я назвал Character RAM (CHR-RAM) и в этом режиме PPU начнет рисовать динамическую графику, это наверное не лучшее решение, но оно работает. В результате новая память была установлена 128 килобайт и может хранить 1024 символа 8х8 пикселей каждый для бэкаграунда и ещё столько-же символов для спрайтов.
Исправление схемы стабилизатора питания, меняем на КРЕН-ку (7805)
Я заметил, что в данном клоне Денди в качестве стабилизатора питания на 5В стоит транзистор со стабилитроном, пару резисторов с конденсаторами, это не очень хорошая схема и желательно вместо неё поставить микросхему стабилизатор на 5В – 7805. Берём схему стабилизатора, а также и схему видеоусилителя, выхода звука с делителем на резисторах в точности как у игровой приставки Dendy Junior и всё будет работать как всегда отлично.
Переделка Денди: видеоусилитель, AV-mod, RF-модуль и звук
Переделка Денди: видеоусилитель, AV-mod, RF-модуль и звук
Переделка Денди: видеоусилитель, AV-mod, RF-модуль и звук
Переделка Денди: видеоусилитель, AV-mod, RF-модуль и звук
Зарисовал схему стабилизатора, который стоит изначально с завода (она в тетради ниже) и сверху ту на которую будем переделывать, на микросхеме 7805. Теперь распаяем эту схему вместо старой, которую нужно перед этим выпаять, дорожки тоже придётся где-то разрезать, а где-то добавить, Стабилизатор 7805 запаял на проводах, к нему также должен крепиться радиатор для охлаждения.
Переделка Денди: видеоусилитель, AV-mod, RF-модуль и звук
И наконец звук
До звука руки дошли в последнюю очередь. Сперва я хотел звук наподобие того что есть в Uzebox, то есть чтобы микроконтроллер генерировал 4 канала ШИМ-звука.
Однако, оказалось, что я могу легко достать винтажные чипы и я заказал несколько микросхем FM синтеза YM3438, эти ребята полностью совместимы с YM2612 которые использовались в Mega Drive/Genesis. Установив их можно получить музыку качества Mega Drive и звуковые эффекты производимые микроконтроллером.
Я установил ещё один микроконтроллер и назвал его SPU (Sound Processor Unit), он управляет YM3438 и сам может генерировать звуки. CPU управляет им через двух-портовую память, в этот раз она всего 2 килобайта.
Как и в графическом блоке, звуковой блок имеет 128 килобайта памяти для хранения PCM сэмплов и звуковых патчей, CPU загружает данные в эту память обращаясь к SPU. Получилось, что CPU либо говорит SPU исполнять комманды из этой памяти или обновляет комманды для SPU каждый кадр.
CPU управляет четырьмя ШИМ каналами через четыре циркулярных буфера находящихся в памяти SPU. SPU проходит через эти буферы и исполняет комманды записаные в них. Ещё есть один такой-же буфер для микросхемы FM синтеза.
Итого, как и в графике взаимодействие между CPU и SPU идёт согласно схеме:
- SPU копирует данные из памяти SPU во внутреннюю память.
- SPU ждёт сигнала прерывания от PPU (это для синхронизации)
- Одновременно
- CPU обновляет буферы ШИМ каналов и буферы FM синтезатора.
- SPU исполняет комманды в буферах согласно данным во внутренней памяти.
- Одновременно со всем этим, SPU обновляет ШИМ звуки на частоте 16 килогерц.
После того как все блоки были готовы, некоторые пошли на макетные платы. Для блока CPU я смог разработать и заказать кастомную PCB, не знаю стоит ли сделать это и для остальных модулей, думаю мне на самом деле повезло, что моя PCB сразу заработала.
На макетной плате сейчас (пока) остался только звук. Вот как всё выглядит на сегодняшний день:
Персонажи
В игре есть два вида графики: статичный фон и движущиеся предметы — игроки, противники, боссы и выстрелы. Всё, что движется, называется спрайтами. Разработчики делят всю графическую память на две части — одну под спрайты, вторую под фон:
Каждая клеточка — это мини-квадратик 8 на 8 пикселей.
В каждом таком квадратике можно что-то нарисовать, но использовать при этом только три цвета.
Если объединить несколько квадратиков в один, получится метаспрайт. В нашем случае — персонаж.
Приставка может использовать одновременно только 4 вида палитры, поэтому у нас получается 4 цветных главных героя и нераскрашенный злодей. Новое ограничение: на экране одновременно может быть только 8 спрайтов — на большее не хватает памяти. Поэтому для злодея места не остаётся. Можно пойти на хитрость и показывать их быстро-быстро по очереди, но тогда картинка будет мерцать и выглядеть хуже.
Разработчики радикально уменьшили размеры героев и злодея до одного спрайта. Теперь они выглядят более условно, зато помещаются на экран.
Меньше размер героя — больше свободного места для дизайна злодеев, боссов и спецэффектов. Сейчас в табличке собраны все варианты того, как может выглядеть персонаж в игре — и в прыжках, и на бегу.
Архитектура
Диаграмма иллюстрирует компоненты в каждом блоке и как они взаимодействуют друг с другом. Единственное, что не показано это сигнал от PPU к CPU на каждом кадре в виде прерывания и такой-же сигнал который идёт в SPU.
- CPU: Zilog Z80 на 10 МГц
- CPU-ROM: 8KB EEPROM, содержит код загрузчика
- CPU-RAM: 128KB RAM (56KB доступных), код и данные для программ/игр
- IO MCU: Atmega324, является интерфейсом между CPU и RS232, клавиатурой PS/2, джойстиками и файловой системой SD карт
- PPU-RAM: 4 килобайта двухпортовой памяти, промежуточная память между CPU и PPU
- CHR-RAM: 128KB RAM, хранит динамические тайлы для бэка (подложки) и спрайтов (в символах по 8×8 пикселей).
- VRAM1, VRAM2: 128KB RAM (43008 реально доступно), используются для фреймбуфера в них пишет PPU и читает из них VPU.
- PPU (Picture Processing Unit): Atmega1284, рисует кадр во фреймбуфер.
- VPU (Video Processing Unit): Atmega324, читает фреймбуфер и генерирует RGB и PAL сигнал и синхронизацию.
- SPU-RAM: 2KB двухпортовая RAM, служит интерфейсом между CPU и SPU.
- SNDRAM: 128KB RAM, хранит ШИМ патчи, PCM сэмплы и блоки инструкций для FM синтезатора.
- YM3438: YM3438, микросхема FM синтеза.
- SPU (Sound Processing Unit): Atmega644, генерирует звуки на принципе широтно-импульсной-модуляции (ШИМ) и управляет YM3438.
Исправление работы RF-модуля, убираем помехи
Как Вы можете видеть изначально видеосигнал из RF-модуля у Денди идёт на телевизор очень шумный, много помех в виде снега и искажённые цвета. Здесь всё просто, нужно эту часть заэкранировать, просто сделать металлический кожух сверху над всем модулем и соединить его с минусом питания. Но перед этим лучше все бескаркасные катушки залить парафином, чтобы не уходила частота, так как стоит немного задеть катушку и сигнал пропадает.
Переделка Денди: видеоусилитель, AV-mod, RF-модуль и звук
Также при добавлении в последующем видеоусилителя видеосигнал на этот радио модуль будет идти мощнее и качество картинки заметно улучшится, в этом Вы убедитесь позже (даже в итоге экран не понадобился).
Окончательные спецификации
CPU:
- 8-bit CPU Zilog Z80 на частоте 10Mhz.
- 8KB ROM для загрузчика.
- 56KB RAM.
IO:
- Чтение данных с FAT16/FAT32 SD карт ридера.
- Чтение/запись в порт RS232.
- 2 MegaDrive/Genesis-совместимых игровых контроллера.
- Клавиатура PS2.
Видео:
- Разрешение 224×192 пикселя.
- 25 кадров в секунду (половина FPS от PAL).
- 256 цветов (RGB332).
- 2×2 виртуальная подложка (448×384 пикселей), с двунаправленым по-пиксельным скроллингом, на базе четырёх полноэкранных страниц.
- 64 спрайта с шириной и высотой 8 или 16 пикселей с возможностью как вертикального так и горизонтального флипа.
- Подложка и спрайты состоят из символов по 8х8 пикселей каждый.
- Символьная видеопамять на 1024 символа для бэкграунда и 1024 для спрайтов.
- 64 независимых горизонтальных скроллинга по задаваемым линиям
- 8 независимых вертикальных скроллингов по задаваемым линиям
- Оверлей на 224х48 пикселей с опциональной прозрачностью по цветовому ключу.
- Таблица аттрибутов бэкграунда.
- RGB и композитный PAL через разъём SCART.
Звук:
- ШИМ на 8 бит и 4 канала, с встроенными вейвформами: квадрат, синус, пила, шум и тд.
- Сэмплы на 8 бит, 8 КГц в одном из ШИМ каналов.
- Микросхема FM синтеза YM3438 загружаемая инструкциями на частоте 50 герц.
Для приставки был написан загрузчик. Загрузчик помещается в CPU ПЗУ и может занимать до 8 килобайт. Он использует первые 256 байт ОЗУ. Загрузчик это первое, что исполняет CPU. Он нужен чтобы показать программы находящиеся на SD карте.
Эти программы находятся в файлах которые содержат скомпилированый код и могут также содержать графику и звук.
После выбора программы она загружается в память CPU, память CHR и память SPU. После чего программный код исполняется. Максимальный размер кода загружаемого в приставку 56 килобайт, кроме первых 256 байт и конечно надо учесть место для стека и данных. И этот загрузчик и другие программы написаные для этой приставки создавались одинаковым нижеописаным способом.
Выбираем операционную систему, на которой будет работать приставка
После подбора компонентов следует определиться с операционной системой будущей консоли. На данный момент существует три хороших сборки, которые подходят для нашей задачи:
- Lakka
- RecalBox
- RetroPie
Lakka – сборка с красивым визуальным интерфейсом в стиле PlayStation. Проект развивается довольно неспешно, Lakka еще имеет множество глюков и недоработок. RecalBox – более продвинутое решение «все в одном». После установки образ уже будет содержать пару десятков классических игр для разных платформ. Кроме этого в образ интегрирован медиацентр KODI. В пару нажатий можно превратить игровую консоль в медиакомбайн для проигрывания видео со съемного накопителя, из интернета или сетевого хранилища. Есть возможность настроить IPTV.
RetroPie – еще один многофункциональный эмулятор старых игровых консолей. Изначально в образ не включены игры и нет медиаплеера вроде KODI, однако, присутствует возможность установить RetroPie поверх родной операционной системы для Raspberry – Raspbian. Это значит, что игровой сервис может работать на «малинке» одновременно с другими службами, например, с HomeBridge, связывающем умные гаджеты в доме.
Выбирать стоит между двумя последними вариантами. RecalBox – простой образ с играми из коробки и медиацентром KODI, а RetroPie для тех, кто хочет повозиться и установить систему поверх Raspbian.
Memory/IO Mapping
Что важно при разработке под эту приставку, так это учитывать как CPU обращается к различным блокам, и правильно распределять адресное пространство ввода вывода и адресное пространство памяти.
CPU обращается к оперативной и постоянной памяти загрузчика через адресное пространство памяти.
Адресное пространство памяти
А к PPU-RAM, SPU-RAM и IO MCU через адресное пространство ввода-вывода.
Адресное пространство ввода-вывода
Как видно из таблицы, внутри адресного пространства ввода-вывода выделены адреса для всех устройств, IO MCU, PPU и SPU.
Настройка геймпада (джойстика)
Геймпад нужно настраивать только после того, как Вы установили нужный вам эмулятор. Медиацентр имеет встроенные драйвера и умеет работать практически со всеми известными джойстиками.
Чтоб настроить геймпад, откройте «Настройки», затем «Система». Подключите ваше устройство и перейдите в раздел «Ввод», после «Настройка подключенных контроллеров»:
Выберите тип вашего джойстика и настройте значения кнопок:
На этом всё. Как видите, всё просто до безобразия. А Вы думали, что ваш Smart TV способен быть игровой приставкой?
Если у Вас остались какие-то вопросы, пишите в комментарии и вместе мы всё решим.
В закладки
Пожалуй, у многих есть старый ноутбук или морально устаревший компьютер. Такой агрегат и выбросить жалко, и денег на площадке частных объявлений с него не выручишь.
Вместо того, чтобы оставлять старичка пылиться в дальнем углу чулана, его можно отлично приспособить под ретро-консоль. В этой статье я расскажу о собственном опыте превращения повидавшего ноутбука в отличный симулятор Sega, Dendy и PS1.
Управление PPU
Из информации в таблице видно, что для управления PPU надо писать в память PPU которая доступна по адресам 1000h-1FFFh в адресном пространстве ввода-вывода.
Распределение адресного пространства PPU
PPU Status может принимать следущие значения:
- Режим вшитой графики
- Режим динамической графики (CHR-RAM)
- Режим записи в CHR память
- Запись завершена, ждём подтверждения режима от CPU
Вот, например, как можно работать со спрайтами: Приставка может рисовать 64 спрайта одновременно. Данные по ним доступны через CPU через адресное пространство ввода-вывода по адресам 1004h-1143h (320 байт), на каждый спрайт приходится 5 байт информации (5 * 64 = 320):
- Байт разных флагов, каждый бит этого байта флаг: Active, Flipped_X, Flipped_Y, PageBit0, PageBit1, AboveOverlay, Width16, Height16.
- Байт символа, номер символа из таблицы (определяемой флагами выше).
- Байт цветового ключа (то есть какой цвет — прозрачность)
- Байт координаты X
- Байт координаты Y
Итого, чтобы увидеть спрайт, надо установить флаг Active в 1, и задать координаты X и Y в пределах видимости, координаты 32/32 помещают спрайт в верхний левый угол экрана, меньшие значения спрячут его либо сделают частично видимым.
Потом мы можем установить код символа и цвет прозрачности.
Например, если нам нужно показать спрайт номер 10, то адрес будет 4145 (1004h + (5 x 9)), пишем значение 1 для активирования и координаты, например, x=100 и y=120, пишем по адресу 4148 значение 100 и по адресу 4149 значение 120.
Рисуем карты (и оптимизируем их)
Даже 60 байт на экран, которые у нас получились, — это всё равно очень много, ведь нужно сделать много разных карт, написать логику поведения персонажей и сделать меню, заставки и титры. Каждый байт на счету.
Первый вариант — уменьшить количество памяти для отрисовки карты: сделать их симметричными, что даст нам 30 байт вместо 60. Мы рисуем одну половинку карты, а потом просто отзеркаливаем её. Сравним с картой, которую мы бы хотели получить:
Вроде всё на месте, а выглядит плохо — сразу видна симметрия и доступ наверх закрыт блоками.
И вот тут разработчики делают очередной хитрый ход, который даст им немного дополнительной памяти для графики. Смотрите:
- Они дают для хранения одной суперплитки один байт.
- Считают по картинке, сколько получилось суперплиток в прошлом разделе — 96.
- Так как программисты начинают считать с нуля, то самое большое число, которое получится, — 95, а это 1011111 в двоичной системе счисления.
- В этом длинном числе всего 7 цифр, а в байте их 8, поэтому остаётся один лишний бит из каждого числа.
- 4 суперплитки дадут 4 бита.
- Эти 4 бита можно использовать, чтобы сдвинуть по кругу ряд с зеркальным отражением и получить как бы новый ряд, уже без видимой симметрии.
Если вы не знаете, что такое двоичная система счисления, — почитайте нашу статью об этом, а потом вернитесь сюда.
4 суперплитки дают 4 бита. Посмотрим, что можно с ними сделать.
Сначала делают симметричный уровень… А затем сдвигают верхнюю полосу вправо по кругу. 1100 — это 12 в десятичной системе счисления, именно столько сдвигов вправо нужно сделать, чтобы получилось как на картинке.
То же самое делают с третьей строкой и получают уже приемлемое начало уровня.
Действуя таким образом, разработчики могут менять уровни до неузнаваемости, не затрачивая при этом вообще лишней памяти. Помним, что наш экран — это ещё не весь уровень, сверху нужно нарисовать ещё много раз по столько же.
Используем ассемблер
Один из способов программирования для приставки это ассемблер.
Вот пример как показать один спрайт и анимировать его чтобы он двигался и отталкивался от краёв экрана.
ORG 2100h PPU_SPRITES: EQU $1004 SPRITE_CHR: EQU 72 SPRITE_COLORKEY: EQU $1F SPRITE_INIT_POS_X: EQU 140 SPRITE_INIT_POS_Y: EQU 124 jp main DS $2166-$ nmi: ; обработчик немаскируемого прерывания (NMI) ld bc, PPU_SPRITES + 3 ld a, (sprite_dir) and a, 1 jr z, subX in a, (c) ; увеличить X inc a out (c), a cp 248 jr nz, updateY ld a, (sprite_dir) xor a, 1 ld (sprite_dir), a jp updateY subX: in a, (c) ; уменьшить X dec a out (c), a cp 32 jr nz, updateY ld a, (sprite_dir) xor a, 1 ld (sprite_dir), a updateY: inc bc ld a, (sprite_dir) and a, 2 jr z, subY in a, (c) ; увеличить Y inc a out (c), a cp 216 jr nz, moveEnd ld a, (sprite_dir) xor a, 2 ld (sprite_dir), a jp moveEnd subY: in a, (c) ; уменьшить Y dec a out (c), a cp 32 jr nz, moveEnd ld a, (sprite_dir) xor a, 2 ld (sprite_dir), a moveEnd: ret main: ld bc, PPU_SPRITES ld a, 1 out (c), a ; активировать спрайт 0 inc bc ld a, SPRITE_CHR out (c), a ; задать символ спрайту 0 inc bc ld a, SPRITE_COLORKEY out (c), a ; установить цветовой ключ спрайту 0 inc bc ld a, SPRITE_INIT_POS_X out (c), a ; установить координату Х спрайту 0 inc bc ld a, SPRITE_INIT_POS_Y out (c), a ; установить координату Y спрайту 0 mainLoop: jp mainLoop sprite_dir: DB 0
Использование языка Си
Можно также использовать язык Си, для этого нам понадобится компилятор SDCC и некоторые дополнительные утилиты.
Код на Си может получится медленнее, но зато написать его быстрее и проще.
Вот пример кода, который делает то же самое, что и код на ассемблере выше, тут используется библиотека которая помогает делать вызовы к PPU:
#include #define SPRITE_CHR 72 #define SPRITE_COLORKEY 0x1F #define SPRITE_INIT_POS_X 140 #define SPRITE_INIT_POS_Y 124 struct s_sprite sprite = { 1, SPRITE_CHR, SPRITE_COLORKEY, SPRITE_INIT_POS_X, SPRITE_INIT_POS_Y }; uint8_t sprite_dir = 0; void nmi() { if (sprite_dir & 1) { sprite.x++; if (sprite.x == 248) { sprite_dir ^= 1; } } else { sprite.x—; if (sprite.x == 32) { sprite_dir ^= 1; } } if (sprite_dir & 2) { sprite.y++; if (sprite.y == 216) { sprite_dir ^= 2; } } else { sprite.y—; if (sprite.x == 32) { sprite_dir ^= 2; } } set_sprite(0, sprite); } void main() { while(1) { } }
Готовим образ
Запускать наши ретро игры мы будем в специально разработанной операционной системе Recalbox, построенной на базе Linux. Но вместо обычного Linux там отлично подготовленный интерфейс, заточенный на игровую составляющую.
Ну что, флешка в руках, адекватный ноутбук или ПК на базе (создавать дистрибутив необязательно на старичке), приступаем к подготовке накопителя.
1. Загружаем образ Recalbox, выбрав PC 32 bit (желательно) или PC 64 bit (в зависимости от вашего ПК). Дистрибутив можно скачать тут [300 – 340 МБ].
С помощью Etcher всего за несколько минут можно подготовить необходимую нам флешку, не вникая в нюансы создания загрузочных накопителей.
В Etcher выбираем загруженный образ —> Выбираем флешку —> Нажимаем Flash. Дожидаемся окончания копирования.
3. Теперь пришло время загрузить Recalbox на стареньком ПК или ноутбуке. Вставляете флешку, перезагружаете компьютер и выбираете в качестве источника загрузки флешку.
— на компьютерах Mac: зажать клавишу Option до появления логотипа Apple и выбрать из списка флешку;
— на Windows-совместимых ПК или ноутбуках: зайти в Bios и в списке настроек найти пункт «First Boot Device». Там должен быть установлен USB-накопитель.
Как попасть в Bios зависит от конкретной модели ноутбука или материнской платы. Наиболее часто используемые клавиши, которые следует нажимать при загрузки: Del (Delete), F10, F2. Одна из них вам точно подойдет.
Через пару минут вы увидите логотип Recalbox и можете считать, что большая часть дела уже сделана.
Обязательно подключите геймпад, поскольку управлять оптимизированным под данный тип манипулятора Recalbox с клавиатуры — то еще мучение.
Динамическая графика
(В оригинале Custom graphics. прим. пер.)
В ПЗУ приставки зашиты 1 страница тайлов для бэка и ещё страница готовых спрайтов), по умолчанию можно использовать только эту фиксированую графику, однако можно переключиться на динамическую.
Цель у меня была такая, чтобы вся необходимая графика в бинарной форме сразу грузилась в оперативную память CHR, причём делать это умеет код в загрузчике из ПЗУ. Для этого я сделал несколько картинок правильного размера с разными полезными символами:
Поскольку память динамической графики состоит из 4-х страниц по 256 символов 8х8 пикселей каждый и 4-х страниц таких же символов для спрайтов, я перевёл картинки в PNG формат, удалил повторяющиеся одинаковые:
И потом использовал самописную тулзу чтобы перевести это всё в бинарный формат RGB332 с блоками 8х8.
В результате имеем файлы с символами, где все символы идут последовательно один за другим и каждый занимает по 64 байта.
Добавляем в игру сложный режим
Когда игрок прошёл все уровни, ему можно дать возможность поиграть на повышенной сложности: он уже знает всю игру и может пройти более сложные ловушки и боссов. Например, сложный режим может отличаться дизайном уровней и поведением противников.
Чтобы и этот режим поместился в оставшуюся память, снова используют трюки с памятью и графикой.
Чтобы игрок понял, что начались трудности, просто меняют палитру. Это почти столько же по памяти, но выглядит сложнее.
Уровень можно поменять так: берут исходную картинку, накладывают сверху новые детали и получают сложную локацию. В среднем на это уходит по 7 байт на каждый экран.
Звук
Волновые RAW сэмплы переведены в 8-битный 8-килогерцовые PCM сэмплы.
Патчи для звуковых эффектов на ШИМ и музыки пишутся особыми инструкциями.
Что касается микросхемы FM синтеза Yamaha YM3438, то я нашел программку называемую DefleMask которая выдаёт музыку синхронизируемую по PAL и предназначеную для YM2612 микросхемы из Genesis, которая совместима с YM3438.
DefleMask экспортирует музыку в формате VGM и я её конвертирую ещё одной самописной утилитой в свой собственный двоичный формат.
Все бинарники всех трёх типов звука комбинируются в один двоичный файл, который мой загрузчик умеет читать и загружать в звуковую память SDN RAM.
Устанавливаем игры
После того, как мы все настроили и подготовили, распакуйте архив с играми и загрузите его к вам на Smart TV или TV Box при помощи флешки. Теперь откройте главный экран «Kodi» и выберите раздел «Игры» нажав на него:
Нужно выбрать нашу папку с играми, поэтому нажимаем «Добавить игру…». В открывшемся окне нажмите обзор, затем найдите вашу папку с играми. Когда вы откроете папку, она окажется пустая, и это нормально. Нажмите «OK», после чего ещё раз «OK». Готово, по завершению вас перебросит назад в меню, в котором будет ваша папка с играми.
Эмулятор
Я написал эмулятор своей приставки на С++ с применением wxWidgets, чтобы проще было девелопить для неё.
CPU эмулируется библиотекой libz80.
В эмулятор добавлены фичи для отладки, я могу его остановить в любой момент и заняться пошаговой отладкой ассемблера, есть маппинг к исходному коду на Си если для игры был использован этот язык.
По графике, я могу заглянуть в видео память, в таблицы символов и в саму CHR память.
Вот пример программы запущеной на эмуляторе со включёнными средствами отладки.
Эти видео снимались камерой смартфона направленой на экран ЭЛТ телевизора, прошу прощения за неидеальное качество картинки.
Интерпретатор БЭЙСИКа программируемый с PS/2 клавиатуры, после первой программы, я показываю как писать напрямую в память PPU через адресное пространство ввода-вывода активируя и двигая спрайт:
Демка графики, в этом видео программно скачут 64 спрайта 16х16, на фоне бэкграунда с динамическим скроллингом и оверлеем который двигается под и над спрайтами:
Звуковая демка показывает возможности YM3438 и ШИМ звук, звуковые данные этой демки и FM музыка и ШИМ звуки вместе занимают почти все доступные 128 килобайт звуковой памяти.
Тетрис, для графики использваны почти только возможности бэкграунда, музыка на YM3438, звуковые эффекты на ШИМ патчах.
Этот проект поистине воплощение мечты, я над ним работал уже несколько лет, с перерывами, смотря по свободному времени, никогда не думал, что дойду так далеко в создании собственной игровой ретро видео приставки. Она, естественно, не идеальна, я уж точно не эксперт в электронике, в приставке явно вышло слишком много элементов и несомненно можно было сделать лучше и наверное кто-то из читателей как раз об этом думает.
Но всё-же, в процессе работы над этим проектом, я узнал многое об электронике, игровых приставках и дизайне компьютеров, языке ассемблера и других интересных вещах, и главное я получил огромное удовлетворение играя в игры которые я сам написал на железе которое я сам разработал и собрал.
У меня есть планы делать приставки/компьютеры и дальше. Вообще-то, я уже делаю новую приставку, она почти готова, и является упрощёной ретро приставкой на базе FPGA платы и нескольких дополнительных компонетов, (в намного меньшем количестве чем в этом проекте, уж точно), задуманой быть намного дешевле и повторяемее.
Хотя я тут очень много написал об этом проекте, несомненно ещё многое можно обсудить, я едва упомянул как звуковой движок работает, как CPU с ним взаимодействует, да и о графической системе и других входах-выходах и обо всей приставке в целом ещё много чего можно было бы расказать.
Смотря на реакцию читателей я может быть напишу ещё статей сфокусировавшись на обновлениях, подробностях об отдельных блоках приставки или других проектах.
В этом разделе приведены подробные принципиальные схемы процессорного модуля и пультов, а также рассмотрен вариант построения картриджа с программным обеспечением 8-разрядных игровых приставок DENDY.
1.3.1. Модуль процессора
В игровой приставке DENDY обычно имеются три платы: * центрального процессора; * выходных разъемов; * ВЧ модулятора и стабилизатора. Между собой платы соединены гибкими плоскими (ленточными) кабелями. Иногда встречаются варианты, выполненные на одной или двух печатных платах, однако это не влияет на схему приставки. Первоначально игровые приставки содержали несколько микросхем различной степени интеграции, причем основными являлись микросхемы центрального процессора и видеопроцессора. Развитие микроэлектроники привело к тому, что игровые приставки теперь включают только БИС типа UM6561 или ее аналог. В этой микросхеме на одном кристалле расположены центральный и графический процессоры, память и регистры ввода/ вывода. Многие видеоприставки корейского производства вместо одной UM6561 используют несколько микросхем (обычно две или три). Однако принцип работы приставки и сигналы на выходных разъемах в таком случае не изменяются, поэтому данные варианты схемы здесь рассматриваться не будут.
Многокристальный вариант
Принципиальная схема первого варианта игровой приставки DENDY, изготовленного с применением нескольких микросхем различной степени интеграции, приведена на рис. 1.12. Итак, основой игровой приставки является микросхема центрального процессора (IC1). Работа процессора синхронизируется внешним генератором тактовых импульсов, выполненным на транзисторах Q1 и Q2, частота которого стабилизирована кварцем X1 (21,251465 МГц). Сигналы всех внутренних шин (адреса A0 — А15, данных DO — D7 и управления) игровой приставки выведены на разъем XS1, к которому подключается картридж. Шины данных (выводы IC1/21-28), адреса (выводы IС1/4-19) и управления (выводы IС1/31,34) соединяют центральный процессор (IC1) с микросхемой ОЗУ (IC3) и видеопроцессором (IC2). Дешифратор адреса на микросхеме 74LS139 (IC8) вырабатывает сигналы, разрешающие другим микросхемам обмениваться данными с центральным процессором. На входы дешифратора поступают три старших разряда шины адреса А13 — А15 (выводы IС8/2,3,13) и сигнал М2 (вывод IC8/14). Если процессор работает с памятью, установленной в картридже, то сигнал ВЗ на выводе IC8/9 имеет низкий уровень. Когда обмен данными происходит с встроенным ОЗУ приставки (IC3), низкий уровень принимает сигнал АО на выводе IC8/4. Сигнал низкого уровня на выводе IC8/5 свидетельствует о том, что центральный процессор задействует микросхему видеопроцессора IC2. На одном кристалле с центральным процессором расположены также звуковой процессор игровой приставки и схема дешифратора адреса портов ввода/вывода.
Выходные сигналы первого и второго аудио-каналов микшируются и поступают на выход AU1 (вывод IС1/1), а сигналы остальных каналов — на выход AU2 (вывод IC1/2). Полный сигнал звукового сопровождения образуется путем смешивания в схеме, выполненной на резисторах R8 — R12 и конденсаторе С7, а затем подается на выходной разъем игровой приставки и на вход модулятора, формирующего ВЧ сигнал. На выводы IС1/39-37 передаются три разряда числа (D0, D1 и D2), записываемого в порт 4016h.
Каждый раз, когда процессор производит чтение из порта с адресом 4016h, па выходе СК1 (вывод IС1 /36) появляется импульс низкого уровня. А если процессор читает из порта с адресом 4017h, аналогичный импульс формируется на выходе СК2 (вывод IC1/35). Выходные сигналы игровых пультов и светового пистолета передаются на шину данных через два буферных регистра IC6 и IC7 (типа 74НС368). Микросхема видеопроцессора IC2 совместно с микросхемой видеопамяти IC4 выдает полный
видеосигнал. IC2 и IC4 связаны шинами адреса, данных и управления. Микросхема видеопамяти IC4 аналогична микросхеме основного ОЗУ. Обратите внимание: в видеопроцессоре IC2 одни и те же выводы (IC2/31-37) применяются как шина данных и как шина адреса. Сначала сюда поступают младшие восемь бит адреса ячейки видеопамяти. При появлении сигнала низкого уровня на выходе ALE (вывод IC2/39) эти данные запоминаются в буферном регистре IC5 (74LS373). Затем на выходе ALE устанавливается напряжение высокого уровня, на выводах IC2/26-30 остаются старшие разряды адреса, а выводы IC2/31-37 используются как шина данных. Сигналы шин видеопроцессора также выведены на разъем подключения картриджа XS1. Полный видеосигнал с выхода VIDEO OUT видеопроцессора (вывод IC2/21) поступает через эмиттерный повторитель, выполненный на транзисторе Q3, на выходной разъем VIDEO OUT и на модулятор. Каскад усиления видеосигнала в некоторых моделях может отсутствовать.
Теперь мы вкратце расскажем об основных отличиях от базовой схемы, присутствующих в других моделях. Все они касаются используемых разъемов и назначения отдельных выводов. Существуют два основных варианта конструкции рассматриваемой игровой системы. Приставка NES оснащается 72-контактным разъемом для подключения картриджа, 48-контактным разъемом расширения и 7-контактными разъемами для подключения игровых пультов. Игровая приставка FAMICOM (DENDY) программно полностью совместима с приставкой NES, но использует 60-контактный разъем для подключения картриджа, 15-контактный разъем расширения и 9-контактные разъемы для подключения игровых пультов. Разводка всех разъемов игровой приставки DENDY приведена на рис. 1.13а-в, а приставки NES — на рис. 1.13г-е.
Однокристальный вариант
Принципиальная схема однокристального варианта игровой приставки DENDY приведена на рис. 1.14. Здесь функции центрального процессора, видеопроцессора и памяти выполняет одна БИС типа UM6561. Частоту внутреннего тактового генератора стабилизирует кварцевый резонатор XI (26,601712 МГц). Иногда схема тактового генерато¬ра содержит также транзистор. Большинство выходных сигналов подаются непосредственно на разъем картриджа XS4. Часть сигналов поступает на разъемы для подключения игровых пультов XS1, XS2 и разъем расширения XS3. Видео- и аудиосигналы передаются на выходные разъемы игровой приставки и на вход модулятора, иногда через транзисторные усилители.
Выходные разъемы
В приставке DENDY имеются два или три разъема для подключения пультов, светового пистолета и других периферийных устройств. Разъемы могут быть трех типов: 7-, 9- и 15-контактные. Игровые пульты разрешается подсоединять к 7-1 или 9-контактному разъему для подключения пульта или к 15-контактному разъему расширения приставки, световой пистолет — только к 7- или 15-контактному разъему, другие устройства — к 15-контактному разъему. Для подключения пультов служат два 9-контактных разъема и один 15-контактный разъем расширения. Картридж приставки DENDY использует 60-контактный разъем, расположенный сверху. В игровой приставке NES для игровых пультов предназначены два 7-контактных разъема и один 48-контактный разъем расширения. Для подключения картриджа в приставке NES применяется 72-контактный разъем, отличающийся от 60-контактного наличием дополнительных цепей, соединенных с разъемом расширения. На этот разъем выведены сигналы шин видеопроцессора и центрального процессора. Внешний вид разъемов игровой приставки DENDY и назначение отдельных контактов приведены на рис. 1.13. Разъем расширения (рис. 1.136) рассматривается ниже, поскольку именно он наиболее
удобен для подключения различных дополнительных устройств. На контакт 2 (AUDIO IN) подается звуковой сигнал, который смешивается с выходными сигналами звукового процессора. Контакты 4-8 (J2 DO — J2 D4) представляют собой входы соответствующих разрядов порта второго джойстика. Коды сигналов с этих входов можно получить из порта 4017h командой LDA $4017. Вход J1 D1 (контакт 13) подсоединен к разряду D1 порта 4016h. При обращении центрального процессора к портам с адресами 4016h и 4017h на выходах CLK1 (контакт 14) и CLK2 (контакт 9) формируются кратковременные импульсы низкого уровня. На выходы OUT0 -OUT2 (контакты 10-12) передаются разряды DO -D2 слова, записываемого в порт 4 016h. На вход IRQ (контакт 3) поступает сигнал запроса прерывания.
1.3.2. Картридж
Сменный модуль игровой приставки DENDY — картридж — содержит обычно две микросхемы ПЗУ или ОЗУ. Одна микросхема ПЗУ подключается к видеопроцессору и хранит информацию знакогенераторов. Вместо ПЗУ знакогенераторов в некоторых картриджах используется микросхема статического ОЗУ. Другая микросхема ПЗУ с программным обеспечением подсоединяется к центральному процессору. Иногда на плате картриджа располагается дополнительное ОЗУ с питанием от литиевой батареи, которое предназначено для сохранения игровой ситуации. Практически во всех картриджах, за исключением самых простых, имеется микросхема контроллера страниц памяти, выполняющая функцию программируемого дешифратора адреса. Конструктивно картридж приставки DENDY представляет собой защитный пластмассовый корпус размерами 105x90x20 мм с ключом в виде двух скосов для правильной установки. В нем располагается печатная плата с 60-контактным разъемом и установленными бескорпусными микросхемами: ПЗУ, ОЗУ и контроллера страниц. Принципиальная схема игрового картриджа без дополнительного ОЗУ с контроллером страниц типа МВС1 приведена на рис. 1.15. Картридж состоит из двух микросхем ПЗУ (IC1 и IC2) и контроллера страниц памяти IC3. Микросхема IC1 (27С128) — это ПЗУ видеопроцессора! с записанными в нем знакогенераторами. В адресное пространство видеопроцессора отдельные страницы ПЗУ помещаются по адресам 0000h — 1FFFh. Младшие разряды адреса поступают на микросхему IC1 непосредственно с соответствующих контактов разъема XS1. Старшие разряды
Рис. 1.15. Принципиальная схема картриджа игровой приставки DENDY
адреса VA12 и VA13 формирует микросхема контроллера страниц памяти IC3. Выбор микросхемы ПЗУ происходит при наличии сигнала низкого уровня на входе CS (вывод IC1/20), подключенном к линии VA13 шины адреса видеопроцессора. Данные передаются с выходов ПЗУ на контакты разъема XS1. Микросхема IC2 (KONAMI ROM 1Mbit) представляет собой масочное ПЗУ с записанной в нем программой емкостью 1 Мбит (128 Кб). Младшие разряды адреса А0 — А13 поступают с соответствующих контактов картриджа, а старшие разряды адреса А14 — А16 генерирует контроллер страниц памяти IC3. Сигнал CS, разрешающий работу ПЗУ IC2, также передается с микросхемы IC3. IC3 является программируемым дешифратором адреса, формирующим старшие разряды адреса для микросхем ПЗУ IC1 и IC2. Она также вырабатывает сигнал VA10′, от уровня которого зависит выбор режима отражения экранных страниц. В рассматриваемом картридже часть выходов не подключена, поэтому возможности микросхемы используются не полностью.
1.3.3. Модулятор
Модулятор игровой приставки DENDY получает сигнал изображения от микросхемы видеопроцессора IC2 и звуковой сигнал от микросхемы центрального процессора IC1 и формирует полный телевизионный ВЧ сигнал в одном из метровых диапазонов. Схема модулятора не стандартизирована и определяется, как правило, фирмой-изготовителем. Однако принцип работы и состав основных узлов всегда одинаковы, так что изменения схемы не должны вызывать затруднений при ремонте. Принципиальная схема одного из возможных вариантов ВЧ модулятора приведена на рис. 1.16. Задающий ВЧ генератор выполнен на высокочастотном транзисторе Q2 (аналог транзистора КТ368А). Он формирует несущую частоту одного из телевизионных каналов. Обычно рабочая частота генератора приставки находится в пределах 170— 230 МГц и определяется элементами L1, С8 — C11 1, R9 — R11. Регулировка частоты производится изменением индуктивности катушки L1. Генератор, реализованный на транзисторе Q1 (аналог транзистора КТ3102), формирует поднесущую звука для полного телевизионного сигнала. Выходной сигнал генератора модулируется сигналом звуковой частоты, поступающим через цепь R4, С1 с входа AUDIO IN (контакт 4 разъема CN1). В зависимости от страны-изготовителя приставки частота генератора составляет 5,5 или 6,5 МГц. Точная подстройка частоты сигнала осуществляется вращением сердечника трансформатора Т1. Смеситель, выполненный на диодах D1, D2 (аналог диода КД503А), трансформаторе Т2 и транзисторе Q3, формирует полный ВЧ телевизионный сигнал. На вход смесителя поступает сигнал задающего генератора и низкочастотный видеосигнал с контакта 3 разъема CN1. С выхода смесителя ВЧ сигнал передается через согласующую цепь С15, L3 на выходной разъем RF OUT процессорного модуля.
1.3.4. Игровые пульты
Для игровой приставки DENDY существует около десяти различных видов игровых пультов. Однако наибольшее распространение получили стандартный игровой пульт, входящий в Комплект поставки, турбо-пульт с дополнительными кнопками и световой пистолет. Ниже рассмотрены принципиальные схемы этих устройств, а также схема адаптера для одновременного подключения четырех пультов.
Стандартный игровой пульт
Стандартный игровой пульт для приставки DENDY состоит из подвижной крестовины и четырех
отдельных кнопок. Внутри пульта установлена бескорпусная микросхема регистра сдвига, являющаяся аналогом микросхемы HEF4021B. В случае отсутствия оригинальной микросхемы можно использовать практически любой 8-разрядный регистр сдвига. Принципиальная схема стандартного пульта приведена на рис. 1.17.
Рис. 1.17. Принципиальная схема стандартного игрового пульта для приставки DENDY
При нажатии кнопки во время игры на соответствующий вход сдвигового регистра подается сигнал низкого уровня. Высокий уровень при разомкнутых кнопках обеспечивается соединением входных линий регистра с шиной питания +5 В через резисторы сопротивлением 10-68 кОм. Состояния входов в регистре IC1запоминаются при поступлении импульса высокого уровня на вход РЕ микросхемы. После этого по отрицательному фронту сигнала на входе CLK (вывод IC1/10) происходит сдвиг содержимого регистра и выдача старшего разряда по шине D0 У второго игрового пульта, поставляемого вместе с приставкой, могут отсутствовать кнопки START и SELECT, однако на схему пульта и принцип его работы это не влияет.
Турбо-пульт
Принципиальная схема турбо-пульта для игровой приставки DENDY приведена на рис. 1.18. Единственное отличие турбо-пульта от стандартного заключается в наличии дополнительного выхода Т6 Hz у микросхемы сдвигового регистра и двух дополнительных кнопок TURBO А и TURBO В, соединенных с этим выходом. Внутренний генератор микросхемы пульта формирует на выходе Т последовательность импульсов частотой 6-10 Гц. Таким образом, нажатие и удерживание кнопки TURBO А аналогично нажатию и отпусканию кнопки А с интенсивностью 6 раз в секунду. Применение данных кнопок уменьшает износ клавиш пульта, поскольку кнопки А и В обычно используются в игре при стрельбе.
Рис. 1.18. Принципиальная схема турбо-пульта для игровой приставки DENDY
Адаптер для подключения четырех пультов
В некоторых играх могут участвовать до четырех игроков. В этом случае четыре игровых пульта параллельно подключаются к разъемам игровой приставки через специальный адаптер. Принципиальная схема адаптера приведена на рис. 1.19. Как видно из принципиальной схемы, основной задачей адаптера является обеспечение считывания информации с пультов 1 и 3 во время поступления первых восьми синхроимпульсов, и с пультов 2 и 4 -при следующих восьми. Сигнал синхронизации, поданный по линии STRB, фиксирует состояние пультов в их внутренних регистрах и осуществляет начальную установку схем адаптера. В течение первых восьми синхроимпульсов на выходах Q8 счетчиков IC1 и IC2 формируются сигналы низкого логического уровня, что обеспечивает поступление синхроимпульсов на пульты 1 и 3, а также передачу информации от этих пультов на входы игровой приставки. После восьмого синхроимпульса, пересылаемого от игровой приставки при чтении из порта ввода/ вывода, на выходе Q8 соответствующей микросхемы (IC1 или IC2) появляется сигнал высокого логического уровня (лог. 1), что приводит к переключению коммутатора IC3 или IC4 и подсоединению к разъемам приставки пультов 2 или 4 соответственно.
Световой пистолет
На рис. 1.20 приведены возможные варианты принципиальной схемы светового пистолета игровой приставки DENDY. В качестве светочувствительного элемента здесь используется фототранзистор. В самых дешевых приставках его иногда заменяют фотодиодом, что приводит к ухудшению чувствительности устройства. Сигнал с выхода фотодиода через разделительный конденсатор С1 поступает на усилитель, выполненный на транзисторе Q1. С коллектора этого транзистора инвертированный сигнал через контакт 5 по цепи D4 передается в процессорный модуль игровой приставки.
Если пистолет направлен на телевизионный экран, то на выходе D4 формируется импульсный сигнал с частотой, равной периоду кадровой развертки. Курок светового пистолета соединен с кнопкой с нормально замкнутыми контактами. Если курок отпущен, контакт разъема D3 соединен с общим проводом. При нажатии курка контакты размыкаются, и на входе D3 появляется сигнал высокого логического уровня, который обеспечивается за счет подключения этой цепи внутри игровой приставки через резистор 10-51 кОм к шине +5 В.
1.3.5. Блок питания
Блок питания игровой приставки DENDY состоит из внешнего сетевого адаптера и внутреннего стабилизатора.
Задачей внешнего сетевого адаптера является преобразование сетевого напряжения ~220 В в постоянное напряжение 9-12 В, которое передается на внутренний стабилизатор игровой приставки. Принципиальная схема сетевого адаптера DENDY представлена на рис. 1.21. При ремонте блока следует помнить, что на выходном разъеме центральный контакт соединен с общим проводом.
Нестабилизированное напряжение с адаптера поступает на внутренний стабилизатор игровой приставки, выполненный на микросхеме AN7805 или на транзисторе и расположенный в процессорном модуле. На выходе стабилизатора формируется постоянное напряжение +5 В. Принципиальные схемы двух вариантов стабилизатора напряжения питания игровой приставки DENDY приведены на рис. 1.22 и в дополнительном описании не нуждаются.
Рис. 1.22. Принципиальные схемы стабилизатора напряжения питания игровой приставки DENDY
1.4. Характерные неисправности
Приставка не включается
Возможные причины: неисправность сетевого адаптера или внутреннего стабилизатора; короткое замыкание или обрыв цепей питания; неисправность картриджа; неисправность процессорного модуля. Алгоритм поиска неисправности: 1. Измерить выходное напряжение сетевого адаптера. Если оно превышает 9-12 В, заменить сетевой адаптер. Практика показывает, что наиболее часто сбои вызваны диодами выпрямительного моста. Если вышел из строя трансформатор, подойдет любой источник питания с выходным напряжением 9-12 В и допустимым током нагрузки 500 мА. 2. Отключить от процессорного модуля пульты, картридж и модулятор, после чего проверить блоки игровой приставки на отсутствие коротких замыканий. Если короткое замыкание обнаружено, после его устранения проверить стабилизатор и установленный в нем низкоомный резистор. При возникновении перегрузки обычно происходит обрыв одного из печатных проводников в цепи питания, поэтому необходимо тщательно осмотреть платы и убедиться в целостности проводников. З. .Если короткое замыкание отсутствует, проверить внутренний стабилизатор игровой приставки. Напряжение на выходе стабилизатора должно находиться в пределах 5±0,1 В; в противном случае в стабилизаторе, выполненном на микросхеме AN7805, следует заменить микросхему IC1 (аналог КР142Е-Н5А) и проверить конденсаторы С1 — С4. В стабилизаторе, реализованном на транзисторе, проверить транзистор Q1 (возможная замена — КТ815), стабилитрон D1 (возможная замена — КС156А) и резистор R1. Вместо резистора допустимо поставить предохранитель, который будет защищать стабилизатор от короткого замыкания. 4. Включить приставку без пультов, модулятора и картриджа. На выходном разъеме VIDEO OUT должен присутствовать видеосигнал. При подаче этого сигнала на НЧ вход телевизора на экране появится хаотическое изображение, состоящее из цветных точек и квадратов. Наличие выходного сигнала свидетельствует о неисправности в пультах или в модуляторе. 5. При отсутствии выходного сигнала проверить кварцевый генератор и транзисторный каскад усиления видеосигнала. Исправность кварцевого резонатора Х1 и транзисторов Q1 — Q3 позволяет сделать вывод о необходимости замены всего процессорного модуля.
Приставка работает нестабильно
Возможные причины: неисправность внешнего сетевого адаптера или внутреннего стабилизатора; загрязнение контактов разъема подключения картриджа.
Алгоритм поиска неисправности:
1. Проверить выходное напряжение сетевого адаптера. Часто сбой возникает из-за малой нагрузочной способности адаптера, поставляемого в комплекте с игровой приставкой. Проблема решается I подключением более мощного адаптера. 2. Проверить надежность контактных соединений в разъемах приставки. Разъем подключения картриджа необходимо осмотреть особенно тщательно. Протереть контакты спиртом. 3. Проверить внутренний стабилизатор игровой приставки. Полезно установить микросхему или силовой транзистор стабилизатора на радиатор с до-статочной площадью рассеивания (около 10 см2). 4.Установить дополнительные конденсаторы в цепи питания, например номиналом 100,0 мкФ х 16 В и 0,01 мкФ на каждой из плат приставки и в картридже.
Не работает световой пистолет
Возможные причины: обрыв в соединительном кабеле или плохие контакты в разъеме; неисправность фотодиода или транзистора светового пистолета; неисправность контактов курка в световом пистолете.
Алгоритм поиска неисправности:
1. Проверить целостность соединительного кабеля и надежность соединения в разъеме. В случае выхода из строя разъема заменить его вместе с ответной частью на любой 7-контактный разъем, имеющийся в наличии. 2. Проверить транзистор в световом пистолете и контакты под курком. Удостовериться в наличии замыкания контактов при нажатом курке, поскольку поломка, как правило, происходит в механической части пистолета. 3. Низкая чувствительность пистолета часто объясняется смещением фокусирующей линзы, установленной в стволе. В этом случае необходимо установить линзу на место и закрепить ее. Регулировка места крепления линзы позволяет улучшить характеристики даже работающего светового пистолета. 4.Исправность внутренних цепей светового пистолета свидетельствует о необходимости замены всего процессорного модуля игровой приставки.
Не работает пульт
Возможные причины: обрыв в соединительном кабеле или плохой контакт в разъеме; загрязнение кнопок; неисправность микросхемы пульта.
Алгоритм поиска неисправности:
1. Проверить целостность соединительного кабеля и надежность соединения в разъеме. В случае выхода из строя разъема заменить его вместе с ответной частью на любой 7-контактный разъем, имеющийся в наличии. 2. Проверить входные сигналы РЕ и STROBE. Отсутствие сигналов свидетельствует о необходимости замены центрального процессора. 3. Проверить выходной сигнал микросхемы, установленной в пульте. При отсутствии сигнала заменить пульт.
Не работают некоторые кнопки пульта
Возможные причины: загрязнение пульта или неисправность микросхемы. Алгоритм поиска неисправности: 1. Протереть спиртом плату пульта и резиновую прокладку с токопроводящими площадками. 2. Если неисправны токопроводящие площадки на резиновой прокладке, восстановить их, наклеив кусочки фольги. Удобнее использовать фольгу от сигаретных пачек: она имеет бумажную основу, что обеспечивает лучшее приклеивание к резине. 3. В случае нарушения токопроводящего покрытия на плате восстановить его с помощью очищенного монтажного провода, припаянного к дорожкам печатной платы. 4. Если все контактные площадки исправны, необходимо заменить микросхему, установленную в пульте, или весь пульт.
Нет ВЧ сигнала на выходе модулятора
Возможные причины: нарушение настройки генератора, неисправность задающего генератора или смесителя. Алгоритм поиска неисправности: 1. Убедиться, что неисправный элемент находится в схеме ВЧ модулятора, проверив наличие видео аудиосигналов на НЧ выходе. Отсутствие какого-либо из этих сигналов свидетельствует о поломке процессорного модуля. 2. Если нет ни звука, ни изображения, наиболее вероятна неисправность задающего генератора. Для проверки генератора следует измерить частоту выходного сигнала: она должна находиться в пределах 170-230 МГц. Отсутствие сигнала позволяет сделать вывод о необходимости замены транзистора Q2. В случае выхода частоты генератора за указанные границы необходимо проверить элементы LI, С8 -С11, R10, R11. 3. Убедившись в исправности задающего генератора, проверить смеситель (диоды D1, D2 и трансформатор Т2), а также согласующую цепь L2. С13, С14. 4.Отсутствие аудиосигнала при нормальном изображении свидетельствует о сбое генератора под-несущей звуковой частоты. В этом случае проверить соответствие частоты генератора ПЧ звука телевизионному стандарту (5,5 или 6,5 МГц) и при необходимости подстроить генератор вращением сердечника трансформатора Т1. При отсутствии сигнала на выходе генератора заменить транзистор Q1.
Где взять игры и как их устанавливать
Приведенные на скриншоте игры установлены самостоятельно
По умолчанию в Recalbox уже включены несколько олдскульных игрушек. Из представленных консолей: Super Nintendo, Sega, Gameboy Advanced и классика шутера — игра Doom.
Сразу скажу, что предустановленный набор игр вас, мягко сказать, разочарует. Поэтому нужно загрузить то, что во что мы играли на заре возникновения консолей.
Благо в сети есть практически вся коллекция, которая в начале 90-х заняла бы пару комнат, заваленных глючащими и ненавистными картриджами.
В Recalbox нельзя установить игр просто скопировав их на флешку. Даже не пробуйте. Для этого нужно подключение ПК или ноутбука к сети.
Загрузить игры можно на таких сайтах:
- – русскоязычный сайт, где представлены десятки консолей; ; ; ;
На деле же сайтов сотни и при желании можно найти все, что угодно. Google в помощь.
Каждая игра представлена в ZIP архиве. Он нам и нужен для загрузки в Recalbox. Как писал выше, скопировать игру на флешку не получится. Нужно подключить наш ПК или ноутбук к сети.
В идеале — воспользоваться встроенным Ethernet-портом, поскольку с ним не нужно проводить дополнительные настройки. Вставили витую пару в нашу импровизированную консоль и готово.
Хотите по Wi-Fi? Тогда открывайте настройки в Recalbox (кнопка Start на геймпаде) —> Настройки сети —> Включить WiFi —> задать настройки сети и пароль.
Когда подключение будет успешно установлено, вы увидите выданный нашей «консоли» IP-адрес. Запоминаете его и вбиваете в адрес основного ноутбука (не древнего). В моем случае это 192.168.0.1
Совет: Для загрузки больших игр пользуйтесь FTP-менеджером. Размер игр, которые можно загрузить в веб-интерфейсе Recalbox, ограничен по объему.
После окончания загрузки необходимо перезагрузить Recalbox на ноутбуке. Установленная игра тут же появится в списке.
Смело жмем Start и наслаждаемся геймплеем 10 – 30 летней давности. Хороше игры!
Recalbox — отличный вариант, который дарит возможность понастальгировать по прошлому и вспомнить, какими были старые добрые Super Mario, Battle Tanks, Crash, Super Bomberman и другие шедевры.
(9 голосов, общий рейтинг: 4.44 из 5) В закладки
На мой взгляд, вся суть сборки приставки заключается в 3 этапах.