Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: VESA BIOS  (Прочитано 21474 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
demonhunterus
Интересующийся

ua
Offline Offline

« : 14-10-2011 10:10 » 

Добрый день.
Пытаюсь разобраться с Vesa BIOS,но на данный момент даже самые простые действия не получаются,а погуглив ничего толкового не нашел.Надеюсь на подсказки или посылания на полезную информацию,которая поможет мне во всем разобраться.
Дело такое.
1)Нужно разместить буфер длиной 256 байт.Этот буфер должен испоьзоваться Vesa BIOS для возврата информации о видео среде.
2)Нужно вызвать функцию 00h из Vesa BIOS.
3)Создать новый буфер и вызвать из Vesa BIOS функцию 01h,чтобы получить информацию о поддерживаемых видеорежимах. Используя VideoModePtr,нужно вызывать эту функцию до тех пор,пока не будет найден походящий видео режим.
Ну и вот по порядку.
Код:
#include <conio.h>
#include <stdio.h>

int main() {

char *buf[256];     // 1) Размещаем буфер(этого не делал 100 лет,но вроде бы так это делается)
unsigned char state1,state2; // переменные для определения результата выполнения 00h

 asm {
       mov AH,0x4F; // 2) Вызов функции 00h. Вход: AH = 4Fh
       mov AL,0x00; // AL = 00h
       ES:DI,buf;     // ES:DI - указатель на буффер (вот тут не уверен,что правильно сделал)
       int 0x10;
       mov state1,AL;
       mov state2,AH;

       }
 if (state1 == 0x4F) // Если AL == 4Fh
 printf("Function is supported\n"); // функция поддерживается
 else
 printf("Function is not supported\n"); // В противном случае - функция не поддерживается

 if (state2 == 0x00) // Если AH == 00h
 printf("Function call was sucsessfull\n"); // Вызов был успешным
 else
 printf("Error in function call\n"); //В противном случае - имеет место ошибка
getch();
return 0;
}
При попытке компилирования ругается на строку ES:DI,buf.Не могу понять как его правильно задать.
По третьему вопросу:
скажем - на входе должно быть CX = номер режима SuperVGA,который должен равняться одному из тех,что были возвращены функцией 0.
Структура информационного блока функции 0 имеет следующий вид
Код:
struct VESAINfo
{
  char sign[4]; // VESA signature
  unsigned int ver; // VESA BIOS version
  char far *OEM; //Original Equipment Manufacturer
  long cap;
  int far* modeList; //supported modes
  int totalMemory; //int 64K blocks
}
Вопросчто здесь является тем самым номером режима SuperVGA,который надо подать на CX?

в общем,подскажите,кто что может.Благодарю.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-10-2011 10:35 » 

Здесь ES должен быть равен DS. Старые досовые компиляторы могут считать иначе.

push es
push ds
pop es
lea di, buff
.... код
pop es

Я бы и другие регистры сохранил, чтобы не конфликтовать с компилятором:

pusha
push ds
pop es
lea di, buff
...
popa

Про коды функций VBE и структуры поищи в инете - этого добра много!
« Последнее редактирование: 14-10-2011 10:47 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #2 : 14-10-2011 13:09 » 

RXL, ага.Спасибо!
upd.
Ругань на ES:DS исправил таким образом
Код:
asm {
       mov AH,0x4F;
       mov AL,0x00;
       les DI,buf;
       int 0x10;
       mov state1,AL;
       mov state2,AH;
      }
Результат выполнения  - выводится надпись о том,что режим поддерживается и вызов функции был успешным.Необходимо ли выполнять сохранения функции push с последующим её вызовом pop или же это не критично?

в общем,вся проблема по большому счету у меня с вот этим:используя int far* mode List из структуры struct VESAInfo,нужно вызывать функцию 01h до тех пор,пока не будет подходящий видео режим. Функция 01h должна заполнять буфер, снабжая тем самым программу информацией, описывающей возможности видео режима. Чтобы определить, что режим действительно поддерживается аппаратурой,необходимо проверить нулевой бит поля modeAttr структуры struct VESAModeInfo,которая возвращается функцией 01h.
Задача есть,а как это программно реализовать,не имею ни малейшего представления.
Код:
#include <conio.h>
#include <stdio.h>

