О разработке 16-битных игр для реального режима процессора x86 и операционной системы DOS [запись на e-mail рассылку]

+107
NTFSв блоге IT Pony!20 февраля 2026, 13:34
Собственно, обещанная ранее статья про ретрокодинг с кросс-компиляторами. Она на 100% готова, к сожалению, на сопроводительный код ушло очень много сил, даже простые игры-прототипы — занимают время при создании. И тем не менее, это хороший, годный материал, который жалко выкидывать в корзину, так что публикую здесь, бесплатно, без SMS и регистраций. Возможно, кому-то будет интересно, или даже полезно.

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

Для начала — естественные ограничения реального режима процессора:
  1. процессор адресует только 1Мб памяти
  2. модель памяти — сегментная (адрес памяти — это пара «сегмент: смещение»)
Соответственно, в рамках поставленной задачи мы не будем использовать расширители памяти вроде DOS4GW или CWSDPMI, а также при создании ассемблерного кода и вставок, избегать использования 32-битных регистров, ограничиваясь 16-битными регистрами.
Наши возможности для разработки:
  1. Набор прерываний DOS и BIOS для работы с экраном и клавиатурой
  2. 640 Кб оперативной памяти (на практике меньше), разбитые на сегменты
  3. Создание приложения в формате EXE (модели памяти Small/Medium) или COM (модель памяти Tiny)
  4. Использование системного динамика для создания звуковых эффектов
  5. Встроенные видеорежимы BIOS, а также стандартный текстовый режим, который загружается при старте DOS или DOSBox
  6. Наконец, использование системного таймера, работающего на частоте 18.25 Гц, применение которого позволяет сделать программы независящими от частоты процессора.

Зачем это может понадобиться?
Первый очевидный ответ — забавы ради. Некоторые из нас начинали разрабатывать программы и игры ещё под MS-DOS, всегда приятно вспомнить былое.
Второе — тренировка и очистка разума. Легко работать, когда в твоём распоряжении 64 гигабайта оперативки, 16 ядер процессора, независимая звуковая система и возможность грузить текстуры в FullHD. Когда доступна видеопамять 320 на 200 пикселей, оперативная память заканчивается на десятой текстуре, звук нужно извлекать путем включения и выключения динамика на заданной частоте, а события отслеживаются по таймеру на два десятка герц — задача становится немного иной. Постоянно так жить невозможно, но изредка — может даже оказаться полезным.
Ну и наконец, эстетическая компонента. Игры, созданные с использованием технологий тридцатилетней давности — выглядят по-особому. Да, в настоящее время существуют движки, которые позволяют воссоздать этот вид на современных средах разработки, но оригинальные методы всё ещё имеют ценность, на любителя.



Теперь о кросс-компиляторах. В чем сложность классического программирования непосредственно для таких систем в «железе» или эмуляторе? Просто очень неудобно работать. У тебя в лучшем случае 640 Кб памяти для запуска IDE или набора текста, и еще нужно запускать саму игру, которая тоже занимает память. В случае работы на железе — на это железо нужно как-то перекидывать данные, равно как и сохранять с него. В случае использования эмуляторов — тот же DOSBox может работать с каталогами хост-машины, монтируя их внутри себя, но делает это не очень хорошо, из-за чего бывает рассинхронизация файлов (справедливости ради, DOSBox предназначен для запуска игр, и делает это отлично, а остальные способы его использования — уже по как получится).
Наконец, все прекрасные современные средства разработки, включая системы контроля версий и редакторы с подсветкой синтаксиса, поиском и дополнением ввода — доступны только на современных ОС. Работать без мультизадачности в текстовом окне 80 на 25 – это ностальгично, но очень грустно.

Здесь есть два решения:
  1. Использование кросс-компиляторов — это компиляторы, которые умеют генерировать код для 16-битного реального режима процессора (с сегментами, ближними и дальними указателями, несколько моделей памяти), при этом сами запускаются на современной ОС (Windows, Linux, MacOS). В этом случае, мы имеет всю мощь современной станции разработки, и на выходе получаем файл в формате COM или EXE, который уже можно запустить в эмуляторе или на железе.
  2. Использование систем сборки, которые позволяют запустить 16-битную среду выполнения внутри себя, например, используя DOSBox внутри образа для Docker, и опять же на выходе получить готовый файл. В случае DOSBox можно обойтись без контейнеров, используя просто настроенный autoexec, который будет при старте монтировать диск, запускать компилятор, создавать исполнимый файл и отключаться.
