Помощь - Поиск - Пользователи - Календарь
Полная версия: VESA не работает ????
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
ShadowMaverick
:D VESA графика из под виндовс не работает
почему кто знает
-----
из по DOS работает
а из под WINDOWS нет почему ????
-----
при установыке пользуюсь ASM функциями

mov ah,4fh
mov al,2h
mov bx,10eh ;320*200 65536 color

------
режимов много есть и на 16 млн цветов
Dark
Не знаю, ю меня тоже есть модуль, написанный мной, но у меня все работает... Может у тебя видеокарта такая? попробуй этот режим протестировать:

program testmode;

var
          s:string;
          p:pointer;
          ok:byte;
 
begin
p:=ptr(seg(s),ofs(s));
    asm
        les di,p
        mov ax,4f01h  
        mov cx,010eh
        int 10h
        mov [ok],1
        cmp ax,4f              {Если проблема - здесь будет другой код}
        jz @exit  
        mov [ok],0

@exit:
    end;

if (ok=1) then write('Все в порядке') else write('Нифига не пашет :-((');
     
end.


Если ничего не выйдет пиши, будем думать дальше.

Всего хорошего!
ShadowMaverick
SHADOW MAVERICK он же просто SHADOW т.к. пароль про...


да нет в DOSe все пашет я РЕГИСТРЫ смотрю там правильное щначение
возвращается
---
а в ВИНДЕ WINDOWS просто выкидывает прогу как процесс (убив)
---
что делать
---
XP WIND у меня
Dark
Ну как говорится, если водка мешает работе, бросай нахрен... такую работу ;D

У меня WinXP тоже глючит с досприложениями, т.е. сначало я могу работать в паскале, а через некоторое время я должен переходить в оконный режим - короче фигня!!! >:(

Но слава богу XP у меня на работе, дома - Вий 98(еще названия - вынь 98, маздай короче...)   ;D

А ты где берешь документацию, не у того же автора что и я?  ;D

Давай еще чего нибудь попишем про VESA?
Shadow
:D В.Ю. Пирогов 320 рубл стоит книга интересная но лин ткаим языком
написанная
Dark
Не, у меня Павел Соколенко - Программирование графики для IBM PC
Тоже интересно  ;D
А давай будем обмениваться идеями и алгоритмами на asm по VESA? :smile.gif
Shadow
:D ню я то непроч моно опыта наберусь т.к. напрямую с видое памятью
плохо умею работать как бы то что в у книге было написано такое
ощущения что секрет
--
например что такое битовые плоскости и с чем их едят
ето вроде с VESA
----
они как то за цвет отвечают и их 4
mj
Ух блин мучался я с этим, но вроде как добил...

Цитата
например что такое битовые плоскости и с чем их едят
ето вроде с VESA
----
они как то за цвет отвечают и их 4
Я ваще не перевариваю зачем эти бытовые плоскости, так как меняя 1 байт, мы меняем сразу 8 пикселов и соответственно чтобы изменить цвет точки приходится читать 4 байта (по 1 из каждой плоскости), менять в них бит отвечающий за нужный нам пиксел и записывать эти 4 байты обратно...
Также там есть что то похожее на маску, это чтобы лишний раз бит не читать, задаём маску и потом пишем...
Самое хорошее то, что эти плоскости используются тока в 16 цветном режиме  :D
Shadow
:D да будует проклято все семейство видоеадаптеров с их нестандартными системами записи в видеопамять
---
так посмотрел оказывается разный рехим разная система записи
---

Const color : Array [0..10,0..10] Of byte =
((00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00,00),
(00,00,16,17,18,19,18,17,16,00,00),
(00,00,17,20,23,27,23,20,17,00,00),
(00,00,18,23,28,29,28,23,18,00,00),
(00,00,19,27,31,15,31,27,19,00,00),
(00,00,18,23,28,29,28,23,18,00,00),
(00,00,17,20,23,27,23,20,17,00,00),
(00,00,16,17,18,19,18,17,16,00,00),
(00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00,00));


var
gr,gr1,d,r,e,x:Integer;
y:Word;
b,bb,c,co:byte;
label we,we1,we2,we3;


BEGIN
{gr1:=0;
gr:=InstalluserDriver('svga256',nil);
Initgraph(gr,gr1,'');}

asm
mov ax,0013h
int 10h
mov ax,0a000h
mov es,ax
mov bx,10000

end;
for e:=0 to 10 do
for x:=0 to 10 do begin
c:=color[e,x];
asm
mov al,c

cmp bx,10011
je we
cmp bx,10331
je we
cmp bx,10651
je we
cmp bx,10971
je we
cmp bx,11291
je we
cmp bx,11611
je we
cmp bx,11931
je we
cmp bx,12251
je we
cmp bx,12571
je we
cmp bx,12891
je we
jmp we1

we:
add bx,320
sub bx,11

we1:
inc bx
mov es:[bx],al


end;
end;
asm
mov ah,0
int 16h
end;
end.


вот как можно улучшить ету блин хр...
---
и еще если сменить разрешение на 800*600 256 цветов
то почемуто до конца экрана его не довести и он в нескольких местах сразу появляется
----
GLuk
Цитата
Самое хорошее то, что эти плоскости используются тока в 16 цветном режиме  :D


И в ближайшее будущее, больше такой херни не ожидается...  :)
Когда писал первую прогу для широкого употребления, выбрал mode 13h, но мне сказали, что это несерьезно, следственно оставался только 640х480х16 и пришлось сильно повыпендриваться, чтобы осознать как записать этот проклятый пиксель, а не сразу 8. Инфы на тот момент вообще не было (no inet), учебника Фаронова тоже...

