Программирование SVGA в Turbo C

Я хочу программировать 1024*768 в Turbo C++. Я использую Turbo C 3.0, где я использую старый метод VGA для вызова графики initgraph( &GraphDriver, &GraphMode, "..\\bgi" );

Мне нужна библиотека, которая легко справляется с режимом SVGA и настоящими цветами.


person rehmankhan    schedule 02.03.2017    source источник
comment
К сожалению, запрос рекомендации библиотеки явно противоречит правилам сайта; в противном случае это хороший вопрос, так как это эзотерическое знание, которое будет трудно найти где-либо еще.   -  person Mark Ransom    schedule 02.03.2017
comment
Это, вероятно, невозможно с компилятором/графической библиотекой, которая была создана еще до того, как эти технологии были установлены.   -  person πάντα ῥεῖ    schedule 02.03.2017
comment
svgalib.org   -  person Mark Setchell    schedule 02.03.2017
comment
@Mark Stechell, я думаю, что SVGALIB предназначен только для Linux, я не думаю, что SVGALIB был портирован на MSDOS (вопрос был для TurboC++/MSDOS).   -  person BrunoLevy    schedule 03.03.2017
comment
@BrunoLevy Ах, да, вполне возможно - спасибо. Тем не менее, если ОП твердо настроен на технологии 1990-х, возможно, он счастлив использовать Linux в Virtualbox, чтобы добраться до нирваны 90-х :-)   -  person Mark Setchell    schedule 03.03.2017
comment
см. подпрограммы vesapag,vesamod и их использование. Это на ассемблере, но вы можете использовать встроенную сборку asm { asm code here }; и отображать массив цветов в C, вы просто устанавливаете нужный видеорежим , затем установите страницу, с которой вы хотите работать, а затем работайте с памятью в 0A000h сегменте   -  person Spektre    schedule 30.08.2017


Ответы (1)


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

К счастью, POVRAY существует до сих пор: http://www.povray.org/

Вам нужно взять здесь http://www.povray.org/ftp/pub/povray/Old-Versions/ исходники старой версии 1990-х годов, в которой все еще есть процедуры для SVGA (авторы, вероятно, удалили их в последних версиях!). В исходниках вы найдете кучу встроенных ассемблерных функций для инициализации графического режима и установки пикселя для различных графических плат/производителей (S3, ET4000, ...). Сначала распакуйте POVSRC.ZIP, потом MACHINE.ZIP, потом IBMPC.ZIP (а он в IBM.C).

Код немного эзотерический: это потому, что изначально IBM PC должен был иметь не более 64 КБ видеопамяти (в сегменте A000:0000). Чтобы обеспечить более высокое разрешение, существует метод, называемый «переключение банка», который позволяет изменить «окно» в видеопамяти, которое отображается на A000: 0000.

Если ваша плата SVGA поддерживает стандарт VESA (а это у большинства из них), то все может быть проще, есть стандартное прерывание для смены графического режима и для переключения банка (поэтому вам, вероятно, просто нужно найти в POVRAY реализация VESA "установить графический режим" и "установить пиксель").

Наконец, я упоминаю djgpp (порт g++ для MSDOS), который имеет как 32-битный расширитель DOS, так и графическую библиотеку (grx), которая изящным образом использует виртуальную память для имитации непрерывной графической памяти (она создает виртуальные адреса для видеопамяти). и использует прерывания по ошибкам страниц для автоматического переключения банков). Я использовал его для программирования 3D-графики на 33-мегагерцовом процессоре 486.

Изменить: немного покопавшись, я обнаружил, что последняя версия с подпрограммами находится здесь: http://www.povray.org/ftp/pub/povray/Old-Versions/Official-3.1g/MS-Dos/

распаковать povmsd_s.zip

Подпрограммы находятся в SOURCE/MSDOS/VESAVBE.{H,C} (можно использовать, если ваши карты поддерживают стандарт VESA). Другие карты имеют свои процедуры в SOURCE/MSDOS/MSDOSVID.C.

person BrunoLevy    schedule 02.03.2017
comment
большое спасибо. Помощь приветствуется. - person rehmankhan; 02.03.2017