Назначение DOSBox

Илья Евсеев


Содержание

Зачем нужен эмулятор DOS?
Первый способ: V86
Достоинства
Недостатки
Реализации VDM
Второй способ: эмуляция
Отличительные особенности DOSBox
Какой должна быть скорость вашего компьютера?
Среда выполнения
Работа с файлами
С чего начать?

Зачем нужен эмулятор DOS?

В первую очередь, из-за игр. Игроки среднего (12-25 лет) возраста его не заметят. Но на одном возрастном фланге находятся старые небритые дядьки, готовые рыдать слезами умиления, запуская ParaTroopers или Accolade Grand Prix Rally, а на другом фланге расположились визжащие от восторга дети, с азартом играющие в Tower или UGH!. Благодаря DOSBox Линукс становится для этих двух категорий такой же полноценной игровой платформой, как Windows.

Если вас не интересует пространное описание прочих способов запуска DOS-приложений, пропустите его и переходите к заключительной части, посвящённой непосредственно DOSBox.

Способов запускать на современных ПК программы, написанные для процессоров Intel 8086 и операционной системы DOS, существует два: аппаратный, основанный на V86, и программная эмуляция.

Первый способ: V86

V86 (Virtual 86) - это специальный режим работы процессора 80386+. Одновременно может быть запущено несколько нормальных и V86-процессов. Основным и почти единственным типом V86-процесса является т.н. VDM, виртуальная DOS-машина:

  • Когда процессор переключается в контекст V86-процесса, внутри его памяти он использует старую схему сегментированной нелинейной адресации, ограниченную 1 мегабайтом.
  • При создании в память VDM помещается нечто, более-менее совместимое с DOS и BIOS (базовая система ввода-вывода) с точки зрения программного интерфейса, и запускается интерпретатор команд COMMAND.COM.
  • Средствами, которые процессор предоставляет для V86, VDM перехватывает обращения DOS-приложений к портам ввода-вывода (к модему, к мыши, к звуковой карте, к видеокарте и т.д.), а также к адресному пространству (в первую очередь, к видеобуферу). Эти обращения обрабатываются не аппаратно, как это происходило бы на настоящем ПК под управлением DOS, а программно, драйверами внешней операционной системы.
  • Часть стандартной функциональности DOS в VDM блокируется и/или оптимизируется. Например, в DOS-сессии Windows приложения не могут обращаться к физическим дискам через прерывание BIOS 13h. В то же время, прерывание DOS 21h не вызывает 13h, а немедленно передаёт управление соответствующим функциям WinAPI. Из-за этого не только повышается скорость работы, но и увеличивается количество памяти для DOS-приложений, так как код прерывания 21h становится компактнее.

Достоинства

Поскольку бОльшая часть работы выполняется аппаратно, V86 (а) предоставляет максимальную скорость выполнения; (б) позволяет упростить и уменьшить программную часть, то есть VDM.

Недостатки

Чем дальше, тем меньше 80x86 в V86-режиме совместим с настоящим 8086. В первую очередь это обусловлено ростом быстродействия. Скорость выполнения инструкций в DOS-сессии зависит от тактовой частоты процессора, и в какой-то момент стала настолько высокой, что многие старые программы перестали работать. Штурмовик в Wings Of Fury не успевает набрать скорость при взлёте и сваливается с палубы авианосца. Cryo Dune на Пентиуме виснет в момент приёма сообщения от императора. Программы, написанные на Паскале, выводят Run-time error 200 in XXXX:XXXX из-за того, что цикл определения длительности одной миллисекунды выполняется быстрее 65535 раз за 55 миллисекунд.

Существующие замедлялки и тормозилки для DOS предназначены для работы на живом компьютере. В виртуальной среде они, как правило, либо бессильны, либо (если дело происходит под Win9x, а тормозилка играет с микросхемой таймера) вредны. Так же не существует эффективных утилит для управления скоростью внутри аппаратной DOS-сессии из внешней ОС. Радует хотя бы наличие патча для исправления пресловутого Run-time error 200.

Если современные процессоры некорректно имитируют старые, то современные VDM во многих ОС не всегда корректно имитируют прочее оборудование. Например, общеизвестно, что NTVDM в Windows NT и 2000 не поддерживает звуковую карту.