int main() {

char *buf1[256],*buf2[256];
unsigned char state1,state2;

 asm {
       mov AH,0x4F;
       mov AL,0x00;
       les DI,buf1;
       int 0x10;
       mov state1,AL;
       mov state2,AH;
      }
 if (state1 == 0x4F)
 printf("Function is supported\n");
 else
 printf("Function is not supported\n");

 if (state2 == 0x00)
 printf("Function call was sucsessfull\n");
 else
 printf("Error in function call\n");

 asm {
      mov AH,0x4F; // Поддержка Super VGA
      mov AL,0x01; // Возврат информации о режиме Super VGA
      mov CX,; //Номер режима SVGA, он должен равняться одному из тех,что были возвращены функцией 00h -- вот не знаю как это реализовать
      les DI,buf2; //Указатель на 256 байтовый буфер
      int 0x10;
      mov  , AX //AX - состояние - не знаю,в какую переменную его записывать и записывать ли вообще
      }

getch();
return 0;
}
256-байтовый буфер этой функции имеет следующий вид
Код:
struct VESAModeInfo
{
 int ModeAttributes;
 char WinAAttributes;
 char WinBAttributes;
 int WinGranularity;
 int WinSize;
 unsigned WinASegment;
 unsigned WinBSegment;
 void far * WinFuncPtr;
 int BytesPerScanLine;
  // optional data
 int XResolution;
 int YResolution;
 char XCharSize;
 char YCharSize;
 char NumberOfPlanes;
 char BitsPerPixel;
 char NumberOfBanks;
 char MemoryModel;
 char BankSize;
 char NumberOfPages;
  // direct color fields
 char RedMaskSize;
 char RedFieldPosition;
 char GreenMaskSize;
 char GreenFieldPosition;
 char BlueMaskSize;
 char BlueFieldPosition;
 char RsvdMaskSize;
 char RsvdFieldPosition;
 char DirectColorModeInfo;
 char Reserved [216];
};
Подскажите кто что может.Где смотреть,куда рыть.

Добавлено через 1 час, 29 минут и 33 секунды:
Так.Нашел что-то похожее.Пытаюсь разобраться.
Код:
 int FindVESA (VESAInfo & vi)
{
 _asm
 {
  push  es                     ;
  push  di                     ;
  les   di,    dword ptr vi    ;
  mov   ax, 4F00h              ;
  int   10h                    ;
  pop   di                     ;
  pop   es                     ;
 }
 if(_AX != 0x004f)
  return 0;
 return 1;
}

В моем варианте я так понимаю это выглядит так:

Код:
asm {
       mov AH,0x4F;
       mov AL,0x00;
       les DI,buf1;
       int 0x10;
       mov state1,AL;
       mov state2,AH;
      }
 if (state1 == 0x4F)
 printf("Function is supported\n");
 else
 printf("Function is not supported\n");

 if (state2 == 0x00)
 printf("Function call was sucsessfull\n");
 else
 printf("Error in function call\n");

Код:
int FindVESAMode (int mode,VESAModeInfo & mi)
{
 _asm
 {
  push  es                                     ;
  push  di                                     ;
  les   di,    dword ptr mi                       ;
  mov   ax, 4F01h                              ;
  mov   cx, mode                               ; //вот загвоздка в этом
mode.не могу понять как вытянуть номер режима SVGA из
тех,что были возвращены функцией 0
  int   10h                                    ;
  pop   di                                     ;
  pop   es                                     ;
 }
 return _AX==0x004f;
}
Вот это я пытаюсь сейчас реализовать
Код:
asm {
      mov AH,0x4F; // Поддержка Super VGA
      mov AL,0x01; // Возврат информации о режиме Super VGA
      mov CX,; //Номер режима SVGA, он должен равняться одному из тех,что
были возвращены функцией 00h -- вот не знаю как это реализовать
      les DI,buf2; //Указатель на 256 байтовый буфер
      int 0x10;
      mov  , AX //AX - состояние - не знаю,в какую переменную его записывать
и записывать ли вообще
      }
