VESA в защищенном режиме

Тема в разделе "WASM.ASSEMBLER", создана пользователем Aloner, 11 апр 2008.

  1. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Народ!
    Мож кто кинет исходник след. проги:
    Нужно выйти в защищенный режим, установить видеорежим 111h, организовать буфер размером 640*480 слов, заполнить этот буфер любым числом (например 63488), и вывести содержимое буфера на экран без LFB (с использованием окон).
    Я конечно понимаю что много прошу, но просто все мои реализации терпят крах, мучаюсь уже неделю...сплю по 5 часов.... короче SOS %)
     
  2. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Ну и чтобы вас окончательно добить, нужно под TASM %)
     
  3. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
  4. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Спасибо, ща гляну
     
  5. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Мне бы нужно чтоб и на VBE 2 шло
     
  6. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Вот мой КРИВУЩИЙ код под !TASM!
    Код (Text):
    1. .386
    2. RM_seg segment byte public use16
    3.        assume cs:RM_seg,ds:PM_seg,ss:RM_stack
    4. RM_entry:
    5.        mov ax,1687h
    6.        int 2Fh
    7.        test ax,ax
    8.        jnz DPMI_error
    9.        test bl,1
    10.        jz DPMI_error
    11.        mov eax,PM_seg
    12.        mov ds,ax
    13.        shl eax,4
    14.        mov dword ptr PM_seg_addr,eax
    15.        or dword ptr GDT_flatCS+2,eax
    16.        or dword ptr GDT_flatDS+2,eax
    17.        push eax
    18.        add eax,offset PM_Stack_Bottom
    19.        or dword ptr GDT_Canvas+2,eax
    20.        pop eax
    21.        mov word ptr DPMI_MODeSwitch,di
    22.        mov word ptr DPMI_MODeSwitch+2,es
    23.        add eax,offset DPMI_data
    24.        shr eax,4
    25.        inc ax
    26.        mov es,ax
    27.        mov ax,1
    28.        call dword ptr DPMI_ModeSwitch
    29.        jc DPMI_error
    30.        push ds
    31.        pop es
    32.        mov edi,offset GDT
    33.        mov edx,2
    34. sel_loop:
    35.        xor ax,ax
    36.        mov cx,1
    37.        int 31h
    38.        mov word ptr selectors[edx*2],ax
    39.        mov bx,ax
    40.        mov ax,000Ch
    41.        int 31h
    42.        add di,8
    43.        dec dx
    44.        jns sel_loop
    45.        push dword ptr Sel_flatCS
    46.        push offset PM_entry
    47.             db 066h
    48.        retf
    49. DPMI_error:
    50.        push cs
    51.        pop ds
    52.        mov dx,offset nodpmi_msg
    53.        mov ah,9h
    54.        int 21h
    55.        mov ah,4ch
    56.        int 21h
    57. nodpmi_msg db "Error DMPI$"
    58. RM_seg ends
    59.  
    60. RM_stack segment byte stack "stack" use16
    61.          db 96 dup (?)
    62. RM_stack ends
    63.  
    64. PM_seg segment byte public use32
    65.        assume cs:PM_seg,ds:PM_seg,ss:PM_seg
    66. GDT label byte
    67. GDT_flatCS db 0FFh,0FFh,0h,0h,0h,0FAh,0CFh,0h
    68. GDT_flatDS db 0FFh,0FFh,0h,0h,0h,0F2h,0CFh,0h
    69. GDT_Canvas db 0FFh,0FFh,0h,0h,0h,0F2h,0CFh,0h
    70. GDT_Video  db ?
    71. PM_entry:
    72.        ;set segment
    73.        mov ax,word ptr Sel_flatDS
    74.        mov ds,ax
    75.        mov es,ax
    76.        mov fs,ax
    77.        mov ss,ax
    78.        mov esp,offset PM_stack_bottom
    79.        ;init 111h
    80.        mov ax,0300h
    81.        mov bx,0010h
    82.        xor ecx,ecx
    83.        mov edi,offset VideoMode
    84.        int 31h
    85.        ;get selector for Video
    86.        mov ax,02h
    87.        mov bx,0A000h
    88.        int 31h
    89.        mov Sel_Video,ax
    90.        push es
    91.        push ds
    92.        mov es,Sel_Video
    93.        mov ds,Sel_Canvas
    94.        call ClearBuffer
    95.        call CopyToScreen
    96.        pop ds
    97.        pop es
    98.        mov ax,0300h
    99.        mov bx,0021h
    100.        mov edi,offset Key
    101.        int 31h
    102.        mov ax,0300h
    103.        mov bx,0010h
    104.        mov edi,offset TextMode
    105.        int 31h
    106.        mov ah,4ch
    107.        int 21h
    108. ClearBuffer:
    109.        mov ecx,614400
    110.        clear:
    111.        dec ecx
    112.        dec ecx
    113.        mov word ptr ds:[ecx],10000
    114.        jnz clear
    115. ret
    116. CopyToScreen:
    117.        mov eax,9
    118.        copy:
    119.        dec eax
    120.        mov dword ptr fs:num,eax
    121.        push eax
    122.        mov ax,cs
    123.        mov es,ax
    124.        mov ax,0300h
    125.        mov bx,0010h
    126.        mov edi,offset fs:fun5
    127.        int 31h
    128.        pop eax
    129.        mov es,fs:Sel_Video
    130.        xor edi,edi
    131.        mov esi,eax
    132.        shl esi,16
    133.        mov ecx,dword ptr 32768
    134.        rep movsw
    135.        jnz Copy
    136. ret
    137. Fun5:
    138.     dd 0,0,0,0
    139.     dd 0
    140. num dd 0
    141.     dd 0
    142.     dd 4F05h
    143.     dw 0,0
    144.     dw 0
    145.     dw 0,0,0,0,0,0
    146. VideoMode:
    147.   dd 0,0,0,0
    148.   dd 111h
    149.   dd 0
    150.   dd 0
    151.   dd 4F02h
    152.   dw 0,0
    153.   dw 0
    154.   dw 0,0,0,0,0,0
    155. Key:
    156.   dd 0,0,0,0
    157.   dd 0h
    158.   dd 0
    159.   dd 0
    160.   dd 0700h
    161.   dw 0,0
    162.   dw 0
    163.   dw 0,0,0,0,0,0
    164. TextMode:
    165.   dd 0,0,0,0
    166.   dd 0
    167.   dd 0
    168.   dd 0
    169.   dd 03h
    170.   dw 0,0
    171.   dw 0
    172.   dw 0,0,0,0,0,0
    173. DPMI_ModeSwitch dd ?
    174. PM_seg_addr dd ?
    175. selectors:
    176. Sel_Canvas dw ?
    177. Sel_flatDS dw ?
    178. Sel_flatCS dw ?
    179. Sel_Video  dw ?
    180. DPMI_data:
    181.          db 16384 dup (?)
    182. PM_stack_bottom:
    183. PM_seg ends
    184.        end RM_entry
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    тогда забудь о защищенном режиме
     
  8. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Дык, если без защищенного режима, я смогу буфер сделать только если юзать XMS(EMS), а это оч медленно будет работать %(
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Aloner
    поддержка защищенного режима есть только в VBE3+
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    rei3er
    Он через DPMI вызывает. Да и можно в виртуальном режиме вызывать.
     
  11. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Pavia прав, я работаю с VESA через DPMI функцию 0300 прерывания 31.
    Я переношу буфер в конец программы (делаю дескриптор для буфера с базой на конец программы), и когда пытаюсь записать в конец буфера (дальше 609396 смещения) какой нить цвет, он почему то выводиться на экран. Я так подозреваю это из-за ограничения в 640 кб. Или я не прав?
     
  12. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Гарантированно рабочий вариант (сам пользовался) для VBE2 и VBE1 можно срисовать из библиотеки Allegro версии для DOS/DJGPP. Однако там используется DPMI, как я понял.
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Aloner
    Какие ограничения? 640кб начинаются по адресу A0000. В Досе это и есть буфер видео-карты
    в графических режимах. В текстовом адрес B8000 - это во всех учебниках написано.
    Кстати, перед адресом A0000 сидят управляющие данные ДОС, т.ч. буфер нежелательно от "балды" задавать. В DPMI у тебя же есть память выше 1 Мб ?
     
  14. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    valterg
    Пробовал базу селектора, в котором у меня буфер, ставить за 1мб + 64 кб - вываливается (мож я конечно что нить не так делаю).
    И кстати, приветствуется ли использование DPMI (с точки зрения скорости) ?
     
  15. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    CyberManiac
    Не подскажешь где взять данную библиотеку?
     
  16. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Aloner
    Раз у тебя видео в A0000, значит памяти всего 1мб+64к. Про DPMI мало что знаю. Ясно только, что ты дополнительную память сможешь использовать только для хранения и напрямую туда непросто попасть.
    Есть ведь и другие раширители памяти под ДОС - dos4gw например, есть версии работающие под NT.
     
  17. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Aloner
    http://www.talula.demon.co.uk/allegro/
     
  18. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    CyberManiac
    Спасибо!!! Ща гляну!
     
  19. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    valterg
    а у тебя есть какой нить исходник под расширитель? и можно ли работая с TASM его юзать (как линковать)?
     
  20. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    CyberManiac
    Глянул... дык там сишник, а я сним незнаком вообще %(