Эмуляция 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