Листинг программы, выводящей на экран то, что записано в видеопамяти по заданному адресу. Алгоритм программы, выводящей на экран точку по заданным координатам

Страницы работы

Фрагмент текста работы

Санкт-Петербургский Государственный Университет Информационных Технологий, Механики и Оптики (Технический Университет)

Отчёт по лабораторной работе №1

по курсу "Компьютерная графика"

14 вариант

                                                                                        Выполнил студент гр. 4103

                                                                                                                           

Проверил доцент кафедры ВТ

Санкт-Петербург, 2007г.


1. Задание

1) Познакомиться с правилами выполнения лабораторных работ (файл RULES.TXT).

2) В видеоадаптере CGA (чёрно-белом) в видеопамяти на фоне всех нулей в байт с адресом 2000h+10h относительно начала видеопамяти записан код 99h. Определить, что отобразится на экране в этом случае, и обоснование этого определения представить преподавателю.

Разработать программу, отображающую это на экране.

3) Разработать программу для этого же видеоадаптера для вывода на экран точки с координатами x = 313, y = 101. Значения координат можно задавать непосредственно в тексте программы.

4) На базе разработанной программы вывода точки разработать программу построения горизонтальной линии произвольного размера от минимального (в один пиксель) до максимального (640 пикселей). Стремиться к максимальной скорости построения линии.

5) На базе разработанной программы вывода точки разработать программу построения вертикальной линии произвольного размера от минимального (в один пиксель) до максимального (640 пикселей). Стремиться к максимальной скорости построения линии.
2.1 Расчёты:

Режим CGA (чёрно-белый)

Адрес 2000h+10h

Код 99h

Так как адрес больше 2000h, то строка относится к банку нечётных строк, следовательно

Y = [16/80]*2+1 = 1

10h = 1610 => X1 = 8*16 = 128

99h = 100110012 => отобразится четыре точки:

X1 = 128, X2 = 131, X3 = 132, X4 = 135

2.2 Листинг программы, выводящей на экран то, что записано в видеопамяти по заданному адресу:

;В видеоадапторе CGA (чёрно-белом) в видеопамяти на фоне всех нулей в байт с адресом ;2000h+10h относительно начала видеопамяти записан код 99h.

;Программа выводит содержимое видеопамяти на экран.

.model  small

.code

mov   ax,6

int   10h               ;инициализация видеорежима

mov   ax,0b800h         ;занесение в es адреса

mov   es,ax             ;начала видеопамяти

mov   bx,2000h+10h      ;занесение в bx смещения в видеопамяти

;Вывод на экран

mov   es:[BX],99h       ;запись кода в видеопамять

xor   ax,ax             ;ожидание нажатия клавиши

int   16h

mov   ax,4c00h          ;возвращение к прежнему состоянию

int   21h              

end

3.1 Алгоритм программы, выводящей на экран точку по заданным координатам:


;Temp = [X/8]

;Mask = остаток от X/8

;Address = [X/8]

; Temp = [Y/2]

Надпись: Нет 

 


; Address = [X/8] +

Addr += 2000h

 
2000h


Temp << 4

 
 ; Temp = [Y/2] * 16

 


; Address = [X/8] + [Y/2]

Addr += Temp

 
 * 16 {+ 2000h}


; Temp = [Y/2] * 64

Addr += Temp

 
; Address = [X/8] + [Y/2] * (16 + 64) {+ 2000h}


3.2 Листинг программы, выводящей на экран точку по заданным координатам:

;Программа выводит на экран точку с заданными координатами х=313 и у=101.

;Видеоадаптор CGA (чёрно-белый)

.286

.code

mov      dx,10000000b;начальное значение

mov      si,313;x

mov      di,101;y

;Инициализация графического режима

mov   ax,6

int   10h        

mov   ax,0b800h

mov   es,ax

;Получение [Х/8]

mov   ax,si

mov   cl,3

shr   ax,cl

mov   bx,ax             ;Занесение [Х/8] в address

;Получение остатка от [Х/8] и занесение его в cх

mov   cx,si

and   cx,0007h

shr   dx,cl                   ;Получение в mask значения маски

;Получение [Y/2]

mov   ax,di

shr   ax,1

;Проверка флага CF (проверка на чётность)

jnc   _parity

add   bx,2000h          ;Добавление 2000h в address для нечётных строк

_parity:

;Получение [Y/2]*16

mov   cl,4

shl   ax,cl

add   bx,ax             ;Добавление [Y/2]*16 к address

;Получение [Y/2]*64

mov   cl,2

shl   ax,cl

add   dx,ax             ;Добавление [Y/2]*64 к address

or    es:[bx],dl              ;Наложение маски на видеопамять

xor   ax,ax

int   16h                     ;ожидание нажатия клавиши

mov   ax,4c00h         

int   21h                     ;возвращение в прежнее состояние

end  

4.1 Алгоритм программы, выводящей на экран горизонтальную линию с заданными начальными координатами и заданной длиной:

 


;Вычисление адреса первого байта

;и маски первого пикселя в байте

 


;Циклический сдвиг дополнительной

;маски и изменение маски первого

;байта. Формирование первого байта

 


;Проверка: вся ли линия занесена в

Заносим 11111111b в видеопамять

Length = Length - 8

Переход к следующему байту видеопамяти

 
;видеопамять?

;Циклическое заполнение последующих

;”полных” байтов

 


;Проверка: вся ли линия занесена в

;видеопамять?

;Заполнение последнего байта

;из массива возможных значений

 


4.2 Листинг программы, выводящей на экран горизонтальную линию с заданными начальными координатами и заданной длиной:

;Программа выводит на экран горизонтальную линию с заданными начальными координатами

;х и у и длиной len. Видеоадаптор CGA (чёрно-белый)

