Народ! Мож кто кинет исходник след. проги: Нужно выйти в защищенный режим, установить видеорежим 111h, организовать буфер размером 640*480 слов, заполнить этот буфер любым числом (например 63488), и вывести содержимое буфера на экран без LFB (с использованием окон). Я конечно понимаю что много прошу, но просто все мои реализации терпят крах, мучаюсь уже неделю...сплю по 5 часов.... короче SOS %)
достаточно взять спецификацию на VBE3 http://www.vesa.org/public/VBE/vbe3.pdf там все по шагам описано
Вот мой КРИВУЩИЙ код под !TASM! Code (Text): .386 RM_seg segment byte public use16 assume cs:RM_seg,ds:PM_seg,ss:RM_stack RM_entry: mov ax,1687h int 2Fh test ax,ax jnz DPMI_error test bl,1 jz DPMI_error mov eax,PM_seg mov ds,ax shl eax,4 mov dword ptr PM_seg_addr,eax or dword ptr GDT_flatCS+2,eax or dword ptr GDT_flatDS+2,eax push eax add eax,offset PM_Stack_Bottom or dword ptr GDT_Canvas+2,eax pop eax mov word ptr DPMI_MODeSwitch,di mov word ptr DPMI_MODeSwitch+2,es add eax,offset DPMI_data shr eax,4 inc ax mov es,ax mov ax,1 call dword ptr DPMI_ModeSwitch jc DPMI_error push ds pop es mov edi,offset GDT mov edx,2 sel_loop: xor ax,ax mov cx,1 int 31h mov word ptr selectors[edx*2],ax mov bx,ax mov ax,000Ch int 31h add di,8 dec dx jns sel_loop push dword ptr Sel_flatCS push offset PM_entry db 066h retf DPMI_error: push cs pop ds mov dx,offset nodpmi_msg mov ah,9h int 21h mov ah,4ch int 21h nodpmi_msg db "Error DMPI$" RM_seg ends RM_stack segment byte stack "stack" use16 db 96 dup (?) RM_stack ends PM_seg segment byte public use32 assume cs:PM_seg,ds:PM_seg,ss:PM_seg GDT label byte GDT_flatCS db 0FFh,0FFh,0h,0h,0h,0FAh,0CFh,0h GDT_flatDS db 0FFh,0FFh,0h,0h,0h,0F2h,0CFh,0h GDT_Canvas db 0FFh,0FFh,0h,0h,0h,0F2h,0CFh,0h GDT_Video db ? PM_entry: ;set segment mov ax,word ptr Sel_flatDS mov ds,ax mov es,ax mov fs,ax mov ss,ax mov esp,offset PM_stack_bottom ;init 111h mov ax,0300h mov bx,0010h xor ecx,ecx mov edi,offset VideoMode int 31h ;get selector for Video mov ax,02h mov bx,0A000h int 31h mov Sel_Video,ax push es push ds mov es,Sel_Video mov ds,Sel_Canvas call ClearBuffer call CopyToScreen pop ds pop es mov ax,0300h mov bx,0021h mov edi,offset Key int 31h mov ax,0300h mov bx,0010h mov edi,offset TextMode int 31h mov ah,4ch int 21h ClearBuffer: mov ecx,614400 clear: dec ecx dec ecx mov word ptr ds:[ecx],10000 jnz clear ret CopyToScreen: mov eax,9 copy: dec eax mov dword ptr fs:num,eax push eax mov ax,cs mov es,ax mov ax,0300h mov bx,0010h mov edi,offset fs:fun5 int 31h pop eax mov es,fs:Sel_Video xor edi,edi mov esi,eax shl esi,16 mov ecx,dword ptr 32768 rep movsw jnz Copy ret Fun5: dd 0,0,0,0 dd 0 num dd 0 dd 0 dd 4F05h dw 0,0 dw 0 dw 0,0,0,0,0,0 VideoMode: dd 0,0,0,0 dd 111h dd 0 dd 0 dd 4F02h dw 0,0 dw 0 dw 0,0,0,0,0,0 Key: dd 0,0,0,0 dd 0h dd 0 dd 0 dd 0700h dw 0,0 dw 0 dw 0,0,0,0,0,0 TextMode: dd 0,0,0,0 dd 0 dd 0 dd 0 dd 03h dw 0,0 dw 0 dw 0,0,0,0,0,0 DPMI_ModeSwitch dd ? PM_seg_addr dd ? selectors: Sel_Canvas dw ? Sel_flatDS dw ? Sel_flatCS dw ? Sel_Video dw ? DPMI_data: db 16384 dup (?) PM_stack_bottom: PM_seg ends end RM_entry
Дык, если без защищенного режима, я смогу буфер сделать только если юзать XMS(EMS), а это оч медленно будет работать %(
Pavia прав, я работаю с VESA через DPMI функцию 0300 прерывания 31. Я переношу буфер в конец программы (делаю дескриптор для буфера с базой на конец программы), и когда пытаюсь записать в конец буфера (дальше 609396 смещения) какой нить цвет, он почему то выводиться на экран. Я так подозреваю это из-за ограничения в 640 кб. Или я не прав?
Гарантированно рабочий вариант (сам пользовался) для VBE2 и VBE1 можно срисовать из библиотеки Allegro версии для DOS/DJGPP. Однако там используется DPMI, как я понял.
Aloner Какие ограничения? 640кб начинаются по адресу A0000. В Досе это и есть буфер видео-карты в графических режимах. В текстовом адрес B8000 - это во всех учебниках написано. Кстати, перед адресом A0000 сидят управляющие данные ДОС, т.ч. буфер нежелательно от "балды" задавать. В DPMI у тебя же есть память выше 1 Мб ?
valterg Пробовал базу селектора, в котором у меня буфер, ставить за 1мб + 64 кб - вываливается (мож я конечно что нить не так делаю). И кстати, приветствуется ли использование DPMI (с точки зрения скорости) ?
Aloner Раз у тебя видео в A0000, значит памяти всего 1мб+64к. Про DPMI мало что знаю. Ясно только, что ты дополнительную память сможешь использовать только для хранения и напрямую туда непросто попасть. Есть ведь и другие раширители памяти под ДОС - dos4gw например, есть версии работающие под NT.
valterg а у тебя есть какой нить исходник под расширитель? и можно ли работая с TASM его юзать (как линковать)?