2025-04-27 07:49:33 -04:00

333 lines
13 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;---------------------------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