[Перевод] Самодельная портативная игровая консоль на базе процессора 486

Прокомментировать Просмотры: 0

Введение

Компьютеры интересовали меня с детства. Свой первый PC я купил на деньги, накопленные благодаря разным подработкам: это был подержанный клон PC-XT с красивым зелёным монитором. Я обожал с ним экспериментировать. Позже один из дядей узнал о моём увлечении и при каждом визите стал привозить ненужное ему «железо»: жёсткие диски, материнские платы и процессоры. Большинство компонентов предназначалось для компьютеров на базе 486. Эксперименты с ними оставили у меня самые тёплые воспоминания: я разгонял процессор заменой кристалла, переставлял память и платы ISA, менял настройки BIOS. Платформой 486 я пользовался довольно долго и обновился лишь тогда, когда устроился на подработку по сборке компьютеров и смог приобрести новую машину на Pentium 2.

В те времена я не слишком глубоко разбирался в устройстве компьютера. Правда, с работой шины ISA мне всё-таки пришлось познакомиться: иначе я не смог бы собрать программатор флеш-памяти из старой платы расширения ISA, микросхем декодирования адресов и сокета для AM29F512. Зато материнские платы казались мне чем-то близким к магии: бесчисленные дорожки, огромные интегральные схемы и множество загадочных деталей!

С тех пор прошло тридцать лет. Я всё так же с теплотой вспоминаю ту эпоху и время от времени запускаю игры в DOSBox. Но ведь играть в них можно и на настоящем «железе»… Пожалуй, пришло время снова собрать собственный PC. Так появился VapourDeck — портативная ретроигровая консоль в духе Steam Deck для старых DOS-игр. Никакой эмуляции процессора в ней нет: это настоящая система на базе 486.

В этой статье я расскажу, как она была создана.

Проектирование

Поначалу я не собирался делать портативное устройство. Первый прототип должен был стать аналогом настольного PC с выходом VGA и без сложной системы управления питанием. Мне просто хотелось выяснить, смогу ли я вообще собрать компьютер. В целом всё получилось: ошибки на плате свелись к нескольким забытым подтягивающим резисторам, паре неправильно расположенных конденсаторов в цепях начальной загрузки и перепутанным линиям USB. Как я умудрился выбрать VGA-разъём не того «пола», до сих пор не понимаю. К счастью, исправить это оказалось просто: я припаял его с обратной стороны платы.

Unlabeled VapourDeck mainboard PCB
Материнская плата VapourDeck

В первом прототипе стоял Intel 486-DX4-100 — последняя версия 486, выпущенная Intel. Для второй платы я выбрал AMD 486-DX5-133 с совместимой распиновкой. AMD производила 486 немного дольше, и, вероятно, это последний самостоятельный чип семейства. По мере совершенствования техпроцесса DX5-133 стал меньше нагреваться и превзошёл процессор Intel по скорости. Оба чипа рассчитаны на 3,3 В, тогда как более ранним версиям требовалось 5 В. Это удобно: сегодня напряжение 3,3 В встречается гораздо чаще.

Но как организовать обмен данными с 486? В отличие от современных SoC и даже настольных CPU, в которые нередко встроены контроллеры DRAM и целые графические процессоры, 486 по большей части остаётся просто процессором. Не считая небольшого кэша, встроенной периферии у него нет. Поэтому чтение программы, запись в память и обращения к устройствам выполняются через интерфейс шины. Следовательно, прежде всего нужно разобраться в его работе.

К счастью, в те годы Intel стремилась к тому, чтобы её чипы применялись в самых разных устройствах, и ещё не скрывала сведения о протоколе шины столь тщательно. В открытом доступе выходили очень подробные руководства пользователя.

Для передачи электрических сигналов 486 использует обычные уровни TTL, а версии с питанием 3,3 В — LVTTL. Сигнальных линий у него немало. Поздние модели поддерживают множество дополнительных возможностей: встроенный кэш, кэш с обратной записью (write-back cache), различные режимы удержания шины, многопроцессорные системы, пакетное чтение (burst read) и не только. Хорошая новость в том, что все эти функции необязательны. Если не использовать соответствующие выводы, остаётся сравнительно простая 32-разрядная шина, в которой операция занимает два или более тактовых цикла. На схеме из руководства показана такая базовая операция:

