Pull to refresh

em-dosbox и 50 подарков на новый год

JavaScript
Некоторые вещи с годами становятся только лучше. Например, классические игры, разработанные в эпоху DOS завораживают. Каждая из них — штучный продукт сделанный с большой любовью. К сожалению DOS платформа ушла в прошлое и вместе с ней уходят замечательные продукты. Вернуть их в современный мир — это ли не настоящий подарок?


Как? Очень просто! Интересующийся читатель, конечно же, помнит о проекте emscripten, благодаря которому C++ код может быть преобразован в JavaScript для работы в браузере. Именно с его помощью для браузера были адаптированы игры DOOM, Dune 2, TTD, X-COM и множество других. Однако этот путь долог и труден. На один проект может уйти до полугода. А если хочется все и сразу? Есть ли другой путь?

em-dosbox


Есть другой путь — использовать DosBox. Действительно, зачем портировать каждый проект по отдельности, когда можно портировать всю DOS платформу (если быть точным, эмулятор MS-DOS). Эту гениальную идею воплотил Boris Gjenero в проекте em-dosbox. Это порт DosBox в JavaScript выполненный с помощью emscripten.

Итак, сейчас я расскажу, как перенести «почти любую» DOS программу в браузер.

Ингредиенты:
  • Браузер
  • em-dosbox (dosbox.js)
  • Программа корректно работающая в DosBox


Во время работы браузер загружает dosbox.js и пакет данных с программой (обычно это бинарный файл с упакованной директорией исходной программы). Скрипт dosbox.js есть ни что иное, как DosBox портированный в JavaScript, выполняясь он эмулирует платформу DOS с запущенной в ней программой.

Компиляция dosbox.js


Все просто. Клонируем репозиторий em-dosbox и компилируем с помощью autotools и make
git clone https://github.com/dreamlayers/em-dosbox.git
cd em-dosbox
./configure
make

В случае успеха в папке src появится dosbox.html и dosbox.js

Повышение производительности em-dosbox
Добавляем к dosbox_LDFLAGS в src/Makefile.am опцию --memory-init-file 0. Эта опция отключает генерацию файла памяти, который используется для ускорения загрузки. В нашем случае этот файл будет размером порядка тридцати мегабайт, что не применимо для браузера.
dosbox_LDFLAGS = -s TOTAL_MEMORY=67108864 --pre-js pre.js --memory-init-file 0

В файле src/dosbox.cpp рекомендую выполнить замену
emscripten_set_main_loop(em_main_loop, 100, 1); 
на
emscripten_set_main_loop(em_main_loop, 0, 1); 

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

Для ускорения работы эмулятора добавьте строки в функцию main в файле src/gui/sdlmain.cpp:
#ifdef EMSCRIPTEN
	EM_ASM("SDL.defaults.copyOnLock = false; SDL.defaults.discardOnLock = true; SDL.defaults.opaqueFrontBuffer = false;");
#endif




Упаковка программы


em-dosbox поставляется со скриптом позволяющим упаковать директорию с программой в бинарный файл, который может быть использован совместно с dosbox.js. Например, что бы получить пакетный файл игры Dune 2, достаточно выполнить:
#python src/packager.py <имя пакета> <путь до директории> <исполняемый файл>
python src/packager.py dune2 ~/dune2 dune2.exe

В случае успеха буду созданы файлы dune2.html и dune2.data. HTML файл создается по шаблону dosbox.html (напомню, он лежит в папке src).

Изменение настроек dosbox
По умолчанию, dosbox будет запущен со стандартной конфигурацией. Что бы её изменить просто создайте в папке с программой файл dosbox.conf. И измените скрипт сборки следующим образом:
#86 строка
f.write("Module['arguments'] = [ '-conf', './dosbox.conf', './" + EXECUTABLE + "' ];\n</script>\n")


Запуск


Итак, мы имеем три файла:
  • program.html
  • program.data
  • dosbox.js


Разместив их на сервере мы сможем запустить программу в браузере.

Счастливого нового года.
50 новогодних подарков.

Список адаптированных игр
С помощью em-dosbox были адаптированы для браузера следующие игры:
  • Abuse
  • Alley Cat
  • Another World
  • Arcade Volleyball
  • Arkanoid
  • Battle Chess
  • Budokan: The Martial Spirit
  • CD-Man
  • Colorado
  • Dangerous Dave in the Haunted Mansion
  • DeathTrack
  • Digger
  • Disney's Duck Tales: The Quest for Gold
  • Doom
  • Doom 2
  • Dune 2
  • Dyna Blaster
  • Earthworm Jim 2
  • Fire & Forget II
  • Goblins 1-3
  • Golden Axe
  • Heretic: Shadow of the Serpent Riders
  • Incredible Machine
  • The
  • IndyCar Racing
  • Krypton Egg
  • Lamborghini: American Challenge
  • Lode Runner
  • Lost Vikings
  • The
  • Metal Mutant
  • Micro Machines
  • Mine Bombers
  • Mortal Kombat
  • Pac-Man
  • Prehistorik
  • Prehistorik 2
  • Prince of Persia
  • Scorched Earth: The Mother of All Games
  • SimCity
  • Stunts
  • Supaplex
  • Test Drive
  • Tetris
  • Tower Toppler
  • Tyrian 2000
  • Ugh!
  • WarCraft: Orcs & Humans
  • Wings of Fury
  • Winter Supersports 92
  • Wolfenstein 3D
  • Xonix

Tags:emscriptenc++javascriptem-dosbox
Hubs: JavaScript
Total votes 44: ↑41 and ↓3 +38
Views26.9K

Popular right now