Вообще, самое удобное в этом режиме  было очищать экран или рисовать прямоугольники... smile.gif
GLuk
Цитата
Самое хорошее то, что эти плоскости используются тока в 16 цветном режиме  :D


И в ближайшее будущее, больше такой херни не ожидается...  :)
Когда писал первую прогу для широкого употребления, выбрал mode 13h, но мне сказали, что это несерьезно, следственно оставался только 640х480х16 и пришлось сильно повыпендриваться, чтобы осознать как записать этот проклятый пиксель, а не сразу 8. Инфы на тот момент вообще не было (no inet), учебника Фаронова тоже...

Вообще, самое удобное в этом режиме  было очищать экран или рисовать прямоугольники... smile.gif

Shadow плюнь ты на это, это нужно только в плане ознакомления...
Shadow
:D хыть тфу
----
но всетаки интересно тем что ето быстро работает
Dark
Ну в общем-то я делал бы это так:... :D
Const color : Array [0..10,0..10] Of byte =
((00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00,00),
(00,00,16,17,18,19,18,17,16,00,00),
(00,00,17,20,23,27,23,20,17,00,00),
(00,00,18,23,28,29,28,23,18,00,00),
(00,00,19,27,31,15,31,27,19,00,00),
(00,00,18,23,28,29,28,23,18,00,00),
(00,00,17,20,23,27,23,20,17,00,00),
(00,00,16,17,18,19,18,17,16,00,00),
(00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00,00));


BEGIN
asm
mov ax,0013h
int 10h
mov ax,0a000h
mov es,ax
push ds
push seg color
pop ds
push offset color
pop si
mov di,10000
mov cx,11
mov dx,11
@l2:
push cx
mov cx,dx
@l1:
movsb {<=> mov es:di, ds:si}
loop @l1
add di,309
pop cx
loop @l2
pop ds
mov ah,0
int 16h
mov ax,0003h
int 10h
end;
end.



Почти чистый ассемблер получился ;D
Если чего не ясно - могу пояснить...
{только не панимаю, зачем указывать точку вывода через прямое число, а не через x,y... вроде понятнее и юзабельнее ???}
Shadow
Const color : Array [0..10,0..10] Of byte = 
((00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00,00),
(00,00,16,17,18,19,18,17,16,00,00),
(00,00,17,20,23,27,23,20,17,00,00),
(00,00,18,23,28,29,28,23,18,00,00),
(00,00,19,27,31,15,31,27,19,00,00),
(00,00,18,23,28,29,28,23,18,00,00),
(00,00,17,20,23,27,23,20,17,00,00),
(00,00,16,17,18,19,18,17,16,00,00),
(00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00,00));


BEGIN
asm
mov ax,0013h
int 10h
mov ax,0a000h
mov es,ax
push ds ;сохран в стеке ds
push seg color ;сохраняем массив adres
pop ds ;в ds запихив адрес color
push offset color ; сохран аддрес color
pop si ;in si addr начальный color
mov di,10000 ;????
mov cx,11 ;
mov dx,11 ;
@l2:
push cx ;cx в стек 11 ;10
mov cx,dx ;in cx<dx ; cx=11
@l1:
;?????персылка строки байтов 11 из сolor ds в видео es
;по x смещение что ли
movsb {<=> mov es:di, ds:si}