В данной статье почти вся информация касается именно первого случая, за исключением последней программы, где вместо кросс-компилятора используется нативный компилятор для DOS, и там разработка велась внутри эмулятора.

Последний немаловажный фактор — лицензионная чистота используемых средств. Я стараюсь максимально ограничивать в своей работе, даже на уровне некоммерческой разработки, тех продуктов, которые не были разрешены к свободному использованию или не были мною приобретены. Таким образом, при выборе будем стараться использовать те средства разработки, для которых явно указана возможность их применения в некоммерческих личных целях, или которые как минимум являются свободными к распространению по модели «заплати, если понравилось».

Для тестирования и разработки были использованы эмуляторы DOSBox и 86Box, а также рабочие компьютеры с процессорами 386 и 486, но с минимизацией обращений к специальных возможностям этих процессоров.

Важно отметить, что ни один из проектов, представленных ниже, не является ни полноценной завершенной игрой, ни даже примером хорошего, качественного кода. Любители игр заметят, что процесс прохождения отсутствует, можно либо бесконечно играть, либо проиграть, а также слабый баланс самого процесса. Опытные разработчики — найдут слабые места в игре на Си, чрезмерное использование lodsb вместо адресации для игры на ассемблере, неважную структуру кода на Бейсике, и не вполне чистую архитектуру кода для FreePascal.
Также внимательные читатели могут заметить, что некоторые фрагменты ассемблерных вставок повторяются из проекта в проект и было бы замечательно оформить их в библиотеку, чего сейчас нет.
Эти проекты, за исключением, возможно, игры «Водопроводчик» — исключительно демонстрация концепции, основа, которая показывает, как реализуется код, игра и что нужно для её сборки.

Итак, приступим.
Наш номер один — кросс-компилятор FreePascalCompiler, позволяющий создавать полноценные приложения для реального режима процессора, включая COM-файлы. Для линковки файлов, ему нужен установленный линкер OpenWatcom, но это небольшой минус, не мешающий работе.
Сайт компилятора: www.freepascal.org/
Руководство по использованию кросс-компилятора: wiki.freepascal.org/DOS

В данном компиляторе даже в режиме кросс-компиляции доступна вся мощь современного ObjectPascal, включая полноценные классы, длинные строки, исключения, обобщенные типы и даже интерфейсы.

ВАЖНО: FreePascal имеет как кросс-компилятор для реального режима, так и непосредственно среду разработки и компилятор для DOS, но с использованием защищенного режима и расширителя памяти GO32V2. Они похожи, но мы используем именно кросс-компилятор, который позволяет создавать приложения без расширителя памяти.

С использованием данного кросс-компилятора, когда-то был разработан проект игры «Водопроводчик» для конкурса 16-битных COM-игр.
Страница проекта: tav-developer.itch.io/water-way-game-16-bit
Репозиторий проекта: github.com/tereshenkovav/WaterWayGame16bit



Возможности и используемые технологии:
  • Полностью объектно-ориентированная программа с классами и архитектурой.
  • Видеорежим 13 (320 на 200 пикселей, палитра на 256 цветов)
  • Ассемблерные вставки для реализации работы с видеопамятью, звуком, клавиатурой и таймером
  • Звук на основе динамика без блокировки игры
  • Сборка бинарника как COM

Вывод графических примитивов полностью реализован на ассемблерных вставках, с их помощью также опрашивается клавиатура и обрабатывается системный таймер, чтобы скорость игры не зависела от частоты процессора. С целью уменьшения размера исполняемого кода, программа не использует ни один модуль из RTL, кроме System.

Команда сборки исходников под Windows выглядит так:

ppcross8086 -Tmsdos -WmTiny -Wtcom -Mobjfpc -Rintel -FE../bin -FUlib/i286-dos16 -FuC:\fpc\3.0.4-DOS\units\msdos\80286-tiny\rtl -CX -XX -Sg ../src/WaterWay.pp

где мы указываем целевую платформу, модель памяти, формат выходного файла, синтаксис ассемблера, и пути к библиотекам кросс-компилятора, а также каталоги для объектных файлов и выходного файла.

