Как сделать самодельную игровую приставку
Самодельная консоль (Ещё одна)
Знаете я очень люблю портативные консоли, если вы читали мои предыдущие блоги то наверняка знаете об этом. Я понимаю, что тема уже довольно заезженная, одним из моих самых успешных блогов был тот который был о создании ретро-консоли, потом были ещё подобные блоги от сторонних авторов, но в целом все рассказывали об одном и том же. Я помню, что даже в далёком 2014 году на сайте выходил блог, который даже получил недельный касарь, но там было совсем не то.
Так вот, я вдохновившись тем блогом и зарубежными роликами с Ютуба решил попробовать вновь. Но теперь это будет не просто очередной блог о ретро-консоли, нет. Это будет большой блог со своей конкретной целью, приготовьтесь, это будет очень интересно.
Экскурс в историю
Но для начала историческая справка.
Прародителем портативных консолей можно назвать MicroVision от компании Milton Bradley, выпущенную в 1979 году. В приставке можно было менять картриджи, что позволяло запускать более одной игры. MicroVision является раритетом в наше время и некоторые коллекционеры готовы прилично заплатить за эту портативку.
Спустя год появляется Nintendo со своим Game and Watch, так же известная у нас благодаря кампании «Электроника». Особенностью был жидкокристаллический экран КОТОРЫЙ не позволял запускать другие игры кроме той, что была уже предустановлена. Можно выделить то, что именно на приставке от Nintendo впервые появилась «крестовина» без которой трудно представить современные контроллеры.
Nintendo вновь решила показать на что способна в 1989 году выпустив легендарный GameBoy. У портативки был простенький экран, но это позволило уменьшить энергопотребление до минимума. Так же была возможность мультиплеера по специальному кабелю.
В том же году на рынок выходит консоль от Atari, под названием Atari Lynx. Её главным отличием от конкурента в лице GameBoy был цветной экран. Хоть качество графики и поражало, но высокое энергопотребление в купе с конским ценником быстро похоронили приставку.
В 1990 году уже другой гигант выходит со своей портативной консолью, это была Sega Game Gear. У приставки был более привычный горизонтальный вид, так же она имела цветной экран, но так же как и Atari Lynx имела большие затраты электричества, что было жирным минусом.
Спустя 6 лет Nintendo выпускает обновлённую версию GameBoy с приставкой Pocket. Экран стал больше, а вместо 4 батареек стали использовать всего две. Благодаря этому играть стало гораздо комфортнее. Стоит также сказать, что в том же году вышла небезызвестная «Тамагочи». Симулятор ухаживания за виртуальным питомец, что было больше похоже на работу чем на развлечение, но людям нравилось.
Ещё через два года выходит GameBoy Color. Улучшенная версия предыдущей портативки и как ясно из названия, наконец-то появился цветной экран. Так же можно было запускать картриджи старой приставки.
В 1999 году в борьбу включилась Sony. Хотя как включилась, она провела эксперимент выпустив PocketStation. Маленькое устройство, напоминающее своим видом уже упомянутый «Тамагочи». Под устройство делались специальные версии игр, даже выходила 7 «финалка». Конечно это не гриндилка на 300+ часов, но всё равно интересное приключение одного из «Чокобо». Народ одобрил.
В 2001 году выходит принципиально новая GameBoy Advance. С повышенным качеством картинки и более тонкая она пришлась по душе фанатам. В 2003 вышла GameBoy Advance SP, та же консоль но в удобном формате «раскладушки».
В том же 2003 выходит первый «игровой смартфон» (как странно это звучало в том году) от кампании Nokia с интересным именем N-GaGe. У устройства была очень интересная конструкция и неплохие технические характеристики. (Мне запомнилась одна из игр серии Might and Magic). Но новую приблуду невзлюбили и попытка Nokia откусить кусок пирога с треском провалилась.
В том же году Sony возвращается, но уже не с маленьким экспериментом, а полноценной приставкой, всем известной PlayStation Portable. Консоль произвела в своё время фурор. В течении следующих лет вышло ещё несколько вариаций данной приставки. PSP получила много похвалы, хоть и не смогла добраться до уровня DS.
В этом же году выходит PlayStation Vita. Своеобразная преемница PSP! Так люди полагали. А вот тут давайте по подробнее.
PS Vita вышла 17 декабря 2011 года в Японии, далее уже в других странах. Поддержка консоли осуществлялась аж до 1 марта 201 года. Новшеством в отличии от PSP было добавление второго стика, сенсорный передний экран и задняя панель. 3G модем, Bluetooth, возможность серфинга по сети, а характеристики консоли! Четырёхъядерный процессор с частотой 2Ггц, видеочип с частотой 200 Мгц и объемом видеопамяти 128 мегабайт, и целых пол гигабайта ОЗУ! Это было довольно внушительно. Но к разочарованию Sony, консоль провалилась. Её ругали за маленькое количество AAA-проектов и консоль довольно быстро загнулась.
Но спустя десять, покупка PS Vita кажется довольно неплохим вариантом даже при условии существования конкурента в виде Nintendo Switch. Почему? Потому что благодаря фанатам на консоли появилось множество полезного и крутого. Порты популярных проектов, новые игры которые выходят до сих пор, возможность стриминга с пк на Виту (об этом я кстати рассказывал в своём предыдущем блоге), ну и конечно не стоит забывать о том, что существует возможность эмуляции PSP. Так что купив PS Vita вы убиваете двух зайцев одним ударом. Но есть одно «но». Всегда есть это неприятное но. Технические характеристики приставки очень скудны по меркам 2021 года. По этому.
. Я решил сделать PS Vita X, ну или 2, или Next, называйте как хотите. На фоне набирающего популярность тренда портативных ПК-консолей я попытаюсь сделать тоже самое. Но давайте создадим цель и некоторые правила. Целью будет создание портативной приставки работающей на ОС от ПК и имеющей сенсорный экран. А чтобы было интересней, мы поставим ограничение. Постараемся уложиться в определенную сумму денег. И за основу мы возьмем стоимость полноценного комплекта новой PS Vita там с чехольчиками, наушниками и картой памяти на 32 гб. В среднем такой комплект обойдется вам за 18000 рублей, вот в эту сумму и попробуем уложиться. Приступим!
Начинка
Изначально я думал собрать пк с начала, на распечатанной плате, но как оказалось во первых, я не смогу сделать мощную начину, а во вторых у меня не было специальных навыков для этого. Да это бы сильно уменьшило стоимость, но я все же решил пойти по пути наименьшего сопротивления и купить обычный одноплатный компьютер. Да не мужик, но зато, одну из главных задач мы преодолели, практически любой современный одноплатный компьютер будет мощнее системок PS Vita.
Но по итогу мы имеем 2Гб оперативной памяти и 32 встроенной, четырёхъядерный CPU и GPU от Intel, на чистоте 1.9 Ггц и 350 Мгц соответственно. Есть небольшие потери, но так как мы ограничены в средствах жаловаться не приходиться. Так же здесь есть 2 разъема USB, разъём для в интернет (хоть и есть Wi-Fi модуль).
Экран
Было решено вместо покупки обычного сенсорного мини экрана, а немного заморочится и купить отдельно специальные экран и сенсорную «наклейку», что примечательно оба эти элемента от всё той же кампании LattePanda. Нам нужно на сам экран наклеить «сенсорную наклейку» (предварительно сняв плёнки с того и другого). На плате компьютера будут два разъема от этих элементов, единственное, с чем придется потрудиться так это с корпусом. Нужно будет сделать специальное крепление для экрана. Минус 4000.
Контроллер
До этого все было легко, но на удивление, с геймпадом произошло больше всего проблем. Изначально планировалось взять раздвижной геймпад и попробовать прикрепить его на всю конструкцию, но это показалось мне очень скучным вариантом и я решил сделать это чуть более оригинально. Кто-нибудь помнит PSP GO? Экспериментальную версию знакомой консоли, которую довольно сильно ругали, но это другая история. Так вот, она имела довольно интересный вид, по этому было решено взять старенький DualShock 3, разобрать его, засунуть в самодельный корпус для геймпада который позднее прикрепим к основному корпусу. Причем нужно будет оставить отверстие для разъема для зарядки, это важно. Да звучит довольно сложно, но ведь хоть что-то здесь должно быть не просто куплено? Ещё минус 1000 рублей.
Так же стоит сказать, что в комплекте идет Windows 10, уже активированная, что несомненно приятно.
Питание
*Изменение блога. Благодаря замечанию одного из комментаторов я решил изменить структуру блока питания. По совету я прошерстил интернет на эту тему и нашел довольно интересное решение. Существует такой зарубежный канал «The Wrench», парень делает разные интересные электронные штуки. Так вот в одном из роликов о создании карманного ПК он показал хороший способ сделать миниатюрный блок питания. В общем. Нам понадобятся три мини-аккумулятора 18650 (да они довольно громоздкие, но это не так уж и страшно). Склеиваем их вместе, но так что бы средняя батарея была повернута в другую сторону относительно двух других. Далее нам понадобятся проволока и умение обращаться с паяльником. Припаиваем к центрам средней и правой батареи кусок проволоки, делаем тоже самое только с другой стороны и со средней и левой батареей. Далее нам понадобятся два небольших провода. Каждый из них припаиваем к тем местам с которыми не работали.
Следующий элемент с которым мы будем взаимодействовать это защитная плата для аккумулятора под названием 3S BMS. Стоит она копейки.
Далее воспользуемся розеткой питания. Её как и многое другое можно найти на Aliexpress. Припаиваем провода от розетки к плюсу и минусу на плате.
Теперь нам нужны 5-ти вольтовый регулятор и старый USB-кабель.
Далее подключаем старый USB к подходящему слоту на LattePand’е.
Остается только припаять оставшиеся два серых провода к миниатюрному переключателю и готово.
Совсем забыл рассказать о том как консоль будет выводить звук. Но тут совсем кратко. Нам понадобиться миниатюрный усилитель звука, который нужно будет прикрепить внутри корпуса, на котором придется сделать специальные отверстия. Сам же усилитель перед установкой нужно будет подключить к компьютеру в соответствующий порт. Готово
Заключение
Да вышло довольно криво и я бы даже сказал бедно, но как я уже говорил специальных навыков у меня нету. В принципе соединив все перечисленные выше элементы можно играть, но вам вряд ли понравилось бы играть на такой «консоли». По этому за основу корпуса был взят концепт портативной игровой консоли PGS. В своё время она наделала много шума, но вскоре о ней благополучно забыли. Но не пропадать же добру? Для создания корпуса можно воспользоваться и обычным картоном, но что бы было красивее думаю использовать станок для 3D-печати. (На Ютубе наткнулся на ролик зарубежного автора который сделал нечто похожее только там всё намного интересней.)
В общем это вышла довольно интересная игрушка. Понятно, что не о каких больших проектах речи не идет, но серфинг в браузере, работа с аппаратными программами, запуск эмулятор вплоть до той же PSP, все это стало возможно. Ну и да стримить со своего пк на это чудо тоже получиться. Да и если бы было больше денег то можно было бы поставить, например LettePanda Alpha которая без проблем смогла запустить даже GTA 5!
Автор вместо обычного одноплатного компьютера, взял материнскую плату от ноутбука! Да это дало значительный буст в мощности, но и повлияло на размеры консоли.
Как сделать игровую приставку на основе смартфона
Как все начиналось
Меня зовут Сержиу Виейра, и я португальский парень, выросший в 80–90-е. Я всегда ностальгировал по ретроконсолям, особенно третьего и четвертого поколений. Несколько лет назад я решил глубже изучить электронику и попробовать собрать свою собственную видеоконсоль. Работаю я инженером софта, и ранее никакого опыта работы с электроникой у меня не было — если не считать сборки и апгрейда моего десктопа (что, конечно, не считается). Но, несмотря на отсутствие опыта, я сказал себе: «Почему нет?», купил несколько книг и комплектов электроники — и начал учиться.
Я хотел собрать консоль, похожую на те, что всегда мне нравились, — что-то среднее между NES и Super Nintendo или между Sega Master System и Mega Drive. Все эти консоли обладали CPU, кастомным видеочипом (тогда он еще не назывался GPU) и аудиочипом — интегрированным или выделенным. Игры к ним распространялись на картриджах, которые обычно представляли собой аппаратные расширения с чипом ПЗУ и иногда другими компонентами.
Моим изначальным планом было собрать консоль со следующими характеристиками.
Я решил использовать поддержку SD-карт вместо картриджей, потому что запускать игры с карты намного практичней — к тому же на нее проще копировать файлы с компьютера. Используй я картриджи, пришлось бы накрутить куда больше железа и завести отдельное железо для каждой программы.
Собираем консоль
Видеосигнал
Начал свою работу я с генерации видеосигнала. У всех консолей эпохи, на которую я ориентировался, были свои проприетарные графические чипы — что давало им очень разные характеристики. По этой причине я не стал использовать готовый графический чип — хотелось, чтобы у моей консоли были уникальные возможности графики. Но, поскольку собрать собственный чип я бы не потянул, а ПЛИС использовать не умел, я выбрал базирующийся на софте графический чип с двадцатимегагерцевым восьмибитным микроконтроллером. Это не перебор: у него ровно такая производительность, чтобы генерировать нужный мне тип графики.
Итак, я начал с микроконтроллера ATmega644, работающего на частоте 20 МГц, который посылал PAL-сигнал на телевизор. Поскольку сам по себе микроконтроллер этот формат не поддерживает, пришлось добавить внешний ЦАП.
Другие статьи в выпуске:
Xakep #247. Мобильная антислежка
Наш микроконтроллер выдает восьмибитную цветность (RGB332: три бита на красный, три бита на зеленый и два — на синий), а пассивный ЦАП конвертирует всю эту красоту в аналоговый RGB. По счастью, в Португалии внешние устройства к телевизору чаще всего подключают через разъем SCART — и большая часть телевизоров принимает RGB-сигнал через него же.
Подходящая графическая система
Поскольку первый микроконтроллер я хотел использовать исключительно для передачи сигнала на телевизор (я назвал его VPU — Video Processing Unit), для графики в целом я решил использовать способ двойной буферизации.
Я взял второй микроконтроллер для PPU (Picture Processing Unit) — ATmega1284 тоже на 20 МГц. Он должен генерировать изображение на чип ОЗУ (VRAM1), после чего первый микроконтроллер передаст содержимое другого чипа оперативки (VRAM2) на телевизор. После каждого кадра (два кадра в PAL или 1/25 секунды) VPU переключает чипы ОЗУ и передает изображение с VRAM1 на телевизор, пока PPU генерирует новое на VRAM2.
Видеоплата получилась довольно сложной: мне пришлось использовать дополнительное железо, чтобы дать микроконтроллерам доступ к обоим чипам ОЗУ, а также ускорить доступ к памяти, которая к тому же используется для вывода видеосигнала методом битбэнга. Для этого я добавил в цепочку несколько чипов 74-й серии в качестве счетчиков, линейных селекторов, трансиверов и прочего.
Прошивка для VPU и особенно для PPU тоже вышла довольно сложной, поскольку мне нужно было написать чрезвычайно производительный код — если я хотел получить все искомые графические возможности. Изначально я все писал на ассемблере, позже кое-что кодил на C.
В итоге мой PPU генерировал изображение 224 × 192 пикселя, которое VPU транслировал на экран телевизора. Разрешение может показаться слишком низким, но на самом деле оно немногим меньше, чем у консолей-прототипов — они обычно имели разрешение 256 × 224. Зато более низкое разрешение позволило мне втиснуть больше графических фич в тот временной отрезок, что уходил на отрисовку каждого кадра.
Прямо как в старые добрые времена, у моего PPU есть «фиксированные» графические возможности, которые можно настроить. Фон рендерится из символов размером 8 × 8 пикселей (их еще иногда называют тайлами). Это значит, что размер всего фона — 28 × 24 тайла. Для попиксельной прокрутки и возможности плавного обновления фона я сделал четыре виртуальных экрана 28 × 24 тайла — все они смежные и «обтекают» друг друга.
Поверх фона PPU рендерит до 64 спрайтов шириной и высотой от 8 до 16 пикселей (то есть один, два или четыре символа), которые можно повернуть по вертикали, горизонтали или по обеим осям. Еще над фоном можно отрендерить оверлей — такую плашку размером 28 × 6 тайлов. Она пригодится для игр, где нужны элементы интерфейса поверх основного экрана (HUD), фон скроллится, а спрайты используются не только для подачи информации, но и для других целей.
Другая «продвинутая» фича — возможность прокручивать фон в разных направлениях по отдельным строкам, что позволяет добавить эффекты типа ограниченного параллакс-скроллинга или разделенного экрана.
Еще есть таблица атрибуции, которая позволяет задать каждому тайлу значение от 0 до 3. А дальше можно, например, назначить все тайлы с определенным значением на конкретную тайловую страницу или увеличить номер их символа. Это полезно, когда конкретные элементы фона постоянно меняются, — в таком случае CPU не нужно обновлять каждый тайл в отдельности, он может просто передать команду вроде «все тайлы со значением 1 увеличивают свое значение на 2». Разными способами этот подход используется, например, в играх с Марио, где на фоне двигаются знаки вопроса, или в других играх с постоянно льющимися водопадами.
Процессор
Когда была готова функциональная видеоплата, я приступил к работе над CPU — для своей консоли я выбрал Zilog Z80. Помимо того что Z80 — просто крутой ретропроцессор, у него есть отдельно 16 бит на память и 16 бит для I/O, чем другие подобные восьмибитные процессоры, например знаменитый 6502, похвастаться не могут. У того же 6502 есть только 16 бит памяти, а значит, эти 16 бит придется делить между собственно памятью и дополнительными устройствами: аудио, видео, ввода и прочими. Если же у нас есть отдельный участок для I/O, то он возьмет на себя все внешние устройства, а 16 бит памяти (то есть 64 Кбайт кода или данных) мы сможем использовать по прямому назначению.
Для начала я соединил свой CPU с EEPROM, добросив немного тестового кода. Еще я прикрутил к CPU через участок I/O микроконтроллер, который связывается с ПК по RS-232, — чтобы проверить, нормально ли работает мой процессор и все остальные соединения. Этот микроконтроллер (двадцатимегагерцевый ATmega324) должен был стать IO MCU (микроконтроллером ввода-вывода) и отвечать за доступ к игровым контроллерам, карте SD, клавиатуре PS/2 и коммуникацию с компом через RS-232.
Потом я прикрутил к процессору чип ОЗУ на 128 Кбайт, из которых были доступны 56 (это может показаться пустой тратой ресурса, но у меня были чипы ОЗУ только по 128 и по 32 Кбайт). Таким образом, вся память процессора состоит из 8 Кбайт ПЗУ и 56 Кбайт ОЗУ.
Следом я обновил прошивку своего микроконтроллера ввода-вывода с помощью этой библиотеки и добавил ему поддержку карт SD. Теперь CPU научился перемещаться по директориям SD-карты, просматривать их содержимое, открывать и читать файлы — считывая и записывая данные на конкретные адреса участка ввода-вывода.
Соединяем CPU и PPU
Пришло время реализовать взаимодействие между CPU и PPU. Для этого я нашел «простое решение» — чип ОЗУ с двойным портом (то есть тот, который можно одновременно подключить по двум разным шинам). Он спас меня от накручивания новых микросхем типа линейных селекторов — и к тому же сделал доступ к оперативной памяти для обоих чипов практически одновременным. Также PPU связывается с CPU напрямую каждый кадр, активируя его немаскируемое прерывание (NMI). Это значит, что каждый кадр процессор прерывается (ценное умение для синхронизации и своевременного обновления графики).
Каждый кадр взаимодействие между CPU, PPU и VPU развивается по следующему сценарию.
Примерно в то же время я добавил поддержку игровых контроллеров. Изначально я хотел использовать контроллеры Super Nintendo, но их разъем проприетарный — и достать его непросто. Поэтому я выбрал совместимые шестикнопочные контроллеры Mega Drive/Genesis: они используют стандартные, распространенные и доступные разъемы DB-9.
Время для первой настоящей игры
У меня был процессор с поддержкой игровых контроллеров, который мог управлять PPU и загружать программы с SD-карты, так что… пришло время сделать игру. Я написал ее, конечно, на языке ассемблера Z80 — это заняло у меня пару дней (исходный код игры).
Добавляем кастомную графику
Все отлично, у меня есть рабочая консоль, но… этого недостаточно. Игры пока не могут использовать кастомную графику — только ту, что хранится в прошивке PPU. А единственный способ поменять встроенную графику — обновить прошивку. Поэтому я решил добавить отдельный чип ОЗУ с графикой (символьное ОЗУ, Character RAM) — он должен быть доступен PPU и загружать графику согласно инструкциям, пришедшим из CPU. При этом нужно было использовать как можно меньше новых компонентов, потому что консоль уже получилась довольно большой и сложной.
Я нашел следующий выход: доступ к новому ОЗУ будет только у PPU, а CPU станет передавать ему информацию через PPU. И пока эти данные передаются, наше новое ОЗУ не будет использоваться для графики — его функции временно возьмет на себя встроенная графика.
После передачи данных процессор переключится из режима встроенной графики в режим работы с символьным ОЗУ (CHR RAM на схеме ниже), и PPU сможет использовать кастомную графику. Возможно, это не идеальное решение, но оно работает. В итоге новое ОЗУ имело объем 128 Кбайт и могло хранить 1024 символа размером 8 × 8 пикселей для фона и 1024 символа того же размера для спрайтов.
И наконец, звук
Реализацию звука я оставил на финал. Изначально я собирался дать своей консоли те же звуковые возможности, что у Uzebox, и встроить микроконтроллер, который генерировал бы четыре канала PWM-звука. Однако я выяснил, что можно относительно легко достать винтажные чипы, — и заказал несколько чипов YM3438, работающих на принципе частотно-модуляционного синтеза. Они полностью совместимы с YM2612, которые установлены в Mega Drive/Genesis. Установив этот чип, я получаю музыку качества Mega Drive и звуковые эффекты, которые производит контроллер. CPU управляет звуковым модулем (я назвал его SPU, Sound Processor Unit, — он отдает команды YM3438 и сам производит звуки) снова через маленькое ОЗУ с двойным портом, на сей раз емкостью всего в 2 Кбайт.
Так же как у графического, у звукового модуля есть 128 Кбайт на хранение звуковых патчей и семплов PCM. Процессор же выгружает информацию в эту память через SPU. Таким образом, процессор может как велеть SPU воспроизводить команды из этого ОЗУ, так и обновлять команды для SPU каждый кадр.
CPU управляет четырьмя PWM-каналами через четыре кольцевых буфера, которые есть в специальном ОЗУ (SPU RAM на схеме ниже). SPU проходит через эти буферы и выполняет имеющиеся в них команды. Таким же образом работает еще один кольцевой буфер в SPU RAM — он обслуживает чип частотно-модуляционного синтеза (YM3438).
Взаимодействие между процессором и звуковым модулем похоже на историю с графикой — и устроено по следующей схеме.
Как настроить систему
Игровая приставка из старого ПК мало отличается от обычной бюджетной консоли по своему функционалу и возможностям. После установки системы в каких-то сложных настройках нет необходимости — достаточно установить необходимые игры. В установленной ОС уже имеется несколько старых игрушек из серии приставок Сега, Супер Ниндендо и других. Многим игрокам этого набора недостаточно, поэтому лучше дополнить игротеку. Это не трудно, ведь в Интернете можно найти почти любую игру, скопировав ее на флешку.
Разобравшись, как сделать из старого ПК игровую приставку, отправляйтесь на поиск развлечений. Информацию можно найти на следующих площадках:
Просто выбирайте подходящий вариант и загружайте себе на ПК. Сделать это не составляет труда, ведь игровой софт запакован в ZIP-архив. Он используется для установки на операционную систему игровой приставки. При этом просто копировать игру на USB-накопитель на ПК / ноутбук не получится — необходимо подключить устройство к Интернету.
Здесь имеется два варианта:
После этого в новую игровую приставку можно загружать софт. Сделать это проще всего через FTP-менеджер. Размер игр, которые загружены в интерфейсе Recalbox ограничены по объему. Далее сделайте следующее:
Как видно, сделать игровую приставку из компьютера сможет даже новичок. Здесь не нужны специальные знания, опыт паечных работ или другие сложные навыки.
Конечный результат
После разработки всех модулей я поместил некоторые из них на макетные платы. Для модуля CPU я сумел придумать и заказать кастомную плату. Не знаю, буду ли делать то же самое для других модулей, — полагаю, мне довольно сильно повезло получить рабочую кастомную плату с первой попытки. Только звуковой модуль пока что остается в виде макета.
Вот как выглядит консоль на момент написания этого текста.
Архитектура
Схема ниже иллюстрирует, какие компоненты входят в каждый модуль и как они взаимодействуют друг с другом. Единственное, что не показано, — это сигнал в форме NMI, который PPU передает непосредственно процессору каждый кадр, а также аналогичный сигнал, передаваемый SPU.
Итоговые характеристики
Процессор:
Ввод/вывод (I/O):
Видео:
Звук:
Разработка софта для консоли
Первый кусок софта, написанный для консоли, — это загрузчик. Он хранится в постоянной памяти процессора и занимает до 8 Кбайт. Он же использует первые 256 байт оперативки процессора. Загрузчик — первый софт, запускаемый на процессоре. Его цель — показать программы, доступные на SD-карте. Эти программы хранятся в файлах, которые содержат скомпилированный код и могут также содержать данные кастомной графики и звука.
После выбора программы она загружается в оперативку процессора, символьное ОЗУ и ОЗУ звукового модуля. Там соответствующая программа выполняется. Код программ, загружаемых на консоль, может занимать до 56 Кбайт памяти — за исключением первых 256 байт; также, конечно, нужно учитывать объем стека и оставлять место для данных.
И загрузчик, и программы для этой консоли разрабатываются похожим образом. Коротко поясню, как я их сделал.
Маппинг памяти и ввода-вывода
При разработке для консоли следует обратить особое внимание на то, как CPU может получить доступ к другим модулям, поэтому представление памяти и ввода-вывода имеет решающее значение.
Процессор обращается к своему загрузчику на ПЗУ и ОЗУ через память. Представление памяти выглядит так.
К PPU-RAM и SPU-RAM, а также к IO MCU он обращается через участок ввода-вывода. Представление участка ввода-вывода процессора будет таким.
Внутри представления участка ввода-вывода IO MCU, PPU и SPU имеют свои конкретные адреса.
Убедитесь, что ваше оборудование обновлено
Мы скоро доберемся до главного события подключения вашего ПК к красивому большому телевизору с плоским экраном. Во-первых, мы должны убедиться, что ваш компьютер — будь то настольный компьютер, ноутбук или даже самонастроенный, предназначенный для HTPC
В то время как практически любой компьютер будет работать с видеоиграми, некоторые устаревшие устройства могут вызвать проблемы. Например, старые процессоры и древние, жесткие жесткие диски будут сильно разочаровывать игровую консоль ПК.
Итак, выберите новое или недавнее оборудование.
Управление PPU
Мы можем управлять PPU с помощью записи на PPU-RAM, а доступ к PPU-RAM, как мы знаем из таблицы выше, организован через участок ввода-вывода с адресов от 1000h до 1FFFh.
Вот как выглядит этот диапазон адресов, если представить его более подробно.
Состояние PPU (PPU Status) может принимать следующие значения: 0 — режим встроенной графики; 1 — режим кастомной графики; 2 — режим записи в символьное ОЗУ; 4 — запись закончена, ожидание подтверждения от CPU.
А вот пример того, как можно работать со спрайтами. Консоль может рендерить до 64 спрайтов одновременно. Информация об этих спрайтах передается через адреса с 1004h по 1143h (320 байт), по 5 байт информации на каждый спрайт (5 × 64 = 320 байт):
Итак, чтобы сделать спрайт видимым, мы должны присвоить флагу Active значение 1, а также установить координаты, при которых он станет видимым (координаты x = 32 и y = 32 разместят спрайт в левый верхний угол экрана; если значения x и y будут меньше, то спрайт окажется за пределами экрана — частично или полностью). Затем мы можем присвоить ему символ и определить, какой цвет спрайта будет прозрачным.
Например, если мы хотим сделать видимым десятый спрайт, мы должны присвоить адресу ввода-вывода 4145 (1004h + (5 x 9)) значение 1. Затем устанавливаем координаты спрайта — скажем, x = 100 и y = 120, — присвоив адресу 4148 значение 100, а адресу 4149 — значение 120.
Кодим на ассемблере
Один из способов написать программу для нашей консоли — использовать язык ассемблера.
Ниже — пример кода, который заставляет первый спрайт двигаться и сталкиваться с углами экрана:
Используем инструменты C
Еще можно писать программы для консоли на C, используя компилятор SDCC или другие кастомные инструменты. Разработка так идет быстрее, хотя производительность кода, конечно, падает.
В качестве примера покажу код на С, который выполняет ту же самую задачу, что и приведенный выше ассемблерный. Чтобы облегчить обращение к PPU, я здесь использовал библиотеку.
Кастомная графика
У консоли есть встроенная и предназначенная только для чтения графика, которая хранится в прошивке PPU (одна страница тайлов для фона и одна страница графики для спрайтов). Однако для программ можно использовать и кастомную графику.
Цель в том, чтобы перевести всю необходимую графику в двоичную форму — в таком виде загрузчик консоли сможет грузить ее в символьное ОЗУ. Чтобы этого добиться, я начал с нескольких изображений уже нужного размера — в данном случае они предназначены для фона сразу в нескольких игровых ситуациях.
Поскольку кастомная графика состоит из четырех страниц по 256 символов размером 8 × 8 пикселей для фона и четырех таких же страниц для спрайтов, я преобразовал графику с картинки выше в файл PNG для каждой страницы, используя специальный инструмент (за исключением повторяющихся результирующих символов).
А следом я использовал еще один инструмент, чтобы сконвертировать результат в бинарник с символами 8 × 8 пикселей в цветовой схеме RGB332.
В результате получаются двоичные файлы, состоящие из символов 8 × 8 пикселей (символы в памяти являются смежными, каждый занимает 64 байта).
Образцы звуковых волн конвертируем в восьмибитные и восьмикилогерцевые семплы PCM. Патчи звуковых эффектов и музыки PWM можно составить, используя заранее определенные инструкции. Что касается ямаховского чипа частотно-модуляционного синтеза YM3438, то для него я нашел приложение DefleMask. С помощью DefleMask делают синхронизированную с PAL музыку для звукового чипа YM2612 от Genesis, который совместим с нашим YM3438.
DefleMask конвертирует музыку в формат VGM, а дальше я уже использую другой специальный инструмент, чтобы превратить VGM в самопальный звуковой бинарник.
Бинарники со всеми тремя видами звуков объединяются в один двоичный файл, который загрузчик потом сможет загрузить в ОЗУ звукового модуля (SNDRAM).
Соберем все вместе
Программный бинарник, графику и звук нужно соединить в один файл формата PRG. В файле PRG есть заголовок, который сообщает, использует ли программа кастомную графику и/или звук и каков размер каждого из этих компонентов. Там же содержится вся прочая соответствующая двоичная информация.
Затем получившийся файл можно разместить на карту SD, загрузчик консоли оттуда его прочитает, пошлет всю необходимую информацию соответствующим ОЗУ и запустит программу.
Используем эмулятор для разработки
Чтобы облегчить разработку софта для консоли, я написал на C++ эмулятор, используя wxWidgets. Чтобы эмулировать процессор, я обратился к библиотеке libz80.
Я добавил в эмулятор несколько отладочных функций. В частности, я могу оказаться в конкретной точке останова и пройти из нее по всем ассемблерным инструкциям. Также есть связь с исходным кодом, если программа была скомпилирована на C. Что касается графики, то тут я могу проверить, что хранится на страницах тайлов и в именных таблицах (представление фона размером в четыре экрана), а также что находится в символьном ОЗУ (CHRRAM).
Вот пример того, как запускать программу на эмуляторе и использовать некоторые отладочные инструменты.
Демонстрируем работу консоли
Видео из этого раздела — это съемка экрана электронно-лучевого телевизора на камеру телефона. Прошу прощения, что качество не очень высокое.
Запускаем с помощью бейсика и клавиатуры PS/2. На этом видео я — сразу после создания первой программы — записываю напрямую в ОЗУ графического модуля (PPU-RAM) через участок ввода-вывода команды включить и настроить спрайт, а в конце переместить его.
Демонстрация возможностей графики. На этом видео показана программа, которая отображает 64 спрайта размером 16 × 16 пикселей, кастомную прокрутку фона, а также наложенную плашку, которая двигается вверх и вниз — как перед спрайтами, так и за ними.
Демонстрация возможностей звука показывает, на что способен YM3438 в сочетании с проигрыванием семплов PCM. Частотно-модуляционная музыка вместе с семплами PCM на этом демо почти полностью занимают 128 Кбайт ОЗУ звукового модуля.
Тетрис, использующий почти исключительно фоновые тайлы для графики, YM3438 для музыки и патчи PWM для звуковых эффектов.
Контроллер
Звучит как излишний наворот? Может быть, но как ещё приблизить экспириенс от игры за настоящей консолью к мобильному устройству? Нужен контроллер. Производители соответствующих аксессуаров давно разглядели потенциал смартфонов и планшетов, а наличие универсального Bluetooth значительно упрощает задачу.
Итак, начнём с поддерживаемых устройств. Из коробки Android прекрасно понимает многие мышки и клавиатуры и геймпады, а инструкция по подключению устройств есть тут.
Если Android с рутом, то можно не тратить ни копейки на сам геймпад и просто подключить свой любимый контроллер от PlayStation 3 с помощью приложения.
Приложение не найдено
Перейти в магазин Искать в Google
Если вы счастливый владелец Wii, то не потребуется даже рута. Покупаем приложение и наслаждаемся.
Хочется чего-то ещё более навороченного и специализированного? Остаётся только купить что-то наподобие MOGA Pro. Такие геймпады изначально разработаны как подключаемые аксессуары для смартфона и позволят играть в динамичные игры на любимом Android и с максимальным комфортом.
Про различные «хипстерские» и вообще заточенные под старые геймпады аксессуары мы говорить не будем, так как в этом случае акцент смещается с удобства на внешний вид и стиль. Хотя, реально ностальгирующим понравится.