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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

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

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

Отчёт по лабораторной работе №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                ;Проверка: является ли текущая строка нечётной

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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.