Ну и проблема с тем,как вызывать эту функцию до тех пор,используя VideoModePtr,пока не будет найдет подходящий видеорежим.
(как проверить аппаратную поддержку я понял,нужно проинспектировать бит D0.Если он равен нулю,то режим не поддерживается аппаратурой.Вопрос в том,как это всё целиком реализовать программно.Но я понимаю что должно быть что-то примерно такое.
Код:
int mask=1;
if(!поле modeAttr структуры struct VESAModeInfo & mask)
берем следующий режим из поля ModeList структуры struct VESAInfo.
else
найден подходящий видео режим

« Последнее редактирование: 14-10-2011 16:02 от demonhunterus » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 14-10-2011 19:36 » 

Сохраняй ES и восстанавливай потом! Ведь компилятор не зря это делает - может боком выйти.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #4 : 15-10-2011 16:09 » 

demonhunterus ,
(често пишу, не все подробно вычитал).
1. Обрати внимание, в какой модели памяти компилируется код. (возможно надо сменить)
(от этого зависит работа с регистрами DS, ES - как выше упоминали)
2. Может пригодиться - "Программироваение видеоадаптеров CGA EGA и VGA" - библиотека сист.программиста, т.3 (А.В.Фролов ...) + примеры. Есть авторский сайт.
3. если уж нужна работа с асм, посмотри возможность сборки проекта из модулей на С и отдельно скомпилированных модулей на асм - в виде функций вызываемых из кода С. Так будет проще отлаживать, можно использовать транслятор с асм.



Добавлено через 19 минут и 35 секунд:
demonhunterus,
---
asm {
       mov AH,0x4F;
       mov AL,0x00;
       les DI,buf1;   <<< вроде правильно, загрузить исп.адрес buf1 в ES:DI
       int 0x10;
------ а вот тут проверь - регистр сегм. данных по умолчанию - DS. А что в DS ?
в общем, надо указать с каким сегментом DS-ES работают эти 2 mov.
и чтобы сегмент данных указывал на сегмент, где находятся state12
       mov state1,AL;    //        mov ES:state1,AL;  (?)
       mov state2,AH;
      }
------

Добавлено через 26 минут и 10 секунд:
demonhunterus,
-----
. . . .
mov   cx, mode                               ; //вот загвоздка в этом
mode.не могу понять как вытянуть номер режима SVGA из
тех,что были возвращены функцией 0"
. . . .
непонятно в чем загвоздка. Ругается асм, не передается параметр, нет возврата (нужного), неизвестно как выудить mode .....
"вытянуть" - если инф в структуре - то в чем проблема ?
если неизвестно где-что этот mode - то дальше писать код рановато, надо разобраться с предидущим.
int 10 в зависимости от номера ф-ии и подфункции может или возвращать код результата, или нет.
Это описано в док по инт 10 - для каждой ф-ии и подфункции.   IMHO
« Последнее редактирование: 15-10-2011 16:55 от DneprSMV » Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #5 : 22-10-2011 06:49 » 

DneprSMV, спасибо за пищу для размышлений.Буду думать.
На данный момент мои размышления по поводу всего этого привели к следующим результатам.
Допустим,я хочу работать в режиме 105h (есть такой режим, 1024Х768,256 цветов).
Для этого,нужно проверить,есть ли такой режим в списке режимов,возвращенных функцией 00h и помещенных в буфер в структурe такого вида:
Код:
+---------------+----------+----+----------------------------------+
|VESASignature  | 4 Байта  | 00h| "VESA"                           |
+---------------+----------+----+----------------------------------+
|VESAVersion    | 2 Байта  | 04h| номер версии VBA, BCD            |
+---------------+----------+----+----------------------------------+
|OEMStringPtr   | 4 Байта  | 06h| указатель на строку с названием  |
|               |          |    | производителя (OEM), ASCIIZ      |
+---------------+----------+----+----------------------------------+
|Capabilities   | 4 Байта  | 0Ah| флаги графических возможностей   |
+---------------+----------+----+----------------------------------+
|VideoModePtr   | 4 Байта  | 0Eh| указатель на список              |
|               |          |    | поддерживаемых  видеорежимов     |
+---------------+----------+----+----------------------------------+
|TotalMemory    | 2 Байта  | 12h| количество видеопамяти в         |
|               |          |    | 64-килобайтных блоках            |
+---------------+----------+----+----------------------------------+
|InVersion      | 2 Байта  | 14h| внутренняя версия реализации VBA |
+---------------+----------+----+----------------------------------+
|NameFirme      | 4 Байта  | 16h| указатель на название            |
|               |          |    | производителя, ASCIIZ            |
+---------------+----------+----+----------------------------------+
|NameVESA       | 4 Байта  | 1Ah| указатель на название            |
|               |          |    | видеоадаптера, ASCIIZ            |
+---------------+----------+----+----------------------------------+
|PTRVESAVersion | 4 Байта  | 1Eh| указатель на название версия     |
|               |          |    | видеоадаптера, ASCIIZ            |
+---------------+----------+----+----------------------------------+
|Reserved       | 222 Байт | 20h| зарезервировано                  |
+---------------+----------+----+----------------------------------+
|Reserved2      | 256 Байт |100h| зарезервировано для внутренних   |
|               |          |    |  данных                          |
+---------------+----------+----+----------------------------------+
Учитывая,что список режимов заканчивается 0FFFh,можно придумать что-то такое
Код:
int i=0, mode_105=0;

while (VideoModePtr[i]!=0x0FFF) //пока не дошли до конца списка(последний элемент
 0x0FFF)
{
  if (VideoModePtr[i]==0x105) //если текущий режим == 105h
    mode_105=1; //режим существует
  else
    i++; //в противном случае проверяем следующий режим
}

