IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> Адресация,что-ли?
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Мужской
Реальное имя: Левон

Репутация: -  -4  +


Помогите пожалуста сообразить...Почитал про VESA 1.2 в статье С.А.Андрианова.Понравилось.
http://www.osp.ru/pcworld/1998/07/159374/

Но у меня есть проблеммммма.
Прямо с нулевой функции,которая возвращает инфу о наличии весы.
Как организовать эти 256 байт для буфера и записать его адрес в регистры es:di ?

Цитата

Функция 0 возвращает информацию о версии VESA и производителе видеоплаты. Перед ее вызовом необходимо выделить в нижней памяти буфер длиной 256 байт. В версии 2.0 функция позволяет получить некоторую дополнительную информацию, если в первые четыре байта выделенного буфера предварительно записать 4-байтную сигнатуру "VBE2". При этом размер буфера должен составлять 512 байт.

На входе:
AX = 4F00h;
ES:DI - указатель на буфер,
в который надо поместить информацию,
в формате сегмент:смещение
(обратите внимание: именно сегмент
реального режима, а не селектор защищенного).
На выходе:
AX - статус завершения.

Пишу в компиляторе паскаля,не 32.


--------------------
"Непросто тем,кто полагается на истину авторитета,вместо того,чтобы полагаться на авторитет истины"
Джэрольд Мэсси
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Тебе обязательно это делать именно во встроенном ассемблере? Почему не хочешь перейти на TASM, например?

А вообще, насколько я помню, это делалось так:

function IsInstalled(var Buffer: TBuffer): Boolean; assembler;
asm
mov ax, 4F00h
les di, Buffer
int 10h
end;
где Buffer - это и есть область памяти размером в 256 байт...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






почему пишет ошибку при объявлении переменной типом Tbuffer?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Сам тип TBuffer описан выше по тексту программы? Можно - просто массивом из 256 (как минимум) байт, можно - как положено:
type
PWordArray = ^TWordArray;
TWordArray = array [0..256] of Word;

TBuffer = record
Sig: array [0..3] of Char;
UVersion: Byte;
LVersion: Byte;
Manufacturer: Pointer;
Flag: LongInt;
Modes: PWordArray;
Padding: array [19..256] of Byte;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Мужской
Реальное имя: Левон

Репутация: -  -4  +


Спасибо!))...но я всё равно до конца не понял.
Значит,код будет выглядеть примерно по-следуйщему,если просто с массивом?

Код

var
pointer:=^bufffffffffffer;{это как-бы указатель на адрес,так?}
bufffffffffffer:array[0..255]of byte;
begin
asm
  mov   ax, 4F00h
  les   di, pointer
  int   10h
end;
end.


Тут как-бы без записей(я их не понимаю как-то...),type и прочего...

Код

TWordArray = array [0..256] of Word;

Тут очепятка с word,или 512 байт выделяется для VBE2?
Ещё раз спасибо.


--------------------
"Непросто тем,кто полагается на истину авторитета,вместо того,чтобы полагаться на авторитет истины"
Джэрольд Мэсси
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Тут очепятка с word
Нет... Я ж не предлагаю тебе TWordArray использовать в качестве буффера... Указатель на TWordArray присутствует 6-ым полем в структуре. А размер самой структуры TBuffer равен 256 байт.

Цитата
Значит,код будет выглядеть примерно по-следуйщему,если просто с массивом?
Если с массивом - то вот так:
type TBuffer = array[0 .. 255] of byte;
function IsInstalled(var Buffer: TBuffer): Boolean; assembler;
asm
mov ax, 4F00h
les di, Buffer
int 10h
end;

var
buff: TBuffer;
begin
if IsInstalled(buff) then begin
{ Здесь работаешь дальше }
end
else writeln('Vesa не установлена...');
end.
, не придумывай сам себе проблемы. Пишешь на Паскале со вставками - так пиши именно на Паскале, а не пытайся ВСЕ подряд делать на вставках. Хочешь все делать на ассемблере - пиши на ассемблере.

Цитата
Тут как-бы без записей(я их не понимаю как-то...),type и прочего...
А не рановато тебе с Vesa-ой работать, если в записях не разобрался?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Мужской
Реальное имя: Левон

Репутация: -  -4  +


Так!Я,кажется,уже что-то понимаю.Значит ,в этом коде
Код
type
  PWordArray = ^TWordArray;
  TWordArray = array [0..256] of Word;

  TBuffer = record
    Sig: array [0..3] of Char;
    UVersion: Byte;
    LVersion: Byte;
    Manufacturer: Pointer;
    Flag: LongInt;
    Modes: PWordArray;
    Padding: array [19..256] of Byte;
  end;

Modes- указатель?На адрес в буффере,где записываются режимы(так)?
Про то,что под буффер выделяется запись TBuffer(ведь так?)я понял.
То есть, как бы получается связка между TWordArray и TBuffer ,где TWordArray используется для объявления
указателя в TBuffer.Так ведь?

Дальше.
Код

function IsInstalled(var Buffer: TBuffer): Boolean; assembler;
asm
  mov   ax, 4F00h
  les   di, Buffer
  int   10h
end

Тут Buffer придаётся значение TBuffer,так?
Воть.
Про записи прочитал.Про type прочитал.Про 0 функцию перечитал,и наконец-то понял,зачем там modes как указатель.Гы.
Нужен ответ.Пожааааалуста.

Добавлено через 7 мин.
Ещё напишу!
Если писать ассемблерный код,а потом использовать его в Паскале,то это obj?В MASM'е?


--------------------
"Непросто тем,кто полагается на истину авторитета,вместо того,чтобы полагаться на авторитет истины"
Джэрольд Мэсси
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Мужской
Реальное имя: Левон

Репутация: -  -4  +


Спасибо.Понял всё.


--------------------
"Непросто тем,кто полагается на истину авторитета,вместо того,чтобы полагаться на авторитет истины"
Джэрольд Мэсси
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Вообще-то в конце статьи (на 4 странице) приведены исходники.
В том числе функции GetVesaInfo, которая делает именно то, о чем ты спрашиваешь.
Только там используется не простой массив байтов, а структура, которая существенно облегчает доступ к возвращаемым параметрам.

Сама процедура
function GetVESAInfo(Buffer:pointer):boolean; {информация о VESA}
var
RetCode : word;
begin
asm
mov ax,$4f00
les di,Buffer
int $10
mov RetCode,ax
end;
GetVESAInfo := RetCode = $004F;
end;
А в структуру я бы добавил по минимуму еще один параметр
  TBuffer = record
Sig: array [0..3] of Char;
UVersion: Byte;
LVersion: Byte;
Manufacturer: Pointer;
Flag: LongInt;
Modes: PWordArray;
TotalMemory : word;
Padding: array [20..255] of Byte;
end;

Правда, на современных видеокартах возвращаемое значение будет далеко от реальности. Впрочем, DOS-приложениям это не нужно, им нужно максимум разместить экранный буфер, а хранение текстур в видеопамяти для них неактуально.

Сообщение отредактировано: andriano -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 15:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name