; Example of drawing a circle on the screen, using a midpoint algorithm. drawcircle 
; takes 3 parameters: x location, y location and the circle diameter in pixels.

IDEAL
MODEL small
STACK 100h
DATASEG
x        dw  40
y        dw  40 
xcoord   equ [bp+4]
ycoord   equ [bp+6]
x0       equ [bp+8]
y0       equ [bp+6]
diameter equ [bp+4]
x00      dw ?
y00      dw ?
ddx      dw ?
ddy      dw ?
err1     dw ?
color    db  0Dh  ;0Ch-red, 9- light blue, 0Ah - light green, 0Dh - light magenta, 0Eh - yellow

CODESEG

proc  drawpixel
      push bp
      mov bp,sp
      push ax
      push bx
      push cx
      push dx
      mov cx,xcoord
      mov dx,ycoord
      mov al,[color]
      mov bh,0h
      mov ah,0Ch
      int 10h
      pop dx
      pop cx
      pop bx
      pop ax
      pop bp
      ret 4  
endp  drawpixel


proc  drawcircle
; Midpoint circle algorithm
      push bp
      mov  bp,sp
      push ax
      push bx
      push cx
      push dx
      mov cx,x0
      mov dx,y0
      mov [x00],cx
      mov [y00],dx
      mov ax,diameter
      shr ax,1              ;radius
      dec ax
      xor bx,bx
      mov [ddx],1
      mov [ddy],1
      mov cx,[ddx]
      sub cx,diameter
      mov [err1],cx

loop1:
      ;putpixel 1
      mov cx,[x00]
      add cx,ax
      mov dx,[y00]
      add dx,bx
      push dx
      push cx
      call drawpixel
      
      ;putpixel 2
      mov cx,[x00]
      add cx,bx
      mov dx,[y00]
      add dx,ax
      push dx
      push cx
      call drawpixel
      
      ;putpixel 3
      mov cx,[x00]
      sub cx,bx
      mov dx,[y00]
      add dx,ax
      push dx
      push cx
      call drawpixel
      
      ;putpixel 4
      mov cx,[x00]
      sub cx,ax
      mov dx,[y00]
      add dx,bx
      push dx
      push cx
      call drawpixel
      
      ;putpixel 5
      mov cx,[x00]
      sub cx,ax
      mov dx,[y00]
      sub dx,bx
      push dx
      push cx
      call drawpixel
      
      ;putpixel 6
      mov cx,[x00]
      sub cx,bx
      mov dx,[y00]
      sub dx,ax
      push dx
      push cx
      call drawpixel
      
      ;putpixel 7
      mov cx,[x00]
      add cx,bx
      mov dx,[y00]
      sub dx,ax
      push dx
      push cx
      call drawpixel
      
      ;putpixel 8
      mov cx,[x00]
      add cx,ax
      mov dx,[y00]
      sub dx,bx
      push dx
      push cx
      call drawpixel
      
      ;if err <= 0
      cmp [err1],0
      jg  next1
      inc bx            ; err1 <= 0
      mov cx,[err1]
      add cx,[ddy]
      mov [err1],cx
      add [ddy],2
      jmp endcheck
next1:                  ; err1 > 0
      dec ax
      add [ddx],2
      mov cx,[err1]
      add cx,[ddx]
      sub cx,diameter
      mov [err1],cx                  
      
endcheck:
      cmp ax,bx
      jb  cont
      jmp loop1      
       
cont:
      pop dx
      pop cx
      pop bx
      pop ax
      pop bp
      ret 6

endp  drawcircle

start:
      mov ax, @data
      mov ds, ax 
; Graphic mode
      mov  ax,13h
      int  10h
      push 100        ;x location
      push 80         ;y location
      push 50         ;circle's diameter
      call drawcircle
      
; Wait for key press
      mov  ah,00h  
      int  16h
      inc  bl     

; Return to text mode
      mov  ah,0
      mov  al,2
      int  10h 
exit:         
      mov  ax, 4c00h
      int  21h
END start 