Эмуляция Deluxe Ski Jump 2 с DOSBox и wasm

Пару недель назад мой друг попросил меня помочь ему запустить Deluxe Ski Jump на современном ПК. DSJ 2 - это игра для DOS, которая была популярна в эпоху до Windows Vista. Есть более новые версии этой игры, но они не получили такой популярности, как их предшественники.

Есть один особенно популярный способ запустить DSJ в Windows 10. Он включает установку эмулятора DOS, DOSBox и использование пользовательской конфигурации для повышения производительности игры. Само по себе это несложно, но я подумал, что могу попробовать запустить DSJ в браузере. Это сделает его доступным для всех без лишних хлопот. Это также основная причина, по которой я заинтересовался WebAssembly, веб-стандартом двоичного формата и исполняющей машиной, которая может запускать код почти с собственной скоростью.

Исходный код DSJ не является общедоступным, и даже если бы он был, не существует компилятора Turbo Pascal (язык реализации DSJ) для wasm. Следовательно, единственный способ запустить эту игру - использовать предварительно скомпилированные двоичные файлы и эмулятор.

К счастью, DOSBox уже был портирован для поддержки emscripten, компилятора LLVM-to-javascript. В результате каждый программист должен иметь возможность запускать игры для DOS без каких-либо затруднений.



Быстрый поиск показал, что было много проектов, которые пытались делать то же самое, что и я, запускать DSJ в браузере, но они либо не устанавливали правильную конфигурацию эмулятора, либо использовали предыдущий стандарт для выполнения кода в браузере, asm. js. Несомненно, есть возможности для улучшения.



Emsdk

Я начал свое путешествие с клонирования em-dosbox, порта DOSBox, и emsdk, среды emscripten. Чтобы создать em-dosbox, нам необходимо настроить emsdk, что делает настройку emsdk нашим первым шагом.
После документации emscripten: начало работы мы должны выполнить следующие команды в каталоге emsdk:

# Загрузите и установите новейшие инструменты SDK.
./emsdk install latest

# Сделать «последний» SDK «активным» для текущего пользователя. (записывает файл ~ / .emscripten)
./emsdk активировать последнюю версию

# Активируйте PATH и другие переменные среды в текущем терминале
source ./emsdk_env.sh

Все эти шаги прошли гладко, и я смог перейти к части DOSBox.

Em-dosbox

В зависимости от игры нам может потребоваться настроить некоторые флаги компилятора. Наиболее заметными из них являются:

  • FORCE_FILESYSTEM = 1, что заставляет встраивать поддержку файловой системы в модуль wasm DOSBox. Это необходимо, чтобы DOSBOX мог читать внешние файлы, например игры.
  • «BINARYEN_TRAP_MODE =’ clamp ’» WASM может захватить. Некоторые инструкции могут остановить его выполнение. Одним из таких примеров является i32.trunc_s/f32, который вызывает исключение при сбое преобразования из числа с плавающей запятой в целое число. Важно понимать, что такие ситуации могут возникать (в DSJ они случаются), и настроить emsdk для использования либо js режима прерывания (попросите его вести себя так же, как js) или clamp. Второй вариант пытается использовать разумное значение при выборе возвращаемого значения, он не захватывает и работает быстрее, чем js.

Эти флаги довольно общие, они применимы ко многим играм, поэтому я добавил их в /src/Makefile.am.

Попробуем собрать em-dosbox:

После создания em-dosbox мы должны увидеть файлы dosbox.js и dosbox.wasm в каталоге src.

Упаковка DSJ 2

Последняя часть запуска DSJ 2 в браузере - упаковка самой игры. Чтобы получить свежую копию, посетите страницу Mediamond и скачайте бесплатную демоверсию. С этого момента я буду предполагать, что архив игры был распакован рядом с папкой em-dosbox.

Подобно запуску DSJ в Windows, нам также нужна настраиваемая конфигурация DOSBox. Однако на этот раз мы доставим его вместе с игрой. Давайте создадим dosbox.conf файл в каталоге игры и воспользуемся теми же настройками, которые предложены для игры в DSJ с DOSBox в Windows:

Deluxe Ski Jump полагается на наличие внешних файлов в том же каталоге, что и основной исполняемый файл DSJ.EXE. Поэтому лучше всего упаковать весь каталог с игрой. Для этого нам нужно в папке em-dosbox/src ввести следующую команду:

Это создаст два файла, dsj.data и dsj.html, рядом с ранее созданными файлами DOSBox.

Из-за политики одинакового происхождения открытие dsj.html напрямую из файловой системы не будет работать, и нам нужно обслуживать все четыре файла, dosbox.js, dosbox.wasm, dsj.data и dsj.html через HTTP-сервер. В целях тестирования мы можем использовать для этого команду emrun:

На этом этапе настройка emsdk, сборка em-dosbox и подготовка игры завершаются.

А теперь самое время для самого лучшего. Играем!

Всего один совет: отключение звука помогает немного повысить производительность!



Это все на сегодня. Спасибо за чтение!

Все ресурсы, использованные в этом посте, доступны в моем репозитории Github https://github.com/bartekbp/em-dosbox/tree/deluxe-ski-jump