Порт SDL3 под DOS (DJGPP)
- title
- Порт SDL3 под DOS (DJGPP)
- type
- summary
- summary
- Нативная поддержка DOS в SDL3 через DJGPP: видео VGA/VESA, звук Sound Blaster, кооперативные потоки через setjmp/longjmp, влито в апреле 2026 года.
- sources
- sdl3-dos-port-pr
- 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- вместо неё используется POSIXgettimeofdayиз 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 для игр