Если режим 105 есть в списке,то нужно проверить,поддерживается ли он аппаратно при
помощи функции 01h(проверить равняется ли нулевой бит единице)
Код:
int mask=1, mode_105_tech=0;
if (mode_105==1)   //если режим 105 существует
   if (mask & ModeAttr) //и нулевой бит равен единице
   mode_105_tech=1; //аппаратно режим поддерживается

Вот что-то как-то так.
Меня интересует собственно только один вопрос,самый важный для меня.
Структуры,возвращаемые функциями 00h и 01h лежат в буферах по 256 байт.
Код:
char buf1[256],buf2[256]; //buf1 - для 00h, buf2 - для 01h
Если структура лежит в буфере,то как обращаться к полю этой структуры???
Код:
while (buf1.VideoModePtr[i]!=0x0FFF)
или как-то иначе?(вопрос,может,и смешной,но блин,мне сейчас это дело преодолеть надо,
а текущий режим сохранить и инициализировать 105h я уж сам как-то смогу,подскажите,
пожалуйста...)
« Последнее редактирование: 22-10-2011 12:46 от demonhunterus » Записан
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #6 : 22-10-2011 14:32 » 

demonhunterus,
кажется так

Код: (C)
char ms[256];
MyStruct *p_ms;  // структура, включающая поля field_xx
p_ms = (MyStruct *) &ms[0];
int a = p_ms->field_0;
int b = p_ms->field_25;

char buf1[256],buf2[256]; //buf1 - для 00h, buf2 - для 01h
buf1 не структура, а массив. Соответственно в нем полей нет.
Делай ход конем который я привел выше

будет нечто такое
Код: (C)
while (p_ms->VideoModePtr[i]!=0x0FFF) . . . .

