Как я Wolfenstein и эмулятор Денди на промышленный терминал портировал

Отказ от ответственности: использование таких слов, как «порт», «хакер» и «реверс» вовсе не означает, что эта статья предназначена исключительно для гиков! Стараюсь писать так, чтобы всем было понятно и интересно!

Конечно, многие мои читатели так или иначе слышали о портировании известных игр на различные платформы. В какой-то момент у меня возникла такая же идея, но мне захотелось портировать игру и эмулятор на довольно странное промышленное устройство, работающее на платформе Windows CE. Как мне портировать Wolfenstein и эмулятор NES отважному, но сломанному складскому работнику? Почему? Читайте сегодняшнюю подробную статью!

❯ Как, почему и зачем?

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

Моя цель — сделать так, чтобы как можно меньше устройств попадало в переработку черных металлов, если они смогут найти интересное применение в наше время. Ведь многие устройства, такие как промышленные ТСД или кассовые аппараты, которые на первый взгляд кажутся бесполезными, на самом деле таковыми не являются и их можно найти во всяких крутых приложениях. Однако сценарий запуска Putty и превращения компактной машины в портативный терминал или превращения устройства в погодные часы не так интересен, как превращение чего-либо с процессором в игровую консоль!

Общество потребителей забыло, что, запустив эмуляторы или RetroArch, первые Android TV-приставки фактически за час превратились в игровые консоли, на смартфоне вы можете разместить его так же легко, как на одноплатном компьютере. Веб-сайт, на PlayStation.. вы можете запустить Linux . Но не всегда все просто: иногда платформа настолько узкоспециализирована, что нет ни эмуляторов, ни портов каких-либо игр, поэтому вам нужно брать свою волю в свои руки, о чем я вам расскажу в сегодняшнем материале!

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

  • Процессор: ARMv5 Intel PXA272 + Wireless MMX на частоте 624 МГц. Однако есть у этого процессора и слабая сторона: нет аппаратного разделения (функциональность ARM ISA) и FPU (сопроцессора с плавающей запятой).

  • Оперативная память: 128 МБ SDRAM. Не кажется ли это много? Не забывайте, что Windows CE потребляет для своих нужд всего около 8-16 МБ памяти. Это оставляет нам до 100 МБ свободного места. Например, современным версиям Windows требуется не менее ~1 ГБ ОЗУ, независимо от кэширования операций ввода-вывода!

  • дисплей: Встроенная 3-дюймовая матрица с разрешением 240х320. Кажется немного.. но это норма для КПК! Конечно, есть и резистивный сенсорный экран.

  • Связь: Одной из самых сильных сторон данного типа устройств является наличие аппаратного USB-хоста (в док-станции), возможность синхронизации с ПК и конечно же Wi-Fi!

  • Клавиатура: Ну тут всё очевидно :) Есть даже клавиши F!

В общем, исходные данные просто фантастические! Учитывая, что аппарат бронирован, его можно считать достаточно портативным устройством, которое можно использовать в более экстремальных условиях.

❯ Эмулятор NES

Начнем со знаменитого эмулятора «Денди». Существует множество различных эмуляторов с открытым исходным кодом, и можно использовать любой из них и портировать его. Среди наиболее портативных инструментов можно выделить InfoNES, которая портирована на Windows CE, но работает нестабильно на многих современных машинах и требует настройки под конкретные устройства. Потом я задумался и вспомнил, что видел в семплах SDK порт довольно быстрого эмулятора NES на китайский телефон, о котором я рассказывал в статье. Единственное предостережение: в нем нет звуковой симуляции, но работает он довольно быстро. Я не могу понять корни эмулятора; нет никаких авторских прав или чего-то еще. Этот эмулятор, возможно, лег в основу многих ранних китайских игровых консолей.

Изначально симулятор разрабатывался для платформы MRP, что просто упростило задачу. Фактически все приложения на китайских мобильных телефонах имеют четыре функции: инициализация, рендеринг, обработка событий и выход. Конечно, существуют обработчики событий, например таймеры, но в целом концепция очень ясна. Эмулятор насквозь «жестко запрограммирован», с определенным путем к ROM-файлу (образу кассеты):

