Некоторые вещи с годами становятся только лучше. Например, классические игры, разработанные в эпоху 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 git@github.com:dreamlayers/em-dosbox.git
cd em-dosbox
./configure
make
В случае успеха в папке src появится dosbox.html и dosbox.js
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).
#86 строка
f.write("Module['arguments'] = [ '-conf', './dosbox.conf', './" + EXECUTABLE + "' ];n</script>n")
Запуск
Итак, мы имеем три файла:
- program.html
- program.data
- dosbox.js
Разместив их на сервере мы сможем запустить программу в браузере.
Счастливого нового года.
50 новогодних подарков.
Автор: Caiiiycuk