Разработка игр под MS-DOS на C с Open Watcom

Практический курс по созданию игрового движка с нуля для DOS, охватывающий графику VGA, работу с памятью и архитектуру игр в стиле RPG и Shoot 'em up. Вы научитесь использовать компилятор Open Watcom v2 и защищенный режим DOS4GW для преодоления ограничений старого железа.

1. Настройка окружения Open Watcom и основы защищенного режима DOS4GW

Настройка окружения Open Watcom и основы защищенного режима DOS4GW

Приветствую, коллега! На дворе 2026 год. Казалось бы, зачем нам MS-DOS, когда существуют нейросети, пишущие код за нас, и фотореалистичные движки? Ответ прост: чтобы создавать шедевры уровня Fallout 1 или Touhou, нужно понимать, как компьютер «думает». DOS — это идеальная песочница, где между вашим кодом и железом нет десятков слоев абстракции.

Вы упомянули, что обучение языку C идет медленно. Это нормально. Изучать C в вакууме скучно. Мы пойдем другим путем: будем изучать язык C через практику создания игр. Каждая строчка кода будет иметь смысл и видимый результат.

Сегодня мы настроим инструменты и разберем фундамент: память, защищенный режим и базовый синтаксис C, необходимый для старта.

Архитектура: почему 16 бит — это мало?

Чтобы написать игру масштаба Fallout, нам нужно много оперативной памяти. Стандартный MS-DOS работает в реальном режиме (Real Mode), который ограничивает нас 16-битными адресами.

Что такое 16 бит? Это размер регистра процессора. Максимальное число, которое в него помещается, вычисляется так:

где — максимальное значение адреса, — основание двоичной системы, а — количество бит.

Это всего 64 Килобайта памяти, доступной напрямую. Чтобы адресовать 1 МБ памяти в старом DOS, использовалась сложная формула сегментации:

где — физический адрес в памяти, — адрес начала блока памяти (сегмента), а — смещение внутри этого блока.

Для новичка это ад. Вы не можете просто создать огромный массив для карты игрового мира.

!Визуальное сравнение сегментированной памяти реального режима и плоской модели памяти защищенного режима.

Решение: Защищенный режим и 32 бита

Мы будем использовать Open Watcom и расширитель DOS4GW. Это переводит процессор в защищенный режим (Protected Mode). Процессор становится 32-битным.

Посчитаем доступную память:

где — адресное пространство в 32-битном режиме.

В этом режиме память — это сплошная линия (Flat Memory Model). Хотите загрузить спрайт размером 5 МБ? Просто выделяете память и работаете. Именно так были написаны Doom и Duke Nukem 3D.

Экспресс-курс C для DOS-игр

Прежде чем писать код, давайте разберем базу языка C, которая критически важна для игр. C — это язык строгой типизации. Это значит, что вы должны четко сказать компьютеру, что именно лежит в ячейке памяти: буква, целое число или дробное.

1. Переменные и типы данных

В 32-битном DOS (Open Watcom) основные типы выглядят так:

char (1 байт): Используется для хранения символов или цвета пикселя (от 0 до 255). В Touhou*-подобных играх это основной тип для графики в 256-цветном режиме. * short (2 байта): Короткое целое число (до 32 767). Экономит память. * int (4 байта): Стандартное целое число (до 2 миллиардов). Используется для координат игрока, здоровья, очков. * float (4 байта): Число с запятой. Нужно для плавной физики движения.

2. Функция main

Любая программа на C начинается с функции main. Это точка входа.

3. Библиотеки

C сам по себе умеет мало. Чтобы вывести текст на экран или считать нажатие клавиши, мы подключаем библиотеки командой #include.

* #include <stdio.h> — Standard Input/Output (ввод-вывод). Нужна для printf. * #include <conio.h> — Console Input/Output. Специфична для DOS, нужна для работы с клавиатурой (getch).

Установка инструментов (Версия 2026)

Нам нужен компилятор и эмулятор.

