Created
November 10, 2011 12:02
-
-
Save NightBrownie/1354701 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;07) Шар и сопряженную пирамиду с треугольником в основании. | |
.model small | |
.stack 1000h | |
.data | |
saveMode db ? | |
color db 30 | |
x dw ? | |
y dw ? | |
x1 dw ? | |
x2 dw ? | |
y1 dw ? | |
y2 dw ? | |
delta dw ? | |
deltaX dw ? | |
deltaY dw ? | |
signX dw ? | |
signY dw ? | |
err1 dw ? | |
err2 dw ? | |
radA dw ? | |
radB dw ? | |
.code | |
.486 | |
;----------------------------------------------------- | |
;Функция инициализации графики | |
;----------------------------------------------------- | |
initGraph proc | |
mov AH, 0Fh ;Сохранение прежнего режима экрана | |
int 10h | |
mov saveMode, AL | |
mov AH, 0 | |
mov AL, 13h ;Переход в графический режим | |
int 10h | |
ret | |
initGraph endp | |
;----------------------------------------------------- | |
;Функция завершения работы с графическим режимом | |
;----------------------------------------------------- | |
closeGraph proc | |
mov AH, 0h | |
mov AL, saveMode ;Восстановление изначального графического режима | |
int 10h | |
ret | |
closeGraph endp | |
;----------------------------------------------------- | |
;Функция нахождения модуля числа | |
;----------------------------------------------------- | |
absolut proc | |
pop BP | |
pop AX | |
cmp AX, 0 ;Проверка на нахождение на числовой оси относительно нуля | |
jge end_abs ;В случае положительности числа ничего не делать | |
neg AX ;В случае отрицательности числа - инвертировать его | |
end_abs: | |
push AX | |
push BP | |
ret | |
absolut endp | |
;----------------------------------------------------- | |
;Функция нахождения сигнума числа | |
;----------------------------------------------------- | |
sign proc | |
pop BP | |
pop AX | |
cmp AX, 0 | |
jge sign_bg | |
mov AX, -1 | |
jmp end_sign | |
sign_bg: | |
mov AX, 1 | |
jmp end_sign | |
end_sign: | |
push AX | |
push BP | |
ret | |
sign endp | |
;----------------------------------------------------- | |
;Функция для рисования одной точки | |
;по заданным координатам и цвету | |
;----------------------------------------------------- | |
drawPoint proc | |
pop BP | |
mov AH, 0Ch ;Функция рисования точки | |
mov AL, color ;Цвет точки | |
mov BH, 0h ;Видео страница | |
pop DX ;Координата по Y | |
pop CX ;Координата по X | |
int 10h ;Прерывание BIOS для рисования | |
inc color | |
push BP | |
ret | |
drawPoint endp | |
;----------------------------------------------------- | |
;Функция рисования линии по заданным | |
;точкам (x1, y1), (x2, y2) | |
;----------------------------------------------------- | |
drawLine proc | |
mov AX, x2 | |
mov BX, x1 | |
sub AX, BX | |
push AX | |
push AX | |
call sign | |
pop signX ;Нахождение сигнума для вычисления смещения по оси X | |
call absolut | |
pop deltaX ;Приращение X | |
mov AX, y2 | |
mov BX, y1 | |
sub AX, BX | |
push AX | |
push AX | |
call sign ;Нахождение сигнума для вычисления смещения по оси Y | |
pop signY | |
call absolut | |
pop deltaY ;Приращение Y | |
mov AX, deltaX | |
mov BX, deltaY | |
sub AX, BX | |
mov err1, AX | |
L_drawLine: | |
push x1 | |
push y1 | |
call drawPoint ;Рисование последней вычисленной точки | |
mov AX, x1 ;Проверка достижения конца линии | |
mov BX, x2 | |
cmp AX, BX | |
jne next_drawLine | |
mov AX, y1 | |
mov BX, y2 | |
cmp AX, BX | |
je end_drawLine | |
next_drawLine: | |
mov AX, err1 | |
shl AX, 1 | |
mov err2, AX ;Вычисление значения двойной ошибки для того, | |
;чтобы не использовать деление в алгоритме, дабы не потерять точность | |
mov AX, deltaY | |
neg AX | |
cmp err2, AX | |
jle next_drawLine2 | |
mov AX, err1 | |
mov BX, deltaY | |
sub AX, BX | |
mov err1, AX | |
mov AX, x1 | |
mov BX, signX | |
add AX, BX | |
mov x1, AX | |
next_drawLine2: | |
mov AX, deltaX | |
cmp err2, AX | |
jge L_drawLine | |
mov AX, err1 | |
mov BX, deltaX | |
add AX, BX | |
mov err1, AX | |
mov AX, y1 | |
mov BX, signY | |
add AX, BX | |
mov y1, AX | |
jmp L_drawLine | |
end_drawLine: | |
ret | |
drawLine endp | |
;----------------------------------------------------- | |
;Функция рисования окружности | |
;----------------------------------------------------- | |
drawCircle proc | |
mov x, 0 | |
mov AX, radB | |
mov y, AX | |
mov AX, radB | |
shl AX, 1 | |
mov delta, 2 | |
sub delta, AX ;Смещение | |
mov err1, 0 ;Изначальное значение | |
L_drawCircle: | |
cmp y, 0 | |
jl end_drawCircle ;Условие окончания рисования круга | |
mov AX, x1 ;четверть круга | |
add AX, x | |
push AX | |
mov AX, y1 | |
add AX, y | |
push AX | |
mov AX, x1 ;четверть круга | |
add AX, x | |
push AX | |
mov AX, y1 | |
sub AX, y | |
push AX | |
mov AX, x1 ;четверть круга | |
sub AX, x | |
push AX | |
mov AX, y1 | |
add AX, y | |
push AX | |
mov AX, x1 ;четверть круга | |
sub AX, x | |
push AX | |
mov AX, y1 | |
sub AX, y | |
push AX | |
mov AX, delta | |
add AX, y | |
shl AX, 1 | |
dec AX | |
mov err1, AX | |
cmp delta, 0 | |
jge next_drawCircle | |
cmp err1, 0 | |
jg next_drawCircle | |
inc x | |
mov AX, x | |
shl AX, 1 | |
inc AX | |
add delta, AX | |
jmp L_drawCircle | |
next_drawCircle: | |
mov AX, delta | |
sub AX, x | |
shl AX, 1 | |
dec AX | |
mov err1, AX | |
cmp delta, 0 | |
jle next1_drawCircle | |
cmp err1, 0 | |
jle next1_drawCircle | |
dec y | |
mov AX, y | |
shl AX, 1 | |
neg AX | |
add AX, 1 | |
add delta, AX | |
jmp L_drawCircle | |
next1_drawCircle: | |
inc x | |
mov AX, x | |
sub AX, y | |
shl AX, 1 | |
add delta, AX | |
dec y | |
jmp L_drawCircle | |
end_drawCircle: | |
ret | |
drawCircle endp | |
start: | |
mov AX, @data | |
mov DS, AX | |
call initGraph | |
mov x1, 0 | |
mov y1, 0 | |
mov x2, 160 | |
mov y2, 100 | |
call drawLine | |
mov radB, 50 | |
mov x1, 160 | |
mov y1, 100 | |
;call drawCircle | |
mov AH, 01h | |
int 21h | |
call closeGraph | |
mov AX, 4c00h | |
int 21h | |
end start |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment