Графика на языке Assembler

Автор работы: Пользователь скрыл имя, 07 Декабря 2010 в 15:19, Не определен

Описание работы


Программа реализована на языке “Assembler”. Для вывода графики на экран используется прямое обращение к видеобуферу. Для достижения плавности прорисовки изображения применяется синхронизация с вертикальной развёрткой монитора.

Файлы: 1 файл

AsmKurs.doc

— 108.00 Кб (Скачать файл)

Федеральное агентство по образованию

ГОУ ВПО

Уфимский  государственный авиационный технический  университет 
 
 
 

Курсовая  работа

по дисциплине «Микропрограммирование»

 

«Графика на языке Assembler» 
 
 
 
 
 

                  Выполнил:

                  студент гр. ПО-228

                  Елизарьев Д.И. 
                   
                   
                   
                   
                   
                   
                   
                   

Уфа

2008 

   1. Постановка задачи

   Необходимо  разработать программу, выводящую  на экран трехмерный куб, и позволяющую поворачивать его с помощью клавиш.

   Программа реализована на языке “Assembler”. Для вывода графики на экран используется прямое обращение к видеобуферу. Для достижения плавности прорисовки изображения применяется синхронизация с вертикальной развёрткой монитора.

   Повороты  вокруг осей производятся по следующим  формулам:

    • Вокруг оси X:  
    • Вокруг оси Y: 
    • Вокруг оси Z: 

   Для рисования  линии используется алгоритм Брезенхэма.

   Значения  синуса и косинуса вычисляются при  помощи таблицы синусов для углов от 0 до 90 градусов. 

   2. Текст программы. 

DATAS SEGMENT

X  DW 0  ;Промежуточная координата X

Y  DW 0  ;Промежуточная координата Y

Z  DW 0  ;Промежуточная координата Z 

ANX  DW 0  ;Текущий угол поворота вокруг оси X

ANY  DW 0  ;Текущий угол поворота вокруг оси Y

ANZ  DW 0  ;Текущий угол поворота вокруг оси Z 

DeltaX  DW 2 ;Приращение угла поворота вокруг оси X

DeltaY  DW 2 ;Приращение угла поворота вокруг оси Y

DeltaZ  DW 2 ;Приращение угла поворота вокруг оси Z 

X2D  DW 0  ;Проекция трехмерной точки на плоскость

Y2D  DW 0  ; 

X1  DW 0  ;Координаты

Y1  DW 0  ;начала и

X2  DW 0  ;конца

Y2  DW 0  ;линии 

DelX  DW 0  ;Промежуточные

DelY  DW 0  ;переменные,

LenX  DW 0  ;используемые

LenY  DW 0  ;в процедуре

Leng  DW 0  ;рисования

D  DW 0  ;линии 

COLOR  DB 10 ;Цвет фигуры

FULLCIRCLE DW 360 ;Константа = 360 градусов

POINTS  DW 8 ;Количество вершин

WID  DW 320  ;Ширина экрана 

;Таблица синусов  углов от 0 до 90 градусов.

;Каждое значение  синуса умножено на 512

SINES DW 0, 9, 18, 27, 36, 45

      DW 54, 62, 71, 80, 89

      DW 98, 106, 115, 124, 133

      DW 141, 150, 158, 167, 175

      DW 183, 192, 200, 208, 216

      DW 224, 232, 240, 248, 256

      DW 264, 271, 279, 286, 294

      DW 301, 308, 315, 322, 329

      DW 336, 343, 349, 356, 362

      DW 368, 374, 380, 386, 392

      DW 398, 403, 409, 414, 419

      DW 424, 429, 434, 439, 443

      DW 448, 452, 456, 460, 464

      DW 468, 471, 475, 478, 481

      DW 484, 487, 490, 492, 495

      DW 497, 499, 501, 503, 504

      DW 506, 507, 508, 509, 510

      DW 511, 511, 512, 512, 512

;Координаты вершин  куба

CUBE DW  20, 20, 20

      DW 20, 20, -20

      DW 20, -20, -20

      DW 20, -20, 20

      DW -20, -20, 20

      DW -20, 20, 20

      DW -20, 20, -20

      DW -20, -20, -20

DATAS ENDS 

CODES SEGMENT

ASSUME DS:DATAS, CS:CODES 

FIND_SIN PROC  ;Нахождение синуса угла от 0 до 360 градусов

 push ax

push cx

sub cx, cx

cmp ax, 181

jb SIN_POS

mov cx, 8000h

sub ax, 180

SIN_POS:

cmp ax, 91

jb GET_SIN

neg ax

add ax, 180

GET_SIN:

mov bx, ax

shl bx, 1

mov bx, sines[bx]

cmp cx, 8000h

jne NE1

neg bx

NE1:

pop cx

pop ax

ret

FIND_SIN ENDP 

FIND_COS PROC  ;Нахождение косинуса угла от 0 до 360 градусов

 push ax

push cx

sub cx, cx

 cmp ax, 91  ;если угол 90 и меньше,

jb COS_POS  ;то знак положительный

cmp ax, 269  ;если угол 270 и больше, то знак "плюс"

jg CP

mov cx, 8000h  ;иначе ставим флаг в CX, что знак "минус"

