Annotation of ntddk/src/video/displays/vga/i386/bitblt.inc, revision 1.1

1.1     ! root        1: ;---------------------------Module-Header------------------------------;
        !             2: ; Module Name: bitblt.inc
        !             3: ;
        !             4: ; Copyright (c) 1992 Microsoft Corporation
        !             5: ;-----------------------------------------------------------------------;
        !             6: 
        !             7: ;-----------------------------------------------------------------------;
        !             8: ;      INCREASE is the flag used to show that the BLT operation will be
        !             9: ;      increasing in Y (Y+).
        !            10: ;
        !            11: ;      DECREASE is the flag used to show that the BLT operation will be
        !            12: ;      decreasing in Y (Y-).
        !            13: ;
        !            14: ;      STEPLEFT is the flag used to show that the BLT will be stepping
        !            15: ;      left (i.e. start at the right hand corner of the source, stepping
        !            16: ;      left, or X-).
        !            17: ;
        !            18: ;      STEPRIGHT is the flag used to show that the BLT will be stepping
        !            19: ;      right (i.e. start at the left hand corner of the source, stepping
        !            20: ;      right, or X+).
        !            21: ;-----------------------------------------------------------------------;
        !            22: 
        !            23: INCREASE       equ     1               ;Incrementing
        !            24: DECREASE       equ     -1              ;Decrementing
        !            25: STEPLEFT       equ     0               ;Stepping to the left
        !            26: STEPRIGHT      equ     1               ;Stepping to the right
        !            27: 
        !            28: ;-----------------------------------------------------------------------;
        !            29: ;      gl_the_flags
        !            30: ;
        !            31: ;      F0_GAG_CHOKE    Set if the source and destination are of different
        !            32: ;                      color formats.  When set, some form of color
        !            33: ;                      conversion will be required.
        !            34: ;
        !            35: ;                      Once you see what all is involved with color
        !            36: ;                      conversion, you'll understand why this flag is
        !            37: ;                      called this.
        !            38: ;
        !            39: ;      F0_COLOR_PAT    Set if color pattern fetch code will be used.  If
        !            40: ;                      clear, then mono pattern fetch code will be used.
        !            41: ;                      Mono/color pattern fetch is always based on the
        !            42: ;                      destination being mono/color (it is the same).
        !            43: ;
        !            44: ;      F0_PAT_PRESENT  Set if a pattern is involved in the BLT.
        !            45: ;
        !            46: ;      F0_SRC_PRESENT  Set if a source  is involved in the BLT.
        !            47: ;
        !            48: ;      F0_SRC_IS_DEV   Set if the source is the physical device.  Clear if
        !            49: ;                      the source is a memory bitmap.
        !            50: ;
        !            51: ;      F0_SRC_IS_COLOR Set if the source is color, clear if monochrome.
        !            52: ;
        !            53: ;      F0_DEST_IS_DEV  Set if the destination is the physical device.
        !            54: ;                      Clear if the destination is a memory bitmap.
        !            55: ;
        !            56: ;      F0_DEST_IS_COLOR
        !            57: ;                      Set if the destination is color, clear if
        !            58: ;                      monochrome.
        !            59: ;-----------------------------------------------------------------------;
        !            60: 
        !            61: F0_GAG_CHOKE           equ     10000000b       ;Going mono <==> color
        !            62: F0_COLOR_PAT           equ     01000000b       ;Use color pattern fetch code
        !            63: F0_PAT_PRESENT         equ     00100000b       ;Pattern is involved in blt
        !            64: F0_SRC_PRESENT         equ     00010000b       ;Source is involved in blt
        !            65: F0_SRC_IS_DEV          equ     00001000b       ;Source is the device
        !            66: F0_SRC_IS_COLOR                equ     00000100b       ;Source is color
        !            67: F0_DEST_IS_DEV         equ     00000010b       ;Destination is the device
        !            68: F0_DEST_IS_COLOR       equ     00000001b       ;Destination is color
        !            69: 
        !            70: ;-----------------------------------------------------------------------;
        !            71: ; Definitions for fbFetch
        !            72: ;-----------------------------------------------------------------------;
        !            73: 
        !            74: FF_NO_LAST_FETCH       equ     00000010b       ;Final fetch might GP
        !            75: FF_TWO_INIT_FETCHES    equ     00000001b       ;Two initial fetches needed
        !            76: FF_ONE_INIT_FETCH       equ            0        ;One initial fetch   needed
        !            77: FF_ONLY_1_DEST_BYTE    equ     00000100b       ;Only one destination byte
        !            78: FF_ONLY_1_SRC_BYTE     equ     00001000b       ;Only one source byte
        !            79: 
        !            80: ;-----------------------------------------------------------------------;
        !            81: ;      MAX_BLT_SIZE is the maximum stack space required for the BITBLT
        !            82: ;      code.  This is a hard number to compute.  It must be based on
        !            83: ;      the worst case situation:
        !            84: ;
        !            85: ;              worst phase alignment
        !            86: ;              worst color conversions
        !            87: ;              first byte present
        !            88: ;              last byte present
        !            89: ;              full inner loop
        !            90: ;              jump into the inner loop
        !            91: ;
        !            92: ;      and any other factor which could increase the size of the code.
        !            93: ;-----------------------------------------------------------------------;
        !            94: 
        !            95: MAX_BLT_SIZE    =      400h             ;Max stack space a BLT will require
        !            96: 
        !            97: ;-----------------------------------------------------------------------;
        !            98: ;      The following flags are used in the inner loops to both control
        !            99: ;      the EGA read/write enable registers, and the plane loop count.
        !           100: ;
        !           101: ;      They are based on a simple relationship of the EGA's Map Mask
        !           102: ;      register and Read Map Select Register when used as a three plane
        !           103: ;      system:
        !           104: ;
        !           105: ;      Map Mask:     D3 D2 D1 D0          Read Map: D2 D1 D0
        !           106: ;
        !           107: ;        C0 plane     0  0  0  1                     0  0  0
        !           108: ;        C1 plane     0  0  1  0                     0  0  1
        !           109: ;        C2 plane     0  1  0  0                     0  1  0
        !           110: ;
        !           111: ;
        !           112: ;      Note that to convert the map mask into a read mask for the
        !           113: ;      same plane only requires a "SHR x,1" instruction.  This trick
        !           114: ;      would not work if all four planes were used.
        !           115: ;
        !           116: ;      In four plane mode, when the above mapping occurs becomes:
        !           117: ;
        !           118: ;        C3 plane     1  0  0  0                     1  0  0
        !           119: ;
        !           120: ;        To map this into the correct read map register of 11b:
        !           121: ;
        !           122: ;              cmp     mask,100b       ;Set 'C' if not C3
        !           123: ;              adc     mask,-1         ;sub -1 only if C3
        !           124: ;
        !           125: ;
        !           126: ;
        !           127: ;      The "loop counter" will consist of a bit shifted left every
        !           128: ;      interation of the loop, which will be used as stated above.
        !           129: ;      When this bit mask reaches a predetermined value, the loop
        !           130: ;      will terminate.
        !           131: ;-----------------------------------------------------------------------;
        !           132: 
        !           133: COLOR_OP        equ     C0_BIT                  ;Color ops start with C0
        !           134: MONO_OP         equ     MONO_BIT                ;Mono ops start with mono bit
        !           135: PLANE_1         equ     00010001b               ;Loop starting bits
        !           136: END_OP         equ     (C3_BIT+MONO_BIT) SHL 1 ;Loop terminating bits
        !           137: 
        !           138: ;-----------------------------------------------------------------------;
        !           139: ;      dl_moore_flags
        !           140: ;
        !           141: ;      dl_moore_flags pertain to color conversion only.  If color
        !           142: ;      conversion doesn't apply to the BLT, these flags will not
        !           143: ;      be defined.
        !           144: ;
        !           145: ;
        !           146: ;      F1_REP_OK               When F1_REP_OK is set, then the innerloop code can
        !           147: ;                      use a REP MOVSx instruction.  This will be the
        !           148: ;                      case if:
        !           149: ;
        !           150: ;                      a)  The source is the EGA and the color compare
        !           151: ;                          register can be used to do the conversion
        !           152: ;                          from color to monochrome.
        !           153: ;
        !           154: ;                      b)  The source is monochrome, the background
        !           155: ;                          color white, and the foreground color black,
        !           156: ;                          in which case color converison of the source
        !           157: ;                          would just give the source.
        !           158: ;
        !           159: ;      F1_NO_MUNGE     Set under the same conditions as "b" above.
        !           160: ;-----------------------------------------------------------------------;
        !           161: 
        !           162: F1_REP_OK      equ     10000000b       ;Using REP is ok (when F0_GAG_CHOKE)
        !           163: F1_NO_MUNGE    equ     01000000b       ;No mono ==> color conversion table
        !           164: 
        !           165: ;-----------------------------------------------------------------------;
        !           166: ;      The DEV structure contains all the information taken from the
        !           167: ;      PDevices passed in.  PDevices are copied to the frame to reduce
        !           168: ;      the number of long pointer loads required.  Having the data
        !           169: ;      contained in the structure allows MOVSW to be used when copying
        !           170: ;      the data.
        !           171: ;
        !           172: ;      width_bits      The number of pixels wide the device is.
        !           173: ;
        !           174: ;      height          The number of scans high the device is.
        !           175: ;
        !           176: ;      width_b         The width of a scan in bytes.
        !           177: ;
        !           178: ;      lp_bits         The pointer to the actual bits of the device.
        !           179: ;                      It will be adjusted as necessary to point to the
        !           180: ;                      first byte to be modified by the BLT operation.
        !           181: ;
        !           182: ;      dev_flags       Device Specific Flags
        !           183: ;                      IS_DEVICE   - This is the physical device
        !           184: ;                      COLOR_UP    - Generate color scan line update
        !           185: ;                      IS_COLOR    - Device is a color device
        !           186: ;
        !           187: ;      next_scan       Bias to get to the next (previous) scan line.
        !           188: ;-----------------------------------------------------------------------;
        !           189: 
        !           190: DEV             struc
        !           191: width_bits      dw      ?               ;Width in bits
        !           192: height          dw      ?               ;Height in scans
        !           193: width_b         dw      ?               ;Width in bytes
        !           194: lp_bits         dd      ?               ;Pointer to the bits
        !           195: dev_flags       db      ?               ;Device flags as given above
        !           196:                 db      ?               ;Alignment
        !           197: next_scan       dd      ?               ;Index to next scan
        !           198: next_plane      dd      ?               ;Index to next plane
        !           199: DEV            ends
        !           200: 
        !           201: ;      Constants for use in dev_flags field of DEV structure:
        !           202: 
        !           203: IS_COLOR       equ     00000001b       ;Device is color
        !           204: IS_DEVICE      equ     00000010b       ;Physical Device
        !           205: COLOR_UP       equ     00000100b       ;Color scan line update
        !           206: 
        !           207: ;-----------------------------------------------------------------------;
        !           208: ; The following structure is used to define all the local variables
        !           209: ; we will be accessing.  We do this since there are no cmacros for
        !           210: ; flatland and masm386 put scope in.
        !           211: ;-----------------------------------------------------------------------;
        !           212: 
        !           213: FRAME       struc
        !           214: 
        !           215: ; Copys of the passed parameters, so called functions can get them
        !           216: 
        !           217: pdsurfDst           dd      ?
        !           218: DestxOrg            dw      ?
        !           219: DestyOrg            dw      ?
        !           220: pdsurfSrc           dd      ?
        !           221: SrcxOrg             dw      ?
        !           222: SrcyOrg             dw      ?
        !           223: xExt                dw      ?
        !           224: yExt                dw      ?
        !           225: Rop                 dd      ?
        !           226: lpPBrush            dd      ?
        !           227: bkColor             dd      ?
        !           228: TextColor           dd      ?
        !           229: pptlBrush           dd      ?
        !           230: 
        !           231: ; locals
        !           232: 
        !           233: phase_h             db      ?           ;Horizontal phase (rotate count)
        !           234: pat_row             db      ?           ;Current row for patterns [0..7]
        !           235: direction           db      ?           ;Increment/decrement flag
        !           236: the_flags           db      ?
        !           237: first_fetch         db      ?           ;Number of first fetches needed
        !           238: step_direction      db      ?           ;Direction of move (left right)
        !           239: start_mask          dw      ?           ;Mask for first dest byte
        !           240: last_mask           dw      ?           ;Mask for last  dest byte
        !           241: mask_p              dw      ?           ;Horizontal phase mask
        !           242: inner_loop_count    dd      ?           ;# of entire bytes to BLT in innerloop
        !           243: operands            dw      ?           ;Operand string
        !           244: start_fl            dd      ?           ;Start of fetch/logic operation
        !           245: end_fl              dd      ?           ;End   of fetch/logic operation
        !           246: end_fls             dd      ?           ;End   of fetch/logic/store operation
        !           247: blt_addr            dd      ?           ;BLT address
        !           248: cFetchCode          dd      ?           ;size of the fetch code alone
        !           249: both_colors         dw      ?           ;Foreground and Background colors
        !           250: brush_accel         db      ?           ;Brush accelerator
        !           251: moore_flags         db      ?           ;More flags
        !           252: addr_brush_index    dd      ?           ;Address of brush index in code
        !           253: pNextPlane          dd      ?           ;Address of next plane logic
        !           254: 
        !           255: ; variable sized locals
        !           256: 
        !           257: ppcBlt      db  (SIZE PACKEDPELCONV) dup (?);Packed pel conversion data
        !           258: src         db  (SIZE DEV) dup (?)          ;Source device data
        !           259: dest        db  (SIZE DEV) dup (?)          ;Destination device data
        !           260: ajM2C       db  (NUMBER_PLANES * 2) dup (?) ;Mono ==> color munge table
        !           261: a_brush     db  (NUMBER_PLANES * SIZE_PATTERN) dup (?)  ;Temp brush
        !           262: aulMap      dd  16 dup (?)                  ;Packed pel conversion table
        !           263: 
        !           264: FRAME       ends
        !           265: 
        !           266: 
        !           267: if 0
        !           268: 
        !           269: ;-----------------------------------------------------------------------;
        !           270: ; Definitions of the bitblt frame for enterframe, useframe, leaveframe
        !           271: ;-----------------------------------------------------------------------;
        !           272: 
        !           273: 
        !           274: ; Define the frame for bitblt, using PASCAL conventions
        !           275: 
        !           276: parm_bitblt     struc
        !           277: pdsurfDst       dd      ?       ;Pointer to destination DEVSURF
        !           278: DestxOrg        dd      ?       ;Destination X origin
        !           279: DestyOrg        dd      ?       ;Destination Y origin
        !           280: pdsurfSrc       dd      ?       ;Pointer to optional source DEVSURF
        !           281: SrcxOrg         dd      ?       ;Source X origin
        !           282: SrcyOrg         dd      ?       ;Source Y origin
        !           283: xExt            dd      ?       ;X extent of the blt
        !           284: yExt            dd      ?       ;Y extent of the blt
        !           285: Rop             dd      ?       ;Mix mode
        !           286: lpPBrush        dd      ?       ;Pointer to the brush
        !           287: bkColor         dd      ?       ;Background color for mono==>color blts
        !           288: TextColor       dd      ?       ;Foreground color for mono==>color blts
        !           289: pulXlateVec     dd      ?       ;Color translation vector
        !           290: pptlBrush       dd      ?       ;Pointer to POINTL for brush origin
        !           291: parm_bitblt     ends
        !           292: 
        !           293: 
        !           294: loc_bitblt      struc
        !           295: ppcBlt          db  (SIZE PACKEDPELCONV) dup (?);Packed pel conversion data
        !           296: src             db  (SIZE DEV) dup (?)          ;Source device data
        !           297: dest            db  (SIZE DEV) dup (?)          ;Destination device data
        !           298: ajM2C           db  (NUMBER_PLANES * 2) dup (?) ;Mono ==> color munge table
        !           299: a_brush         db  (NUMBER_PLANES * SIZE_PATTERN) dup (?)  ;Temp brush
        !           300: aulMap          dd  16 dup (?)                  ;Packed pel conversion table
        !           301: 
        !           302: 
        !           303: phase_h         db      ?           ;Horizontal phase (rotate count)
        !           304: pat_row         db      ?           ;Current row for patterns [0..7]
        !           305: direction       db      ?           ;Increment/decrement flag
        !           306: the_flags       db      ?
        !           307: first_fetch     db      ?           ;Number of first fetches needed
        !           308: step_direction  db      ?           ;Direction of move (left right)
        !           309: brush_accel     db      ?           ;Brush accelerator
        !           310: moore_flags     db      ?           ;More flags
        !           311: 
        !           312: start_mask      dw      ?           ;Mask for first dest byte
        !           313: last_mask       dw      ?           ;Mask for last  dest byte
        !           314: mask_p          dw      ?           ;Horizontal phase mask
        !           315: operands        dw      ?           ;Operand string
        !           316: both_colors     dw      ?           ;Foreground and Background colors
        !           317:                 dw      ?           ;Alignment
        !           318: 
        !           319: inner_loop_count dd     ?           ;# of entire bytes to BLT in innerloop
        !           320: start_fl        dd      ?           ;Start of fetch/logic operation
        !           321: end_fl          dd      ?           ;End   of fetch/logic operation
        !           322: end_fls         dd      ?           ;End   of fetch/logic/store operation
        !           323: blt_addr        dd      ?           ;BLT address
        !           324: cFetchCode      dd      ?           ;size of the fetch code alone
        !           325: addr_brush_index dd     ?           ;Address of brush index in code
        !           326: pNextPlane      dd      ?           ;Address of next plane logic
        !           327: loc_bitblt  ends
        !           328: 
        !           329: 
        !           330: 
        !           331: endif
        !           332: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.