Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > VESA


Автор: renji 28.5.2006, 19:16
1. Как достать информацию о поддерживаемьіх режимах?
Не понимаю я почти ничего в ассемлерньіх штуках.
Вот шаблон как запрос делать:
Код

Input:   AH = 4Fh        Super VGA support
            AL = 00h        Return Super VGA information
            ES:DI = Pointer to buffer

Output: AX = Status

С AX, и тому подобньіми кажется немножко разобрался, но не знаю что делать с ES:DI, как его в union REGS оформить?. Если можно, пример кода пожалуйста.

Структура возвращаемого буфера тоже мне непонятна.

Код

VgaInfoBlock    STRUC
      VESASignature   db   'VESA'      ; 4 signature bytes
      VESAVersion     dw   ?           ; VESA version number
      OEMStringPtr    dd   ?           ; Pointer to OEM string
      Capabilities    db   4 dup(?)    ; capabilities of the video environment
      VideoModePtr    dd   ?           ; pointer to supported Super VGA modes
      TotalMemory     dw   ?           ; Number of 64kb memory blocks on board
      Reserved        db   236 dup(?)  ; Remainder of VgaInfoBlock
VgaInfoBlock    ENDS


Насколько я понимаю мне нужно добьіть  VideoModePtr, то есть список поддержьіваемьіх SVGA режимов, но совсем не понимаю как на практике сделать. Короче, нуждаюсь в примере smile  

Автор: bsa 28.5.2006, 19:48
Код
struct VgaInfoBlock {
   char     Signature[4];
   WORD  Version;
   const char far * OEMStringPtr;
   BYTE Capabilities[4];
   const void far * VideoModePtr;
   WORD  TotalMemory;
   char     Reserved[236];
};

get_info() {
   struct VgaInfoBlock info;
   asm {
       lea di,info
       mov ax,4F00h
       int 10h
   }
}

Если я не ошибся с LEA (Load Effective Address) - всегда с ней проблемы были, то должно работать.

Добавлено @ 19:51 
Данный код расчитан для работы из-под Borland C++ 3.1 (реальный режим процессора, то есть). Если модель памяти по умолчанию far или huge, то far можно убрать из декларации указателей. 

Автор: sergejzr 28.5.2006, 20:02
Модератор: Пожалуйста, один топик - один вопрос.
Модератор: Название темы должно отражать ее суть! 

Автор: bsa 28.5.2006, 20:25
sergej.z, у человека и задан один вопрос + 1/2 решения. 

Автор: renji 28.5.2006, 21:46
Спасибо з а ответ. Извиняюсь если плохо оформил названия темьі. Но наверное вопросов собираюсь задавать много smile 
Как проверить значения ah на вьіходе? (с ассемблерньіми включениями никогда дела не имел просто)

Добавлено @ 21:57 
И еще такое -  например я хочу вьівести на екран значения Signature структурьі VgaInfoBlock, почему так не работает:

Код

void main()
{
 int i;
 get_info();
 for (i=0; i<=3; i++)
   printf("%c",VgaInfoBlock.Signature[i]);
 getch();
}


говорит "Improper use of typedef 'VgaInfoBlock'" smile   

Автор: bsa 29.5.2006, 17:02
Я тебе показал пример функции, а не полную реализацию.
VgaInfoBlock - у тебя это тип, а не переменная.
Для получения содержимого регистра AH, тебе надо присвоить какой либо переменной значение переменной _AH:
Код
unsigned char x;
//some code
x = _AH;
//some code
 

Автор: regis 30.5.2006, 13:36
Цитата(renji @ 28.5.2006,  19:16)
1. Как достать информацию о поддерживаемьіх режимах?
Не понимаю я почти ничего в ассемлерньіх штуках.
Вот шаблон как запрос делать:
Код

Input:   AH = 4Fh        Super VGA support
            AL = 00h        Return Super VGA information
            ES:DI = Pointer to buffer

Output: AX = Status

С AX, и тому подобньіми кажется немножко разобрался, но не знаю что делать с ES:DI, как его в union REGS оформить?. Если можно, пример кода пожалуйста.


Проблема, как я понимаю, заключается в том, откуда взять ES? Правильный ответ зависит от модели памяти, в которой компилируется ваша программа. Если Используется tiny, small или compact (насчет последней не уверен), то ES должно совпадать с сегментом данных программы (DGROUP). Если medium, large или huge -- все указатели будут far, то есть содержат сегментную часть, которую нужно перегрузить в ES при вызове.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)