Организация памяти в графическом режиме 12h 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Организация памяти в графическом режиме 12h



Видеопамять в графическом режиме 12h организована следующим образом:

–начало видеобуфера находится по адресу 0A0000h.

–память организована в виде битовых матриц.

 

В режиме 12h этих матриц четыре. Каждому пикселю экрана соответствует один бит каждой из битовых матриц. Таким образом каждой адресуемой ячейке видеопамяти - байту - соответствует восемь пикселей. Значение цвета пикселя получается как результат объединения значений соответствующего ему бита всех битовых матриц.

Режим 12h имеет разрешающую способность - 640х480 пикселов. В видеопамяти задействованы все четыре цветовых слоя. Структура видеопамяти показана на рисунке 3.

 

Рис. 3. Структура видеопамяти режима 12h.

 

Формулы, используемые для вычисления битов, управляющих данным пикселом экрана, соответствуют формулам режима 10h.


Графический режим 13h

Графический режим 13h (320*200 пикселей, 256 цветов) представляется значительно более простым для программирования. Видеобуфер в этом режиме располагается также по адресу 0A0000h, однако каждому экранному пикселю соответствует один байт видеобуфера. Иными словами, запись в видеопамять байта означает установку цвета (в диапазоне 0..255) экранного пикселя.

Так как байты-пиксели располагаются в памяти последовательно, непосредственно один за другим, вычисление адреса пикселя в памяти по заданным координатам полностью эквивалентно вычислению адреса символа в текстовом режиме.

Этот режим (12h), поддерживается только VGA. Он обеспечивает 256 цветов при разрешающей способности 320х200 пикселов.

Структура видеопамяти приведена на рис. 4. Как видно из рисунка, в данном случае видеопамять организована линейно. Каждый пиксел определяется одним байтом.

Рис. 4. Структура видеопамяти в режиме 13h.

 

Следующая формула позволяет определить смещение от начала видеопамяти байта, управляющего пикселом с координатами (x,y):

Смещение байта = 140h*y+x

0А0000                           0А0000+ 140h
0A0141                           0A0141+ 140h  
                               
                               
                               
                               
                               
                               
                               
                               
                               
                               
                               
                               
                               

 

masm

model small

.stack 100h

.data

array dw 15 dup (?)

; 10 2

; 65 2

; 5 64

; 70 1

; 98 42

A1 dw?;элемент для поиска

failed db 0ah,0dh,'Net takogo elementa v massive!','$'

success db 0ah,0dh,'Takou element v massive prisutstvyet ','$'

foundtime db 0;количество найденных элементов

fnd db " raz(a)",0ah,0dh,'$'

mes2 db 13,10,'Vvedite element massiva [','$'

mes3 db 'Vvedite element dlya poiska',13,10,'$'

mes4 db ']',13,10,'$'

mm1 db?

mm2 db?

mm3 db?

.code

start:

mov ax,@data

mov ds,ax

mov dx,offset mes3

mov ah,09h;функция Dos вывода сообщения на

int 21h

xor ax,ax

mov ah,1h

int 21h

sub al,'0'

mov al,al

 

xor ax,ax

mov si,0;si=столбцы в матрице

mov bx,0;bx=строки в матрице

mov cx,5;число для внешнего цикла (по строкам)

external:;внешний цикл по строкам

push cx;сохранение в стеке счетчика внешнего цикла

mov cx,2;число для внутреннего цикла (по столбцам)

mov si,0

iternal:

mov dx,offset mes2

mov ah,09h;функция Dos вывода сообщения на

int 21h

xor ax,ax

mov ax,bx;выводим на экран номер строки в массиве. Номер

;строки хранится в bx

mov dh,3

div dh

add al,'0'

mov byte ptr [mm1],al

mov byte ptr [mm1+1],'$'

mov dx,offset mm1

mov ah,09h;функция Dos вывода сообщения на

int 21h

mov dl,':';ставим двоеточие после номера строки

mov byte ptr [mm2],dl

mov byte ptr [mm2+1],'$'

mov dx,offset mm2

mov ah,09h;функция Dos вывода сообщения на

int 21h

mov dx,si;после запятой выводим номер столбца, элемент

;которого вводим. Номер столбца хранится в si

add dx,'0'

mov byte ptr [mm3],dl

mov byte ptr [mm3+1],'$'

mov dx,offset mm3

mov ah,09h

int 21h

mov dx,offset mes4

mov ah,09h

int 21h

xor ax,ax

mov ah,1h

int 21h

sub al,'0'

xor dx,dx

mov dh,al

mov al,array[bx][si]

;сравниваем содержимое текущего элемента в массиве

;с искомым элементом в dh:

cmp dh,array[bx][si]

jne here; если значение в массиве и значение в dh совпали, то

inc foundtime;увеличиваем счетчик совпадений

here:

inc si;иначе - цикл по строке

loop iternal

jcxz move_next;просмотрели строку?

move_next:;продвижение в матрице

pop cx;восстанавливаем CX из стека (5)

add bx,3;передвигаемся на следующую строку

loop external;цикл (внешний)

cmp foundtime,0h;сравнение числа совпавших с 0

ja eql;если больше 0, то переход на метку eql, иначе, если

not_equal:;нет элементов, совпавших с искомым

mov ah,09h;вывод сообщения на экран

mov dx, offset failed

int 21h

jmp exit;на выход

eql:;есть элементы, совпавшие с искомым

mov ah,09h;вывод сообщений на экран

mov dx,offset success

int 21h

mov ah,02h

mov dl,foundtime

add dl,30h

int 21h

mov ah,09h

mov dx,offset fnd

int 21h

exit:;выход

mov ax,4c00h;стандартное завершение программы

int 21h

 

end start



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 496; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.22.169 (0.019 с.)