You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
473 lines
11 KiB
473 lines
11 KiB
page ,132
|
|
;------------------------------Module-Header----------------------------;
|
|
; Module Name: tiler.asm
|
|
;
|
|
; Helper routines for P, Pn and DPx tiling algorithm.
|
|
;
|
|
; Created: 28-Jan-1992 10:20:08
|
|
; Author: Donald Sidoroff [donalds]
|
|
;
|
|
; Copyright (c) 1992-1999 Microsoft Corporation
|
|
;-----------------------------------------------------------------------;
|
|
|
|
.386
|
|
.model small,c
|
|
|
|
assume cs:FLAT,ds:FLAT,es:FLAT,ss:FLAT
|
|
assume fs:nothing,gs:nothing
|
|
|
|
.xlist
|
|
include stdcall.inc
|
|
include gdii386.inc
|
|
.list
|
|
|
|
.code
|
|
|
|
;---------------------------Private-Routine-----------------------------;
|
|
; vFetchAndCopy
|
|
;
|
|
; Fetch one row of a pattern and copy it.
|
|
;
|
|
; Entry:
|
|
; IN pff Points to a 'fetch' frame.
|
|
; Returns:
|
|
; Nothing.
|
|
; Registers Destroyed:
|
|
; EAX, ECX, EDX
|
|
; Calls:
|
|
; None
|
|
; History:
|
|
; 28-Jan-1992 -by- Donald Sidoroff [donalds]
|
|
; Wrote it
|
|
;-----------------------------------------------------------------------;
|
|
|
|
cProc vFetchAndCopy,4,< \
|
|
uses ebx esi edi, \
|
|
pff: ptr FETCHFRAME >
|
|
|
|
push ebp
|
|
|
|
mov ebp,pff
|
|
|
|
mov edi,[ebp].ff_pvTrg
|
|
mov esi,[ebp].ff_pvPat
|
|
mov ebx,[ebp].ff_xPat
|
|
mov edx,[ebp].ff_culFill
|
|
|
|
or ebx,ebx ; Are we at start of pattern?
|
|
jz vfc_copy_body
|
|
|
|
vfc_copy_head:
|
|
mov eax,[esi+ebx]
|
|
stosd
|
|
|
|
dec edx
|
|
jz vfc_done
|
|
|
|
add ebx,4
|
|
cmp ebx,[ebp].ff_cxPat
|
|
jne vfc_copy_head
|
|
|
|
vfc_copy_body:
|
|
mov ecx,[ebp].ff_culWidth
|
|
|
|
sub edx,ecx
|
|
jl vfc_copy_tail
|
|
|
|
rep movsd
|
|
|
|
mov esi,[ebp].ff_pvPat ; Reset this
|
|
jmp vfc_copy_body
|
|
|
|
vfc_copy_tail:
|
|
add edx,ecx
|
|
mov ecx,edx ; This many left!
|
|
|
|
rep movsd
|
|
|
|
vfc_done:
|
|
pop ebp
|
|
|
|
cRet vFetchAndCopy
|
|
|
|
endProc vFetchAndCopy
|
|
|
|
;---------------------------Private-Routine-----------------------------;
|
|
; vFetchShiftAndCopy
|
|
;
|
|
; Fetch one row of a pattern and copy it.
|
|
;
|
|
; Entry:
|
|
; IN pff Points to a 'fetch' frame.
|
|
; Returns:
|
|
; Nothing.
|
|
; Registers Destroyed:
|
|
; EAX, ECX, EDX
|
|
; Calls:
|
|
; None
|
|
; History:
|
|
; 28-Jan-1992 -by- Donald Sidoroff [donalds]
|
|
; Wrote it
|
|
;-----------------------------------------------------------------------;
|
|
|
|
cProc vFetchShiftAndCopy,4,< \
|
|
uses ebx esi edi, \
|
|
pff: ptr FETCHFRAME >
|
|
|
|
push ebp
|
|
|
|
mov ebp,pff
|
|
|
|
mov edi,[ebp].ff_pvTrg
|
|
mov esi,[ebp].ff_pvPat
|
|
mov ebx,[ebp].ff_xPat
|
|
mov eax,[ebp].ff_culFill
|
|
mov [ebp].ff_culFillTmp,eax ; Copy can be trashed
|
|
|
|
vfsc_loop:
|
|
mov ecx,ebx
|
|
and ebx,NOT 3 ; Align to DWORD
|
|
|
|
and ecx,3 ; Shift this many bytes
|
|
shl ecx,3
|
|
|
|
mov eax,[esi+ebx] ; Prime the pipeline
|
|
|
|
vfsc_in_pipeline:
|
|
mov edx,[esi+ebx+4]
|
|
|
|
shrd eax,edx,cl
|
|
stosd
|
|
|
|
dec dword ptr [ebp].ff_culFillTmp ; Are we done?
|
|
jz vfsc_done
|
|
|
|
add dword ptr [ebp].ff_xPat,4 ; Advance position in pattern
|
|
mov ebx,[ebp].ff_xPat
|
|
cmp ebx,[ebp].ff_cxPat
|
|
jge vfsc_blow_out
|
|
|
|
and ebx,NOT 3 ; Align to DWORD
|
|
|
|
mov eax,edx ; Pipeline is valid, use it
|
|
jmp vfsc_in_pipeline
|
|
|
|
|
|
vfsc_blow_out:
|
|
sub ebx,[ebp].ff_cxPat ; Reset position in pattern
|
|
mov [ebp].ff_xPat,ebx
|
|
jmp vfsc_loop ; Restart pipeline
|
|
|
|
vfsc_done:
|
|
pop ebp
|
|
|
|
cRet vFetchShiftAndCopy
|
|
|
|
endProc vFetchShiftAndCopy
|
|
|
|
;---------------------------Private-Routine-----------------------------;
|
|
; vFetchNotAndCopy
|
|
;
|
|
; Fetch one row of a pattern, negate it and copy it.
|
|
;
|
|
; Entry:
|
|
; IN pff Points to a 'fetch' frame.
|
|
; Returns:
|
|
; Nothing.
|
|
; Registers Destroyed:
|
|
; EAX, ECX, EDX
|
|
; Calls:
|
|
; None
|
|
; History:
|
|
; 28-Jan-1992 -by- Donald Sidoroff [donalds]
|
|
; Wrote it
|
|
;-----------------------------------------------------------------------;
|
|
|
|
cProc vFetchNotAndCopy,4,< \
|
|
uses ebx esi edi, \
|
|
pff: ptr FETCHFRAME >
|
|
|
|
push ebp
|
|
|
|
mov ebp,pff
|
|
|
|
mov edi,[ebp].ff_pvTrg
|
|
mov esi,[ebp].ff_pvPat
|
|
mov ebx,[ebp].ff_xPat
|
|
mov edx,[ebp].ff_culFill
|
|
|
|
or ebx,ebx ; Are we at start of pattern?
|
|
jz vfnc_copy_body
|
|
|
|
vfnc_copy_head:
|
|
mov eax,[esi+ebx]
|
|
not eax
|
|
stosd
|
|
|
|
dec edx
|
|
jz vfnc_done
|
|
|
|
add ebx,4
|
|
cmp ebx,[ebp].ff_cxPat
|
|
jne vfnc_copy_head
|
|
|
|
vfnc_copy_body:
|
|
mov ecx,[ebp].ff_culWidth
|
|
|
|
sub edx,ecx
|
|
jl vfnc_copy_tail
|
|
|
|
@@:
|
|
lodsd
|
|
not eax
|
|
stosd
|
|
loop @B
|
|
|
|
mov esi,[ebp].ff_pvPat ; Reset this
|
|
jmp vfnc_copy_body
|
|
|
|
vfnc_copy_tail:
|
|
add edx,ecx
|
|
jz vfnc_done
|
|
mov ecx,edx ; This many left!
|
|
|
|
@@:
|
|
lodsd
|
|
not eax
|
|
stosd
|
|
loop @B
|
|
|
|
vfnc_done:
|
|
pop ebp
|
|
|
|
cRet vFetchNotAndCopy
|
|
|
|
endProc vFetchNotAndCopy
|
|
|
|
;---------------------------Private-Routine-----------------------------;
|
|
; vFetchShiftNotAndCopy
|
|
;
|
|
; Fetch one row of a pattern and copy it.
|
|
;
|
|
; Entry:
|
|
; IN pff Points to a 'fetch' frame.
|
|
; Returns:
|
|
; Nothing.
|
|
; Registers Destroyed:
|
|
; EAX, ECX, EDX
|
|
; Calls:
|
|
; None
|
|
; History:
|
|
; 28-Jan-1992 -by- Donald Sidoroff [donalds]
|
|
; Wrote it
|
|
;-----------------------------------------------------------------------;
|
|
|
|
cProc vFetchShiftNotAndCopy,4,< \
|
|
uses ebx esi edi, \
|
|
pff: ptr FETCHFRAME >
|
|
|
|
push ebp
|
|
|
|
mov ebp,pff
|
|
|
|
mov edi,[ebp].ff_pvTrg
|
|
mov esi,[ebp].ff_pvPat
|
|
mov ebx,[ebp].ff_xPat
|
|
mov eax,[ebp].ff_culFill
|
|
mov [ebp].ff_culFillTmp,eax ; Copy can be trashed
|
|
|
|
vfsnc_loop:
|
|
mov ecx,ebx
|
|
and ebx,NOT 3 ; Align to DWORD
|
|
|
|
and ecx,3 ; Shift this many bytes
|
|
shl ecx,3
|
|
|
|
mov eax,[esi+ebx] ; Prime the pipeline
|
|
|
|
vfsnc_in_pipeline:
|
|
mov edx,[esi+ebx+4]
|
|
|
|
shrd eax,edx,cl
|
|
not eax
|
|
stosd
|
|
|
|
dec dword ptr [ebp].ff_culFillTmp ; Are we done?
|
|
jz vfsnc_done
|
|
|
|
add dword ptr [ebp].ff_xPat,4 ; Advance position in pattern
|
|
mov ebx,[ebp].ff_xPat
|
|
cmp ebx,[ebp].ff_cxPat
|
|
jge vfsnc_blow_out
|
|
|
|
and ebx,NOT 3 ; Align to DWORD
|
|
|
|
mov eax,edx ; Pipeline is valid, use it
|
|
jmp vfsnc_in_pipeline
|
|
|
|
vfsnc_blow_out:
|
|
sub ebx,[ebp].ff_cxPat ; Reset position in pattern
|
|
mov [ebp].ff_xPat,ebx
|
|
jmp vfsnc_loop ; Restart pipeline
|
|
|
|
vfsnc_done:
|
|
pop ebp
|
|
|
|
cRet vFetchShiftNotAndCopy
|
|
|
|
endProc vFetchShiftNotAndCopy
|
|
|
|
;---------------------------Private-Routine-----------------------------;
|
|
; vFetchAndMerge
|
|
;
|
|
; Fetch one row of a pattern and copy it.
|
|
;
|
|
; Entry:
|
|
; IN pff Points to a 'fetch' frame.
|
|
; Returns:
|
|
; Nothing.
|
|
; Registers Destroyed:
|
|
; EAX, ECX, EDX
|
|
; Calls:
|
|
; None
|
|
; History:
|
|
; 28-Jan-1992 -by- Donald Sidoroff [donalds]
|
|
; Wrote it
|
|
;-----------------------------------------------------------------------;
|
|
|
|
cProc vFetchAndMerge,4,< \
|
|
uses ebx esi edi, \
|
|
pff: ptr FETCHFRAME >
|
|
|
|
push ebp
|
|
|
|
mov ebp,pff
|
|
|
|
mov edi,[ebp].ff_pvTrg
|
|
mov esi,[ebp].ff_pvPat
|
|
mov ebx,[ebp].ff_xPat
|
|
mov edx,[ebp].ff_culFill
|
|
|
|
or ebx,ebx ; Are we at start of pattern?
|
|
jz vfm_copy_body
|
|
|
|
vfm_copy_head:
|
|
mov eax,[esi+ebx]
|
|
xor [edi],eax
|
|
add edi,4
|
|
|
|
dec edx
|
|
jz vfm_done
|
|
|
|
add ebx,4
|
|
cmp ebx,[ebp].ff_cxPat
|
|
jne vfm_copy_head
|
|
|
|
vfm_copy_body:
|
|
mov ecx,[ebp].ff_culWidth
|
|
|
|
sub edx,ecx
|
|
jl vfm_copy_tail
|
|
|
|
@@:
|
|
lodsd
|
|
xor [edi],eax
|
|
add edi,4
|
|
loop @B
|
|
|
|
mov esi,[ebp].ff_pvPat ; Reset this
|
|
jmp vfm_copy_body
|
|
|
|
vfm_copy_tail:
|
|
add edx,ecx
|
|
jz vfm_done
|
|
mov ecx,edx ; This many left!
|
|
|
|
@@:
|
|
lodsd
|
|
xor [edi],eax
|
|
add edi,4
|
|
loop @B
|
|
|
|
vfm_done:
|
|
pop ebp
|
|
|
|
cRet vFetchAndMerge
|
|
|
|
endProc vFetchAndMerge
|
|
|
|
;---------------------------Private-Routine-----------------------------;
|
|
; vFetchShiftAndMerge
|
|
;
|
|
; Fetch one row of a pattern and XOR it into destination
|
|
;
|
|
; Entry:
|
|
; IN pff Points to a 'fetch' frame.
|
|
; Returns:
|
|
; Nothing.
|
|
; Registers Destroyed:
|
|
; EAX, ECX, EDX
|
|
; Calls:
|
|
; None
|
|
; History:
|
|
; 28-Jan-1992 -by- Donald Sidoroff [donalds]
|
|
; Wrote it
|
|
;-----------------------------------------------------------------------;
|
|
|
|
cProc vFetchShiftAndMerge,4,< \
|
|
uses ebx esi edi, \
|
|
pff: ptr FETCHFRAME >
|
|
|
|
push ebp
|
|
|
|
mov ebp,pff
|
|
|
|
mov edi,[ebp].ff_pvTrg
|
|
mov esi,[ebp].ff_pvPat
|
|
mov ebx,[ebp].ff_xPat
|
|
mov eax,[ebp].ff_culFill
|
|
mov [ebp].ff_culFillTmp,eax ; Copy can be trashed
|
|
|
|
vfsm_loop:
|
|
mov ecx,ebx
|
|
and ebx,NOT 3 ; Align to DWORD
|
|
|
|
and ecx,3 ; Shift this many bytes
|
|
shl ecx,3
|
|
|
|
mov eax,[esi+ebx] ; Prime the pipeline
|
|
|
|
vfsm_in_pipeline:
|
|
mov edx,[esi+ebx+4]
|
|
|
|
shrd eax,edx,cl
|
|
xor [edi],eax
|
|
add edi,4
|
|
|
|
dec dword ptr [ebp].ff_culFillTmp ; Are we done?
|
|
jz vfsm_done
|
|
|
|
add dword ptr [ebp].ff_xPat,4 ; Advance position in pattern
|
|
mov ebx,[ebp].ff_xPat
|
|
cmp ebx,[ebp].ff_cxPat
|
|
jge vfsm_blow_out
|
|
|
|
and ebx,NOT 3 ; Align to DWORD
|
|
|
|
mov eax,edx ; Pipeline is valid, use it
|
|
jmp vfsm_in_pipeline
|
|
|
|
vfsm_blow_out:
|
|
sub ebx,[ebp].ff_cxPat ; Reset position in pattern
|
|
mov [ebp].ff_xPat,ebx
|
|
jmp vfsm_loop ; Restart pipeline
|
|
|
|
vfsm_done:
|
|
pop ebp
|
|
|
|
cRet vFetchShiftAndMerge
|
|
|
|
endProc vFetchShiftAndMerge
|
|
|
|
end
|
|
|