DATA SEGMENT PARA PUBLIC 'data'

;last_byte - массив возможных значений последнего байта

last_byte       db 10000000b, 11000000b, 11100000b, 11110000b,

11111000b,11111100b,11111110b

x               dw 313        ;Координата х (0<=x<=639)

y               dw 101        ;Координата y (0<=y<=199)

len             dw 100        ;Длина линии (0<=len<=639-х)

address         dw 0          ;Адрес первого байта в видеопамяти

first_byte_mask db 128        ;Маска первого байта

DATA ENDS

CODE SEGMENT PARA PUBLIC 'code'

ASSUME CS:CODE, DS:DATA

.286

start:

mov   ax,data

mov   ds,ax

;Инициализация графического режима

mov   ax,6

int   10h        

mov   ax,0b800h

mov   es,ax

;Получение [Х/8]

mov   ax,x

mov   cl,3

shr   ax,cl

mov   address,ax              ;Занесение [Х/8] в address

;Получение остатка от [Х/8] и занесение его в cх

mov   cx,x

add   cx,0007h

shr   first_byte_mask,cl      ;Занесениев first_byte_mask первойточки

dec   len                     ;Уменьшение длины линии на 1

;Заполнение первого байта, занятого линией

mov   ax,7

xchg  ax,cx

sub   cx,ax                   ;Занесение в cx числа занятых в байте битов

_label1:                      ;Начало цикла

cmp   len,0                   ;Проверка: не кончилась ли линия?

je    _label4                 ;Переход по метке, если да

mov   dl,first_byte_mask      ;dl используется как дополнительная маска

shr   dl,1                    ;Сдвиг dl вправо (переход к следующему пикселю линии)

or    first_byte_mask,dl      ;Наложение дополнительной маски на маску первого байта

dec   len                     ;Уменьшение длины линии на пиксель

loop  _label1                 ;Продолжение цикла

;Получение [Y/2]

mov   ax,y

shr   ax,1

;Проверка флага CF (проверка на чётность)

jnc   _parity

add   address,2000h           ;Добавление 2000h в address для нечётных строк

_parity:

;Получение [Y/2]*16

mov   cl,4

shl   ax,cl

add   address,ax              ;Добавление [Y/2]*16 к address

;Получение [Y/2]*64

mov   cl,2

shl   ax,cl

add   address,ax              ;Добавление [Y/2]*64 к address

mov   bx,address              ;Занесение в bx адреса первого байта

mov   al,first_byte_mask      ;Занесениев al маски

mov   es:[bx],al              ;Занесение в видеопамять байта данных

;Заполнение последующих целых байтов видеопамяти, занятых линией

_label2:

cmp   len,8                   ;Проверка: занимает ли лини я целый байт?

jb    _label3                 ;Переход по метке, если нет

inc   bx                      ;Переход к следующему байту видеопамяти

mov   al,0ffh                

mov   es:[bx],al              ;Занесение в видеопамять кода 11111111b

sub   len,8                   ;Уменьшение длины линии

jmp   _label2

;Заполнение последнего байта, занятого линией

_label3:

cmp   len,0                   ;Проверка: выведена ли вся линия?

je    _label4                 ;Переход по метке, если да

inc   bx                      ;Иначе переход к следующему байту видеопамяти

mov   si,len

dec   si                      ;Занесение в si номера элемента в массиве

mov   al,last_byte[si]        ;Занесение в al значения байта из массива

mov   es:[bx],al              ;Занесение в видеопамять байта данных

_label4:

xor   ax,ax

int   16h                     ;Ожидание нажатия клавиши

mov   ax,4c00h         

int   21h                     ;Возвращение в прежнее состояние

CODE ends

end start

5.1 Алгоритм программы, выводящей на экран вертикальную линию с заданными начальными координатами и заданной длиной:


5.2 Листинг программы, выводящей на экран вертикальную линию с заданными начальными координатами и заданной длиной:

DATA SEGMENT PARA PUBLIC 'data'

x           dw 300            ;Координатах (0<=x<=639)

y           dw 50             ;Координата y (0<=y<=199)

len         dw 100            ;Длина линии (0<=len<=199-у)

address     dw 0              ;Адрес байта в видеопамяти

byte_mask   db 128            ;Маскабайта

DATA ENDS

CODE SEGMENT PARA PUBLIC 'code'

ASSUME CS:CODE, DS:DATA

.286

start:

mov   ax,data

mov   ds,ax

;Инициализация графического режима

mov   ax,6

int   10h        

mov   ax,0b800h

mov   es,ax

;Получение [Х/8]

mov   ax,x

mov   cl,3

shr   ax,cl

mov   address,ax              ;Занесение [Х/8] в address

;Получение остатка от [Х/8] и занесение его в cх

shl   ax,cl

mov   cx,x

sub   cx,ax

shr   byte_mask,cl            ;Занесениев byte_mask байтапикселялинии

;Получение [Y/2]

mov   ax,y

shr   ax,1

;Проверка флага CF (проверка на чётность)

jnc   _parity

add   address,2000h           ;Добавление 2000h в address для нечётных строк

_parity:

;Получение [Y/2]*16

mov   cl,4

shl   ax,cl

add   address,ax              ;Добавление [Y/2]*16 к address

;Получение [Y/2]*64

mov   cl,2

shl   ax,cl

add   address,ax              ;Добавление [Y/2]*64 к address

mov   bx,address              ;Занесение в bx адреса первого байта

mov   al,byte_mask            ;Занесение в al маски

;Заполнение байтов видеопамяти, занятых линией

mov   cx,len

_label1:

mov   es:[bx],al              ;Занесение в видеопамять байта данных

cmp   bx,2000h                ;Проверка: является ли текущая строка нечётной

Похожие материалы

Информация о работе