Уже более 5 лет существует проект emscripten. За время существования проекта была проделана огромная работа. Удивить искушенного читателя стало гораздо сложнее. Мы уже видели DOOM, Dune 2, TTD, С&C и много чего ещё в браузере. Однако, запустить DOS программу в браузере по прежнему сложно: нужно не плохо разбираться в C/C++ и emscripten. Эксперименты с Dosbox вылились в проект em-dosbox, большинство DOS программ стали доступны для браузера. Что бы поставить точку, осталось лишь создать открытое API для запуска DOS программ в браузере.

Свято место пусто не бывает. Концепция проста, для запуска DOS программы понадобится:

  • ZIP архив с программой (исполняемый файл + необходимые ресурсы)
  • Минимальное знание JavaScript
  • Сервер отдающий статический html

Alley Cat


Замечательная игра 1983 года о которой я вспоминаю с большой теплотой. Столько замечательных идей реализовано в этой игре, возможно это первая игра с мини играми. Попробуйте вновь окунуться в мир детства. Итак, пробуем запустить.

В первую очередь нужно задать размер экрана dosbox, в стилях страницы задаем размеры классу dosbox-container. Это служебный класс для стилизации экрана dosbox.
.dosbox-container { width: 640px; height: 400px; }


Создадим DOM элемент в котором после инициализации будет размещён экран dosbox. Можно использовать любой DOM элемент на который можно сослаться через атрибут id.

<div id="dosbox"></div>

В процессе инициализации js-dos создаст дочерние DOM элементы для отображения процесса загрузки игры и элемент canvas для отображения экрана dosbox.

Примечание: не рекомендую стилизовать экран dosbox тенями или полупрозрачными градиентами из за значительного проседание FPS в любом браузере.

Осталось лишь подключить и настроить движок js-dos.

01.    <script type="text/javascript" src="http://js-dos.com/cdn/js-dos-api.js"></script>
02.    <script type="text/javascript">
03.      var dosbox = new Dosbox({
04.        id: "dosbox",
05.        onload: function (dosbox) {
06.          dosbox.run("http://js-dos.com/cdn/alley_cat.zip", "./CAT.EXE");
07.        },
08.        onrun: function (dosbox, app) {
09.          console.log("App '" + app + "' is runned");
10.        }
11.      });
12.   </script>

Первой строкой подключаем движок js-dos, скрипт можно скачать и использовать локально. Далее приведен код создания экземпляра dosbox (строка 03).

  • id — уникальный идентификатор DOM элемента в котором нужно создать экземпляр dosbox
  • onload — функция обратного вызова которая будет вызвана после успешного запуска dosbox
  • onrun — функция обратного вызова которая будет вызвана после успешного запуска программы внутри dosbox

В строке 06 приведен фактический код запуска игры.

06.   dosbox.run("http://js-dos.com/cdn/alley_cat.zip", "./CAT.EXE");

  • Первый аргумент — url до zip архива с игрой. Этот архив будет закачан и распакован в виртуальную файловую систему dosbox
  • Второй аргумент — исполняемый файл программы для запуска. Путь указывается относительно корня файловой системы архива

Страничка целиком plunk.

Исходный код
<!doctype html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>js-dos api</title>
    <style type="text/css">
      .dosbox-container { width: 640px; height: 400px; }
      .dosbox-container > .dosbox-overlay { background: url(http://js-dos.com/cdn/alley_cat.png); }
      .dosbox-start { font-size: 35px !important; }
    </style>
  </head>
  <body>
    <div id="dosbox"></div>
    <br/>
    <button onclick="dosbox.requestFullScreen();">Make fullscreen</button>
    
    <script type="text/javascript" src="http://js-dos.com/cdn/js-dos-api.js"></script>
    <script type="text/javascript">
      var dosbox = new Dosbox({
        id: "dosbox",
        onload: function (dosbox) {
          dosbox.run("http://js-dos.com/cdn/alley_cat.zip", "./CAT.EXE");
        },
        onrun: function (dosbox, app) {
          console.log("App '" + app + "' is runned");
        }
      });
    </script>
  </body>
</html>


Теперь вы можете запустить Alley Cat или что угодно ещё в браузере.

P.S.: Исходный код можно запустить по протоколу file:// в браузере

Комментарии (13)


  1. NuShaman
    01.12.2015 09:48

    Почему-то скачанный архив игры локально не запускается, отображается приветственное окошко «Welcome to DOSBox v0.74» если писать без «file://», а если с «file://», то зависает на «Initializing dosbox».


    1. Caiiiycuk
      01.12.2015 11:22

      Политика безопасности браузеров не позволяет делать XHR запросы по протоколу file://. Если вы посмотрите логи то скорее всего там написано:

      XMLHttpRequest cannot load file
      XMLHttpRequest cannot load file:///home/caiiiycuk/tmp/dosbox/alley_cat.zip. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource


      1. tbl
        01.12.2015 20:38

        Можно использовать data: протокол:
        «data:application/zip;base64,<base64_encoded_binary>»

        Для конвертации в Base64 можете использовать, например, это. Либо скачать/написать утилиту для конвертации.


  1. Ermolin
    01.12.2015 10:37

    А есть нормальный способ запускать игрушки под DOS4GW?
    Всякие там NFS первые и т.д.


    1. tbl
      01.12.2015 20:25
      +1

      замена DOS4GW.EXE на DOS32A.EXE


  1. Egor3f
    02.12.2015 03:54

    Если кому интересно, игра моего детства: The Mice Men (Судя по беглому осмотру сурцов, для эмуляции они тоже используют emscripten).
    Незамысловатая, но весьма интересная пошаговая стратегия, цель — провести всех своих персонажей до противоположного конца поля быстрее, чем это сделает противник. С одним нюансом: перемещать можно только столбцы на поле целиком.


  1. amarao
    02.12.2015 20:39

    А мозаик под этой штукой будет? Эмулятор приложений должен уметь запускать браузер.


    1. tbl
      03.12.2015 03:53

      в песочнице сеть не доступна


      1. Caiiiycuk
        03.12.2015 04:34

        В emscripten есть поддержка сокетов и они работают не плохо, например, в TTD работает игра по сети без особых глюков. Не очень понял что за песочница? Если вы про dosbox, то наверное его можно настроить соответствующим образом.


        1. tbl
          03.12.2015 14:46

          хм, не знал. Помню, что в этой виртуальной машине сетевых интерфейсов, кроме lo, не было по причине того, что браузер не позволяет в сеть посылать что попало и куда попало.

          P.S.: Песочница имелась в виду в этом контексте:

          Your web browser essentially runs web pages you visit in a sandbox. They’re restricted to running in your browser and accessing a limited set of resources.


          1. Caiiiycuk
            04.12.2015 04:38

            Действительно браузер не позволит отправлять данные куда попало. Но если запустить прокси на сервере, а браузеру который будет запущен в эмуляторе прописать этот прокси, тогда все взлетит. Давайте попробуем? Mosaic поддерживает прокси?


    1. Caiiiycuk
      03.12.2015 04:34

      Простите, что такое мозаик?


      1. tbl
        03.12.2015 14:53

        древний браузер NSCA Mosaic, только я что-то не припомню, чтобы его под DOS выпускали. Но под эту платформу точно lynx и arachne были.