File:  [WindowsNT SDKs] / ntddk / src / video / displays / vga / i386 / bitblt.inc
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 18:31:12 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: ntddk-nov-1993, HEAD
Microsoft Windows NT Build 511 (DDK SDK) 11-01-1993

;---------------------------Module-Header------------------------------;
; Module Name: bitblt.inc
;
; Copyright (c) 1992 Microsoft Corporation
;-----------------------------------------------------------------------;

;-----------------------------------------------------------------------;
;	INCREASE is the flag used to show that the BLT operation will be
;	increasing in Y (Y+).
;
;	DECREASE is the flag used to show that the BLT operation will be
;	decreasing in Y (Y-).
;
;	STEPLEFT is the flag used to show that the BLT will be stepping
;	left (i.e. start at the right hand corner of the source, stepping
;	left, or X-).
;
;	STEPRIGHT is the flag used to show that the BLT will be stepping
;	right (i.e. start at the left hand corner of the source, stepping
;	right, or X+).
;-----------------------------------------------------------------------;

INCREASE	equ	1		;Incrementing
DECREASE	equ	-1		;Decrementing
STEPLEFT	equ	0		;Stepping to the left
STEPRIGHT	equ	1		;Stepping to the right

;-----------------------------------------------------------------------;
;	gl_the_flags
;
;	F0_GAG_CHOKE	Set if the source and destination are of different
;			color formats.	When set, some form of color
;			conversion will be required.
;
;			Once you see what all is involved with color
;			conversion, you'll understand why this flag is
;			called this.
;
;	F0_COLOR_PAT	Set if color pattern fetch code will be used.  If
;			clear, then mono pattern fetch code will be used.
;			Mono/color pattern fetch is always based on the
;			destination being mono/color (it is the same).
;
;	F0_PAT_PRESENT	Set if a pattern is involved in the BLT.
;
;	F0_SRC_PRESENT	Set if a source  is involved in the BLT.
;
;	F0_SRC_IS_DEV	Set if the source is the physical device.  Clear if
;			the source is a memory bitmap.
;
;	F0_SRC_IS_COLOR	Set if the source is color, clear if monochrome.
;
;	F0_DEST_IS_DEV	Set if the destination is the physical device.
;			Clear if the destination is a memory bitmap.
;
;	F0_DEST_IS_COLOR
;			Set if the destination is color, clear if
;			monochrome.
;-----------------------------------------------------------------------;

F0_GAG_CHOKE		equ	10000000b	;Going mono <==> color
F0_COLOR_PAT		equ	01000000b	;Use color pattern fetch code
F0_PAT_PRESENT		equ	00100000b	;Pattern is involved in blt
F0_SRC_PRESENT		equ	00010000b	;Source is involved in blt
F0_SRC_IS_DEV		equ	00001000b	;Source is the device
F0_SRC_IS_COLOR		equ	00000100b	;Source is color
F0_DEST_IS_DEV		equ	00000010b	;Destination is the device
F0_DEST_IS_COLOR	equ	00000001b	;Destination is color

;-----------------------------------------------------------------------;
; Definitions for fbFetch
;-----------------------------------------------------------------------;

FF_NO_LAST_FETCH	equ	00000010b	;Final fetch might GP
FF_TWO_INIT_FETCHES	equ	00000001b	;Two initial fetches needed
FF_ONE_INIT_FETCH       equ            0        ;One initial fetch   needed
FF_ONLY_1_DEST_BYTE	equ	00000100b	;Only one destination byte
FF_ONLY_1_SRC_BYTE	equ	00001000b	;Only one source byte

;-----------------------------------------------------------------------;
;	MAX_BLT_SIZE is the maximum stack space required for the BITBLT
;	code.  This is a hard number to compute.  It must be based on
;	the worst case situation:
;
;		worst phase alignment
;		worst color conversions
;		first byte present
;		last byte present
;		full inner loop
;		jump into the inner loop
;
;	and any other factor which could increase the size of the code.
;-----------------------------------------------------------------------;

MAX_BLT_SIZE    =      400h             ;Max stack space a BLT will require