Все было сложно, так как большинство переменных были глобальными и ни одно состояние симулятора не обсуждалось, поэтому код пришлось рефакторить. Но сначала надо хотя бы что-то начать! Для этого мы как минимум переписали логику загрузки ПЗУ на stdio, учтя, что в WinCE корень файловой системы начинается с \ (вместо "/" как в Unix):

Эмулятор теперь загружает ПЗУ, но у нас по-прежнему нет вывода на экран или обработки ввода. Состояние кнопки геймпада представлено глобальной переменной KEY. В исходной версии большой переключатель просто сопоставлял код клавиши телефона с кодом аппаратной кнопки геймпада NES:

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

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

Для WinCE Navigator, у которого почти нет кнопок, очень важно реализовать сенсорный ввод (сейчас его нет в репозитории):

Теперь у нас есть обработка ввода.. но на экране по-прежнему ничего нет! Вот тут-то и начинается веселье. Фактически, API быстрой графики не существует в Windows CE. В Windows Mobile есть GX, предназначенный для дисплеев 240x320, который обеспечивает прямой доступ к фреймбуферу устройства, а также специальные вызовы ExtScape, позволяющие делать то же самое. Однако современные устройства WinCE не поддерживают ни один из методов. Microsoft предложила использовать DirectDraw, который будет знаком читателям, игравшим в игры 1990-х годов, но вряд ли был реализован где-либо, кроме как на КПК. Итак, осталась подсистема 2D GDI, которая рисует окна и почти всю графику в обычной Windows — медленный, неповоротливый подход, который не позволяет нам использовать все возможности устройства.

Сначала создаем окно. Здесь все стандартно:

hwnd = CreateWindowW(L"статический", L"симулятор", WS_VISIBLE | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, 0, 0);
постоянный ток = GetDC (hwnd);

SHFullScreen(hwnd, SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIBUTTON);

В симуляторе отображаемый контент представлен переменной LCDBUF, которая содержит изображение RGB565 с разрешением 240х240 (слегка усеченное). Поскольку устройства Windows CE обычно также используют 16-битные цвета, было бы достаточно просто скопировать их непосредственно в кадровый буфер дисплея с помощью строк развертки и получить изображение, но.. из-за GDI система принимает только формат RGB5551, а затем конвертирует обратно RGB565 — вот почему мы наблюдаем задержку на слабых устройствах.

Сначала заполняем структуру BITMAPINFO, описывающую формат изображения «выхлопа» симулятора:

растровая информация;
memset(&info, 0, sizeof(информация));
info.bmiHeader.biBitCount = 16;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biHeight = -240;
info.bmiHeader.biWidth = 240;
info.bmiHeader.biCompression = BI_RGB;
info.bmiHeader.biSize = sizeof(информация);

Затем в основном цикле, когда окно открыто, мы вызываем обработку ввода, следующий цикл NES и, наконец, используем SetDIBitsToDevice для отображения всего:

в то время как (IsWindow (hwnd))
{
обработать ввод();

НЕСтаймер(2);
SetDIBitsToDevice(dc, 0, 0, info.bmiHeader.biWidth, - info.bmiHeader.biHeight, 0, 0, 0, -info.bmiHeader.biHeight, LCDBUF, &info, DIB_RGB_COLORS);
}

Результат: Эмулятор хорошо работает на быстрых устройствах с процессорами от 400 МГц, как 240x320, так и 480x800. Осталось добавить "мордашки": окошко выбора ПЗУ, диалог переназначения кнопок, читы (редактирование консоли ОЗУ) и управление игровым временем. Внедрение достаточного таймера, ограничивающего ее до 60 FPS, также было бы идеальным, но.. ни одно из устройств, которые я пробовал, не может эмулировать NES на FullSpeed ​​без пропуска кадров. Но на самом деле, доказательство концепции: у нас уже есть эмулятор NES!

В других эмуляторах обычно приходится отвязывать специфичные для платформы разделы с «лицами», интерфейсами, конфигурациями и другими вкусностями. Для портирования выделяются эти эмуляторы, где есть четкое разграничение между ядром и "лицом", и где это ядро ​​можно без проблем вытащить!

