home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / circle.lha / circle.asm next >
Encoding:
Assembly Source File  |  1992-09-02  |  2.4 KB  |  110 lines

  1. ******************************************************************************
  2. *Draw circle around Center (d0,d1) with Radius (d2) in Plane (a5).
  3. *Made by Patrick van Logchem (v912152@si.hhs.nl) on 7 June 1993.
  4. ******************************************************************************
  5.  
  6. center:
  7.     dc.w    0,0
  8.  
  9.     cnop    0,8
  10.     
  11. Circle:
  12.     lea    center(pc),a3
  13.     movem.w    d0/d1,(a3)    ; place center in buffer
  14.  
  15.     move.w    d0,d3
  16.     sub.w    d2,d3        ; d3 = -X
  17.  
  18.     lea    RowTab(pc),a4    ; this table contains pre-calculated offsets
  19.                 ; (with base 0) for every rasterline.
  20.     move.w    d1,d4
  21.     add.w    d4,d4
  22.     move.w    (a4,d4.w),d4
  23.  
  24.     move.w    d3,d5
  25.     asr.w    #3,d5
  26.     sub.w    d5,d4
  27.     bchg    d3,(a5,d4.w)
  28.     add.w    d5,d4
  29.  
  30.     add.w    d2,d3
  31.     add.w    d2,d3        ; d3 = +X
  32.  
  33.     move.w    d3,d5
  34.     asr.w    #3,d5
  35.     sub.w    d5,d4
  36.     bchg    d3,(a5,d4.w)
  37.  
  38.     moveq    #0,d0        ; X = 0
  39.     move.w    d2,d1        ; Y = R
  40.  
  41.     move.w    d2,d6
  42.     lsr.w    #1,d6        ; D = R>>1
  43.    
  44.     bra.s    skip4
  45.  
  46. ; make sure (with nop's) that cir_lp is on a 8 byte boundary for max speed.
  47.  
  48. cir_lp:
  49.     cmp.w    d1,d5
  50.     beq.s    skip4        ; if(Y != Y_old) /* only plot in new rows */
  51.     plot4    d0,d1        ;  set (X,Y),(X,-Y),(-X,-Y),(-X,Y)
  52. skip4:
  53.     plot4    d1,d0        ; set (Y,X),(Y,-X),(-Y,-X),(-Y,X)
  54.     move.w    d1,d5        ; Y_old = Y
  55.    
  56.     addq.w    #1,d0        ; X += 1
  57.     sub.w    d0,d6        ; D -= X
  58.     bgt.s    noYdec        ; if(D < 0) {
  59.     subq.w    #1,d1        ;  Y -= 1
  60.     add.w    d1,d6        ;  D += Y }
  61. noYdec:
  62.     cmp.w    d0,d1        ; while(X < Y)    /* not finished 1/8 part ?? */
  63.     bgt.w    cir_lp        ;  loop
  64.  
  65.     bne.s    SkipEqu        ; if(X == Y)
  66.     plot4    d0,d1        ;  set (X,Y),(X,-Y),(-X,-Y),(-X,Y)
  67. SkipEqu:
  68.     rts
  69.  
  70. ******************************************************************************
  71. *Macro to set 4 simetrical pixels around ((middle),(middle+2)).
  72. *\1 = x ,\2 = y (are not touched; d2-d5 are!)
  73.  
  74. plot4    MACRO
  75.     movem.w    (a3),d2/d3    ; get X and Y
  76.     move.w    d3,d4        ; and another Y
  77.     add.w    \1,d2        ; d2 = +X
  78.     add.w    \2,d3        ; d3 = +Y
  79.     sub.w    \2,d4        ; d4 = -Y
  80.  
  81.     add.w    d3,d3        ; make offset +Y
  82.     add.w    d4,d4        ; make offset -Y
  83.     move.w    (a4,d3.w),d3    ; d3=Width/8 * +Y
  84.     move.w    (a4,d4.w),d4    ; d4=Width/8 * -Y
  85.  
  86.     move.w    d2,d5
  87.     asr.w    #3,d5        ; d5=X/8
  88.     sub.w    d5,d3
  89.     sub.w    d5,d4
  90.     bchg    d2,(a5,d3.w)    ; (+X,+Y)
  91.     bchg    d2,(a5,d4.w)    ; (+X,-Y)
  92.  
  93. *Note: when changing this in to bfchg, speed DEcreases, so 4get it !
  94.  
  95.     add.w    d5,d3
  96.     add.w    d5,d4
  97.  
  98.     sub.w    \1,d2
  99.     sub.w    \1,d2        ; d2 = -X
  100.  
  101.     move.w    d2,d5
  102.     asr.w    #3,d5        ; d5=X/8
  103.     sub.w    d5,d3
  104.     sub.w    d5,d4
  105.     bchg    d2,(a5,d3.w)    ; (-X,+Y)
  106.     bchg    d2,(a5,d4.w)    ; (-X,-Y)
  107.     ENDM
  108.  
  109. ******************************************************************************
  110.