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

в 2:00, , рубрики: c++, em-dosbox, Emscripten, javascript

em-dosbox и 50 подарков на новый год - 1Некоторые вещи с годами становятся только лучше. Например, классические игры, разработанные в эпоху 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

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

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

Все просто. Клонируем репозиторий em-dosbox и компилируем с помощью autotools и make

git clone git@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.

Автор: Caiiiycuk

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js