loop @l1 ;cx-1
add di,309 ;1000+309 по y смещен
pop cx ;in cx<11
loop @l2 ;cx-1
pop ds ;uerase ds
mov ah,0 ;wait
int 16h ;key
mov ax,0003h ;colse
int 10h ;graph
end;
end.

---------
там где вопросы по подробнее пожалуйста
Dark
Обьясняю так:

Я сохраняю адрес картинки в ds:si, адрес точки куда выводить - es:di

mov di,10000 - это то же, что в твоем примере mov bx,10000
т.е. будет выводиться по адресу A000h:10000 (адрес первой точки)

Значение сегмента ds сохраняется потому, что если его потом не востановить - будут глюки в паскале (можешь попробовать его закоментировать)

Далее собственно у меня цикл типа

for  i:=0 to 10 do
 for  j:=0 to 10 do

команда movsb помещает содержимое ds:[si] в es:[di] и увеличивает si и di на 1. Т.е я фактически помещаю точку из массива color на экран :-)

в сх я храню кол-во линий, в dx - колво точек в линии.

Рисую я по линиям:
@l1:  
 movsb
 loop @l1  

И еще : заметь, у меня команда

pop cx
loop @l2

уменьшает cx на 1, а далее я это изменение СОХРАНЯЮ!
(push cx)

add di,309 - адрес следующей строки (320-11)

Ну разбирайся... ;D
Shadow
в cx колво байтов
:D моно    rep movsb    поставить
GLuk
Цитата
в cx колво байтов
:D моно    rep movsb    поставить


Или rep movsd...  :)
Dark
Вот твой вывод точки в режиме 320*200, а я тебе предлагаю свой, чуть быстрей:

Procedure PixelOut(x,y:Word;c:Byte); 
label we,exit;
Begin
y:=y*320;            {rachet coordin for Y}

asm
xor ax,ax           {AX in zero}
mov bx,x            {in di 1000 smeshenie v video memory}
mov cx,y            {in CX znachen y }
add bx,cx           {sum BX and CX}
mov al,c        {in AL color}
cmp bx,63999    {conez video buff}
je we           {then exit}
mov es:[bx],al  {in vid memory es:di out ds:si}
we:
end;
end;



можно вот так:


Procedure putpixel(x,y:word;col:byte);
asm
mov ax,[y]
mov bx,ax
shl ax,6                ;y shl 6 =y*64
shl bx,8                ;y shl 8 =y*256
add ax,bx              ;y*(64+256)=y*320
mov di,ax
add di,[x]              ;es:di - адрес точки
mov al,col
stosb                      ;es:[di] = col



И еще:
 cmp bx,63999    {conez video buff} 
je we           {then exit}

неправильно, так как если указан адрес, выходящий за рамки сегмента, то bx=0+то, что за сегментом... а ты сравниваешь РАВЕНСТВО вх и 63999... а надо так:
 cmp bx,63999    {conez video buff} 
ja we           {then exit} {jamp above}

;D
Shadow
:D
=-=-=
да базара нет все путем
=-=-=-=
согласен  чуть ошибся с флажками с кем не бывает
-=-=
:-/
BlackShadow
Люди у меня такая же проблема!
WinXP мне позволяет получать инфу о VESA и о режимах через INT10h. Но не более.
Win98 даёт мне возможность даже установить какой-либо режим. И всё. При попытке вывода изображения... Насколько я разобрался видеопамять у меня делится в совсем уж загадочном порядке : банк по 64кб, в банке по 64 блока (1кб) в блоке по четыре строки (256б), а вот сколько пикселёв в строке зависит от режима. Причём в режиме, где 24 BPP я вообще ничего не понял.

Может кто-нибудь объяснить что тут к чему, куда это сувать и как с этим бороться???
Dark
Кинь исходник сюда или на darkmaze@yandex.ru - посмотрю... ;D
GLuk
2 BlackShadow: Выложи исходник, посмотрим...
Shadow
:D
-=-=-=
запрыгнив ASM раздел
-=-=-=-
там и точка есть и просмотр 24 битного файла BMP
Sergeuz
Хай. Случайно сюда забрёл. Два года назад написал паскалевский юнит VESA64k;
Работает, правда, только в реальном режиме проца и с шестнадцатибитными модами, но есть всякие прикольные примочки
вроде регулируемого уровня прозрачности для всех процедур вывода, антиалиасинга, курсора мыши с тенью (как Win2k),
поддержки XMS и ещё много чего... Если нужны исходники сообщите.

Да, как заставить всё это работать в WinXP мне тоже интересно.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.