ГРАФИКА 13h |
ГРАФИКА 13h |
Dark |
20.05.2004 5:57
Сообщение
#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 байта при помощи установки точек подряд - но это неблагодарное и медленное дело поэтому - прямым доступом к памяти. Обратите внимание - здесь не используются прерывания, поэтому программа будет работать быстрее, поскольку видеопрерывание контролируется различными программами, например русификаторами. Код 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. ВСЕ Код 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; Естественно что я не делаю никаких проверок поэтому если вы захотите постаавить точку по координатам (321,201) то никто вам мешать не будет. 5 лет теме, делать больше нечего было, кроме как поднимать ее опять? Сообщение отредактировано: volvo - 9.03.2009 20:49 -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Текстовая версия | 18.11.2024 9:42 |