Проект проверен на компьютерах 386, 486, эмуляторах DOSBox и 86Box.

Наш номер два — Digital Mars C/C++ Compiler, позволяющий создавать полноценные приложения для реального режима процессора, включая COM-файлы. Поддерживает как чистый C++, так и С++ с классами и стандартной библиотекой. Как и предыдущий компилятор, позволяет ассемблерные вставки.
Для работы кросс-компилятора нужно сначала скачать сам компилятор для Win32, а потом библиотеки для DOS.

Сайт компилятора: www.digitalmars.com/

С использованием данного кросс-компилятора, портировал одну свою игру-прототип, реализованную исходно на GCC для советского компьютера БК-0010. Страницы и репозитория у проекта пока нет, потому что игра носит демонстрационный, а не завершенный характер. Суть игры — уклонение от набегающих монстров, собирание бонусов очков, скорости и защиты от врагов, цель — продержаться как можно дольше, набирая очки за бонусы и уничтожение врагов в режиме защиты.



Ссылка на загрузку бинарника и исходников проекта:
disk.yandex.ru/d/gRcduK1XuWnBng

Возможности и используемые технологии:
  • Используем чистый C код без объектов и стандартной библиотеки (почти).
  • Видеорежим 13 (320 на 200 пикселей, палитра на 256 цветов), но работаем только с выводом псевдографики
  • Ассемблерные вставки для реализации работы с видеопамятью, звуком, клавиатурой и таймером
  • Перехват прерывания 09 для обработки удержания клавиш, а не только нажатия (для этого используем функции работы с прерываниями из библиотеки компилятора)
  • Звук на основе динамика с блокировкой игры
  • Сборка бинарника как EXE с моделью памяти Medium

Команда сборки исходников под Windows выглядит так:

dmc.exe -mmd survive.c gameapi.c

где в командной строке указываем собирать проект для DOS с моделью памяти Medium.

Проект проверен на компьютерах 386, 486, эмуляторах DOSBox и 86Box. В данной реализации при запуске везде, кроме DOSBox – перехват клавиатуры работает не полностью корректно, скорее всего, не возвращая управление предыдущему обработчику, отчего переполняется буфер. Починить это можно путем реализации собственных функций сохранения и установки прерываний, не полагаясь на системную библиотеку.

Номер три — это The Netwide Assembler (NASM), компилятор ассемблера, который позволяет собирать программы для реального режима процессора.
Это тоже полноценный кросс-компилятор, включен в статью потому, что нужно затронуть максимум возможных языков программирования из доступных по условиям задачи.
Сайт компилятора: nasm.us/

С использованием данного кросс-компилятора, разработал очень примитивную, но всё же работающую игру, в жанре стрелялки из пушки по пролетающим объектам разных типов. В качестве изюминки, пушка имеет три ствола, а также вся реализация выполнена в псевдографике, с использованием драйвера ANSI.SYS, практически без использования прерываний BIOS (исключение — установка позиции курсора и конечно, работа с таймером). Страницы и репозитория у проекта, как и у предыдущего, пока нет, потому что игра аналогично носит демонстрационный, а не завершенный характер (нет условия победы или поражения, только подсчет удачных выстрелов).



Ссылка на загрузку бинарника и исходников проекта:
disk.yandex.ru/d/6BFitvsS0VUv7g

Возможности и используемые технологии:
  • Используем ассемблер, без дополнительных библиотек и макросов
  • Текстовый режим 3 (80 на 25 символов, 16 цветов)
  • Для установки цвета и частично позиций вывода используем драйвер ANSI.SYS
  • Вывод строк через прерывание 21 DOS
  • Таймер для контроля частоты обновления игры
  • Сборка бинарника как COM с моделью памяти Tiny

Команда сборки исходников под Windows выглядит так:

nasm.exe -o rocket16.com rocket16.asm

где в командной строке указываем собирать проект как COM

Проект проверен на компьютерах 386, 486, эмуляторах DOSBox и 86Box. При запуске везде, кроме DOSBox, требуется установленный драйвер ANSI.SYS. DOSBox же его эмулирует по умолчанию.