Все циклы синхронизированы со спадающим фронтом тактового сигнала шины. Цикл начинается с перевода ADS# (Address Strobe, строб адреса) в низкий уровень. Тем самым подключённые устройства узнают, что на адресных и управляющих линиях находятся действительные значения. Адресные линии содержат адрес памяти или устройства ввода-вывода, к которому обращается процессор. Управляющие указывают тип адресата и операции: чтение или запись. При записи данные появляются на шине в следующем такте. Периферийное устройство выполняет запрос и сообщает о завершении, переводя RDY# в низкий уровень. Если выполняется чтение, оно также помещает запрошенные данные на шину. Ширина шины данных составляет 32 бита, но с помощью линий разрешения байтов BE0#–BE3# (Byte Enable) процессор указывает, какие из четырёх восьмибитных частей нужно прочитать или записать. Это позволяет ему без труда работать и с байтами, и со словами.

По сути, шина по-прежнему очень напоминает классическую шину памяти старых восьмибитных процессоров: за одну транзакцию передаётся одно слово по одному адресу. При этом предусмотрены средства работы с более медленной периферией и линии разрешения байтов для данных меньшей разрядности. Производительность можно повысить с помощью расширенных режимов, например пакетной передачи, выполнив соответствующее рукопожатие (handshake). Однако это необязательно: процессор прекрасно справляется и с простыми транзакциями. Осталось решить, что именно подключить к шине.

Хотя идея собрать старый ПК привлекает меня из-за ностальгии, возвращаться к сопутствующим сбоям и долгому ожиданию совсем не хочется. Например, вновь переживать установку игры, скопированной у друга на двадцать дискет, когда на семнадцатой обнаруживается повреждённый сектор. Да и вообще связываться с дискетами я не стремлюсь: они были медленными и ненадёжными. К жёстким дискам я отношусь лучше, но и здесь есть проблема. Накопители той эпохи давно вышли за пределы участка «кривой ванны», на котором частота отказов остаётся низкой. Даже если такой диск удастся найти, неизвестно, сколько он ещё прослужит. Клавиатуры и мыши обычно долговечнее, поэтому можно было бы подобрать подлинные устройства тех лет. Но мои запасные USB-клавиатуры отличаются от старых главным образом способом подключения, а покупать их не нужно. То же относится к мышам: хотя вместо шарика в них стоит оптический датчик, пользоваться ими приходится почти так же. К тому же больше не нужно варить новое яйцо, когда старый шарик потеряется или сломается.

Labeled VapourDeck PCB. CPU, FPGA, VGA chip, RAM, VRAM, audio codec, ESP32-S3 and USB-hubchip are all labeled.

С учётом всего этого состав остальных микросхем на прототипе вряд ли удивит: помимо процессора, здесь есть FPGA и ESP32-S3. FPGA выполняет роль чипсета обычной материнской платы. Вместо 40-контактного разъёма IDE, разъёма дисковода, интерфейса PS/2 и других соединений используется одна шина QPI для связи с ESP32. В свою очередь, ESP32 служит микроконтроллером периферии и заменяет несколько компонентов классического ПК: контроллер клавиатуры, контроллеры жёсткого диска и привода CD-ROM, а применительно к ноутбуку — ещё и встроенный контроллер (Embedded Controller). Кроме того, на плате установлен отдельный графический чип VGA с собственной DRAM.

Оборудование

Итак, помимо 486, на плате расположены FPGA, ESP32, графический чип VGA, несколько микросхем памяти и вспомогательные компоненты. Остановимся подробнее на их выборе.

