EnglishРусский Map
SDL (Simple DirectMedia Layer)

Порт SDL3 под DOS (DJGPP)

title
Порт SDL3 под DOS (DJGPP)
type
summary
summary
Нативная поддержка DOS в SDL3 через DJGPP: видео VGA/VESA, звук Sound Blaster, кооперативные потоки через setjmp/longjmp, влито в апреле 2026 года.
parent
sdl
tags
sdl, dos, retro-computing, djgpp, games
created
2026-04-25
updated
2026-04-30
lang
ru
translation_of
sdl3-dos-port
source_updated
2026-04-30
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

В апреле 2026 года в SDL3 появилась нативная поддержка DOS. PR #15377 от Anders Jenbo (AJenbo) - совместная работа с icculus, madebr, glebm, jayschwa и ccawley2011 - влит 2026-04-23: добавлено около 6000 строк в 58 файлах, сборка выполняется с помощью DJGPP через toolchain-файл кросс-компиляции для CMake. Код тщательно протестирован на DevilutionX внутри DOSBox; на реальном железе на момент слияния тестов ещё не было.

Это означает, что игры на SDL3 теперь можно кросс-компилировать в нативные исполняемые файлы под DOS - целевую платформу, которой в современной экосистеме SDL не было. Более ранние попытки сделать порт SDL 1.2 под DOS так и не дошли до паритета возможностей; порт SDL3 получился "достаточно полным" - в нём не хватает только записи звука, нативной реализации SDL_TIME (используется fallback на gettimeofday из DJGPP) и динамической загрузки библиотек (нет SDL_LoadObject).

Что работает

Видео

  • Фреймбуфер VGA
  • Фреймбуфер VESA 1.2+ с аппаратным page-flipping и vsync
  • Цветовые режимы RGB и 8-битный индексированный цвет с программированием палитры VGA DAC
  • Сохранение и восстановление состояния VBE при выходе (чтобы завершение программы не ломало экран пользователю)

Звук

  • Sound Blaster 16 - 16-битный стереозвук до 44.1 кГц
  • Sound Blaster Pro - 8-битный стереозвук до 22 кГц
  • Sound Blaster 2.0 / 1.x - 8-битный монозвук
  • Всё работает через DMA по прерываниям (IRQ) с двойной буферизацией и auto-init (стандартный приём для Sound Blaster, обеспечивающий непрерывное воспроизведение без артефактов)

Ввод

  • Клавиатура PS/2, включая расширенные скан-коды (префикс 0xE0, позволяющий отличать клавиши вроде правого Ctrl)
  • Драйвер мыши INT 33h с опросом чувствительности из самого драйвера
  • Джойстик для Gameport через BIOS INT 15h с автокалибровкой

Многопоточность

  • Кооперативный планировщик на базе setjmp / longjmp с подменой стека - концептуально заимствован из порта SDL3 под PS2
  • Полноценные мьютексы, семафоры, TLS и условные переменные (generic fallback для последних)
  • Точки передачи управления (yield) в цикле обработки событий и функциях задержки сохраняют отзывчивость аудио и других кооперативных потоков

Таймер

  • Нативный таймер на базе PIT через uclock() из DJGPP с разрешением около 1.19 МГц

Файловая система

  • SDL_GetBasePath / SDL_GetPrefPath через searchpath() из DJGPP
  • POSIX-операции с файловой системой в качестве запасного варианта

Инфраструктура сборки

  • Toolchain-файл для CMake: build-scripts/i586-pc-msdosdjgpp.cmake
  • Отдельный CI-job для DJGPP
  • Preseed-кэш для ускоренной конфигурации кросс-сборки

Чего нет

  • Записи звука (только воспроизведение)
  • Нативной реализации SDL_TIME - вместо неё используется POSIX gettimeofday из DJGPP
  • Загрузки разделяемых библиотек (SDL_LoadObject) - в DOS нет реального аналога dlopen, подходящего под модель SDL

Как собрать

cmake -S. -Bbuild-dos \
  -DCMAKE_TOOLCHAIN_FILE=build-scripts/i586-pc-msdosdjgpp.cmake \
  -DCMAKE_BUILD_TYPE=Release
cmake --build build-dos -j$(nproc)

На хосте нужен toolchain DJGPP. В качестве рабочего примера настройки можно использовать CI-job из репозитория SDL.

Почему это важно

SDL де-факто служит shim'ом переносимости для кроссплатформенных игр. Поддержка DOS в SDL3 означает, что современный код игр, написанный под API SDL3, можно скомпилировать в настоящий исполняемый файл DOS, который запустится на машине класса 486 (или, что бывает чаще, в DOSBox'е). В качестве proof-of-concept при разработке использовался DevilutionX - открытый порт Diablo.

С точки зрения архитектуры интереснее всего устроена работа с потоками. В DOS нет вытесняющей многозадачности; всё "ядро" системы сводится к 16-битному однозадачному BIOS и тому, что предоставляет сам рантайм. Порт SDL строит полноценные примитивы многопоточности (мьютексы, семафоры, TLS, condvar'ы) поверх кооперативного планировщика: он переключает стековые кадры через setjmp / longjmp и явные yield-точки, расставленные по циклу событий и функциям задержки. Этого достаточно, чтобы фоновые потоки воспроизведения звука оставались отзывчивыми без вытеснения - именно так и приходилось вручную делать играм эпохи SB16, только теперь это спрятано за переносимым API потоков в SDL.

Связанные страницы

  • sdl - сам проект SDL
  • dosbox-detection-callback-opcode - заметка Snow об обнаружении DOSBox; этот PR в основном тестировался именно в DOSBox'е
  • early-dos-paterson-listings - смежная ретро-новость за апрель 2026 года: публикация Microsoft восстановленных исходников 86-DOS / PC-DOS 1.00 от Тима Патерсона
  • win32-stable-abi - смежная тема "старых бинарных платформ в 2026 году": Wine/Win32 как единственный стабильный ABI в Linux для игр