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


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


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

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

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

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




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


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



Теперь, мой дорогой читатель, рядом со мной лежит не что иное, как устаревший терминал данных 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-файлу (образу кассеты):
Как я Wolfenstein и эмулятор Денди на промышленный терминал портировал


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


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

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


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

Обратите внимание: Друг посоветовал сделать так: встроенная система - выделенный компьютер. Для WinCE Navigator, у которого почти нет кнопок, очень важно реализовать сенсорный ввод (сейчас его нет в репозитории):
Как я Wolfenstein и эмулятор Денди на промышленный терминал портировал


Теперь у нас есть обработка ввода.. но на экране по-прежнему ничего нет! Вот тут-то и начинается веселье. Фактически, 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; структура или возвращаемое значение.
Как я Wolfenstein и эмулятор Денди на промышленный терминал портировал



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

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

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


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



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


❯ Заключение

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

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



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

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


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

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

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

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

Поделиться с другом

Комментарии 0/0