IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> ГРАФИКА 13h
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +



Специально для администраторов - это переделка и доработка 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

Сообщение отредактировано: volvo -


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 17.08.2018 9:10
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"