❯ Wolfenstein 3D

Далее я решил портировать известную игру Wolfenstein 3D. В «большой» игре с открытым исходным кодом она относительно нетребовательна (требуется ~640 КБ ОЗУ, что означает, что теоретически ее можно перенести на большой микроконтроллер). В этом случае вместо того, чтобы брать оригинальный код (который содержит вставки в ассемблер x86 и драйвер звуковой карты, обработчик аппаратного таймера и другие возможности DOS-игры, совершенно не нужные в нашем случае), можно запустить с современным портом WolfSDL, который использует библиотеку SDL 1.2 в качестве библиотеки для вывода графики и обработки ввода.

Сам SDL прекрасно абстрагирует возможности платформы и его не особо сложно портировать, но порт для WinCE уже есть — и он учитывает особенности платформы с графикой и кнопками. SDL собралось легко и без проблем — заходим в папку VisualCE и собираем библиотеку в VS2005.

Дальше самое интересное — портирование самой игры! Изначально игра отказывалась собираться из-за звукового модуля, так как под Windows CE нет порта SDL_mixer (плагин SDL, выполняющий роль программного микшера). Роль микшера может выполнять сама Windows с помощью модуля waveout, но звук может "выкинуться" в процессе портирования :) Для этого просто удалим все вызовы звуковой подсистемы игры идем в библиотеку Any; структура или возвращаемое значение.

Кроме того, игра отказывается выполнять сборку, поскольку Wolf4SDL использует вызовы POSIX, такие как stat и open/read/write/close. Сам вызов можно легко преобразовать в аналог stdio, а stat используется только для проверки существования файла (механизм, используемый для определения сюжета игры):

int read(FILE* f, void* buf, int len)
{
вернуть fread(buf, len, 1, f);
}

После этого возникли проблемы с обработкой ввода в игре. В игре используется встроенный механизм привязки кнопок в настройках, но для устройства WinCE невозможно иметь даже DPAD, не говоря уже о целой клавиатуре. Поэтому мне нужно умно и жестко запрограммировать некоторые кнопки для конкретного устройства:

После исправления некоторых мелких ошибок и устранения особенности путей в WinCE (нет понятия "текущий каталог") игра наконец-то запустилась на эмуляторе!

И редактировать кнопки и сам ТСД!

❯ Заключение

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

Друзья! Если вас заинтересовало устройство в этой статье, то вы можете купить его здесь за 500 рублей с полным комплектом оборудования (коробка, диск, блок питания, док-станция и само устройство, иногда попадается GSM доработанная версия) . Эти устройства уже сняты с производства, но полностью функциональны, и даже аккумуляторы заряжаются отлично. У меня всего более 50 единиц, и я хочу спонсировать раздачу подарков. Интересно, заинтересуется ли кто-нибудь из читателей столь интересным устройством, как я? Кроме того, в ближайшее время мы нарисуем для вас двух таких красавиц.

У меня также есть собственный Telegram-канал «Клуб любителей чуши», где я публикую статьи о программировании, реверс-инжиниринге и просто хвастаюсь статьями о серверной части, смешанными с постами Little Shields. Если вам интересно, подпишитесь, там же будут опубликованы условия конкурса. Мы начнем проводить конкурсы, как только выйдет видеоверсия этой статьи. А пока вы можете посмотреть мое недавнее видео о возрождении ноутбука на 386:

кстати, если у кого-то из читателей есть ненужные устройства (в том числе глючные) или дешёвые китайские подделки iPhone/iPad/MacBook и других фирменных устройств (любых), которые не работают, тормозят или кирпичят, просто не хочется их выкидывать на свалку, а вместо этого отдайте их хорошим людям и прочитайте о них статью - напишите мне в Telegram или в комментариях! Я тоже собираюсь их купить. Специально ищу донора дисплея для китайской копии iPhone 11 Pro Max: на мой взгляд, контроллер дисплея горячий и на нем нет изображения :(

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

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

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

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

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