Итак, обзор практически завершен. Мы использовали Паскаль, Си, Ассембер, всё на основе кросс-компиляторов, свободных к загрузке и применению. Игры работают, хотя по уму, все, кроме Водопроводчика, нужно улучшать.
Чего не хватает? Не хватает Бейсика. Это один из моих любимых языков программирования, на нём можно быстро и легко писать игры, а если использовать ассемблерные вставки, то они даже буду хорошо работать. Но здесь меня ожидало расстройство — для моих целей, компиляторов Бейсика не нашлось. Есть FreeBasic, он хорош и позволяет создавать бинарники для DOS, но использует расширитель памяти. Есть QuickBasic, но это, во-первых, не кросс-компилятор, а во-вторых, не является свободным для использования (его не продают в настоящее время, но и объявлений о допустимости применения в личных некоммерческих целях, не было).

И тем не менее, для полноты обзора, я нашел компилятор, который удовлетворяет хотя бы одному условию из двух. Это Its Almost Basic – ASIC, компилятор собственного диалекта Бейсика, распространяемый как Shareware-софт. Сайта разработчика я не нашел, но он включен в репозиторий FreeDOS:
clasqm.github.io/freedos-repo/zip/asic.zip

Компилятор, к сожалению, не такой мощный, как QuickBasic, на исходные коды наложено множество ограничений, в частности, невозможно использовать логические операции в условиях, нельзя делать вычисления сложнее одной операции справа от присваивания, нет структур и динамических массивов и еще множество мелких неудобств. С другой стороны, он включает в себя мощную библиотеку для работы с графикой и позволяет линковать ассемблерные модули OBJ, что в сочетании с ассемблером NASM позволит его существенно расширить. Намного лучше, чем ничего. Так же, как и прочие компиляторы, позволяет создавать исполнимые файлы COM и EXE

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



Ссылка на загрузку бинарника и исходников проекта:
disk.yandex.ru/d/EXkHmVKUgkqSKg

Возможности и используемые технологии:
  • Используем ассемблерный модуль только для быстрой процедуры очистки экрана
  • Графический режим 7 (320 на 200 пикселей, 16 цветов, две экранные страницы)
  • Для рисования графических примитивов используем средства библиотеки самого компилятора
  • Используем таймер для контроля частоты обновления игры
  • Рисуем на одной экранной странице, выводим на другую, избегая неприятных эффектов перерисовки
  • Сборка бинарника как EXE с моделью памяти Small
Исходники собираются под DOS или DOSBox. Команда сборки исходников: сначала собираем ассемблерный модуль, указывая, что нужно получить OBJ-файл:

nasm.exe -f obj helpers.asm

Потом самим компилятором, указывая ему формат бинарной сборки, поддержку длинных целых, библиотеку ASI5LIB для работы с графикой и ранее собранный ассемблерный модуль HELPERS

ASICC GAME.ASI B/OBJ E LIB=ASI5LIB OBJ=HELPERS LNK=C:\ASIC

Проект проверен на компьютерах 386, 486, эмуляторах DOSBox и 86Box. Работает хорошо, проект почти без недочетов, за исключением, разумеется, незавершенности именно как игры и ограничений кода, вызванных особенностями диалекта Бейсика.

На этом всё. Для удобства тех, кто просто хочет опробовать прототипы игр, без сборки исходников и настройки эмуляторов, я сделал отдельный архив, в который включил настроенный DOSBox и все исполняемые файлы из статьи. Запускать файл DOSBox.exe, потом вводить команду game1, game2, game3 или game4, для запуска конкретной игры из статьи.
Ссылка на загрузку:
disk.yandex.ru/d/dorde8pRZbn5lQ

PS: По завершении статьи, а особенно примеров к ней, я решил, что целесообразно делиться подобными наработками на регулярной основе, но не захламляя оффтопиком Табун. Так что вот вам новый канал по тематике ретрокодинга, кого это интересует — подписываемся. Часто постить не обещаю, но раз в неделю-две точно полезная информация будет поступать.
t.me/gamedev16bit

PPS: По просьбам, добавил репозиторий со всеми материалами статьи + несколько дополнений по OpenWatcom и Ack.
github.com/tereshenkovav/16bit_GameLabs

32 комментария

