home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / circle.asm < prev    next >
Assembly Source File  |  1985-11-06  |  5KB  |  184 lines

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