Адресация,что-ли? |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
Адресация,что-ли? |
leone.incognito |
24.08.2009 23:41
Сообщение
#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. -------------------- "Непросто тем,кто полагается на истину авторитета,вместо того,чтобы полагаться на авторитет истины"
Джэрольд Мэсси |
volvo |
25.08.2009 0:02
Сообщение
#2
|
Гость |
Тебе обязательно это делать именно во встроенном ассемблере? Почему не хочешь перейти на TASM, например?
А вообще, насколько я помню, это делалось так: function IsInstalled(var Buffer: TBuffer): Boolean; assembler;где Buffer - это и есть область памяти размером в 256 байт... |
левон.инкогнито |
25.08.2009 14:48
Сообщение
#3
|
Гость |
почему пишет ошибку при объявлении переменной типом Tbuffer?
|
volvo |
25.08.2009 14:55
Сообщение
#4
|
Гость |
Сам тип TBuffer описан выше по тексту программы? Можно - просто массивом из 256 (как минимум) байт, можно - как положено:
type |
leone.incognito |
26.08.2009 0:13
Сообщение
#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? Ещё раз спасибо. -------------------- "Непросто тем,кто полагается на истину авторитета,вместо того,чтобы полагаться на авторитет истины"
Джэрольд Мэсси |
volvo |
26.08.2009 0:58
Сообщение
#6
|
Гость |
Цитата Тут очепятка с word Нет... Я ж не предлагаю тебе TWordArray использовать в качестве буффера... Указатель на TWordArray присутствует 6-ым полем в структуре. А размер самой структуры TBuffer равен 256 байт.Цитата Значит,код будет выглядеть примерно по-следуйщему,если просто с массивом? Если с массивом - то вот так:type TBuffer = array[0 .. 255] of byte;, не придумывай сам себе проблемы. Пишешь на Паскале со вставками - так пиши именно на Паскале, а не пытайся ВСЕ подряд делать на вставках. Хочешь все делать на ассемблере - пиши на ассемблере. Цитата Тут как-бы без записей(я их не понимаю как-то...),type и прочего... А не рановато тебе с Vesa-ой работать, если в записях не разобрался? |
leone.incognito |
26.08.2009 14:52
Сообщение
#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'е? -------------------- "Непросто тем,кто полагается на истину авторитета,вместо того,чтобы полагаться на авторитет истины"
Джэрольд Мэсси |
leone.incognito |
3.10.2009 16:57
Сообщение
#8
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Мужской Реальное имя: Левон Репутация: -4 |
Спасибо.Понял всё.
-------------------- "Непросто тем,кто полагается на истину авторитета,вместо того,чтобы полагаться на авторитет истины"
Джэрольд Мэсси |
andriano |
3.10.2009 17:41
Сообщение
#9
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Вообще-то в конце статьи (на 4 странице) приведены исходники.
В том числе функции GetVesaInfo, которая делает именно то, о чем ты спрашиваешь. Только там используется не простой массив байтов, а структура, которая существенно облегчает доступ к возвращаемым параметрам. Сама процедура function GetVESAInfo(Buffer:pointer):boolean; {информация о VESA}А в структуру я бы добавил по минимуму еще один параметр TBuffer = recordПравда, на современных видеокартах возвращаемое значение будет далеко от реальности. Впрочем, DOS-приложениям это не нужно, им нужно максимум разместить экранный буфер, а хранение текстур в видеопамяти для них неактуально. Сообщение отредактировано: andriano - 3.10.2009 17:46 |
Текстовая версия | 23.09.2024 17:59 |