Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Избранное _ ГРАФИКА 13h

Автор: Dark 20.05.2004 9:57


Специально для администраторов - это переделка и доработка Tutorial.Temp


ГРАФИКА 13h


Уважаемые, не буду отнимать много времени и опишу характеристики 13h режима:

1. Режим 320*200 256 цветов
2. Доступно 64000 байт по адресу A000h:0000h (адрес видеобуфера)
3. Используется палитра на 256 цветов

Вход в режим

Код

mov ax,13h {ah=0 - установить видеорежим al=13h - номер режима}
int 10h {видеопрерывание}


Выход из режима

Код

mov ax,3h {3h - номер текстового режима 80*25 16цветов}
int 10h {видеопрерывание}


Установка точки через BIOS

Установить точку можно двумя способами - через прерывание видеобиоса
(мееедленно) и напрямую (наш метод ;) )

Код

procedure putpixel1 (x,y:word; col:byte);assembler;
asm
pusha {сохраняем регистры}
mov ah,0Ch {функция биоса}
mov al,[col] {цвет}
mov cx,[x] {x координата}
mov dx,[y] {y координата}
int 10h {ПОЕХАЛИ!}
popa {восстанавливаем регистры}
end;


Эта процедура установит по координате [x,y] цвет [col].
Директива assembler указывает на то, чтобы компилятор при переходе к этой подпрограмме не сбрасывал бы регистры, необходимо для того, чтобы подпрограмму можно было бы вызвать из другой подпрограммы. ЖЕЛАТЕЛЬНО самому сохранять регистры.

Очистка окна заданным цветом

Можно конечно закрашивать все 64000 байта при помощи установки точек подряд - но это неблагодарное и медленное дело smile.gif поэтому - прямым доступом к памяти.
Обратите внимание - здесь не используются прерывания, поэтому программа будет работать быстрее, поскольку видеопрерывание контролируется различными программами, например русификаторами.

Код

procedure ClrScr (col:byte);assembler;
asm
pusha {сохраняем регистры}
mov ax,0A000h {Устанавливаем адрес A000:0000 для работы с ним}
mov es,ax {первая часть адреса}
xor di,di {Вторая часть адреса}
mov al,[col] {цвет}
mov cx, 64000 {сколько точек надо закрасить?}
cld {очищаем DF}
rep Stosb {КРАСИМ!!}
popa {восстанавливаем регистры}
end;

Я в цикле присваиваю 64000 байтов значение col, при помощи команды stosb, напоминаю - она записывает содержимое AL в память по адресу ES:DI - именно для этого мы и записываем адрес видеобуфера в es:di.

В зависимости от флага DF команда STOSB также увеличивает или уменьшает адрес в регистре DI на 1. Поскольку я увеличиваю то очищаю DF (CLD).

Установка точки в видеобуфер напрямую

Задача: по заданным X и Y нарисовать точку цветом col.

Решение - поскольку нам доступен весь кусок памяти в 64000 байт, то данные x и y надо преобразовать в смещение.

DI:= x+320*y. ВСЕ smile.gif

Код

procedure putpixel2 (x,y:word;col:byte);assembler;
asm
pusha {сохраняем регистры}
mov ax,0A000h {Устанавливаем адрес A000:0000 для работы с ним}
mov es,ax {первая часть адреса}
mov ax,[y]
mul 320
mov di,ax {вторая часть адреса}
add di,[x]
mov al,[col] {цвет}
cld {очищаем DF}
stosb {рисуем}
popa {восстанавливаем регистры}
end;


Естественно что я не делаю никаких проверок smile.gif поэтому если вы захотите постаавить точку по координатам (321,201) то никто вам мешать не будет.

5 лет теме, делать больше нечего было, кроме как поднимать ее опять? mad.gif