Прерывание BIOS _int86

Я пробую старый код из книги «Черное искусство программирования 3D-игр». Я знаю, что он устарел, но я начал его читать, и это довольно весело и интересно. Я загрузил компилятор C OpenWatcom и создал новый проект DOS, чтобы даже скомпилировать этот старый код. Я уже скомпилировал фрагмент кода, где установлен Videomode int13h, и тогда я смог рисовать пиксели на экране. Но это было сделано с помощью функции C под названием _setvideomode(). В следующем примере видеорежим устанавливается с помощью функции _int86, которая вызывает прерывание, и прототип должен быть в файле bios.h, но OpenWatcom сообщает: «Прототип для функции _int86 не найден». Я застрял сейчас и не знаю, что делать;) Вот код:

void setGraphxMode(int mode){
    union REGS inregs,outregs;

    inregs.h.ah = 0;
    inregs.h.al = (unsigned char)mode;

    _int86(0x10,&inregs,&outregs);
}

int main(){

    return 0;
}

Буду признателен за любые советы по этому поводу, и да, я знаю: в наши дни графика выполняется через DirectX или OpenGL. Это только для обучения! Спасибо :)


person kimsay    schedule 07.02.2015    source источник
comment
Лично я до сих пор пишу много графического кода непосредственно на ассемблере. Когда я преподаю уроки ассемблера, я на самом деле начинаю с того, что учу людей, как написать загрузчик, запустить что-то, а затем сразу же начать работать с экраном и управлением памятью, чтобы перейти в защищенный режим. Очень полезно выяснить, как делать что-то самостоятельно, чтобы лучше знать, что вам нужно от графической библиотеки.   -  person David Hoelzer    schedule 08.02.2015
comment
Ницца! Вот бы наши преподаватели занимались этим вместо скучной Java... ;) теперь мне самому предстоит копаться в материале. Даже не знал, что так можно делать в защищенном режиме (я имею в виду графику). Я также хотел бы сделать то, что вы описываете в своем классе ;) У вас есть какой-нибудь материал по этому поводу? @DavidHoelzer   -  person kimsay    schedule 08.02.2015
comment
Я написал книгу, в которой достаточно сборки, чтобы быть опасной. Я еще не совсем выпустил его. Что касается графики в защищенном режиме, самый простой способ решить эту проблему — использовать видеорежим для карты, который будет отображать всю экранную память в плоскую область памяти. расширения SVGA - это настоящий беспорядок, и в них нет ничего стандартного, поэтому попытка работать с этим вручную потребует огромного количества исследований документов для каждой конкретной карты. Гораздо проще просто использовать режим отображаемой памяти и создать селектор, указывающий на него.   -  person David Hoelzer    schedule 08.02.2015
comment
Так можно часть ОЗУ определить как память экрана и записать в нее данные, которые потом будут использоваться видеокартой для отрисовки на экран? возможно ли это вообще под windows или linux? @DavidHoelzer   -  person kimsay    schedule 08.02.2015
comment
Точнее, можно выбрать режим экрана, который будет отображать память дисплея в ОЗУ, а затем определить селектор, чтобы вы могли получить прямой доступ к этой области.   -  person David Hoelzer    schedule 08.02.2015


Ответы (1)


В OpenWatcom вызов, который вы ищете, это int386, я полагаю:

int386(0x10, &inregs, &outregs);
person David Hoelzer    schedule 07.02.2015
comment
Да! Оно работает! Спасибо :) Мой обходной путь, чтобы сделать прерывание через встроенную сборку: int 10h. Это сделало работу ... Но приятно знать :) - person kimsay; 08.02.2015