01 мая 2014

The Horde

В данной статье речь пойдет о проблеме запуска старых досовских игр на современных компьютерах, а так же будут затронуты вопросы программной эмуляции процессоров

The Horde - это старая, но очень славная компьютерная игра, которая сильно увлекла меня в детстве.  Тогда у меня был Pentiun 100 и он считался очень серьезным компьютером.  Его уже давно нет, а вот CD-диск с игрой до сих пор где-то лежит и периодически попадается мне на глаза, напоминая о веселом детстве.
Эта игра вышла еще аж в 1994 году, но сюжет и игровой процесс были крайне необычными и опережающими свое время. Сейчас ее можно классифицировать как смесь экшена третьего лица и стратегии реального времени. Наверно этим она привлекла мое детское внимание и запомнилась больше всех остальных.
Задача главного героя по имения Чанси охранять королевкие угодия от красных монстров, называющих себя ордой, отсюда и название the horde. Для этого у него есть длинный меч, подаренный королем, которым он очень забавно махает. Монстры совсем не страшные, а добрые и смешные, весело прыгают по полям и поедают местных жителей вместе с их домами. Озвучка при этом просто шедевр и заслуживает особого внимания. Помимо охраны деревень герою необходимо платить налоги, ведь если он не сможет расплатиться, то его посадят в тюрьму и игра будет закончена. Деньги на уплату налогов игрок получает от жителей и их коров, поэтому он заинтересован в том, чтобы спасти как можно больше домов и обзавестись большим табуном коров. Еще он умеет строить укрепительные сооружения, рвы, заборы, сажать и выкапывать деревья и еще некоторые действия. Во общем весьма развивающая, добрая игра, о которой у меня остались самые теплые воспоминания.

В ней даже использовались вставки живого видео с участием Кирка Кэмерона и Майкла Грегори. А музыка к игре была удостоена  награды «Premiere Award for Best Musical Score»  в 1994 году. Так что культовая вещичка!
 
Но вот поиграть в нее сейчас оказывается не такая тривиальная задачка как раньше. Эта игра, как и многие другие того периода, запускалась из под DOS. Но чтобы полноценно играть в ее на современных компьютерах, одного только запуска DOS с дискеты уже не достаточно. Для игры нужен 32-битный совместимый процессор, современный 64-битный уже не подойдет. К примеру, на Pentium 4 еще запустится, а на Pentium D или тем более на Intel i5 уже нет. Кроме этого есть еще одна проблема, для DOS нет драйверов, поддерживающих современные звуковые карты. DOS знает только SoundBlaster и подобные, которые были распространены в то время. А если играть в нее без звука, вы очень много потеряете! Поэтому загрузка DOS на реальном PC нам не подходит.

Выходов из ситуации несколько. 
1) Если у вас 32-битный процессор, то можно воспользоваться любой виртуальной машиной, например, WMware или VirtualBox. Здесь используется такая особенность, что при виртуализации иная архитектура не эмулируется и гостевой CPU имеет такой же набор инструкций как реальный хост-процессор.  За счет этого достигается большая производительность. А вот звук как раз будет эмулироваться старой звуковой картой, такой как SB16. Поэтому смело берем образ загрузочной дискеты и запускаем DOS, где предварительно должны быть установлены драйвер звуковой платы и драйвер CD-ROM'а (Подробно создание загрузочной дискеты описывается в отдельной статье) Запускаем игру и наслаждаемся.

2) Но есть более универсальный способ - использовать программные эмуляторы, такие как bochs, qemu или dosbox. Они полностью эмулируют работу большинства процессоров, начиная от 386 до последних x86-64, с поддержкой всех инструкций. Эмулируют всю периферию, память, устройства ввода-вывода, такие как жесткие диски,  cd-rom'ы, аудио, видео и сетевые карты, мышки и др. Могут даже эмулировать симметричные мультипроцессорные системы SMP. Иными словами, эмулируется весь PC целиком. Поэтому не важно какая у вас платформа, вы можете программно сэмулировать любой процессор и все его окружение. Такое  полное соответствие реальному оборудованию крайне важно для тестирования софта, ведь позволяет провести испытания сразу на всех архитектурах, имея только один PC.

