Приветствую вас, тут я буду рассказывать об основах программирования графики 24 бит. Возможно, я также сподвигнусь написать игрушку, пока что - первоначально в планах наподобии King Bounty =) [в 24 битах... круто =) ]
Dark
13.11.2004 5:46
Введение.
Видеорежимы direct color были введены начиная со стандарта VESA 1.2 Главное отличие этих режимов от режимов VESA 256 цветов - это то, что они не используют палитру. Это избавляет от манипуляций с регистрами видеокарточки, и при добавлении новых рисунков на экран можно не бояться порчи изображения в целом.
Код точки 24 бита занимает 32 бита, кроме базовых цветов (RGB) в него входит пустой байт
Разряды 24-31 16-23 9-15 0-8 ------------------------------------------------------------------------------------------- |резервный| Красный | Зеленый | Синий | | байт | цвет | цвет | цвет | -------------------------------------------------------------------------------------------
Стоит напомнить =), что в силу архитектуры Intel двойное слово хранится задом наперед - т.е. 1вым будет синий цвет, и т.д.
Недостатки режима 24 бита:
1. трехбайтный код не обрабатывается командами процессора, поэтому приходиться разбивать на 2 действия - вывод байта и вывод слова. 2. Размер сегмента кратен двойке - поэтому в него не помещается целое количество трехбайтовых точек. У одной из них [первой или последней] будет искажение - т.е. надо проверять сколько до конца сегмента
надеюсь =) понятно...
Dark
6.12.2004 14:49
Все программы, которые я пишу, я буду писать либо в Turbo Assembler, либо в TP
Первым делом - установка режима.
VESA режимы, котрые нам подходят [24/32 bit]
Код режима Разрешение экрана размер строки(в байтах)
ES:DI адрес(указатель) массива на 256 байт, который будет заполняться информацией о видеокарте.
Первые 20 байт заполняются следующими данными:
СМЕЩЕНИЕ ПО МАССИВУ РАЗМЕР(байт) ДАННЫЕ
00h 4 'VESA' 04h 2 версия VESA 06h 4 адрес строки фирмы-изготовителя 0Ah 4 СпецСвойства 0Eh 4 Адрес начала списка информации о поддерживаемых режимах 12H 2 Объем памяти видеокарточки (в блоках по 64 Кб)
- Версия VESA, указывается номер версии и ее редакция. Записана в виде 0102 для VESA 1.2 - Строка фирмы-изготовителя. Коды формата ASII, строка заканчивется 0 (стандарт ASIIZ) - Спецсвойста я описывать не буду, либо опишу потом - они пока что интереса не представляют. - Признаком конца списка режимов является код 0FFFFh
Анализ Спецсвойст и списка видеорежимов не очень целесообразен.
Остальные байты в резерве.
простейшая програмка, выводящая всю информацию, получаемую этим прерыванием:
; Тест видеокарты на Vesa Extension ; ;
DOSSEG .MODEL SMALL .STACK 200h .DATA
Buffer db 255 dup(?)
TVesaSig db 13 db 10 db 13 db 10 db 'VesaSig: $'
TVesaVer db 13 db 10 db 'VesaVer: $'
TOEMStr db 13 db 10 db 'OEMStr: $'
TCapabilities db 13 db 10 db 'Capabilities: $'
TModeList db 13 db 10 db 'ModeListPtr: $'
TMemPresent db 13 db 10 db 'MemPresent: $'
VesaSig db 5 dup(?) VesaVer db 6 dup(?) OEMStrSeg db 5 dup(?) OEMStrOfs db 5 dup(?) Capabilities db 9 dup(?) ModeListSeg db 5 dup(?) ModeListOfs db 5 dup(?) MemPresent db 5 dup(?)
Обратите внимание - первая строка - в виде билеберды потому что функции BIOS и DOS работают ТОЛЬКО с ASCII строками, поэтому мне пришлось написать дополнительно функцию, преобразующую слово в BCD слово, а затем BCD слово в символ. Если кто то знает более легкий путь, пусть сообщит сюда, мне.
Следующая фаза - получение информации о режиме. О ней в другом выпуске.
Мне интересны любые вопросы и коментарии, которые вы можете предложить. |Пытался запихнуть в архив - не удалось, форум не хочет его грузить =( попытаюсь ночью
FreeMan
6.12.2004 22:09
Неоптимально.... Посмотреть хотя бы на то, что везде через es работа. Это, вроде, + такт и + байт(не проверял). надо через ds. А так не присматривался. Посмотрю, тогда напишу больше.
Dark
7.12.2004 6:46
Если бы пригляделся - увидел бы что ds используется одновременно с es
или ты про что то другое?
FreeMan
8.12.2004 21:40
Так блин я ж и говорю. замени lodsw, поставь через es, а всё остальное через ds imho будет оптимальнее + у тебя она что в tiny не влазит? пихай все переменные в секцию кода. используй неиспользуемую часть переменной buffer.
Dark
9.12.2004 6:14
просто разные подходы к программированию
Я ж не учу оптимизированности... Хотя, ты прав, она не помешает
Но иногда - оптимизированность мешает пониманию...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.