.model small
.stack
.code
xc equ word ptr [bp+10]
yc equ word ptr [bp+8]
rad equ word ptr [bp+6]
color equ byte ptr [bp+4]
; внутренние переменные
; эти переменные существуют только в процессе работы процедуры
circX equ word ptr [bp-2]
circY equ word ptr [bp-4]
circD equ word ptr [bp-6]
if 1
; вывод точки
; x=cx, y=dx, color=al
plot: push di
push es
cmp cx,320 ; координаты выходят за границы экрана ?
jnc pl1
cmp dx,200
jnc pl1
push ax
mov ax,320 ; di=320*y+x
mul dx
add ax,cx
mov di,ax
mov ax,0A000h
mov es,ax
pop ax
mov es:[di],al ; выводим точку
pl1: pop es
pop di
ret
endif
drawCircle:
; putpixel(xc+x, yc+y, RED)
mov cx,xc
add cx,circx
mov dx,yc
add dx,circy
call plot
; putpixel(xc-x, yc+y, RED)
mov cx,xc
sub cx,circx
mov dx,yc
add dx,circy
call plot
; putpixel(xc+x, yc-y, RED)
mov cx,xc
add cx,circx
mov dx,yc
sub dx,circy
call plot
; putpixel(xc-x, yc-y, RED)
mov cx,xc
sub cx,circx
mov dx,yc
sub dx,circy
call plot
; putpixel(xc+y, yc+x, RED)
mov cx,xc
add cx,circy
mov dx,yc
add dx,circx
call plot
; putpixel(xc-y, yc+x, RED)
mov cx,xc
sub cx,circy
mov dx,yc
add dx,circx
call plot
; putpixel(xc+y, yc-x, RED)
mov cx,xc
add cx,circy
mov dx,yc
sub dx,circx
call plot
; putpixel(xc-y, yc-x, RED)
mov cx,xc
sub cx,circy
mov dx,yc
sub dx,circx
call plot
ret
circle proc
push bp ; пролог Сохраняем bp в стеке
mov bp,sp ; далее мы адресуем переменные с помощью bp
sub sp,16 ; выделяем место под локальные переменные
push ax
push bx
push cx
push dx
;x = 0: y = r
;d = 3 - 2 * r
;drawCircle(xc, yc, x, y)
mov ax,0
mov circx,ax
mov ax,rad
mov circy,ax
mov ax,rad
add ax,ax
sub ax,3
neg ax
mov circd,ax
mov al,color
call drawCircle
; while (y >= x)
circle0:mov ax,circy
cmp ax,circx
jl circle1
; x=x+1
inc circx
;' update d, x, y
;if (d > 0) then
; y=y-1:d = d + 4 * (x - y) + 10
;else
; d = d + 4 * x + 6
;end if
cmp circd,0
jle circle2
dec circy
mov ax,circx
sub ax,circy
add ax,ax
add ax,ax
add ax,circd
add ax,10
mov circd,ax
jmp circle3
circle2:mov ax,circx
add ax,ax
add ax,ax
add ax,circd
add ax,6
mov circd,ax
circle3:
; drawCircle(xc, yc, x, y)
mov al,color
call drawCircle
; wend
jmp circle0
circle1:
pop dx
pop cx
pop bx
pop ax
mov sp,bp ; эпилог, восстанавливаем sp
pop bp ; восстанавливаем bp
ret 8 ; делаем возврат и продвигаем стек на 4*2=8 байт (т к 4 аргументов хранилось в стеке)
circle endp
; ******** drawline ********
; аргументы вызова - координаты линии и цвет
; эти переменные заносятся в стек перед вызовом drawline
; см invoke
x1 equ word ptr [bp+12]
y1 equ word ptr [bp+10]
x2 equ word ptr [bp+8]
y2 equ word ptr [bp+6]
col equ byte ptr [bp+4]
; внутренние переменные drawline
; эти переменные существуют только в процессе работы drawline
deltaX equ word ptr [bp-2]
deltaY equ word ptr [bp-4]
signX equ word ptr [bp-6]
signY equ word ptr [bp-8]
er equ word ptr [bp-10]
er2 equ word ptr [bp-12]
; вывод линии
; SUB drawLine (x1, y1, x2, y2, col)
; Пример вызова:
; invoke drawline, <10,10,310,10,15>
drawline proc
push bp ; пролог Сохраняем bp в стеке
mov bp,sp ; далее мы адресуем переменные с помощью bp
sub sp,16 ; выделяем место под локальные переменные
push ax
push bx
push cx
push dx
;deltaX = ABS(x2 - x1)
mov ax,x2
sub ax,x1
jge lin1
neg ax
lin1: mov deltaX,ax
;deltaY = ABS(y2 - y1)
mov ax,y2
sub ax,y1
jge lin2
neg ax
lin2: mov deltaY,ax
;IF x1 < x2 THEN signX = 1 ELSE signX = -1
mov bx,1
mov ax,x1
cmp ax,x2
JL lin3
neg bx
lin3: mov signX,bx
;iF y1 < y2 THEN signY = 1 ELSE signY = -1
mov bx,1
mov ax,y1
cmp ax,y2
JL lin4
neg bx
lin4: mov signY,bx
;er = deltaX - deltaY
mov ax,deltaX
sub ax,deltaY
mov er,ax
;PSET (x2, y2), col
mov cx,x2
mov dx,y2
mov al,col
call plot
; основной цикл построения линии
;WHILE (x1 <> x2) OR (y1 <> y2)
wil1: mov ax,x1
cmp ax,x2
jnz wil2
mov ax,y1
cmp ax,y2
jnz wil2
jmp wend
wil2:
;PSET (x1, y1), col
mov cx,x1
mov dx,y1
mov al,col
call plot
;er2 = er * 2
mov ax,er
add ax,ax
mov er2,ax
;IF (er2 > -deltaY) THEN er = er - deltaY: x1 = x1 + signX
mov ax,er2
add ax,deltaY
JLE lin5
mov ax,er
sub ax,deltaY
mov er,ax
mov ax,x1
add ax,signX
mov x1,ax
lin5:
;IF (er2 < deltaX) THEN er = er + deltaX: y1 = y1 + signY
mov ax,er2
cmp ax,deltaX
jge lin6
mov ax,er
add ax,deltaX
mov er,ax
mov ax,y1
add ax,signY
mov y1,ax
;WEND
lin6: jmp wil1
wend: pop dx
pop cx
pop bx
pop ax
mov sp,bp ; эпилог, восстанавливаем sp
pop bp ; восстанавливаем bp
ret 10 ; делаем возврат и продвигаем стек на 5*2=10 байт (т к 5 аргументов хранилось в стеке)
drawline endp
if 1
; макро вызова drawline См lst.lst, какой код генерит это макро
invoke macro CallProc,Params
IRP P,<Params>
mov ax, P
push ax
endm
call CallProc
endm
bgfill: push es
mov di,0A000h
mov es,di
mov al,11
mov ah,al
mov cx,320*100
mov di,0
cld
rep stosw
pop es
ret
start: push cs
pop ds
push cs
pop es
; граф режим 320*200*256 цветов
mov ax,13h
int 10h
; цвет неба
call bgfill
; ракета
invoke drawline, <70,128,171,79,0>
invoke drawline, <171,79,208,76,0>
invoke drawline, <208,76,192,107,0>
invoke drawline, <192,107,93,160,0>
invoke drawline, <93,160,70,128,0>
invoke drawline, <171,79,192,107,0>
; боковые треугольники
invoke drawline, <70,128,44,115,0>
invoke drawline, <44,115,93,116,0>
invoke drawline, <93,160,96,185,0>
invoke drawline, <96,185,115,150,0>
; центральный треугольник
invoke drawline, <104,134,67,163,0>
invoke drawline, <104,134,53,144,0>
invoke drawline, <67,163,53,144,0>
; окна
invoke circle,<160,103,10,0>
invoke circle,<128,120,10,0>
; солнышко
mov cx,30
m1: invoke circle,<270,45,cx,14>
invoke circle,<271,45,cx,14>
loop m1
; ожидание нажатия на клавишу
mov ah,0
int 16h
; текстовый режим
mov ax,3
int 10h
; выход в дос
mov ax,4C00h
int 21h
endif
end start
Буду очень рад если поможете в моём случае хочу написать на картинке косм корабль и автора всё. Помогите если не сложно