(чистить буфер само собой низзя, пока работает while)
« Последнее редактирование: 22-10-2011 14:46 от DneprSMV » Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #7 : 22-10-2011 18:30 » 

DneprSMV, Аха.Ухты.Ясно,понял,буду пытаться!
Код:
int a = p_ms->field_0;
int b = p_ms->field_25;
Аммм.А что это за переменные а и b?И зачем они нужны?
p_ms->field_0 - нулевое поле, p_ms->field_1 - первое и тд?Если да,то откуда известно,что полей 25 и где присвоение от a до b?Или это просто пример похожий?
« Последнее редактирование: 22-10-2011 18:37 от demonhunterus » Записан
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #8 : 22-10-2011 21:34 » 

demonhunterus,
ну, что такое a & b - можно слагать легенды  Ага Это пример.
Полей в структуре ровно столько, сколько "задекларировано" в ее объявлении в файле .h или .inc (ASM). В каком файле у тебя объявление структуры, начинащееся с VESASignature и до Reserved2 ?
Для VESA должны быть готовые .h файлы с описаниями в том чиселе структур.
В таблице даны размеры и смещения полей. Я бы преобразовал ее в виде объявления структуры С.
Код:
struct VesaStr {
 char VESASignature[4];  // 4 Байта  "VESA"                 
 char VESAVersion[2];     // 2 Байта  номер версии VBA, BCD
 char *OEMStringPtr;      // 4 байта - указатель. Надо проверить соответствие формату указателя в С
 . . . .
}
Если я конечно тебя правильно понял.
Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #9 : 23-10-2011 05:47 » 

DneprSMV, Тааааааак.Погуглил,нашел VESA.h
Код:
//	Информация о VBE и видеоадаптере
typedef struct
{
// Поддерживается всеми версиями VBE
char cSignature[4];
unsigned short usVersion;
char far *fpInfoOEM;
unsigned char ucCapabilities[4];
unsigned short far *fpModeTable;

// Поддерживается VBE версии 1.2
unsigned short usTotalMemory;

// Поддерживается VBE версии 2.0
unsigned short usRevVersion;
char far *fpOEMName;
char far *fpOEMProductName;
char far *fpOEMRevVersion;
char cReserv[222];
char cOEMData[256];
} VESAINFO;

Теперь,если я всё правильно понял,то полей будет 12, *fpModeTable - это мой указатель на список всех режимов,который мне нужно проверить на наличие режима 105h.
Код:
char ms[256];
MyStruct *p_ms;  // структура, включающая поля field_xx
p_ms = (MyStruct *) &ms[0];
int a = p_ms->field_0;
int b = p_ms->field_11;
Понимаю,что char ms[256]-это наш массив-буфер.Дальше мы это дело преобразовываем в структуру,чтоб можно было с ней работать,чтоб было 12 полей,как и в исходной,возвращаемой функцией 00h.A куда приткнуть эти а и b?Как должно выглядеть условие,где мы укажем,что полей у на с будет с 0 до 11?Что-то с утра не могу понять.Это будет цикл?Или не цикл?Я просто такого никогда не делал.И не представляю,как такое сделать.
P.S.:где-то слышал,что как-то так можно обратиться
Код:
buf1[имя структуры.VideoModePtr] 
,но попытался сделать так
Код:
buf1[VESAINFO.fpModeTable[i]]!=0x105
и компилятор начал ругаться на использование VESAINFO...
« Последнее редактирование: 23-10-2011 05:57 от demonhunterus » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 23-10-2011 05:56 » 

demonhunterus, фигню ты нагуглил: см. VESA VBE версии 3.0 - меньше не имеет смысла.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #11 : 23-10-2011 06:01 » 

RXL, Океееей.Сейчас буду смотреть.А почему не имеет смысла?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 23-10-2011 06:11 » 

Функциональности недостаточно. Поверь.

Была бы в инете материальная дырка, я бы тебе свою книжку по видео BIOS отдал бы: Фролов А.В., Фролов Г.В., Программирование видеоадаптеров, Москва, Диалог-МИФИ, 1995, ISBN 5-86404-066-5.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #13 : 23-10-2011 09:34 » new

