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

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

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


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

Файлы: 1 файл

AsmKurs.doc

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

mov si, 0

DRC:

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X1, ax

mov Y1, bx

add si, 6 

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X2, ax

mov Y2, bx

add si, 6

 

CALL LINE 

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X1, ax

mov Y1, bx

add si, 6 

CALL LINE 

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X2, ax

mov Y2, bx

add si, 6

 

CALL LINE 

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X1, ax

mov Y1, bx

add si, 6 

CALL LINE 

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X2, ax

mov Y2, bx

add si, 6

 

CALL LINE 

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X1, ax

mov Y1, bx

add si, 6 

CALL LINE 

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X2, ax

mov Y2, bx

add si, 6

 

CALL LINE 

mov si, 12

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X1, ax

mov Y1, bx 

CALL LINE 

mov si, 24

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X1, ax

mov Y1, bx 

mov si, 0

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X1, ax

mov Y1, bx 

mov si, 30

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X2, ax

mov Y2, bx 

CALL LINE 

mov si, 18

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X2, ax

mov Y2, bx 

CALL LINE 

mov si, 6

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X1, ax

mov Y1, bx 

mov si, 36

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X2, ax

mov Y2, bx 

CALL LINE 

mov si, 42

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X1, ax

mov Y1, bx 

mov si, 24

mov ax, CUBE[si]

mov bx, CUBE[si+2]

mov dx, CUBE[si+4]

mov X, ax

mov Y, bx

mov Z, dx

CALL ROTX

CALL ROTY

CALL ROTZ

CALL PROJECT

mov ax, X2D

mov bx, Y2D

mov X2, ax

mov Y2, bx 

CALL LINE 

pop dx

pop bx

pop ax

pop cx

 ret

ENDP DRAWCUBE 

;Алгоритм Брезенхэма  для линии.

;Суть  алгоритма заключается в том,  что мы на каждом шаге ;увеличиваем координату X на единицу, и прибавляем к так ;называемой «Ошибке» значение DelY, которое равно “Y2 – Y1. Если ;ошибка превышает LenX, то увеличиваем координату Y (X) на ;единицу. Данный алгоритм пригоден только в том случае, если 
;X2 > X1 и расстояние по горизонтали (X2 – X1) больше расстояния ;по вертикали (Y2 – Y1). Иначе же, если X2 < X1, то к координате ;X не прибавляем единицу, а наоборот, отнимаем. Если ;вертикальное расстояние больше горизонтального, то переменные ;X и Y меняются ролями: на каждом шаге увеличиваем Y на единицу, ;а X увеличивается в зависимости от «Ошибки».

LINE PROC

 push cx

 push ax

 push bx

 push dx

mov DelX, 1   ;Приращение X = 1

mov DelY, 1   ;Приращение Y = 1

mov ax, x2

cmp ax, x1

jge X2GX1   ;если X2 < X1

 neg DelX    ;DelX = -1

X2GX1:

mov ax, Y2

cmp ax, Y1

jge Y2GY1   ;Если Y2 < Y1

neg DelY    ;DelY = -1

Y2GY1:

mov ax, X2

sub ax, x1

jns LENXG0

neg ax

LENXG0:

mov LenX, ax

mov ax, Y2

sub ax, Y1

jns LENYG0

neg ax

LENYG0:

mov LenY, ax

mov bx, LenX

cmp ax, bx

jg LenYGLenX

mov Leng, bx

jmp C1

LenYGLenX:

mov Leng, ax

C1:

cmp ax, bx

jg LYGLX   ;Если ABS(X2-X1) > ABS(Y2-Y1)

mov ax, X1

mov bx, Y1

mov dx, LenX

neg dx

inc Leng

mov cx, Leng

shl LenX, 1

shl LenY, 1

CYCLE1:

mov X2D, ax   ;X = X1

mov Y2D, bx   ;Y = Y1

CALL PUTPIXEL   ;Рисуем точку

add ax, DelX   ;X = X + DelX

add dx, LenY   ;D = D + 2*(Y2-Y1)

 cmp dx, 0   ;Если D > 0

jle DL01    ;

 sub dx, LenX   ;D = D - 2*(X2-X1)

add bx, DelY   ;Y = Y + DelY

DL01:

loop CYCLE1

jmp EXITLINE

LYGLX:    ;Если ABS(X2-X1) <= ABS(Y2-Y1)

mov ax, X1

mov bx, Y1

mov dx, LenY

neg dx

inc Leng

mov cx, Leng

shl LenX, 1

shl LenY, 1

CYCLE2:

mov X2D, ax   ;X = X1

mov Y2D, bx   ;Y = Y1

CALL PUTPIXEL   ;Рисуем точку

add bx, DelY   ;Y = Y + DelY

add dx, LenX   ;D = D + 2*(X2-X1)

 cmp dx, 0   ;Если D > 0

jle DL02   

 sub dx, LenY   ;D = D - 2*(Y2-Y1)

add ax, DelX   ;X = X + DelX

DL02:

loop CYCLE2

EXITLINE:

pop dx

pop bx

pop ax

pop cx

ret

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