ports+videomode+640x480x16+tiny - интересно...

Тема в разделе "WASM.ZEN", создана пользователем b0oh, 26 сен 2006.

  1. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    Воть... Есть вопрос... Много вопросов ))
    Ассемблер изучаю недолго (неделя), предупреждаю всразу, поэтому на глупые вопросы не обращайте внимания ))

    Вопрос намбер 1:
    Как при помощи портов запрограммировать видеоадаптер на режим 640x480x16, без использования прерываний, низкоуровнево как только можно представить с подробным описанием, есть идеи по поводу записи в регистры CRT:
    (установка режима 80x30)
    Код (Text):
    1.     CODE    segment
    2.     assume  cs:CODE, ds:CODE, es:CODE, ss:CODE
    3.        
    4.     .186                            ; команда outsw
    5.     org     100h
    6.        
    7. Start:
    8.  
    9.     mov     ax, 0003h               ; MODE (80x25) его будем менять
    10.     int     10h
    11.        
    12.     mov     dx, 03CCh               ; регистр вывода на чтение
    13.     in      al, dx
    14.        
    15.     mov     dx, 03C2h               ; регистр вывода на запись
    16.     or      al, 00C0h               ; установить полярность 1, 1 для 480 строк
    17.     out     dx, al
    18.        
    19.     mov     dx, 03D4h               ; порт CRT
    20.     mov     si, offset Crt480       ; DS:SI адресс таблицы данных для CRT
    21.     mov     cx, nCrt480_l           ; её длинна
    22.     rep     outsw                   ; 03D4h - 03D5h порты
    23.        
    24.     push    0040h
    25.     pop     es                      ; BIOS rewrite
    26.    
    27.     mov     byte ptr es:[84h], 29   ; 0040:0084 - число строк (тута в биосе находиться информация о режиме)
    28.                
    29.     ret
    30.        
    31. Crt480  dw  0C11h   ; 11h - 7 бит разрешает писать в другие регистры
    32.         dw  0B06h, 3E07h, 0EA10h, 0DF12h, 0E715h, 0416h ; сами регистры
    33.                
    34. nCrt480_l   = ($ - Crt480) / 2
    35.  
    36.     CODE    ends
    37.  
    38.     end     Start
    но это всё на что меня хватило, притом это мы уже меняем режим, и я не в курсе можно ли устанавливать режимы с высоким разрешением, если кто то захочет разобраться вместе могу предоставить подробное описание CRT регистров.

    Вопрос намбер 2 & 3:
    При работе с VESA приходиться часто вызывать прерывание смены банка видеопамяти, что очень ресурсоёмко (при режиме 640x480x16 = 614400 байт если это поделить на FFFFh что составляет один сегмент то получается 10 банков!, это получается что за кадр приходится вызывать функцию 10 раз, причём процедура расчёта банка и смещения тоже получается немаленькая:
    Код (Text):
    1. ; AX - x, BX - y
    2. ; . . . . . . .
    3. PutPixel:
    4.     push    ax
    5.        
    6.     xor     dx, dx
    7.     mov     ax, 640 * 2
    8.     mul     bx
    9.     mov     word ptr nLineAddr, ax
    10.     mov     word ptr nLineAddr [2], dx
    11.        
    12.     pop     ax
    13.     shl     ax, 1
    14.     add     word ptr nLineAddr, ax
    15.     adc     word ptr nLineAddr [2], 0
    16.        
    17.     mov     dx, word ptr nLineAddr [2]
    18.        
    19.     cmp     dx, nCurrentBank ; сравниваем с текущим банком
    20.     jne     BankSwitch ; если не тот, то прыгаем на переключение
    21.  
    22. Switched:
    23.  
    24.     mov     di, word ptr nLineAddr
    25.     mov     word ptr es:[di], 1111100000000000b ; рисуем точку 1111100000000000 - цвет (красный)
    26.        
    27.     pop     di
    28.     pop     ax
    29.        
    30.     ret
    31.        
    32. BankSwitch:
    33.  
    34.     push    bx
    35.        
    36.     mov     nCurrentBank, dx
    37.        
    38.     xor     bx, bx     
    39.     call    dword ptr [lpVbeModeInfo + 0Ch] ; вызываем ту самую функцию переключения банков, номер банка в DX,
    40. ;в lpVbeModeInfo + 0Ch содержиться сегмент:смещение кторое мы получили при вызове функции AX=4F01h прерывания int 10h (кому интересно могу выложить подробную информацию)
    41.        
    42.        
    43.     pop     bx 
    44.  
    45.     jmp     short Switched
    46.  
    47. ; . . . . . . .
    48.  
    49. nCurrentBank    dw  0
    50. nLineAddr       dw  0, 0
    51.  
    52. lpVbeModeInfo:
    53.  
    54.     CODE    ends
    55.     end     Start
    Я намеренно не пользуюсь 32 регистрами, так как вся задумка в этом что бы использовать 16 битные, хотя если хорошо подумать... ))
    Получая физический адресс LFB (Line Frame Buffer) незнаю что с ним делать ))))))))
    Есть инфа как программировать LFB, но это в модели flat, где размер сегмента может достигать 4Гб, а в tiny у меня всео 64Кб, и я не могу расположить буфер вывода в сегменте данных и выводить его в LFB так как он в 10 раз больше файла ))))), причём там использовались расширения DPMI...
    Есть идеи: выделить память при помощи EMS/XMS (EMS у меня почему то не заработал) размером в видео буффер (XMS выделяет память блоками по 64К, что опять вводит меня в ступор, хотя если они идут последовательно друг за другом, то проблем с сегментами не будет) и выводить в память а после всего получить физический адресс видюхи и туда его или в тот же LFB, только в этом вся загвоздка...

    ИТОГ:
    1. При помощи портов запрограммировать видеокарту на режим 640х480х16, и получить физический адресс...
    2. Выделить динамическую память и выводить туда линейно, опять же както извратившись с 16 битной адрессации памяти
    3. После завершения вывода в буффер, дождаться обратного вертикального хода луча (в это время на экран ничего не выводится) и из буффера скопировать в видеопамять.

    Оооооооооййййййй )))))))))))
    Всем принимающим в этом участие буду ооооооооооооооооооочень благодарен!
    И ооооочень прошу отозваться всех кто располагает хоть какой нибудь информацией об этом, а то самому мне в этом разобраться будет туго.
    Всем заранее большое СПАСИБО!
     
  2. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Р.А.Ашинянц, М.И.Козлов, А.Д.Кошелев "Справочник по видеосредствам IBM PC & IBM PS/2/Адаптеры CGA, EGA и VGA. Руководство программиста" Москва , КомпьютерГайд, 1993, ISBN 5-7333-0463-4
    Р.Уилтон "Видеосистемы Персональных Компьютеров IBP PC и PS/2. Руководство по программированию", Радио и связь 1994, ISBN 5-256-00473-5 (оригинал (C)1991 R.Wilton ISBN 1-55615-103-0

    Кстати по современным видеоадаптерам я чегой-то таких книг не видал =(
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    1. Дело темное и не нужное.=)
    Не знаю зачем тебе понадобилось через порты писать, оставил бы через прерывания. Так как у тебя есть описания вот по нему и делай. В принцами на сайте http://www.codenet.ru/ есть подробное описание. Но на твое я бы взглянул. =)
    Я так и не понял(запускать не стал), работает у тебя пример или нет?
    По-моему ошибки в этих строчках.

    Код (Text):
    1.     mov     dx, 03D4h               ; порт CRT
    2.     mov     si, offset Crt480       ; DS:SI адресс таблицы данных для CRT
    3.     mov     cx, nCrt480_l           ; её длинна
    4.     rep     outsw                   ; 03D4h - 03D5h порты
    Объясняю ошибки в порт 03D4h нужно занести номер (0,1,2...)регистр а потом в порт 03D5h данные.
    03D4h -служит для выбора регистра CRxx (везде по разному обзывают регистры).
    03D5h - служит для записи или чтения регистра которого мы выбрали.

    outsw - занесет двойное слово только вот занесет он это двойное слово в один порт (DX=03D4h). А не в в два как бы ты не хотел.
    Так как у тебя стоит префикс rep то в порт 03D4h занесется CX двойных слов.
    outsB - заносит байт в порт
    outsW - заносит Слово в порт
    outsD - заносит Двойное Слово в порт
    Аналогично
    out DX,AL
    out DX,AX
    out DX,EAX

    Crt480 dw 0C11h ; 11h - 7 бит разрешает писать в другие регистры
    dw 0B06h, 3E07h, 0EA10h, 0DF12h, 0E715h, 0416h ; сами регистры
    Тут тоже какой-то бред по крайней мере скажи от куда взял данные?

    Биты принято нумеровать от 0 по этому если мы установим 7 бит то число должно быть больше или равно 80h

    2. Вообще мрак. Но нас же некто не остановит. =)
    Тут уже нет стандартных портов и все вендов зависимая информация. Другими словами номера портов и регистров зависит от производителя. Так что для установки видео режима только Int .
    Что касается LFB.
    А нет погодь.
    640х480х16бит (указывать надо, что 16 бит а не 16 цветов)
    А почему бы не использовать 32 разрядные регистры тогда проблем не будет с LFB. Ну допустим я знаю, как можно загнать LFB в меньшие адреса. Но это же не удобно все равно тебе придется рассчитывать сегмент и смещение.
    И зачем DPMI сам переходи в защищенный режим и выводи в видео прямо по LFB адресу.

    PS Написано грамотно. Но все-таки надо тебя отправить почитать, как правильно задавать вопросы. Как прочтешь мне расскажешь, а тоя не умею. =)
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Таблица кодов для всех VGA стандартных режимов.
    Код (Text):
    1. Index|0/1|0*/1*|0+/1+|2/3|2*/3*|2+/3+|4/5|6|7|7+|D|E|F|10|11|12|13|
    2. -----------------------------------------------------
    3. 00| 2D 2D 2D 5F 5F 5F 2D 5F 5F 5F 2D 5F 5F 5F 5F 5F 5F
    4. 01| 27 27 27 4F 4F 4F 27 4F 4F 4F 27 4F 4F 4F 4F 4F 4F
    5. 02| 28 28 28 50 50 50 28 50 50 50 28 50 50 50 50 50 50
    6. 03| 90 90 90 82 82 82 90 82 82 82 90 82 82 82 82 82 82
    7. 04| 2B 2B 2B 55 55 55 2B 54 55 55 2B 54 54 54 54 54 54
    8. 05| A0 A0 A0 81 81 81 80 80 81 81 80 80 80 80 80 80 80
    9. 06| BF BF BF BF BF BF BF BF BF BF BF BF BF BF 0B 0B BF
    10. 07| 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 3E 3E 1F
    11. 08| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    12. 09| C7 4D 4F C7 4D 4F C1 C1 4D 4F C0 C0 40 40 40 40 41
    13. 0A| 06 0B 0D 06 0B 0D 00 00 0B 0D 00 00 00 00 00 00 00
    14. 0B| 07 0C 0E 07 0C 0E 00 00 0C 0E 00 00 00 00 00 00 00
    15. 0C| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    16. 0D| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    17. 0E| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    18. 0F| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    19. 10| 9C 83 9C 9C 83 9C 9C 9C 83 9C 9C 9C 83 83 EA EA 9C
    20. 11| 8E 85 8E 8E 85 8E 8E 8E 85 8E 8E 8E 85 85 8C 8C 8E
    21. 12| 8F 5D 8F 8F 5D 8F 8F 8F 5D 8F 8F 8F 5D 5D DF DF 8F
    22. 13| 14 14 14 28 28 28 14 28 28 28 14 28 28 28 28 28 28
    23. 14| 1F 1F 1F 1F 1F 1F 00 00 0D 0F 00 00 0F 0F 00 00 40
    24. 15| 95 63 96 96 63 96 96 96 63 96 96 96 63 63 E7 E7 96
    25. 16| B9 BA B9 B9 BA B9 B9 B9 BA B9 B9 B9 BA BA 04 04 B9
    26. 17| A3 A3 A3 A3 A3 A3 A2 C2 A3 A3 E3 E3 E3 E3 C3 E3 A3
    27. 18| FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    Первый столбец номер регистра все остальныее соответствуют видео режимам что написаны выши.
    Имена регистров.
    Код (Text):
    1. Horizl Total                00
    2. Hor Disp Enbl End           01
    3. Hor Blanking Start          02
    4. Hor Blanking End            03
    5. Hor Sync Start              04
    6. Hor Sync End                05
    7. Vertical Total              06
    8. Overflow                    07
    9. Preset Row Scan             08
    10. Max Scan Line               09
    11. Cursor Start                0A
    12. Cursor End                  0B
    13. Start Address High          0C
    14. Start Address Low           0D
    15. Text Cursor Location High   0E
    16. Text Cursor Location Low    0F
    17. Verr retrace start          10
    18. Vert retrace end            11
    19. Vert Display Enable End     12
    20. Offset                      13
    21. Underline Location          14
    22. Vertical Blanking Start     15
    23. Vertical Blanking End       16
    24. CRT Mode Control            17
    25. Line Compare                18
     
  5. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    2 Pavia:

    Прошу прощения за путаницу, плохо объяснил про CRT:
    Если нужно считать и записать в порт, то заносим нужный индекс в 03D4h, после чего можно будет писать в него и читать в 03D5h,
    а если мне надо только записать, то можно писать в 03D4h с параметрами AL - номер индекса, AH - посылаемый байт, следовательно:
    Код (Text):
    1. mov dx, 03D4h       ; порт CRT в который будем только писать
    2. mov cx, nCrt480_l       ; длинна таблицы, сколько раз мы будем писать
    3. mov si, offset Crt480   ; содержиться начало таблицы, содержащей комбинации AH, AL
    4. rep outsw           ; записываем в 03D4h слова, содержащие БАЙТ:ИНДЕКС
    5.  
    6. Crt480  dw  0C11h       ; индекс 11h, посылаем 0C, который обнуляет 7ой бит, который защищает от записи, и поехали
    7.     dw  0B06h, 3E07h, 0EA10h, 0DF12h, 0E715h, 0416h ; в индексы 06h, 07h, 10h, 12h,
    15h, 16h мы записываем значения которые находятся в старших байтах

    А понадобилось без прерываний вот по какой причине, я так понимаю в защищённом режиме использовать прерывания нельзя, а хотелось написать универсально и для реального и защищённого
    И ещё был такой странный казус, я когда сел за ассемблер, у меня всразу что то случилось с дровами видеокарты ))), и какое то время я сидел вообще без них - просто выключил в диспетчере устройств,
    и вот что самое интересное, если я ставил режим EGA/VGA/SVGA через прерывания, программа отказывалась работать! В то время как винда мне без затруднений ставила режим 1280х1024х32
    и приложения которые я писал на си для DX OpenGL & GDI хоть и с тормозами но работали, и тут до меня дошло что они это делают как то совсем другими методами ))))))))
    Так что не надо говорить что это не возможно, или что теоретически это возможно, на примере Win, *nix, MenuetOs etc мы видим что и практически, да хотя бы тойжё OpenGL

    И есть интерес как это сделать не только под Win но и под разные платформы, вплот для PocketPC )

    Обещанные описания:
    VESA:
    -----
    -----
    Режимы:
    -----
    4 bits
    640x480 012h
    800x600 102h
    1024x768 104h
    1280x1024 106h
    8 bits
    320X200 013h
    640x400 100h
    640x480 101h
    800x600 103h
    1024x768 105h
    1280x1024 107h
    1600x1200 120h
    15 bits
    320x200 10Dh
    640x480 110h
    800x600 113h
    1024x768 116h
    1280x1024 119h
    1600x1200 121h
    16 bits
    320x200 10Eh
    640x480 111h
    800x600 114h
    1024x768 117h
    1280x1024 11Ah
    1600x1200 122h
    24-32 bits
    320x200 10Fh
    640x480 112h
    800x600 115h
    1024x768 118h
    1280x1024 11Bh


    ооооооооооооооооой замучился писать уже )))))))
    продолжаем...
    Функции прерывания 10h:

    AX = 4F00h - получит всю информацию о VESA в BIOS
    ES:lol: I - адресс буфера, куда будет записанна информация (у меня была одна туууупая вещь: я когда вызывал эту функция для проверки наличия VESA то в DI ничего не записывал, и функция мне писала чё попало прямо в начало кода, так что в конце программы, когда она должна была вернуть управление, то происходила ошибка, и я долго не мог вкупить поему так )))))
    Содержимое буфера:
    00h: 4 байта - будет содержать VESA, для того что б получить данные после 14h, сюда надо ghtldfhbntkmyj pfgbcfnm VBE2
    04h: слово - версия (0102h - 1.2, 0200h - 2)
    06h: 4 ,fqnf - адресс строки названия производителя
    0Ah: 4 байта - флаги
    бит 0 - АЦП поддерживает 8битные цветовые компоненты (см фнкц 8)
    бит 1 - Адаптер несовместим с VGA
    бит 2 - АЦП можно программитровать только при обоатном ходе луча
    бит 3 - поддерживает спецификацию аппаратного ускорения AF 1ю0(ApparatForсe наверное )))
    бит 4 - требуется вызов EnableDirectAcces перед использованием LFB
    бит 5 - поддерживается аппаратный указатель мши
    бит 6 - поддерживается аппаратный cliping
    бит 7 - под ап BitBlt
    бит 8-31 - зарезервированиы
    0Eh: 4 байта - во!!!, вот адресс массива слов который содержит в себе все поддерживаемые режимы, до первого FFFFh идут свсе стандартные режимы, до второго нестандартные
    12h: слово - объём памяти в 64Кб блоках
    14h: слово - Внутрення версия реализации VBE
    16h: 4 байтаадресс строки названия производителя
    1Ah: 4 юайта - адресс строки с названием видеоадаптера
    1Eh: 4 байта - адрсее строки с версией видеоадаптера
    22h: слово - версия AF
    24h: 4 байта - адресс списка режимов поддерживающих AF
    28h: 216 bytes - reserv
    100h: 256 bytes - reserv 2 - в эту память как раз и записывается номера реимов, названия производителей и т.д.

    таааааак...

    AX = 4F01h - получить всю информацию о режиме
    CX - номер режима
    ES:lol: I - буфер куда...
    Щас будет в три раза больше, бедные мои глазки ))))))


    00h: слово - атрибуты режива
    бит 0 - режим экзист
    бит 1 - доп инфо экзист (12h - 1Еh)
    бит 2 - поддерживается вывод на экран текста срежствами BIOS
    бит 3 - режим цветной
    бит 4 - режим графический
    бит 5 - режим не совместим с VGA
    бит 6 - переключение банков не поддерживается
    бит 7 - LFB - не поддерживается
    бит 8 - не определён )))
    бит 9 - (для AF) приложения должны EnableDirectAcess перед сменой банков
    02h: байт - атрибуты окна А
    бит 0 - окно существует
    бит 1 - чтение разрешенно
    бит 2 - запись разрешена
    03h: байт - Атрибуты окна В
    04h: слово - гранулярность окна
    06h: слово - размер окна в килобайтах
    08h: слово - сегментный адресс окна А (usualy 0A000h)
    0Ah: слово - сегментный адресс окна В
    0Ch: 4 байта - аналог функции 4F05 но выполняется быстрее
    10h: слово - число целых байтов в строке
    12h: слово - ширина окна
    14h: слово - высота окна
    16h: байт - высота символа в пикселах
    17h: байт - ширина символа в пикселах
    18h: байт - число плоскостей памяти
    19h: байт - число битов на пиксель
    1Ah: байт - число банков
    1Bh: байт - модель памяти
    1Ch: байт - размер банка в килобайтах
    1Dh: байт - число видеостраниц
    1Eh: байт - резерв

    оооо, пошли цвета наконец то (очень важно!)

    1Fh: байт - битовая маска красной компоненты
    20h: байт - первый бит красной компоненты
    21h: байт - битовая маска зелёной компоненты
    22h: байт - первый бит зелёной компоненты
    23h: байт - битовая маска синей компоненты
    24h: байт - первый бит синей компоненты
    25h: байт - битовая маска зарезервированной компоненты
    26h: байт - первый бит зарезервированной компоненты
    27h: байт
    бит 0 - поддерживает перепрограммирование цветов (подфунк 08)
    бит 1 - приложние может использовать биты в зарезервированной компоненте
    28h: 4 байта - физический адресс начала LFB!!!!
    2Ch: 4 байта - смещение от начала лфб, указывающего на первый байт, не отображающейся на экране памяти
    30h: слово - размер не занятой памяти ЛФБ.
    32h: 206 байт зарезервировано

    вооооо!!!!!

    AX = 4F02h - установаить режим
    BX - собсно режим
    бит 0 - 6 - собсно режим ))
    бит 7 - видеопамять не очищается при установке, если все последующие биты нули
    бит 8 - стандартный режим
    бит 9 - нестандартный
    бит 10-12 - резерв
    бит 13 - режим использует аппаратное ускорение (AF)
    бит 14 - режим использует LFB
    бит 15 - видеопамять не очищается при установке режима

    AX = 4F03h - узнать какой сейчас режим
    на выходе в BX - ноиер режима

    AX = 4f05h - переключить банк видеопамяти (или ещё перемещение окна)
    BH = 0 - установить окно
    BH = 1 - считать окно
    BL = 0 - Win A
    BL = 1 - Win B

    AX = 4f07h - установка начала изображения
    BH = 0
    BL -
    = 0 - считать начало изобр
    = 80h - установать начало изобр
    CX - столбец
    DX - строка

    фуууу ужасы какие

    теперь CRT ))))))))))))
    это которые 03D4h & 03d5h

    00h: общая длинна горизонтальной развёртки
    01h: длинна отображаемой части гор разв - 1
    02h: начало гашения луча гор разв
    03: конец гашения луча гор разв
    биты 6-5 - гор смещение в текст режимах
    биты 4-0 - конец импульса
    04h: начало гор обратного хода луча
    05h: конец обратного хода луча
    бит 7, 4-0 - конец импульса
    бит 6-5 - гор смещение импульса
    06h: число вертикальных линий растра без двух старших битов
    07h: доп регистр
    08h: предварительная гор развёртка
    09h: высота символа
    бит 7 - двойное сканирование (400 вместо 200)
    бит4-0 - высота символов - 1
    0А: начальная линия курсора
    0В: конечная линия курсора
    оС: старший байт начального адреса
    0Е: младший байт начального адреса

    10h:
    11h:
    12h:
    13h:
    14h:
    15h:
    16h:
    17h:
    18:

    всёё больше не могу писать....
    в следующий раз допишу, а то уже больше часа пишу...
    мы так от дела ушли )))
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Про VESA ты можешь мне не рассказывать я ее вдоль и поперек уже знаю. Про порты у меня полное описание тоже есть. Просто там, как-то опущен этот момент.
    Это у тебя глюки win 98 ставит разрешение 640*480, а XP 800*600 если не установлены драйвера.
    Если же стоят драйвера, то она уже может ставить большие разрешения.
    OpenGL - разрешениями не занимается. Есть библиотека Glu - которая нужна для совмещения OpenGL и OS. Так что тут установка видео режима сводится к вызову API windows. А тот в свою очередь работает с драйверами.
    DirectX сам себе хозяин, но и он работает с драйверами.
    *NIX - тут бравые парни ночами не спят все драйвера дизассемблируют.=) Дела там обстает так 40% это код открытый. Многие производители открывают часть кода для работы с ихним железом. Другие 60% получены дизассемблированием драйверов, или дизассемблированием БИОСов.
    http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/hw/xfree86/
    Еще где-то был линек на мезу.

    MenuetOS - тут просто до перехода в защищенный режим ОС вызывает прерывание VESA и устанавливает видео режим.
    etc. - Собственно делают как MenuetOS, или юзают драйвера от линукса.
    PocketPC- там все по другому. Да и нет там установки видео режима.
     
  7. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    Вот примеры к VESA:
    Код (Text):
    1. MODE    = 111h  ; первые 7 битов режим
    2. AF      = 2000h ; 13 бит ставим в 1
    3. LFB     = 4000h ; 14 бит ставим в 1
    4.  
    5.         CODE    segment
    6.         assume  cs:CODE, ds:CODE, es:CODE, ss:CODE
    7.        
    8.         org     100h
    9.        
    10. Start:
    11.  
    12.         mov     ax, 4F01h   ; функция проверки режима
    13.         mov     cx, MODE    ; режим
    14.         mov     di, offset lpVBEModeInfo    ; куда будем записывать информацию
    15.         int     10h
    16.         call    CheckVBE    ; проверка на ошибки вызова функций VBE (AH = 4Fh)
    17.        
    18.         mov     ax, 4F02h   ; установка режима
    19.         mov     bx, MODE + LFB + AF ; устанавливаем нужные биты...
    20.         int     10h
    21.         call    CheckVBE    ; опять проверяем возвращённые значения
    22.        
    23. Done:
    24.  
    25.         mov     ax, 0003h   ; устанавливаем обычный текстовой режим
    26.         int     10h
    27.        
    28.         ret
    29.        
    30. CheckVBE:
    31.  
    32.         cmp     al, 4Fh     ; любая функция VBE если таковая существует возвращает в AL = 4Fh
    33.         jne     Done        ; переходим на точку выхода, или можно записать результат в регистр, или после выхода из функции проверить флаг нуля
    34.         test    ah, ah      ; если произошла ошибка, то в AH <> 0, если всё в порядке AH = 0
    35.         jnz     Done
    36.        
    37.         ret
    38.        
    39. lpVBEModeInfo:
    40. uModeAttribs            dw  ?
    41. byWinAAtribs            db  ?
    42. byWinBAtribs            db  ?
    43. nWinGranularity         dw  ?
    44. nWinSize                dw  ?
    45. uWinASegment            dw  ?
    46. uWinBSegment            dw  ?
    47. lpWinFunc:
    48.     uWinFuncSegment     dw  ?
    49.     uWinFuncSelector    dw  ?
    50. nBytesPerScanLine       dw  ?
    51. nWidth                  dw  ?
    52. nHeight                 dw  ?
    53. nCharHeight             db  ?
    54. nCharWidth              db  ?
    55. nNumbersOfPlanes        db  ?
    56. nBitsPerPixel           db  ?
    57. nNumberOfBanks          db  ?
    58. byMemoryModel           db  ?
    59. nBankSize               db  ?
    60. nNumberOfPages          db  ?
    61. byReserved              db  ?
    62. nRedMaskSize            db  ?
    63. nRedMaskPosition        db  ?
    64. nGreenMaskSzie          db  ?
    65. nGreenMaskPosition      db  ?
    66. nBlueMaskSize           db  ?
    67. nBlueMaskPosition       db  ?
    68. nReservedMaskSize       db  ?
    69. nReservedMaskPosition   db  ?
    70. uDirectColorModeInfo    db  ?
    71. lpPhysicLFB             dw  ?, ?
    72. lpOffScreenMemOffset:   dw  ?, ?
    73. nOffMemSize             dw  ?
    74. Reserved                dw  206 dup (?)
    75.        
    76.         CODE    ends
    77.        
    78.         end     Start
    если жалко места в файле, то можно просто использовать свободное место в конце файла и пользоваться как call dword ptr lpVBEModeInfo [0Ch]
    Если кому надо могу всё в си показать как работает

    CRT
    -------
    00h: общая длинна горизонтальной развёртки
    01h: длинна отображаемой части гор разв минус 1
    02h: начало гашения луча гор разв
    03h: конец гашения луча гор разв
    биты 6-5 - гор смещение в текст режимах
    биты 4-0 - конец импульса
    04h: начало гор обратного хода луча
    05h: конец обратного хода луча
    бит 7, 4-0 - конец импульса
    бит 6-5 - гор смещение импульса
    06h: число вертикальных линий растра без двух старших битов
    07h: доп регистр
    бит 0 - бит 8 регистра 06h
    бит 1 - бит 8 регистра 12h
    бит 2 - бит 8 регистра 10h
    бит 3 - бит 8 регистра 15h
    бит 4 - бит 8 регистра 18h
    бит 5 - бит 9 регистра 06h
    бит 6 - бит 9 регистра 12h
    бит 7 - бит 9 регистра 10h
    08h: предварительная гор развёртка
    биты 6-5 - биты 5 и 4 регистра горизонтального панорамирования
    биты 4-0 - номер линии в верхней строке, с которой начинается изображение
    09h: высота символа
    бит 7 - двойное сканирование (400 линий вместо 200)
    бит 6 - бит 9 регистра 18h
    бит 5 - бит 9 регистра 15h
    биты 4-0 - высота символов минус 1
    0А: начальная линия курсора (бит 5 - гашение курсора)
    0В: конечная линия курсора (биты 6-5 - отклонение курсора в право)
    0С: старший байт начального адреса
    0D: младший байт начального адреса
    0E: старший байт позиции курсора
    0F: младший байт позиции курсора
    10h: начало вертикального обратного хода луча без старшего байта
    11h: конец вертикального обратного хода луча без старшего байта
    бит 7 - защита от записи в регистры 00-07 (кроме бита 4 в 07h)
    бит 6 - 1/0 = 5/3 цикла регенирации за время обратного хода луча
    бит 5 - 1/0 = включить/выключить прерывание по обратному ходу луча
    бит 4 - запись нуля сюда заканчивает обработку прерываний
    биты 3-0 - конец вертикального обратного хода луча
    12h: число гор линий минус 1 без двух старших битов
    13h: логическая ширина экрана (в словах/двойных словах на строку)
    14h: положение символа подчёркивания
    бит 6 - 1/0 - адресация словами/двойными словами
    бит 5 - увеличение счётчика регенирации на 4
    биты 4-0 - положение подчёркивания
    15h: начало импульса гашения луча вертикальной развёртки без двух старших битов
    16h: конец импульса гашения вертикальной развёртки
    17h: регистр управления режимом
    бит 7 - горизонтальный и вертикальный хож луча отключены
    бит 6 - 1/0 - адресация битами/словами
    бит 4 - контроллер включён
    бит 3 - 1/0 - счётчик регенерации растёт на 2/1 на каждый символ
    бит 2 - увеличения в два раза разрешения по вертикали
    18h: регистр сравнения линий без двух старших битов
    22h: регистр защёлка - только для чтения
    23h: состояние контроллеров атрибутов
    биты 7-3 - текущее значение индекса контроллера атрибутов
    бит 2 - источник адреса палитры
    бит 0 - состояние порта контроллера атрибутов - 1/0 = индекс/данные
     
  8. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    ужас какой ))
     
  9. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    2 Pavia
    Ты хочешь сказать что все мои мечты не осуществимы, и ты мне ни чем не поможешь?
    Хотя можно установку режима опустить, но хотя бы часть 2-3 можешь объяснить?
     
  10. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Если сильно интересно, как работать в защищенном режиме с видео (VGA/SVGA/нестандартные режимы) - тебе стоит посмотреть исходники DOS-версии библиотеки Allegro (http://www.talula.demon.co.uk/allegro/). Я этой либой лет 6 назад активно пользовался.
     
  11. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    2 CyberManiac
    В том то и дело что не под защищённый режим надо, а под реальный, и модель памяти tiny...
    2 ALL
    Если вы знаете как мне отвести в видюхе лишних ~600Kb и выводить туда, а потом просто скопировать в видимую память, неужели в моих 128 Мб этого нельзя осуществить?
     
  12. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    b0oh
    Ты не можешь отвести 600КБ. В реальном режиме тебе доступно только 640 кб-2КБ системных вещей минус то что отъест дос. Ну что еще могу добавить. Если ты собрался работать в реальном режиме то тебе придется возиться с банками. LFB доступен только в защищенном режиме.

    Ты можешь в своих 128МБ осуществлять, что хочешь вот только тебе придется вылезать в защищенный режим. Либо ручками, либо через DPMI.

    Во первых если ты вылезешь в защищенный режим, то ты сможешь пользоваться прерываниями.
    Существует куча всяких расширений для работы в защищенном режиме с прерываниями.
    "_32_" - расширение БИОСА вызов из защищенного режима функций БИОСа.
    "PMID" - расширение VBE3 для работы в защищенном режиме.
    Так же ты сможешь вызывать прерывания если будешь прыгать из защищенного режима в реальный или в виртуальный режимы.
     
  13. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    Pavia
    Хорошо, уговорил ))
    Буду использовать защищённый режим, и прерывание int10h...
    Можешь мне устроить краткий экскурс?
    Допустим
    1:
    Как мне ручками в защищённом режиме выделить в своих (чужих ))) 128 метрах видеопамяти и работать с ней,
    а потом скопировать это в видимую часть (насколько я могу судить аппаратный BitBlt это и есть то самое? то есть он копирует память откуда надо куда надо? и как? ))))
    2:
    Ты говорил что знаешь как загнать LFB в младшие адресса
    допустим засунуть в fs начальный сегмент видеобуффера, а потом
    Код (Text):
    1. mov    es, fs
    2. add    es, dx; в DX у нас номер банка
    формула из второго листинга подходит замечательно, впринципе то...
    всё же лучше чем за кадр 10 раз вызывать функцию смены видеобанка, при таком раскладе получается оч мало фпс, и притом картинка выводиться по кускам
    3:
    Как это повлияет, если это засунуть в .com, если это возможно...

    Заранее спасибо!!!
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    b0oh
    Кто бы мне экскур устроил. Тут советуют использовать анриал, наверно самый лучший вариант. Все как в досе только снят придел у сегментов. Так что можешь одрисовать к 4ГБ адресного простанства.
    1. Память вся твоя, кроме той что отведена под системные нужды. Аппаратный BltBit заключается в том что мы посылаем команду видео карте и она копирует изоброжение либы из памяти компьютера/ввидео в видео память. Вот только это опять вендор зависимая информация. Так что придется самому копировать данные.
    2. Засунуть можно, но только выше 1МБ, а тебя это не устраивает. Не исключаю, что и ниже можно, но я пока не знаю как.
    3. Не повлияет.
     
  15. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Вот набросал пример. Переводит процессор в анриал режим находит LFB адресс и закрашивает экран крастным цветом. И ждет нажатие Entera. Разументся программу надо запускать из доса.
    Добавил очистку буфера клавиотуры. А то сразу же закрывалась.
     
  16. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    (((((((((((((((((((((((((((((((((((((((((((
    У меня нот ворк!!!
    Засунал в CodeView, вылетает в ос при выполнении LGDT [0190]
     
  17. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    b0oh
    Так написал же запускать из чистого доса. Лично я проверял на VMware работает, правда у меня enter сробатывает дважды так, что тут же закрывается.
     
  18. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    ого, а где я тебе чистый дос возьму )))
     
  19. b0oh

    b0oh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2006
    Сообщения:
    17
    а под Win, *nix, нельзя как нить универсально написать?
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    b0oh
    http://oldfiles.org.uk/powerload/bootdisk.htm