RXL, А нужен мне весь этот функционал?По сути мне только
Код:
unsigned short far *fpModeTable; 
нужен,для того,чтобы проверить в этом списке,есть ли там режим 105h...
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 23-10-2011 09:41 » 

Лучше все таки использовать "современное" API 15-летней давности, чем еще более древнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #15 : 23-10-2011 09:49 » 

RXL,хм,ну ладно,поищу VESA.h для 3.0 версии,хоть много лишних полей будет,которые я совсем не буду использовать )) Спасибо.
P.S.:А по поводу буферизации и чтения из буфера ничего не подскажете?Я так понял,что задав буффер массивом я выбрал не самый лучший вариант и прийдется подолбаться с этим делом как-то так,как писали выше,может есть какой-то другой вариант,как это лучше сделать?Задать буффер структурой или может как-то иначе?

Добавлено через 1 час, 33 минуты и 35 секунд:
Тааааак.Вот нашел кое-что.
Код: (C)
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include "vesa.h"
#include "sysp.h"

int     GetVESAModeInfo(unsigned, VESAINFO *, VESAMODEINFO * );
int
GetVESAModeInfo(unsigned modeVESA, VESAINFO *ptrVesaInfo, VESAMODEINFO *ptrModeInfo)
{
        union REGS regs;
        struct SREGS segregs;
        int     iResult, i;

        strcpy( ptrVesaInfo->cSignature, "VBE2" );

        regs.h.ah = 0x4f;
        regs.h.al = 0x00;
        segregs.es = FP_SEG((void far *) ptrVesaInfo);
        regs.x.di = FP_OFF((void far *) ptrVesaInfo);
        int86x(0x10, &regs, &regs, &segregs);

        if((regs.h.al != 0x4f) || (regs.h.ah != 0)) return -1;

        for( i=0; i<50; i++ )    {

                if(ptrVesaInfo->fpModeTable[i] == 0xFFFF)               break;
                if(ptrVesaInfo->fpModeTable[i] != modeVESA)     continue;

                regs.h.ah = 0x4f;
                regs.h.al = 0x01;
                regs.x.cx = ptrVesaInfo->fpModeTable[i];
                segregs.es = FP_SEG((void far *) ptrModeInfo);
                regs.x.di = FP_OFF((void far *) ptrModeInfo);
                int86x(0x10, &regs, &regs, &segregs);

                if((regs.h.al != 0x4f) || (regs.h.ah != 0)) return -1;
                else return 0;
        }
        return iResult;
}

