home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / CGRAPH.ZIP / CIRCLE.DOC < prev    next >
Text File  |  1998-07-30  |  6KB  |  324 lines

  1. The following is an update to the CIRCLE subroutine which is a part
  2. of the PLOT.MAC source code.  This version produces a circle with less
  3. "jitter" due to round-up procedures in the polar to cartesian coordinate
  4. conversions.  The SIN and COS tables have also been rewritten as complete
  5. 90 degree sets which are reciprocals of each other.  This routine was used
  6. with a digital plotter, the DP-2, by HIPL0T.  It will run a little slower
  7. than the subroutine which is in the source code PLOT.MAC, but is compatible
  8. with it.
  9. ;
  10. ; ************************************************************************
  11. ;
  12. ;    CIRCLE Subroutine:
  13. ;
  14. CIRCLE:
  15.     IF      PAS.Z
  16. ;
  17.     ENTRY     CIRCLE
  18.     PUSH    IX
  19.     PUSH    IY
  20.     LD    A,3            ; 3 parameters
  21.     CALL    Z.LNK
  22.     ENDIF
  23. ;
  24.     IF    BASIC
  25. ;
  26.     LD    B,3
  27.     CALL    B.LNK
  28.     ENDIF
  29. ;
  30.     CALL    PENUP        ;move to starting position
  31.     LD    HL,(P1)
  32.     LD    DE,(P3)
  33.     ADD    HL,DE
  34.     LD    (X1),HL
  35.     LD    HL,(P2)
  36.     LD    (Y1),HL
  37.     CALL    MOVE
  38.     CALL    PENDWN
  39. ;
  40.     LD    IX,SINTBL
  41.     LD    IY,COSTBL
  42. ;
  43.     LD    C,0        ;C=quadrant counter
  44. CIRC0:
  45.     LD    B,90        ;B=degree counter
  46. CIRC1:
  47.     PUSH    BC
  48.     CALL    POLAR        ;convert to polar coordinates
  49.     POP    BC
  50.     PUSH    BC
  51.     LD    A,C
  52.     CP    0        ;quadrant 0
  53.     CALL    Z,XPRCOS
  54.     CALL    Z,YPRSIN
  55.     CP    1        ;quadrant 1
  56.     CALL    Z,XMRCOS
  57.     CALL    Z,YPRSIN
  58.     CP    2        ;quadrant 2
  59.     CALL    Z,XMRCOS
  60.     CALL    Z,YMRSIN
  61.     CP    3        ;quadrant 3
  62.     CALL    Z,XPRCOS
  63.     CALL    Z,YMRSIN
  64.     CP    4        ;octant # 4
  65.     CALL    Z,XMRCOS
  66.     CALL    Z,YMRSIN
  67.     BIT    0,A
  68.     CALL    Z,MOVEUP    ;even quadrant
  69.     CALL    NZ,MOVEDN    ;odd quadrant
  70.     POP    BC
  71.     DEC    B
  72.     JP    P,CIRC1 
  73.     BIT    0,C
  74.     CALL    Z,INDXDN    ;even quadrant
  75.     CALL    NZ,INDXUP    ;odd quadrant
  76.     INC    C
  77.     LD    A,C
  78.     CP    4        ;four quadrants
  79.     JR    NZ,CIRC0
  80. ;
  81.     CALL    PENUP
  82. ;
  83.     IF    PAS.Z
  84.     POP    IY
  85.     POP    IX
  86.     XOR    A
  87.     ENDIF
  88. ;
  89.     RET
  90. ;
  91. MOVEUP:
  92.     PUSH    AF    ;save flags
  93.     CALL    MOVE    ;draw line
  94.     POP    AF    ;restore flags
  95. INDXUP:
  96.     DEC    IX    ;point to next sin()
  97.     DEC    IX
  98.     INC    IY    ;point to next cos()
  99.     INC    IY
  100.     RET
  101. MOVEDN:
  102.     PUSH    AF    ;save flags
  103.     CALL    MOVE    ;draw line
  104.     POP    AF    ;restore flags
  105. INDXDN:
  106.     INC    IX    ;point to next sin()
  107.     INC    IX
  108.     DEC    IY    ;point to next cos()
  109.     DEC    IY
  110.     RET
  111. ;
  112. XPRCOS:                ; x + r*cos()
  113.     PUSH    AF        ;save flags
  114.     LD    DE,(RCOS)
  115.     LD    HL,(P1)
  116.     ADD    HL,DE
  117.     JR    XMRCS1
  118. XMRCOS:                ; x - r*cos()
  119.     PUSH    AF
  120.     LD    DE,(RCOS)
  121.     LD    HL,(P1)
  122.     OR    A
  123.     SBC    HL,DE
  124. XMRCS1:    LD    (X1),HL
  125.     POP    AF
  126.     RET
  127. ;
  128. YPRSIN:                ; y + r*sin()
  129.     PUSH    AF        ;save flags
  130.     LD    DE,(RSIN)
  131.     LD    HL,(P2)
  132.     ADD    HL,DE
  133.     JR    YMRSN1
  134. YMRSIN:                ; y - r*sin()
  135.     PUSH    AF
  136.     LD    DE,(RSIN)
  137.     LD    HL,(P2)
  138.     OR    A
  139.     SBC    HL,DE
  140. YMRSN1:    LD    (Y1),HL
  141.     POP    AF
  142.     RET
  143. ;
  144. POLAR:
  145.     LD    D,(IX+1)    ;get sin()
  146.     LD    E,(IX)
  147.     LD    BC,(P3)        ;radius
  148.     CALL    MULT
  149.     BIT    7,H        ;round up if set
  150.     JR    Z,PLR1
  151.     INC    DE
  152. PLR1:    LD    (RSIN),DE    ;r*sin()
  153.     LD    D,(IY+1)    ;get cos()
  154.     LD    E,(IY)
  155.     LD    BC,(P3)
  156.     CALL    MULT
  157.     BIT    7,H        ;round up if set
  158.     JR    Z,PLR2
  159.     INC    DE
  160. PLR2:    LD    (RCOS),DE    ;r*cos()
  161.     RET
  162. ;
  163. RSIN:    DEFW    0
  164. RCOS:    DEFW    0
  165. ;
  166. ;
  167. ;    MULT: from ELECTRONICS/Mar 24, 1983 Designer's Casebook
  168. ;          article by Bernard Coupe    
  169. ;          performs a 2-byte by 2-byte integer multiply
  170. ;          (BC)*(DE)-->(DE),(HL)
  171. ;
  172. MULT:
  173.     LD    A,E        ;load lowest-order byte of multiplier
  174.     CALL    BCMULT        ;do 1-byte multiply
  175.     PUSH    HL        ;save lowest-order bytes of product
  176.     PUSH    AF        ;save highest-order bytes of product
  177.     LD    A,D        ;take multiplier
  178.     CALL    BCMULT+2    ;do second 1-byte multiply
  179.     LD    D,A        ;position highest-order byte of product
  180.     POP    AF        ;get highest-order byte of first product
  181.     ADD    A,H        ;update third byte of product
  182.     LD    H,L        ;relocate lowest-order bytes of second prod
  183.     LD    L,E        ;reset L at 0
  184.     LD    E,A        ;put third byte of product in E
  185.     JR    NC,NC1        ;do not increment D if no carry
  186.     INC    D        ;update D if carry
  187. NC1:    POP    BC        ;get lowest-order 2 bytes of first prod
  188.     ADD    HL,BC        ;get final product lowest-order 2 bytes
  189.     RET    NC        ;done if no carry
  190.     INC    DE        ;update highest-order 2 bytes
  191.     RET
  192. ;
  193. ; A-HL will contain A*BC
  194. ; BC and D not affected
  195. ;
  196. MULMAC    MACRO
  197.     LOCAL    ZERO
  198.     JR    NC,ZERO        ;zero skip
  199.     ADD    HL,BC        ; one add multiplicand
  200.     ADC    A,E        ; add carry to third byte of product
  201. ZERO:    ADD    HL,HL        ;shift product left
  202.     ADC    A,A
  203.     ENDM
  204. ;
  205. BCMULT:    LD    E,0        ; 0->E for first product
  206.     LD    H,E        ; zero partial product
  207.     LD    L,E
  208.     ADD    A,A        ; get first multiplier bit
  209.     MULMAC
  210.     MULMAC
  211.     MULMAC
  212.     MULMAC
  213.     MULMAC
  214.     MULMAC
  215.     MULMAC
  216.     RET    NC        ; done if no carry
  217.     ADD    HL,BC        ; or do last add
  218.     ADC    A,E
  219.      RET            ;and return
  220. ;
  221.     PAGE    60
  222. ;    COSTBL and SINTBL are tables of cosine and sine values
  223. ;    specified as 16-bit unsigned positive fractions.  Each
  224. ;    table is 90 units (degrees) long, and are reciprocals.
  225. ;
  226. COSTBL:
  227.     DEFW    65535        ;0 degrees, SINTBL 90 degrees
  228.     DEFW    65526        ;1 
  229.     DEFW    65496        ;2 
  230.     DEFW    65446        ;3
  231.     DEFW    65376        ;4
  232.     DEFW    65287        ;5
  233.     DEFW    65177        ;6
  234.     DEFW    65048        ;7
  235.     DEFW    64898        ;8
  236.     DEFW    64729        ;9
  237.     DEFW    64540        ;10
  238.     DEFW    64332        ;11
  239.     DEFW    64104        ;12
  240.     DEFW    63856        ;13
  241.     DEFW    63589        ;14
  242.     DEFW    63303        ;15
  243.     DEFW    62997        ;16
  244.     DEFW    62672        ;17
  245.     DEFW    62328        ;18
  246.     DEFW    61966        ;19
  247.     DEFW    61584        ;20
  248.     DEFW    61183        ;21
  249.     DEFW    60764        ;22
  250.     DEFW    60326        ;23
  251.     DEFW    59870        ;24
  252.     DEFW    59396        ;25
  253.     DEFW    58903        ;26
  254.     DEFW    58393        ;27
  255.     DEFW    57865        ;28
  256.     DEFW    57319        ;29
  257.     DEFW    56756        ;30
  258.     DEFW    56175        ;31
  259.     DEFW    55578        ;32
  260.     DEFW    54963        ;33
  261.     DEFW    54332        ;34
  262.     DEFW    53684        ;35
  263.     DEFW    53020        ;36
  264.     DEFW    52339        ;37
  265.     DEFW     51643        ;38
  266.     DEFW    50931        ;39
  267.     DEFW    50203        ;40
  268.     DEFW    49461        ;41
  269.     DEFW    48703        ;42
  270.     DEFW    47930        ;43
  271.     DEFW    47143        ;44
  272.     DEFW    46341        ;45
  273. ;
  274.     PAGE    60
  275. ;
  276.     DEFW    45525        ;46
  277.     DEFW    44695        ;47
  278.     DEFW    43852        ;48
  279.     DEFW    42995        ;49
  280.     DEFW    42126        ;50
  281.     DEFW    41243        ;51
  282.     DEFW    40348        ;52
  283.     DEFW    39441        ;53
  284.     DEFW    38521        ;54
  285.     DEFW    37590        ;55
  286.     DEFW    36647        ;56
  287.     DEFW    35693        ;57
  288.     DEFW    34729        ;58
  289.     DEFW    33754        ;59
  290.     DEFW    32768        ;60
  291.     DEFW    31772        ;61
  292.     DEFW    30767        ;62
  293.     DEFW    29753        ;63
  294.     DEFW    28729        ;64
  295.     DEFW    27697        ;65
  296.     DEFW    26656        ;66
  297.     DEFW    25607        ;67
  298.     DEFW    24550        ;68
  299.     DEFW    23486        ;69
  300.     DEFW    22415        ;70
  301.     DEFW    21336        ;71
  302.     DEFW    20252        ;72
  303.     DEFW    19161        ;73
  304.     DEFW    18064        ;74
  305.     DEFW    16962        ;75
  306.     DEFW    15855        ;76
  307.     DEFW    14742        ;77
  308.     DEFW    13626        ;78
  309.     DEFW    12505        ;79
  310.     DEFW    11380        ;80
  311.     DEFW    10252        ;81
  312.     DEFW    9121        ;82
  313.     DEFW    7987        ;83
  314.     DEFW    6850        ;84
  315.     DEFW    5712        ;85
  316.     DEFW    4572        ;86
  317.     DEFW    3430        ;87
  318.     DEFW    2287        ;88
  319.     DEFW    1144        ;89
  320. SINTBL:    DEFW    0        ;90 COSTBL, SINTBL 0 degrees 
  321. ;
  322.     PAGE    60
  323. ;*************************************************************************
  324.