demonhunterus
Интересующийся
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
Пол:
|
|
« Ответ #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
Интересующийся
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
Пол:
|
|
« Ответ #3 : 14-10-2011 19:36 » |
|
Сохраняй ES и восстанавливай потом! Ведь компилятор не зря это делает - может боком выйти.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
DneprSMV
|
|
« Ответ #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
Интересующийся
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
|
|
« Ответ #6 : 22-10-2011 14:32 » |
|
demonhunterus, кажется так 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 не структура, а массив. Соответственно в нем полей нет. Делай ход конем который я привел выше будет нечто такое while (p_ms->VideoModePtr[i]!=0x0FFF) . . . . (чистить буфер само собой низзя, пока работает while)
|
|
« Последнее редактирование: 22-10-2011 14:46 от DneprSMV »
|
Записан
|
"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
|
|
|
demonhunterus
Интересующийся
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
|
|
« Ответ #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
Интересующийся
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
Пол:
|
|
« Ответ #10 : 23-10-2011 05:56 » |
|
demonhunterus, фигню ты нагуглил: см. VESA VBE версии 3.0 - меньше не имеет смысла.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
demonhunterus
Интересующийся
Offline
|
|
« Ответ #11 : 23-10-2011 06:01 » |
|
RXL, Океееей.Сейчас буду смотреть.А почему не имеет смысла?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #12 : 23-10-2011 06:11 » |
|
Функциональности недостаточно. Поверь.
Была бы в инете материальная дырка, я бы тебе свою книжку по видео BIOS отдал бы: Фролов А.В., Фролов Г.В., Программирование видеоадаптеров, Москва, Диалог-МИФИ, 1995, ISBN 5-86404-066-5.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
demonhunterus
Интересующийся
Offline
|
|
« Ответ #13 : 23-10-2011 09:34 » |
|
RXL, А нужен мне весь этот функционал?По сути мне только unsigned short far *fpModeTable; нужен,для того,чтобы проверить в этом списке,есть ли там режим 105h...
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #14 : 23-10-2011 09:41 » |
|
Лучше все таки использовать "современное" API 15-летней давности, чем еще более древнее.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
demonhunterus
Интересующийся
Offline
|
|
« Ответ #15 : 23-10-2011 09:49 » |
|
RXL,хм,ну ладно,поищу VESA.h для 3.0 версии,хоть много лишних полей будет,которые я совсем не буду использовать )) Спасибо. P.S.:А по поводу буферизации и чтения из буфера ничего не подскажете?Я так понял,что задав буффер массивом я выбрал не самый лучший вариант и прийдется подолбаться с этим делом как-то так,как писали выше,может есть какой-то другой вариант,как это лучше сделать?Задать буффер структурой или может как-то иначе? Добавлено через 1 час, 33 минуты и 35 секунд:Тааааак.Вот нашел кое-что. #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, ®s, ®s, &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, ®s, ®s, &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?Это название юниона и как к нему обращаться или как? --- что за структура такая?Я так понял, это всё нужно для того,чтоб то,что я делал как ассемблерную вставку, сделать в виде 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
Пол:
|
|
« Ответ #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
Интересующийся
Offline
|
|
« Ответ #17 : 23-10-2011 12:02 » |
|
RXL, спасибо,с этим разобрался. Осталось непонятно только это: regs.x.cx = ptrVesaInfo->fpModeTable[i]; //сх - номер режима SVGA. Непонятно почему regs.X.cx. int86x(0x10, ®s, ®s, &segregs); //прерывание 0х10, а потом эти вот ®s,®s,&sregs не понимаю что значат и зачем.
|
|
« Последнее редактирование: 23-10-2011 12:11 от demonhunterus »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #18 : 23-10-2011 12:12 » |
|
Значит так: 1. Открывай папку со своим компилятором. 2. Ищи там файл dos.h. 3. Читай файл - там ответы на твои "X" и т.п. Не ищи магии там, где ее отродясь не было. Все слишком банально. Также пройдись по заголовкам, которые будут подсоединены внутри dos.h через include. Добавлено через 6 минут и 2 секунды:#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
Интересующийся
Offline
|
|
« Ответ #19 : 23-10-2011 12:27 » |
|
RXL, спасибо Вам, и нижайший поклон!Получил информацию,которую искал!Теперь буду сидеть учить и дальше разгребаться с переключением банков видеопамяти
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #20 : 23-10-2011 12:43 » |
|
demonhunterus, а, если не секрет, зачем это надо? Чем не устраивают современные API работы с графикой? Там возможностей намного больше.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
demonhunterus
Интересующийся
Offline
|
|
« Ответ #21 : 23-10-2011 12:57 » |
|
RXL, не секрет ) Дали задание - нарисовать прямоугольный треугольник в графическом режиме SVGA с помощью записи данных непосредственно в видеопамять адаптера.Надо справиться и разобраться во всем.Вот и мучаюсь.Но сделать надо.Очень очень надо.Хотя не думаю,что в будущем мне конкретно ЭТО пригодится...
|
|
|
Записан
|
|
|
|
DneprSMV
|
|
« Ответ #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 »
|
Записан
|
"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
|
|
|
|