int main()
{
        VESAINFO                        vesaInfo;
        VESAMODEINFO                    modeInfo;
                unsigned                        modeVESA;
        int   iResult;
   clrscr();
                modeVESA=0x105;
        iResult = GetVESAModeInfo(modeVESA, &vesaInfo, &modeInfo);
        if(iResult != 0) {
           printf("\nNot Supported");
                                getch();
                return -1;
        }
                getch();
        return 0;
}
Вроде бы работает.
Дальше сам разберусь.Только,если можно,подскажите что значат вот эти вот строчки
Код:
union REGS regs;
--- что за зверь такой union и почему
REGS regs?Это название юниона и как к нему обращаться или как?
Код:
struct SREGS segregs;
--- что за структура такая?Я так понял,
это всё нужно для того,чтоб то,что я делал как ассемблерную вставку,
сделать в виде regs.h.ah = 0x4f;
Код:
strcpy( ptrVesaInfo->cSignature, "VBE2" );
--- копируем строку из
prtVesaInfo в cSignature?Или что-то другое?
Код:
segregs.es = FP_SEG((void far *) ptrVesaInfo);
regs.x.di = FP_OFF((void far *) ptrVesaInfo);
--- ну тут вообще не понятно.
Знаю только,что ES:DI - указатель на буфер.ПОнимаю,что segregs - сегмент регистров,
а regs.x.di = fp_Off - догадываюсь,что офф - это оффсет,т.е. смещение.
Но почему именно regs.x.di?Откуда этот х и что он значит?( в regs.h.ah = 0x4f; я понимаю,что h - это 16тиричная система счисления.а что за зверь такой х?

Кто сможет подсказать - подскажите,пожалуйста.Я буду очень благодарен.
« Последнее редактирование: 23-10-2011 11:22 от demonhunterus » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 23-10-2011 11:49 » 

В Си имена комплексных типов содержат в себе ключевые слова struct и union. Чтобы избавиться от них используют typedef.

Код:
struct my_type_struct
{
  int a;
  int b;
};

typedef struct my_type_struct my_type;

struct my_type_struct var1;
my_type var2;

Почитай про такие вещи в стандарте языка. Также и про strcpy почитай. Большинство твоих вопросов происходят от незнания языка.

FP_SEG и FP_OFF - это, видимо, макросы. "void far *" - здесь, длинный указатель в виде пары: сегмент и смещение. Это особенность твоего компилятора и библиотек, идущих с ним. Туда же REGS, SREGS и int86x.
« Последнее редактирование: 23-10-2011 12:01 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #17 : 23-10-2011 12:02 » 

RXL, спасибо,с этим разобрался.
Осталось непонятно только это:
Код: (C)
                  regs.x.cx = ptrVesaInfo->fpModeTable[i]; //сх - номер режима SVGA.
Непонятно почему regs.X.cx.
                int86x(0x10, &regs, &regs, &segregs); //прерывание 0х10, а потом
 эти вот &regs,&regs,&sregs не понимаю что значат и зачем.
« Последнее редактирование: 23-10-2011 12:11 от demonhunterus » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 23-10-2011 12:12 » 

Значит так:
1. Открывай папку со своим компилятором.
2. Ищи там файл dos.h.
3. Читай файл - там ответы на твои "X" и т.п. Не ищи магии там, где ее отродясь не было. Все слишком банально.

Также пройдись по заголовкам, которые будут подсоединены внутри dos.h через include.

Добавлено через 6 минут и 2 секунды:
Код: (C) dos.h
#ifndef _DOS_H_
#define _DOS_H_

#include "pc.h"

union REGS {
  struct {
    unsigned long ax;
    unsigned long bx;
    unsigned long cx;
    unsigned long dx;
    unsigned long si;
    unsigned long di;
    unsigned long cflag;
    unsigned long flags;
  } x;
  struct {
    unsigned char al;
    unsigned char ah;
    unsigned short upper_ax;
    unsigned char bl;
    unsigned char bh;
    unsigned short upper_bx;
    unsigned char cl;
    unsigned char ch;
    unsigned short upper_cx;
    unsigned char dl;
    unsigned char dh;
    unsigned short upper_dx;
  } h;
};

struct SREGS {
  unsigned short cs;
  unsigned short ds;
  unsigned short es;
  unsigned short fs;
  unsigned short gs;
  unsigned short ss;
};

struct ftime {
  unsigned ft_tsec:5;   /* 0-29, double to get real seconds */
  unsigned ft_min:6;    /* 0-59 */
  unsigned ft_hour:5;   /* 0-23 */
  unsigned ft_day:5;    /* 1-31 */
  unsigned ft_month:4;  /* 1-12 */
  unsigned ft_year:7;   /* since 1980 */
};

struct date {
  short da_year;
  char  da_day;
  char  da_mon;
};

struct time {
  unsigned char ti_min;
  unsigned char ti_hour;
  unsigned char ti_hund;
  unsigned char ti_sec;
};

struct dfree {
  unsigned df_avail;
  unsigned df_total;
  unsigned df_bsec;
  unsigned df_sclus;
};

#ifdef __cplusplus
extern "C" {
#endif

int bdos(int func, unsigned dx, unsigned al);
int bdosptr(int func, void *dx, unsigned al);
int int86(int ivec, union REGS *in, union REGS *out);
int int86x(int ivec, union REGS *in, union REGS *out, struct SREGS *seg);
int intdos(union REGS *in, union REGS *out);
int intdosx(union REGS *in, union REGS *out, struct SREGS *seg);

int enable(void);
int disable(void);

int getftime(int handle, struct ftime *ftimep);
int setftime(int handle, struct ftime *ftimep);

int getcbrk(void);
int setcbrk(int new_value);

void getdate(struct date *);
void gettime(struct time *);
void setdate(struct date *);
void settime(struct time *);

void getdfree(unsigned char drive, struct dfree *ptr);

void delay(unsigned msec);
int _get_default_drive(void);
void _fixpath(const char *, char *);

#ifdef __cplusplus
}
#endif

#endif
« Последнее редактирование: 23-10-2011 12:19 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #19 : 23-10-2011 12:27 » 

RXL, спасибо Вам, и нижайший поклон!Получил информацию,которую искал!Теперь буду сидеть учить и дальше разгребаться с переключением банков видеопамяти Жаль
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 23-10-2011 12:43 » 

demonhunterus, а, если не секрет, зачем это надо? Чем не устраивают современные API работы с графикой? Там возможностей намного больше.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #21 : 23-10-2011 12:57 » 

RXL, не секрет ) Дали задание - нарисовать прямоугольный треугольник в графическом режиме SVGA с помощью записи данных непосредственно в видеопамять адаптера.Надо справиться и разобраться во всем.Вот и мучаюсь.Но сделать надо.Очень очень надо.Хотя не думаю,что в будущем мне конкретно ЭТО пригодится...
Записан
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #22 : 26-10-2011 16:52 » 

