;---------------------------------------------------------------
;Bresenham algorithm
;	( radius -- )
code 'circle', circle
	push ebx
	push edx
	push edi
	mov edx,eax	;y= r
	xor ebx,ebx	;x= 0
	mov ecx,edx	;d= -2r+3
	neg ecx
	shl ecx,1
	add ecx,3
	
.1	call .draw
	or ecx,ecx
	jns .2a				;if d<0, d=d+4x+6
	  lea ecx,[ecx + 4*ebx + 6]
	jmp short .2b			;else
.2a	  mov eax,ebx			;  d=d+4(x-y)+10
	  sub eax,edx
	  lea ecx,[ecx + 4*eax + 10]
	  dec edx			;  y--
.2b	inc ebx				;x++
	cmp ebx,edx
	jb .1				;repeat until x=y
	pop edi
	pop edx
	pop ebx
	drop
	ret

.draw	push ecx
	mov eax,[fore]
	call clip	;edi = frame + x + y*hp
	push edi

	mov ecx,edx		;y-cy
	imul ecx,hp
	sub edi,ecx
	sub edi,ebx		;x-cx
	mov ecx,ebx
	shl ecx,1
	mov [edi],al
	add edi,ecx
	mov [edi],al

	mov edi,[esp]
	mov ecx,ebx		;y-cx
	imul ecx,hp
	sub edi,ecx
	sub edi,edx		;x-cy
	mov ecx,edx
	shl ecx,1
	mov [edi],al
	add edi,ecx
	mov [edi],al

	mov edi,[esp]
	mov ecx,ebx		;y+cx
	imul ecx,hp
	add edi,ecx
	sub edi,edx		;x-cy
	mov ecx,edx
	shl ecx,1
	mov [edi],al
	add edi,ecx
	mov [edi],al

	pop edi
	mov ecx,edx		;y+cy
	imul ecx,hp
	add edi,ecx
	sub edi,ebx		;x-cx
	mov ecx,ebx
	shl ecx,1
	mov [edi],al
	add edi,ecx
	mov [edi],al
	
	pop ecx
	ret