;-----------------------------------------------------------------------;
;	The following flags are used in the inner loops to both control
;	the EGA read/write enable registers, and the plane loop count.
;
;	They are based on a simple relationship of the EGA's Map Mask
;	register and Read Map Select Register when used as a three plane
;	system:
;
;	Map Mask:     D3 D2 D1 D0	   Read Map: D2 D1 D0
;
;	  C0 plane     0  0  0	1		      0  0  0
;	  C1 plane     0  0  1	0		      0  0  1
;	  C2 plane     0  1  0	0		      0  1  0
;
;
;	Note that to convert the map mask into a read mask for the
;	same plane only requires a "SHR x,1" instruction.  This trick
;	would not work if all four planes were used.
;
;	In four plane mode, when the above mapping occurs becomes:
;
;	  C3 plane     1  0  0	0		      1  0  0
;
;	  To map this into the correct read map register of 11b:
;
;		cmp	mask,100b	;Set 'C' if not C3
;		adc	mask,-1 	;sub -1 only if C3
;
;
;
;	The "loop counter" will consist of a bit shifted left every
;	interation of the loop, which will be used as stated above.
;	When this bit mask reaches a predetermined value, the loop
;	will terminate.
;-----------------------------------------------------------------------;

COLOR_OP        equ     C0_BIT                  ;Color ops start with C0
MONO_OP         equ     MONO_BIT                ;Mono ops start with mono bit
PLANE_1         equ     00010001b               ;Loop starting bits
END_OP		equ	(C3_BIT+MONO_BIT) SHL 1	;Loop terminating bits

;-----------------------------------------------------------------------;
;	dl_moore_flags
;
;	dl_moore_flags pertain to color conversion only.  If color
;	conversion doesn't apply to the BLT, these flags will not
;	be defined.
;
;
;	F1_REP_OK		When F1_REP_OK is set, then the innerloop code can
;			use a REP MOVSx instruction.  This will be the
;			case if:
;
;			a)  The source is the EGA and the color compare
;			    register can be used to do the conversion
;			    from color to monochrome.
;
;			b)  The source is monochrome, the background
;			    color white, and the foreground color black,
;			    in which case color converison of the source
;			    would just give the source.
;
;	F1_NO_MUNGE 	Set under the same conditions as "b" above.
;-----------------------------------------------------------------------;

F1_REP_OK	equ	10000000b	;Using REP is ok (when F0_GAG_CHOKE)
F1_NO_MUNGE 	equ	01000000b	;No mono ==> color conversion table

;-----------------------------------------------------------------------;
;	The DEV structure contains all the information taken from the
;	PDevices passed in.  PDevices are copied to the frame to reduce
;	the number of long pointer loads required.  Having the data
;	contained in the structure allows MOVSW to be used when copying
;	the data.
;
;	width_bits	The number of pixels wide the device is.
;
;	height		The number of scans high the device is.
;
;	width_b		The width of a scan in bytes.
;
;	lp_bits		The pointer to the actual bits of the device.
;			It will be adjusted as necessary to point to the
;			first byte to be modified by the BLT operation.
;
;	dev_flags	Device Specific Flags
;			IS_DEVICE   - This is the physical device
;			COLOR_UP    - Generate color scan line update
;			IS_COLOR    - Device is a color device
;
;	next_scan	Bias to get to the next (previous) scan line.
;-----------------------------------------------------------------------;

DEV             struc
width_bits      dw      ?               ;Width in bits
height          dw      ?               ;Height in scans
width_b         dw      ?               ;Width in bytes
lp_bits         dd      ?               ;Pointer to the bits
dev_flags       db      ?               ;Device flags as given above
                db      ?               ;Alignment
next_scan       dd      ?               ;Index to next scan
next_plane      dd      ?               ;Index to next plane
DEV		ends

;	Constants for use in dev_flags field of DEV structure:

IS_COLOR 	equ	00000001b	;Device is color
IS_DEVICE	equ	00000010b	;Physical Device
COLOR_UP 	equ	00000100b	;Color scan line update

;-----------------------------------------------------------------------;
; The following structure is used to define all the local variables
; we will be accessing.  We do this since there are no cmacros for
; flatland and masm386 put scope in.
;-----------------------------------------------------------------------;

FRAME       struc

; Copys of the passed parameters, so called functions can get them

pdsurfDst           dd      ?
DestxOrg            dw      ?
DestyOrg            dw      ?
pdsurfSrc           dd      ?
SrcxOrg             dw      ?
SrcyOrg             dw      ?
xExt                dw      ?
yExt                dw      ?
Rop                 dd      ?
lpPBrush            dd      ?
bkColor             dd      ?
TextColor           dd      ?
pptlBrush           dd      ?

; locals