Отдельного внимания заслуживает qemu, он может работать в двух режимах: полной эмуляции и  эмуляции пользовательского режима с виртуализацией. Второй поддерживается только в Linux, BSD и Mac OS. Еще дополнительно существует ускоритель KVM, это модуль ядра для поддержки аппаратной виртуализации Intel VT или AMD-V. Но под windows это не работает. Об этих особенностях подробно написано в пользовательской документации qemu, которая присутствует в дистрибутиве в файле qemu-doc.html.

К сожалению, когда речь идет об эмуляции, ее скорость оставляет желать лучшего. Все эмуляторы крайне медлительны. Поскольку эта задача требует больших вычислительных ресурсов. Например, современный Intel Core i7 3.4Ghz может справится с bochs-эмуляцией процессора x86 производительностью только от 85 до 95 MIPS, а Intel Core 2 Duo 2.6Ghz с производительностью от 38 до 43 MIPS. Для справки Pentium 1 (100 MHz) имеет 188 MIPS, 486 (66 MHz) - 54 MIPS, а 386 (33 MHz) - 9.9 MIPS.  

Мой Intel Core i5 2500K смог справится с производительностью около 54 MIPS. Но и этого было не достаточно для  игры the horde, видеоряд подтормаживал, звук проигрывался прерывисто, а поведение мышки запаздывало. В процессе экспериментов я менял значение IPS эмулируемого процессора, пытаясь выяснить какую производетльность требует игра и что из себя может выжать мой хост-процессор. Иногда появлялась только заставка, потом гасла и все зависало.
А вот для плеера mpxplay этой производительности оказалось достаточно, он успевал декодировать mp3 музыку и воспроизводить ее без задержек.

Первым моим подопытным был bochs. Я взял его на официальной странице  sourceforge, там есть исходники и версия для Windows. По умолчанию она скомпилирована с поддержкой cpu-level=6, что соответствует процессорам Pentium 4 и выше. Если вам нужна эмуляция 386, 486 или Pentium, то нужно скомпилировать программу из исходных текстов самостоятельно с соответствующими значениями 3, 4 или 5. Еще есть много других параметров, с полным перечнем можно ознакомится в Руководстве пользователя Bochs в разделе Compiling Bochs.

Вкратце опишу процесс компиляции bochs под Windows, возможно кому то понадобится. С сайта нужно скачать исходники адаптированные для visual studio, они помечены как -msvc-src. Затем извлечь архив и найти файл конфигурации .conf.win32-vcpp. В нем произвести нужные изменения, что-то удалить или добавить, например,  включить поддержку 386 процессора --enable-cpu-level=3 или поддержку реального cd-rom'а --enable-cdrom. После этого нужно запустить скрипт конфигурации. Самое быстрое решение это воспользоваться любой доступной UNIX-платформой, где вы можете запустить shell-скрипт. Если у вас такой возможности нет, то придется ставить Cygwin или MinGW/MSYS. Далее запускаем скрипт
sh .conf.win32-vcpp
После этого вы получите VC++ make-файлы. Теперь осталось открыть проект в студии, файл называется bochs.sln, находится в папке vs2008 и произвести компиляцию в release режиме. 
Я использовал бесплатную версию Microsoft Visual C++ 2008 Express. При компиляции модуля iodev_network у меня возникла одна ошибка. Определение класса bx_netmod_ctl_stub_c было спрятано за #if.. #endif, убрав это условное включение, все скомпилировалось на ура. Еще при компиляции не забудьте отключить антивирусы или добавить исключения.

При запуске bochs берет настройки из файла bochsrc.bxrc, его можно создать , нажав в Bochs Start Menu кнопку Save. А затем менять значения уже в этом файле.