Начну с FPGA. Мне по-прежнему нравится семейство Lattice ECP5: для него существует достаточно зрелая цепочка инструментов с открытым исходным кодом, а микросхемы выпускаются в корпусах BGA, которые я ещё могу относительно легко припаять вручную. К тому же у них много линий ввода-вывода. Поскольку к FPGA предстояло подключить большую часть выводов шины 486, оперативную память и ESP32, таких линий требовалось как можно больше. Я остановился на LFE5-45UM. В её распоряжении 45 тысяч LUT (таблиц поиска) и достаточно встроенной блочной памяти (Block RAM) для FIFO-буферов, таблиц поиска и внутренней оперативной памяти.

Из семейства ESP32 я выбрал ESP32-S3 прежде всего из-за встроенного интерфейса USB OTG. К нему можно подключать, например, USB-клавиатуры и мыши. Кроме того, чип поддерживает периферию BLE, в том числе геймпад Xbox One. К сожалению, классического Bluetooth в нём нет, поэтому многие Bluetooth-устройства подключить не получится. Тем не менее USB показался мне важнее. К тому же на момент разработки платы среди чипов ESP не было модели, поддерживавшей оба варианта.

Для вывода VGA я выбрал Chips&Technologies F65545. Это не самый выдающийся видеочип: модель среднего класса предназначалась для ноутбуков примерно той же эпохи, что и мой 486. Но для DOS-игр, на которые я ориентируюсь, его возможностей достаточно. Причин выбора было две. Во-первых, 32-разрядный интерфейс можно подключить непосредственно к процессору, и это заметно быстрее 16-разрядной ISA. Во-вторых, новые чипы из старых запасов (new old stock, NOS) легко находились на Taobao. Позже пригодилось и то, что F65545 изначально разрабатывался для ноутбуков. Для работы ему нужен 1 МиБ внешней DRAM, которую тоже оказалось нетрудно приобрести.

Нужна плате и основная оперативная память. Для компьютера той эпохи подошла бы DRAM с постраничным доступом (Fast Page Mode, FPM) или EDO RAM, но их подключение может доставить немало хлопот. Поскольку в системе используется современная FPGA, я установил SDRAM: она проще в подключении и заметно быстрее. Ещё одно её достоинство — доступные по цене микросхемы большой ёмкости. Я выбрал 64 МиБ. Для сравнения: потребительские компьютеры на 486 обычно оснащались 8–16 МиБ, поэтому такого объёма должно хватить практически для любых задач.

На плате есть и другие компоненты: источники необходимых напряжений, USB-концентратор для подключения нескольких устройств к ESP32, соединённый с FPGA аудиокодек I2S, разъём microSD и порт USB-C для питания и отладки. Получился одноплатный компьютер (SBC, Single-Board Computer) без слотов ISA и PCI. Это сознательное решение: слоты усложнили бы конструкцию, а пользы от них было бы немного, поскольку старых плат ISA и PCI у меня уже не осталось. Если понадобится поддержка какого-либо устройства, её можно реализовать во встроенной FPGA или эмулировать на ESP32. Кроме того, слот ISA пришлось бы подключать к FPGA, а я не был уверен, что смогу физически вывести достаточно контактов ввода-вывода.

Block schematic. CPU, FPGA and VGA blocks are connected. VGA is also connected to VRAM. CPU is also connected to RAM, I2S DAC, and ESP32-S3 blocks. ESP32-S3 block is connected to micro-SD and USB hub blocks. A speaker is connected to I2S DAC; kbd, mouse etc are connected to USB hub.

Общая архитектура платы довольно проста. Процессор 486 подключён к видеочипу VGA и FPGA. FPGA обменивается данными с ESP32-S3 по Quad-SPI, а также связана с аудиокодеком и SDRAM. К ESP32 подключены USB-концентратор и карта microSD.

Есть ещё одна важная деталь. Мне хотелось настраивать одноплатный компьютер с помощью уже подключённых монитора и клавиатуры. Поскольку ввод с клавиатуры обрабатывает ESP32, перехватить его несложно. А вот видеочип отправляет сигнал непосредственно на VGA-разъём и не умеет накладывать на изображение экранное меню (OSD, On-Screen Display).

Для решения этой задачи я добавил несколько микросхем коммутации, переключающих линии RGB между видеочипом и FPGA. FPGA определяет временные параметры VGA-сигнала по линиям синхронизации и управляет коммутаторами, подавая на выход собственный сигнал вместо сигнала видеочипа. Так появляется простое экранное меню.