И нет, посылы «иди с этим на хабр» не помогут, потому что заказчик сказал «публикуй где хочешь, но не на продажу и не на хабр». Желания клиента надо уважать :-)
NTFS
+3
Класс! Вот это точно в тему, в отличие от моих баек у костра! :)
MollyBuckshot
0
Твоих баек больше не будет?
Almira
0
Мне пояснили, что это нарушает правила: «не несут полезной нагрузки с точки зрения многих Табунчан и поэтому воспринимаются как спам.»
MollyBuckshot
0
Жаль
Almira
0
А был какой-то опрос на эту тему?
Shadorn
0
предполагаю, пара самых громких человек решили за всех
zpn_1999
0
Как вариант, попробуй проработку, больше информации, стиль, что-то еще.
У меня тоже немало постов весьма далеких от понной тематики, и они в плюсах, небольших, но в плюсах.
NTFS
0
Ооо, прикольно, обязательно вечером почитаю ❤️
Shpik
+1
По многочисленным двухкратным просьбам таки выложил всё в отдельный репозиторий, просто чтобы можно было смотреть на исходники без всей этой возни с архивом. Конечно, четко маркировал репу как лабораторную.

github.com/tereshenkovav/16bit_GameLabs

Выложены все три прототипа игр, а также примеры по OpenWatcom и Ack. Бинарные сборки — в релизах, как положено, в архивах для DOS и с уже прикрученным DOSBox для быстрого запуска в Windows.
Остальное уже строго в канале будет, на этом оффтопить прекращаю :-)
NTFS
+1
Ооо, какие прикольные штуки я вижу =)

У тебя в лучшем случае 640 Кб памяти для запуска IDE
Строго говоря, емнип, большинство нормальных IDE использовали DPMI (например, тот же Borland C++), так что уже на 286 с 4 МБ оперативки это не было особенной проблемой)
320 на 200 пикселей, палитра на 256 цветов
Кстати, а так ли часто нужно 256 цветов? Судя по скрину, там можно было бы обойтись 16 цветами, но зато апнуть разрешение до 640х480 на VGA или 640x350 на EGA (не говоря уж о том, что на EGA нет режима с 256 цветами...)
как чистый C++, так и С++ с классами
Вероятно, ты в первом случае имел в виду «С», а не «С++»? Потому что в чистом С++ уже и так есть классы)
перехват клавиатуры работает не полностью корректно, скорее всего, не возвращая управление предыдущему обработчику, отчего переполняется буфер
У меня есть подозрение, что у `newKeyHandler()` должен быть спецификатор `__interrupt` или что-то такое, и на старый обработчик надо в конце делать long jmp, или, если делать call, то нужно перед этим в стек класть флаги, потому что обработчик заканчивается инструкцией `iret`, а не `ret`. Ещё одна возможная догадка — где-то у тебя ломаются регистры.
Вообще я бы предложил посмотреть дизассемблированный код этой функции и чекнуть, всё ли там норм, нет ли где лишних push/pop (особенно в прологе/эпилоге) или портящихся регистров. Собственно, именно поэтому основной каркас обработчика лучше писать на ассемблере, в нём делать pusha/popa (если у нас 286 и выше), и в них заворачивать уже обычный call на сишную функцию вместе с нужной подготовкой стека. Ну и в конце longjmp на предыдущий обработчик, да.
с использованием драйвера ANSI.SYS, практически без использования прерываний BIOS (исключение — установка позиции курсора
Кстати, для установки курсора же тоже есть ESC-последовательности, можно было ими делать. А вообще, ANSI.SYS тормозной, можно, наоборот, вывод символов с атрибутами тоже делать прерыванием 0х10, или вообще прямой записью в видеопамять (если дисплей не EGA).
репозитория у проекта, как и у предыдущего, пока нет, потому что игра аналогично носит демонстрационный, а не завершенный характер
Кстати, как раз-таки в репе удобно смотреть код для незавершённых проектов и развивать его, так что скорее наоборот, именно в таком случае стоит в репу всё класть) Так что спасибо, что потом-таки всё же положил)
Рисуем на одной экранной странице, выводим на другую, избегая неприятных эффектов перерисовки
Ооо, помню, в своё время намучался с этим, когда не знал о page switching и double buffering =)
makise_homura
+1
Кстати, а так ли часто нужно 256 цветов?

Это наиболее приятный глазу и удобный режим для кодирования, один байт — один пиксель, и если один раз сделать загрузчик ресурсов с автозаполнением палитры, то выглядит почти как нормальная графика, а не черточки ярко-зеленые и бледно-желтые.