Шаг 1: Open Watcom v2

  • Скачайте Open Watcom v2 (актуальный форк на GitHub).
  • Установите его в корень диска, например C:\WATCOM. Пути без пробелов — это закон DOS.
  • Убедитесь, что переменные среды добавлены (установщик обычно делает это сам).
  • Шаг 2: DOSBox-Staging

    Используйте DOSBox-Staging. Он лучше эмулирует современное железо и работает стабильнее на новых ОС.

  • Установите DOSBox-Staging.
  • Создайте папку для проектов: C:\DOSGAMES.
  • В конфиге DOSBox (раздел [autoexec]) пропишите:
  • Практика: Пишем код и разбираем синтаксис

    Создайте файл game.c в папке C:\DOSGAMES. Напишем программу, которая покажет мощь 32-битного режима.

    Компиляция и запуск

    Самый важный момент. Мы должны сказать компилятору: «Собери это для 32-битного защищенного режима».

  • Откройте консоль (CMD) в папке с файлом.
  • Введите команду:
  • Разбор команды: * wcl386Watcom Compile and Link для процессора 386 (первый 32-битный процессор Intel). * /l=dos4gLinker option. Мы связываем программу с расширителем DOS4/GW. * game.c — ваш файл.

    После компиляции появится game.exe. Запустите его в DOSBox.

    Вы должны увидеть:

    Если вы видите Size of int: 4 bytes, поздравляю! Вы официально программируете в защищенном режиме. У вас есть доступ ко всей памяти компьютера (в рамках эмулятора), и вы готовы загружать тяжелую графику.

    Что дальше?

    Вы сделали первый шаг. Вы не просто скопировали код, а разобрали базовые типы данных C (int, char) и поняли, как работает память в DOS.

    В следующем уроке мы применим эти знания для работы с указателями — самой сложной, но мощной темой в C. Мы будем использовать указатели, чтобы напрямую менять байты в видеопамяти и рисовать графику, как это делали создатели Doom. Готовьтесь, будет интересно!

    2. Графика VGA: Режим 13h, прямая запись в видеопамять и двойная буферизация

    Графика VGA: Режим 13h, прямая запись в видеопамять и двойная буферизация

    В предыдущей статье мы настроили компилятор Open Watcom и научились собирать простейшие программы для защищенного режима DOS4GW. Теперь пришло время оставить скучный текстовый вывод printf позади. Игры — это визуальное искусство.

    Чтобы создать что-то похожее на Fallout или Touhou, нам нужно научиться управлять каждым пикселем на экране. Мы не будем использовать готовые графические библиотеки. Мы будем писать напрямую в видеопамять. Это даст нам максимальную скорость и полное понимание того, как формируется изображение.

    Сегодня мы разберем легендарный режим VGA Mode 13h — стандарт де-факто для игр начала 90-х, таких как Doom, Wolfenstein 3D и Command & Conquer.

    Что такое Mode 13h?

    Видеоадаптер VGA (Video Graphics Array), выпущенный IBM в 1987 году, поддерживает множество режимов работы. Но самым любимым среди разработчиков игр стал режим под номером 0x13 (в шестнадцатеричной системе), или просто Mode 13h.

    Его характеристики:

  • Разрешение: 320 пикселей по ширине и 200 пикселей по высоте.
  • Цвета: 256 цветов одновременно (из палитры в 262 144 цвета).
  • Организация памяти: Линейная (Packed Pixel).
  • Почему именно 320x200? Давайте посчитаем объем памяти, необходимый для одного кадра. В этом режиме 1 пиксель занимает ровно 1 байт (8 бит), так как он хранит индекс цвета от 0 до 255.

    где — объем памяти одного кадра, — ширина (320), — высота (200), — байт на пиксель (1).

    64 000 байт — это чуть меньше 64 КБ ( байт). Это идеально вписывалось в один сегмент памяти процессора 8086. Именно эта простота адресации сделала Mode 13h королем игровой индустрии на целое десятилетие.

    Инициализация графического режима

    В DOS нет драйверов в современном понимании. Чтобы переключить видеокарту в графический режим, мы должны обратиться к BIOS (Basic Input/Output System). Для этого используется прерывание процессора int 10h.

    В языке C мы можем вызывать прерывания, используя встроенные ассемблерные вставки или специальные функции из библиотеки <i86.h>. Мы будем использовать функцию int386 (так как мы в 32-битном режиме).

    Здесь 0x03 — это стандартный текстовый режим 80x25. Очень важно возвращать его перед выходом из программы, иначе пользователь останется с «сломанным» экраном в низком разрешении.

    Анатомия видеопамяти

    Самое прекрасное в Mode 13h — это то, как видеопамять отображается в адресное пространство процессора. Видеопамять начинается с физического адреса 0xA0000.

    В защищенном режиме DOS4GW этот адрес доступен нам напрямую. Мы можем создать указатель на этот адрес и писать туда данные, как в обычный массив.

    Экран представляет собой одномерный массив байтов. Пиксели идут слева направо, сверху вниз. Сначала заполняется первая строка (0-319), затем сразу за ней идет вторая и так далее.

    [VISUALIZATION: Схема линейной организации видеопамяти VGA. Изображение показывает экран монитора с сеткой пикселей 320x200. Верхний левый пиксель помечен как