Разумеется, всем компонентам необходимо питание. Его обеспечивают несколько понижающих DC-DC-преобразователей, получающих 5 В от портов USB-C. ESP32 также считывает напряжение на линиях CC и определяет, можно ли безопасно включать остальные компоненты.

Всё это разместилось на небольшой четырёхслойной плате, площадь которой примерно в два с половиной раза больше площади Raspberry Pi. Из-за нескольких допущенных ошибок кое-где пришлось поставить проволочные перемычки и нестандартные резисторы. По той же причине VGA-разъём находится снизу, а не сверху: я настолько давно не пользовался VGA, что перепутал «пол» разъёма.

Прошивка и логика FPGA

При таком количестве программируемых компонентов — ESP32, FPGA и самого 486 — плата сама по себе почти ничего не делает. Основную работу выполняют конфигурация FPGA, код на ESP32, а также загрузочный код и BIOS процессора.

Несколько важнейших компонентов PC реализованы средствами FPGA. Один из них — контроллер оперативной памяти. Процессор, напомню, ничего не знает о понятии RAM и тем более о конкретных типах памяти. Он просто читает и записывает данные по адресам, за которыми может находиться оперативная память или что-то другое.

Поэтому мне понадобился контроллер, преобразующий запросы на чтение и запись в последовательность операций, понятных памяти. SDRAM использует довольно сложный протокол: нужно активировать строку, подождать, прочитать или записать слово, выполнить предварительный заряд (precharge) для закрытия строки, снова подождать и повторить процедуру для следующего слова. Дополнительная сложность в том, что моя SDRAM имеет разрядность 16 бит, а шина — 32 бита. Следовательно, каждой операции на шине соответствуют две операции чтения или записи в SDRAM.

На первый взгляд схема кажется медленной: обращение к шине 486, которое могло бы занять два такта, превращается в многошаговую операцию с SDRAM. Ситуацию спасает частота SDRAM — 100 МГц. На один такт шины 486, работающей на 33 МГц, приходятся три такта SDRAM. Полный цикл обращения к DRAM занимает шесть тактов шины 486. Это далеко не идеал:

Всего 16 МБ/с — результат скромный: даже типичный компьютер на 486 в своё время обеспечивал вдвое большую пропускную способность. Впрочем, серьёзной проблемой это не стало. В выбранном процессоре есть 16 КБ встроенного кэша, который в играх во многом компенсирует медленную память. Да и игры, которые мне нравятся, не требуют максимальной производительности CPU. При желании систему будет нетрудно ускорить: оптимизировать активацию и предварительный заряд при работе с соседними байтами, а также добавить пакетное чтение по одному слову за такт. Но пока такой необходимости нет.

Помимо подсистемы памяти, FPGA обеспечивает низкоуровневую логику периферии. Описания на Verilog для PIC (Programmable Interrupt Controller — программируемого контроллера прерываний), PIT (Programmable Interval Timer — программируемого интервального таймера), DMA (Direct Memory Access — прямого доступа к памяти) и Sound Blaster я позаимствовал из проекта ao486_MiSTer. Он предназначен для платы MiSTer — FPGA-платформы для эмуляции консолей и компьютерных систем. В частности, ao486 реализует PC на эмулируемом ядре, примерно соответствующем 486SX. Потребности проектов во многом совпадают, поэтому часть готовых компонентов удалось использовать повторно.

В FPGA также реализована периферия, взаимодействующая с бэкендом на ESP32. У MiSTer есть собственный бэкенд, но архитектура там настолько отличается, что просто скопировать соответствующую логику не получилось. Совместно FPGA и ESP32 реализуют IDE-контроллер с жёстким диском и приводом CD-ROM, сетевую карту NE2000 с подключением к Wi-Fi, MIDI-синтезатор на ESP32, а также контроллер PS/2 и порты джойстиков для клавиатур, мышей и геймпадов с USB или BLE.

Есть и устройства, которых обычно не встретишь в PC. Например, контроллер мониторинга шины (bus snooping) по умолчанию передаёт на ESP32 операции записи в порт ввода-вывода 80h, но при необходимости способен отслеживать и другие порты или их диапазоны. Это очень помогает при отладке программ, которые некорректно взаимодействуют с аппаратной логикой FPGA. Другой интерфейс позволяет ESP32 читать и записывать основную память, а также обращаться к специальному адресному пространству для настройки и отладки. В повседневной работе он используется для загрузки BIOS и видео-BIOS в SDRAM до запуска процессора, поэтому отдельное ПЗУ не требуется.

Впрочем, специальных интерфейсов для отладки было недостаточно. При первоначальном запуске BIOS возникало множество проблем с сигналами FPGA, и мне хотелось наблюдать за поведением всей периферии во время загрузки. Обычно для этого используют симуляцию, например с помощью Icarus Verilog. Но здесь важная часть системы — процессор 486 — оставалась чёрным ящиком: его исходного кода на Verilog у меня не было. К счастью, с похожей задачей я уже сталкивался. Инструмент Verilator преобразует Verilog в C++, сохраняя доступ к обычным средствам симуляции, например выгрузке сигналов в файл VCD для анализа. Полученный код C++ легко связать с другим кодом на том же языке. Я написал небольшую обёртку для библиотеки libx86emu, которая программно эмулирует x86 и позволяет запускать образы прошивок. Подставив её вместо настоящего 486, я смог отладить начальные этапы загрузки BIOS.

Сама BIOS представляет собой слегка изменённую версию BIOS из ao486, которая, в свою очередь, происходит из программного эмулятора PC Bochs. Она проверена временем и тестами; несмотря на довольно необычное сочетание C и ассемблера, её сравнительно легко отлаживать и изменять. Видеочип в основном совместим со стандартной VGA-картой, и для него нужна только VGA BIOS. Версия для F65545 по-прежнему доступна, а кто-то даже опубликовал в интернете инструменты (ищите cm110_cm112.zip), которыми системные интеграторы настраивали BIOS под свои задачи.

В итоге у меня появилась работающая материнская плата на 486, способная загружать DOS и запускать игры. Начнём с тестов из набора Phils Computerlabs DOS Benchmark Pack:

Norton System Information определяет процессор как Cyrix 486, а не AMD. Кроме того, утилита оценивает его производительность ниже, чем у 486DX-33. Предполагаю, что результат сильно портит медленная шина памяти.

Superscape 3DBench 1.0c выдаёт примерно 35,7 FPS.
Superscape 3DBench 1.0c показывает около 35,7 FPS.
Doom при максимальной детализации выдаёт примерно 21 FPS.
В Doom при максимальной детализации получается около 21 FPS.
Quake timedemo работает со скоростью примерно 8FPS. Это и не удивительно, ведь Quake разрабатывался с расчётом на Pentium, а не на 486.
Quake timedemo выдаёт около 8 FPS. Это неудивительно: игра создавалась с расчётом на Pentium, а не на 486.

Как я уже отмечал, у платформы есть запас для повышения производительности: простой контроллер памяти наверняка заметно замедляет систему. Поскольку он реализован в FPGA, улучшить ситуацию можно без замены компонентов.

Итак, прототип материнской платы готов, и на его основе вполне можно собрать настольный PC. Но я обещал портативное устройство. Далее расскажу, как превратил плату в консоль, на которой и сегодня удобно играть в DOS-игры.

VapourDeck

Возможно, вы знаете, что Steam Deck был далеко не первым портативным игровым ПК в форм-факторе планшета с контроллерами. И всё же сама концепция относительно молода. Устройства вроде GP2X и Pandora появились ещё в 2005 году, но работали под Linux и не могли запускать сколько-нибудь широкий ассортимент популярных ПК-игр из магазинов. Их в основном использовали для эмуляции старых консолей. Первым устройством, которое можно назвать игровой консолью и которое запускало значительную часть игр для ПК, стала GPD Win, представленная в 2016 году. Хотя компания Via ещё примерно в 2004 году вынашивала идею x86-консоли, этот проект так и не осуществился.