demonhunterus,
Цитата
. . . .
(1)
Понимаю,что char ms[256]-это наш массив-буфер. (1)
(2)
Дальше мы это дело преобразовываем в структуру,чтоб можно было с ней работать,чтоб было 12 полей,как и в исходной,возвращаемой функцией 00h.
(3)A куда приткнуть эти а и b?Как должно выглядеть условие,где мы укажем,что полей у на с будет с 0 до 11?Что-то с утра не могу понять.Это будет цикл?Или не цикл?Я просто такого никогда не делал.И не представляю,как такое сделать.
. . .
(4)
buf1[имя структуры.VideoModePtr]
//,но попытался сделать так
//Код:
buf1[VESAINFO.fpModeTable]!=0x105
и компилятор начал ругаться на использование VESAINFO...

(1) правильно. это область памяти длиной 256 байт  Улыбаюсь
(2) Тут я не согласен. Мы ничего не преобразовываем. В моем примере объявляется указатель на структуру нужного типа - в нем "прописаны" все ее поля - по названиям и подразумевающиеся под названиями смещения.
Воспринимай указатель на структуру как "трафарет" для просмотра области памяти. Мы приложили нужный трафарет к области памяти, куда считалась информация (иниициализировали указатель адресом &buf1[0] или просто buf).
Далее пользуемся благами цивилизации (минимальными) - типа
Код:
VesaInfo *VESAINFO;
VESAINFO = (VesaInfo *) &buf1[0];
//buf1[VESAINFO.fpModeTable[i]]!=0x105  
if ( VESAINFO->fpModeTable[i]!=0x105 ) ..... // или if ( (*VESAINFO).fpModeTable[i]!=0x105 ) ..... //
Перечитай про указатели в С - без них работать будет тяжко и бессмысленно, а вмесе с ASM так и невозможно.
(передача параметров, ссылок)
(3) за a & b   Улыбаюсь   яж писал, - пример. Отсади куданить и погоняй как в (2) с указателями.
(4) компилятор он такой ..... мудрый и умный  Улыбаюсь Если ругается, поделом.
-----------
Может повторы написал - но "так получилось"  Улыбаюсь

для работы с ASM посмотри
http://wasm.ru/ - очень много интересного.

« Последнее редактирование: 26-10-2011 17:08 от DneprSMV » Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines