333 lines
13 KiB
PHP
333 lines
13 KiB
PHP
;---------------------------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
|
||
|