Помощь - Поиск - Пользователи - Календарь
Полная версия: 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 мне тоже интересно.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.