Играться стоит с параметрами cpu: ips=60000000, это значит будет эмулироваться процессор производительностью 60 MIPS, sb16: dmatimer=1000000 здесь задается количество микросекунд в секунде DMA цикла, в нашем случае 1:1.  Этот параметр напрямую зависит от ips, в мануале написано, что хорошее значение 750000. Но если звук подтормаживает, уменьшаем это значение.

Как ни странно, но в qemu игра даже смогла запуститься.
qemu-system-i386
-boot a -fda C:\555\FDBOOT1.IMG
-hda C:\555\hd.img
-cdrom \\.\e:
-soundhw sb16,adlib
-vga std
-cpu pentium
-m 128
Эта команда запуска должна быть одной строкой. Здесь я ее разбил в столбик для удобства чтения . Вводить ее нужно в cmd из каталога qemu. Пробовал разные параметры cpu, vga и др., но каждый раз появлялся черный экран и все зависало. Mpxplay тоже воспроизводил музыку с большими задержками. Так что по моим наблюдениям qemu в windows оказался медленнее bochs или я где то не до конца его настроил. Полный список команд есть в документации в рзделе 3.3 Invocation.

Получается, что ни один из вышеупомянутых эмуляторов не справился с нашей задачей. Остается последний вариант  dosbox. Он специально создавался для запуска старых DOS программ и игр. Основан на исходниках Bochs, но в отличие от него, здесь сразу эмулируется работа компьютера на котором запущена DOS, отсюда и название dosbox. Засчет этого уменьшается число операций эмуляции, возрастает скорость работы и становится возможным играть в старые игры на приемлемой скорости. Еще если на вашем компьюиере x86-совместимый процессор, то в dosbox'е будет работать виртуализация или динамическая трансляция инструкций, если нет - полная эмуляция x86 архитектуры.

Здесь вам даже не надо иметь образа загрузочной дискеты DOS, поскольку сразу эмулируются DOS API функции IO.SYS, MSDOS.SYS, COMMAND.COM, а так же MSCDEX, HIMEM, XMS и EMS. Еще есть эмуляция аппаратного оборудования, например, видеокарт S3 Trio 64, звука Sound Blaster и даже сетевая эмуляция.

Но мне хотелось иметь более аутентичное DOS окружение, которое проверено работает на реальном железе, ну и для чистоты эксперимента сравнить скорость эмуляции с bochs и qemu.
Поэтому мы будем ставить DOS на Dosbox и уже оттуда запускать игру.

Для начала скачаем Windows версию Dosbox с официального сайта. Установим и  перейдем в папку, куда она установилась. Там находим файл конфигурации dosbox.conf.  Он имеет очень подробное описание всех параметров, поэтому специального мануала не потребуется. 
Нас интересует секция [autoexec], здесь мы пропишем монтирование образа жесткого диска и загрузку с образа загрузочной дискеты (создание которой описывается в другой статье).  
[autoexec]
imgmount 2 "C:\c.img" -size 512,63,16,1024 -t hdd -fs none
boot "C:\FDBOOT.IMG"

Здесь сначала задается номер устройства (2 - мастер, 3 - слэйв), после слова size указывается размер кластера, число секторов, головок и цилиндров. Потом тип образа (floppy, iso, hdd) и тип файловой системы (iso, fat и none).  

Но сперва образ диска нужно создать. Для этого используем утилиту bximage из дистрибутива bochs.
После создания диска выводится CHS информация, которая нужна для imgmoun. Как оказалось не следует создавать диск объемом больше 504Mb, поскольку в этом случае число цилиндров при CHS адресации будет больше 1024, а это выходит за рамки режима доступа к дискам в MS DOS и будет отображаться только часть от него. Но выход есть, нужно просто использовать число головок 255 и соответственно пересчитать число цилиндров исходя из нужного размера диска.

После этого нужно загрузить DOS и как обычно утилитой fdisk создать первичный раздел и отформатировать диск format с:

По хорошему нам нужно подключить  cd-rom с игрой. Но лучше создать образ CD-диска и производить все манипуляции с ним. Диск у нас не простой, а мультисессионный, поэтому обычными средствами создать iso-образ не получится. Мультисессионные диски умеет без проблем создавать nero в формате *.nrg. А потом его можно легко конвертировать в iso. Для этого подойдет программка nrg2iso или если у вас есть доступ к unix системе, то командой
dd bs=1k if=image.nrg of=image.iso skip=300
Как оказалось формат nrg отличается от iso только наличием блока 300 Кб  из нулей, поэтому его безболезненно можно удалить.

И так образ диска с игрой мы создали. А если у кого нет, но очень хочется, то можно найти его на rutracker.org или сразу взять сконвертированный iso здесь. Только вот к сожалению в dosbox нет IDE эмуляции cd-rom'ов. Поэтому подключить образ CD-диска командой imgmount, так чтобы его увидела гостевая DOS не получится. Для обхода этого ограничения мы запишем наш образ CD-диска на образ жесткого диска c.img, который мы создали с помощью bximage. А уже в Dos'е смотируем iso-образ с игрой как cd-rom утилитой SHSUCDHD. Это так сказать виртуальный cd-rom под DOS. Для этого в autoexec.bat добавим следующие строчки:
SHSUCDHD /f:c:\horde.iso
shsucdx /d:shsu-cdh
Для препарирования img-образов  лучше всего  использовать программу WinImage.

Вот и все, теперь осталось запустить Dosbox и смотреть как загрузится DOS. После этого нужно перейди на диск D: и запустить установку игры
install c:
На диске C появится новая папка HORDE, а в ней исполняемый файл horde.exe, который и запустит игру.
Ни звук, ни видео, ни игровой процесс не тормозят, все работает быстро! Поэтому можно сделать вывод, что эмуляция x86 архитектуры для запуска DOS-приложений у dosbox самая быстрая.

Еще внесем изменения в конфигурационный файл dosbox для правильной масштабируемости и отрисовки игры в полноэкранном режиме. Переключение в него происходит по нажатию Cttrl+Enter.

[dosbox]
machine=vesa_nolfb
[render]
aspect=true
scaler=advmame2x

Ну и в заключении для удобства пользования создадим конфиг для простого запуска игры средствами dosbox. У него есть еще одна полезная особенность, которую мы будем использовать. Это эмуляция файловой системы, т.е. можно подключить любую папку как диск.
Создадим в установочной папке DOSBox папку Games и скопируем туда образ CD-диска игры horde.iso.
Cделаем эту папку корнем гостевого диска С.
mount c: "C:\Program Files (x86)\DOSBox-0.74\Games"
Смонтируем iso-образ игры как диск D.
imgmount d "C:\Program Files (x86)\DOSBox-0.74\Games\horde.iso" -t iso -fs iso 
Добавим эти строчки в раздел [autoexec] и запустим dosbox. Первый раз нужно запустить установщик игры:
d:
install c
После того как в папке Games появится папка Horde с файлом horde.exe в раздел [autoexec]  можно добавить  запуск самой игры
c:\horde\horde

Теперь все что надо сделать это создать ярлык для запуска dosbox с параметрами
-noconsole -conf "C:\Program Files (x86)\DOSBox-0.74\dosbox.conf"
 
Желаю вам приятной игры! А тем кто видит ее в первый раз, советую попробовать, вы будете приятно удивлены игрой 1994 года!






2 комментария:

  1. Исправьте, нашёл 2 ошибки:

    "Выходов из ситуации несколько.
    1) Если у вас 32-битный процессор, ..........(Подробно создание загрузочной дискеты описывается в отдельной статье) Запускаем игру и наслаждаемся.

    Линк на дос дискету не правильный, стоит .../05/dos.. перехода нет (я качал .../04/dos...)

    2) Но есть более универсальный способ - использовать программные эмуляторы, такие как bochs, qemo -- QEMU"

    ОтветитьУдалить