sub ax, 90  ;делаем поправку на 90

 cmp ax, 91

jb GET_COS  ;если < 91

neg ax   ;иначе угол = 180 - угол

add ax, 180

jmp GET_COS

CP:

sub ax, 270  ;угол = 270 - угол

jmp GET_COS

COS_POS:

neg ax

add ax, 90

cmp ax, 91

jb GET_COS

neg ax

add ax, 360

GET_COS:  ;достаём значение косинуса из таблицы синусов

 mov bx, ax

shl bx, 1

mov bx, sines[bx]

cmp cx, 8000h 

 jne NE2   ;если знак "минус",

neg bx    ;то меняем знак

NE2:

 pop cx

pop ax

ret

ENDP FIND_COS 

PUTPIXEL PROC ;Рисование точки в X2D, Y2D, цветом COLOR

push ax

push di

mov ax, 100  ;Высота экрана/2

 sub ax, Y2D

push dx

mul WID   ;Index = Y * WIDTH

pop dx

add ax, X2D  ;Index + X

add ax, 160

mov di, ax

mov al, COLOR

mov byte ptr ES:[di], al ;рисуем точку

pop di

pop ax

ret

ENDP PUTPIXEL 

PROJECT PROC  ;Проецирование трёхмерной точки на плоскость

 push ax

mov ax, X

mov X2D, ax

mov ax, Y

mov Y2D, ax

pop ax

ret

ENDP PROJECT 

ROTX PROC   ;Поворот точки вокруг оси X

 push cx

push ax

push bx

push dx

mov ax, ANX

CALL FIND_COS  ;

mov ax, bx  ;

imul Y   ;

mov cx, ax  ;

mov ax, ANX  ;

CALL FIND_SIN  ;YNEW = Y*COS(ANX) - Z*SIN(ANX)

mov ax, bx  ;

imul Z   ;

neg ax   ;

add ax, cx  ;

sar ax, 9  

mov cx, Y  

mov Y, ax   

mov ax, ANX  ;

CALL FIND_SIN  ;

mov ax, bx  ;

 imul cx

mov cx, ax  ;

mov ax, ANX  ;ZNEW = Y*SIN(ANX) + Z*COS(ANX)

CALL FIND_COS  ;

mov ax, bx  ;

imul Z   ;

add ax, cx  ;

sar ax, 9

mov Z, ax 

pop dx

pop bx

pop ax

pop cx

 ret

ENDP ROTX 

ROTY PROC  ;Поворот точки вокруг оси Y

 push cx

push ax

push bx

push dx 

mov ax, ANY

CALL FIND_COS  ;

mov ax, bx  ;

imul X   ;

mov cx, ax  ;

mov ax, ANY  ;

CALL FIND_SIN  ;XNEW = X*COS(ANY) - Z*SIN(ANY)

mov ax, bx  ;

imul Z   ;

neg ax   ;

add ax, cx  ;

sar ax, 9

mov cx, X  

mov X, ax   

mov ax, ANY  ;

CALL FIND_SIN  ;

mov ax, bx  ;

imul cx   ;

mov cx, ax  ;

mov ax, ANY  ;ZNEW = X*SIN(ANY) + Z*COS(ANY)

CALL FIND_COS  ;

mov ax, bx  ;

imul Z   ;

add ax, cx  ;

sar ax, 9

mov Z, ax 

pop dx

 pop bx

pop ax

pop cx

 ret

ENDP ROTY 

ROTZ PROC  ;Поворот точки вокруг оси Z

 push cx

push ax

push bx

push dx 

mov ax, ANZ

CALL FIND_COS  ;

mov ax, bx  ;

imul X   ;

mov cx, ax  ;

mov ax, ANZ  ;

CALL FIND_SIN  ;XNEW = X * COS(ANZ) - Y * SIN(ANZ)

mov ax, bx  ;

imul Y   ;

neg ax   ;

add ax, cx  ;

sar ax, 9

mov cx, X  

mov X, ax   

mov ax, ANZ  ;

CALL FIND_SIN  ;

mov ax, bx  ;

imul cx   ;

mov cx, ax  ;

mov ax, ANZ  ;YNEW = X * SIN(ANZ) + Y * COS(ANZ)

CALL FIND_COS  ;

mov ax, bx  ;

imul Y   ;

add ax, cx  ;

sar ax, 9

mov Y, ax 

pop dx

pop bx

pop ax

pop cx

ret

ENDP ROTZ 

WAITVRT PROC   ;Ждёт вертикальную развёртку монитора.

    mov     dx,3dah  ;3DAh - Номер порта экрана

Vrt:

    in      al,dx

    test    al,8

    jnz     Vrt  ;Ждать пока развёртка начнётся

NoVrt:

    in      al,dx

    test    al,8

    jz      NoVrt  ;Ждать, пока развёртка закончится

    ret

ENDP WAITVRT 

;Процедура рисования  куба.

;Здесь последовательно  вычисляются координаты двух  соседних ;вершин, и проводится линия между ними.

;Всего 16 линий.

DRAWCUBE PROC

push cx

push ax

push bx

push dx

mov cx, POINTS

Информация о работе Графика на языке Assembler