Санкт-Петербургский Государственный Университет Информационных Технологий, Механики и Оптики (Технический Университет)
по курсу "Компьютерная графика"
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] +
|
|
; Address = [X/8] + [Y/2]
|
; Temp = [Y/2] * 64
|
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 Алгоритм программы, выводящей на экран горизонтальную линию с заданными начальными координатами и заданной длиной:
;Вычисление адреса первого байта
;и маски первого пикселя в байте
;Циклический сдвиг дополнительной
;маски и изменение маски первого
;байта. Формирование первого байта
;Проверка: вся ли линия занесена в
|
;Циклическое заполнение последующих
;”полных” байтов
;Проверка: вся ли линия занесена в
;видеопамять?
;Заполнение последнего байта
;из массива возможных значений
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 ;Проверка: является ли текущая строка нечётной
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.