Портирование Wolfenstein 3D и эмулятора NES на промышленный терминал с Windows CE: практическое руководство

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

Идея портировать известные игры на различные платформы — не нова. Однако в данном случае целью стал промышленный терминал сбора данных (ТСД), работающий под управлением операционной системы Windows CE. Почему именно это устройство? И как удалось адаптировать для него Wolfenstein 3D и эмулятор приставки Dendy (NES)? Об этом и пойдет речь далее.

❯ Истоки проекта: зачем это нужно?

Как энтузиаст ретро-техники, я стремлюсь давать вторую жизнь старому оборудованию, будь то обычные ПК или устройства на необычных архитектурах (ARM, MIPS, SH3). Цель — не просто сократить количество электронных отходов, но и найти для, казалось бы, устаревших гаджетов новое, увлекательное применение. Например, превратить промышленный сканер или навигатор в портативную игровую консоль — задача куда интереснее, чем просто настроить на нем терминал или часы.

Сегодня запустить эмулятор на смартфоне, ТВ-приставке или одноплатном компьютере — дело пары кликов. Однако существуют узкоспециализированные платформы, для которых подобного софта просто нет. Вот тогда и приходится браться за инструменты и писать код самостоятельно, что мы и проделали в рамках этого проекта.

Героем нашего эксперимента стал устаревший терминал M3 Green. Несмотря на складское прошлое, это вполне функциональный портативный компьютер со следующими характеристиками:

  • Процессор: Intel PXA272 (ARMv5) с тактовой частотой 624 МГц. Важный нюанс — отсутствие аппаратной поддержки блока операций с плавающей запятой (FPU).

  • Оперативная память: 128 МБ SDRAM. Для Windows CE этого более чем достаточно, так как сама система занимает лишь 8-16 МБ.

  • Дисплей: 3-дюймовый экран с разрешением 240x320 точек и резистивным сенсорным слоем — типичный для КПК своего времени.

  • Коммуникации: Наличие USB-хоста (через док-станцию), Wi-Fi и возможность синхронизации с ПК.

  • Клавиатура: Полноценная аппаратная клавиатура, включая функциональные клавиши.

Таким образом, устройство обладает солидным для своих задач потенциалом, а его прочный корпус делает его пригодным для использования в полевых условиях.

❯ Этап первый: портирование эмулятора NES (Dendy)

Работа началась с эмулятора легендарной 8-битной приставки. Среди множества open-source решений был выбран проект, изначально созданный для платформы MRP на китайских телефонах. Его плюс — высокая скорость работы, минус — отсутствие эмуляции звука и «зашитая» наглухо логика.

Основная сложность заключалась в том, что весь код был построен на глобальных переменных, без четкого разделения на ядро эмуляции и интерфейс. Первым делом потребовалось переписать систему загрузки игровых образов (ROM), адаптировав пути файловой системы Windows CE (где используется обратный слэш «\»).

Следующим шагом стала обработка ввода. В исходном коде управление было жестко привязано к кнопкам телефона. Мы переработали этот блок, связав физические клавиши терминала с виртуальными кодами Windows, что позволило в дальнейшем реализовать их переназначение. Для устройств без клавиатуры (например, навигаторов) также важно было добавить поддержку сенсорного ввода.

Самой интересной задачей стал вывод изображения. Windows CE не имеет быстрых графических API, подобных DirectDraw на десктопах. Пришлось использовать стандартный, но медленный GDI (Graphical Device Interface).

Алгоритм работы был таким:

  1. Создание окна и получение контекста устройства (Device Context).
  2. Подготовка структуры BITMAPINFO, описывающей формат кадрового буфера эмулятора (RGB565, 240x240).
  3. В основном цикле: обработка ввода, выполнение цикла эмуляции NES и вывод изображения на экран с помощью функции SetDIBitsToDevice.

Результат: эмулятор стабильно работает на устройствах с процессором от 400 МГц. Для полноценного использования не хватает лишь удобного интерфейса: окна выбора игры, настройки управления и т.д. Однако главное — концепция доказана: запустить Dendy на промышленном терминале возможно!

Обратите внимание: Друг посоветовал сделать так: встроенная система - выделенный компьютер.

❯ Этап второй: портирование Wolfenstein 3D

Следующей целью стал культовый трехмерный шутер. Вместо работы с оригинальным кодом для DOS, который полон ассемблерных вставок, был выбран современный порт Wolf4SDL, использующий библиотеку SDL 1.2 для абстракции графики и ввода.

К счастью, порт SDL для Windows CE уже существовал, что значительно упростило задачу. Сборка библиотеки прошла без проблем в Visual Studio 2005.

Основные трудности возникли при адаптации самой игры:

  1. Звук: Под Windows CE отсутствует порт библиотеки SDL_mixer. Было принято решение временно отключить звуковую подсистему в игре, закомментировав соответствующие вызовы.
  2. Файловая система: Код игры использовал POSIX-функции (open, read, stat). Их пришлось заменить на аналоги из стандартной библиотеки Си (stdio.h), а также учесть особенности путей в WinCE (отсутствие понятия «текущий каталог»).
  3. Управление: Встроенная система привязки клавиш в игре не подходила для устройства с ограниченным набором кнопок. Пришлось «зашить» управление напрямую, сопоставив аппаратные клавиши терминала с действиями в игре (движение, стрельба).

После исправления этих и других мелких несоответствий игра успешно запустилась сначала на эмуляторе, а затем и на реальном устройстве.

❯ Итоги и перспективы

Эксперимент можно считать успешным. Оба проекта — и эмулятор NES, и Wolfenstein 3D — были портированы на промышленный терминал под управлением Windows CE. Исходный код выложен в открытый доступ на GitHub.

Дальнейшее развитие может включать портирование на другие устройства с Windows CE (например, GPS-навигаторы), добавление виртуальной клавиатуры для управления и реализацию поддержки внешних Bluetooth-геймпадов.

Если вас заинтересовало само устройство — подобные терминалы можно найти по весьма доступной цене. Они полностью функциональны и представляют собой отличную платформу для технических экспериментов. В рамках сообщества мы планируем разыграть несколько таких аппаратов среди заинтересованных читателей.

Больше материалов о программировании, реверс-инжиниринге и нестандартном использовании техники можно найти в моем Telegram-канале. Также мы будем рады, если у вас есть нерабочие или «кирпичные» устройства (гаджеты, китайские реплики), которые не жалко отдать на опыты — свяжитесь с нами. Возможно, именно ваше устройство станет героем следующей статьи!

Пример устройства

Если вы хотите сделать пожертвование, вы можете сделать это следующими способами :)

Всего голосов: [Мой] Опрос Покупка гаджетов AndroidTSD Порт программирования Wolfenstein NEEndy Retro Компьютерное оборудование Видео YouTube Длинный пост 27

Больше интересных статей здесь: Гаджеты.

Источник статьи: Как я Wolfenstein и эмулятор Денди на промышленный терминал портировал.