Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Видеорежим через asm функцию

65K
30 января 2011 года
DreamFlash
4 / / 30.01.2011
Добрый день.

Есть функция на ассемблере, которая задает видеорежим:

 
Код:
.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


Программа на си, которая использует эту функцию:
Код:
#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);

}


Это самые первые примеры инициализации видеорежима из книги Андре Ламота "Программирование игр для Windows"

Собственно, пробовал через встроенный ассемблер в самой си программе, вылезала ошибка. Я так понимаю, этот способ для windows не подходит вообще?

В работе самих функций все ясно, но вопросы такие:

-программа, использующая эту ф-ю, под дос?
-если да, то каким лучше компилятором воспользоваться? Для создании .obj функции я использовал MASM. Для создания самой программы, которая использует эту функцию - C++ builder 6, но при использовании bcc32.exe вылезала ошибка: "Unsupported 16-bit segment(s) in module ...".

Спасибо за помощь заранее.
1
30 января 2011 года
kot_
7.3K / / 20.01.2000
Цитата:
при использовании bcc32.exe вылезала ошибка: "Unsupported 16-bit segment(s) in module ...".


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

65K
30 января 2011 года
DreamFlash
4 / / 30.01.2011
Цитата: kot_
как бы намекает.
Для того, что бы выполнить инициализацию видеорежима программу нужно собирать как консольную. Видимо. Ну и адресацию пределать в 32-х битную.
Кроме того - у Ламо (вообщето именно так вроде правильно транскрибируется его фамилия с французкого :)) примеры выполнены в вижуал студии - поэтому если опыт программирования небольшой - лучше использовать тот же инструмент, что и автор - в книге и без того хватает ошибок.



Делал как консольную в борланд с++. Вылезала ошибка.
Поставлю щас вижал студио, спасибо.

Адресацию переделать в 32 битную - как? Не совсем этого понял )

1
30 января 2011 года
kot_
7.3K / / 20.01.2000
в 32-хразрядном режиме может использоваться только один тип модели памяти FLAT. Т.е. как минимум должно быть
 
Код:
.model flat, c

ну и вероятно сам код надо смотреть.
65K
30 января 2011 года
DreamFlash
4 / / 30.01.2011
1. А можно еще такой вопрос, возможно ли реализовать это через встроенный ассемблер, в том же вижал студио, например? Обычный кусок кода

 
Код:
_asm
{
 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


masm на нее не ругается, делает .obj

далее, при работе bcc32.exe выдает
Unresolved external 'set_mode(int)' referenced from ...

Делаю так: bcc32.exe Unit1.obj set_mode.obj
Я так понимаю, он вообще не видит эту функцию.
399
30 января 2011 года
KIV
432 / / 20.01.2009
Вообще то в 32-битном приложении Windows нельзя вызывать функции BIOS. А int 0x10 это именно функция BIOS. Пишите 16-разрядное DOS приложение или же юзайте WinAPI.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог