Когда-то давно написал под DOS на TASM. Пишет напрямую в видео память 0xa000 (real mode).
Без закраски.
; IN: XC,YC - Position
; R - RADIUS
; COLOR - Color of circle
xc EQU ss:[bp+8]
yc EQU ss:[bp+6]
R EQU ss:[bp+4]
Color EQU ss:[bp+2]
CIRCLE_PROC PROC
mov bp,sp
mov ax,yc
sub ax,R
mov [y],ax
inc [y]
mov ax,xc
sub ax,R
inc ax
mov [xb],ax
xor edx,edx
mov cx,R
shl cx,1
dec cx
@FOR_Y:
push cx
mov ax,[xb]
mov [x],ax
mov cx,R
shl cx,1
dec cx
@FOR_X:
movzx eax,[x]
movzx ebx,word ptr xc
sub eax,ebx
imul eax
xchg eax,esi
movzx eax,[y]
movzx ebx,word ptr yc
sub eax,ebx
imul eax
add eax,esi
movzx ebx,word ptr R
imul ebx,ebx
cmp eax,ebx
ja @NOT_CIRCLE
movzx ebx,word ptr R
dec ebx
imul ebx,ebx
cmp eax,ebx
jb @NOT_CIRCLE
imul ax,[y],320
add ax,[x]
xchg di,ax
mov bx,ds
mov ax,0a000h
mov ds,ax
mov ax,color
mov byte ptr [di],al
mov ds,bx
@NOT_CIRCLE:
inc [x]
loop @FOR_X
pop cx
inc [y]
loop @FOR_Y
ret 8
xb dw ?
x dw ?
y dw ?
ENDP
circle MACRO x,y,R,color
push x y R color
call circle_proc
endm
С закраской:
; IN: XC,YC - Position
; R - RADIUS
; COLOR - Color of circle
xc EQU ss:[bp+8]
yc EQU ss:[bp+6]
R EQU ss:[bp+4]
Color EQU ss:[bp+2]
FILLCIRCLE_PROC PROC
mov bp,sp
mov ax,yc
sub ax,R
mov [y],ax
inc [y]
mov ax,xc
sub ax,R
inc ax
mov [xb],ax
xor edx,edx
mov cx,R
shl cx,1
dec cx
@FOR_Y:
push cx
mov ax,[xb]
mov [x],ax
mov cx,R
shl cx,1
dec cx
@FOR_X:
movzx eax,[x]
movzx ebx,word ptr xc
sub eax,ebx
imul eax
xchg eax,esi
movzx eax,[y]
movzx ebx,word ptr yc
sub eax,ebx
imul eax
add eax,esi
movzx ebx,word ptr R
imul ebx,ebx
cmp eax,ebx
ja @NOT_CIRCLE
imul ax,[y],320
add ax,[x]
xchg di,ax
mov bx,ds
mov ax,0a000h
mov ds,ax
mov ax,color
mov byte ptr [di],al
mov ds,bx
@NOT_CIRCLE:
inc [x]
loop @FOR_X
pop cx
inc [y]
loop @FOR_Y
ret 8
xb dw ?
x dw ?
y dw ?
ENDP
fillcircle MACRO x,y,R,color
push x y R color
call fillcircle_proc
endm
На почту кидать некогда.