Воть... Есть вопрос... Много вопросов )) Ассемблер изучаю недолго (неделя), предупреждаю всразу, поэтому на глупые вопросы не обращайте внимания )) Вопрос намбер 1: Как при помощи портов запрограммировать видеоадаптер на режим 640x480x16, без использования прерываний, низкоуровнево как только можно представить с подробным описанием, есть идеи по поводу записи в регистры CRT: (установка режима 80x30) Код (Text): CODE segment assume cs:CODE, ds:CODE, es:CODE, ss:CODE .186 ; команда outsw org 100h Start: mov ax, 0003h ; MODE (80x25) его будем менять int 10h mov dx, 03CCh ; регистр вывода на чтение in al, dx mov dx, 03C2h ; регистр вывода на запись or al, 00C0h ; установить полярность 1, 1 для 480 строк out dx, al mov dx, 03D4h ; порт CRT mov si, offset Crt480 ; DS:SI адресс таблицы данных для CRT mov cx, nCrt480_l ; её длинна rep outsw ; 03D4h - 03D5h порты push 0040h pop es ; BIOS rewrite mov byte ptr es:[84h], 29 ; 0040:0084 - число строк (тута в биосе находиться информация о режиме) ret Crt480 dw 0C11h ; 11h - 7 бит разрешает писать в другие регистры dw 0B06h, 3E07h, 0EA10h, 0DF12h, 0E715h, 0416h ; сами регистры nCrt480_l = ($ - Crt480) / 2 CODE ends end Start но это всё на что меня хватило, притом это мы уже меняем режим, и я не в курсе можно ли устанавливать режимы с высоким разрешением, если кто то захочет разобраться вместе могу предоставить подробное описание CRT регистров. Вопрос намбер 2 & 3: При работе с VESA приходиться часто вызывать прерывание смены банка видеопамяти, что очень ресурсоёмко (при режиме 640x480x16 = 614400 байт если это поделить на FFFFh что составляет один сегмент то получается 10 банков!, это получается что за кадр приходится вызывать функцию 10 раз, причём процедура расчёта банка и смещения тоже получается немаленькая: Код (Text): ; AX - x, BX - y ; . . . . . . . PutPixel: push ax xor dx, dx mov ax, 640 * 2 mul bx mov word ptr nLineAddr, ax mov word ptr nLineAddr [2], dx pop ax shl ax, 1 add word ptr nLineAddr, ax adc word ptr nLineAddr [2], 0 mov dx, word ptr nLineAddr [2] cmp dx, nCurrentBank ; сравниваем с текущим банком jne BankSwitch ; если не тот, то прыгаем на переключение Switched: mov di, word ptr nLineAddr mov word ptr es:[di], 1111100000000000b ; рисуем точку 1111100000000000 - цвет (красный) pop di pop ax ret BankSwitch: push bx mov nCurrentBank, dx xor bx, bx call dword ptr [lpVbeModeInfo + 0Ch] ; вызываем ту самую функцию переключения банков, номер банка в DX, ;в lpVbeModeInfo + 0Ch содержиться сегмент:смещение кторое мы получили при вызове функции AX=4F01h прерывания int 10h (кому интересно могу выложить подробную информацию) pop bx jmp short Switched ; . . . . . . . nCurrentBank dw 0 nLineAddr dw 0, 0 lpVbeModeInfo: CODE ends 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. После завершения вывода в буффер, дождаться обратного вертикального хода луча (в это время на экран ничего не выводится) и из буффера скопировать в видеопамять. Оооооооооййййййй ))))))))))) Всем принимающим в этом участие буду ооооооооооооооооооочень благодарен! И ооооочень прошу отозваться всех кто располагает хоть какой нибудь информацией об этом, а то самому мне в этом разобраться будет туго. Всем заранее большое СПАСИБО!
Р.А.Ашинянц, М.И.Козлов, А.Д.Кошелев "Справочник по видеосредствам 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 Кстати по современным видеоадаптерам я чегой-то таких книг не видал =(
1. Дело темное и не нужное.=) Не знаю зачем тебе понадобилось через порты писать, оставил бы через прерывания. Так как у тебя есть описания вот по нему и делай. В принцами на сайте http://www.codenet.ru/ есть подробное описание. Но на твое я бы взглянул. =) Я так и не понял(запускать не стал), работает у тебя пример или нет? По-моему ошибки в этих строчках. Код (Text): mov dx, 03D4h ; порт CRT mov si, offset Crt480 ; DS:SI адресс таблицы данных для CRT mov cx, nCrt480_l ; её длинна 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 Написано грамотно. Но все-таки надо тебя отправить почитать, как правильно задавать вопросы. Как прочтешь мне расскажешь, а тоя не умею. =)
Таблица кодов для всех VGA стандартных режимов. Код (Text): 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| ----------------------------------------------------- 00| 2D 2D 2D 5F 5F 5F 2D 5F 5F 5F 2D 5F 5F 5F 5F 5F 5F 01| 27 27 27 4F 4F 4F 27 4F 4F 4F 27 4F 4F 4F 4F 4F 4F 02| 28 28 28 50 50 50 28 50 50 50 28 50 50 50 50 50 50 03| 90 90 90 82 82 82 90 82 82 82 90 82 82 82 82 82 82 04| 2B 2B 2B 55 55 55 2B 54 55 55 2B 54 54 54 54 54 54 05| A0 A0 A0 81 81 81 80 80 81 81 80 80 80 80 80 80 80 06| BF BF BF BF BF BF BF BF BF BF BF BF BF BF 0B 0B BF 07| 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 3E 3E 1F 08| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09| C7 4D 4F C7 4D 4F C1 C1 4D 4F C0 C0 40 40 40 40 41 0A| 06 0B 0D 06 0B 0D 00 00 0B 0D 00 00 00 00 00 00 00 0B| 07 0C 0E 07 0C 0E 00 00 0C 0E 00 00 00 00 00 00 00 0C| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0D| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10| 9C 83 9C 9C 83 9C 9C 9C 83 9C 9C 9C 83 83 EA EA 9C 11| 8E 85 8E 8E 85 8E 8E 8E 85 8E 8E 8E 85 85 8C 8C 8E 12| 8F 5D 8F 8F 5D 8F 8F 8F 5D 8F 8F 8F 5D 5D DF DF 8F 13| 14 14 14 28 28 28 14 28 28 28 14 28 28 28 28 28 28 14| 1F 1F 1F 1F 1F 1F 00 00 0D 0F 00 00 0F 0F 00 00 40 15| 95 63 96 96 63 96 96 96 63 96 96 96 63 63 E7 E7 96 16| B9 BA B9 B9 BA B9 B9 B9 BA B9 B9 B9 BA BA 04 04 B9 17| A3 A3 A3 A3 A3 A3 A2 C2 A3 A3 E3 E3 E3 E3 C3 E3 A3 18| FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Первый столбец номер регистра все остальныее соответствуют видео режимам что написаны выши. Имена регистров. Код (Text): Horizl Total 00 Hor Disp Enbl End 01 Hor Blanking Start 02 Hor Blanking End 03 Hor Sync Start 04 Hor Sync End 05 Vertical Total 06 Overflow 07 Preset Row Scan 08 Max Scan Line 09 Cursor Start 0A Cursor End 0B Start Address High 0C Start Address Low 0D Text Cursor Location High 0E Text Cursor Location Low 0F Verr retrace start 10 Vert retrace end 11 Vert Display Enable End 12 Offset 13 Underline Location 14 Vertical Blanking Start 15 Vertical Blanking End 16 CRT Mode Control 17 Line Compare 18
2 Pavia: Прошу прощения за путаницу, плохо объяснил про CRT: Если нужно считать и записать в порт, то заносим нужный индекс в 03D4h, после чего можно будет писать в него и читать в 03D5h, а если мне надо только записать, то можно писать в 03D4h с параметрами AL - номер индекса, AH - посылаемый байт, следовательно: Код (Text): mov dx, 03D4h ; порт CRT в который будем только писать mov cx, nCrt480_l ; длинна таблицы, сколько раз мы будем писать mov si, offset Crt480 ; содержиться начало таблицы, содержащей комбинации AH, AL rep outsw ; записываем в 03D4h слова, содержащие БАЙТ:ИНДЕКС Crt480 dw 0C11h ; индекс 11h, посылаем 0C, который обнуляет 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 ESI - адресс буфера, куда будет записанна информация (у меня была одна туууупая вещь: я когда вызывал эту функция для проверки наличия 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 - номер режима ESI - буфер куда... Щас будет в три раза больше, бедные мои глазки )))))) 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: всёё больше не могу писать.... в следующий раз допишу, а то уже больше часа пишу... мы так от дела ушли )))
Про 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- там все по другому. Да и нет там установки видео режима.
Вот примеры к VESA: Код (Text): MODE = 111h ; первые 7 битов режим AF = 2000h ; 13 бит ставим в 1 LFB = 4000h ; 14 бит ставим в 1 CODE segment assume cs:CODE, ds:CODE, es:CODE, ss:CODE org 100h Start: mov ax, 4F01h ; функция проверки режима mov cx, MODE ; режим mov di, offset lpVBEModeInfo ; куда будем записывать информацию int 10h call CheckVBE ; проверка на ошибки вызова функций VBE (AH = 4Fh) mov ax, 4F02h ; установка режима mov bx, MODE + LFB + AF ; устанавливаем нужные биты... int 10h call CheckVBE ; опять проверяем возвращённые значения Done: mov ax, 0003h ; устанавливаем обычный текстовой режим int 10h ret CheckVBE: cmp al, 4Fh ; любая функция VBE если таковая существует возвращает в AL = 4Fh jne Done ; переходим на точку выхода, или можно записать результат в регистр, или после выхода из функции проверить флаг нуля test ah, ah ; если произошла ошибка, то в AH <> 0, если всё в порядке AH = 0 jnz Done ret lpVBEModeInfo: uModeAttribs dw ? byWinAAtribs db ? byWinBAtribs db ? nWinGranularity dw ? nWinSize dw ? uWinASegment dw ? uWinBSegment dw ? lpWinFunc: uWinFuncSegment dw ? uWinFuncSelector dw ? nBytesPerScanLine dw ? nWidth dw ? nHeight dw ? nCharHeight db ? nCharWidth db ? nNumbersOfPlanes db ? nBitsPerPixel db ? nNumberOfBanks db ? byMemoryModel db ? nBankSize db ? nNumberOfPages db ? byReserved db ? nRedMaskSize db ? nRedMaskPosition db ? nGreenMaskSzie db ? nGreenMaskPosition db ? nBlueMaskSize db ? nBlueMaskPosition db ? nReservedMaskSize db ? nReservedMaskPosition db ? uDirectColorModeInfo db ? lpPhysicLFB dw ?, ? lpOffScreenMemOffset: dw ?, ? nOffMemSize dw ? Reserved dw 206 dup (?) CODE ends 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 = индекс/данные
2 Pavia Ты хочешь сказать что все мои мечты не осуществимы, и ты мне ни чем не поможешь? Хотя можно установку режима опустить, но хотя бы часть 2-3 можешь объяснить?
Если сильно интересно, как работать в защищенном режиме с видео (VGA/SVGA/нестандартные режимы) - тебе стоит посмотреть исходники DOS-версии библиотеки Allegro (http://www.talula.demon.co.uk/allegro/). Я этой либой лет 6 назад активно пользовался.
2 CyberManiac В том то и дело что не под защищённый режим надо, а под реальный, и модель памяти tiny... 2 ALL Если вы знаете как мне отвести в видюхе лишних ~600Kb и выводить туда, а потом просто скопировать в видимую память, неужели в моих 128 Мб этого нельзя осуществить?
b0oh Ты не можешь отвести 600КБ. В реальном режиме тебе доступно только 640 кб-2КБ системных вещей минус то что отъест дос. Ну что еще могу добавить. Если ты собрался работать в реальном режиме то тебе придется возиться с банками. LFB доступен только в защищенном режиме. Ты можешь в своих 128МБ осуществлять, что хочешь вот только тебе придется вылезать в защищенный режим. Либо ручками, либо через DPMI. Во первых если ты вылезешь в защищенный режим, то ты сможешь пользоваться прерываниями. Существует куча всяких расширений для работы в защищенном режиме с прерываниями. "_32_" - расширение БИОСА вызов из защищенного режима функций БИОСа. "PMID" - расширение VBE3 для работы в защищенном режиме. Так же ты сможешь вызывать прерывания если будешь прыгать из защищенного режима в реальный или в виртуальный режимы.
Pavia Хорошо, уговорил )) Буду использовать защищённый режим, и прерывание int10h... Можешь мне устроить краткий экскурс? Допустим 1: Как мне ручками в защищённом режиме выделить в своих (чужих ))) 128 метрах видеопамяти и работать с ней, а потом скопировать это в видимую часть (насколько я могу судить аппаратный BitBlt это и есть то самое? то есть он копирует память откуда надо куда надо? и как? )))) 2: Ты говорил что знаешь как загнать LFB в младшие адресса допустим засунуть в fs начальный сегмент видеобуффера, а потом Код (Text): mov es, fs add es, dx; в DX у нас номер банка формула из второго листинга подходит замечательно, впринципе то... всё же лучше чем за кадр 10 раз вызывать функцию смены видеобанка, при таком раскладе получается оч мало фпс, и притом картинка выводиться по кускам 3: Как это повлияет, если это засунуть в .com, если это возможно... Заранее спасибо!!!
b0oh Кто бы мне экскур устроил. Тут советуют использовать анриал, наверно самый лучший вариант. Все как в досе только снят придел у сегментов. Так что можешь одрисовать к 4ГБ адресного простанства. 1. Память вся твоя, кроме той что отведена под системные нужды. Аппаратный BltBit заключается в том что мы посылаем команду видео карте и она копирует изоброжение либы из памяти компьютера/ввидео в видео память. Вот только это опять вендор зависимая информация. Так что придется самому копировать данные. 2. Засунуть можно, но только выше 1МБ, а тебя это не устраивает. Не исключаю, что и ниже можно, но я пока не знаю как. 3. Не повлияет.
Вот набросал пример. Переводит процессор в анриал режим находит LFB адресс и закрашивает экран крастным цветом. И ждет нажатие Entera. Разументся программу надо запускать из доса. Добавил очистку буфера клавиотуры. А то сразу же закрывалась.
((((((((((((((((((((((((((((((((((((((((((( У меня нот ворк!!! Засунал в CodeView, вылетает в ос при выполнении LGDT [0190]
b0oh Так написал же запускать из чистого доса. Лично я проверял на VMware работает, правда у меня enter сробатывает дважды так, что тут же закрывается.