phase_h             db      ?           ;Horizontal phase (rotate count)
pat_row             db      ?           ;Current row for patterns [0..7]
direction           db      ?           ;Increment/decrement flag
the_flags           db      ?
first_fetch         db      ?           ;Number of first fetches needed
step_direction      db      ?           ;Direction of move (left right)
start_mask          dw      ?           ;Mask for first dest byte
last_mask           dw      ?           ;Mask for last  dest byte
mask_p              dw      ?           ;Horizontal phase mask
inner_loop_count    dd      ?           ;# of entire bytes to BLT in innerloop
operands            dw      ?           ;Operand string
start_fl            dd      ?           ;Start of fetch/logic operation
end_fl              dd      ?           ;End   of fetch/logic operation
end_fls             dd      ?           ;End   of fetch/logic/store operation
blt_addr            dd      ?           ;BLT address
cFetchCode          dd      ?           ;size of the fetch code alone
both_colors         dw      ?           ;Foreground and Background colors
brush_accel         db      ?           ;Brush accelerator
moore_flags         db      ?           ;More flags
addr_brush_index    dd      ?           ;Address of brush index in code
pNextPlane          dd      ?           ;Address of next plane logic

; variable sized locals

ppcBlt      db  (SIZE PACKEDPELCONV) dup (?);Packed pel conversion data
src         db  (SIZE DEV) dup (?)          ;Source device data
dest        db  (SIZE DEV) dup (?)          ;Destination device data
ajM2C       db  (NUMBER_PLANES * 2) dup (?) ;Mono ==> color munge table
a_brush     db  (NUMBER_PLANES * SIZE_PATTERN) dup (?)  ;Temp brush
aulMap      dd  16 dup (?)                  ;Packed pel conversion table

FRAME       ends


if 0

;-----------------------------------------------------------------------;
; Definitions of the bitblt frame for enterframe, useframe, leaveframe
;-----------------------------------------------------------------------;


; Define the frame for bitblt, using PASCAL conventions

parm_bitblt     struc
pdsurfDst       dd      ?       ;Pointer to destination DEVSURF
DestxOrg        dd      ?       ;Destination X origin
DestyOrg        dd      ?       ;Destination Y origin
pdsurfSrc       dd      ?       ;Pointer to optional source DEVSURF
SrcxOrg         dd      ?       ;Source X origin
SrcyOrg         dd      ?       ;Source Y origin
xExt            dd      ?       ;X extent of the blt
yExt            dd      ?       ;Y extent of the blt
Rop             dd      ?       ;Mix mode
lpPBrush        dd      ?       ;Pointer to the brush
bkColor         dd      ?       ;Background color for mono==>color blts
TextColor       dd      ?       ;Foreground color for mono==>color blts
pulXlateVec     dd      ?       ;Color translation vector
pptlBrush       dd      ?       ;Pointer to POINTL for brush origin
parm_bitblt     ends


loc_bitblt      struc
ppcBlt          db  (SIZE PACKEDPELCONV) dup (?);Packed pel conversion data
src             db  (SIZE DEV) dup (?)          ;Source device data
dest            db  (SIZE DEV) dup (?)          ;Destination device data
ajM2C           db  (NUMBER_PLANES * 2) dup (?) ;Mono ==> color munge table
a_brush         db  (NUMBER_PLANES * SIZE_PATTERN) dup (?)  ;Temp brush
aulMap          dd  16 dup (?)                  ;Packed pel conversion table


phase_h         db      ?           ;Horizontal phase (rotate count)
pat_row         db      ?           ;Current row for patterns [0..7]
direction       db      ?           ;Increment/decrement flag
the_flags       db      ?
first_fetch     db      ?           ;Number of first fetches needed
step_direction  db      ?           ;Direction of move (left right)
brush_accel     db      ?           ;Brush accelerator
moore_flags     db      ?           ;More flags

start_mask      dw      ?           ;Mask for first dest byte
last_mask       dw      ?           ;Mask for last  dest byte
mask_p          dw      ?           ;Horizontal phase mask
operands        dw      ?           ;Operand string
both_colors     dw      ?           ;Foreground and Background colors
                dw      ?           ;Alignment

inner_loop_count dd     ?           ;# of entire bytes to BLT in innerloop
start_fl        dd      ?           ;Start of fetch/logic operation
end_fl          dd      ?           ;End   of fetch/logic operation
end_fls         dd      ?           ;End   of fetch/logic/store operation
blt_addr        dd      ?           ;BLT address
cFetchCode      dd      ?           ;size of the fetch code alone
addr_brush_index dd     ?           ;Address of brush index in code
pNextPlane      dd      ?           ;Address of next plane logic
loc_bitblt  ends



endif


unix.superglobalmegacorp.com

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