home *** CD-ROM | disk | FTP | other *** search
- ******************************************************************************
- *Draw circle around Center (d0,d1) with Radius (d2) in Plane (a5).
- *Made by Patrick van Logchem (v912152@si.hhs.nl) on 7 June 1993.
- ******************************************************************************
-
- center:
- dc.w 0,0
-
- cnop 0,8
-
- Circle:
- lea center(pc),a3
- movem.w d0/d1,(a3) ; place center in buffer
-
- move.w d0,d3
- sub.w d2,d3 ; d3 = -X
-
- lea RowTab(pc),a4 ; this table contains pre-calculated offsets
- ; (with base 0) for every rasterline.
- move.w d1,d4
- add.w d4,d4
- move.w (a4,d4.w),d4
-
- move.w d3,d5
- asr.w #3,d5
- sub.w d5,d4
- bchg d3,(a5,d4.w)
- add.w d5,d4
-
- add.w d2,d3
- add.w d2,d3 ; d3 = +X
-
- move.w d3,d5
- asr.w #3,d5
- sub.w d5,d4
- bchg d3,(a5,d4.w)
-
- moveq #0,d0 ; X = 0
- move.w d2,d1 ; Y = R
-
- move.w d2,d6
- lsr.w #1,d6 ; D = R>>1
-
- bra.s skip4
-
- ; make sure (with nop's) that cir_lp is on a 8 byte boundary for max speed.
-
- cir_lp:
- cmp.w d1,d5
- beq.s skip4 ; if(Y != Y_old) /* only plot in new rows */
- plot4 d0,d1 ; set (X,Y),(X,-Y),(-X,-Y),(-X,Y)
- skip4:
- plot4 d1,d0 ; set (Y,X),(Y,-X),(-Y,-X),(-Y,X)
- move.w d1,d5 ; Y_old = Y
-
- addq.w #1,d0 ; X += 1
- sub.w d0,d6 ; D -= X
- bgt.s noYdec ; if(D < 0) {
- subq.w #1,d1 ; Y -= 1
- add.w d1,d6 ; D += Y }
- noYdec:
- cmp.w d0,d1 ; while(X < Y) /* not finished 1/8 part ?? */
- bgt.w cir_lp ; loop
-
- bne.s SkipEqu ; if(X == Y)
- plot4 d0,d1 ; set (X,Y),(X,-Y),(-X,-Y),(-X,Y)
- SkipEqu:
- rts
-
- ******************************************************************************
- *Macro to set 4 simetrical pixels around ((middle),(middle+2)).
- *\1 = x ,\2 = y (are not touched; d2-d5 are!)
-
- plot4 MACRO
- movem.w (a3),d2/d3 ; get X and Y
- move.w d3,d4 ; and another Y
- add.w \1,d2 ; d2 = +X
- add.w \2,d3 ; d3 = +Y
- sub.w \2,d4 ; d4 = -Y
-
- add.w d3,d3 ; make offset +Y
- add.w d4,d4 ; make offset -Y
- move.w (a4,d3.w),d3 ; d3=Width/8 * +Y
- move.w (a4,d4.w),d4 ; d4=Width/8 * -Y
-
- move.w d2,d5
- asr.w #3,d5 ; d5=X/8
- sub.w d5,d3
- sub.w d5,d4
- bchg d2,(a5,d3.w) ; (+X,+Y)
- bchg d2,(a5,d4.w) ; (+X,-Y)
-
- *Note: when changing this in to bfchg, speed DEcreases, so 4get it !
-
- add.w d5,d3
- add.w d5,d4
-
- sub.w \1,d2
- sub.w \1,d2 ; d2 = -X
-
- move.w d2,d5
- asr.w #3,d5 ; d5=X/8
- sub.w d5,d3
- sub.w d5,d4
- bchg d2,(a5,d3.w) ; (-X,+Y)
- bchg d2,(a5,d4.w) ; (-X,-Y)
- ENDM
-
- ******************************************************************************
-