Skip to content

Instantly share code, notes, and snippets.

@NightBrownie
Created November 10, 2011 12:02
Show Gist options
  • Save NightBrownie/1354701 to your computer and use it in GitHub Desktop.
Save NightBrownie/1354701 to your computer and use it in GitHub Desktop.
;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