Почему коммерческий продукт такого рода появился лишь в 2016 году, хотя подходящие ноутбуки существовали гораздо раньше? Вероятно, причин несколько. На раннем этапе главным препятствием, на мой взгляд, был экран. ЖК-дисплеи тогдашнего типа STN сильно размывали движущееся изображение. Только с появлением TFT примерно в 1995 году игры, рассчитанные на мгновенный отклик ЭЛТ-мониторов, стали достаточно пригодны для портативных устройств. Другой проблемой была память: флеш-накопители стоили дорого и имели малую ёмкость, а реальной альтернативой оставались жёсткие диски с вращающимися пластинами. Всё это потребляло немало энергии, которую должны были обеспечивать аккумуляторы того времени. Литий-ионных элементов с высокой плотностью энергии ещё не было, поэтому пришлось бы использовать никель-металлгидридные (NiMH), а игровые сеансы без розетки оказались бы короткими. Наконец, консоли потребовались бы передовые и потому дорогие технологии. Компьютеры и ноутбуки тогда и без того стоили недёшево: в конце 1990-х обычный ноутбук с TFT-экраном обходился примерно в 3000 долларов США, или 6000 долларов в ценах 2006 года. Для сравнения, Steam Deck в 2026 году стоит около 800 долларов. С такими ограничениями и ценой аналог Steam Deck образца 1995 года вряд ли нашёл бы много покупателей.

Но что, если обойти эти ограничения? Современные дисплеи, литий-ионные аккумуляторы и флеш-память решают перечисленные проблемы. А теперь у меня есть и подходящая основа: портативная игровая система на 486 под управлением DOS, выполненная в форм-факторе современного Steam Deck.

Для этого конструкцию пришлось немного изменить. Основная часть материнской платы подходила, но систему питания требовалось адаптировать для работы от литий-ионных аккумуляторов. Например, подавать 5 В на порты USB-A непосредственно с USB-C уже нельзя: нужен блок управления питанием (Power Management Unit, PMU), который отвечает за зарядку и распределение энергии. Также необходимо обрабатывать пользовательский ввод, реализовать программное включение и выключение и добавить яркий ЖК-дисплей с управляющей логикой.

Taobao website screenshot of a 5.7 inch 640x480 LCD. The LCD shows a 3d-render of the word '2025' on it to indicate it's a recent design.

Подбор ЖК-дисплея для ретрокомпьютера может оказаться непростой задачей. Сегодня преобладают широкоформатные экраны 16:9, тогда как раньше был распространён формат 4:3. Можно использовать обычный широкий дисплей и растянуть картинку либо оставить по бокам чёрные полосы, но оба решения выглядят не лучшим образом.

Мне, однако, повезло. В корпус нужного форм-фактора, примерно соответствующего Steam Deck, помещается экран диагональю 5–6 дюймов, а высокого разрешения не требовалось: 640×480 вполне достаточно. По какой-то причине такие панели до сих пор производят, и я нашёл несколько компаний, предлагающих 5,7-дюймовые дисплеи с разрешением 640×480. Причём это современные IPS-матрицы с отличными характеристиками: изображение остаётся ярким и чётким под любым углом, без заметного размазывания. Конечно, духу ретротехники такой экран соответствует не вполне, зато прекрасно подходит тем, кто хочет сосредоточиться на играх, а не на особенностях старых дисплеев.

У этих панелей параллельный интерфейс, напрямую совместимый с выходом для ЖК-дисплея видеочипа F65545. Оставалось добавить несколько мультиплексоров на линии RGB для переключения между изображением видеочипа и экранным меню, как я уже сделал для аналогового VGA-выхода. Подсветке требуется довольно высокое напряжение, но для его получения существуют специализированные микросхемы, так что добавить соответствующую схему было несложно.

Для автономного питания я выбрал два литий-ионных элемента типоразмера 21700 ёмкостью 4800 мА·ч. Большая ёмкость важна: хотя система оказалась экономичнее, чем можно ожидать от обычного настольного процессора, она всё равно потребляет около 8 Вт. Для приличного времени работы нужны достаточно ёмкие аккумуляторы. Я прикрепил к элементам плату защиты и термистор методом точечной сварки, а затем поместил сборку в термоусадочную трубку. Получился аккумуляторный блок, способный выдержать довольно жёсткое обращение.

