The Jerusalem PostTibi threatens Channel 13 reporters with NIS 150,000 lawsuit for questioning medical credentialsPunchDon’t politicise sports, Presidency tells Obi over Flamingos greetingInquirer EntertainmentBea Millan-Windorski wears PH’s colors to Miss Universe kickoffInquirerButuan drug suspect busted, over P700,000 shabu seizedZDF heuteAktuelle Pressemitteilungen des ZDFN + 1Мелкие твердые частицы в воздухе связали с повышенным риском развития синоназальных опухолейRai NewsTg2 Medicina 33 del 09/11/2026Screen RantGodzilla Minus Zero's Revenge Plot & Horrifying New York Vision Officially Explained By DirectorPremium TimesSoldiers kill two terrorists, arrest suspected gunrunnerSeeking AlphaDole declares $0.085 dividendNumeramaBlack Friday : les meilleures offres ce lundi chez Amazon, Fnac, Boulanger… (EN DIRECT)ХабрНа Хабре теперь одна лента для статей, новостей и постов
The Daily Newsstand · Free, Always
Monday, November 9, 2026

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

Translate

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

Работая с машиной на 486, я не обладал особыми техническими знаниями об оборудовании. Я совершенно точно разобрался, как работает шина ISA, ведь иначе бы я не собрал программатор флеш-памяти из старой карты расширения ISA, чипов декодирования адресов и сокета для AM29F512. Однако я всегда считал материнские платы более сложной магией: столько много дорожек! Такие большие интегральные схемы! Куча загадочных компонентов!

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

Black VapourDeck on a table. The thing has a LCD showing Jazz Jackrabbit in the middle, a D-pad on the left and XYAB and some other buttons on the right.

В этой статье я расскажу, как этого добился.

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

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

Unlabeled VapourDeck mainboard PCB

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

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

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

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

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

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

Стоит отметить, что эта шина всё ещё очень похожа на классическую шину памяти старых 8-битных процессоров: за одну транзакцию передаётся одно слово по одному адресу, при этом предусмотрены механизмы для работы с более медленной периферией и линии разрешения байтов, позволяющие работать с данными меньшей разрядности. Для повышения производительности можно также использовать расширенные режимы обмена (например, пакетную передачу), выполнив соответствующее рукопожатие (handshake). Как уже упоминалось, это совершенно необязательно: процессор прекрасно работает и с такими «простыми» транзакциями. Но что же подключить к этой шине?

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

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

С учётом этого остальные микросхемы на прототипе материнской платы вряд ли станут для вас сюрпризом: помимо процессора, на ней установлены FPGA и ESP32-S3. Первая будет выполнять роль чипсета обычной материнской платы. Вместо 40-контактного разъёма IDE, разъёма для дисковода, интерфейса PS/2 и прочего она будет использовать одну шину QPI для связи с 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 показалась мне важнее, чем поддержка классического Bluetooth. К тому же на момент создания этой платы не существовало ни одного чипа ESP, который поддерживал бы оба варианта.

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

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

Есть и множество других мелочей: блоки питания для всех необходимых напряжений, USB-концентратор, позволяющий подключить к ESP32 несколько периферийных устройств, аудиокодек I2S, соединённый с FPGA и обеспечивающий вывод звука, разъём для карт 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 для обмена данными. Кроме того, FPGA подключена к аудиокодеку и SDRAM. ESP32, в свою очередь, соединён с USB-концентратором и картой microSD.

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

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

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

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

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

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

Для работы PC необходим ряд ключевых компонентов, реализованных средствами FPGA. Один из них — контроллер оперативной памяти. Напомню, что процессор вообще не имеет понятия «RAM», не говоря уже о конкретных типах оперативной памяти. Всё, что он делает, — читает и записывает данные по адресам, за которыми может стоять оперативная память, а может и не стоять.

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

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

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

Помимо подсистемы памяти, FPGA реализует также низкоуровневую логику всех периферийных устройств. Описания на Verilog для PIC (Programmable Interrupt Controller — программируемого контроллера прерываний), PIT (Programmable Interval Timer — программируемого интервального таймера), DMA (Direct Memory Access — прямого доступа к памяти), а также Sound Blaster я взял из проекта ao486_MiSTer. Этот проект предназначен для FPGA-платы 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 перед запуском процессора. Благодаря этому отдельное периферийное устройство ROM не требуется.

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

Сама BIOS — это (слегка модифицированная версия) BIOS, используемой в проекте ao486, который сам по себе стал производным от программного эмулятора PC Bochs. Это проверенная тестами и временем BIOS, и хотя она написана на довольно странной смеси языка C и ассемблера, её довольно легко отлаживать и модифицировать. Функциональность видеочипа по большей мере совпадает с функциональностью стандартной VGA-карты, и для работы ему требуется лишь VGA BIOS. Для чипа F65545 VGA BIOS по-прежнему доступна, и кто-то даже выложил в Интернет инструменты (ищите 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 работает со скоростью примерно 8FPS. Это и не удивительно, ведь Quake разрабатывался с расчётом на Pentium, а не на 486.

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

Отлично, прототип материнской платы готов, и на его основе можно вполне собрать десктопный PC. Однако я обещал создать нечто портативное. Ниже я объясню, как превратил эту материнскую плату в реальный продукт, на котором даже сегодня легко можно играть в DOS-игры.

VapourDeck

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

Почему же эта идея воплотилась в реальный коммерческий продукт лишь в 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 дюймов, а высокое разрешение мне и не требовалось: 640x480 вполне достаточно. По какой-то причине такие дисплеи до сих пор выпускают, и мне удалось найти несколько производителей, у которых можно заказать 5,7-дюймовый ЖК-дисплей с разрешением 640x480. Причём это не устаревшие модели: в них используются современные IPS-матрицы с отличными характеристиками. На изображение можно смотреть под любым углом, и оно останется ярким и чётким, без размазывания. Конечно, такой дисплей не очень-то соответствует духу ретротехники, зато отлично подойдёт тем, кто хочет сосредоточиться на играх, а не на технологиях отображения.

У этих ЖК-дисплеев параллельный интерфейс, что очень удобно: он напрямую совместим с выходом для ЖК-дисплея VGA-чипа F65545, которую я использую. Мне оставалось лишь добавить несколько мультиплексоров на линии RGB, чтобы можно было переключаться между изображением с дисплея и экранным меню (OSD), точно так же, как я сделал для обычного аналогового VGA-выхода. Для подсветки ЖК-дисплея также требуется довольно высокое напряжение, но для его генерации существуют специальные интегральные схемы; встроить такую схему оказалось несложно.

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

Я решил разместить блок управления питанием (PMU) на отдельной печатной плате. Моя логика была такой: если я допущу ошибку в этой части схемы, мне придётся переделывать только плату 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. Возможно, 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 оставалось немного свободных ресурсов, я даже реализовал модифицированную версию TinySoundFont, чтобы добавить встроенный MIDI-синтезатор — на случай, если надоест звучание OPL3 в Sound Blaster.

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

Вот небольшое видео, демонстрирующее возможности консоли и несколько игр:

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

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

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.