Вероятно, ты в первом случае имел в виду «С», а не «С++»?

Да, конечно, опечатался.

Собственно, именно поэтому основной каркас обработчика лучше писать на ассемблере

В проекте на QuickBasic + NASM, где Трикси алмазы лутает, я так и сделал, там 100% кода перехватчика на ассемблере и оно работает отлично. А тут решил воспользоваться готовым RTL, но видимо, его тоже нужно с умом применить.

наоборот, вывод символов с атрибутами тоже делать прерыванием 0х10

Тут я принципиально хотел сделать чисто на ANSI.SYS, без вызовов BIOS. Да, установка курсора в ESC-символах есть, ей пользовался для статики, а для динамической установки по переменным, еще нужно добавить IntToStr, что лишний вызов. Приведу к одному виду, само собой.

page switching

В моём любимом SCREEN 13 его нет, пришлось целую библиотеку с буферами вне экрана пилить.
NTFS
+1
один байт — один пиксель
Хм, аргумент (если ты с видеопамятью напрямую работаешь), да.
В моём любимом SCREEN 13 его нет
VGA можно переключить в планарный режим, няз, и тогда там будут 4 страницы) Но да, подход «один байт — один пиксель» тогда работать не будет(
makise_homura
0
если ты с видеопамятью напрямую работаешь

Ну а иначе никак — профессиональные библиотеки графические мне недоступны, они продавались, а я, как следует из поста, предпочитаю бесплатные или официально отданные сообществу продукты. Работать же через LINE и PSET, равно как их паскалевские аналоги, вообще не вариант.
Так что да, создаём буфер, рисуем в нём и потом его через rep movsw кидаем на $A4000

VGA можно переключить в планарный режим

Пока не разбирался с этим, дел много, а времени мало. 100 баксов за статью это хорошо, но чаще это всё делается из искусства.
NTFS
0
Так что да, создаём буфер, рисуем в нём и потом его через rep movsw кидаем на $A4000
Стоп, а зачем? Почему нельзя сразу сделать указатель на эту область и работать прямо в ней?
makise_homura
0
Почему нельзя сразу сделать указатель на эту область и работать прямо в ней?

Мерцание же будет, если рисовать напрямую в видеопамяти. Для примитивов или спрайтов поверх однородного фона еще не так критичино, а если спрайты накладываются поверх других спрайтов, то без второго буфера никуда.
32 тысячи операций movsw на удивление быстро выполняются, так что на процессорах 386 и 486 не заметно, проверить на более простых еще не было возможно, код слишком много всего от 386 использует.
NTFS (ред.)
0
Мерцание же будет, если рисовать напрямую в видеопамяти.
Мне казалось, видюхи ещё с EGA умели страницы хранить в разных банках и пока ты пишешь в одну страницу, CRTC спокойно читает другую без блокировок. А потом появилась и память с независимым DIN/DOUT…
makise_homura
0
Так и есть для всех режимов, кроме 13. Там одна память и одна страница, все 64Кб на 64Кб экрана. Потому в этот режим мало чего писали в своё время, чаще уже брали расширители памяти и VESA.
Но мои задачи попроще.
NTFS
+1
А, ты про стандартный режим. Ну тогда ладно, я просто к тому, что в планарном режиме уже можно было бы работать с аппаратной буферизацией, рисуя прямо в неактивной странице видеопамяти и потом делая page flip (тот же DOOM так делал, причём подгадывал момент флипа к прерыванию по сигналу кадровой развёртки, чтобы не было тиринга).
Вот здесь достаточно подробно с примерами написано, может, тебе пригодится. Там не так всё сложно, как кажется =)
makise_homura
0
Там не так всё сложно, как кажется =)

Всё упирается во время, есть забава с 16 бит системами — нет работы :-)
Почитаю, при случае, спасибо.
NTFS (ред.)
+1
VGA можно переключить в планарный режим
Пока не разбирался с этим, дел много, а времени мало. 100 баксов за статью это хорошо, но чаще это всё делается из искусства.

Зато доступны нестандартные VGA режимы вплоть до 360х480 256 цветов
evenlazier
+1
Насколько я понял, это уже начинаются игры с видеокартой — если сидя на int 10h ты худо-бедно уверен в запуске, то иные режимы уже могут и не запуститься. То есть, вайб чистого DOS на чистом x86 уже пропадает. Это как сейчас писать под рейтрейсинг — технология хорошая, но запустится не везде.
NTFS
0
вайб чистого DOS на чистом x86
Вот как раз суть в том, что в чистом DOS на x86 c каноничной VGA точно запустится и будет работать, а вот уже под эмуляторами — it depends…
makise_homura
0
А вот не уверен, за пределами базовых вызовов int 10h ты уже фиг знаешь, будет ли оно работать на железе и в эмуляторе. Я уже много раз напарывался, что на 486, более современном x86 (уровня P-4), DOSBox и всяких 86Box — трюки с видеопамятью и установкой тиков таймера нестабильны и могут иметь 2-3 варианта поведения. Например, перевод таймера с 18 Гц на 2000 Гц.

То есть для запуска игроками под свежими ОС — реально нужно собирать конфу эмулятора, а для железа указывать список, на чём тестировал. И это правильно, для того всякие Windows и Linux пилились, чтобы убрать зависимость от $A4000
NTFS (ред.)
+1
за пределами базовых вызовов int 10h ты уже фиг знаешь, будет ли оно работать на железе и в эмуляторе
Да в целом сейчас даже в эмуляторах все такие режимы более-менее реализованы, потому что ну камон, их использует множество игр и демок. А в железе-то стопудово, иначе видеокарта в принципе не имела бы права называться VGA-совместимой. Чип VGA GC/AC — это же не про прерывания, это про регистры и внутреннюю логику.
Например, перевод таймера с 18 Гц на 2000 Гц.
Странно, это, вроде, элементарная операция (ты просто пишешь в 8253 не 64к как делитель, а 600). Ну разве что тебе надо будет тогда ещё прерывание часов подшаманить, чтобы системные часы не шли в сто раз быстрее.
Не припомнишь конфигурацию, на которой это не срабатывало?
для того всякие Windows и Linux пилились, чтобы убрать зависимость от $A4000
И тем не менее, на уровне ядра там всё то же самое) Да и если речь про видеопамять — то пользователю могут замапить видеопамять (фреймбуфер) в его пространство, и он там может рисовать всё, что душе вздумается (KMS+vgafb как раз так и делают).
makise_homura
0
Странно, это, вроде, элементарная операция

Это недокументированная операция, стандартный таймер строго 18.25 Гц и его переключение ломает много чего.
Конфу сейчас не упомню, как в проекте снова использую — проверю на актуальном железе.
NTFS
+1
Это недокументированная операция
Вполне документированная, прямо в мануале по i8253. Другое дело, что да,
его переключение ломает много чего
а конкретно — всё, что завязано на обработчик IRQ 0 (например, инкремент системных часов). Если где-то в эмуляторе это невозможно — то значит, он некорректно эмулирует 8253 и потому наверняка, на нём много что не будет запускаться.
makise_homura
0
Надо проверять, я подозреваю, что я чего-то криво сделал при переключении таймера, потому железо норм брало, а на эмуляторе пошло неправильно. Точно помню, что на железе я достигал 2000 Гц, даже на 386.
NTFS (ред.)
+1
Хм. Можешь ссылку на код скинуть? Попробую поглядеть, где может быть косяк.
makise_homura
0
В связи с тем, что Telegram отправился туда, где нет света Селестии, я предлагаю всем заинтересованным в теме воспользоваться проверенным дедовским способом — получать e-mail рассылку.
Рассылать буду через SMTP-шлюз, без копирования адресов в список, один адрес — одно письмо.
Пишем в личку адреса для включения в рассылку.
NTFS (ред.)
+1
Вот только он туда не отправился.
И лол, e-mail рассылка? В 2026? Не, я, конечно, уважаю ретро-технологии, но кто сейчас регулярно пользуется e-mail для большего, чем получать всякие коды подтверждения? Я, к примеру, смотрю почту, дай Селестия, если раз в пару-тройку дней, а то и того реже.
makise_homura
0
В целом, ответил в другой теме. А так, кому нужно, те записались :-) всегда хорошо иметь альтернативу, а мне перегнать текст в HTML и скинуть его в шлюз — дело двух минут.
NTFS
+1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.