.MODEL MEDIUM, С
.CODE
PUBLIC Set_Mode
Set_Mode PROC FAR С, vmode:WORD
mov АН,0
mov AL,BYTE PTR vmode
int 10h
ret
Set_Mode ENDP
END
Видеорежим через asm функцию
Есть функция на ассемблере, которая задает видеорежим:
Код:
Программа на си, которая использует эту функцию:
Код:
#include <stdio.h>
#define VGA256 0х13
#define TEXT_MODE 0х03
extern Set_Mode(int mode);
void main(void)
{
Set_Mode(VGA256);
while (kbhit()) {}
Set_Mode(TEXT_MODE);
}
#define VGA256 0х13
#define TEXT_MODE 0х03
extern Set_Mode(int mode);
void main(void)
{
Set_Mode(VGA256);
while (kbhit()) {}
Set_Mode(TEXT_MODE);
}
Это самые первые примеры инициализации видеорежима из книги Андре Ламота "Программирование игр для Windows"
Собственно, пробовал через встроенный ассемблер в самой си программе, вылезала ошибка. Я так понимаю, этот способ для windows не подходит вообще?
В работе самих функций все ясно, но вопросы такие:
-программа, использующая эту ф-ю, под дос?
-если да, то каким лучше компилятором воспользоваться? Для создании .obj функции я использовал MASM. Для создания самой программы, которая использует эту функцию - C++ builder 6, но при использовании bcc32.exe вылезала ошибка: "Unsupported 16-bit segment(s) in module ...".
Спасибо за помощь заранее.
Цитата:
при использовании bcc32.exe вылезала ошибка: "Unsupported 16-bit segment(s) in module ...".
как бы намекает.
Для того, что бы выполнить инициализацию видеорежима программу нужно собирать как консольную. Видимо. Ну и адресацию пределать в 32-х битную.
Кроме того - у Ламо (вообщето именно так вроде правильно транскрибируется его фамилия с французкого :)) примеры выполнены в вижуал студии - поэтому если опыт программирования небольшой - лучше использовать тот же инструмент, что и автор - в книге и без того хватает ошибок.
Цитата: kot_
как бы намекает.
Для того, что бы выполнить инициализацию видеорежима программу нужно собирать как консольную. Видимо. Ну и адресацию пределать в 32-х битную.
Кроме того - у Ламо (вообщето именно так вроде правильно транскрибируется его фамилия с французкого :)) примеры выполнены в вижуал студии - поэтому если опыт программирования небольшой - лучше использовать тот же инструмент, что и автор - в книге и без того хватает ошибок.
Для того, что бы выполнить инициализацию видеорежима программу нужно собирать как консольную. Видимо. Ну и адресацию пределать в 32-х битную.
Кроме того - у Ламо (вообщето именно так вроде правильно транскрибируется его фамилия с французкого :)) примеры выполнены в вижуал студии - поэтому если опыт программирования небольшой - лучше использовать тот же инструмент, что и автор - в книге и без того хватает ошибок.
Делал как консольную в борланд с++. Вылезала ошибка.
Поставлю щас вижал студио, спасибо.
Адресацию переделать в 32 битную - как? Не совсем этого понял )
Код:
.model flat, c
ну и вероятно сам код надо смотреть.
Код:
_asm
{
mov ah,0
mov al,13h
int 10h
}
{
mov ah,0
mov al,13h
int 10h
}
не работает. Есть какие-нибудь варианты, как это сделать?
Программа консольная
Я понимаю, что это уже не по билдеру вопрос, но все же, чтобы отдельно не создавать..
2. Такой код
Код:
.386
.MODEL flat, С
.CODE
PUBLIC Set_Mode
Set_Mode PROC FAR С, vmode:WORD
mov АН,0
mov AL,BYTE PTR vmode
int 10h
ret
Set_Mode ENDP
END
.MODEL flat, С
.CODE
PUBLIC Set_Mode
Set_Mode PROC FAR С, vmode:WORD
mov АН,0
mov AL,BYTE PTR vmode
int 10h
ret
Set_Mode ENDP
END
masm на нее не ругается, делает .obj
далее, при работе bcc32.exe выдает
Unresolved external 'set_mode(int)' referenced from ...
Делаю так: bcc32.exe Unit1.obj set_mode.obj
Я так понимаю, он вообще не видит эту функцию.
Вообще то в 32-битном приложении Windows нельзя вызывать функции BIOS. А int 0x10 это именно функция BIOS. Пишите 16-разрядное DOS приложение или же юзайте WinAPI.