home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / fast_cir.asm < prev    next >
Assembly Source File  |  1983-07-25  |  7KB  |  189 lines

  1. TITLE 'FAST CIRCLE ROUTINE'
  2.  
  3. BIOSCALL MACRO
  4.          INT   10H               ;BIOS service id in AH
  5.          ENDM
  6.  
  7. STACK SEGMENT PARA STACK 'STACK'
  8.          DB 64 DUP('STACK  ')
  9.  
  10.  
  11.  
  12. STACK    ENDS
  13.  
  14. CSEG     SEGMENT PARA 'CODE'
  15. ;---------------------------------------------
  16. ;PROCEDURE CIRCLE (X,Y,RADIUS,NUMER,DEMON,
  17. ;                          COLOR:INTEGER)
  18. ;Dan Lee   July 1, 1982
  19. ;SourceWare
  20. ;
  21. ;draws a circle at center (x,y) with aspect
  22. ;ratio numer/denom; radius in column units
  23. ;
  24. ;assumes entry via inter-segment call
  25. ;
  26. ;FRAME:  VALUE X     : BP+16
  27. ;        VALUE Y     : BP+14
  28. ;        VALUE RADIUS: BP+12
  29. ;        VALUE NUMER : BP+10
  30. ;        VALUE DENOM : BP+8
  31. ;        VALUE COLOR : BP+6
  32. ;---------------------------------------------
  33. CIRCLE    PROC FAR
  34.           ASSUME CS:CSEG,SS:STACK
  35.           PUBLIC CIRCLE
  36.           PUSH BP           ;caller's frame pntr
  37.           MOV  BP,SP        ;set proc frame pntr
  38.           MOV  AX,[BP+10]   ;get aspect numer and
  39.           MOV  BX,1000      ;scale it by 1000
  40.           IMUL BX           
  41.           MOV  CX,[BP+8]    ;get aspect denom
  42.           IDIV CX           ;AX=aspect*1000
  43.           PUSH AX           ;store aspect*1000
  44.           XCHG AX,CX        ;get denom in AX
  45.           MOV  CX,[BP+10]   ;get numer in CX
  46.           IMUL BX           ;AX=denom*1000
  47.           IDIV CX           ;AX=inv aspect*1000
  48.           MOV  [BP+8],AX    ;store it
  49.           POP  AX           ;get aspect*1000
  50.           MOV  [BP+10],AX   ;and store it
  51.  
  52. ;
  53. ;start by incrementing  Y by one unit and
  54. ;decrementing X by TAN units*inv aspect
  55. ;start at (RADIUS,Y) and plot to 45 deg
  56. ;
  57.           MOV  AX,[BP+12]   ;get radius for
  58.           MOV  BX,1000      ;initial X and scale
  59.           IMUL BX           ;up by 1000
  60.           XOR  DI,DI        ;zero initial Y value
  61.  
  62. CR5:      PUSH AX           ;save lo word x*1000
  63.           PUSH DX           ;save hi word x*1000
  64.           XOR  BX,BX        ;begin round process
  65.           ADD  AX,500       ;`one-half'
  66.           ADC  DX,BX        
  67.           MOV  BX,1000      ;rescale X by 1000
  68.           IDIV BX           ;to graph
  69.           MOV  BX,AX        ;BX=1st quad X
  70.           ADD  AX,[BP+16]   ;add X origin
  71.           MOV  DX,[BP+14]   ;get Y origin
  72.           SUB  DX,DI        ;and sub Y to plot
  73.           MOV  CX,AX        ;get X to plot
  74.           MOV  AL,[BP+6]    ;get color
  75.           MOV  AH,12        ;write dot funct select
  76.           PUSH AX           ;save write dot parms
  77.           BIOSCALL          ;write 1st quad point
  78.           POP  AX           ;restore write dot parms
  79.           SUB  CX,BX        ;get 2nd quad
  80.           SUB  CX,BX        ;X+origin
  81.           PUSH AX           ;save write dot parms
  82.           BIOSCALL          ;write 2nd quad point
  83.           POP  AX           ;restore write dot parms
  84.           ADD  DX,DI        ;get 3rd quad
  85.           ADD  DX,DI        ;Y+origin
  86.           PUSH AX           ;save write dot parms
  87.           BIOSCALL          ;plot 3rd quad point 
  88.           POP  AX           ;restore write dot parms  
  89.           ADD  CX,BX        ;get 4th quad  
  90.           ADD  CX,BX        ;X+origin  
  91.           BIOSCALL          ;plot 4th quad point 
  92. ;  
  93. ;cx now at original point 
  94.  
  95.           XCHG CX,BX        ;get 1st quad X 
  96.           INC  DI           ;get new Y 
  97.           MOV  AX,DI        ;AX=Y 
  98.           MOV  BX,[BP+8]    ;BX=inv aspect*1000  
  99.           IMUL BX           ;AX=Y*inv aspect*1000 
  100.           IDIV CX           ;AX=TAN*inv aspect*1000 
  101.           XOR  DX,DX        ;zero remainder
  102.           MOV  SI,AX        ;SI=TAN*inv aspect*1000
  103.           IDIV BX           ;AX=TAN
  104.           CMP  AX,1         ;TAN=1?
  105.           POP  DX           ;DX=hi word X*1000
  106.           POP  AX           ;AX=lo word X*1000
  107.           JAE  CR7          ;yes, go to next sector
  108.           NEG  SI           ;to decrement *X
  109.           MOV  BX,-1        ;negative carry
  110.           ADD  AX,SI        ;new X value
  111.           ADC  DX,BX        ;hi word carry
  112.           JMP  SHORT CR5    ;plot new point
  113.           
  114. ;
  115. ;plot 45 to 90 degrees
  116. ;now decrease X by one unit and
  117. ;increase Y by COT units*aspect ratio
  118. ;
  119. CR7:      MOV  AX,DI        ;get nest Y to plot and
  120.           MOV  BX,1000      ;scale by 1000
  121.           IMUL BX           ;DX:AX=Y*1000
  122.           MOV  DI,CX        ;DI=last X value
  123.           DEC  DI           ;next X to plot
  124.  
  125.  
  126. CR8:      PUSH AX           ;save lo word Y*1000
  127.           PUSH DX           ;save hi word Y*1000
  128.           XOR  BX,BX        ;begin round process
  129.           ADD  AX,500       ;'one-half'
  130.           ADC  DX,BX        
  131.           MOV  BX,1000      ;rescale Y to plot
  132.           IDIV BX           ;AX=Y
  133.           MOV  BX,AX        ;BX=1st quad Y coord
  134.           ADD  AX,[BP+14]   ;add Y origin
  135.           MOV  CX,[BP+16]   ;CX=X origin
  136.           ADD  CX,DI        ;X to plot
  137.           MOV  DX,AX        ;Y to plot
  138.           MOV  AL,[BP+6]    ;get color
  139.           MOV  AH,12        ;write dot funct select
  140.           PUSH AX           ;save write dot parms
  141.           BIOSCALL          ;write 1st quad point
  142.           POP  AX           ;restore write dot parms
  143.             
  144.           SUB  CX,DI        ;get 2nd quad
  145.           SUB  CX,DI        ;X to plot
  146.           PUSH AX           ;save write dot parms
  147.           BIOSCALL          ;plot 2nd quad point
  148.           POP  AX           ;restore write dot parms
  149.           SUB  DX,BX        ;get 3rd quad
  150.           SUB  DX,BX        ;Y to plot
  151.           PUSH AX           ;save write dot parms
  152.           BIOSCALL          ;write 3rd quad point
  153.           POP  AX           ;restore write dot parms
  154.           ADD  CX,DI        ;get 4th quad
  155.           ADD  CX,DI        ;X to plot
  156.           BIOSCALL          ;plot 4th quad point
  157.           SUB  DX,[BP+14]   ;DX=Y-Y origin
  158.           NEG  DX           ;Y origin adjust
  159.           XCHG CX,DX        ;CX=Y
  160.           OR   DI,DI        ;90 deg?
  161.           JS   CR11         ;yes,exit
  162.           DEC  DI           ;get new X
  163.           MOV  AX,DI        ;AX=X
  164.           MOV  BX,[BP+10]   ;BX=aspect*1000
  165.           IMUL BX           ;AX=aspect*1000*X
  166.           IDIV CX           ;AX=aspect*1000*COT
  167.           MOV  SI,AX        ;SI=change in Y
  168.           
  169.           POP  DX           ;DX=hi word Y*1000
  170.           POP  AX           ;AX=lo word Y*1000
  171.           XOR  BX,BX
  172.           OR   SI,SI        ;for sign check
  173.           JNS  CR10         ;positive
  174.           MOV  BX,-1        ;negitive carry
  175. CR10:     ADD  AX,SI        ;AX=new X value
  176.           ADC  DX,BX        ;hi word carry
  177.           JMP  SHORT CR8    ;plot next point
  178. ;         
  179. ; exit
  180. ;
  181.  
  182. CR11:     ADD  SP,4         ;adjust stack pntr
  183.           POP  BP           ;caller's frame pntr
  184.           RET  12           ;release parms
  185. CIRCLE    ENDP
  186. CSEG      ENDS
  187.           END
  188.