Реализации VDM

В Windows 95, 98 и ME используется VDM, основанная на MS-DOS 7.x, и использующая данные из DOS-части Windows, загружающейся до GUI. Это позволяет DOS-приложениям в VDM использовать почти любое оборудование как напрямую, так и через DOS-драйверы в CONFIG.SYS (которые Windows ME стала игнорировать ;-(( ). С одной стороны - гибкость, с другой - потенциальная нестабильность основной системы и опасность повреждений.

NTVDM в Windows NT и 2000 ограничивает доступ к аппаратуре, а из Windows XP изъят вовсе.

DOS-ядро, загружаемое в VDM Windows, является частью ОС. Такой подход имеет ряд достоинств. DOS-приложения имеют прозрачный доступ к файловой системе, включая кэширование, длинные имена, совместное использование файлов и т.д.

Программа для запуска DOS-приложений в Линуксе и FreeBSD называется DosEmu.

VMWare, легендарная система управления виртуальными компьютерами для Windows и Linux, помимо среды выполнения для запуска ОС Windows, Linux и FreeBSD, способна создавать виртуальную среду для запуска DOS.

DOS, загружаемая в DosEmu и VMWare, является почти произвольной системой, никак не зависящей от типа внешней ОС. Внутри DosEmu может быть запущена и MS-DOS, и PC DOS, и Novell DOS, и распространяемая вместе с DosEmu FreeDOS, и даже Windows 3.1.

Впрочем, драйверы для работы с ОЗУ (HIMEM/EMS/XMS/DPMI), CD-приводом (MSCDEX), COM-портом (Fossil), сетью (pktdrv) и т.д. в DosEmu следует использовать не те, которые входят в состав DOS, или написаны для запуска в настоящей DOS, а т.н. helpers - утилиты, которые распространяются с самим DosEmu. Как и в DOS-сессии Windows, вместо обращения к физическому уровню хелперы вызывают код DosEmu, используя прерывание E6 (через него из DOS-сессии можно даже запускать команды Юникса). Иначе говоря, для простоты реализации DosEmu стремится эмулировать не аппаратный интерфейс устройств, а находящийся выше программный интерфейс соответствующих драйверов. Только SoundBlaster приходится имитировать на аппаратном уровне, потому что в DOS для него не был разработан унифицированный программный интерфейс.

В то же время DosEmu использует отдельные части настоящего BIOS'а и VideoBIOS'а, читаемых из ПЗУ. Как их присутствие в VDM сочетается с хелперами DosEmu, и как настоящий BIOS функционирует в виртуальной среде, мне пока разобраться не удалось.

Виртуальная среда VMWare выглядит более завершённо: эмулируется физический уровень (причём типы оборудования на настоящем компьютере и внутри сессии VMWare отличаются), загружается собственный BIOS от VMWare и т.д. Находясь внутри VMWare, понять, что работа происходит в виртуальном окружении, можно только по идентификаторам PCI-устройств.

Диском для DOS может быть как настоящий раздел на физическом диске, так и файл-образ диска или дискеты. Если работа с файлом-образом стандартной DOS-сессией Windows не поддерживается вовсе, то работа с настоящим разделом в Windows намного удобнее. DOSEmu либо захватывает его монопольно до конца работы, либо использует безнадёжно убогий интерфейс к функциям внешней ОС. В частности, в первом случае автономная DOS видит длинные имена файлов только со специальным драйвером, во втором - не видит никак.

DOS-сессия Win9x предоставляет приложениям DPMI версии 0.9, но, в отличие от DOSEmu (где так же доступен DPMI 0.9), не мешает им при необходимости использовать свой собственный DPMI-менеджер. Например, fMSX/DOS использует DOS-расширитель GO32, DPMI-менеджер которого поддерживает спецификацию DPMI 1.0. В итоге fMSX/DOS нормально запускается под Win95, но отказывается запускаться в DosEmu.

Второй способ: эмуляция

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

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

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

По этой причине до недавних пор распространение имели только игровые эмуляторы 8-битных компьютеров наподобие Spectrum. Тем не менее, существует и успешно развивается программный эмулятор архитектур 8086/.../PentiumPro, который называется Bochs (произносится как Бокс). Кроме DOS, в нём также способны запускаться Linux, Minix, Windows 95 и Windows NT 4.

Bochs работает невероятно медленно. Если верить авторам, самый оптимизированный вариант на PII-400 показывает 1.5MIPS, то есть полтора миллиона однотактовых операций в секунду. Это втрое медленнее IBM PC XT c процессором 8088, тактовая частота которого составляла 4.77MHz.

Несмотря на медлительность, у программных эмуляторов есть несколько достоинств:

  • эмулятор способен работать на любой платформе, а не только на той, которая имеет аппаратную совместимость с запускаемой программой;
  • эмулятор позволяет создать запускаемой программе такую среду выполнения, которую программа будет не в состоянии отличить от настоящего ПК;
  • ход выполнения программы теоретически может быть проконтролирован с максимально возможной точностью;
  • исходные тексты эмулятора, в отличие от чертежей процессора, открыты для всех желающих и легче поддаются исправлению.

Даже DosEmu попытался обзавестись поддержкой эмулирования в дополнение к V86, но последние следы подобных усилий датированы ноябрём 2001 года. Детали смотрите в README.cpuemu.

Отличительные особенности DOSBox

DOSBox основан на исходных текстах Bochs, но эмулирует не IBM PC вообще, а IBM PC, на котором запущена DOS. Что это означает? Это означает, что наткнувшись в коде исполняемой программы на последовательность байтов с 16-ричными номерами CD 21, DOSBox не сохраняет в стеке значение регистра флагов и не передаёт управление на адрес, считанный из ячейки памяти с адресом 0000:0084, а немедленно вызывает соответствующую функцию Юникса. Например, если в регистр AH перед этим было записано число 40h, то DOSBox вызовет функцию write.

Таким образом, уменьшается количество эмулируемого кода, за счёт чего вырастает общая скорость работы. В дополнение к этому, увеличивается количество памяти, доступного DOS-приложению в VDM. Аналогичное решение, как уже говорилось, используется и в DOS-сессии Windows, но там программный код выполняется не эмулятором, а центральным процессором в V86-режиме.

Вывод 1: прирост быстродействия по сравнению с Bochs является для DOSBox принципиальным, потому что становится возможным использовать его для запуска старых игр с нормальной скоростью на распространённых в данное время ПК.

Вывод 2: эмуляция выполняемого кода по сравнению с V86-based VDM является для DOSBox принципиальной, потому что делает возможным запуск программ, с которыми современные процессоры перестали быть совместимыми даже в V86-режиме.

Какой должна быть скорость вашего компьютера?

В документации сказано про PII-400 для эмуляции AT286-12, что, в общем, соответствует действительности. PII-300 выполняет Wings of Fury и Dune с чувствуемой, но терпимой задержкой. Сравните это с эмулятором Ямахи который требовал под DOS32 всего лишь 486DX-100 (или даже 486DX-66!).

Эмуляция более современных игр потребовала бы ещё более быстрого процессора, но сейчас вряд ли возможна в принципе, так как последние игры эпохи DOS в подавляющем большинстве использовали DPMI, а его поддержка в DOSBox пока только появляется.

Среда выполнения

То, что с точки зрения запускаемой в DOSBox программы является DOS'ом и BIOS'ом, на самом деле таковым не является. DOS имитируется неплохо, причём как базовая функциональность IO.SYS/MSDOS.SYS/COMMAND.COM, так и дополнительные расширения вроде драйвера мыши, MSCDEX, HIMEM, XMS и EMS. В BIOS'е имитируются в первую очередь int 10h (управление видеокартой) и int 16h (клавиатура), но не int 13h (физические диски). Это означает, что Volcov Commander, MultiEdit и Turbo Pascal в DOS-сессии запустить можно, а Norton Disk Editor - нет. Во всех случаях код-обработчик находится за пределами DOS-сессии, то есть выполняется не внутри созданной эмулятором среды, а как его собственная составная часть.

Из оборудования эмулируются видео SVGA и звук Sound Blaster. В версии 0.61 появилась эмуляция модема через TCP-сокет (чем-то подобным в DOS занимался TCPFossil), но представить себе маньяка, запускающего в DOS-эмуляторе BBS Maximus или T-Mail для доступа через Telnet, можно не без труда.

Состав предоставляемых эмулятором программных и аппаратных интерфейсов обуславливается следующим принципом: добиться поддержки как можно большего количества не имеющих замены DOS-приложений (в первую очередь, игр) на единицу трудозатрат.

Работа с файлами

Каталоги внешней файловой системы отображаются внутрь DOS-сессии в виде логических дисков. Специальным диском является диск Z:, на котором находятся утилиты самого DOSBox'a. Для подключения внешних каталогов к логическим дискам в командной строке DOS-сессии используется команда mount, например:

mount d /usr/games/dos
dir d:\*.exe

Если прямо при запуске DOSBox в аргументах его командной строки указан путь к исполняемому файлу (BAT, COM, EXE) или каталогу, то указанный каталог или каталог, в котором расположена программа, становится в DOS-сессии диском C: автоматически:

dosbox /mnt/dosdrive/command.com
dosbox /usr/games/dos/dune/dune.bat

Shell, или командный интерпретатор запускается в DOS-сессии, если аргументы командной строки DOSBox не содержат имени запускаемой программы, а также после завершения программы, если аргументы не содержат ключа "-c exit". Shell имитирует стандартный COMMAND.COM с некоторыми дополнениями, список которых выводится в DOS-сессии командами help и intro.

С чего начать?

На моём сайте находится собранный для ALTLinux Master 2.2 RPM-пакет с DOSBox'ом, а также несколько игр.

Обнаруженные глюки:

  • под KDE игнорируются служебные клавиши Ctrl+Fn;
  • слишком старые игры, написанные на Ассемблере и работающие с периферией напрямую, эмулируются либо криво (SpaceCommanders), либо никак (ParaTroopers).

Для установки игр написан небольшой сценарий dosbox-install, который скачивает архив, распаковывает его в каталог, находит исполняемый файл (возможны проблемы, если их в каталоге несколько, поэтому может потребоваться вторичный запуск сценария с явно указанным именем нужного исполняемого файла) и создаёт иконку для запуска в Главном меню.

Пример 1. Варианты запуска dosbox-install

# Скачать, распаковать, найти исполняемый файл, добавить в меню
dosbox-install http://ilya-evseev.narod.ru/games/tower.zip

# Распаковать, найти исполняемый файл, добавить в меню
dosbox-install /tmp/ugh.zip

# Найти исполняемый файл и добавить его запуск в Главное меню
dosbox-install /mnt/windows/Games/DefenderOfTheCrown/

# Добавить исполняемый файл в Главное меню.
# Для LodeRunner'a DOSBox на гигагерцевом Атлоне
# требуется затормозить нажатиями Ctrl+F11 примерно в 10 раз.
dosbox-install /mnt/windows/Games/lr/LR.COM

# Явно указать исполняемый файл и добавить его запуск
# из указанного каталога в Главное меню, который и будет диском C:
# вместо каталога, в котором находится файл-аргумент ключа --executable.
dosbox-install --executable SIMFILES/SIM.EXE /mnt/windows/Games/SimCity/

# То же самое
dosbox-install --basedir /mnt/windows/Games/SimCity/ SIMFILES/SIM.EXE

# То же самое, на диском C: будет каталог с SIM.EXE
# Без ключа --project-title иконка в меню называлась бы "SIMFILES".
dosbox-install --project SimCity /mnt/windows/Games/SimCity/SIMFILES/SIM.EXE

# Удалить пункты из Главного меню и каталоги с диска (если создавались)
dosbox-install --remove tower ugh para

В общем, начинать вспоминать юность можно практически без предисловий. Существует лишь небольшая вероятность, что для начала потребуется подправить значение cycles в файле /etc/dosbox/dosbox.conf*.

Каталоги в /usr/games/dosgames, куда распаковываются архивы, открыты для записи для группы [dosgamer]. Занесите себя в неё, прежде чем запускать распакованную игру, которая что-либо пишет в файлы. Например, LodeRunner не запустится, если не сможет открыть на запись LR.RES.

На этом пока всё!



Хостинг от uCoz