home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / drawline.asm < prev    next >
Assembly Source File  |  1983-07-27  |  5KB  |  150 lines

  1.          PAGE,132
  2.          PUBLIC DRAWLINE
  3.  
  4. ;        DAN ROLLINS  (213) 246-5021
  5. ;
  6. ;8088 self-modifying program implements fast-vector algorithm
  7. ;described by Michalsky, Doctor Dobb's Journal #74, 12/82
  8. ;see also: FAST-LINE DRAWING TECHNIQUE, BYTE, Aug 81
  9. ;
  10. ;routine expects to be called with DS:SI pointing
  11. ;to a list of 2-byte arguments:
  12. ;
  13. ;     si+0   = x1     starting clm (0-319)
  14. ;     si+2   = y1     starting row (0-159)
  15. ;     si+4   = x2     ending clm
  16. ;     si+6   = y2     ending row
  17. ;     si+8   = color  (0,1,2,3)
  18. ;     si+10  = length 
  19. ;              0    = draw entire line
  20. ;              else = draw sub- or super-set of this vector
  21. ;     si+12  = skip length
  22. ;              number of pels to go before starting to draw
  23. ;              0    = draw entire line
  24.  
  25. ;destroys all registers execpt si and segment regs
  26.  
  27. code     group    cseg
  28. cseg     segment  public 'code '
  29.          assume   CS:cseg,DS:nothing,ES:nothing
  30.  
  31. ;make it easier to acceess variables and arguments
  32.  
  33. x1       equ   word ptr [si]
  34. y1       equ   word ptr [si+2]
  35. x2       equ   word ptr [si+4]
  36. y2       equ   word ptr [si+6]
  37. color    equ   byte ptr [si+8]
  38. len      equ   word ptr [si+10]
  39. skip     equ   word ptr [si+12]
  40.  
  41. ;these are values that will be overlayed in the code
  42.  
  43. INC_X  EQU  41H
  44. DEC_X  EQU  49H
  45. INC_Y  EQU  42H
  46. DEC_Y  EQU  4AH
  47.  
  48. ;these are the addresses where new code is overlayed
  49.  
  50. ADJ_LONG_AXIS   EQU  BYTE PTR CS:[DI]
  51. ADJ_MASTER      EQU  WORD PTR CS:[DI+3]
  52. TEST_MASTER     EQU  WORD PTR CS:[DI+7]
  53. ALT_ADJ_MASTER  EQU  WORD PTR CS:[DI+13]
  54. ADJ_SHRT_AXIS   EQU  BYTE PTR CS:[DI+15]
  55.  
  56. DRAWLINE PROC FAR
  57.  
  58.       MOV   BL,INC_X   ;ASSUME XSTEP = +1
  59.       MOV   AX,X2
  60.       SUB   AX,X1
  61.       JGE   DL1        ;IF X1 <= X2 THEN NO CHANGE
  62.  
  63.       MOV   BL,DEC_X   ;XSTEP = -1
  64.       NEG   AX         ;Xdist = ABS(Xdist)
  65. dl1:
  66.       MOV   CX,AX      ;SAVE XDIST
  67.  
  68.       MOV   BH,INC_Y   ;ASSUME YSTEP = +1
  69.       MOV   AX,Y2      
  70.       SUB   AX,Y1
  71.       JGE   DL2        ;IF Y1 <= Y2 THEN NO CHANGE
  72.  
  73.       MOV   BH,DEC_Y   ;YSTEP = -1
  74.       NEG   AX         ;YDIST = ABS(YDIST)
  75. DL2:
  76.       MOV   DX,AX                     ;SAVE YDIST
  77.       MOV   DI,OFFSET CS:MODIFY_BASE  ;POINT TO THE CODE
  78.                                       ;TO MODIFY
  79.       CMP   DX,CX                     ;DETERMINE LONGEST AXIS
  80.       JGE   DL3                       ;Y IS LONGER, SO SKIP
  81.                    
  82.       XCHG  CX,DX              ;SWAP XDIST, YDIST
  83.       XCHG  BL,BH              ;SWAP INC/DEC X/Y VALUES
  84. DL3:                           ;MODIFY:
  85.       MOV   ADJ_LONG_AXIS,BH   ;THE 1st INC/DEC CODE
  86.       MOV   ADJ_MASTER,CX      ;MAIN DUTY MASTER ADJUSTMENT
  87.       SHR   CX,1               ;SET UP CYCLE TESTER
  88.       MOV   TEST_MASTER,CX     ;TEST FOR CYCLING
  89.       MOV   ALT_ADJ_MASTER,DX  ;ALTERNATE ADJUSTMENT
  90.       MOV   ADJ_SHRT_AXIS,BL   ;ALTERNATE INC/DEC CODE
  91.  
  92.       MOV   DI,DX      ;DI IS COUNTER: LONG AXIS LENGTH  
  93.       CMP   LEN,0      ;IF LENGTH ARG > 0 
  94.       JE    DL4 
  95.       MOV   DI,LEN     ;THEN USE IT AS COUNTER 
  96. DL4: 
  97.       MOV   BP,SKIP    ;GET SKIP COUNT
  98.       MOV   CX,X1      ;   AND OTHER ARGS
  99.       MOV   DX,Y1
  100.       MOV   AL,COLOR
  101.       XOR   BX,BX      ;DUTY MASTER STARTS = 0
  102. ;--------TOP OF VECTOR PLOTTING LOOP--------------------
  103. DL5:
  104.       CMP   BP,0       ;TEST SKIP COUNT
  105.       JE    OK_PLOT    
  106.       DEC   BP
  107.       JMP   SHORT NO_PLOT
  108. OK_PLOT:
  109.       CALL  PLOTDOT    ;PLOT A DOT
  110. ;
  111. ;MOST OF THE FOLLOWING CODE IS MODIFIED BY THE PREVIOUS SEQUENCE.
  112. ;THE 1111H'S ARE DUMMY VALUES THAT ARE ALWAYS OVERLAYED.
  113. ;
  114. MODIFY_BASE   LABEL   BYTE
  115. NO_PLOT:
  116.        INC   CX        ;INC/DEC CX/DX: ADJUST LONG AXIS PTR
  117.        ADD   BX,1111H  ;XDIST OR YDIST: ADJUST DUTY MASTER
  118.        CMP   BX,1111H  ;YDIST OR XDIST: CHECK CYCLE POSITION
  119.        JLE   DL6       ;SKIP IF SHORT AXIS IS STILL OK
  120.  
  121.        SUB   BX,1111H  ;XDIST OR YDIST: ADJUST DUTY MASTER
  122.        INC   DX        ;INC/DEC DX/CX: ADJUST SHORT AXIS PTR
  123. DL6:
  124.        DEC   DI        ;DI IS USED AS COUNTER
  125.        JGE   DL5       ;DO NEXT DOT IF NOT FINISHED
  126.              ;--------------------------------------------------
  127.        RET             ;FAR RETURN BACK TO CALLER
  128. DRAWLINE  ENDP
  129.  
  130. ;this routine plots the pixel at column CX (0-319) or (0-639)
  131. ;                                row    DX (0-199)
  132. ;                                color  AL (0-3) or (0-1) in high res
  133. ;note: a much faster routine
  134. ;      can be wiritten to plot dots
  135. ;
  136. PLOTDOT  PROC  NEAR
  137.          PUSH  AX
  138.          PUSH  DI      ;BIOS DESTROYS THESE REGISTERS
  139.          PUSH  BP
  140.  
  141.          MOV   AH,12   ;WRITE_DOT FUNCTION
  142.          INT   10H     ;  VIDEO I/O CALL
  143.  
  144.          POP   BP
  145.          POP   DI
  146.          POP   AX
  147.          RET           ;NEAR RETURN TO DRAWLINE PROC
  148. PLOTDOT  ENDP
  149. CSEG     ENDS
  150.