home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 14 / CDACTUAL.iso / cdactual / demobin / share / program / asm / RTGRAF.ZIP / SOURCE.ZIP / PROG087.ASM < prev    next >
Encoding:
Assembly Source File  |  1990-01-28  |  14.7 KB  |  338 lines

  1.  
  2. ;************************************************************************
  3. ; Transfer Bit Aligned Block of dimensions Width x Height, from         *
  4. ; source, with upper left corner at (X_Src,Y_Src), to destination with  *
  5. ; upper left corner at (X_Dst,Y_Dst), using function fn.                *
  6. ; Entry:        X_Srs, Y_Src  - Source upper left                       *
  7. ;               X_Dst, Y_Dst  - Destination upper left                  *
  8. ;               BWidth,BHeight- Dimensions of the block                 *
  9. ;               Fn            - Logical function (Copy, AND, OR, XOR)   *
  10. ;************************************************************************
  11.  
  12. ;xxxx add later traversing x in reverse for overlapped src and dst
  13. ;   small model parms
  14. ;X_Src   EQU     [BP+4]                  ;Formal parameters on the stack
  15. ;Y_Src   EQU     [BP+6]
  16. ;X_Dst   EQU     [BP+8]
  17. ;Y_Dst   EQU     [BP+10]
  18. ;BWidth  EQU     [BP+12]
  19. ;BHeight EQU     [BP+14]
  20. ;Fn      EQU     [BP+16]
  21.  
  22. ;   large model parms
  23. X_Src   EQU     [BP+6]                  ;Formal parameters on the stack
  24. Y_Src   EQU     [BP+8]
  25. X_Dst   EQU     [BP+10]
  26. Y_Dst   EQU     [BP+12]
  27. BWidth  EQU     [BP+14]
  28. BHeight EQU     [BP+16]
  29. Fn      EQU     [BP+18]
  30.  
  31. HBYTES  EQU     80                      ;Number of bytes per scanline
  32. GRF_SEG EQU     0A000H                  ;Segment for display buffer
  33.  
  34. Y_Incr          EQU     WORD PTR [BP-2] ;Local variables
  35. First_Mask      EQU     BYTE PTR [BP-4]
  36. InFirst         EQU     WORD PTR [BP-6]
  37. Last_Mask       EQU     BYTE PTR [BP-8]
  38. Work_plane      EQU     BYTE PTR [BP-10]
  39. Lower_Mask      EQU     BYTE PTR [BP-12]
  40. Upper_Mask      EQU     BYTE PTR [BP-14]
  41. Src_Address     EQU     WORD PTR [BP-16]
  42. Dst_Address     EQU     WORD PTR [BP-18]
  43. Block_Dx        EQU     WORD PTR [BP-20]
  44. Block_Dy        EQU     WORD PTR [BP-22]
  45.  
  46.         PUBLIC  _BitBlt
  47.  
  48. _BitBlt PROC    FAR
  49.         PUSH    BP
  50.         MOV     BP,SP
  51.  
  52.         SUB     SP,24                   ;Setup local variables
  53.  
  54.         PUSH    DS                      ;Presrve segment registers
  55.         PUSH    ES
  56.         PUSH    DI
  57.         PUSH    SI
  58.  
  59.         ;-------------------------------------------------------------
  60.         ;--- COMPUTE MASKS FOR FIRST AND LAST BYTE WITHIN A RASTER
  61.         ;    ROTATION FACTOR, AND MASKS FOR HI AND LOW BITS AFTER ROTATION
  62.         ;    ENABLE ROTATION AND LOGICAL FUNCTIONS IN GRAPHICS CONTROLLER
  63.         ;-------------------------------------------------------------
  64.  
  65.         MOV     CX,X_Dst                ; NUMBER OF CLEAR BITS IN FIRST BYTE
  66.         AND     CX,7
  67.         MOV     First_Mask,0FFH         ; COMPUTE MASK TO CLEAR LEADING BITS
  68.         SHR     First_Mask,CL
  69.         MOV     AX,8
  70.         SUB     AX,CX
  71.         MOV     InFirst,AX
  72.  
  73.         ;MASK TO KEEP BITS IN LAST BYTE (PARTIAL BYTE)
  74.  
  75.         MOV     CX,X_Dst                ; GET ADDRESS OF LAST BIT
  76.         ADD     CX,BWidth
  77.         AND     CX,7                    ; POSITION JUST AFTER LAST BIT
  78.         MOV     Last_Mask,0FFH          ; COMPUTE MASK TO KEEP BITS AFTER
  79.         SHR     Last_Mask,CL
  80.         NOT     Last_Mask               ; COMPLEMENT TO KEEP LEADING BITS
  81.  
  82.         ;BITS FROM SOURCE BYTE MUST BE ALLIGNED WITH BITS IN THE
  83.         ;DESTINATION BYTE.  HERE IS COMPUTED THE ROTATION AND THE
  84.         ;TWO MASKS NEEDED TO ISOLOTATE TWO HALVES OF THE BYTE
  85.  
  86.         ; COMPUTE ROTATION
  87.  
  88.         MOV     CX,X_Dst                ; COMPUTE BIT DISTANCE BETWEEN
  89.         SUB     CX,X_Src                ;... BIT POSITIONS IN FIRST BYTES
  90.         AND     CX,7                    ; ... OF SOURCE AND DESTINATION BYTES
  91.                                         ; ... AS (SRC-DST)&7
  92.         MOV     AX,00FFH                ;Compute masks for non-zero rotation
  93.         ROR     AX,CL
  94.         MOV     Lower_Mask,AL           ;Save the masks
  95.         MOV     Upper_Mask,AH
  96.  
  97.         MOV     DX,3CEH                 ;Address of GRAPHICS controller
  98.         MOV     AL,3                    ;Index for DATA ROTATE & FN SELECT
  99.         OUT     DX,AL                   ;Select DATA ROTATE & FN SELECT REG
  100.         INC     DX
  101.         MOV     AL,CL                   ;Fetch rotate count
  102.         MOV     AH,Fn                   ;Fetch logical function
  103.         AND     AH,3                    ;Move logical function into
  104.         SHL     AH,1                    ;bits 3 and 4
  105.         SHL     AH,1
  106.         SHL     AH,1
  107.         OR      AL,AH
  108.         OUT     DX,AL                   ;Write value into DATA ROTATE... reg
  109.  
  110.         ;-------------------------------------------------------------
  111.         ;--- COMPUTE ABSOLUTE ADDRESS OF SOURCE AND DESTINATION
  112.         ;-------------------------------------------------------------
  113.  
  114.         MOV     WORD PTR Y_Incr,HBYTES  ;Initialize y traversal as normal
  115.  
  116.         ;Because of possible overlap we must adjust direction of traversal
  117.         ;If source block is above the destination then reverse Y traversal
  118.         ;If source block is to the left, then reverse X traversal
  119.  
  120.         MOV     AX,Y_Src                ;Compare source and destination Y
  121.         MOV     BX,Y_Dst
  122.         CMP     AX,BX
  123.         JLE     Compute_Address         ;...Leave alone if src <= dst
  124.         ADD     AX,BHeight              ;Begin with last raster in block
  125.         DEC     AX
  126.         ADD     BX,BHeight
  127.         DEC     BX
  128.         MOV     Y_Src,AX
  129.         MOV     Y_Dst,BX
  130.         NEG     WORD PTR Y_Incr         ;And traverse backwards
  131. Compute_Address:
  132.         MOV     AX,Y_Src                ;Compute offset for source
  133.         MOV     BX,HBYTES               ;as offset = y * 80 + x/8
  134.         MUL     BX
  135.         MOV     SI,X_Src
  136.         SHR     SI,1
  137.         SHR     SI,1
  138.         SHR     SI,1
  139.         ADD     SI,AX
  140.         MOV     Src_Address,SI
  141.  
  142.         MOV     AX,Y_Dst                ;Compute offset for destination
  143.         MOV     BX,HBYTES               ;as offset = y * 80 + x/8
  144.         MUL     BX
  145.         MOV     DI,X_Dst
  146.         SHR     DI,1
  147.         SHR     DI,1
  148.         SHR     DI,1
  149.         ADD     DI,AX
  150.         MOV     Dst_Address,DI
  151.  
  152.         MOV     AX,GRF_SEG              ;Setup segment
  153.         MOV     ES,AX
  154.         MOV     DS,AX
  155.  
  156.         ;-------------------------------------------------------------
  157.         ;--- ENABLE NEXT PLANE FOR READ AND WRITE
  158.         ;-------------------------------------------------------------
  159.  
  160.         MOV     AL,3                    ;Initialize counter of planes
  161.         MOV     Work_plane,AL
  162. Plane_Loop:
  163.         MOV     AX,BWidth               ;Copy dimensions of the block
  164.         MOV     Block_Dx,AX
  165.         MOV     AX,BHeight
  166.         MOV     Block_Dy,AX
  167.         MOV     SI,Src_Address          ;Fetch source address
  168.         MOV     DI,Dst_Address          ;Fetch destination address
  169.         MOV     CL,Work_plane           ;Fetch next plane to do
  170.         MOV     AH,1                    ;Use plane number to setup value
  171.         SHL     AH,CL                   ;for WRITE PLANE SELECT register
  172.         MOV     DX,3C4H                 ;Fetch address of SEQUENCER
  173.         MOV     AL,2                    ;Index for WRITE PLANE SELECT register
  174.         OUT     DX,AL                   ;Select register
  175.         INC     DX
  176.         MOV     AL,AH                   ;Fetch value
  177.         OUT     DX,AL                   ;Write value into register
  178.         MOV     DX,3CEH                 ;Fetch address of GRAPHICS controller
  179.         MOV     AL,4                    ;Index for READ PLANE SELECT register
  180.         OUT     DX,AL                   ;Select register
  181.         INC     DX
  182.         MOV     AL,CL                   ;Fetch plane number
  183.         OUT     DX,AL                   ;Write plane number into register
  184.         DEC     DX
  185.         MOV     AL,8                    ;Index for BIT MASK register
  186.         OUT     DX,AL                   ;Select BIT MASK register
  187.         INC     DX
  188.  
  189.         ;-------------------------------------------------------------
  190.         ; RASTER LOOP IS DONE IN FOUR STEPS
  191.         ; (1) MASKS AND ROTATION FACTOR IS COMPUTED TO ALIGN SRC AND DEST
  192.         ; (2) LEADIING PARTIAL BYTE OF DESTINATION IS MODIFIED
  193.         ; (3) FULL BYTES OF DESTINATION ARE MODIFIED
  194.         ; (4) TRAILLING PARTIAL BYTE OF DESTINATION IS MODIFIED
  195.         ;-------------------------------------------------------------
  196.  
  197.         ;-------------------------------------------------------------
  198.         ;--- GET ENOUGH BITS FROM SOUCE TO CONSTRUCT FIRST PARTIAL BYTE OF DST
  199.         ;-------------------------------------------------------------
  200.  
  201. Raster_Loop:
  202.         MOV     CX,Block_Dx             ;Number of bits to copy
  203.         PUSH    SI                      ;Preserve addresses for next raster loo
  204.         PUSH    DI
  205.  
  206.         MOV     AX,X_Src                ;Check if need one or two bytes
  207.         AND     AX,7                    ;for first byte of destination
  208.         MOV     BX,X_Dst
  209.         AND     BX,7
  210.         CMP     AX,BX
  211.         JG      Get_2_Bytes
  212. Get_1_Byte:
  213.         MOV     AL,First_Mask           ;Fetch mask for first partial byte
  214.         AND     AL,Lower_Mask           ;Combine with 'lower mask'
  215.         OUT     DX,AL                   ;Write mask into BIT MASK register
  216.         LODSB                           ;Fetch first source byte
  217.         MOV     AH,[DI]                 ;Latch destination
  218.         STOSB                           ;Write first byte of destination
  219.         MOV     AH,AL                   ;Save AL since it will be trashed by OU
  220.         JMP     Leading_Done
  221.  
  222. Get_2_Bytes:
  223.         MOV     AL,First_Mask           ;Fetch mask for first partial byte
  224.         AND     AL,Upper_Mask           ;Combine with 'upper mask'
  225.         OUT     DX,AL                   ;Write mask into BIT MASK register
  226.         LODSB
  227.         MOV     AH,[DI]                 ;Latch destination bits
  228.         MOV     ES:[DI],AL              ;Write first byte
  229.  
  230.         MOV     AL,First_Mask           ;Fetch mask for first partial byte
  231.         AND     AL,Lower_Mask           ;Combine with 'lower mask'
  232.         OUT     DX,AL                   ;Write mask into BIT MASK register
  233.         LODSB
  234.         MOV     AH,[DI]                 ;Latch destination bits
  235.         STOSB                           ;Write first byte
  236.         MOV     AH,AL                   ;Save AL since it will be trashed by OU
  237.  
  238. Leading_Done:
  239.         SUB     CX,InFirst              ;Update number of bits to transfer
  240.         JLE     Raster_Done
  241.  
  242.         ;-------------------------------------------------------------
  243.         ;--- LOOP OVER COMPLETE BYTES WITHIN A SINGLE SOURCE RASTER
  244.         ;-------------------------------------------------------------
  245.  
  246. Full_Loop:
  247.         CMP     CX,8                    ;If less then 8 bits to do
  248.         JL      Full_Done               ;quit this loop
  249.  
  250.         MOV     AL,Upper_Mask           ;Fetch the 'upper mask'
  251.         OUT     DX,AL                   ;Write mask into BIT MASK register
  252.         MOV     AL,[DI]                 ;Latch destination bits
  253.         MOV     [DI],AH                 ;Write half 2 for src to half 1 of dst
  254.  
  255.         MOV     AL,Lower_Mask           ;Fetch the lower mask
  256.         OUT     DX,AL                   ;Write mask into BIT MASK register
  257.         LODSB                           ;Fetch next source byte
  258.         MOV     AH,[DI]                 ;Latch destination bits
  259.         STOSB                           ;Write half 1 of src to half 2 of dst
  260.         MOV     AH,AL                   ;Save AL since it will be trashed by OU
  261.  
  262.         SUB     CX,8                    ; DECREMENT WIDTH BY BITS TO BE DONE
  263.         JMP     Full_Loop
  264. Full_Done:
  265.  
  266.         ;-------------------------------------------------------------
  267.         ;--- TRANSFER THE LAST PARTIAL BYTE
  268.         ;-------------------------------------------------------------
  269.  
  270. Last_Partial:
  271.         CMP     CX,0                    ;Any more bits to transfer?
  272.         JLE     Raster_Done             ;...No, quit this raster
  273.  
  274.         MOV     AL,Last_Mask            ;Fetch mask for last partial byte
  275.         AND     AL,Upper_Mask           ;Combine with 'upper mask'
  276.         OUT     DX,AL                   ;Write mask into BIT MASK register
  277.         MOV     AL,[DI]                 ;Latch destination bits
  278.         MOV     [DI],AH                 ;Write half 2 for src to half 1 of dst
  279.  
  280.         MOV     AL,Last_Mask            ;Fetch mask for last partial byte
  281.         AND     AL,Lower_Mask           ;Combine with 'upper mask'
  282.         OUT     DX,AL                   ;Write mask into BIT MASK register
  283.         LODSB                           ;Fetch next source byte
  284.         MOV     AH,[DI]                 ;Latch destination bits
  285.         STOSB                           ;Write half 1 of src to half 2 of dst
  286.  
  287.         ;--- ADVANCE TO THE NEXT RASTER
  288.  
  289. Raster_Done:
  290.         POP     DI                      ;Pointers to current raster
  291.         POP     SI
  292.         ADD     SI,Y_Incr               ;Update pointer to point to the next
  293.         ADD     DI,Y_Incr               ;raster
  294.         DEC     WORD PTR Block_Dy       ;Update number of rasters to do
  295.         JLE     Test_Plane
  296.         JMP     Raster_Loop             ;And repeat if not all done
  297.  
  298. Test_Plane:
  299.         DEC     Work_plane              ;Update number of planes to do
  300.         JL      Blit_Done
  301.         JMP     Plane_Loop              ;And do next plane if any left to do
  302.  
  303.         ;-------------------------------------------------------------
  304.         ;--- Clean up and exit
  305.         ;-------------------------------------------------------------
  306.  
  307. Blit_Done:
  308.         ;restore rotate value
  309.         MOV     DX,3CEH                 ;Address of GRAPHICS controller
  310.         MOV     AL,3                    ;Index for ROTATE & FN SELECT
  311.         OUT     DX,AL                   ;Select ROTATE & FN SELECT register
  312.         INC     DX
  313.         XOR     AL,AL                   ;Disable rotate and set fn=copy
  314.         OUT     DX,AL                   ;Write value into register
  315.         ;restore bit mask
  316.         DEC     DX
  317.         MOV     AL,8                    ;Index for BIT MASK register
  318.         OUT     DX,AL                   ;Select BIT MASK register
  319.         INC     DX
  320.         MOV     AL,0FFH                 ;Enable all 8 bits for write
  321.         OUT     DX,AL                   ;Write value into register
  322.         ;enable all four planes for write
  323.         MOV     DX,3C4H                 ;Address of SEQUENCER
  324.         MOV     AL,2                    ;Index for PLANE ENABLE register
  325.         OUT     DX,AL                   ;Select register
  326.         INC     DX
  327.         MOV     AL,0FH                  ;Value to enable all four planes
  328.         OUT     DX,AL                   ;Write value into register
  329.  
  330.         POP     SI                      ;Restore segment registers
  331.         POP     DI
  332.         POP     ES
  333.         POP     DS
  334.         MOV     SP,BP
  335.         POP     BP
  336.         RET
  337. _BitBlt ENDP
  338.