PMU я вынес на отдельную печатную плату. Расчёт был прост: если в этой части схемы обнаружится ошибка, переделывать придётся только плату управления питанием, а не всю консоль. С одной стороны к PMU подключены два аккумулятора, с другой он получает питание через USB-C и подаёт напряжение системе. По шине I2C ESP32 считывает состояние PMU и настраивает его в зависимости от тока, доступного от подключённого адаптера USB-C. На плате установлены STC3115 для мониторинга заряда и SGM41511, которая управляет зарядкой и распределением питания. Благодаря этому консоль может работать от аккумуляторов, заряжать их и показывать пользователю уровень заряда.

Помимо основной платы и PMU, в устройстве есть плата кнопок. Она довольно крупная, хотя компонентов на ней немного: размер определяется расположением самих кнопок. Здесь же находятся инвертор подсветки, RGB-светодиод с контроллером I2C для индикации состояния консоли и несколько проходных разъёмов для дисплея и тачпада.

Window with OpenSCAD open, text on the left, render of case with transparent inner components on the right

Корпус я спроектировал в OpenSCAD. Этот инструмент хорош для параметрического моделирования, но создавать в нём плавные органические формы непросто. Поэтому консоль больше похожа на кирпич, чем на современные портативные игровые устройства. Впрочем, если вспомнить угловатые и массивные ноутбуки той эпохи, это можно считать скорее достоинством.

Stack of 3d-printed VapourDeck housings and partial housing components, next to an empty PLA reel

Я напечатал немало прототипов на своём экструзионном 3D-принтере, но финальную версию заказал в компании с оборудованием для печати фотополимерной смолой. Результат меня вполне устраивает: консоль вышла тяжёлой и массивной, но удобно лежит в руках и выглядит именно так, как хотелось. Как и её начинку, внешний вид трудно отнести к одной эпохе. Большой экран и современные кнопки ABXY от контроллера Nintendo Switch Pro придают устройству современный облик, а массивный корпус и VGA-разъём создают впечатление, что оно значительно старше.

VapourDeck, isometric view from the back. Screen shows Jazz Jackrabbit, back has all the connectors: usb, audio, vga, usb-c, as well as the power button and micro-sdcard slot.

Под управлением MS-DOS 6.22 консоль успешно запускает большинство DOS-игр. Встроенный динамик воспроизводит и сигналы PC Speaker, и звук Sound Blaster. Поскольку у ESP32 оставалось немного свободных ресурсов, я также добавил встроенный MIDI-синтезатор на основе модифицированной версии TinySoundFont — на случай, если звучание OPL3 в Sound Blaster надоест.

Для большинства игр достаточно крестовины и четырёх основных кнопок. Если их не хватает, есть ещё три кнопки с назначенными полезными клавишами, например Enter и Escape. Через экранное меню можно вызвать виртуальную клавиатуру, чтобы, скажем, ввести имя в таблицу рекордов. Для игр с управлением мышью под крестовиной расположена сенсорная панель, которая её эмулирует. При желании можно подключить и обычную USB-мышь или клавиатуру.

В этом небольшом видео показаны возможности консоли и несколько игр:

Экран действительно выглядит отлично, а заряда хватает надолго — как минимум на несколько часов. Поскольку устройство выросло из идеи Steam Deck, я назвал его VapourDeck. Это игра слов: vapour означает «испарения». Они не обладают такой мощью, как steam, то есть «пар», зато гораздо прохладнее! Есть и второй смысл: из-за необычного сочетания старых и современных компонентов консоль вряд ли когда-нибудь будут выпускать серийно. В этом смысле она тоже своего рода vapourware — технический «воздушный замок».

Как обычно, проект полностью открыт: все исходные материалы доступны на Codeberg. Если решите собрать собственный VapourDeck, загляните также в раздел issues: некоторые компоненты и функции ещё находятся в разработке.

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов